1、常规的8-3编码器(一次输入只有一个1)
//8-3编码器:常规8-3编码器,每次的输入只有1个1,编码输出结果为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的用法我其实是第一次见,感觉很值得学习。