2014-03-30 147 views
0

我正在嘗試訪問單端口Block RAM。下面的代碼是獲取程序計數器PC指向的指令。我能夠推斷出一個單端口塊RAM,直到我在我的代碼中使用'execute'狀態將數據寫入寄存器'a'的RAM中。但是,當我添加代碼中顯示的執行狀態時,我推斷出雙端口RAM。verilog中的單端口塊RAM - 斯巴達6

而且,代碼的最後一行「的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; 




[email protected] (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 

回答

0

您正在每個時鐘週期從RAM讀取'data_out',並且在同一個週期中,根據next_state變量嘗試寫入RAM。

如果您希望它是單端口,則無法在同一週期內讀寫RAM。因此,您必須使用雙端口RAM,或者將'data_out'mem讀入不同的狀態,而不寫入內存。