Verilog 用生成的移位从FIFO填充寄存器向量
我对Verilog有点陌生,我刚刚开始做一个项目,我正在尝试验证我开始使用的代码是否可行。下面的代码片段将FIFO卸载到8位寄存器的向量中。在每个时钟周期,它从FIFO卸载一个字节,并将其放入寄存器链的末尾,将链中的所有其他字节下移Verilog 用生成的移位从FIFO填充寄存器向量,verilog,fpga,Verilog,Fpga,我对Verilog有点陌生,我刚刚开始做一个项目,我正在尝试验证我开始使用的代码是否可行。下面的代码片段将FIFO卸载到8位寄存器的向量中。在每个时钟周期,它从FIFO卸载一个字节,并将其放入寄存器链的末尾,将链中的所有其他字节下移 reg [ 7:0] mac_rx_regs [0 : 1361]; generate for (ii=0; ii<1361; ii=ii+1) begin: mac_rx_regs_inst a
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
reg[7:0]mac_rx_regs[0:1361];
generate for(ii=0;ii首先,您实际上不需要担心always语句的数量。如果它们都使用相同的时钟和重置,您将获得与进程之间交互相关的预期行为。
我要做的一件事,就是在我的翻牌任务中添加一个#FD,如下所示,让模拟看起来更好一点,IMHO
而且,这非常简单,您可以将其编码为单个进程
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
参数FD=1;
reg[1361*8-1:0]mac_rx_regs;//如果您试图
//推断记忆,但如果你没事
//对于寄存器,只需声明一个向量。
始终@(posedge clk或posedge重置)
开始
如果(重置)
mac_rx_regs谢谢你的回答。如果我理解正确,我的原始代码应该可以正常工作,但我更喜欢你的版本。它更干净,功能更明显。