求知若渴的小李 2023-01-05 01:34 采纳率: 66.7%
浏览 98
已结题

Verilog HDL编写出现的问题

问题描述
只读存储器ROM有一个32位的地址输入端a,用于输入存储单元地址;
一个32位的数据输出端inst,用于输出指令。
根据提示,在右侧编辑器补充代码,设计一个按字节编址的有32位地址输入端和32位数据输出端的指令存储器,其中从地址0开始存放的32条MIPS指令如下所示。
MIPS指令(16进制)
3c010000
34240050
20050004
0c000018
ac820000
8c890000 等。

代码

module scinstmem (a,inst);
input [31:0] a;
output [31:0] inst;
//begin
     wire [31:0] rom [0:31];
     assign  rom[5'h00] = 32'h3c010000;
    assign  rom[5'h01] = 32'h34240050; 
    assign  rom[5'h02] = 32'h20050004; 
    assign  rom[5'h03] = 32'h0c000018; 
    assign  rom[5'h04] = 32'hac820000; 
    assign    rom[5'h05] = 32'h8c890000;    
    assign    rom[5'h06] = 32'h01244022;    
    assign    rom[5'h07] = 32'h20050003;    
    assign    rom[5'h08] = 32'h20a5ffff;    
    assign    rom[5'h09] = 32'h34a8ffff;
    assign    rom[5'h0A] = 32'h39085555;    
    assign    rom[5'h0B] = 32'h2009ffff;    
    assign    rom[5'h0C] = 32'h312affff;    
    assign    rom[5'h0D] = 32'h01493025;
    assign    rom[5'h0E] = 32'h01494026;    
    assign    rom[5'h0F] = 32'h01463824;    
    assign    rom[5'h10] = 32'h10a00001;    
    assign    rom[5'h11] = 32'h08000008;    
    assign    rom[5'h12] = 32'h2005ffff;    
    assign    rom[5'h13] = 32'h000543c0;    
    assign    rom[5'h14] = 32'h00084400;    
    assign    rom[5'h15] = 32'h00084403;    
    assign    rom[5'h16] = 32'h000843c2;    
    assign    rom[5'h17] = 32'h08000017;    
    assign    rom[5'h18] = 32'h00004020;
    assign    rom[5'h19] = 32'h8c890000;    
    assign    rom[5'h1A] = 32'h20840004;
    assign    rom[5'h1B] = 32'h01094020;
    assign    rom[5'h1C] = 32'h20a5ffff;
    assign    rom[5'h1D] = 32'h14a0fffb;    
    assign    rom[5'h1E] = 32'h00081000;
    assign    rom[5'h1F] = 32'h03e00008;    
    assign inst = rom[a[6:2]]; 
//end
endmodule

问题
为什么代码最后一行assign inst = rom[a[6:2]]; 是【6:2】,写0:4报错

  • 写回答

2条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-05 08:15
    关注

    这段代码的主要问题是在模块定义中没有声明输入和输出的类型。可以通过在模块定义中加入输入输出类型来修正这个问题。例如:

    module scinstmem (input [31:0] a, output [31:0] inst);
    

    其次,这段代码是使用 assign 语句将 ROM 中的每一个字节地址手动分配给一条 MIPS 指令,这显然不是一种高效的方法。可以使用 always 语句和 case 语句来实现 ROM 的自动映射。例如:

    always @(a) begin
    case (a)
    32'h00000000: inst <= 32'h3c010000;
    32'h00000001: inst <= 32'h34240050;
    32'h00000002: inst <= 32'h20050004;
    // 以此类推
    default: inst <= 32'h00000000;
    endcase
    end
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月14日
  • 已采纳回答 1月6日
  • 创建了问题 1月5日

悬赏问题

  • ¥15 r语言Hurst指数
  • ¥15 Acrn IVSHMEM doorbell问题
  • ¥15 yolov5中的val测试集训练时数量变小问题
  • ¥15 MPLS/VPN实验中MPLS的配置问题
  • ¥15 materialstudio氢键计算问题
  • ¥15 echarts图表制作
  • ¥15 halcon根据玻璃面板纹路取区域
  • ¥15 HFSS设计小型化180度耦合器
  • ¥15 使用CInternetSession,CHttpFile读取网页文件时有些电脑上会卡住怎么办?
  • ¥15 水下机器人的半物理仿真研究