You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 23:25:11