1、资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。 一、 课程设计要求 设计一个8位数码管显示的频率计( 频率分辨率为1Hz) 。 二、 总体结构框图 图1 总体结构框图 三、 课程设计原理 在电子技术中, 频率是最基本的参数之一, 而且与许多点参量的测量方案、 测量结果都有十分密切的关系, 因此, 频率的测量就显得尤为重要。测量频率的方法有很多种, 其中电子计数器测量频率具有精度高、 使用方便、 测量迅速, 以及便于实现测量过程自动化等优点, 是频率测量的重要手段之一。 数字式频率计的测量原理有两类: 一是直接测频法, 即在一定的闸门时间内测量被测信号的脉冲个
2、数; 二是间接测频法即周期法, 如周期测频法。直接测频法适用于高频信号的频率测量, 一般采用计数器、 数据锁存器及控制电路实现, 并经过改变计数阀门的时间长短以达到不同的测量精度; 间接测频法适用于低频信号的频率测量。 本次课程设计中使用的是直接测频法, 即用计数器在计算机1s内输入信号周期的个数, 其测频范围为0Hz-99999999Hz。 四、 器件的选择 1、 装有QuartusII软件的计算机一台。 2、 芯片: 本实验板中为EP芯片。 3、 EDA实验箱一个。 4、 下载接口是数字芯片的下载接口( JTAG) 主要用于FPGA芯片的数据下载。 5、 时钟源。 五、 功
3、能模块和信号仿真图以及源程序 (1) 系统时钟分频及控制的功能模块图及其源程序 图2 功能模块图 作用: 将试验箱上的50MHz的晶振分频, 输出CLOCK为数码管提供1kHz的动态扫描频率。CNT_EN输出为0.05s的信号, 对频率计中的32位十进制计数器CNT10的ENA使能端进行同步控制, 当TSTEN高电平时允许计数, 低电平时停止计数, 并保持其所计的脉冲数。在停止计数期间, 首先需要一个锁存信号LOAD的上跳沿将计数器在前一秒的计数值锁存进锁存器REG32B中, 并由外部的十进制7段数码管显示计数值。设置锁存器的好处是数据显示稳定, 不会由于周期
4、性的清零信号而不断闪烁。锁存信号后, 必须有一个清零信号RST_CNT对计数器进行清零, 为下一秒的计数操作做准备。 该模块的信号仿真图如下: 图3 仿真波形图 源程序如下: --分频 library ieee; use ieee.std_logic_1164.all; entity fdivwangzheng is port(clk0:in std_logic; --输入系统时钟 clk1:out std_logic; --输出1hz时钟信号 clk2:out std_logic); --输出显示扫描时钟信号 end fdi
5、vwangzheng; architecture a of fdivwangzheng is begin p1:process(clk0) variable cnt:integer range 0 to 49999999; --分频系数为24999999 variable ff:std_logic; begin if clk0'event and clk0='1' then if cnt<49999999 then cnt:=cnt+1; else cnt:=0; ff:=not ff; --反向 end if; end if; clk1<=ff; end
6、 process p1; p2:process(clk0) variable cnn:integer range 0 to 999; --分频系数为499 variable dd:std_logic; begin if clk0'event and clk0='1' then if cnn<999 then cnn:=cnn+1; else cnn:=0; dd:=not dd; --反向 end if; end if; clk2<=dd; end process p2; end a; --测频控制器(testctl.vhd) LIBRARY
7、 IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY TESTCTLwanzheng IS PORT ( CLKK : IN STD_LOGIC; -- 1Hz CNT_EN,RST_CNT,LOAD : OUT STD_LOGIC); END TESTCTLwanzheng; ARCHITECTURE behav OF TESTCTLwanzheng IS SIGNAL DIV2CLK : STD_L
8、OGIC; BEGIN PROCESS( CLKK ) BEGIN IF CLKK'EVENT AND CLKK = '1' THEN DIV2CLK <= NOT DIV2CLK; END IF; END PROCESS; PROCESS (CLKK, DIV2CLK) BEGIN IF CLKK='0' AND Div2CLK='0' THEN RST_CNT <= '1'; ELSE RST_CNT <= '0'; END IF; END PROCESS;
9、 LOAD <= NOT DIV2CLK ; CNT_EN <= DIV2CLK; END behav; (2) 十进制计数器的功能模块图及其源程序 图4 功能模块图 作用: 当使能端为高电平, 清零端为低电平时, 实现十进制计数功能。 第一个CNT10计数输出CQ=9时, 下一秒时钟上升沿到来时, 将产生一个CARRY_OUT信号作为下一个CNT10的时钟信号, 同时CQ清零, 依次递推到8个CNT10。 当清零端为低电平, 使能端为低电平时停止计数。 当清零端为高电平时, 计数器清零。 该模块的信号仿真图如下: 图5 仿真波形图
10、 源程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY CNT10 IS PORT(CLK: IN STD_LOGIC; CLR: IN STD_LOGIC; ENA: IN STD_LOGIC; CQ : OUT INTEGER RANGE 0 TO 9; CARRY_OUT: OUT STD_LOGIC); END CNT10; ARCHITECTURE behav OF CNT10 IS SIGNAL CQI: INTEGER RANGE 0 TO 9;
11、 BEGIN PROCESS(CLR,CLK,ENA) BEGIN IF(CLR='1') THEN CQI<=0; ELSIF(CLK'EVENT AND CLK='1') THEN IF(ENA='1') THEN IF(CQI=9) THEN CQI<=0; CARRY_OUT<='1'; ELSE CQI<=CQI+1; CARRY_OUT<='0'; END IF; END IF; END IF; END PROCESS; CQ<=CQI; END
12、 behav; (3) 32位锁存器的功能模块图及其源程序 图6 功能模块图 实现方式: LOAD信号上升沿到来时将对输入到内部的CNT10计数信号进行锁存。 作用: 锁存信号, 并将结果输出给SELTIME。 该模块的信号仿真图如下: 图7 仿真波形图 源程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY REG32B IS PORT( LOAD: IN STD_LOGIC; DIN: IN STD_LOGIC_VECTOR(31 DOWNTO 0); DOUT: OUT
13、 STD_LOGIC_VECTOR(31 DOWNTO 0 )); END ENTITY REG32B; ARCHITECTURE behav OF REG32B IS BEGIN PROCESS(LOAD,DIN) IS BEGIN IF LOAD'EVENT AND LOAD='1' THEN DOUT<=DIN; END IF; END PROCESS; END ARCHITECTURE behav; (4) 数码管扫描的功能模块图及其源程序 图8 功能模块图 作用: 锁存信号输出DIN[31..0], 然后由SELTIME进行扫描输出,
14、 当SEL为”000”时选通第一个CNT10, 输出到LED7进行译码输出。依次类推。 该模块的信号仿真图如下: 图9 仿真波形图 源程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY SELTIME IS PORT( CLK : IN STD_LOGIC; DIN : IN STD_LOGIC_VECTOR(31 DOWNTO 0); DAOUT: OUT STD_LOGIC_VECTOR(3 DOWNTO
15、 0); SEL : OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END SELTIME; ARCHITECTURE behav OF SELTIME IS SIGNAL SEC : STD_LOGIC_VECTOR(2 DOWNTO 0); BEGIN PROCESS(CLK) BEGIN IF(CLK'EVENT AND CLK='1') THEN IF(SEC="111") THEN SEC<="000"; ELSE SEC<=SEC+1; END IF; EN
16、D IF; END PROCESS; PROCESS(SEC,DIN(31 DOWNTO 0)) BEGIN CASE SEC IS WHEN "000"=>DAOUT<=DIN(3 DOWNTO 0); WHEN "001"=>DAOUT<=DIN(7 DOWNTO 4); WHEN "010"=>DAOUT<=DIN(11 DOWNTO 8); WHEN "011"=>DAOUT<=DIN(15 DOWNTO 12); WHEN "100"=>DAOUT<=DIN(19 DOWNTO 16); WHEN "101"=>DAOUT<=DIN(23 DOWNTO 20)
17、 WHEN "110"=>DAOUT<=DIN(27 DOWNTO 24); WHEN "111"=>DAOUT<=DIN(31 DOWNTO 28); WHEN OTHERS=>NULL; END CASE; END PROCESS; SEL<=SEC; END behav; (5) 七段数码管译码显示的功能模块图及其源程序 图10 功能模块图 作用: 将实验结果使用数码管直观的显示出来。 该模块的信号仿真图如下: 图11 仿真波形图 源程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; U
18、SE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY LED7 IS PORT(DIN:IN STD_LOGIC_VECTOR(3 DOWNTO 0); DOUT:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END LED7; ARCHITECTURE behav OF LED7 IS --SIGNAL LED7:STD_LOGIC_VECTOR(6 DOWNTO 0); BEGIN PROCESS(DIN) BEGIN CASE DIN IS WHEN "0000"=>DOUT<="0111111"; WHEN "00
19、01"=>DOUT<="0000110"; WHEN "0010"=>DOUT<="1011011"; WHEN "0011"=>DOUT<="1001111"; WHEN "0100"=>DOUT<="1100110"; WHEN "0101"=>DOUT<="1101101"; WHEN "0110"=>DOUT<="1111101"; WHEN "0111"=>DOUT<="0000111"; WHEN "1000"=>DOUT<="1111111"; WHEN "1001"=>DOUT<="1101111"; WHEN "1010"=>DOUT<="1110111";
20、 WHEN "1011"=>DOUT<="1111100"; WHEN "1100"=>DOUT<="0111001"; WHEN "1101"=>DOUT<="1011110"; WHEN "1110"=>DOUT<="1111001"; WHEN "1111"=>DOUT<="1110001"; WHEN OTHERS=>NULL; END CASE; END PROCESS; END ARCHITECTURE behav; (6) 3-8译码器的功能模块图及其源程序 图12 功能模块图 作用: 利用3-8译码器将数码管的位选信号选通。 该模块的信号仿真图
21、如下: 图13 仿真波形图 源程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY LS138 IS PORT(Q: IN STD_LOGIC_VECTOR(2 DOWNTO 0); D: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); dp:OUT STD_LOGIC); END LS138; ARCHITECTURE behav OF LS138 IS BEGIN WITH Q SE
22、LECT D<="11111110" WHEN "000", "11111101" WHEN "001", "11111011" WHEN "010", "11110111" WHEN "011", "11101111" WHEN "100", "11011111" WHEN "101", "10111111" WHEN "110", "01111111" wHEN "111", "11111111" WHEN OTHERS; WITH Q SELECT dp<='1' WHEN "001", '0' WHEN OTHERS; EN
23、D behav; 六、 顶层模块图 图14 总体设计顶层模块图 其中8个十进制计数器模块JSQ的底层模块图如图15所示: 图15 计数器模块原理图 本次课程设计的时钟信号由试验箱上面的5MHz的晶振提供, 经过系统时钟和控制模块后分别产生0.05Hz和10kHz的脉冲信号0.05Hz的脉冲信号十进制计数器的使能信号, 使计数器统计出待测信号在1s脉宽之间的脉
24、冲数目。再由计数模块将测得的信号传送给数码管显示部分, 经过译码模块产生能够在数码管上显示的BCD码。而1kHz是作为数码管动态扫描的频率, 由于人的视觉暂留现象, 频率较高时, 数码管看起来就是连续发光。本设计中使个位显示为数码管的小数点后面一位, 由此实现了频率分辨率为1Hz的频率计设计。 结论 EDA技术是电子设计的发展趋势, 利用EDA工具能够代替设计者完成电子系统设计中的大部分工作。EDA工具从数字系统设计的单一领域, 发展到今天, 应用范围己涉及模拟、 微波等多个领域, 能够实现各个领域电子系统设计的测试、 设计仿真和布局布线等, 这些都是我在这次课设中深刻
25、体会到的。经过这次课程设计, 让我真正认识了EDA这门学科, 了解到这种方式下的设计方案, 硬件电路简洁, 集成度高, 体现了当今社会所需的先进技术, 日后必定在有着广阔的发展空间。 经过这次对EDA课程设计的进一步操作, 能更好的在Quartus II上进行VHDL程序的编译及各个模块的仿真, 虽然在实际操作过程中由于粗心造成了程序的缺失和错误, 但都在老师和同学的帮助下一一解决了。很好地巩固了我们学过的专业知识, 使我对数字系统结构也有了更进一步的了解和认识, 同时对数据库软件EDA技术、 VHDL等系列知识都有了一定的了解。使用EDA技术开发页面的能力也有了很大提高, 也使我们把理论与
26、实践从真正意义上相结合了起来; 考验了我们借助互联网络搜集、 查阅相关文献资料, 和组织材料的综合能力。 在这次课程设计中, 虽然应用的都是在书本上学过的知识, 可是只有应用到实际中才算真正的学懂了这些知识。本次数字频率计的涉及到了VHDL语言、 Quartus II软件, EDA技术等。涉及了微机原理和EDA所学的大部分内容。经过这次课程设计实践巩固了学过的知识并能够较好的利用。课程设计实践不单是将所学的知识应用于实际, 在设计的过程中, 只拥有理论知识是不够的。逻辑思维、 电路设计的步骤和方法、 考虑问题的思路和角度等也是很重要, 需要我们着重注意锻炼的能力。在这次设计中还发现理论与实际常常常存在很大差距, 为了使电路正常工作, 必须灵活运用原理找出解决方法。 在课题设计中, 经过使用Quartus II这个完全集成化、 易学易用的可编程逻辑设计环境, 利用VHDL语言设计完成八位十进制数字频率计, 能够较好的测定所给频率, 而且具有自动清零和自动测试的功能, 基本符合此次课程设计给出的要求。






