always @(x or en) begin if(en) begin case (x) 4'b0001 : y = 2'b00; 4'b0010 : y = 2'b01; 4'b0100 : y = 2'b10; 4'b1000 : y = 2'b11; default: y = 2'b00; endcase end else y = 2'b00; end endmodule
三、优先编码
和编码器不一样的是,输入不是独热信号,可能有多个 1。如果输入信号为 4b’0101,则输出为 2’b10,即最高位的权限最高。通过观察,可以使用 for 循环来确定优先级:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
module encode42(x,en,y); input [3:0] x; input en; outputreg [1:0]y; integer i; always @(x or en) begin if (en) begin y = 0; for( i = 0; i <= 3; i = i+1) if(x[i] == 1) y = i[1:0]; end else y = 0; end endmodule
// 83 优先编码器 module encode83(x,en,y,tag,bcd7seg); input [7:0] x; input en; outputreg [2:0] y; outputreg [7:0] bcd7seg; outputreg tag; integer i; always @(x or en) begin if(en) begin y = 0; tag = 0; for(i = 0; i <= 7; i = i+1) begin if(x[i] == 1) begin y = i[2:0]; tag = 1; end end end elsebegin tag = 0; y = 0; end