EDA课程设计 自动量程频率计.doc_第1页
EDA课程设计 自动量程频率计.doc_第2页
EDA课程设计 自动量程频率计.doc_第3页
EDA课程设计 自动量程频率计.doc_第4页
EDA课程设计 自动量程频率计.doc_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

河北科技大学课程设计报告姓名(学号):田继辉(13)王辉(14) 王璐茜(15)王荣豪(16)专业班级: 电信132班 课程名称: EDA技术课程设计 学年学期: 20162017 学年第 2 学期 指导教师: 于国庆 2 0 16 年 6 月课程设计成绩评定表学生姓名田继辉学 号130701213成绩学生姓名王辉学 号130701214成绩学生姓名王璐茜学 号130701215成绩学生姓名王荣豪学 号130701216成绩总成绩专业班级电信132班起止时间2016/6/202016/6/23设计题目自动量程频率计指导教师评语指导教师:年 月 日基于FPGA自动量程频率计摘要: 系统基于EDA技术的自动量程频率计实现,以现场可编程门阵列(FPGA)为设计核心,集成于一片ALtera公司的ACEX系列EP1K100QC2083芯片上,采用超高速硬件描述语言(VHDL)模块化编程,实现了被测信号的频率、计数、周期测量,并显示在8个数码管上等功能。本设计的特点在于能够完成被测信号的频率手动和自动测量,当超量程和欠量程时能报警提示,并当自动模式时能自动切换到适合的量程,该系统具有集成度高、灵活性强、易于开发和维护等特点。关键字: FPGA VHDL 自动量程频率计 计数 周期测量Abstract: The system based on the EDA technique achieve the Automatic measurement frequency meter, centering on FPGA(Field Programmable Gate Array) and adopting VHDL(VHSIC Hardware Description Language) as the platform to carry out the modularization programming. The whole design integrates on the ACEX series EP1K100QC2083 chip of the ALtera company .Our design realizes the measurement of measured signal s frequency and cycle ,counting and displaying the results on the nixie tubes. This design features in achieving the measurement of frequency manually or automatically, and it can give an alarm when it over range or owe range. When you choose the automatic mode, it also can change for the suitable range. The system has the features of high integration , strong flexibility and easy to develop and maintain.Key word: FPGA VHDL Automatic range frequency meter counting periodic measurement 目录一、设计要求- 2 -二、系统设计- 3 -三、单元模块设计- 3 -基准分频模块:- 3 -被测信号2分频:- 4 -测频计数模块:- 4 -自动量程频率计:- 5 -手动量程频率计模块:- 6 -测频计数模块:- 7 -数码管动态显示模块:- 7 -计数模块:- 8 -周期测量模块:- 9 -四、仿真与调试- 11 -五、优化与约束- 13 -六、协同与分工- 13 -七、心得体会(总结)- 13 -八、参考文献- 14 -九、附录- 14 -一、 设计要求自动量程频率计设计一个3位十进制频率计,分三个基本量程:1kHz、10kHz、100kHz(读数对应 .999 、9.99、99.9,单位kHz),量程自动或手动转换。量程自动或手动转换规则:1、当读数大于999时,处于超量程状态,显示器发出溢出指示(最高位显示F),下一测量周期量程增加一档;2、当读数小于90时,处于欠量程状态,显示器发出欠量程指示(最高位显示L),下一测量周期量程减小一档;超欠量程时时声音提示。频率计同时具有计数功能,计数范围为09999999,由显示计数值时,最高位显示C;超出计数范围时,显示CF。要求:测量周期固定为500ms,3个“量程选择”键、1个“手动/自动量程” 模式选择建和1个“频率/计数”显示模式选择键以及1个“计数清零”键;量程模式状态、显示模式状态、量程状态分别由LED指示。发挥:信号周期测量、占空比测量等。二、 系统设计 基准信号选择4.19MHz频率的方波,通过分频可产生系统所需信号,数码管使用8个,动态扫描显示,可显示频率值、计数值、周期值。一个开关控制频率/计数功能切换,一个控制自动或手动量程功能,一个开关控制信号周期的显示。三个按钮可在手动量程是切换量程范围。五个LED灯分别自显示量程模式状态、显示模式状态、量程状态。另外输出连接一个蜂鸣器,当超量程或欠量程时报警提示。entity plj is port ( change:in std_logic; -手动/自动 1-自动 0-手动 cont : in std_logic; -频率/计数 1-频率 0-计数 clr:IN STD_LOGIC; -复位 zant:IN STD_LOGIC; -暂停 zhouqi:IN STD_LOGIC; -周期 clk :in std_logic; -基准 clk1:in std_logic; -被测信号 fxuan : in std_logic_vector(2 downto 0); beep: out std_logic; lcway:out std_logic_vector(2 downto 0); chgway:out std_logic; -手动/自动 亮-自动 灭-手动 xsway:out std_logic; -频率/计数 亮-频率 灭-计数 yy1:out std_logic_vector(7 downto 0); w1 :out std_logic_vector(7 downto 0); end plj;三、 单元模块设计 基准分频模块:系统基准时钟选用4.19MHz方波,分频分别产生1Hz方波、500Hz方波和1MHz方波,用于产生500ms闸门时间、数码管动态显示扫描时间和周期测量时的基准信号。产生程序如下:second:process(clk) begin if clkevent and clk=1 then -500ms闸门信号 if q2095000 then en= 1;q=q+1;flag2=0;flag3=0; elsif q=2095001 then en=0;q=q+1;flag2=0;flag3=1; elsif q4190000 then en=0; q=q+1;flag2=0;flag3=0; elsif q=4190000 then en=0; q=0;flag2=1;flag3=0; end if; end if;end process;process(clk)begin if clkevent and clk=1 then -500Hz if p=4195 then sclk= not sclk;p=0; else p=p+1; end if; end if;end process;process(clk) -1MHzbeginif clkevent and clk=1 thenif i=1 then pclk=not pclk; i=0; else i=i+1;end if;end if;end process; 被测信号2分频:被测信号没来一上升沿,clk0翻转一个,实现被测信号的2分频,用于周期测量的计数。高电平时间即被测信号周期时间。process(clk1) -被测信号2分频beginif clk1event and clk1=1 thenclk0=not clk0;end if;end process; 测频计数模块:基准信号为4.19MHz,分频产生1Hz的方波en,1Hz方波高电平期间计算被测信号上升沿个数,低电平将计数值送入数码管显示,并将计数值清零。计数范围为7位数,0-9999999。测频程序如下:and2:process(en,clk1) begin bclk=clk1 and en;end process;com:process(en,bclk,flag2) -测频 beginif en=0 and flag3=1 then a1=b1;a2=b2;a3=b3;a4=b4;a5=b5;a6=b6;a7=b7; elsif en=0 and flag2=1 then b1=0000;b2=0000;b3=0000;b4=0000;b5=0000;b6=0000;b7=0000; elsif bclkevent and bclk=1 then if b1=1000 then b1=0000; if b2=1001 then b2=0000; if b3=1001 then b3=0000; if b4=1001 then b4=0000; if b5=1001 THEN b5=0000; -flag1=1; if b6=1001 then b6=0000; if b7=1001 then b7=0000; else b7=b7+1; end if; else b6=b6+1; end if; else b5=b5+1; end if; else b4=b4+1; end if; else b3=b3+1; end if; else b2=b2+1; end if; else b10 or a70 then bcd7=1110;bcd6=1110;bcd5=1110;bcd4=1110; bcd3=1111;bcd2=1110;bcd1=1110;bcd0=1110;sss=0000;flag0 then bcd7=1110;bcd6=1110;bcd5=1110;bcd4=1110; bcd3=1110 ; bcd2=a5; bcd1=a4; bcd0=a3;sss=0010; flag0 then bcd7=1110;bcd6=1110;bcd5=1110;bcd4=1110; bcd3=1110 ; bcd2=a4; bcd1=a3; bcd0=a2;sss=0100; flag0 then bcd7=1110;bcd6=1110;bcd5=1110;bcd4=1110; bcd3=1110 ; bcd2=a3; bcd1=a2; bcd0=a1;sss=1000; flag=0;elsif a3=0000 and a29 then bcd7=1110;bcd6=1110;bcd5=1110;bcd4=1110; bcd3=1101 bcd2=a3; bcd1=a2; bcd0=a1;sss=1000;flag=1; end if; 手动量程频率计模块:首先判断量程选择按钮,当选择1KHz时,第四、五、六、七位不都为零,则数码管显示F,并蜂鸣器报警提示。第三位不为零时则正常显示,最大显示频率为.999KHz。第三位为零,并且第二位小于9,则数码管第四位显示L,后三位显示测得数据,并蜂鸣器报警提示;当选择10KHz时,第五、六、七位不都为零,则数码管显示F,并蜂鸣器报警提示。第四位不为零时则正常显示,最大显示频率为9.99KHz。第四位为零,并且第三位小于9,则数码管第四位显示L,后三位显示测得数据,并蜂鸣器报警提示;当选择100KHz时,第六、七位不都为零,则数码管显示F,并蜂鸣器报警提示。第五位不为零时则正常显示,最大显示频率为99.9KHz。第五位为零,并且第四位小于9,则数码管第四位显示L,后三位显示测得数据,并蜂鸣器报警提示。实现程序如下:if fxuan=001 then -1kHz lcway=001; bcd7=1110;bcd6=1110;bcd5=1110;bcd4=1110; bcd3=1110 ; bcd2=a3; bcd1=a2; bcd0=a1;sss0 or a50 or a60 or a70 then bcd3=1111 ; bcd2=1110; bcd1=1110; bcd0=1110;sss=0000;flag=1; elsif a3=0000 and a29 then bcd3=1101 ; bcd2=a3; bcd1=a2; bcd0=a1;sss=1000;flag=1;else flag=0;end if; elsif fxuan=010 then -10kHz lcway=010; bcd7=1110;bcd6=1110;bcd5=1110;bcd4=1110; bcd3=1110 ; bcd2=a4; bcd1=a3; bcd0=a2;sss0 or a60 or a70 then bcd3=1111 ; bcd2=1110; bcd1=1110; bcd0=1110;sss=0000;flag=1;elsif a4=0000 and a39 and a29 then bcd3=1101 ; bcd2=a4; bcd1=a3; bcd0=a2;sss=0100;flag=1;else flag=0;end if;elsif fxuan=100 then -10kHz lcway=100; bcd7=1110;bcd6=1110;bcd5=1110;bcd4=1110; bcd3=1110 ; bcd2=a5; bcd1=a4; bcd0=a3;sss0 or a70 then bcd3=1111 ; bcd2=1110; bcd1=1110; bcd0=1110;sss=0000;flag=1; elsif a5=0000 and a49 and a39 then bcd3=1101 ; bcd2=a5; bcd1=a4; bcd0=a3;sss=0010;flag=1; else flag=0;end if;end if; 测频计数模块:测频计数模块采用7位bcd码。在1Hz高电平期间500ms内,被测信号每来一个上升沿计数值最低位加2。当每一位加满时,向高一位进位。程序如下:if b1=1000 then b1=0000; if b2=1001 then b2=0000; if b3=1001 then b3=0000; if b4=1001 then b4=0000; if b5=1001 THEN b5=0000; -flag1=1; if b6=1001 then b6=0000; if b7=1001 then b7=0000; else b7=b7+1; end if; else b6=b6+1; end if; else b5=b5+1; end if; else b4=b4+1; end if; else b3=b3+1; end if; else b2=b2+1; end if; else b1=b1+2; end if; 数码管动态显示模块:4.19MHz基准信号分频产生500Hz方波sclk。sclk每来一上升沿,qq加1,判断qq状态以选择不同的数码管显示,显示数据根据数码管译码进程显示出正确的码段。数码管动态显示模块程序如下:pp:process(sclk) beginif sclkevent and sclk=1 then qq bcd=bcd7; w1=10000000; yy1(7) bcd=bcd6; w1=01000000; yy1(7) bcd=bcd5; w1=00100000; yy1(7) bcd=bcd4; w1=00010000; yy1(7) bcd=bcd3; w1=00001000; if sss=1000 then yy1(7)=1; else yy1(7) bcd=bcd2; w1=00000100; if sss=0100 then yy1(7)=1; else yy1(7) bcd=bcd1; w1=00000010; if sss=0010 then yy1(7)=1; else yy1(7) bcd=bcd0; w1=00000001; yy1(7) null; end case;end process wx;m0: process (bcd) begin case bcd is when 0000=yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)yy1(6 downto 0)=0000000; -空 end case;end process; 计数模块:被测信号每来一上升沿,计数值最低位加1,当每一位加满时,向高一位进位。当暂停键按下时,计数值最低位不变,当复位键按下时,计数值清零,实现程序如下:js:PROCESS(cont,clk1,clr) -计数 VARIABLE d1,d2,d3,d4,d5,d6,d7:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN if clr=1 THEN d1:=0000; d2:=0000; d3:=0000; d4:=0000; d5:=0000; d6:=0000; d7:=0000; flag4=0;ELSIF clk1event and clk1=1 THENIF zant=1 THEN d1:=d1;ELSIF d11001 THEN d1:=d1+1;ELSE d1:=0000;IF d21001 THEN d2:=d2+1;ELSE d2:=0000;IF d31001 THEN d3:=d3+1;ELSE d3:=0000;IF d41001 THEN d4:=d4+1;ELSE d4:=0000;IF d51001 THEN d5:=d5+1;ELSE d5:=0000;IF d61001 THEN d6:=d6+1;ELSE d6:=0000;IF d71001 THEN d7:=d7+1;ELSE d7:=0000;flag4=1;END IF;END IF;END IF;END IF;END IF;END IF;END IF;END IF;IF flag4=1 THEN c8=1100; c7=1111;c6=1110;c5=1110;c4=1110;c3=1110 ;c2=1110; c1=1110;ELSE c1=d1; c2=d2; c3=d3; c4=d4; c5=d5; c6=d6; c7=d7;c8=1100;END IF;END PROCESS js; 周期测量模块:被测信号每来一上升沿判断此时1.0475MHz是否为1,为1则计数值加1 ,为零则将计数值送入数码管显示并清零。程序如下:process(pclk,clk0) -周期variable e1,e2,e3,e4,e5,e6,e7:std_logic_vector(3 downto 0); variable z: std_logic :=1 ;variable zz:integer range 0 to 25;begin IF pclkevent and pclk=1 then if clk0=1 then flag5=0; IF e11001 THEN e1:=e1+z;zz:=zz+1; ELSE e1:=0000; IF e21001 THEN e2:=e2+1; ELSE e2:=0000; IF e31001 THEN e3:=e3+1; ELSE e3:=0000; IF e41001 THEN e4:=e4+1; ELSE e4:=0000; IF e51001 THEN e5:=e5+1; ELSE e5:=0000; IF e61001 THEN e6:=e6+1; ELSE e6:=0000; IF e71001 THEN e7:=e7+1; ELSE e7:=0000; END IF; END IF; END IF; END IF; END IF; END IF; END IF; if zz=25 then z:=0; else z:=1; end if;elsif clk0=0 and flag5=0 then f7=e7;f6=e6;f5=e5;f4=e4;f3=e3;f2=e2;f1=e1;flag5=1; e7:=0000;e6:=0000;e5:=0000;e4:=0000;e3:=0000;e2:=0000;e1:=0000; end if; end if;end process;四、 仿真与调试五、 优化与约束对于信号频率测量,设计要求选用500ms的闸门时间,这样方便计数,被测信号每来一个上升沿,计数值加1,但是同时计数值应加2,这样就会使测量结果产生2的测量误差,增加了测量结果的跳变幅度。对于脉冲计数,我们组做了一些改进,增加了计数暂停、复位按钮。当调到计数显示时,可随时暂停,以便观察数值;当计数值满时显示CF,可由按键清零,重新计数。测量信号周期时,我们组想用10MHz或1MHz的基准脉冲频率,而实验开发平台上提供的最大频率只有4.19MHz,最大整分频为10KHz,远远不能达到我们的要求,这样导致被测周期是被测信号频率不能大于10KHz,大大限制了我们的测量范围。因此,我们组最后决定选用4.19MHz的频率信号通过4分频产生1.0475MHz的基准信号,但是导致我们的测量误差为4.57%。因此,我们又在计数上做了一些改善,每计满25个数,计数值减1,最终使测量误差变为0.75%,在一定程度上减小了误差。存在硬件的原因,基本上勉强达到要求。由于时间的原因,我们的扩展部分只做了信号周期测量,对于占空比测量没有做,因为占空比需要考虑BCD码的除法,还需要确定高电平持续时间以及逻辑实现。我相信再给我们一定的时间,我们一定能完成信号占空比的测量。六、 协同与分工田继辉:负责数码管动态扫描 信号周期测量模块及整体框架设计 王 辉:负责频率计数模块 蜂鸣器脉冲模块 王璐茜:负责自动和手动的量程频率计模块实现 王荣豪:负责基准模块 信号分频处理 七、 心得体会(总结)经过四天辛苦但是很充实的EDA课程设计,我们有很多感想,那种每天从早上忙到半夜几乎一天一顿饭有时在实验室一待就是一整天连续几天没有睡午觉的感觉非经历无法体会。经过这次EDA课程设计,我们对于VHDL语言的理解与应用有了更深层次的理解,不仅让我们看到了自己经过努力取得的成果,而且也让我们整个小组的合作更加协调,更能提升自己的能力。在这次EDA课程设计中,我们组的题目是“自动量程频率计”,刚拿到这个题目时,有种措手不及、茫然无措、摸不着头脑的感觉,完全无从下口,下手。不过经过刚开始的适应后,我们小组先后是从网上和课本上找寻有关自动量程频率计的一切知识。通过向同学请教、向学长学姐咨询、向互联网求教,在现实中寻求答案、在虚拟世界中发现问题的解决方案,我们才一点一点地明白了这个课程设计题目的内涵。然后我们小组就开始布置每个人的任务,让每个成员都可以动起来,参与整个课程设计。每位成员都需要事先写好自己所负责的模块,然后由组长田继辉将这些模块程序进行汇总、调用,在已确定的总体架构的基础上布置。当我们将整个程序综合起来时才发现程序中竟然出现了30多个错误!不能忍受,慢慢修改、调试吧。修改程序是一个大的工程,但我们只能一点一点地一个个的更改实验,重复这个过程很麻烦而且费时。之后,我们将各个模块汇总起来,形成了一个完整的测频体系。然后波形仿真,程序验证与下载,还要记录实验过程,繁忙但是感觉却很充实。我们每天都在不断重复犯错误,寻找解决问题的方法以及更改程序的过程中度过。在周一至周四这四天的努力下,我们终于把课程设计的基础部分做完了。对于发挥部分,说实话感觉难度还是很大的,尤其是信号占空比测量需要使用除法,而BCD除法的实现由一定的难度。占空比,即在一个周期内高电平占总时间的比例。这次课设,我们组由于进行了合理的人员分工,使得每个成员都能尽自己所能,认真地负责自己所要负责的模块,使得每个人都能扬自己之所长,尽自己之所学,都能有所收获。整个过程中,我们组里成员之间合作很愉快,每个人都发挥了自己的作用,充分展示了自己的才能,培养了我们的团队意识,复习了EDA的书本知识,锻炼了自己的身体力行能力,更进一步地掌握了VHDL这门强类型硬件描述语言的作用。最后,感谢于国庆老师的细心教导与孜孜不倦地询问以及同学之间的互相帮助,还要感谢小组成员间的互相鼓励与支持。总之,我们的不懈努力和团队协作为这次课程设计画上了一个圆满的句号。八、 参考文献1数字设计基础(双语教学版) 机械工业出版社2电子测量技术基础(第二版) 张永瑞 西安电子科技大学出版社3EDA技术与VHDL语言(第2版) 潘松 清华大学出版社4VHDL编程实例(第4版) Douglas L. Petty著 杨承恩 译九、 附录最终程序完整版:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity plj is port ( change:in std_logic; -手动/自动 1-自动 0-手动 cont : in std_logic; -频率/计数 1-频率 0-计数 clr:IN STD_LOGIC; -复位 zant:IN STD_LOGIC; -暂停 zhouqi:IN STD_LOGIC; -周期 clk :in std_logic; -基准 clk1:in std_logic; -被测信号 fxuan : in std_logic_vector(2 downto 0); beep: out std_logic; lcway:out std_logic_vector(2 downto 0); chgway:out std_logic; -手动/自动 亮-自动 灭-手动 xsway:out std_logic; -频率/计数 亮-频率 灭-计数 yy1:out std_logic_vector(7 downto 0); w1 :out std_logic_vector(7 downto 0); end plj;architecture behav of Plj issignal b1,b2,b3,b4,b5,b6,b7:std_logic_vector(3 downto 0);signal a1,a2,a3,a4,a5,a6,a7:std_logic_vector(3 downto 0); signal c1,c2,c3,c4,c5,c6,c7,c8:std_logic_vector(3 downto 0); signal f1,f2,f3,f4,f5,f6,f7:std_logic_vector(3 downto 0); signal bcd:std_logic_vector(3 downto 0); signal q :integer range 0 to 4190000; signal p :integer range 0 to 4195; signal zq:integer range 0 to 9000000 :=0; signal i: integer range 0 to 2; signal qq :std_logic_vector(2 downto 0); signal en,bclk,sclk,clk0,pclk:std_logic; -clk0-被测信号2分频,sclk-500Hz,pclk-1MHzsignal flag,flag2,flag3,flag4,flag5:std_logic; -flag频率溢出标志 蜂鸣器 ,flag2-清零标志 ,flag3-geishu, flag4-计数溢出 ,flag5-1MHz下降沿 signal sss : std_logic_vector(3 downto 0); signal bcd0,bcd1,bcd2,bcd3,bcd4,bcd5,bcd6,bcd7 : std_logic_vector(3 downto 0); beginsecond:process(clk) begin if clkevent and clk=1 then -500ms闸门信号 if q2095000 then en= 1;q=q+1;flag2=0;flag3=0; elsif q=2095001 then en=0;q=q+1;flag2=0;flag3=1; elsif q4190000 then en=0; q=q+1;flag2=0;flag

温馨提示

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

最新文档

评论

0/150

提交评论