VHDL第3次作业题目数字频率计_第1页
VHDL第3次作业题目数字频率计_第2页
VHDL第3次作业题目数字频率计_第3页
VHDL第3次作业题目数字频率计_第4页
VHDL第3次作业题目数字频率计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、西安电子科技大学VHDL数字系统设计与测试作业 题 目 数字频率计 学 院 电子工程学院 专 业 电子与通信工程 学 号 学生姓名 授课教师 钟桦 撰写日期: 2015 年 6 月 9 日 数字频率计题目要求:1.用VHDL完成12位十进制数字频率计的设计及仿真。2.频率测量范围:1Hz10KHz,分成两个频段,即1999Hz,1KHz10KHz,用三位数码管显示测量频率,用LED显示表示单位,如亮绿灯表示Hz,亮红灯表示KHz。3.具有自动校验和测量两种功能,即能用标准时钟校验、测量精度。4.具有超量程报警功能,在超出目前量程档的测量范围时,发出灯光和音响信号。问题分析:测量频率的基本原理是

2、在单位时间内检测信号的脉冲个数,计数器对CP1信号进行计数,在1秒定时结束后,将计数器结果送锁存器锁存,同时将计数器清零,为下一次采样测量做好准备。根据题目要求,将系统分为以下几个模块:1、测量/校验选择模块(selett)2、测频控制信号发生器(二分频)(fenpin)3、与电路模块(andd)4、计数器模块(counter)5、送存选择、报警模块(tostore)6、锁存模块(lockstore)7、扫描显示模块(scann)通过以上分析,给出各模块程序代码,并对各个模块进行分别叙述说明。1、 测量/校验选择模块(selett)输入信号:选择信号selet被测信号meas测试信号test输

3、出信号:cp1当selet=0时,为测量状态,cp1=meas;当selet=1时,为校验状态,cp1=test。校验与测量共用一个电路,只是被测信号cp1不同而已。-测量/校验选择library ieee;use ieee.std_logic_1164.all;entity selett is port(selet,test,meas:in std_logic; cp1:out std_logic);end selett;architecture behv of selett is -type statetype is(meas,test); -signal present_state,ne

4、xt_state:statetype:=meas; begin process(selet) begin case selet is when '1'=>cp1<=test; when '0'=>cp1<=meas; when others=>cp1<=null; end case; end process;end behv;仿真验证其正确性从上图可以看出,当selet=0时,cp1输出信号为meas,当selet=1时,输出信号为test,符合设计要求。2、测频控制信号发生器(二分频)(fenpin)输入信号:1HZ时钟信号

5、(clk)输出信号:1秒定时信号(周期为2秒)(clk_out)此模块实际上就是一个二分频的计数器,代码如下:-分频library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity fenpin is port(clk:in std_logic; clk1:out std_logic);end fenpin;architecture behav of fenpin isbegin process(clk) variable count:integer:=1; begin if(clk'even

6、t and clk='1') then if count=1 then count:=0; clk1<='1' else count:=count+1; clk1<='0' end if; end if; end process;end behav;仿真验证其正确性由仿真结果可以看出,二分频电路正确,符合设计要求。3、与电路模块(andd)输入信号:二分频时钟(clk2), 测量/校验选择模块输出信号(cp2)输出信号:与信号(cp)代码如下:-与电路library ieee;use ieee.std_logic_1164.all;e

7、ntity andd is port(clk2,cp2:in std_logic; cp:out std_logic);end andd;architecture behv of andd isbegin cp<=clk2 and cp2;end behv;仿真验证其正确性由仿真结果可以看出,与电路正确,符合设计要求。4、计数器模块(counter)由题目要求,计数的范围应该是00009999,因此,计数器模块的内部应由四个十进制计数器q4,q3,q2,q1组成。另外,由于系统设置了溢出信号c。输入信号:计数时钟(cp)。 片选信号(rd)输出信号:计数输出信号千位:q4,百位:q3,十

8、位:q2,个位:q1溢出信号:c代码如下-计数library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity counter is port(rd,cp:in std_logic; c:out std_logic; q4,q3,q2,q1:out std_logic_vector(3 downto 0);end counter;architecture behv of counter is signal c1,c2,c3,c4:std_logic; begin cnt1:process(rd,cp)

9、 variable cn1:std_logic_vector(3 downto 0); begin if rd='1' then if cp'event and cp='1' then if cn1="1001" then cn1:="0000" c1<='1' else cn1:=cn1+1; c1<='0' end if; end if; end if; q1<=cn1; end process cnt1;cnt2:process(c1,rd) variable

10、 cn2:std_logic_vector(3 downto 0);begin if rd='1' then if c1'event and c1='1' then if cn2="1001" then cn2:="0000" c2<='1' else cn2:=cn2+1; c2<='0' end if; end if; - else -cn2:="0000" -c2<='0' end if; q2<=cn2;end pr

11、ocess cnt2;cnt3:process(c2,rd) variable cn3:std_logic_vector(3 downto 0);begin if rd='1' then if c2'event and c2='1' then if cn3="1001" then cn3:="0000" c3<='1' else cn3:=cn3+1; c3<='0' end if; end if; end if; q3<=cn3;end process cnt3;

12、cnt4:process(c3,rd) variable cn4:std_logic_vector(3 downto 0);begin if rd='1' then if c3'event and c3='1' then if cn4="1001" then cn4:="0000" c<='1' else cn4:=cn4+1; c<='0' end if; end if; end if; q4<=cn4;end process cnt4;end behv;仿真验证

13、其正确性从仿真结果可以看出,rd=1时计数,rd=0时不计数。设定rd的周期为1us,cp的周期为10ns,则在rd=1的时间内应该计数50次,从图中可以看出仿真结果符合预期。5、送存选择、报警模块(tostore)输入信号:量程档控制开关(k)四位十进制信号(qb4,qb3,qb2,qb1)溢出信号输入(cc)输出信号:三位十进制信号(dd3,dd2,dd1)报警信号(alert)当k=0时,选择1999Hz量程,输出信号为qb3,qb2,qb1,如果qb4>0,报警.当k=1时,选择1K10KHz量程,输出信号为qb4,qb3,qb2,如果c>0,报警。代码如下:-存送选择、报

14、警电路library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity tostore is port(qb4,qb3,qb2,qb1:in std_logic_vector(3 downto 0); cc,k:in std_logic; dd3,dd2,dd1:out std_logic_vector(3 downto 0); alert:out std_logic);end tostore;architecture behv of tostore is begin process(qb4,qb3,

15、qb2,qb1,cc,k) begin if k='0' then dd3<=qb3; dd2<=qb2; dd1<=qb1; if qb4>"0000" or cc>'0' then alert<='1' else alert<='0' end if; elsif k='1' then dd3<=qb4; dd2<=qb3; dd1<=qb2; if cc>'0' then alert<='1

16、9; else alert<='0' end if; else alert<='0' end if; end process;end behv; 仿真验证其正确性仿真中设定qb4=4,qb2=2,qb3=3,qb1=1,从仿真结果图中可以看出,当k=0时, dd3=qb3, dd2=qb2, dd1=qb1,应为qb4>0,所以报警信号alert=1;当k=1时,dd3=qb4,dd2=qb3,dd1=qb2,当cc=0时,报警信号alert=0,当cc>0时,报警,alert=1。因此,仿真结果符合要求。6、锁存模块(lockstore

17、)输入端口:片选信号(ld)量程选择开关(k)输入数据(d3,d2,d1)输出端口:输出数据(data3,data2,data1) 绿灯(led_green)-表示单位hz 红灯(led_red)-表示单位Khz代码如下-锁存电路library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity lockstore is port(ld,k:in std_logic; d3,d2,d1:in std_logic_vector(3 downto 0); data3,data2,data1:out std_

18、logic_vector(3 downto 0); led_green,led_red:out std_logic);end lockstore;architecture behv of lockstore is begin process(d3,d2,d1,ld,k) begin if(ld='1') then data3<=d3; data2<=d2; data1<=d1; if k='0' then led_green<='1' -led_green->hz led_red<='0' -l

19、ed_red-Khz else led_green<='0' -led_green->hz led_red<='1' -led_red-Khz end if; end if; end process;end behv;仿真验证其正确性片选信号ld=1时,data3=d3,data2=d2,data1=d1,当k=0时绿灯亮,选择的单位为hz;当k=1时,红灯亮,选择的单位为Khz。所以,由上图可以,仿真结果符合要求。7、扫描显示模块(scann)此模块要完成三件事情:(1) 通过扫描时钟产生数码管扫描信号。(2) 显示小数点(3) 七段译码由于

20、显示的数码管要加上小数点,因此,要在译码产生的7位数之后加上一位point,point的值由k和扫描信号有关,当k=1,扫描信号=110时,point=1,其他情况都为0。输入端口:扫描时钟(clkk) 单位选择开关(k) 输入数据(d_3,d_2,d_1)输出端口:扫描信号(selout) 数码管(led) 小数点(point)代码如下:-扫描显示电路library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity scann is port(clkk,k:in std_logic; d_3,d_2

21、,d_1:in std_logic_vector(3 downto 0); -qq:out std_logic_vector(3 downto 0); selout:out std_logic_vector(2 downto 0); led:out std_logic_vector(6 downto 0); point:out std_logic); end scann;architecture behv of scann is signal qq:std_logic_vector(3 downto 0); signal sel:std_logic_vector(1 downto 0); si

22、gnal selout2:std_logic_vector(2 downto 0); -signal point1:std_logic;begin p1:process(clkk,d_3,d_2,d_1) variable scannum:std_logic_vector(1 downto 0); variable qq1:std_logic_vector(3 downto 0); begin if clkk'event and clkk='1' then if scannum="10" then scannum:="00" el

23、se scannum:=scannum+1; end if; end if; case scannum is when "00"=>qq1:=d_1; when "01"=>qq1:=d_2; when "10"=>qq1:=d_3; when others=>qq1:=null; end case; sel<=scannum; qq<=qq1; end process p1; p2:process(sel) variable selout1:std_logic_vector(2 downto 0)

24、; -variable scannum:std_logic_vector(1 downto 0); begin -if clkk'event and clkk='1' then -if scannum="10" then - scannum:="00" - else - scannum:=scannum+1; - end if; - end if; case sel is when "00"=>selout1:="001" when "01"=>selout1

25、:="010" when "10"=>selout1:="100" when others=>selout1:=null; end case; selout2<=selout1; end process p2; selout<=selout2; p3:process(selout2,k) begin if(k='1' and selout2="100") then point<='1' else point<='0' end if;

26、 end process p3; p4:process(qq) begin case qq is when "0000"=>led<="0111111"&point; when "0001"=>led<="0000110"&point; when "0010"=>led<="1011011"&point; when "0011"=>led<="1001111"&am

27、p;point; when "0100"=>led<="1100110"&point; when "0101"=>led<="1101101"&point; when "0110"=>led<="1111101"&point; when "0111"=>led<="0000111"&point; when "1000"=>led&l

28、t;="1111111"&point; when "1001"=>led<="1101111"&point; when others=>led<="0000000"&point; end case; end process p4;end behv;仿真验证其正确性仿真设定输入d_1=4,d_2=5,d_3=6,从仿真结果可以看出扫描和译码正确;从图中可以看出只有当selout=100,k=1同时成立时,小数点才显示。因此,仿真结果符合要求。8、顶层模块顶层模块代码-t

29、op circuit descriptionlibrary ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity freqcounter is port(clk,clkk,meas,test,selet,k:in std_logic; led:out std_logic_vector(7 downto 0); selout:out std_logic_vector(2 downto 0); alert,led_green,led_red,point:out std_logic); -clk1,cp1:ou

30、t std_logic; -dd3,dd2,dd1:out std_logic_vector(3 downto 0); -data3,data2,data1:out std_logic_vector(3 downto 0); -q4,q3,q2,q1:out std_logic_vector(3 downto 0); end freqcounter;architecture behv of freqcounter is signal s1,s2,s3,s4:std_logic; signal sq1,sq2,sq3,sq4:std_logic_vector(3 downto 0); signa

31、l sd1,sd2,sd3:std_logic_vector(3 downto 0); signal sdd1,sdd2,sdd3:std_logic_vector(3 downto 0); signal sled:std_logic_vector(3 downto 0);component fenpin is port(clk:in std_logic; clk1:out std_logic);end component fenpin;component selett is port(selet,test,meas:in std_logic; cp1:out std_logic); end

32、component selett; component andd is port(clk2,cp2:in std_logic; cp:out std_logic); end component andd; component counter is port(rd,cp:in std_logic; c:out std_logic; q4,q3,q2,q1:out std_logic_vector(3 downto 0); end component counter; component tostore is port(qb4,qb3,qb2,qb1:in std_logic_vector(3 d

33、ownto 0); cc,k:in std_logic; dd3,dd2,dd1:out std_logic_vector(3 downto 0); alert:out std_logic); end component tostore; component lockstore is port(ld,k:in std_logic; d3,d2,d1:in std_logic_vector(3 downto 0); data3,data2,data1:out std_logic_vector(3 downto 0); led_green,led_red:out std_logic); end c

34、omponent lockstore; component scann is port(clkk,k:in std_logic; d_3,d_2,d_1:in std_logic_vector(3 downto 0); selout: out std_logic_vector(2 downto 0); led:out std_logic_vector(7 downto 0); end component scann; begin u1:fenpin port map(clk=>clk,clk1=>s1); u2:selett port map(selet=>selet,test=>test,meas=>meas,cp1=>s2); u3:andd port map(clk2=>s1,cp2=>s2,cp=>s3); u4:counter port map(rd=>s1,cp=>s3,c=>s4,q4=>sq4,q3=>sq3,q2=>sq2,q1=>sq1); u5:tostore port map(qb4=>sq4,qb3=>sq3,qb2=>sq2,qb1=>sq1,cc=>s4,k=>k,dd3=>sd3,dd2=&g

温馨提示

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

评论

0/150

提交评论