FPGA|CPLD|ASIC论坛
直播中

jf_18813638

未满1年用户 3经验值
擅长:FPGA
私信 关注
[问答]

命中顺序仲裁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
                elsebegin
                    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
                elsebegin
                    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积分

更多回帖

发帖
×
20
完善资料,
赚取积分