第一篇:EDA课程设计—汽车速度表
燕 山 大 学 EDA课程设计报告书
题目: 汽车速度表 姓名: 班级:
学号:
成绩:
一、设计题目及要求 1.设计题目:汽车速度表 2.设计要求:
(1)能显示汽车速度,单位Km/h,最高时速小于360Km/h;(2)车轮每转一圈,有一传感脉冲,每个脉冲代表1m的距离(用适当频率的时钟信号代替即可);(3)采样周期设为10秒;
(4)用5位数码管显示速度,要显示到小数点后边两位。
二、设计过程及内容
汽车速度表的设计与构建主要包括四个方面,所以它的电路图总体分为四个部分:单位转换电路,10秒周期采样电路,计数电路,扫描显示电路。首先应设计一个单位转换电路,实现m/s转化为km/h的电路,同时实现题目要求显示到小数点后面两位的功能。其次,设计一个10秒定时电路,实现采样周期为10秒。然后设计一个计数电路,记录转换电路中输出的脉冲,即速度。最后设计一个扫描电路,驱动数码管显示速度。1.单位转换电路:
单位转换电路的作用是实现m/s到km/h的转换。题目指出车轮每转一圈,有一传感脉冲,每个脉冲代表1m,则可用n Hz的脉冲代表车轮每秒转过n圈,即汽车速度为n m/s。由转换2 关系知1 m/s=3.6km/h,即0.01×360km/h。脉冲数量上体现为输入输出脉冲数目之比为1:360。计数电路通过计量10s内通过的脉冲数来确定汽车的速度。汽车的速度为计数器输出的脉冲数需要除以10,为了让显示器上直接显示汽车的速度可以使输入输出的脉冲数之比1:36。先用两个74160接成36进制的计数器,再在此基础上实现单位转换功能。
单位转换电路原理图如下:
仿真波形图如下:
2.十秒采样电路:
用三个74160并行进位方式连接成366进制计数器,其中3 clk输入为366HZ的频率,实现输出为1HZ的脉冲。366进制计数器后接一个74161做成的11进制计数器,得到周期为11s的脉冲,其中低电平时长为10s,实现采样周期为十秒,构成十秒定时器。D触发器的功能为消除竞争冒险,用来减小输入端的输入信号受干扰的程度。
十秒周期采样电路原理图如下:
仿真波形图如下: 3.计数电路:
电路原理图由五个74160计数器组成,其中根据速度的要求把最后一个计数器接成一个三进制的,第二个计数器接成六进制。五个计数器的输出端分别用D触发器接成储蓄电路储存输出信号,储存输出用十秒定时器控制。十秒定时器前10秒输出为低电平,D触发器不工作,五个74160记入输入的脉冲数。当第10秒时,上升沿触发,D触发器记录此时的速度,10秒后定时器输出为高电平,D触发器将此时的速度传给扫描电路,同时五个74160计数器清零。遇到10s周期采样电路下一个周期的上升沿时D触发器更新数据。
计数电路原理图如下:
仿真波形图如下:
4.扫描显示电路:
扫描显示电路由4个8选1的数据选择器和一个7449数码管显示器组成,选择器控制信号由一个5进制计数器输出,选择器的输入信号为计数器的输出信号。因为8个数码管从左到右其地址码的十进制表示为32107654,而题目要求显示五位数,此处选用07654。因此设计一个电路,使地址控制输入端S2、S1、S0正好使速度的百位到百分位及小数点按照顺序显示。题目要求显示两位小数,用一译码门输出dp端控制小数点,dp高电平有效,使地址码为6处的dp 端始终为高电平。
扫描显示电路原理图如下:
仿真波形图如下:
5.总电路图如下:7
仿真波形图如下:
三、设计结论及感想
我们通过电路实现了汽车速度的显示,以一个适当频率的时钟信号模拟汽车车轮的的转速,通过单位转换电路,实现汽车速度以Km/h表示,最高时速小于360Km/h,并采取十秒采样,能够不断更新速度,我们使用5位数码管显示速度,并显示到小数点后边两位。
拿到这道题之后,我们都认为这道题很容易,我们查了一些资料后就开始做了,在我们快完成时,重新阅读题目,对比后发现我们的思路出现了问题,我们得重新设计,我们都瞬间觉得无从下手,通过查找资料、互相讨论,并向老师请教,重8 新确定模块。在这个过程中,我们遇到的最大困难是单位转换电路,我们一开始设计的是三十六分频电路,后来在老师的提醒下,我们发现分频不能解决问题,在苦思无果的情况下向老师请教,经过了老师的耐心指导和传教讲解,我们明白了许多,又有了新思路,我们重新设计,采用一种类倍频的方案,在输入一个汽车脉冲的同时,可以输出三十六个脉冲,实现了单位转换,解决了设计过程中最大的难题。在设计过程中有几次感觉快要成功了,就会发现新的问题,于是又开始新的探索,在思路局限,问题无法解决时,老师的一句点拨都会给设计带来新的灵感。由于与元件、连线较多,设计过程中一定要认真仔细。有时候,仿真波形图根本就不是我们所预想的,所以又要回过头来,重新修改电路图。还有就是在把各个模块组合时也会出现问题。
EDA课设很重要,我们希望以后可以更多的机会来实验室设计一些东西和接受老师的指导,在课设过程中,老师的指导必不可少。同时,我们感觉课设的时间有点短,如果时间多点的话,我们可以学到更多的知识。
最后我们很感谢这次课程设计带给我们的所有,感谢专业老师给我们的悉心指导,感谢能有这次机会能让我们的思考能力,创新能力还有动手能力得到锻炼,巩固已学知识。我们今9 后一定还会在其他课程设计中继续努力!
第二篇:EDA课程设计
考试序号:28
自动打铃系统设计说明书
学 生 姓 名:周文江
学
号:14112502521
专 业 班 级:1102
报告提交日期:2013.11.26
湖 南 理 工 学 院 物 电 学 院
目录
一、题目及要求简介……………3 1.设计题目…………………3 2.总体要求简介……………3
二、设计方案说明……………3
三、系统采用器件以及模块说明………3 1.系统框图…………4 2.选择的FPGA芯片及配置………4 3.系统端口和模块说明…………5
四、各部分仿真结果………5
五、调试及总结………6
六、参考文献……7
七、附录………7
一、题目及要求简介
1、设计题目
设计一个多功能自动打铃系统
2、总体要求简介
① 基本计时和显示功能(24小时制显示),包括:
1.24小时制显示 2.动态扫描显示; 3.显示格式:88-88-88 ② 能设置当前时间(含时、分)③ 能实现基本打铃功能,规定:
06:00起床铃,打铃5s
二、设计方案说明
本次设计主要采用Verilog HDL硬件描述性语言、分模块法设计的自动打铃系统。由于这次用的开发板提供的是50M晶振。首先要对时钟进行分频,当计时到2FA_F07F时完成1s分频,通过计时到60s产生分钟进位信号,再通过60分钟产生时钟进位信号。最后通过6个寄存器对时分秒进行锁存最终输出到8个数码管上完成显示。当显示时钟和默认闹钟时钟相等时,驱动打铃模块。通过key_mode,key_turn,key_change查看闹钟,时钟显示,调整时钟。
三、系统采用器件以及模块说明
1.系统框图如下:
:下如图框统系
2.选择的FPGA芯片及配置:本次系统设计采用的FPGA芯片是Alter公司生产的Cyclone II EP2C8Q208C8。该芯片是208个管脚,138个IO,并且具有两个内部PLL,而且内嵌乘法器,8K的逻辑门,资源相当丰富。完成这次自动打铃系统的设计总共消耗250个LE单元,22个IO口,131个寄存器。经过综合后,本系统最高能实现145M的运行速度。通过Quartus II 软件观察到内部的RTL图如下
3.系统端口和模块说明
(1)分频部分
分频器的作用是对50Mhz的系统时钟信号进行分频,得到频率为1hz的信号,即为1S的计时信号。
(2)按键部分
按键key_mode--0为显示计时,1为闹钟显示,2为调整时间。按键key_turn—0为调整小时,1为调整分钟。按键key_change—每按一次加1(3)计时部分
通过sec_L,sec_H,min_L,min_H,hour_L,hour_H 6个寄存器对时分秒进行锁存然后送入数码管显示
(4)闹钟模块
当设定的闹钟时间和数码管上显示的时间相等时驱动闹钟,完成打铃,持续时间5s。
(5)数码管显示模块
显示模块是由8个位选8个段选构成的显示模块,利用人眼的余晖效果完成动态扫描,显示时间。
四、各部分仿真结果
测试文件如下:
module clock_tb;reg sysclk,rst_b;reg key_mode,key_turn,key_change;wire buzzer;
wire [7:0] led_sel,led_data;clock I_clock(.sysclk(sysclk),.rst_b(rst_b),.key_mode(key_mode),.key_change(key_change),.key_turn(key_turn),.buzzer(buzzer),.led_sel(led_sel),.led_data(led_data));initial begin sysclk = 1'b1;rst_b = 1'b0;//复位信号
#30 rst_b = 1'b1;end always #10 sysclk = ~sysclk;//输入的系统时钟,20ns的周期 endmodule
五、调试及总结
本次课程设计总共花费了四天左右的时间,设计了自动打铃系统。通过这次的设计更加熟悉了对EDA技术的了解和认识,在中也发现许多不足的地方。使用了自顶而下的设计方法,使得设计更加的简单和明了。在调试过程中,有些代码的设计不规范性,导致时序相当缓慢,甚至编译综合都会报错。在不断的修改下,发现时序电路和组合逻辑最好分开写,这样便于查错,和修改代码。毕竟Verilog HDL语言不同于C语言,不能以软件的思想来设计,而是要利用电路的思想来编程,这样可以更好的节省资源,使得时序也比较的简单明了。在以后的学习及程序设计当中,我们一定要倍加小心,在程序出现不正常运行的情况下要耐心调试,尽量做到精益求精。
最后通过这次EDA方面的课程设计,提高了我们对EDA领域及通信电路设计领域的认识,有利于培养我们在通信电路EDA方面的设计能力。有利于锻炼我们独立分析问题和解决问题的能力。
六、文献参考
[1].王金明、左自强 编,《EDA技术与Verilog设计》科学出版社
2008.8 [2].杜慧敏、李宥谋、赵全良 编,《基于Verilog的FPGA设计基础》 西安电子科技大学出版社 2006.2 [3].韩彬 编,《从零开始走进FPGA世界》杭州无线电爱好者协会出版社 2011.8.20
七、附录(实物图及源码)
module clock(//Input
sysclk,rst_b,key_mode,key_change,key_turn,//Output
buzzer,led_sel,led_data);
input sysclk,rst_b;//sysclk--global system clock,rst_b--global reset signal input key_mode;//mode choose.0--Timing function.1--Alarm clock function.2--adjust function input key_turn;//choose adjust minute or hour input key_change;//count add 1 output buzzer;//device buzzer output [7:0] led_sel;//led tube bit choose
output [7:0] led_data;//led_tube 8 bit data choose
parameter init_hour = 8'h12;parameter init_min = 8'h59;parameter init_sec = 8'h50;//initial time :12:59:50 parameter init_alarm_hour = 8'h06;parameter init_alarm_min = 8'h30;//initial alarm time : 06:30:0 parameter Count_1s = 28'h2FA_F07F;//count time 1s;
reg [7:0] sec;reg [7:0] min;reg [7:0] hour;reg [3:0] min_L;//minute low 4 bit reg [3:0] min_H;//minute high 4 bit reg [3:0] hour_L;//hour low 4 bit reg [3:0] hour_H;//hour high 4 bit reg [23:0] key_time;//press key away shake reg key_mode_n;//press key_mode next state reg key_change_n;//press key_change next state reg key_turn_n;//press key_turn next state wire key_mode_press;//sure Button press key_mode wire key_turn_press;//sure button press key_turn wire key_change_press;//sure button press key_change
always @(posedge sysclk)key_mode_n <= key_mode;assign key_mode_press =(!key_mode)&&(key_mode_n);always @(posedge sysclk)key_turn_n <= key_turn;assign key_turn_press =(!key_turn)&&(key_turn_n);always @(posedge sysclk)key_change_n <= key_change;assign key_change_press =(!key_change)&&(key_change_n);
always @(posedge sysclk or negedge rst_b)begin if(!rst_b)key_time <= 24'h0;else if(key_time!= 24'h0)
key_time <= key_time + 24'h1;else if((key_time == 24'h0)&&(key_mode_press || key_change_press || key_turn_press))key_time <= key_time + 24'h1;
end
reg [1:0] mode_num;//key mode..0--Timing function.1--Alarm clock function.2--adjust function always @(posedge sysclk or negedge rst_b)begin if(!rst_b)mode_num <= 2'b00;else if(mode_num == 2'h3)mode_num <= 2'h0;else if(key_mode_press &&(key_time == 24'h0))
mode_num <= mode_num + 2'h1;end
always @(*)begin if(mode_num == 2'h1)begin
min = init_alarm_min;hour = init_alarm_hour;end else begin
min = {min_H,min_L};hour = {hour_H,hour_L};end end
reg fm;//choose turn hour or minute always @(posedge sysclk or negedge rst_b)begin if(!rst_b)fm <= 1'b0;else if(key_turn_press &&(mode_num == 2'h2)&&(key_time == 24'h0))
fm <= ~fm;end
reg [27:0] time_cnt;///count time reg [27:0] time_cnt_n;//count time next state always @(posedge sysclk or negedge rst_b)begin if(!rst_b)time_cnt <= 28'h0;else time_cnt <= time_cnt_n;end
always @(*)begin if(time_cnt == Count_1s)time_cnt_n <= 28'h0;else if(mode_num!= 2'h0)time_cnt_n <= time_cnt;else time_cnt_n <= time_cnt + 28'h1;end
reg [3:0] sec_L;//second low 4 bit reg [3:0] sec_H;//second high 4 bit wire sec_cb;//second carry bit signal assign sec_cb =(sec_L == 4'h9)&&(sec_H == 4'h5);always @(posedge sysclk or negedge rst_b)begin if(!rst_b)begin
sec_L <= init_sec[3:0];sec_H <= init_sec[7:4];end else if((sec_L == 4'h9)&&(sec_H!= 4'h5)&&(time_cnt == Count_1s))begin
sec_L <= 4'h0;sec_H <= sec_H + 4'h1;end else if(sec_cb &&(time_cnt == Count_1s))begin
sec_L <= 4'h0;sec_H <= 4'h0;end else if(time_cnt == Count_1s)
sec_L <= sec_L + 4'h1;end
wire min_cb;//minute carry bit signal assign min_cb =(min_L == 4'h9)&&(min_H == 4'h5);always @(posedge sysclk or negedge rst_b)begin if(!rst_b)begin
min_L <= init_min[3:0];min_H <= init_min[7:4];end else if((sec_cb)&&(min_L!=4'h9)&&(time_cnt == Count_1s))
min_L <= min_L + 4'h1;else if((sec_cb)&&(min_L == 4'h9)&&(min_H!= 4'h5)&&(time_cnt == Count_1s))begin
min_L <= 4'h0;min_H <= min_H + 4'h1;end else if((sec_cb)&&(min_cb)&&(time_cnt == Count_1s))begin
min_L <= 4'h0;min_H <= 4'h0;end else if((fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(min_L!= 4'h9))
min_L = min_L + 4'h1;else if((fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time ==
24'h0)&&(min_L == 4'h9)&&(min_H!=4'h5))begin
min_L = 4'h0;min_H = min_H + 4'h1;end else if((fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(min_L == 4'h9)&&(min_H ==4'h5))begin
min_L = 4'h0;min_H = 4'h0;end end
always @(posedge sysclk or negedge rst_b)begin if(!rst_b)begin
hour_L <= init_hour[3:0];hour_H <= init_hour[7:4];end else if((sec_cb)&&(min_cb)&&(hour_L!= 4'h9)&&(hour_H!= 4'h2)&&(time_cnt == Count_1s))
hour_L <= hour_L + 4'h1;else if((sec_cb)&&(min_cb)&&(hour_L!= 4'h3)&&(hour_H == 4'h2)&&(time_cnt == Count_1s))
hour_L <= hour_L + 4'h1;else if((sec_cb)&&(min_cb)&&(hour_L == 4'h9)&&(hour_H!= 4'h2)&&(time_cnt == Count_1s))begin
hour_L <= 4'h0;hour_H <= hour_H + 4'h1;end else if((sec_cb)&&(min_cb)&&(hour_L == 4'h3)&&(hour_H == 4'h2)&&(time_cnt == Count_1s))begin
hour_L <= 4'h0;hour_H <= 4'h0;end else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(hour_L!= 4'h9)&&(hour_H!=4'h2))
hour_L <= hour_L + 4'h1;else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(hour_L!= 4'h3)&&(hour_H ==4'h2))
hour_L <= hour_L + 4'h1;else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(hour_L == 4'h9)&&(hour_H!=4'h2))begin
hour_L <= 4'h0;hour_H <= hour_H + 4'h1;end else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time ==
24'h0)&&(hour_L == 4'h3)&&(hour_H ==4'h2))begin
hour_L <= 4'h0;hour_H <= 4'h0;end end
wire buzzer_en;assign buzzer_en =(init_alarm_min == {min_H,min_L})&&(init_alarm_hour == {hour_H,hour_L});
led_tube I_led_tube(.sysclk(sysclk),.rst_b(rst_b),.scan_time(24'h1F090),.data0({1'h1,sec_L}),.data1({1'h1,sec_H}),.data2({1'h1,4'hA}),.data3({1'h1,min[3:0]}),.data4({1'h1,min[7:4]}),.data5({1'h1,4'hA}),.data6({1'h1,hour[3:0]}),.data7({1'h1,hour[7:4]}),.led_data(led_data),.led_sel(led_sel));buzzer I_buzzer(.sysclk(sysclk),.rst_b(rst_b),.buzzer_en(buzzer_en),.buzzer(buzzer));endmodule
第三篇:EDA 课程设计
《电子系统设计自动化》课程设计报告
学 院: 机电工程学院
题 目: 数字时钟电路设计 课 程: 《电子系统设计自动化》课程设计 专业班级: 电信10级2 班 学生姓名: 刘星 秦玉杰 王艳艳 学 号: 1004101035 1004101036 1004101038
完成日期:2013年 12 月 27 日
摘要:
EDA(Electronic Design Automation)电子设计自动化,就是以大规模可编程器件为设计载体,以硬件描述语言为系统逻辑描述的主要表达方式,通过相关的软件,自动完成用软件方式设计的电子系统到硬件系统,最终形成集成电子系统或专用集成芯片。本次实习利用QuartusII为设计软件、VHDL为硬件描述语言,结合所学的数字电路的知识设计一个24时多功能数字钟,具有正常时、分、秒计时,动态显示,清零、快速校时校分、整点报时、花样显示等功能。利用硬件描述语言VHDL对设计系统的各个子模块进行逻辑描述,采用模块化的设计思想完成顶层模块的设计,通过软件编译、逻辑化简、逻辑分割、逻辑综合优化、逻辑布线、逻辑仿真,最终将设计的软件系统下载设计实验系统,对设计的系统进行硬件测试。
一、课程设计基本要求和任务
《EDA课程设计》是继《模拟电子技术基础》、《数字电子技术基础》课程后,电信专业学生在电子技术实验技能方面综合性质的实验训练课程,是电子技术基础的一个部分。1.1 目的和任务
(1)通过课程设计使学生能熟练掌握一种EDA软件(QUARTUSII)的使用方法,能熟练进行设计输入、编译、管脚分配、下载等过程,为以后进行工程实际问题的研究打下设计基础。
(2)通过课程设计使学生能利用EDA软件(QUARTUSII)进行至少一 个电子技术综合问题的设计,设计输入可采用图形输入法或VHDL硬件描述语言输入法。(3)通过课程设计使学生初步具有分析、寻找和排除电子电路中常见 故障的能力。
(4)通过课程设计使学生能独立写出严谨的、有理论根据的、实事求是的、文理通顺的字迹端正的课程设计报告。1.2 功能要求:
(1)具有时、分、秒计数显示功能,以24小时循环计时。(2)时钟计数显示时有LED灯的花样显示。(3)具有调节小时、分钟、秒及清零的功能。(4)具有整点报时功能。
1.3 总体方框图:
本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。显示:小时采用24进制,而分钟均是采用6进制和10进制的组合。1.4 设计原理:
数字钟电路设计要求所设计电路就有以下功能:时、分、秒计时显示,清零,时、分调节,整点报时及花样显示。分、秒计时原理相似,可以采用60进制BCD码计数器进计时;小时采用24进制BCD码进行计时;在设计时采用试验电路箱上的模式7电路,不需要进行译码电路的设计;所设计电路具有驱动扬声器和花样显示的LED灯信号产生。试验箱模式7的电路如图一所示:图一模式七实验电路图
1.5 性能指标及功能设计:
(1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2.2 模块划分自顶向下分解
2.3 模块描述
时钟计时模块完成时、分、秒计数,及清零、调节时和分钟的功能。时、分、秒计数的原理相同,均为BCD码输出的计数器,其中分和秒均为六十进制BCD码计数器,小时为二十四进制BCD码计数器。设计一个具有异步清零和设置输出功能的六十进制BCD码计数器,再设计一个具有异步清零和设置输出功能的二十四进制计数器,然后将它们通过一定的组合构成时钟计时模块。各个输入/输出端口的作用为:
(1)clk为计时时钟信号,reset为异步清零信号;
(2)sethour为小时设置信号,setmin为分钟设置信号;(3)daout[5„0]为小时的BCD码输出, daout[6...0]为秒和分钟的BCD码输出,enmin和enhour为使能输出信号。
(4)在时钟整点的时候产生扬声器驱动信号和花样显示信号。由时钟计时模块中分钟的进行信号进行控制。当contr_en为高电平时,将输入信号clk送到输出端speak用于驱动扬声器,同时在clk的控制下,输出端lamp[2..0]进行循环移位,从而控制LED灯进行花样显示。输出控制模块有扬声器控制器和花样显示控制器两个子模块组成 2.4 顶层电路图
顶层文件是由四个模块组成,分别是时、分、秒计数器和报警的VHDL语言封装而成。经过锁定引脚再重新编译获得如下顶层原理电路图:
三、方案实现
3.1 各模块仿真及描述
(1)秒计数器模块仿真图:将标准秒信号送入”秒计数器”,秒计数器采用60进制计数器,每累计60秒发出一个分脉冲信号,该信号将作为分计数器的时钟脉冲,daout代表秒输出。
(2)分计数器电路仿真图:也采用60进制计数器,每累计60分钟,发出一个时脉冲信号,该信号将被送到时计数器,daout端口代表分钟输出
(3)小时计数器电路仿真图:时计数器采用12进制计时器,可实现对24小时累 计。每累计12小时,发出一个脉冲信号。
引脚配置完成后再进行一次全程编译,无误则可以下载到试验箱上进行硬件测试。硬件验证的方法如下:选择实验模式7;时钟脉冲clk与clock0(1024Hz)信号相连;键8和键5均为低电平,时钟正常计时,数码管1和2显示秒,数码管4和5显示分钟,数码管7和8显示小时;键8为高电平时,时钟清零;键5为高电平时,按下键7和键4进行调时调分操作;当时钟为整点的时候,三个发光二极管进行循环移位操作,同时扬声器发声。
五、心得体会
经过源程序的编辑、逻辑综合、逻辑适配、编程下载成功后,在EDA实验开发系统进行硬件验证时却发现实验结果不正确,扬声器无法发声。经检查,自己设计的管脚文件有错。将管脚锁定文件修改后,重新进行逻辑适配、编程下载成功后,实验结果仍然不正确,百思不得其解。无奈之下,决定重头开始排查每一步的细节,确定各个模块的功能完全实现并且顶层模块功能正确。修改之后,重新进行逻辑适配、编程下载验证,实验结果完全正确。
这次EDA课程设计历时两个星期,在整整两个星期的日子里,不仅巩固了以前所学过的知识,而且学到了很多书本上学不到的知识,同时锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,对未来有了更多的信心。这次课程设计,进一步加深了我对EDA的了解,使我对QuartusII的基本操作有所了解,使我对应用软件的方法设计硬件系统有了更加浓厚的兴趣。通过这次课程设计,我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合,从实践中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。在设计的过程中,我遇到许多问题,毕竟是第一次应用VHDL进行硬件电路系统的设计,许多EDA的知识还没有充分的掌握,遇到困难也是在所难免的,同时发现了自己的不足之处:学习知识表面化,没有深入了解它们的原理。总的来说,这次设计的数字时钟电路还是比较成功的,尽管在设计中遇到了很多问题,最后在老师的辛勤指导、同学的帮助和自己不断思考下,终于迎刃而解,有点小小的成就感,觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。最后,对给过我帮助的所有同学和指导老师再次表示忠心的感谢!
参考文献
[1] 崔健明.《电子电工EDA仿真技术》 高等教育出版社 2000年 [2] 卢杰,赖毅.《VHDL与数字电路设计》 科学出版社 2001年 [3] 潘松,黄继业.《EDA技术实用教程》 科学出版社 2002年 [4] 朱运利.《EDA技术应用》 电子工业出版社 2004年 [5] 张明.《VHDL实用教程》 电子科技大学出版社 1999年
[6] 彭介华.《电子技术课程设计与指导》 高等教育出版 1997年
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY minute IS PORT(clk,clk1,reset,sethour:IN STD_LOGIC;enhour:OUT STD_LOGIC;daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));END ENTITY minute;ARCHITECTURE fun OF minute IS SIGNAL count :STD_LOGIC_VECTOR(6 DOWNTO 0);SIGNAL enhour_1, enhour_2: STD_LOGIC;--enmin_1为59分时的进位信号 BEGIN--enmin_2由clk调制后的手动调时脉冲信号串 daout<=count;enhour_2<=(sethour and clk1);--sethour为手动调时控制信号,高电平有效 enhour<=(enhour_1 or enhour_2);PROCESS(clk,reset,sethour)BEGIN IF(reset='0')THEN--若reset为0,则异步清零 count<=“0000000”;ELSIF(clk'event and clk='1')THEN--否则,若clk上升沿到 IF(count(3 DOWNTO 0)=“1001”)THEN--若个位计时恰好到“1001”即9 IF(count <16#60#)THEN--又若count小于16#60#,即60 IF(count=“1011001”)THEN--又若已到59D enhour_1<='1';--则置进位为1 count<=“0000000”;--count复0 ELSE count<=count+7;--若count未到59D,则加7,即作“加6校正” END IF;--使前面的16#60#的个位转变为8421BCD的容量 ELSE count<=“0000000”;--count复0(有此句,则对无效状态电路可自启动)END IF;--END IF(count<16#60#)ELSIF(count <16#60#)THEN count<=count+1;--若count<16#60#则count加1 enhour_1<='0' after 100 ns;--没有发生进位 ELSE count<=“0000000”;--否则,若count不小于16#60# count复0 END IF;--END IF(count(3 DOWNTO 0)=“1001”)END IF;--END IF(reset='0')END process;END fun;
3、时计数器模块的VHDL语言:
LIBRARY IEEE;use IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;
IF(clk'event and clk='1')THEN IF(dain=“0000000”)THEN speak<=count1(1);IF(count1>=“10”)THEN count1<=“00”;--count1为三进制加法计数器 ELSE count1<=count1+1;END IF;END IF;END IF;END PROCESS speaker;lamper:PROCESS(clk)BEGIN IF(rising_edge(clk))THEN IF(count<=“10”)THEN IF(count=“00”)THEN lamp<=“001”;--ELSIF(count=“01”)THEN lamp<=“010”;ELSIF(count=“10”)THEN lamp<=“100”;END IF;count<=count+1;ELSE count<=“00”;END IF;END IF;END PROCESS lamper;END fun;
循环点亮三只灯
第四篇:《EDA课程设计》
《EDA课程设计》
课程设计题目:
基于单片机的温湿度采集系统
姓
名:
xxx
学
班
时
地
号:
xxxx
级:
xxxx
间:
2014.4.21~ 2013.5.5
点:
xxxxx
指 导
老
师:
xxxxx
目录
一、电路原理图..................................................................................2
二、电路PCB图(或实物图).........................................................2
三、电路效果图..................................................................................3
四、设计总结......................................................................................3 附录(单片机源代码)......................................................................4
一、电路原理图
二、电路PCB图(或实物图)
三、电路效果图
四、设计总结
EDA的实验还是挺有趣的,比较讲究动手能力,当然也不能忽略团体合作。总的来说本次实验还是成功了,虽然每个环节都遇到了困难。在生成原理图的过程中,就曾把导线画成了Placeline而不是Placewire,还有芯片的引脚应该用NET符号而不是用文本符号,所以这些错误都导致我花在原理图上的时间多了点。而在生成PCB电路图的过程中遇到的困难则是自动布线之后,还有电源的几个脚需要手动布线,所以各个元件之间的位置要布置好,以免发生短路。腐蚀的时候,由于腐蚀的时间太长了,有些碳都化开了,导致里面的铜被腐蚀掉了,所以又为我的工作增加了困难。在焊接的时候,要注意元件的正负极,还要检测锡是否都与那些铜连接上了。最终把LED和 DHT11的程序烧进去就行了。
本次实验我还是能多多少少学到点什么的,总的来说还是希望能有多一点这样的实习。
附录(单片机源代码)
//51单片机控制温湿度传感器DHT11
LCD1602上显示当前机最小系统。//LCD 读进去 写出来 #include
//定义无符号整型 #define uchar unsigned char typedef bit BOOL;
//此声明一个布尔型变量即真或假// uchar data_byte,num,i;uchar RH,RL,TH,TL,flag;uchar shuzi[4];unsigned char code num1[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
sbit dht=P2^4;
//dht11data端接单片机的P2^4口//
//***************
延
时
函
数************************************* void delay(uchar ms)//延时模块//延时1毫秒
{
}
void delay1()
//一个for循环大概需要8个多机器周期
//一个机器周期为1us晶振为12MHz也就是说本函数延时8us{
} uchar i;
while(ms--)
for(i=0;i<110;i++);
uchar i;
for(i=0;i<1;i++);void display(void){ // if(flag==0)// {
P2=0x07;
P0=num1[shuzi[2]];delay(1);// }
// if(flag==1)// {
P2=0x0b;
P0=num1[shuzi[3]];delay(1);// } // if(flag==2)// {
P2=0x0d;
P0=num1[shuzi[0]];delay(1);// } // if(flag==3)// {
P2=0x0e;P0=num1[shuzi[1]];delay(1);// } }
//**************************dht11
测
试
某
块*************************************// void start()//开始信号
{
dht=1;
delay1();
//主机发出8us高电平,开始信号开始发出 dht=0;
delay(25);
// 主机把总线拉低必须大于18ms
DHT11能检测到起始信号
dht=1;
//delay1();
//以下三个延时函数差不多为24usdelay1();delay1();
20-40us
}
uchar receive_byte()
//接收一个字节 8位// {
uchar i,temp;
for(i=0;i<8;i++)//接收8bit的数据
{
while(!dht);
//等待40-50us的低电平开始信号结束
delay1();
//开始信号结束之后延时26us-28us
delay1();delay1();
temp=0;
//时间为26us-28usif(dht==1)
temp=1;
//如果26us-28us
'0'
数据为'1'
while(dht);
//
'0'为26us-28us
'1'为70us
} data_byte<<=1;
//data_byte|=temp;
//接收每一位的数据,相或保存数据
return data_byte;}
void receive()//接收数据// {
uchar T_H,T_L,R_H,R_L,check,num_check,i;start();
//开始信号//调用开始信号子函数
dht=1;
//主机设为输入判断从机DHT11响应信号
if(!dht)
//判断从机是否有低电平响应信号// {
while(!dht);//判断从机发出 40us 的低电平响应信号是否结束//
while(dht);
//判断从机发出 40us 的高电平是否结束 如结束则从机进入发送数据状态,主机进入数据接收状态
数
//两个while语句加起来就是DHT11的响应信号
R_H=receive_byte();//湿度高位
调用接受一个字节的子函
R_L=receive_byte();//湿度低位
T_H=receive_byte();//温度高位
T_L=receive_byte();//温度低位
check=receive_byte();//校验位
//结束信号
dht=0;
//当最后一bit数据接完毕后主机拉低电平50us// for(i=0;i<7;i++)//差不多8us的延时
delay1();
dht=1;
//总线由上拉电阻拉高进入空闲状态
num_check=R_H+R_L+T_H+T_L;
if(num_check==check)//判断读到的四个数据之和是否与校验位相同
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
check=num_check;}
shuzi[0]=RH/10;shuzi[1]=RH%10;shuzi[2]=TH/10;shuzi[3]=TH%10;
} }
void main()//主函数模块// { while(1)
//进入死循环
{
receive();
//接收数据
display();
} }
第五篇:eda课程设计
数字钟
一、设计要求
设计一个数字钟,具体要求如下:
1、具有时、分、秒计数显示功能,以24小时循环计时。
2、具有清零、校时、校分功能。
3、具有整点蜂鸣器报时以及LED花样显示功能。
二、设计方案
根据设计要求,数字钟的结构如图8-3所示,包括:时hour、分minute、秒second计数模块,显示控制模块sel_clock,七段译码模块deled,报时模块alert。
三、VHDL程序
library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;
----Uncomment the following library declaration if instantiating----any Xilinx primitives in this code.--library UNISIM;
--use UNISIM.VComponents.all;
entityddz is port(rst,clk: in std_logic;hour_h: out std_logic_vector(6 downto 0);hour_l: out std_logic_vector(6 downto 0);min_h: out std_logic_vector(6 downto 0);
min_l: out std_logic_vector(6 downto 0);
sec_h: out std_logic_vector(6 downto 0);
sec_l: out std_logic_vector(6 downto 0));endddz;
architecture Behavioral of ddz is signalcnt: std_logic_vector(15 downto 0);signalsec_h_in: std_logic_vector(3 downto 0);signalsec_l_in: std_logic_vector(3 downto 0);signalmin_h_in: std_logic_vector(3 downto 0);signalmin_l_in: std_logic_vector(3 downto 0);signalhour_h_in: std_logic_vector(3 downto 0);signalhour_l_in: std_logic_vector(3 downto 0);
signalclk_s,clk_m,clk_h: std_logic;begin process(rst,clk)begin if rst='0' then
sec_h_in<=(others=>'0');
sec_l_in<=(others=>'0');
clk_m<='1';elsifclk'event and clk='1' then ifsec_l_in=9 then
sec_l_in<=“0000”;
ifsec_h_in=5 then
sec_h_in<=“0000”;
clk_m<='0';
else
sec_h_in<=sec_h_in+1;
clk_m<='1';
end if;else sec_l_in<=sec_l_in+1;
clk_m<='1';
end if;end if;end process;
process(rst,clk_m)begin if rst='0' then
--min_h_in<=(others=>'0');
min_l_in<=(others=>'0');--clk_h<='1';elsifclk_m'event and clk_m='1' then ifmin_l_in=9 then
min_l_in<=“0000”;ifmin_h_in=5 then
min_h_in<=“0000”;else min_h_in<=min_h_in+1;
clk_m<='1';
end if;else min_l_in<=min_l_in+1;
end if;end if;end process;
process(rst,clk_n)begin if rst='0' then
--hour_h_in<=(others=>'0');
hour_l_in<=(others=>'0');--clk_h<='1';elsifclk_m'event and clk_n='1' then ifhour_l_in=3 then
hour_l_in<=“0000”;ifmin_h_in=2 then
hour_h_in<=“0000”;else hour_h_in<=hour_h_in+1;
clk_n<='1';
end if;else hour_l_in<=hour_l_in+1;
end if;end if;end process;
process(sec_l_in)begin casesec_l_in is
when “0000” =>sec_l<=“0000001”;when “0001” =>sec_l<=“1001111”;when “0010” =>sec_l<=“0010010”;when “0011” =>sec_l<=“0000110”;when “0100” =>sec_l<=“1001100”;when “0101” =>sec_l<=“0100100”;when “0110” =>sec_l<=“0100000”;when “0111” =>sec_l<=“0001111”;when “1000” =>sec_l<=“0000000”;when “1001” =>sec_l<=“0000100”;when others =>sec_l<=“1111111”;end case;end process;
process(sec_h_in)begin casesec_h_in is
when “0000” =>sec_h<=“0000001”;when “0001” =>sec_h<=“1001111”;when “0010” =>sec_h<=“0010010”;when “0011” =>sec_h<=“0000110”;when “0100” =>sec_h<=“1001100”;when “0101” =>sec_h<=“0100100”;when “0110” =>sec_h<=“0100000”;when “0111” =>sec_h<=“0001111”;when “1000” =>sec_h<=“0000000”;when “1001” =>sec_h<=“0000100”;when others =>sec_h<=“1111111”;end case;end process;
process(min_l_in)begin casemin_l_in is
when “0000” =>min_l<=“0000001”;when “0001” =>min_l<=“1001111”;when “0010” =>min_l<=“0010010”;
when “0011” =>min_l<=“0000110”;when “0100” =>min_l<=“1001100”;when “0101” =>min_l<=“0100100”;when “0110” =>min_l<=“0100000”;when “0111” =>min_l<=“0001111”;when “1000” =>min_l<=“0000000”;when “1001” =>min_l<=“0000100”;when others =>min_l<=“1111111”;end case;end process;
process(min_h_in)begin casemin_h_in is
when “0000” =>min_h<=“0000001”;when “0001” =>min _h<=“1001111”;when “0010” => min _h<=“0010010”;when “0011” =>min _h<=“0000110”;when “0100” =>min _h<=“1001100”;when “0101” => min _h<=“0100100”;when “0110” =>min _h<=“0100000”;when “0111” =>min _h<=“0001111”;when “1000” =>min _h<=“0000000”;when “1001” =>min _h<=“0000100”;when others =>min _h<=“1111111”;
end case;end process;
process(hour_l_in)begin casehour_l_in is
when “0000” =>hour_l<=“0000001”;when “0001” =>hour_l<=“1001111”;when “0010” =>hour_l<=“0010010”;when “0011” =>hour_l<=“0000110”;when “0100” =>hour_l<=“1001100”;when “0101” =>hour_l<=“0100100”;when “0110” =>hour_l<=“0100000”;when “0111” =>hour_l<=“0001111”;when “1000” =>hour_l<=“0000000”;when “1001” =>hour_l<=“0000100”;when others =>hour_l<=“1111111”;end case;end process;
process(hour_h_in)begin casehour_h_in is
when “0000” =>hour_h<=“0000001”;when “0001” =>hour_h<=“1001111”;when “0010” =>hour_h<=“0010010”;when “0011” =>hour_h<=“0000110”;when “0100” => hour _h<=“1001100”;when “0101” => hour _h<=“0100100”;when “0110” => hour _h<=“0100000”;when “0111” => hour _h<=“0001111”;when “1000” => hour _h<=“0000000”;when “1001” =>hour_h<=“0000100”;when others => hour _h<=“1111111”;end case;end process;end Behavioral;
四、VHDL仿真结果
五、课程设计心得
通过这次课程设计,有效得巩固了课本所学的知识,而且通过上机仿真不断发现问题并及时改正,加深了我们对该课程设计的印象。这次课程设计,进一步加深了我对EDA的了解,使我对isp有了更深的了解,使我对应用软件的方法设计硬件系统有了更加浓厚的兴趣。除此之外,我懂得了理论与实际相结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合,从实践中得出结论,才能真正提高自己的实际动手能力和独立思考的能力。
总之,这次课程设计让我学会了很多,对今后的生活工作用处也颇深。