FPGA课程设计.docx
- 文档编号:3409000
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:11
- 大小:200.54KB
FPGA课程设计.docx
《FPGA课程设计.docx》由会员分享,可在线阅读,更多相关《FPGA课程设计.docx(11页珍藏版)》请在冰豆网上搜索。
FPGA课程设计
西安欧亚学院
信息工程学院
FPGA系统开发设计报告
2013/2014学年第二学期
设计题目:
基于VHDL的分频计设计
专业班级:
统本电信1201班
姓名学号:
李瑞洋
12620102154071
指导教师:
张秀芳
设计成绩:
一、设计任务及要求:
当系统正常工作时,由系统时钟提供的50MHz的输入信号,经过信号源模块,先通过100分频产生1MHZ的时钟信号,再将1MHZ的时钟信号分频产生多种频率输出,其中1HZ的输出频率被作为控制模块的时钟输入,7812HZ的输出频率被作为显示模块的时钟输入,由控制模块产生的计数使能信号testen和清零信号clr对计数模块进行控制,而由其产生的锁存信号load对锁存模块进行控制,一旦计数使能信号为高电平,并且时钟上升沿到来,计数器便开始正常计数,清零信号到来则计数清零,而当锁存信号为高电平时,数据便被锁存器锁存,然后将锁存的数据输出到显示模块显示出来,数据锁存保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在数码显示管上可以显示的十进制结果。
在数码显示管上可以看到计数结果。
数字频率计的原理框图如图所示。
主要由5个模块组成,分别是:
信号源模块、控制模块、计数模块、锁存器模块和显示器模块[6]
二、基本设计思路
根据数字频率计的系统原理,cnt控制信号发生器。
testctl的计数使能信号testen能产生一个1s宽的周期信号,并对频率计的每一计数器Cnt10的ENA使能端进行同步控制:
当testen高电平时允许计数、低电平时停止计数。
reg32b为锁存器。
在信号load的上升沿时,立即对模块的输入口的数据锁存到reg32b的内部,并由reg32b的输出端输出,然后,七段译码器可以译码输出。
在这里使用了锁存器,好处是可以稳定显示数据,不会由于周期性的清零信号而不断闪烁。
Cnt10为十进制计数器。
有一时钟使能输入端ENA,用于锁定计数值。
当高电平时允许计数,低电平时禁止计数。
将八个十进制计数器Cnt10级联起来实现8位十进制计数功能[2,7]。
disply为七段译码显示驱动电路,可以将频率计数的结果译成能在数码管上显示的相对应的阿拉伯数字,便于读取测量的结果。
为了实现系统功能,测频控制信号发生器testctl、计数器Cnt10、锁存器reg32b存在一个工作时序的问题,设计时需要综合考虑。
8位数字频率计的顶层框图(endfreq.bdf),设计实现包括信号源模块(F1MHZ、CNT)、频率计模块(FREQ)和显示模块(display)三大模块。
下面分别介绍三个模块的结构和实现方法。
三.单元模块设计实现及仿真
1、信号源模块的实现
(1)功能简介
信号源是为了产生1MHz的门控信号和待测的定频信号,而对输入系统时钟clk(50MHz)进行分频的模块,设计源代码PIN1MHZ.VHD对输入系统时钟clk(50MHz)进行分频产生1MHz信号。
(2)原程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYPIN1MHZ_1IS
PORT(clkin:
INSTD_LOGIC;
clkout:
OUTSTD_LOGIC);
ENDPIN1MHZ_1;
ARCHITECTUREAOFPIN1MHZ_1IS
BEGIN
PROCESS(clkin)
variablecnttemp:
INTEGERRANGE0TO99;
BEGIN
IFclkin='1'ANDclkin'eventTHEN
IFcnttemp=99THENcnttemp:
=0;
ELSE
IFcnttemp<50THENclkout<='1';
ELSEclkout<='0';
ENDIF;
cnttemp:
=cnttemp+1;
ENDIF;
ENDIF;
ENDPROCESS;
ENDA;
(3)仿真波形
2、频率计模块的实现
(1)功能简介
此程序要求将1MHZ的输入频率分别进行21分频(产生500KHZ的输出频freq500k)、23分频(产生125KHZ的输出频率freq125k)、25分频(产生31250HZ的输出频freq31250)、27分频(产生7812HZ的输出频率freq7812)、29分频(产生1953HZ的输出频率freq1953)、211分频(产生488HZ的输出频率freq488)、213分频(产生1HZ的输出频率freq1)。
(2)原程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycntis
port(clk:
instd_logic;--1MHz输入
freq1:
outstd_logic;--1Hz输出
freq488:
outstd_logic;--488Hz输出
freq1953:
outstd_logic;--1953Hz输出
freq7812:
outstd_logic;--7812Hz输出
freq31250:
outstd_logic;--31250Hz输出
freq125k:
outstd_logic;--125KHz输出
freq500k:
outstd_logic);--500KHz输出
endcnt;
architecturebehvofcntis
signaltemp:
std_logic_vector(19downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
iftemp="11110100001000111111"then
temp<="00000000000000000000";
else
temp<=temp+1;
endif;
endif;
endprocess;
freq1<=temp(19);
freq488<=temp(10);
freq1953<=temp(8);
freq7812<=temp(6);
freq31250<=temp(4);
freq125k<=temp
(2);
freq500k<=temp(0);
endbehv;
(3)仿真波形
3.测频控制信号产生器
(1)功能简介
控制模块的作用是产生测频所需要的各种控制信号。
控制信号的标准输入时钟为1HZ,每两个时钟周期进行一次频率测量。
该模块产生的3个控制信号,分别为TSTEN,LOAD,CLR_CNT.CLR_CNT信号用于在每次测量开始时,对计数器进行复位,以清除上次测量的结果,该复位信号高电平有效,持续半个时钟周期的时间。
TSTEN为计数允许信号,在TSTEN信号的上升沿时刻计数模块开始对输入信号的频率进行测量,测量时间恰为一个时钟周期(正好为单位时间1s),在此时间里被测信号的脉冲数进行计数,即为信号的频率。
然后将值锁存,并送到数码管显示出来。
设置锁存器的好处是使显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
在每一次测量开始时,都必须重新对计数器清0[7]。
(2)源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYTESTCTLIS
PORT(CLK:
INSTD_LOGIC;--1Hz测频控制时钟
TSTEN:
OUTSTD_LOGIC;--计数器时钟使能
CLR_CNT:
OUTSTD_LOGIC;--计数器清零
LOAD:
OUTSTD_LOGIC);--输出锁存信号
ENDTESTCTL;
ARCHITECTUREARTOFTESTCTLIS
SIGNALDIV2CLK:
STD_LOGIC;
SIGNALCLR:
STD_LOGIC;
SIGNALloadcnt:
STD_LOGIC;
BEGIN
PROCESS(CLK)IS
BEGIN
IFCLK'EVENTANDCLK='1'--1HZ时钟二分频
THENDIV2CLK<=NOTDIV2CLK;
ENDIF;
ENDPROCESS;
PROCESS(CLK,DIV2CLK)
BEGIN
IFCLK='0'ANDDIV2CLK='0'THEN--产生计数器清零信号
CLR<='1';
ELSECLR<='0';
ENDIF;
ifclr='0'anddiv2clk='0'then
loadcnt<='1';
elseloadcnt<='0';
endif;
ENDPROCESS;
LOAD<=notdiv2clk;TSTEN<=DIV2CLK;CLR_CNT<=CLR;
ENDARCHITECTUREART;
(3)仿真波形
4.锁存器
(1)功能简介
锁存器模块也是必不可少的,测量模块测量完成后,在load信号的上升沿时刻将测量值锁存到寄存器中,然后输出到显示模块。
锁存器是起数据保持的作用,它将会把数据保存到下次触发或复位。
主要是主从触发器组成的。
用于存储数据来进行交换,使数据稳定下来保持一段时间不变化,直到新的数据将其替换。
(2)源程序LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYREG32BIS
PORT(LOAD:
INSTD_LOGIC;
DIN:
INSTD_LOGIC_VECTOR(31DOWNTO0);
DOUT:
OUTSTD_LOGIC_VECTOR(31DOWNTO0));
ENDENTITYREG32B;
ARCHITECTUREARTOFREG32BIS
BEGIN
PROCESS(LOAD,DIN)IS
BEGIN
IFLOAD'EVENTANDLOAD='1'
THENDOUT<=DIN;--锁存输入数据
ENDIF;
ENDPROCESS;
ENDART;
(3)仿真波形
5.十进制计数器
(1)功能简介
计数器模块是由8个带有异步清零端,进位信号输出的模为10的计数模块级连而成。
通过(freq.vhd)进行元件例化实现。
此十进制计数器的特殊之处是,有一时钟使能输入端ENA,用于锁定计数器。
当高电平计数允许,低电平时计数禁止。
计数器模块用于对输入信号的脉冲进行计数,该模块必须有计数允许、异步清零等端口,以便于控制模块对其进行控制。
(2)源程序
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYCNT10IS
PORT(CLK:
INSTD_LOGIC;--计数时钟信号
CLR:
INSTD_LOGIC;--清零信号
ENA:
INSTD_LOGIC;--计数使能信号
CQ:
OUTINTEGERRANGE0TO15;--4位计数结果输出
CARRY_OUT:
OUTSTD_LOGIC);--计数进位
ENDCNT10;
ARCHITECTUREARTOFCNT10IS
SIGNALCQI:
INTEGERRANGE0TO15;
BEGIN
PROCESS(CLK,CLR,ENA)IS
BEGIN
IFCLR='1'THENCQI<=0;----计数器异步清零
ELSIFCLK'EVENTANDCLK='1'THEN
IFENA='1'THEN
IFCQI=10THENcqi<=1;
ELSECQI<=cqi+1;ENDIF;----等于9,则计数器清零
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CQI)IS
BEGIN
IFCQI=10THENCARRY_OUT<='1';----进位输出
ELSECARRY_OUT<='0';
ENDIF;
ENDPROCESS;
CQ<=CQI;
ENDART;
(3)仿真波形
6.显示模块
(1)功能简介
LED有段码和位码之分,所谓段码就是让LED显示出八位数据,一般情况下要通过一个译码电路,将输入的4位2进制数转换为与LED显示对应的8位段码。
位码也就是LED的显示使能端,对于共阴级的LED而言,低电平使能,在本设计中设计了一个3位的循环计数器,将计数结果输入到译码器,译码结果输出即可依次使能每个LED。
例如:
要让8个LED同时工作显示数据,就是要不停的循环扫描每一个LED,并在使能每一个LED的同时,输入所需显示的数据对应的8位段码。
虽然8个LED是依次显示,但是受视觉分辨率的影响,看到的现象是8个LED同时工作。
display模块的顶层图如下所示。
CNT计数产生扫描信号(位码),LED模块用于查表产生LED段码输出。
(2)仿真波形
7.整体设计原理图
四.总结设计
本设计对等精度频率计进行了系统的设计。
首先介绍了频率测量的一般方法,着重介绍等精度测频原理并进行了误差分析,利用等精度测量原理,通过FPGA运用VHDL编程,利用FPGA(现场可编程门阵列)芯片设计了一个8位数字式等精度频率计,该频率计的测量范围为0-100MHZ,利用QUARTUSⅡ集成开发环境进行编辑、综合、波形仿真,并下载到CPLD器件中,经实际电路测试,仿真和实验结果表明,该频率计有较高的实用性和可靠性,达到预期的结果。
和传统的频率计相比,利用FPGA设计的频率计简化了电路板设计,提高了系统设计的实用性和可靠性,实现数字系统的软件化,这也是数字逻辑设计的趋势。
本次设计中,我除了对相关的专业知识以及相关的实验操作进行了回顾,还有许多其他的收获,比如在绘制论文中所需要的相关的电路图的过程中,我还学会使用word绘图,这次毕业设计不但让我对本专业的相关基础知识进行了很好的复习,还对原由书本上的知识进行了拓展和延伸,毕业设计不但锻炼了我的动手能力,也锻炼了我处理问题的能力,并且学会了许多新的知识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA 课程设计