基于VHDL的数字频率计_第1页
基于VHDL的数字频率计_第2页
基于VHDL的数字频率计_第3页
基于VHDL的数字频率计_第4页
基于VHDL的数字频率计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、电子技术课程设计任务书1课程设计的内容和要求(包括原始数据、技术要求、工作要求等):一、 题目基于VHDL的数字频率计的设计二、 数字频率计功能该数字频率计的测量范围为19999kHz,并能用4位十进制数字显示测量结果。三、 设计要求1 详细说明设计方案;2 用VHDL编写设计程序;3 给出系统仿真结果;4 进行硬件验证。四、 参考文献1 潘 松等.EDA技术实用教程.2 卢 毅,赖杰.VHDL与数字电路设计.3 徐志军,徐光辉.CPLD/FPGA的开发与应用.4 林明权.VHDL数字控制系统设计范例5 2对课程设计成果的要求包括图表(或实物)等硬件要求:设计电路,安装调试或仿真,分析实验结果

2、,并写出设计说明书,语言流畅简洁,文字不得少于3500字。3主要参考文献: 要求按国标GB 771487文后参考文献著录规则书写。4课程设计工作进度计划:序号起 迄 日 期工 作 内 容12011.1.31.5查阅文献,收集资料。22011.1.61.9确定系统设计方案,用VHDL编写设计程序。32011.1.101.12系统仿真和调试,分析实验结果。42011.1.131.15撰写设计说明书。主指导教师日期:2011年 1 月 3 日基于VHDL的数字频率计摘要:本设计分为5个模块:顶层文件程序,十进制计数器模块,4位锁存器模块,控制模块,译码显示模块。数字频率计是数字电路中的一个典型应用,

3、实际的硬件设计用到的器件较多,连线比较复杂,而且会产生比较大的延时,造成测量误差、可靠性差。随着复杂可编程逻辑器件(CPLD)的广泛应用,以EDA工具作为开发手段,运用VHDL语言。将使整个系统大大简化。提高整体的性能和可靠性。关键词:频率,VHDL,模块。目 录0.前言 11.系统设计 11.1设计要求 1 1 11.2总体设计方案 1 1 2 22.程序设计 32.1 顶层文件 32.2 十进制计数模块 32.3 4位锁存器模块 32.4 控制模块 32.5 译码显示模块 43.系统仿真 44.结论 55.心得体会 5参考文献 6附录 各模块源程序 70.前言随着时代科技的迅猛发展,微电子

4、学和计算机等现代电子技术的成就给传统的电子测量与仪器带来了巨大的冲击和革命性的影响。常规的测试仪器仪表和控制装置被更先进的智能仪器所取代,使得传统的电子测量仪器在远离、功能、精度及自动化水平定方面发生了巨大变化,并相应的出现了各种各样的智能仪器控制系统,使得科学实验和应用工程的自动化程度得以显著提高。数字频率计在电子技术中扮演着一个重要的角色,因此数字频率计是一种最基本的测量仪器,它被广泛应用于航天、电子、测控等领域,许多测量方案和测量结果都与频率有着十分密切的关系,因此频率的测量在电子产品的研究与生产中显得尤为重要。1.系统设计1.1 设计要求(1)掌握数字频率计的原理、功能、设计与调试方法

5、;(2)熟悉Quartus II的使用方法,学习用VHDL语言编写程序。(1)设计数字频率计的测量范围为19999kHz,并能用4位十进制数字显示测量结果;(2)详细说明设计方案;(3)用VHDL编写设计程序;(4)给出系统仿真结果;(5)进行硬件验证。1.2 总体设计方案频率计的基本原理是用一个频率稳定度高的频率源作为基准时钟,对比测量其他信号的频率。测频法就是在确定的闸门时间Tw内,记录被测信号的变化周期数(或脉冲个数)Nx,则被是信号的频率为fx=Nx/Tw 。通常情况下计算每秒内待测信号的脉冲个数,即闸门时间为1 s。闸门时间越长,得到的频率值就越准确,但闸门时间越长,则每测一次频率的

6、间隔就越长。闸门时间越短,测得的频率值刷新就越快,但测得的频率精度就受影响。一般取1 s作为闸门时间。原理图:原理图设计框图FPGA设计框图说明:当系统正常工作时,脉冲发生器提供的1 Hz的输入信号,经过测频控制信号发生器进行信号的变换,产生计数信号,被测信号通过信号整形电路产生同频率的矩形波,送入计数模块,计数模块对输入的矩形波进行计数,将计数结果送入锁存器中,保证系统可以稳定显示数据,显示译码驱动电路将二进制表示的计数结果转换成相应的能够在七段数码显示管上可以显示的十进制结果。在数码显示管上可以看到计数结果。设计模块说明(1)顶层文件。用于各个控制模块的连结,使整个程序成立。(2)控制模块

7、。控制十进制计数器的计数及锁存器的工作,当计数器计数时,锁存器锁存前一次的技术状态;当计数器停止计数,则锁存器接收计数器的计数数据,因此控制模块控制计数器与锁存器的交替工作。(3)计数器。由于需要使用LED显示频率,所以采用的是十进制可清零、具有使能功能的计数器模块。(4)锁存模块。接受4个计数器传输的信号进行锁存。使显示的数据稳定,不会由于周期性的清零信号而不断闪烁。(5)译码显示模块。一共有7个LED需要显示,所以需要7个译码模块。2.程序设计2.1 顶层文件基于VHDL 描述语言, 采用自顶向下的设计方法, 各模块之间相互独立, 底层模块的修改不会影响其他模块的工作, 这种设计方法的设计

8、结构清晰、层次清楚, 便于对设计进行修改。在各个模块独立设计后, 编写一个顶层文件, 将各个模块连接在一起, 实现一个完整的数字频率计。2.2 十进制计数器模块计数器模块是对输入脉冲信号的频率进行测量,由4个十进制加法器组成,其中EN为计数器选通控制信号,RST为计数清零信号。在计数清零信号清零后,当计数使能信号EN有效时,开始对待测信号进行计数。如果计数使能信号EN的宽度为1是,那么计数结果就为待测信号的频率。2.3 4位锁存器模块当锁存信号上升沿到来时,将计数器的计数值锁存,这样可由外部的七段译码器译码并在数码管上显示。设置锁存器的好处是显示的数据稳定,不会由于周期性的清零信号而不断闪烁。

9、锁存器的位数应跟计数器完全一样,均是32位。寄存器是在计数结束后,利用触发器的上升沿把最新的频率测量值保存起来,这样在计数过程中可不必一直看着数码管显示器,显示器将最终的频率读数定期进行更新,其输出将作为动态扫描电路的输入。2.4 控制模块根据频率的定义和测量的基本原理,测量信号的频率必须有一个脉宽为1秒的对输入信号脉冲计数允许的信号,1秒计数结束后,计数值锁入锁存器的锁存信号和为下一测频计数周期作准备的计数器清0信号。控制模块的计数使能信号EN能产生一个1秒脉宽的周期信号,并对频率计的每一计数器cnt10的EN使能端进行同步控制。当 EN为高电平时,允许计数;低电平时停止计数,并保持其所计的

10、脉冲数。在停止计数期间,首先需要一个锁存信号load的上升沿将计数器在前1秒的计数值锁存进各锁存器中,并由外部的译码器译出并显示计数值。锁存信号后必须有一个清零信号rst对计数器进行清零,为下一秒钟的计数操作作准备。2.5 译码显示模块动态显示是把所有的led管的输入信号连在一起,这种连接方式有2个优点:一是节约器件的IO端口;二是降低功耗。每次向led写数据时,通过片选信号选通其中一个led 管并把数据写入,因此每一个时刻只有一个led 是亮的。3.系统仿真仿真图:说明:进行系统仿真时,首先设置reset复位信号为一个周期的低电平对系统进行复位,然后在下一个时钟周期给start信号低电平,开

11、始测量频率。而weis位选信号用于数码管的动态显示位选择,一个测频周期结束之后DQ得到频率数据的段码,与weis信号一起做动态显示。在一个测频周期结束后系统将锁存测量数据,直到下一次start信号有效(低电平有效)。4.硬件测试由于实验没有信号源故需在程序里加一个分频模块把标准频率分频成被测信号,再通过实验箱加以验证,这里所用的实验箱的基准频率为32MHZ,在做硬件仿真时,是把基率即50MHZ分频成不同频率的信号(如8KHZ),(具体的分频模块见附录)再把此模块加入顶层模块中,重新综合仿真,设置好端口约束文件把程序下载进入实验箱。即可得到所要的结果。通过改变分频得到不同的被测信号,由实验知不同

12、的频率段信号,均能良好的测也,故程序的硬件仿真成功。5.结论通过为期两周的课程设计,完成了本次设计的技术指标,刚开始设计的时候,由于VHDL语言编写程序这部分比较难懂,所以在分析设计程序模块的时候,就会停下来设计控制电路,为了提高效率,在实际的操作中,先分模块编写程序再根据分块程序写出总的程序,利用波形文件仿真实验结果,调测符合要求。最后完成顶层文件的设计编写。在硬件测试的过程中发现测量频率时,档位在1Hz9999999Hz,最终得到的结果,测量结果非常接近测量值。6.心得体会本次课程设计让我们体味到设计电路、仿真电路、调测电路过程中的苦与甜。设计是我们将来必需的技能,这次课程设计恰恰给我们提

13、供了一个应用自己所学知识的机会,尽管之前掌握这方面的知识较为贫乏,但是从到图书馆查找资料到对电路的设计对电路的调试再到最后电路的成型,我都是尽全力认真完成,并且虚心积极的向他人请教。在实习的过程中发现了自己有很多相关知识并不掌握。制作过程是一个考验人耐心的过程,不能有丝毫的急躁,马虎,对电路的调试要一步一步来,不能急躁,因为是在电脑上调试,比较慢,又要求我们有一个比较正确的调试方法,像下载引脚等等。这又要我们要灵活处理,在不影响试验的前提下可以加快进度。合理的分配时间。在设计控制电路的时候,我们可以连接译码显示和计数电路,这样就加快了完成的进度。在整个课程设计完后,总的感觉是:有收获。以前上课

14、都是上一些最基本的东西而现在却可以将以前学的东西作出有实际价值的东西。在这个过程中,我的确学得到很多在书本上学不到的东西,如:利用VHDL语言编写程序,如何将程序正确仿真以及硬件测试。但也遇到了不少的挫折,有时遇到了一个错误怎么找也找不到原因所在,期间我请教了几位这方面的高手,得到了不少帮助,我也学习到了很多。不管是在Quartus软件的应用,还是在VHDL编程语言的学习,或是电路把硬件的操作我都有了一定的提高。通过紧张有序的设计实践,我觉得自己的动手能力有了很大的提高,在课程设计中自己动脑子解决遇到的问题,有不懂的地方向他人请教。书本上的知识有了用武之地,这又巩固和深化了自己的知识结构。参考

15、文献1 潘 松等.EDA技术实用教程. 科学出版社2006年09月2 卢 毅,赖杰.VHDL与数字电路设计. 科学出版社; 第1版 2001年4月3 林明权.VHDL数字控制系统设计范例. 电子工业出版社2003年01月5谢煌, 黄为. 基于VHDL 语言设计频率计. 北京: 现代电子技术, 2003, 14附 录顶层文件源程序:library IEEE;entity freq_top isport (CLKIN,RESET,QING1,start: IN STD_LOGIC; -对输入输出端口的定义DQ : OUT STD_LOGIC_VECTOR (6 DOWNTO 0; -数码管显示的7

16、个脚weis : out STD_LOGIC_VECTOR (3 DOWNTO 0; -位显 4位COUTT : OUT STD_LOGIC;end freq_top;architecture Behavioral of freq_top isCOMPONENT TESTCTL -对控制模块的说明 PORT ( rst, clk ,start: in std_logic;cnt_en, rst_cnt, load : out std_logic;END COMPONENT;COMPONENT CNT10 -对计数模块的说明PORT ( f_in,CLK,RST,EN : IN STD_LOGI

17、C;CQ : OUT STD_LOGIC_VECTOR (3 DOWNTO 0;COUT : OUT STD_LOGIC ; END COMPONENT;COMPONENT REG4B -对锁存模块的说明 port ( clk,rst,load, QING : in std_logic;din : in std_logic_vector(3 downto 0;dout : out std_logic_vector(3 downto 0;END COMPONENT;COMPONENT DECL7S -对显示模块的说明PORT ( clk,scanclk ,rst,coutt: std_logic

18、;a1,a2,a3,a4,a5,a6,a7: in std_logic_vector(3 downto 0;weis: out std_logic_vector(3 downto 0;led7s : out std_logic_vector(6 downto 0;END COMPONENT;signal scan: integer range 0 to 1023;SIGNAL M : STD_LOGIC_VECTOR(15 downto 0;SIGNAL FIN,EN_S,RST_S,LOAD_S : STD_LOGIC;SIGNAL CQ1,CQ2,CQ3,CQ4,CQ5,CQ6,CQ7 :

19、 STD_LOGIC_VECTOR (3 DOWNTO 0;SIGNAL COUT1,COUT2,COUT3,COUT4,COUT5,COUT6 : STD_LOGIC;SIGNAL DOUT1,DOUT2,DOUT3,DOUT4,DOUT5,DOUT6,DOUT7 : STD_LOGIC_VECTOR (3 DOWNTO 0;signal scanclk,couttflag : std_logic; -定义中间信号beginPROCESS(CLKIN,RESETBEGINIF RESET='0' THEN scan<=0;ELSIF(CLKIN'EVENT AN

20、D CLKIN='1'THENif(scan = 1023then scan <= 0;elsescan <= scan +1;end if;END IF;END PROCESS;PROCESS(CLKIN,RESETBEGINIF RESET='0' THEN scanclk<='0'ELSIF(CLKIN'EVENT AND CLKIN='1'THENif(scan <511then scanclk <= '0' -产生每段数码管显示的时间else scanclk <

21、= '1'end if;end if;end process;PROCESS(CLKIN,RESETBEGINIF RESET='0' THEN M<=(others =>'0'ELSIF(CLKIN'EVENT AND CLKIN='1'THENM <= M +1;END IF;END PROCESS;FIN<= M(15; -产生被测频率COUTT <='0' WHEN COUT4 = '1'ELSE'1' WHEN start = '

22、;0' -实例化底层元件U1 : TESTCTL PORT MAP (RST=>RESET,CLK=>clkin,start=>start, CNT_EN=>EN_S,RST_CNT=>RST_S, LOAD=>LOAD_S;U2 : CNT10 PORT MAP (FIN,clkin, RST_S, EN_S, CQ1, COUT1;-u2到u8位频率计数器U3 : CNT10 PORT MAP (COUT1,clkin, RST_S, EN_S, CQ2, COUT2;U4 : CNT10 PORT MAP (COUT2,clkin, RST_S

23、, EN_S, CQ3, COUT3;U5 : CNT10 PORT MAP (COUT3,clkin, RST_S, EN_S, CQ4, COUT4;U6 : CNT10 PORT MAP (COUT4,clkin, RST_S, EN_S, CQ5, COUT5;U7 : CNT10 PORT MAP (COUT5,clkin, RST_S, EN_S, CQ6, COUT6;U8 : CNT10 PORT MAP (COUT6,clkin, RST_S, EN_S, CQ7, couttflag;-对测得的频率数据进行锁存U9 : REG4B PORT MAP (CLKIN,RESET

24、,LOAD_S, QING1, CQ1, DOUT1;U10 : REG4B PORT MAP (CLKIN,RESET,LOAD_S, QING1, CQ2, DOUT2;U11 : REG4B PORT MAP (CLKIN,RESET,LOAD_S, QING1, CQ3, DOUT3;U12 : REG4B PORT MAP (CLKIN,RESET,LOAD_S, QING1, CQ4, DOUT4;U13 : REG4B PORT MAP (CLKIN,RESET,LOAD_S, QING1, CQ5, DOUT5;U14 : REG4B PORT MAP (CLKIN,RESET

25、,LOAD_S, QING1, CQ6, DOUT6;U15 : REG4B PORT MAP (CLKIN,RESET,LOAD_S, QING1, CQ7, DOUT7;-显示U16 : DECL7S PORT MAP (clkin,scanclk,RESET, couttflag,DOUT1, DOUT2, DOUT3, DOUT4, DOUT5, DOUT6, DOUT7,weis,DQ;end Behavioral;输入端口:CLKIN:输入信号;RESET:复位信号;QING1:清零信号;start:开始信号输出端口:DQ:段显; weis:位显; coutt:输出十进制计数器模块

26、源程序:library IEEE;entity cnt10 isport (f_in,CLK,RST,EN : IN STD_LOGIC; -被测频率输入CQ : OUT STD_LOGIC_VECTOR(3 DOWNTO 0; -数据输出COUT : OUT STD_LOGIC ; -进位位输出end cnt10;architecture Behavioral of cnt10 is -定义构造体Behavioral signal CQI : STD_LOGIC_VECTOR(3 DOWNTO 0 :="0000"signal D1,D2,edge :STD_LOGIC;

27、beginprocess(clk,f_in,RST-detect the rising edge -上升沿检测进程;begin IF RST = '1' THEN d1 <= '0' ; d2 <= '0' -RST高电平时,计数清零 elsIF CLK'EVENT AND CLK='1' THEN -EN高电平时,允许计数d1 <= f_in; d2 <= d1;end if;end process;edge <= '1' when (d1='1' and (

28、 d2 = '0' else '0' ;PROCESS(CLK, RST, CQI,EN -十进制计数进程BEGINIF RST = '1' THEN CQI <= (OTHERS =>'0'ELSIF CLK'EVENT AND CLK='1' THENIF EN='1' THENif edge = '1' thenIF CQI < "1001" THEN CQI <= CQI + 1; COUT<= '0'

29、ELSE CQI <=(OTHERS=>'0' COUT <= '1' -当每次计数满10时输出溢出位END IF;end if;END IF;END IF;CQ <= CQI;END PROCESS;END Behavioral;输入端口:f_in:被测频率输入;CLK:时钟信号;RST:复位信号;EN:使能端输出端口:CQ :计数; COUT: 输出4位锁存器模块源程序:library IEEE;entity reg4b isport ( clk, rst,load : in std_logic;qing : in std_logic

30、; -锁存器控制信号输入din : in std_logic_vector(3 downto 0; -锁存数据输入dout : out std_logic_vector(3 downto 0; -锁存数据输出end reg4b;architecture Behavioral of reg4b isbeginprocess(clk,rst,load,qing,din -产生锁存器beginif qing = '0'or rst = '0' then dout <= "0000" -当QING或rst按下时,不显示elsif clk'

31、;event and clk = '1' then if(load = '1' then -更新显示频率dout <= din ;end if;end if ;end process;end Behavioral;输入端口:clk:时钟信号;rst:复位信号;load:装载信号;qing:清零信号;din:数据输入输出端口:dout:输出信号控制模块原程序:library IEEE;entity testctl isport ( rst, clk ,start: in std_logic;- 外部控制信号输入cnt_en, rst_cnt, load :

32、out std_logic;-内部控制信号输出end testctl;architecture Behavioral of testctl issignal flag_en: std_logic;signal divcount : integer range 0 to 49999999;signal state : std_logic_vector(1 downto 0;beginprocess( clk ,rst,start,state -分频与状态转换进程beginif rst = '0' then divcount <= 0 ;state<="00&

33、quot;flag_en <='0'elsif clk'event and clk = '1' then -上升沿触发case (state is -选择函数when "00" => -等待开始信号if (start = '0'then state <= "01"flag_en <='1'divcount <= 0 ;else state <= "00" end if;when "01" => -产生测

34、频时能控制信号if divcount = 49999999 then -对时钟频率50M分频divcount <= 0;flag_en <= '0'state <= "00"elsif divcount < 49999999 then divcount <= divcount + 1;flag_en <='1'state <= "01"end if;when others => state <= "00"end case;end if;end pro

35、cess;process ( clk, divcount,rst,flag_en -产生测频复位 beginif rst = '0' then rst_cnt <= '0' ;elsif clk'event and clk = '1'thenif flag_en = '0' then rst_cnt <= '1'else rst_cnt <= '0'end if;end if;end process;process ( clk,rst, divcount,flag_en -

36、load en 锁存使能beginif rst = '0' then load <= '0' ;elsif clk'event and clk = '1' thenif flag_en = '1' and divcount = 49999999 then load <= '1'else load <= '0'end if;end if;end process;cnt_en <= flag_en ;end Behavioral;输入端口:rst:复位信号; clk:时钟

37、信号;start: 开始信号输出端口:cnt_en:计数使能 rst_cnt:计数复位 load:锁存使能译码显示模块源程序:library IEEE;entity decl7s isport (clk ,scanclk ,rst,coutt:in std_logic;a1,a2,a3,a4,a5,a6,a7: in std_logic_vector(3 downto 0;weis: out std_logic_vector(3 downto 0;led7s : out std_logic_vector(6 downto 0;end decl7s;architecture one of dec

38、l7s issignal din :std_logic_vector(3 downto 0;signal dout :std_logic_vector(6 downto 0;signal wei : std_logic_vector(3 downto 0;-display data wei selectsignal d1,d2,d3,d4 : std_logic_vector(3 downto 0;begin led7s <= dout;weis <= wei;process(a1,a2,a3,a4,a5,a6,a7,couttbeginif(a5="0000" and a6="0000" and a7="0000"and coutt = '0'then -高低位换挡d1 <= a1; d2 <= a2; d3 <= a3; d4 <= a4;else d1 <= a5 ; d2 <= a6; d3 <= a7; d4 <= "0000" -显示KHZend if;end process;process(scanclk,rstbegin if(rst = '0'then wei(3 downto 0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论