Priority encoder
// synthesis verilog_input_version verilog_2001
/*
输入in = 4'b1000,输出pos = 2'd3。
输入in = 4'b0100,输出pos = 2'd2。
输入in = 4'b0010,输出pos = 2'd1。
输入in = 4'b0001,输出pos = 2'd0。
输入in = 4'b0000,输出pos = 2'd0。
*/
module top_module (
input [3:0] in,
output reg [1:0] pos
);
/*
always @(*) begin // 组合逻辑
if (in[3]) begin
pos = 2'd3; // 如果in[3]为1,输出3
end else if (in[2]) begin
pos = 2'd2; // 如果in[2]为1,输出2
end else if (in[1]) begin
pos = 2'd1; // 如果in[1]为1,输出1
end else if (in[0]) begin
pos = 2'd0; // 如果in[0]为1,输出0
end else begin
pos = 2'd0; // 如果所有位都为0,输出0
end
end
*/
/*
always @(*) begin // 组合逻辑
case (1'b1) // 使用1'b1作为条件,确保case语句总是匹配
in[3]: pos = 2'd3; // 如果in[3]为1,输出3
in[2]: pos = 2'd2; // 如果in[2]为1,输出2
in[1]: pos = 2'd1; // 如果in[1]为1,输出1
in[0]: pos = 2'd0; // 如果in[0]为1,输出0
default: pos = 2'd0; // 如果所有位都为0,输出0
endcase
end
*/
//case
always@(*)
begin
case(in)
4'b0000:pos = 2'd00;
4'b0001:pos = 2'd00;
4'b0010:pos = 2'd01;
4'b0011:pos = 2'd00;
4'b0100:pos = 2'd02;
4'b0101:pos = 2'd00;
4'b0110:pos = 2'd01;
4'b0111:pos = 2'd00;
4'b1000:pos = 2'd03;
4'b1001:pos = 2'd00;
4'b1010:pos = 2'd01;
4'b1011:pos = 2'd00;
4'b1100:pos = 2'd02;
4'b1101:pos = 2'd00;
4'b1110:pos = 2'd01;
4'b1111:pos = 2'd00;
default:pos = 2'd00;
endcase
end
endmodule