首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用生成的移位填充来自FIFO的寄存器向量

用生成的移位填充来自FIFO的寄存器向量
EN

Stack Overflow用户
提问于 2017-08-24 11:33:44
回答 1查看 82关注 0票数 2

我是一个Verilog的新手,我刚刚开始一个项目,我正在尝试验证我已经开始的代码是可行的。下面的代码片段将FIFO卸载到一个由8位寄存器组成的向量中。在每个时钟周期,它从FIFO卸载一个字节,并将其放入寄存器链的末尾,将所有其他字节向下移位。

代码语言:javascript
复制
reg   [ 7:0]            mac_rx_regs [0 : 1361];
 generate for (ii=0; ii<1361; ii=ii+1)
  begin: mac_rx_regs_inst            
    always @(posedge rx_clk_int, posedge tx_reset)  
    if (tx_reset) begin
      mac_rx_regs[ii]   <= 8'b0;
      mac_rx_regs[1361]  <= 8'b0;
    end else begin
      if (rx_data_valid_r) begin
        mac_rx_regs[ii]   <= mac_rx_regs[ii+1];
        mac_rx_regs[1361]  <= rx_data_r;
      end
    end
  end
  endgenerate

我想知道这是不是一个好方法。我原本只希望用读取FIFO的字节数来寻址寄存器向量。我担心这不是确定性的,因为生成的always块运行的顺序没有指定,而且它似乎会导致创建许多不必要的逻辑来将数据从一个寄存器移动到另一个寄存器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-24 14:51:17

首先,通常你不需要担心always语句的数量。如果它们都使用相同的时钟并重置,您将获得与进程之间的交互相关的预期行为。我所做的一件事,更多的是关于风格,是添加一个#FD到我的flop赋值中,如下所示,以使模拟看起来更好一些,IMHO。

而且,这非常简单,您可以将其作为单个进程进行编码。

代码语言:javascript
复制
parameter FD = 1;
reg [1361*8-1:0] mac_rx_regs;  // Arrays are good if you are trying to 
                               // infer memory, but if you are okay 
                               // with registers, just declare a vector.
always @ (posedge clk or posedge reset)
begin 
   if (reset)
      mac_rx_regs <= #FD 1361*8'h0;
   else
      // This next statement shifts in a new 8 bits when rx_data_valid_r is asserted.
      // It will assign max_rx_regs to max_rx_regs (nop) when deasserted.
      mac_rx_regs <= #FD rx_data_valid_r ? {mac_rx_regs[1361*8-9:0],rx_data_r} : 
                                            mac_rx_regs;
end  
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45852498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档