EDA设计课程实验报告数码管动态显示实验报告.docx
- 文档编号:29894453
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:15
- 大小:204.21KB
EDA设计课程实验报告数码管动态显示实验报告.docx
《EDA设计课程实验报告数码管动态显示实验报告.docx》由会员分享,可在线阅读,更多相关《EDA设计课程实验报告数码管动态显示实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
EDA设计课程实验报告数码管动态显示实验报告
EDA设计课程实验报告
实验题目:
数码管动态显示实验
学院名称:
专业:
电子信息工程
班级:
姓名:
高胜学号
小组成员:
指导教师:
一、实验目的
学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
二、设计任务及要求
1、在SmartSOPC实验箱上完成数码管动态显示自己学号的后八个数字。
2、放慢扫描速度演示动态显示的原理过程。
三、系统设计
1、整体设计方案
数码管的八个段a,b,c,d,e,f,g,h(h是小数点)都分别连接到SEG0~SEG7,8个数码管分别由八个选通信号DIG0~DIG7来选择,被选通的数码管显示数据,其余关闭。
如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG0~DIG7分别被单独选通,并在此同时,在段信号输入口SEG0~SEG7加上该对应数码管上显示的数据,于是随着选通信号的扫描就能实现动态扫描显示的目的。
虽然每次只有1个数码管显示,但只要扫描显示速率足够快,利用人眼的视觉余辉效应,我们仍会感觉所有的数码管都在同时显示。
2、功能模块电路设
(1)输入输出模块框图(见图1)
图1
(2)模块逻辑表达(见表1)
表1(数码管显示真值表)
clk_1k
dig
seg
↑
01111111
C0
↑
10111111
F9
↑
11011111
F9
↑
11101111
80
↑
11110111
C0
↑
11111011
F9
↑
11111101
A4
↑
11111110
F9
注:
数码管显示为01180121
(3)算法流程图(见图2)
N
Y
7
6
5
4
3
2
1
0
Start
clk↑?
dig=10111111
dig=11011111
dig=11101111
dig=11110111
dig=11111011
dig=11111101
dig=11111110
dig=01111111
count=?
seg=c0
seg=f9
seg=f9
seg=80
seg=c0
seg=f9
seg=a4
seg=f9
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;//数码管选择输出引脚
output[7:
0]seg;//数码管段输出引脚
reg[7:
0]seg_r;//定义数码管输出寄存器
reg[7:
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)
begin
case(count)//选择扫描显示数据
3'd0:
disp_dat=d[31:
28];//第一个数码管
3'd1:
disp_dat=d[27:
24];//第二个数码管
3'd2:
disp_dat=d[23:
20];//第三个数码管
3'd3:
disp_dat=d[19:
16];//第四个数码管
3'd4:
disp_dat=d[15:
12];//第五个数码管
3'd5:
disp_dat=d[11:
8];//第六个数码管
3'd6:
disp_dat=d[7:
4];//第七个数码管
3'd7:
disp_dat=d[3:
0];//第八个数码管
endcase
case(count)//选择数码管显示位
3'd0:
dig_r=8'b01111111;//选择第一个数码管显示
3'd1:
dig_r=8'b10111111;//选择第二个数码管显示
3'd2:
dig_r=8'b11011111;//选择第三个数码管显示
3'd3:
dig_r=8'b11101111;//选择第四个数码管显示
3'd4:
dig_r=8'b11110111;//选择第五个数码管显示
3'd5:
dig_r=8'b11111011;//选择第六个数码管显示
3'd6:
dig_r=8'b11111101;//选择第七个数码管显示
3'd7:
dig_r=8'b11111110;//选择第八个数码管显示
endcase
end
always@(disp_dat)
begin
case(disp_dat)//七段译码
4'h0:
seg_r=8'hc0;//显示0
4'h1:
seg_r=8'hf9;//显示1
4'h2:
seg_r=8'ha4;//显示2
4'h3:
seg_r=8'hb0;//显示3
4'h4:
seg_r=8'h99;//显示4
4'h5:
seg_r=8'h92;//显示5
4'h6:
seg_r=8'h82;//显示6
4'h7:
seg_r=8'hf8;//显示7
4'h8:
seg_r=8'h80;//显示8
4'h9:
seg_r=8'h90;//显示9
4'ha:
seg_r=8'h88;//显示a
4'hb:
seg_r=8'h83;//显示b
4'hc:
seg_r=8'hc6;//显示c
4'hd:
seg_r=8'ha1;//显示d
4'he:
seg_r=8'h86;//显示e
4'hf:
seg_r=8'h8e;//显示f
endcase
end
endmodule
四、系统调试
(1)仿真代码
`timescale1ns/1ns
modulescan_ledfz;
regclk_1k;
reg[31:
0]d;
wire[7:
0]dig;
wire[7:
0]seg;
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;
#dely;
#dely;
#dely;
#(dely*20);
#dely$finish;
end
initial$monitor($time,,,"%b,%d,%h,%h",clk_1k,d,dig,seg);
endmodule
modulescan_led(clk_1k,d,dig,seg);//模块名scan_led
inputclk_1k;//输入时钟
input[31:
0]d;//输入要显示的数据
output[7:
0]dig;//数码管选择输出引脚
output[7:
0]seg;//数码管段输出引脚
reg[7:
0]seg_r;//定义数码管输出寄存器
reg[7:
0]dig_r;//定义数码管选择输出寄存器
reg[3:
0]disp_dat;//定义显示数据寄存器
reg[2:
0]count=3'b000;//定义计数寄存器
assigndig=dig_r;//输出数码管选择
assignseg=seg_r;//输出数码管译码结果
always@(posedgeclk_1k)//定义上升沿触发进程
begin
count<=count+1'b1;
end
always@(posedgeclk_1k)
begin
case(count)//选择扫描显示数据
3'd0:
disp_dat=d[31:
28];//第一个数码管
3'd1:
disp_dat=d[27:
24];//第二个数码管
3'd2:
disp_dat=d[23:
20];//第三个数码管
3'd3:
disp_dat=d[19:
16];//第四个数码管
3'd4:
disp_dat=d[15:
12];//第五个数码管
3'd5:
disp_dat=d[11:
8];//第六个数码管
3'd6:
disp_dat=d[7:
4];//第七个数码管
3'd7:
disp_dat=d[3:
0];//第八个数码管
endcase
case(count)//选择数码管显示位
3'd0:
dig_r=8'b01111111;//选择第一个数码管显示
3'd1:
dig_r=8'b10111111;//选择第二个数码管显示
3'd2:
dig_r=8'b11011111;//选择第三个数码管显示
3'd3:
dig_r=8'b11101111;//选择第四个数码管显示
3'd4:
dig_r=8'b11110111;//选择第五个数码管显示
3'd5:
dig_r=8'b11111011;//选择第六个数码管显示
3'd6:
dig_r=8'b11111101;//选择第七个数码管显示
3'd7:
dig_r=8'b11111110;//选择第八个数码管显示
endcase
end
always@(disp_dat)
begin
case(disp_dat)//七段译码
4'h0:
seg_r=8'hc0;//显示0
4'h1:
seg_r=8'hf9;//显示1
4'h2:
seg_r=8'ha4;//显示2
4'h3:
seg_r=8'hb0;//显示3
4'h4:
seg_r=8'h99;//显示4
4'h5:
seg_r=8'h92;//显示5
4'h6:
seg_r=8'h82;//显示6
4'h7:
seg_r=8'hf8;//显示7
4'h8:
seg_r=8'h80;//显示8
4'h9:
seg_r=8'h90;//显示9
4'ha:
seg_r=8'h88;//显示a
4'hb:
seg_r=8'h83;//显示b
4'hc:
seg_r=8'hc6;//显示c
4'hd:
seg_r=8'ha1;//显示d
4'he:
seg_r=8'h86;//显示e
4'hf:
seg_r=8'h8e;//显示f
endcase
end
endmodule
位码代码仿真代码
`timescale1ns/1ns
modulesmg_tp;//测试模块的名字
reg[2:
0]c;//测试输入信号定义为reg型
wire[7:
0]dig;//测试输出信号定义为wire型
parameterDELY=100;//延时100秒
weiu1(c,dig);//调用测试对象
initialbegin//激励波形设定
c=3'b0;
#DELYc=3'b001;
#DELYc=3'b010;
#DELYc=3'b100;
#DELYc=3'b101;
#DELYc=3'b110;
#DELYc=3'b111;
#DELY$finish;
end
initial$monitor($time,,,"dig=%d,c=%b",dig,c);//输出格式i定义
endmodule
modulewei(c,dig);//命名模块名字
input[2:
0]c;
output[7:
0]dig;//定义输入与输出
reg[7:
0]dig_r;
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'b11111110;//c_r的数据变化而dig_r对于的数据变化
3'b001:
dig_r=8'b11111101;
3'b010:
dig_r=8'b11111011;
3'b011:
dig_r=8'b11110111;
3'b100:
dig_r=8'b11101111;
3'b101:
dig_r=8'b11011111;
3'b110:
dig_r=8'b10111111;
3'b111:
dig_r=8'b01111111;
default:
dig_r=8'b11111111;
endcase//结束case语句
end//结束always语句
endmodule//结束程序
译码器代码仿真代码
`timescale1ns/1ns
moduleduan_tp;//测试模块的名字
reg[3:
0]a;//测试输入信号定义为reg型
wire[7:
0]seg;//测试输出信号定义为wire型
parameterDELY=100;//延时100秒
duanu1(a,seg);//调用测试对象
initialbegin//激励波形设定
a=4'b0;
#DELYa=4'b0001;
#DELYa=4'b0010;
#DELYa=4'b0011;
#DELYa=4'b0100;
#DELYa=4'b0101;
#DELYa=4'b0110;
#DELYa=4'b0111;
#DELYa=4'b1000;
#DELYa=4'b1001;
#DELYa=4'b1010;
#DELYa=4'b1011;
#DELYa=4'b1100;
#DELYa=4'b1101;
#DELYa=4'b1110;
#DELYa=4'b1111;
#DELY$finish;
end
initial$monitor($time,,,"seg=%d,a=%b",seg,a);//输出格式i定义
endmodule
moduleduan(a,seg);//命名模块名字
input[3:
0]a;
output[7:
0]seg;//定义输入与输出
reg[7:
0]seg_r;
reg[3:
0]a_r;//定义seg_r与a_r2个reg型数据
assignseg=seg_r;//将reg型数据转化为wire型数据
always@(*)//检测c_r的数据是否变化
begina_r=a;
case(a_r)//七段译码
4'b0000:
seg_r=8'hc0;//显示0
4'b0001:
seg_r=8'hf9;//显示1
4'b0010:
seg_r=8'ha4;//显示2
4'b0011:
seg_r=8'hb0;//显示3
4'b0100:
seg_r=8'h99;//显示4
4'b0101:
seg_r=8'h92;//显示5
4'b0110:
seg_r=8'h82;//显示6
4'b0111:
seg_r=8'hf8;//显示7
4'b1000:
seg_r=8'h80;///显示8
4'b1001:
seg_r=8'h90;//显示9
4'b1010:
seg_r=8'h88;//显示a
4'b1011:
seg_r=8'h83;//显示b
4'b1100:
seg_r=8'hc6;//显示c
4'b1101:
seg_r=8'ha1;//显示d
4'b1110:
seg_r=8'h86;//显示e
4'b1111:
seg_r=8'h8e;///显示f
endcase//结束case语句
end//结束always语句
endmodule//结束程序
(2)仿真波形图
(3)引脚图
五、实验感想
通过这次实验,让我学习动态扫描显示的原理;利用数码管动态扫描显示的原理编写程序,实现自己的学号的显示。
这个实验的结构电路是属于多层次结构电路,要把系统分为好几个模块,每个模块再分成几个子模块。
所以这次的实验对我们又是一个锻炼,掌握它之后,又让我对EDA有了新的知识的渴望。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 设计 课程 实验 报告 数码管 动态 显示