当前位置 : 主页 > 手机开发 > 无线 >

数组 – 移动2D数组Verilog

来源:互联网 收集:自由互联 发布时间:2021-06-10
我不知道什么对以下代码不起作用,但它不会合成: reg [7:0] FIFO [0:8];always@(posedge clk) begin if(wr !rd !full) begin FIFO[0:8] = {data_in, FIFO[1:8]}; endend 我试图以其他方式索引FIFO,但没有任何作用.在
我不知道什么对以下代码不起作用,但它不会合成:

reg [7:0] FIFO [0:8];

always@(posedge clk) begin
    if(wr & !rd & !full) begin
       FIFO[0:8] <= {data_in, FIFO[1:8]};
    end
end

我试图以其他方式索引FIFO,但没有任何作用.在Xilinx论坛上找到了这个主题,但我无法弄清楚他想要讲的是什么.链接在这里:

http://forums.xilinx.com/t5/General-Technical-Discussion/2-dimensional-array-problem-in-Verilog/td-p/42368

谢谢

您对填充和解压缩阵列的工作方式缺乏了解.我建议你阅读IEEE1800-2012第7.4.1节,7.4.2,7.4.4和& 7.4.5.从技术上讲,IEEE1800适用于SystemVerilog,这是一套超级的Verilog.对于具有静态大小的阵列,这两个是相同的,我发现IEEE1800有更好的解释和示例,然后是IEEE1364.

如果您还没有LRM的副本,那么您可以在ieee.org网站上免费下载:IEEE Std 1800-2012

对于提供的代码,您不能以这种方式分配解压缩数组中的每个元素.您有两种选择:使用for循环分配数组的解压缩部分,或者使数组双重打包.

/* Using for-loop */
reg [7:0] FIFO [0:8];
integer i;
always@(posedge clk) begin
    if(wr & !rd & !full) begin
       for(i = 8; i > 0; i=i-i) begin
          FIFO[i] <= FIFO[i-1];
       end
       FIFO[0] <= data_in;
    end
end

/* Using double packed array */
reg [0:8] [7:0] FIFO; // NOTE: format and usage explained in IEEE1800-2012 7.4.5
always@(posedge clk) begin
    if(wr & !rd & !full) begin
       FIFO[0:8] <= {data_in,FIFO[0:7]};
    end
end
网友评论