命中顺序仲裁模块检测某单列的 valid 信号(如4b'0010,第二列有效即第二列被命中)是否有效,如果无效就复位该列的记录信号 (record,valid为4'b0010时,record从4'b0000为4'b0010) 然后结束仲裁,如果有效就判断该列是否已经被记录过了,即该列的记录信号是否有效,如果记录信号有效就结束仲裁,如果记录信号无效则接着判断是否存在valid 有效且未被记录、ID 号小于它的列(单列的 ID 是指按单列布局顺序,最左边的列的 ID 为 1,然后第二列的 ID 是 2,最右边的单列的 ID 是4,一共4列),如果存在就不对该列进行记录,待下次仲裁时再记录,如果不存在就置位本列的记录信号。
流程如图:
已写代码如下:
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时,因处理一个数据需要多个时钟周期会导致数据被覆盖而遗漏数据得不到处理。如何优化代码使得每个时钟输入的数据都能的到处理?
更多回帖