1303070229 李加宁.docx
《1303070229 李加宁.docx》由会员分享,可在线阅读,更多相关《1303070229 李加宁.docx(16页珍藏版)》请在冰豆网上搜索。
![1303070229 李加宁.docx](https://file1.bdocx.com/fileroot1/2023-5/29/2e9b4ec2-9268-478c-b461-1672dcaa39a7/2e9b4ec2-9268-478c-b461-1672dcaa39a71.gif)
1303070229李加宁
课程设计任务书
学院
信息科学与工程
专业
电子信息科学与技术
学生姓名
李加宁
班级学号
1303070229
课程设计题目
基于VHDL的简易数字频率计的设计与实现
实践教学要求与任务
训练学生综合运用学过数字系统VHDL技术的知识,独立进行查找资料、选择方案、代码设计、撰写报告,进一步加深对数字系统VHDL技术的理解。
实现基于VHDL的简易数字频率计的设计与实现,其功能如下:
1设计一个能测量方波信号的频率计;
2测量范围是0-999999Hz;
3结果用十进制数显示。
工作计划与进度安排
第1-2周:
选题,查阅课题相关资料,进行总体及方案设计;
第3-4周:
编写程序代码;
第5-6周:
进行程序设计及仿真;
第7-8周:
下载与实现,撰写课程设计报告,进行答辩验收。
指导教师:
201年月日
专业负责人:
201年月日
学院教学副院长:
201年月日
成绩评定表
学生姓名
李加宁
班级学号
1303070229
专业
电子信息科学与技术
课程设计题目
基于VHDL的简易数字频率计的设计与实现
评
语
组长签字:
成绩
日期
20年月日
摘要
本次设计使用QuartusII工具来设计数字频率计的实现。
设计中采用自顶向下的思想,其主要是实现测试方波频率的功能,其中分为五大模块,即分为测频控制信号发生器testpl模块、十进制计数器cnt10模块、16位锁存器reg16b模块、数码管控制器ledcom模块、译码器ymq模块。
测频控制信号发生器testpl模块、十进制计数器cnt10模块、16位锁存器reg16b模块通过计数器将待测信号频率存入锁存器;寄存器传递至译码器在到数码管进行显示。
经程序仿真和验证后实现了具体功能。
关键字:
FPGA;数字频率计;自顶向下。
目录
引言4
1.系统的设计要求4
2.系统分析5
2.1系统构成5
2.2系统实现过程5
3.具体模块设计5
3.2十进制计数器模块:
6
3.316位锁存器模块:
6
3.4数码管控制器模块:
6
3.5译码器模块:
6
3.6整体结构电路图7
4.程序设计7
4.1测频控制信号发生器模块:
7
4.2十进制计数器模块8
4.316位锁存器模块9
4.4数码管控制器模块10
4.5数码管译码器模块11
5.运行结果与分析12
(1)测频控制信号发生器模块12
(2)十进制计数器模块:
12
(3)16位锁存器模块:
13
(4)数码管控制器模块:
13
(5)译码器模块:
13
6.结束语14
参考文献14
引言
随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因此测频计常受到人们的青睐。
目前许多高精度的数字频率计都采用单片机加上外部的高速计数器来实现,然而单片机的时钟频率不高导致测频速度比较慢,并且在这种设计中,由于PCB版的集成度不高,导致PCB板走线长,因此难以提高计数器的工作频率。
为了克服这种缺点,大大提高测量精度和速度,我们可以设计一种可编程逻辑器件来实现数字频率计。
EDA技术是以大规模可编程逻辑器件为设计载体,以硬件语言为系统逻辑描述的主要方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件设计的电子系统到硬件系统的设计,最终形成集成电子系统或专用集成芯片的一门新技术。
其设计的灵活性使得EDA技术得以快速发展和广泛应用。
以QUARTUSII软件为设计平台,采用VHDL语言实现数字频率计的整体设计。
1.
系统的设计要求
(1)设计一个能测量方波信号的频率计;
(2)测量范围是0-999999Hz;
(3)结果用十进制数显示。
2.系统分析
2.1系统构成
图1数字频率计原理框图
如图1该数字频率计分为五个模块,分别为:
测频信号发生器模块、锁存器模块、十进制计数器模块、译码器模块、数码管模块。
2.2系统实现过程
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。
这就要求测频控制信号发生器signalhappen的计数使能信号tsten能产生一个1秒脉宽的周期信号,并对频率计的每一计数器cnt10的使能端en进行同步控制。
当tsten为高电平"1"时,允许计数;为低电平"0"时停止计数,并保持其计数结果。
在停止计数期间,首先需要一个锁存信号load的上跳沿将计数器在前1秒种的计数值锁存进16位锁存器reg16b中。
锁存信号之后,必须有一个清零信号clr_cnt对计数器进行清零,为下1秒的计数操作做准备。
,然后由外部数码管控制器ledcom控制的7段译码器ymq译出,并稳定显示。
3.具体模块设计
3.1测频控制信号发生器testpl模块:
输入端clk收到1Hz信号后,其输出端testen控制各个cnt10的使能,clr_cnt控制各个cnt10的清零,load控制锁存器内数据的输出。
3.2十进制计数器模块:
有一时钟使能输入端en,用于锁定计数值。
当高电平"1"时计数允许计数,低电平"0"时禁止计数。
多位十进制计数器时,最低位的计数器的clk端输入被测信号,各计数器的进位输出端c10将信号输到下一位十进制计数器cnt10的输入端clk,最高位十进制计数器cnt10的进位输出端c10不处理。
3.316位锁存器模块:
将已有16位bcd码存在于此模块的输入口din[15..0],在信号load的上升沿后即被锁存到寄存器reg16b的内部,并由reg16b的输出端dout[15..0]输出,设置锁存器的好处是,数码管上显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
3.4数码管控制器模块:
两个输入端一个为datain[15..0],另一个为数码管显示选择的扫描频率输入端clk,输出端为数码管选择信号com[3..0]和对应显示的数码管的BCD码信号端dataout[3..0],数码管显示选择随扫描频率clk循环变化,实现稳定显示。
3.5译码器模块:
输入端d_in[3..0]将接收BCD码信号,译码后输出端d_out[7..0]输出8为7段数码管信号,其中输出的第8位均为高电平"1"可以使四个数码管的小数点不显示。
经译码器的处理输出后数码管显示相应的数值。
图2测频控制信号发生器testpl模块图
图3十进制计数器模块图
图4十六进制锁存器模块图
图5数码管控制器模块图
图6译码器模块图
3.6整体结构电路图
图7整体结构电路图
4.程序设计
4.1测频控制信号发生器模块:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytestplis
port(clk:
instd_logic;--1Hz信号
tsten:
outstd_logic;--计数器使能信号
clr_cnt:
outstd_logic;--计数器清零信号
load:
outstd_logic);--锁存器输出控制信号
endtestpl;
architectureartoftestplis
signaldiv2clk:
std_logic;
begin
process(clk)
begin
ifclk'eventandclk='1'then
div2clk<=notdiv2clk;--div2clk为2Hz
endif;
endprocess;
process(clk,div2clk)
begin
if(clk='0'anddiv2clk='0')then
clr_cnt<='1';--当div2clk与clk同时为零时计数器清零
elseclr_cnt<='0';--当div2clk处于的高电平时计数器计数
endif;
endprocess;
load<=notdiv2clk;--锁存器输出与计数器使能信号反相
tsten<=div2clk;
endart;
4.2十进制计数器模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycnt10is
port(clk,clr,en:
instd_logic;--clk:
计数器时钟,clr:
清零信号,en:
计数使能信号
q:
outstd_logic_vector(3downto0);--q:
4位计数结果输出
c10:
outstd_logic);--计数进位
endcnt10;
architectureartofcnt10is
signalcqi:
std_logic_vector(3downto0);
begin
process(clk,clr)
begin
ifclr='1'thencqi<="0000";--当输入的clr_cnt为低电平0时清零
elsifclk'eventandclk='1'then
ifen='1'then--当输入的tesen为高电平1时允许计数
if(cqi<9)thencqi<=cqi+1;
elsecqi<="0000";--等于9则计数器清零
endif;--当输入的tesen为低电平0时禁止计数,锁定计数值
endif;
endif;
endprocess;--产生进位
process(cqi)
begin
ifcqi="1001"thenc10<='1';--当加的9时产生进位输出
elsec10<='0';
endif;
endprocess;
q<=cqi;
endart;
4.316位锁存器模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityreg16bis
port(load:
instd_logic;--输出锁存控制信号
din:
instd_logic_vector(15downto0);
dout:
outstd_logic_vector(15downto0));
endreg16b;
architectureartofreg16bis
begin
process(load,din)
begin
ifload'eventandload='1'then--load为高电平时teten为低电平,计数器禁止
dout<=din;--锁存输入的数据
endif;
endprocess;
endart;
4.4数码管控制器模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityledcomis
port(clk:
instd_logic;--数码管扫描频率
datain:
instd_logic_vector(15downto0);--锁存器输入的16位信号
dataout:
outstd_logic_vector(3downto0);--输出至译码器的4位信号
sel:
bufferstd_logic_vector(2downto0));--输出数码管选择信号
endledcom;
architectureartofledcomis
begin--sel同扫描频率clk循环变化
process(clk)
begin
ifrising_edge(clk)then
ifsel>=7then
sel<="000";
elsesel<=sel+1;
endif;
endif;
endprocess;--数码管选择
process(sel,datain)
begin
caseselis
when"000"=>dataout<=datain(3downto0);
when"001"=>dataout<=datain(7downto4);
when"010"=>dataout<=datain(11downto8);
when"011"=>dataout<=datain(15downto12);
whenothers=>NULL;
endcase;
endprocess;
endart;
4.5数码管译码器模块
libraryIEEE;
useIEEE.std_logic_1164.all;
entityymqis
port(
d_in:
instd_logic_vector(3downto0);--数码管控制器输入四位信号
d_out:
outstd_logic_vector(6downto0));--输出8位信号
endymq;--第8位d_out[7]为逗号
architectureartofymqis
begin
process(d_in)
begin
cased_inis--第8位为1高电平逗号不显示
when"0000"=>d_out<="1111110";--0
when"0001"=>d_out<="0110000";--1
when"0010"=>d_out<="1101101";--2
when"0011"=>d_out<="1111001";--3
when"0100"=>d_out<="0110010";--4
when"0101"=>d_out<="1011011";--5
when"0110"=>d_out<="1011111";--6
when"0111"=>d_out<="1110000";--7
when"1000"=>d_out<="1111111";--8
when"1001"=>d_out<="1111011";--9
whenothers=>NULL;
endcase;
endprocess;
endart;
5.运行结果与分析
(1)测频控制信号发生器模块
输入端clk收到1Hz信号后,其输出端testen控制各个cnt10的使能,clr_cnt控制各个cnt10的清零,load控制锁存器内数据的输出。
图
8测频信号发生器模块图
(2)十进制计数器模块:
有一时钟使能输入端en,用于锁定计数值。
当高电平"1"时计数允许计数,低电平"0"时禁止计数。
多位十进制计数器时,最低位的计数器的clk端输入被测信号,各计数器的进位输出端c10将信号输到下一位十进制计数器cnt10的输入端clk,最高位十进制计数器cnt10的进位输出端c10不处理。
图10十进制计数器模块图
(3)16位锁存器模块:
将已有16位bcd码存在于此模块的输入口din[15..0],在信号load的上升沿后即被锁存到寄存器reg16b的内部,并由reg16b的输出端dout[15..0]输出,设置锁存器的好处是,数码管上显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
。
图11十六位锁存器模块
(4)数码管控制器模块:
两个输入端一个为datain[15..0],另一个为数码管显示选择的扫描频率输入端clk,输出端为数码管选择信号com[3..0]和对应显示的数码管的BCD码信号端dataout[3..0],数码管显示选择随扫描频率clk循环变化,实现稳定显示。
图12数码管控制器模块
(5)译码器模块:
输入端d_in[3..0]将接收BCD码信号,译码后输出端d_out[7..0]输出8为7段数码管信号,其中输出的第8位均为高电平"1"可以使四个数码管的小数点不显示。
经译码器的处理输出后数码管显示相应的数值。
图13译码器模块
6.结束语
这次课程设计中,我不仅复习巩固了课堂所学的理论知识,提高了对所学知识的综合应用能力,并从根本上了解了VHDL语言的一些基本用法,应用了原来不会或者不熟练的句型,如if句,case句等,也学会了一些基本功能的实现方法,如分频,状态控制等等,从另外一个角度重新审视了上学期完全从硬件角度出发的电路设计,明白了软硬件之间的交互。
通过这个课题,对系统框图、逻辑流程图、状态转移图的设计有了一定的了解。
也懂得了系统的前期设计对于后续的编程和调试的重要性。
本课题采用了自下而上的设计方法,根据系统对硬件的要求,画出系统控制流程图;然后根据控制流程图,分化模块,利用模块实现功能;最后进行仿真和调试。
每个成功的背后都要面对无数次的失败,这次课设也不例外。
虽然遇到不少问题与困难,但通过老师以及同学的帮助,都一一得到顺利地解决。
我想这必定会为将来的实践积累宝贵的经验和教训。
总之,这次课设我们都受益匪浅。
整个过程氛围浓厚,本人也态度十分认真,积极向老师和同学求教并在此过程中收获良多,能够进一步了解和使用一门与硬件直接打交道的基本语言对我们将来的学习和工作都会十分有益
参考文献
[1].侯伯亭,顾新.VHDL硬件描述语言与数字逻辑电路设计.西安:
西安电子科技大学出版社,1999.
[2].EDA技术与VHDL。
潘松,黄继业编著。
——4版。
——北京:
清华大学出版社,2013.4
[3].王金明.数字系统设计VHDL北京:
电子工业出版设,2010。
13