本练习把一个八位的 onehot 编码转换成三位的二进制数。
编码器端口配置:

编码器代码:
module encoder(
x,
en,
y);
input [7:0] x;
input en;
output [2:0] y;
wire [7:0] x;
wire en;
reg [2:0] y;
always @ (en or x)
begin
if (en)
begin
case (x)
8'b00000001 : y = 3'b000;
8'b00000010 : y = 3'b001;
8'b00000100 : y = 3'b010;
8'b00001000 : y = 3'b011;
8'b00010000 : y = 3'b100;
8'b00100000 : y = 3'b101;
8'b01000000 : y = 3'b110;
8'b10000000 : y = 3'b111;
default : y = 3'b000;
endcase
end
end
endmodule //encoder
译码器端口配置:

译码器代码:
module decoder(
din,
en,
out);
input [2:0] din;
input en;
output [7:0] out;
wire [2:0] din;
wire en;
wire [7:0] out;
assign out = (en) ? (1 << din) : 8'b0;
endmodule //decoder
测试电路设计:

测试代码:
module encoder_test();
reg [2:0] data;
reg en;
wire [2:0] out;
wire [7:0] decoder2_out;
initial begin
data = 3'b000;
en = 0;
#1 data = 3'b000;
en = 1;
#1 data = 3'b001;
#1 data = 3'b010;
#1 data = 3'b011;
#1 data = 3'b100;
#1 data = 3'b101;
#1 data = 3'b110;
#1 data = 3'b111;
#1 data = 3'b000;
#1 data = 3'b001;
#1 $finish;
end
initial begin
$dumpfile ("... .../encoder_test.vcd");
$dumpvars;
end
encoder encoder1(
.x(decoder2_out),
.en(en),
.y(out));
decoder decoder2(
.din(data),
.en(en),
.out(decoder2_out));
endmodule
运行一下看看波形:

很不错!
本文介绍了一种使用Verilog实现的编码器和译码器设计,该设计可以将一个八位的OneHot编码转换为三位的二进制数,并通过测试电路验证了其正确性。
2063

被折叠的 条评论
为什么被折叠?



