1

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

提前感谢大家。

// 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]}   
        }
4

2 回答 2

-1

有 16 x 8 位(16 x 1 字节)

首先声明 RAM 宽度的大小,然后声明 RAM 的实际深度,例如,如果我想要一个包含 512 个 reg 变量(深度)并且每个都是 8 位(宽度)的数组,那么它将被写成:

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

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

reg [7:0] ram[15:0];
于 2014-11-05T16:38:38.043 回答
-1

让你的计数器更大一点,说最多 31 而不是 15。对于前 16 个时钟,像你一样写内存地址,接下来的 16 个时钟只做增量(你想要的小延迟),然后当计数器达到 31 时,只需将其重置为 0。然后该过程应该重新启动。

于 2013-03-23T18:35:29.670 回答