输入一个多bit的数,找到第一个1的位置
module pos #(parameter N=9)(
input clk,rst_n,
input [N-1:0] din,
output [N-1:0] first_pos,
output [N-1:0] first_pos_out,
output [N-1:0] last_pos,
output [N-1:0] last_pos_out
);
assign first_pos = din & (~(din-1));
// assign first_pos_out = $clog2(first_pos); // 不可综合
integer i;
reg [$clog2(DATA_WIDTH)-1:0] idx;
wire [DATA_WIDTH-1:0] din;
always @(*)begin
idx = 'd0;
// 行为级描述
for(i=0;i<DATA_WIDTH;i=i+1)begin
if(first_pos [i])
idx = i;
end
end
// 从MSB到LSB,第一个1出现的位置
assign first_pos_out = idx;
genvar i,j;
reg [N-1:0] tmp;
reg [N-1:0] tmp_pos;
// 从LSB到MSB第一个1出现的位置
generate
for(i=0;i<N;i=i+1)begin
assign tmp[N-1-i] = din[i];
end
endgenerate
assign tmp_pos = tmp & (~(tmp-1));
generate
for(j=0;j<N;j=j+1)begin
assign last_pos[N-1-j] = tmp_pos[j];
end
endgenerate
// assign last_pos_out = $clog2(last_pos); // 不可综合
endmodule
独热码转二进制码
module test_q #(
parameter ONE_HOT_WIDTH = 8
)(
input[ONE_HOT_WIDTH-1 : 0] one_hot_code,
output logic [$clog2(ONE_HOT_WIDTH)-1 : 0] bin_code
);
logic [$clog2(ONE_HOT_WIDTH)-1 : 0] temp1 [ONE_HOT_WIDTH-1 : 0];
logic [ONE_HOT_WIDTH-1 : 0] temp2 [$clog2(ONE_HOT_WIDTH)-1 : 0];
genvar i,j,k;
generate
for(i = 0; i < ONE_HOT_WIDTH; i = i+1)begin : temp1_loop
assign temp1[i] = one_hot_code[i]? i:'b0;
end
endgenerate
generate
for(i = 0; i < ONE_HOT_WIDTH; i = i+1)begin : temp_ch1
for(j = 0; j < $clog2(ONE_HOT_WIDTH); j = j+1)begin : temp_ch2
assign temp2[j][i] = temp1[i][j];
end
end
endgenerate
generate
for(j = 0; j < $clog2(ONE_HOT_WIDTH); j = j+1)begin : temp2_loop
assign bin_code[j] = |temp2[j];
end
endgenerate
endmodule
参考https://blog.csdn.net/u013749478/article/details/128564521