2201_75537819 2024-09-22 20:43 采纳率: 50%
浏览 10

命中顺序仲裁verilog如何优化设计

命中顺序仲裁模块检测某单列的 valid 信号(如4b'0010,第二列有效即第二列被命中)是否有效,如果无效就复位该列的记录信号 (record,valid为4'b0010时,record从4'b0000为4'b0010) 然后结束仲裁,如果有效就判断该列是否已经被记录过了,即该列的记录信号是否有效,如果记录信号有效就结束仲裁,如果记录信号无效则接着判断是否存在valid 有效且未被记录、ID 号小于它的列(单列的 ID 是指按单列布局顺序,最左边的列的 ID 为 1,然后第二列的 ID 是 2,最右边的单列的 ID 是4,一共4列),如果存在就不对该列进行记录,待下次仲裁时再记录,如果不存在就置位本列的记录信号。
流程如图:

img


已写代码如下:

module hit (
    input clk_40,
    input rst,
    input [3:0] sync_valid,          
    output reg [3:0] record,  
    output reg [2:0] hit_ID 
);

parameter state_1 = 2'b00;
parameter state_2 = 2'b01;
parameter state_3 = 2'b10;
parameter state_4 = 2'b11;
reg [1:0] state;

always @(posedge clk_40 or posedge rst) begin
    if(rst) begin
        state <= state_4;
        record <= 4'b0000;
        hit_ID <= 3'd0;
    end
    else begin
        case (state)
            state_4: begin//第四列判断
                if(sync_valid[3]) begin
                    if(!record[3]) begin
                        record[3] <= 1;
                        hit_ID <= 3'd4;
                        state <= state_1;
                    end
                    else
                        state <= state_1;
                end
                else begin
                    record[3] <= 0;
                    state <= state_1;
                end
            end
            state_3: begin//第三列判断
                if(sync_valid[2]) begin
                    if(!record[2]) begin
                        record[2] <= 1;
                        hit_ID <= 3'd3;
                        state <= state_1;
                    end
                    else 
                        state <= state_4;
                end
                else begin
                    record[2] <= 0;
                    state <= state_4;
                end
            end
            state_2: begin//第二列判断
                if(sync_valid[1]) begin
                    if(!record[1]) begin
                        record[1] <= 1;
                        hit_ID <= 3'd2;
                        state <= state_1;
                    end
                    else 
                        state <= state_3;
                end
                else begin
                    record[1] <= 0;
                    state <= state_3;
                end
            end
            state_1: begin//第一列判断
                if(sync_valid[0]) begin
                    if(!record[0]) begin
                        record[0] <= 1;
                        hit_ID <= 3'd1;
                    end
                    else 
                        state <= state_2;
                end
                else begin
                    record[0] <= 0;
                    state <= state_2;
                end
            end
        endcase
    end
end

endmodule

仿真时存在的问题:
若每个时钟连续输入valid时,因处理一个数据需要多个时钟周期会导致数据被覆盖而遗漏数据得不到处理。如何优化代码?

  • 写回答

2条回答 默认 最新

  • 老皮芽子 2024-09-23 16:31
    关注
    
    module hit (
        input clk_40,
        input rst,
        input [3:0] sync_valid,          
        output reg [3:0] record,  
        output reg [2:0] hit_ID 
    );
     
     
    always @(posedge clk_40 or posedge rst) begin
        if(rst) begin
            record <= 4'b0000;
            hit_ID <= 3'd0;
        end
        else
        begin
            record    <= sync_valid;
            if(sync_valid[3] == 1)
                hit_ID <= 3'd4;
            else if(sync_valid[2] == 1)
                hit_ID <= 3'd3;
            else if(sync_valid[1] == 1)
                hit_ID <= 3'd2;
            else if(sync_valid[0] == 1)
                hit_ID <= 3'd1;
            else
                hit_ID <= 3'd0;
        end
    end    
     
    endmodule
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月22日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?