Verilog时钟沿块嵌套循环下逐次输出i/j对应结果的实现问题
问题原因
Verilog中always @(posedge clk)块内的for循环属于组合逻辑式的循环展开,会在单个时钟周期内完成所有256次(16×16)计算,最终输出寄存器Y_Planar_Prediction只会保留最后一次循环(i=15, j=15)的结果,无法实现逐个时钟输出不同i、j对应值的需求。
修改方案
将嵌套循环改为串行计数器驱动,每个时钟沿更新一组i、j的值并计算对应结果,代码如下:
reg [3:0] i, j; // 用4位寄存器存储0-15的计数,比integer更适配硬件实现 // 根据实际数据位宽补充Y_pred_h、Y_pred_v的位宽定义 reg [31:0] Y_pred_h, Y_pred_v; // 带异步复位的计数器逻辑,初始化索引值 always @(posedge clk or negedge reset_n) begin if(!reset_n) begin i <= 4'd0; j <= 4'd0; end else begin // 先递增i,i到15后重置为0,再递增j if(i == 4'd15) begin i <= 4'd0; if(j == 4'd15) begin j <= 4'd0; // 若需循环输出则保持此逻辑,若仅输出一轮可改为j <= j停止计数 end else begin j <= j + 4'd1; end end else begin i <= i + 4'd1; end end end // 逐时钟计算Luma预测值 always @(posedge clk) begin Y_pred_h = (16-1-i) * Y_ref_buffer_left[j] + (i+1) * Y_ref_buffer_top_right; Y_pred_v = (16-1-j) * Y_ref_buffer_top[i] + (j+1) * Y_ref_buffer_left_bottom; Y_Planar_Prediction = (Y_pred_h + Y_pred_v + 16 ) >> (4+1); end
说明
- 用寄存器类型的
i、j作为串行计数器,每个时钟沿更新索引,实现逐个输出不同i、j对应的预测值。 - 添加复位信号
reset_n(可根据需求改为同步复位),确保计数器初始状态正确,避免硬件不定态。 - 若仅需要输出一轮16×16的结果,可在
j == 4'd15且i == 4'd15时修改分支逻辑,停止计数器递增。
内容的提问来源于stack exchange,提问作者Sunil.B
相关产品推荐
相关产品推荐

