EDA设计课程实验报告数码管动态显示实验报告Word格式.docx
《EDA设计课程实验报告数码管动态显示实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《EDA设计课程实验报告数码管动态显示实验报告Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
01111111
C0
10111111
F9
11011111
11101111
80
11110111
11111011
11111101
A4
11111110
注:
数码管显示为01180121
(3)算法流程图(见图2)
N
Y
7
6
5
4
3
2
1
Start
clk↑?
dig=10111111
dig=11011111
dig=11101111
dig=11110111
dig=11111011
dig=11111101
dig=11111110
dig=01111111
count=?
seg=c0
seg=f9
seg=80
seg=a4
count=count+1
图2
(4)Verilog源代码
modulescan_led(clk_1k,d,dig,seg);
//模块名scan_led
inputclk_1k;
//输入时钟
input[31:
0]d;
//输入要显示的数据
output[7:
0]dig;
//数码管选择输出引脚
0]seg;
//数码管段输出引脚
reg[7:
0]seg_r;
//定义数码管输出寄存器
0]dig_r;
//定义数码管选择输出寄存器
reg[3:
0]disp_dat;
//定义显示数据寄存器
reg[2:
0]count;
//定义计数寄存器
assigndig=dig_r;
//输出数码管选择
assignseg=seg_r;
//输出数码管译码结果
always@(posedgeclk_1k)//定义上升沿触发进程
begin
count<
=count+1'
b1;
end
always@(posedgeclk_1k)
case(count)//选择扫描显示数据
3'
d0:
disp_dat=d[31:
28];
//第一个数码管
d1:
disp_dat=d[27:
24];
//第二个数码管
d2:
disp_dat=d[23:
20];
//第三个数码管
d3:
disp_dat=d[19:
16];
//第四个数码管
d4:
disp_dat=d[15:
12];
//第五个数码管
d5:
disp_dat=d[11:
8];
//第六个数码管
d6:
disp_dat=d[7:
4];
//第七个数码管
d7:
disp_dat=d[3:
0];
//第八个数码管
endcase
case(count)//选择数码管显示位
dig_r=8'
b01111111;
//选择第一个数码管显示
b10111111;
//选择第二个数码管显示
b11011111;
//选择第三个数码管显示
b11101111;
//选择第四个数码管显示
b11110111;
//选择第五个数码管显示
b11111011;
//选择第六个数码管显示
b11111101;
//选择第七个数码管显示
b11111110;
//选择第八个数码管显示
endcase
always@(disp_dat)
case(disp_dat)//七段译码
4'
h0:
seg_r=8'
hc0;
//显示0
h1:
hf9;
//显示1
h2:
ha4;
//显示2
h3:
hb0;
//显示3
h4:
h99;
//显示4
h5:
h92;
//显示5
h6:
h82;
//显示6
h7:
hf8;
//显示7
h8:
h80;
//显示8
h9:
h90;
//显示9
ha:
h88;
//显示a
hb:
h83;
//显示b
hc:
hc6;
//显示c
hd:
ha1;
//显示d
he:
h86;
//显示e
hf:
h8e;
//显示f
endmodule
四、系统调试
(1)仿真代码
`timescale1ns/1ns
modulescan_ledfz;
regclk_1k;
reg[31:
wire[7:
wire[7:
parameterdely=100;
scan_ledu1(clk_1k,d,dig,seg);
always#(dely/2)
clk_1k=~clk_1k;
initialbegin
clk_1k=0;
d=32'
h01180134;
#dely;
#(dely*20);
#dely$finish;
initial$monitor($time,,,"
%b,%d,%h,%h"
clk_1k,d,dig,seg);
0]count=3'
b000;
always@(posedgeclk_1k)//定义上升沿触发进程
位码代码仿真代码
`timescale1ns/1ns
modulesmg_tp;
//测试模块的名字
reg[2:
0]c;
//测试输入信号定义为reg型
//测试输出信号定义为wire型
parameterDELY=100;
//延时100秒
weiu1(c,dig);
//调用测试对象
initialbegin//激励波形设定
c=3'
b0;
#DELYc=3'
b001;
b010;
b100;
b101;
b110;
b111;
#DELY$finish;
end
initial$monitor($time,,,"
dig=%d,c=%b"
dig,c);
//输出格式i定义
endmodule
modulewei(c,dig);
//命名模块名字
input[2:
output[7:
//定义输入与输出
reg[7:
reg[2:
0]c_r;
//定义dig_r与c_r2个reg型数据
assigndig=dig_r;
//将reg型数据转化为wire型数据
always@(*)//检测c_r的数据是否变化
beginc_r=c;
case(c_r)
3'
b000:
dig_r=8'
//c_r的数据变化而dig_r对于的数据变化
b001:
b010:
b011:
b100:
b101:
b110:
b111:
default:
dig_r=8'
b11111111;
endcase//结束case语句
end//结束always语句
endmodule//结束程序
译码器代码仿真代码
moduleduan_tp;
reg[3:
0]a;
duanu1(a,seg);
a=4'
#DELYa=4'
b0001;
b0010;
b0011;
b0100;
b0101;
b0110;
b0111;
b1000;
b1001;
b1010;
b1011;
b1100;
b1101;
b1110;
b1111;
seg=%d,a=%b"
seg,a);
endmodule
moduleduan(a,seg);
input[3:
0]a_r;
//定义seg_r与a_r2个reg型数据
assignseg=seg_r;
begina_r=a;
case(a_r)//七段译码
b0000:
b0001:
b0010:
b0011:
b0100:
b0101:
b0110:
b0111:
b1000:
///显示8
b1001:
b1010:
b1011:
b1100:
b1101:
b1110:
b1111:
///显示f
(2)仿真波形图
(3)引脚图
五、实验感想
通过这次实验,让我学习动态扫描显示的原理;
这个实验的结构电路是属于多层次结构电路,要把系统分为好几个模块,每个模块再分成几个子模块。
所以这次的实验对我们又是一个锻炼,掌握它之后,又让我对EDA有了新的知识的渴望。