EDA设计课程实验报告数码管动态显示实验报告.docx

上传人:b****8 文档编号:9648495 上传时间:2023-02-05 格式:DOCX 页数:15 大小:204.21KB
下载 相关 举报
EDA设计课程实验报告数码管动态显示实验报告.docx_第1页
第1页 / 共15页
EDA设计课程实验报告数码管动态显示实验报告.docx_第2页
第2页 / 共15页
EDA设计课程实验报告数码管动态显示实验报告.docx_第3页
第3页 / 共15页
EDA设计课程实验报告数码管动态显示实验报告.docx_第4页
第4页 / 共15页
EDA设计课程实验报告数码管动态显示实验报告.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

EDA设计课程实验报告数码管动态显示实验报告.docx

《EDA设计课程实验报告数码管动态显示实验报告.docx》由会员分享,可在线阅读,更多相关《EDA设计课程实验报告数码管动态显示实验报告.docx(15页珍藏版)》请在冰豆网上搜索。

EDA设计课程实验报告数码管动态显示实验报告.docx

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有了新的知识的渴望。

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 成考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1