EDA课程设计zmt.docx
- 文档编号:15029300
- 上传时间:2023-06-29
- 格式:DOCX
- 页数:17
- 大小:145.79KB
EDA课程设计zmt.docx
《EDA课程设计zmt.docx》由会员分享,可在线阅读,更多相关《EDA课程设计zmt.docx(17页珍藏版)》请在冰点文库上搜索。
EDA课程设计zmt
课程设计
EDA技术与
VHDL语言
课程设计报告
班级:
电信09-1
姓名:
张茂腾
学号:
0906110125
指导教师:
张沛泓
成绩:
电子与信息工程学院
1.设计题目与要求
功能:
实现数字信号的频率测量与显示,频率最高为4位。
输入信号:
时钟信号clk(10kHz),被测信号,复位信号reset(高电平有效)
输出信号:
频率的LED数码管(共阴极)显示码(静态显示方式)
要求:
系统由计数器(被测信号的半个周期时钟上升沿的个数)、计算单元(计算被测信号的频率值)、显示码译码器(将频率的BCD码转换成LED显示码)。
要求给出系统总体组成框图,设计思路,完成以上模块的VHDL实现及功能仿真,顶层文件及整体仿真。
1.2系统设计方案
根据系统设计要求,需要实现一个4位十进制数字频率计,其原理框图如图1所示。
图1-1数字频率计组成原理框图
由于是4位十进制数字频率计,所以计数器CNT10需用4个,7段显示译码器也需用4个。
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。
为此,测频控制信号发生器F_IN_CNT应设置一个控制信号时钟CLK,一个计数使能信号输出端EN、一个与EN输出信号反向的锁存输出信号LOCK和清零输出信号CLR。
若CLK的输入频率为1HZ,则输出信号端EN输出一个脉宽恰好为1秒的周期信号,可以作为闸门信号用。
由它对频率计的每一个计数器的使能端进行同步控制。
当EN高电平时允许计数,低电平时停止计数,并保持所计的数。
在停止计数期间,锁存信号LOCK的上跳沿将计数器在前1秒钟的计数值锁存进4位锁存器LOCK,由7段译码器译出并稳定显示。
设置锁存器的好处是:
显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
锁存信号之后,清零信号CLR对计数器进行清零,为下1秒钟的计数操作作准备。
1.3单元电路设计:
1.3.1时基产生与测频时序控制电路模块
时基产生与测频时序控制电路主要产生计数允许信号EN、清零信号CLR和锁存信号LOCK。
时基产生电路:
图2-2时基产生模块顶层图
其VHDL程序清单如下:
--CLK_SX_CTRL
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCLK_SX_CTRLIS
PORT(CLK:
INSTD_LOGIC;
LOCK:
OUTSTD_LOGIC;
EN:
OUTSTD_LOGIC;
CLR:
OUTSTD_LOGIC);
END;
ARCHITECTUREARTOFCLK_SX_CTRLIS
SIGNALQ:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IFQ="1111"THEN
Q<="0000";
ELSE
Q<=Q+'1';
ENDIF;
ENDIF;
EN<=NOTQ(3);
LOCK<=Q(3)ANDNOT(Q
(2))ANDQ
(1);
CLR<=Q(3)ANDQ
(2)ANDNOT(Q
(1));
ENDPROCESS;
ENDART;
测频时序控制电路:
为实现系统功能,控制电路模块需输出三个信号:
一是控制计数器允许对被测信号计数的信号EN;二是将前一秒计数器的计数值存入锁存的锁存信号LOCK;三是为下一个周期计数做准备的计数器清零信号CLR。
上述三个信号产生的顺序是:
先提供计数信号,这种信号使计数器在1s提供锁存信号,这种信号对计数值进行锁存;最后是发出清零信号,这种信号可对计数器清零。
计数器清零结束后又可重新计数,计数进入第二个周期。
不难看出,控制电路模块实际上就是一个控制器,它需要一个周期为1s的信号作为产生并控制控制器输出的时基信号CLK0。
控制电路模块中控制器及端口如图3所示:
图3测频时序控制模块顶层图
其VHDL程序清单如下:
--F_IN_CNT.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYF_IN_CNTIS
PORT(CLK:
INSTD_LOGIC;
EN:
INSTD_LOGIC;
CLR:
INSTD_LOGIC;
QA,QB,QC,QD:
BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));
ENDF_IN_CNT;
ARCHITECTUREARTOFF_IN_CNTIS
COMPONENTCNT10
PORT(CLK,EN,CLR:
INSTD_LOGIC;
COUNT10:
BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCOMPONENT;
SIGNALS2:
STD_LOGIC;
SIGNALS3:
STD_LOGIC;
SIGNALS4:
STD_LOGIC;
BEGIN
S2<=NOTQA(3);
S3<=NOTQB(3);
S4<=NOTQC(3);
U1:
CNT10PORTMAP(CLK,EN,CLR,QA);
U2:
CNT10PORTMAP(S2,EN,CLR,QB);
U3:
CNT10PORTMAP(S3,EN,CLR,QC);
U4:
CNT10PORTMAP(S4,EN,CLR,QD);
ENDART;
2.待测信号脉冲计数电路模块
待测信号脉冲信号脉冲计数电路是对待测脉冲信号的频率进行测量,它可由4个十进制加法计数器组成,其中EN为计数选通控制信号,CLR为计数器清零信号。
在计数器清零信号CLR清零后,当计数选通控制信号EN有效时,开始对待测信号进行计数。
如果计数选通控制信号EN的宽度为1s,那么计数结果就为待测信号的频率;如果计数选通控制信号EN的宽度为100ms,那么待测信号的频率等于计数结果的10倍。
该模块将对输入信号进行十进制计数。
它虽然由多个十进制计数器组成,但采用CPLD后,设计时只要先制作一个单个的十进制计数器,然后再将多个结构相同的单个十进制计数器在CPLD内部进行连接就可组合成为一个完整的计数电路模块。
为实现系统功能,十进制计数器需要设置三个输入端:
即被测信号输入端CLK、计数器状态清零端CLR和计数器工作使能端EN。
需要设置四个输出端,即COUNT0、COUNT1、COUNT2和COUNT3,并由这四个输出端输出四位BCD码来表示十进制数。
需要说明,上述十进制计数器都是满10进1,且进位时计数器清零并重新计数。
计数电路模块中的单个计数器符号及端口功能如图4所示:
图4待测信号脉冲计数模块顶层图
其VHDL程序清单如下:
--CNT10.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCNT10IS
PORT(CLK,EN,CLR:
INSTD_LOGIC;
COUNT10:
BUFFERSTD_LOGIC_VECTOR(3DOWNTO0));
ENDCNT10;
ARCHITECTUREONEOFCNT10IS
BEGIN
PROCESS(CLK,CLR,EN)
BEGIN
IFCLR='1'THEN
COUNT10<="0000";
ELSIF(CLK'EVENTANDCLK='1')THEN
IF(EN='1')THEN
IFCOUNT10="1001"THEN
COUNT10<="0000";
ELSE
COUNT10<=COUNT10+'1';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDONE;
3.锁存与译码显示控制电路模块
锁存与译码显示控制电路用于实现记忆显示,在测量过程中不刷新新的数据,直到测量过程结束后,锁存显示测量结果,并且保存到下一次测量结束。
其功能是对四位BCD码进行锁存并且转换成为对应的4组七段码,用于驱动数码管。
锁存电路模块
该模块可使系统显示电路的工作稳定而可靠,避免计数电路模块清零时引起显示闪烁的现象。
锁存电路模块是由多个锁存器组成。
每个锁存器都是用来锁存与其单独相连的计数器的输出数据。
由于每个锁存器锁存的都是4位2进代码表示的十进制数,其功能完全相同,因此只需要设计制作一个锁存器就可连接组合成一个锁存电路模块。
为实现系统功能,锁存器需设置四个数据输入端:
即QA、QB、QC和QD,并由它们输入计数器的计数值。
需设置一个使锁存器工作的使能端L0CK。
还需设置四个锁存数据的输出端:
即LEDA、LEDB、LEDC和LEDD。
锁存电路模块中单个锁存器的符号及端口功能如图5所示。
图54位锁存模块顶层图
其VHDL程序清单如下:
--LOCK.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYLOCKIS
PORT(LOCK:
INSTD_LOGIC;
QA,QB,QC,QD:
INSTD_LOGIC_VECTOR(3DOWNTO0);
LEDA,LEDB,LEDC,LEDD:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
END;
ARCHITECTUREARTOFLOCKIS
SIGNALL0,L1,L2,L3:
STD_LOGIC_VECTOR(3DOWNTO0);
COMPONENTSEG7
PORT(BCD:
INSTD_LOGIC_VECTOR(3DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDCOMPONENT;
BEGIN
PROCESS(LOCK)
BEGIN
IF(LOCK'EVENTANDLOCK='1')THEN
L0<=QA;
L1<=QB;
L2<=QC;
L3<=QD;
ENDIF;
ENDPROCESS;
U0:
SEG7PORTMAP(L0,LEDA);
U1:
SEG7PORTMAP(L1,LEDB);
U2:
SEG7PORTMAP(L2,LEDC);
U3:
SEG7PORTMAP(L3,LEDD);
ENDART;
译码电路模块:
该模块可对表示转换后的十进制数的4位2进制代码进行编码,此模块可直接连接数码管驱动器,从而驱动数码管显示出相应阿拉伯数字等字符。
与上述电路模块设计一样,它也只需要先设计一个单个的译码器,然后通过连接组合就可构成系统的译码电路模块,从而实现系统的译码功能。
为实现系统的功能,单个译码器需要设置4个数据输入端:
即BCD0、BCD1、BCD2和BCD3,并由这些端口输入锁存电路模块输出的4位2进制数据。
需要设置7个输出端:
即DOUT、DOUT1、DOUT2、DOUT3、DOUT4、DOUT5和DOUT6,它们分别连接7段数码管的7个显示输入端。
译码电路模块中单个译码器符号及端口功能如图6所示:
图67段译码显示模块顶层图
其VHDL程序清单如下:
--SEG7
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYSEG7IS
PORT(bcd:
INSTD_LOGIC_VECTOR(3DOWNTO0);
dout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDSEG7;
ARCHITECTUREaOFSEG7IS
BEGIN
PROCESS(bcd)
BEGIN
CASEbcdIS
WHENx"0"=>dout<="0111111";
WHENx"1"=>dout<="0000110";
WHENx"2"=>dout<="1001011";
WHENx"3"=>dout<="1000111";
WHENx"4"=>dout<="0110110";
WHENx"5"=>dout<="1101101";
WHENx"6"=>dout<="1111101";
WHENx"7"=>dout<="0000111";
WHENx"8"=>dout<="1111111";
WHENx"9"=>dout<="1101111";
WHENOTHERS=>dout<="0000000";
ENDCASE;
ENDPROCESS;
ENDa;
4.扫描电路模块:
由于本次硬件下载中所使用的EDA试验箱只支持一位七段数码显示,所以在最后显示部分需要设计扫描电路,使得4位数字同时显示出来。
四个数码管分别由选通信号k0~k3来选择。
被选通的数码管显示数据。
其中CLK为扫描时钟;SG为7段控制信号,由高位至低位分别接g、f、e、d、c、b、a七个段;BT是位选控制信号。
程序中CNT4是一个计数器,作为扫描计数信号,由进程P2生成;进程P3是7段译码查表输出程序。
其模块顶层原理图如图7所示:
图7扫描显示模块顶层原理图
其VHDL程序清单如下:
---SCAN.VHD
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYSCANIS
PORT(CLK:
INSTD_LOGIC;
LEDA:
INSTD_LOGIC_VECTOR(6DOWNTO0);
LEDB:
INSTD_LOGIC_VECTOR(6DOWNTO0);
LEDC:
INSTD_LOGIC_VECTOR(6DOWNTO0);
LEDD:
INSTD_LOGIC_VECTOR(6DOWNTO0);
SG:
OUTSTD_LOGIC_VECTOR(6DOWNTO0);
BT:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDSCAN;
ARCHITECTUREONEOFSCANIS
SIGNALCNT4:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALa:
INTEGERRANGE0TO3;
BEGIN
P1:
PROCESS(CNT4)
BEGIN
CASECNT4IS
WHEN"00"=>BT<="0001";a<=0;
WHEN"01"=>BT<="0010";a<=1;
WHEN"10"=>BT<="0100";a<=2;
WHEN"11"=>BT<="1000";a<=3;
WHENOTHERS=>null;
ENDCASE;
ENDPROCESSP1;
P2:
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THENCNT4<=CNT4+1;
ENDIF;
ENDPROCESSP2;
P3:
PROCESS(a)
BEGIN
CASEaIS
WHEN0=>SG<=LEDD;
WHEN1=>SG<=LEDC;
WHEN2=>SG<=LEDB;
WHEN3=>SG<=LEDA;
WHENOTHERS=>NULL;
ENDCASE;
ENDPROCESSP3;
ENDONE;
四、各模块设计仿真:
1.时基产生与测频时序控制电路仿真
图8时基产生与测频时序控制电路仿真
2.十进制加法计数器仿真
图9十进制加法计数器电路仿真
3.待测信号脉冲计数器仿真
图10待测信号脉冲计数器电路仿真
4.译码显示电路仿真
图11译码显示电路仿真
5.锁存与译码显示控制电路仿真
图12锁存与译码显示控制电路仿真
6.扫描电路仿真
图13扫描显示电路仿真
7.简易数字频率计整个系统仿真
图14简易数字频率计系统仿真
五、简易数字频率计顶层原理图
图15简易数字频率计顶层原理图
六.编程下载:
以上程序经综合仿真后,结果基本符合设计要求。
整个频率计设计完成后,其外引脚图如图16所示。
原来需要十几块芯片组成的频率计,现在只用一块芯片即可实现。
下载适配后,只在输入端接上标准时钟频率和待测频率,相应的输出端接上LED7段显示数码管,即可显示频率。
硬件电路简捷,体积小,所有电路都在一块芯片里,因此性能稳定。
七、心得体会
在做本次课程设计之前,不是很了解EDA课程设计的设计程序,尤其在频率计设计方面更是在网上没能找到很多值得借鉴的资料,在图书馆借的书上倒是找到了一些简单的频率计设计的程序,后来根据书上的材料程序和网上的一些资料开始试着编程,主要是平时上课的知识积累不够,掌握得不熟练,到编写程序时,表达起来就很吃力。
甚至有时候都不知道自己在编什么,看不懂真的很痛苦!
没办法,只得结合下具体情况尝试了,结果可能不太好。
很快到了对整个系统作调试的时候了。
在模拟仿真的时候才发现自己的软件使用并不是很熟悉。
时间过得比较快,编译、下载、连线、运行,一步一步的很小心。
最后测试成功,只不过在显示问题上没有做得很好,如果在显示部分加上扫描模块就比较成功了。
不过自己也还算收获很大,毕竟已经尽力了。
通过本次课程设计,感慨很多啊……平时训练太少、课外衍生也做得不够。
对于编程类的习题做得不多是导致此次设计不成功的根本原因。
在以后的学习工作中应该加强基础知识的牢固掌握,争取比现在做得更好!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 课程设计 zmt