问题描述

将8个拨动开关作为8位并行输入,即对应数码为0000_0000—1111_1111,十进制数值为0-255,将编码对应的十进制数值显示在三个七段管上。比如若输入1000_0100对应十进制数为132,则在三个七段上显示1、3、2数字。建议七段管显示译码电路设计成模块,主模块采用模块调用的方式实现3个七段管的驱动。

verilog代码(task方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
module bcdto7(bin,out1,out2,out3);
input [7:0] bin; // 8路输入,高电平1为有效电平
output reg[6:0] out1; //个位的数码管
output reg[6:0] out2; // 十位的数码管
output reg[6:0] out3; // 百位的数码管
wire[3:0] bai;
wire[3:0] shi;
wire[3:0] ge;

assign ge=bin%10; // 个位赋值
assign shi=(bin/10)%10; // 十位赋值
assign bai=bin/100; // 百位赋值

always@(bin)
begin
if(bin<10)
begin
show(ge,out1); // 第一个七段管 显示个位
out2=7'b1111111; // 第二个七段管不显示
out3=7'b1111111; // 第三个七段管不显示
end
else if(bin<100)
begin
show(ge,out1); // 第一个七段管 显示个位
show(shi,out2); // 第二个七段管 显示十位
out3=7'b1111111; // 第三个七段管不显示
end
else
begin
show(ge,out1); // 第一个七段管 显示个位
show(shi,out2); // 第二个七段管 显示十位
show(bai,out3); // 第三个七段管 显示百位
end
end

task show;
input integer decc; // 输入,十进制数
output reg[6:0] outt; // 输出,7位二进制数值
if(decc==0) outt=7'b1000000; // 七段管显示0
else if(decc==1) outt=7'b1111001; // 七段管显示1
else if(decc==2) outt=7'b0100100; // 七段管显示2
else if(decc==3) outt=7'b0110000; // 七段管显示3
else if(decc==4) outt=7'b0011001; // 七段管显示4
else if(decc==5) outt=7'b0010010; // 七段管显示5
else if(decc==6) outt=7'b0000010; // 七段管显示6
else if(decc==7) outt=7'b1111000; // 七段管显示7
else if(decc==8) outt=7'b0000000; // 七段管显示8
else if(decc==9) outt=7'b0011000; // 七段管显示9
else outt=7'b1111111; // 七段管不显示
endtask

endmodule

verilog代码(模块调用方式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
module bcdto7(bin,out1,out2,out3);
input [7:0] bin;
output [6:0] out1; //个位的数码管
output [6:0] out2; // 十位的数码管
output [6:0] out3; // 百位的数码管
wire[3:0] bai;
wire[3:0] shi;
wire[3:0] ge;

assign ge=bin%10; // 个位赋值
assign shi=(bin/10)%10; // 十位赋值
assign bai=bin/100; // 百位赋值

show t1(ge,out1);
show t2(shi,out2);
show t3(bai,out3);


endmodule
module show(
input [3:0]dec1,
output reg [6:0] u_out);
always@(dec1)
begin
case(dec1)
4'b0000:u_out=7'b1000000;
4'b0001:u_out=7'b1111001;
4'b0010:u_out=7'b0100100;
4'b0011:u_out=7'b0110000;
4'b0100:u_out=7'b0011001;
4'b0101:u_out=7'b0010010;
4'b0110:u_out=7'b0000010;
4'b0111:u_out=7'b1111000;
4'b1000:u_out=7'b0000000;
4'b1001:u_out=7'b0010000;
default:u_out = 7'b1111111;
endcase
end
endmodule

仿真测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
`timescale 1 ps/ 1 ps
module bcdto7_vlg_tst();
// 初始化变量
reg [7:0] bin; // 8路输入,高电平1为有效电平
wire [6:0] out1; // 7路输出,对应第一个七段管十进制数的显示(个位)
wire [6:0] out2; // 7路输出,对应第二个七段管十进制数的显示(十位)
wire [6:0] out3; // 7路输出,对应第三个七段管十进制数的显示(百位)

integer i;
bcdto7 i1 (
.bin(bin),
.out1(out1),
.out2(out2),
.out3(out3)
);
initial
begin
// i对应二进制 00000000~11111111(8位),用于遍历bin所有情况
for(i=0;i<256;i=i+1)
begin
// 十进制转二进制
bin[0]=(i/1)%2;
bin[1]=(i/2)%2;
bin[2]=(i/4)%2;
bin[3]=(i/8)%2;
bin[4]=(i/16)%2;
bin[5]=(i/32)%2;
bin[6]=(i/64)%2;
bin[7]=(i/128)%2;
#1; //延时
end
$display("begin");
end

initial
// 输出显示 in,out3,out2,out1(二进制)
$monitor($realtime,,,"dec:%d bit:%b %b %b",bin,out3,out2,out1);

endmodule

仿真结果