本练习把一个八位的 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
运行一下看看波形:
很不错!