2013-03-23 55 views
0

我遇到了问题。 我是Verilog的新手,我必须编写一个基于计数器的内存数组。基本上,我的阵列是16 x 8位(16 x 1字节)。我有8位数据进入我的记忆,16次。所以我做了一个内存块和一个计数器,该计数器通过在时钟的上升沿递增(实际上,在每个上升沿,8位数据被送入内存,因此增加了计数器)来为该内存块提供地址。现在我已经完成了这个过程16次,现在128位数据被存储并由我的内存块提供。但现在我想重置我的计数器,并在一小段延迟后再重复整个过程。我很困惑我如何做到这一点。请看看我的代码和建议。Verilog中基于计数器的存储阵列

提前感谢大家。

// creation of counter & a dummy variable 
wire cnt; 
wire cnt_next; 
reg [3:0] counter; 
    always @(posedge clock) 
    assign cnt_next=cnt+1'b1; 
     counter <= cnt_next 
     wire [3:0] write_address = counter; 


//creation of ram function 
module single_port_ram 
( 
    input [7:0] data, 
    input [3:0] addr, 
    input wr, clk, rd 
    output [127:0] q 
); 

reg [15:0] ram[0:7]; 

always @ (posedge clk or posedge reset) 
    begin 
    // Code for writing the data 
     if (wr) 
     { 
      addr <= write_address 
      case {addr} 
       4'b0000: ram[0] <= data 
      4'b0001: ram[1] <= data 
      4'b0010: ram[2] <= data 
      4'b0011: ram[3] <= data 
      4'b0100: ram[4] <= data 
      4'b0101: ram[5] <= data 
      4'b0110: ram[6] <= data 
      4'b0111: ram[7] <= data 
      4'b1000: ram[8] <= data 
      4'b1001: ram[8] <= data 
      4'b1010: ram[10] <= data 
      4'b1011: ram[11] <= data 
      4'b1100: ram[12] <= data 
      4'b1101: ram[13] <= data 
      4'b1110: ram[14] <= data 
      4'b1111: ram[15] <= data 
     end 

always @ (posedge clk or posedge reset) 
    begin 
    //Code for reading the data 
     if (rd) 
     { 
     q <= {ram[15],ram[14],ram[13],ram[12],ram[11],ram[10],ram[9],ram[8],ram[7],ram[6],ram[5],ram[4],ram [3],ram[2],ram[1],ram[0]} 
     } 

回答

0

让你的柜台大些,说高达31,而不是15.对于前16个时钟,写存储器地址就像你正在做的,在接下来的16个时钟刚刚做什么,但增量(小延迟你想要的),然后当计数器达到31时,只需将它重置为0.然后该过程应该重新启动。

+0

但我怎么“重置”计数器使得整个过程再次重复?我应该将整个代码块放在重复循环中吗? – Sam29 2013-03-24 06:20:49

+0

一旦达到该字段可容纳的最大值,计数器将自动翻转为0(5'b11111 + 5'b00001 = 5'b00000)。无论是那个还是你可以选择在某个值后将计数器置回零(在25次滴答后重置为零):'cnt_next =(counter == 25)? 0:计数器+1。 – Tim 2013-03-24 07:12:39

+0

感谢您的回复Tim。所以我需要做的只是增加计数器的大小,一旦达到最大值,它将自己重置为0.这是一个好主意。感谢你的帮助。 – Sam29 2013-03-24 07:53:52

0

具有16×8位(16×1字节)

第一声明您的RAM宽度的大小,那么您声明您的RAM例如的实际深度如果我想512个REG变量的阵列(深度)和各为8位(宽度),那么它会被写成这样:

reg [7:0] ram[511:0]; 

所以你的代码应该是这样的:

reg [7:0] ram[15:0];