1、常规的8-3编码器(一次输入只有一个1)

//8-3编码器:常规8-3编码器,每次的输入只有11,编码输出结果为1所处的位置

module encoder(
input D0,
input D1,
input D2,
input D3,
input D4,
input D5,
input D6,
input D7,
output reg [2:0]Q2Q1Q0
    );
always@(*)begin
Q2Q1Q0=0;
case(1'b1)
D0:Q2Q1Q0=3'b000;
D1:Q2Q1Q0=3'b001;
D2:Q2Q1Q0=3'b010;
D3:Q2Q1Q0=3'b011;
D4:Q2Q1Q0=3'b100;
D5:Q2Q1Q0=3'b101;
D6:Q2Q1Q0=3'b110;
D7:Q2Q1Q0=3'b111;
endcase
end			
endmodule

仿真文件:

module encoder_tst();
reg D0;
reg D1;
reg D2;
reg D3;
reg D4;
reg D5;
reg D6;
reg D7;
wire [2:0]Q2Q1Q0;
encoder U_encoder(
.D0    (D0    ),
.D1    (D1    ),
.D2    (D2    ),
.D3    (D3    ),
.D4    (D4    ),
.D5    (D5    ),
.D6    (D6    ),
.D7    (D7    ),
.Q2Q1Q0(Q2Q1Q0)
);

initial
begin
D0 =0;
D1 =0;
D2 =1;
D3 =0;
D4 =0;
D5 =0;
D6 =0;
D7 =0;
end

endmodule

2、有优先级8-3编码器
(低位优先级最高,1次输入可以有多个1)

module priority_encoder(
input D0,
input D1,
input D2,
input D3,
input D4,
input D5,
input D6,
input D7,
output reg [2:0]Q2Q1Q0
    );
	
always@(*)	
begin
Q2Q1Q0=3'b000;
if(D0)       Q2Q1Q0=3'b000; 
else if(D1)  Q2Q1Q0=3'b001;
else if(D2)  Q2Q1Q0=3'b010;
else if(D3)  Q2Q1Q0=3'b011;
else if(D4)  Q2Q1Q0=3'b100;
else if(D5)  Q2Q1Q0=3'b101;
else if(D6)  Q2Q1Q0=3'b110;
else if(D7)  Q2Q1Q0=3'b111;
	
end	
	
endmodule

module encoder_tst();
reg D0;
reg D1;
reg D2;
reg D3;
reg D4;
reg D5;
reg D6;
reg D7;
wire [2:0]Q2Q1Q0;
encoder U_encoder(
.D0    (D0    ),
.D1    (D1    ),
.D2    (D2    ),
.D3    (D3    ),
.D4    (D4    ),
.D5    (D5    ),
.D6    (D6    ),
.D7    (D7    ),
.Q2Q1Q0(Q2Q1Q0)
);

initial
begin
D0 =0;
D1 =0;
D2 =1;
D3 =0;
D4 =0;
D5 =0;
D6 =0;
D7 =0;

end

endmodule


以上内容参考《verilog高级数字系统设计技术与实例分析》,比较简单易懂,常规编码器中case的用法我其实是第一次见,感觉很值得学习。