【问题标题】:Single Port Block RAM in verilog - spartan 6Verilog 中的单端口块 RAM - spartan 6
【发布时间】:2014-03-30 21:33:35
【问题描述】:

我正在尝试访问单端口 Block RAM。下面的代码是获取程序计数器 PC 指向的指令。我能够推断出单端口块 RAM,直到我在代码中使用“执行”状态将数据从寄存器“a”写入 RAM。但是,当我添加执行状态时,如代码所示,我正在推断双口内存。

此外,必须添加代码“data_out=mem[pc]”的最后一行以推断 RAM,否则我无法得到它。

有人可以解释为什么会发生这种情况以及如何避免这种情况吗?任何帮助表示赞赏。

谢谢

module RAM_param(clk,data_out);
parameter n = 12;
parameter w = 16;

input clk;
reg read_write;


output reg [w-1:0] data_out;



parameter [1:0]
pc_val = 2'b00,
ifetch = 2'b01,
decode = 2'b10,
execute=2'b11;

reg [15:0]a;
reg [15:0]b;
reg [11:0] pc=12'd0;
reg [11:0] sp;
reg [11:0] addr;
reg [15:0] ir;
reg [15:0] mem [4095:0];
reg c,z,IEN;
reg [1:0]next_state=2'b00;
reg wen;




always@ (posedge clk)
begin

case(next_state)

pc_val:
        begin
                pc=pc+1;
                next_state<= ifetch;
        end

ifetch:     
        begin

            ir=mem[pc];

            next_state<=decode;
        end   

decode: 
        begin
            addr=ir[11:0];
            if(ir[15:12]==4'b0000)//LDA
                a=mem[addr];

            else if(ir[15:12]==4'b0001)//LDB
                b=mem[addr];

            else if (ir[15:12]==4'b0010)//STA
            begin
                wen=1;
                next_state<=execute;
            end 
        end

execute: begin
            if(wen==1)
            mem[addr]=a;
           end


endcase
data_out=mem[pc];
end
endmodule 

【问题讨论】:

    标签: verilog


    【解决方案1】:

    您在每个时钟周期都从 ram 读取“data_out”,并且在同一个周期中,取决于 next_state 变量,尝试写入 ram。

    如果你希望它是单端口,你不能在同一个周期中读写 ram。因此,您要么必须使用双端口 ram,要么将读取的“data_out”内存置于不写入 ram 的不同状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多