第一篇:EDA简易数字频率计~课设报告
EDA课程设计~简易数字频率计
《EDA技术》课程设计报告
题目:简易数字频率计
专业:
本组成员:
简述
EDA课程设计~简易数字频率计
随着数字电子技术的发展,频率测量成为一项越来越普遍的工作,因此测频计常受到人们的青睐。目前许多高精度的数字频率计都采用单片机加上外部的高速计数器来实现,然而单片机的时钟频率不高导致测频速度比较慢,并且在这种设计中,由于PCB版的集成度不高,导致PCB板走线长,因此难以提高计数器的工作频率。为了克服这种缺点,大大提高测量精度和速度,我们可以设计一种可编程逻辑器件来实现数字频率计。
EDA技术是以大规模可编程逻辑器件为设计载体,以硬件语言为系统逻辑描述的主要方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件设计的电子系统到硬件系统的设计,最终形成集成电子系统或专用集成芯片的一门新技术。其设计的灵活性使得EDA技术得以快速发展和广泛应用。以QUARTUSII软件为设计平台,采用VHDL语言实现数字频率计的整体设计。
EDA技术已经广泛应用于模拟与数字电路系统等许多领域。电子设计自动化是一种实现电子系统或电子产品自动化设计的技术,它与电子技术,微电子技术的发展密切相关,它吸收了计算机科学领域的大多数最新研究成果,以高性能的计算机作为工作平台,促进了工程发展。EDA的一个重要特征就是使用硬件描述语言(HDL)来完成的设计文件,VHDL语言是经IEEE确认的标准硬件语言,在电子设计领域受到了广泛的接受。
1.设计概述
EDA课程设计~简易数字频率计
1.1设计原理
在电子技术中,频率是最基本的参数之一,并且与许多电参量的测量方案、测量结果都有十分密切的关系,因此,频率的测量就显得更为重要。测量频率的方法有多种,其中电子计数器测量频率具有精度高、使用方便、测量迅速,以及便于实现测量过程自动化等优点,是频率测量的重要手段之一。
数字式频率计的测量原理有两类:一是直接测频法,即在一定闸门时间内测量被测信号的脉冲个数;二是间接测频法即测周期法,如周期测频法。直接测频法适用于高频信号的频率测量,通常采用计数器、数据锁存器及控制电路实现,并通过改变计数器阀门的时间长短在达到不同的测量精度;间接测频法适用于低频信号的频率测量。
本设计中使用的就是直接测频法,即用计数器在计算1s内输入信号周期的个数,其测频范围为1Hz~9999Hz。
1.2原理框图
1.3 系统原理图
系统原理图仿真
EDA课程设计~简易数字频率计
分析说明:clk为1HZ,待测信号sig为10HZ 1.5 引脚图
2.设计思路
频率测量的基本原理是计算每秒钟内待测信号的脉冲个数。这就要求测频控制信号发生器testpl的计数使能信号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控制锁存器内数据的输出。
仿真图如下:
EDA课程设计~简易数字频率计
3.2 十进制计数器cnt10模块:
有一时钟使能输入端en,用于锁定计数值。当高电平“1”时计数允许计数,低电平“0”时禁止计数。多位十进制计数器时,最低位的计数器的clk端输入被测信号,各计数器的进位输出端c10将信号输到下一位十进制计数器cnt10的输入端clk,最高位十进制计数器cnt10的进位输出端c10不处理。
仿真图如下:
3.3 16位锁存器reg16b模块:将已有16 位bcd码存在于此模块的输入口din[15..0],在信号load的上升沿后即被锁存到寄存器reg16b的内部,并由reg16b的输出端dout[15..0]输出,设置锁存器的好处是,数码管上显示的数据稳定,不会由于周期性的清零信号而不断闪烁。
仿真图如下:
EDA课程设计~简易数字频率计
3.4 数码管控制器ledcom模块:两个输入端一个为datain[15..0],另一个为数码管显示选择的扫描频率输入端clk,输出端为数码管选择信号com[3..0]和对应显示的数码管的BCD码信号端dataout[3..0],数码管显示选择随扫描频率clk循环变化,实现稳定显示。
仿真图如下:
3.5
译码器ymq模块:输入端d_in[3..0]将接收BCD码信号,译码后输出端d_out[7..0]输出8为7段数码管信号,其中输出的第8位均为高电平“1”可以使四个数码管的小数点不显示。经译码器的处理输出后数码管显示相应的数值。
EDA课程设计~简易数字频率计
4.VHDL顶层文件:
library ieee;use ieee.std_logic_1164.all;entity lx is port(clk: in std_logic;led: out std_logic_vector(7 downto 0);ledc: out std_logic_vector(2 downto 0));end lx;architecture art of lx is--十进制计数器
component cnt10--待调用的有时钟使能的十进制计数器端口定义
port(clk,clr,en: in std_logic;q: out std_logic_vector(3 downto 0);c10: out std_logic);end component;--16位锁存器
component reg16b--待调用的32位锁存器端口定义 port(load: in std_logic;din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end component;--测频控制器
component testpl--待调用的测频控制信号发生器端口定义 port(clk:in std_logic;
EDA课程设计~简易数字频率计
tsten:out std_logic;clr_cnt:out std_logic;load:out std_logic);end component;--数码管选择器
component ledcom--待调用的数码管选择器端口定义 port(clk:in std_logic;datain: in std_logic_vector(15 downto 0);dataout: out std_logic_vector(3 downto 0);sel: out std_logic_vector(2 downto 0));end component;--译码器
component ymq--待调用的译码器端口定义 port(d_in: in std_logic_vector(3 downto 0);d_out: out std_logic_vector(7 downto 0));end component;signal clk1,clk2,clk3: std_logic;--clk1为1Hz信号,clk2为被测信号,clk3为数码管扫描信号
signal tsten,clr,load: std_logic;signal c1,c2,c3,c4: std_logic;signal qout,rout: std_logic_vector(15 downto 0);signal datao: std_logic_vector(3 downto 0);begin u0:testpl port map(clk1,tsten,clr,load);u1:cnt10 port map(clk2,clr,tsten,qout(3 downto 0),c1);u2:cnt10 port map(c1,clr,tsten,qout(7 downto 4),c2);u3:cnt10 port map(c2,clr,tsten,qout(11 downto 8),c3);u4:cnt10 port map(c3,clr,tsten,qout(15 downto 12),c4);u5:reg16b port map(load,qout(15 downto 0),rout);u6:ledcom port map(clk3,rout,datao,ledc);u8:ymq port map(datao,led);end art;
5.心得体会
这次课程设计中,我不仅复习巩固了课堂所学的理论知识,提高
EDA课程设计~简易数字频率计
了对所学知识的综合应用能力,并从根本上了解了VHDL语言的一些基本用法,应用了原来不会或者不熟练的句型,如if句,case句等,也学会了一些基本功能的实现方法,如分频,状态控制等等,从另外一个角度重新审视了上学期完全从硬件角度出发的电路设计,明白了软硬件之间的交互。通过这个课题,对系统框图、逻辑流程图、状态转移图的设计有了一定的了解。也懂得了系统的前期设计对于后续的编程和调试的重要性。
本课题采用了自下而上的设计方法,根据系统对硬件的要求,画出系统控制流程图;然后根据控制流程图,分化模块,利用模块实现功能;最后进行仿真和调试。
每个成功的背后都要面对无数次的失败,这次课设也不例外。虽然遇到不少问题与困难,但通过老师以及同学的帮助,都一一得到顺利地解决。我想这必定会为将来的实践积累宝贵的经验和教训。总之,这次课设我们都受益匪浅。整个过程氛围浓厚,本人也态度十分认真,积极向老师和同学求教并在此过程中收获良多,能够进一步了解和使用一门与硬件直接打交道的基本语言对我们将来的学习和工作都会十分有益。
6.五个模块的程序源代码
6.1 测频控制信号发生器
EDA课程设计~简易数字频率计
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity testpl is port(clk:in std_logic;--1Hz信号
tsten:out std_logic;--计数器使能信号 clr_cnt:out std_logic;--计数器清零信号 load:out std_logic);--锁存器输出控制信号 end testpl;architecture art of testpl is signal div2clk:std_logic;begin process(clk)begin if clk'event and clk='1'then div2clk<=not div2clk;--div2clk为2Hz end if;end process;process(clk ,div2clk)begin if(clk='0'and div2clk='0')then clr_cnt<='1';--当div2clk与clk同时为零时计数器清零 else clr_cnt<='0';--当div2clk处于的高电平时计数器计数 end if;end process;load<=not div2clk;--锁存器输出与计数器使能信号反相 tsten<=div2clk;end art;
有时钟使能的十进制计数器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt10 is port(clk,clr,en: in std_logic;--clk:计数器时钟,clr:清零信号,en:计数使能信号
q: out std_logic_vector(3 downto 0);--q:4位计数结果输出
EDA课程设计~简易数字频率计
c10: out std_logic);--计数进位
end cnt10;architecture art of cnt10 is signal cqi: std_logic_vector(3 downto 0);begin process(clk,clr)begin if clr='1' then cqi<=“0000”;--当输入的clr_cnt为低电平0时清零
elsif clk'event and clk='1' then if en='1' then--当输入的tesen为高电平1时允许计数
if(cqi<9)then cqi<=cqi+1;else cqi<=“0000”;--等于9则计数器清零
end if;--当输入的tesen为低电平0时禁止计数,锁定计数值 end if;end if;end process;--产生进位 process(cqi)begin if cqi=“1001” then c10<='1';--当加的9时产生进位输出 else c10<='0';end if;end process;q<=cqi;end art;
16位锁存器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity reg16b is port(load: in std_logic;--输出锁存控制信号 din: in std_logic_vector(15 downto 0);dout: out std_logic_vector(15 downto 0));end reg16b;
EDA课程设计~简易数字频率计
architecture art of reg16b is begin process(load,din)begin if load'event and load='1'then--load为高电平时teten为低电平,计数器禁止
dout<=din;--锁存输入的数据 end if;end process;end art;
6.4 数码管控制器
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity ledcom is port(clk:in std_logic;--数码管扫描频率
datain: in std_logic_vector(15 downto 0);--锁存器输入的16位信号 dataout: out std_logic_vector(3 downto 0);--输出至译码器的4位信号
sel: buffer std_logic_vector(2 downto 0));--输出数码管选择信号 end ledcom;architecture art of ledcom is begin--sel同扫描频率clk循环变化 process(clk)begin if rising_edge(clk)then if sel>=7 then
sel <=“000”;
else sel<=sel+1;end if;end if;
end process;--数码管选择 process(sel,datain)
begin case sel is when “000”=> dataout<=datain(3 downto 0);
EDA课程设计~简易数字频率计
when “001”=> dataout<=datain(7 downto 4);when “010”=> dataout<=datain(11 downto 8);when “011”=> dataout<=datain(15 downto 12);when others =>NULL;end case;end process;end art;
七段数码管的译码器
library IEEE;use IEEE.std_logic_1164.all;entity ymq is port(d_in: in std_logic_vector(3 downto 0);--数码管控制器输入四位信号
d_out: out std_logic_vector(6 downto 0));--输出8位信号
end ymq;--第8位d_out[7]为逗号 architecture art of ymq is begin process(d_in)begin case d_in is--第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 when others =>NULL;end case;end process;end art;7.参考文献
1、王小军 主编.《VHDL简明教程》.清华大学出版社,1997
EDA课程设计~简易数字频率计
2、潘松、王国栋 主编.《VHDL应用教程》电子科技大学出版社,2000
3、甘历 主编.《VHDL应用于开发实践》科学出版社,2003
4、刘爱荣 主编.《EDA技术与CPLD/FPGA开发应用简明教程》.清华大学出版社,2007
第二篇:EDA课设
EDA课程设计报告
课题名称:智力竞赛抢答器
班级:11电科2班
姓名:代维宽
学号:201114580207
同组人:闻仔逊
指导老师:贾默伊
任务书
一、用VHDL运用层次化设计方法设计一个小型数字系统
题目:智力竞赛抢答器
二、说明书内容:
1.系统设计要求(功能)2.系统设计方案(包括顶层电路图)3.VHDL源程序及仿真波形图 4.课程设计注释 5.设计解释、说明 6.独特之处
三、成绩评定
1.设计内容及掌握情况
2.说明书。包括电子档(各类文件的可执行性及说明书)和纸质
3.答辩情况
目录
第一章:系统设计
1系统设计要求„„„„„„„„„„„„„„„„„„„1 2系统设计方案„„„„„„„„„„„„„„„„„„„2 第二章:VHDL原程序及仿真波形图
1、抢答启动模块„„„„„„„„„„„„„„„„„„3(1)按键识别子模块„„„„„„„„„„„„„„„„„3(2)倒计时子模块„„„„„„„„„„„„„„„„„„5
2、选手抢答模块„„„„„„„„„„„„„„„„„„7(1)单个选手按键子模块„„„„„„„„„„„„„„„7(2)判断抢答选手子模块„„„„„„„„„„„„„„„9
3、加减分模块„„„„„„„„„„„„„„„„„„„11(1)组别判断子模块„„„„„„„„„„„„„„„„„11(2)加减及寄存器子模块„„„„„„„„„„„„„„„12(3)分数选择输出模块„„„„„„„„„„„„„„„„15
4、显示模块„„„„„„„„„„„„„„„„„„„„16
5、蜂鸣器模块„„„„„„„„„„„„„„„„„„„18
第三章设计心得及总结
智力竞赛抢答器
1系统设计要求
1.设计一智力竞赛抢答器,可同时供8名选手参加比赛。2.给节目主持人设置一个控制开关,控制系统清零和抢答开始。
3.抢答器具有锁存功能和显示功能。抢答开始后,若有选手按动抢答按钮,编号立即锁存,并在LED数码管上显示选手编号,同时扬声器响,禁止其他选手抢答。
4.抢答器具有抢答定时功能,时间由主持人确定。5.参赛选手在设定的时间内抢答有效,定时器停止工作。
6.如果定时时间到,无人抢答,本次抢答无效,系统报警,并封锁输入电路,禁止超时抢答,定时器显示00。
7.为每组设计一个计分电路,0~999分,可加分,也可减分。
对于一个抢答器系统,可将其分为五个模块:选手抢答模块、抢答启动模块、加减分模块、显示模块、蜂鸣器控制模块。整体框图如下:
图一 总体框图
其中抢答启动模块具有启动抢答及启动定时功能,输出使能信号给选手识别模块,以及抢答剩余时间给显示模块;选手识别模块完成锁存抢答信号的功能,并输出选手号给显示模块;蜂鸣器对抢答成功以及超时鸣声报警;显示模块对输入的数据进行显示。
2系统设计方案
智力竞赛抢答器拟由单片CPLDFPGA来实现,经分析设计要求,拟定整个系统由五个单元组成,原理图如下所示:
主要VHDL源程序
1、抢答启动模块
启动模块除了有启动的功能外,还有启动定时的功能。定时时间分为5秒和20秒两种,使用两个按键对应两种限时抢答。
将本模块再划分为2个子模:一个模块完成按键识别的功能,另一模块完成倒计时功能。
1)按键识别子模块
按键的识别即对输入信号进行电平变化检测,电平发生跳变就认为是键被按下。但VHDL程序中一个结构体内不能同时对两个信号进行电平跳变的检测,所以对本模块的程序设计采用状态机来实现,并使用统一的时钟信号来扫描按键的电平状态。模块图如下:
图2 按键识别子模块
对START5和START20两个按键定义三种状态,START5按下为ST1状态,此时两个按键“START5&START20”输入电平为“01”;START20按下为ST2状态,此时电平为“10”;两个都没按下为ST0状态,此时电平为“11”。
本模块程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY START_5_20 IS PORT(CLK1,RST,START5,START20:IN STD_LOGIC;
B,A:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--输出定时初值
S_FLAG:OUT STD_LOGIC);
--置数信号
END ENTITY;ARCHITECTURE ONE OF START_5_20 IS SIGNAL DATAIN:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS(ST0,ST1,ST2);
--定义状态
SIGNAL C_ST:ST_TYPE;BEGIN
DATAIN<=START5&START20;
--两个输入信号放在一起判断 BEGIN
IF RST='0' THEN
--复位 B<=“0000”;A<=“0000”;C_ST<=ST0;S_FLAG<='0';ELSIF CLK1'EVENT AND CLK1='1' THEN CASE C_ST IS WHEN ST0=> IF DATAIN=“01” THEN
C_ST<=ST1;
--输入信号为01,转ST1状态 S_FLAG<='1';
--置数信号有效 B<=“0000”;A<=“0101”;
--定时初值“05” ELSIF DATAIN=“10” THEN
C_ST<=ST2;
--输入信号为10,转ST1状态
S_FLAG<='1';
--置数信号有效 B<=“0010”;A<=“0000”;
--定时初值“20”
ELSE C_ST<=ST0;--输入信号为11,保持ST0状态
END IF;
C_ST<=ST0;--防按键抖动,为11时才转ST0状态 S_FLAG<='0';
--置数信号无效
ELSE C_ST<=ST1;
--按键没弹起,继续等待
END IF;
ELSE C_ST<=ST2;END IF;PROCESS(RST,CLK1)WHEN ST1=>IF DATAIN=“11” THEN WHEN ST2=>IF DATAIN=“11” THEN C_ST<=ST0;S_FLAG<='0';WHEN OTHERS=>C_ST<=ST0;B<=“0000”;A<=“0000”;END CASE;END IF;END PROCESS;END ARCHITECTURE;本模块仿真波形如图所示。
图3 按键识别模块仿真波形
2)倒计时子模块
倒计时需要1Hz的脉冲输入,每来一个上升沿,进行一次减一运算,将结果输出到TIMEB、TIMEA;置数信号LOAD输入有效,读入B、A端口的数据;输入L_CR信号与选手识别模块连接,当选手抢答成功后,L_CR信号为0,将倒计时清0.;若倒计时到,没有选手抢答,则在SR1输出1使扬声器发声。同时输出信号给选手抢答模块,禁止选手抢答。
图4倒计时模块
本模块程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DE_COUNT IS PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC;
B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE TWO OF DE_COUNT IS BEGIN
PROCESS(LOAD,L_CR,RST,CLK2)VARIABLE P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
IF LOAD='1' THEN P1:=B;P0:=A;
--指数信号有效,将B、A值读入P1、P0 ELSIF L_CR='0' THEN
--有选手抢答成功,L_CR输入为0,定时时间清0 P1:=“0000”;P0:=“0000”;TIMEOUT<='0';SR1<='1';ELSIF RST='0' THEN P1:=“0000”;P0:=“0000”;TIMEOUT<='0';SR1<='0';
ELSIF(CLK2'EVENT AND CLK2='1')THEN
IF P0=“0000” THEN
IF P1>0 THEN P1:=P1-1;P0:=“1001”;
--若个位为0,十位减1,个位赋为9 END IF;ELSE P0:=P0-1;
--若个位不为0,个位直接减一
IF P0=“0000” AND P1=“0000” THEN TIMEOUT<='0';SR1<='1';
--若时间到,输出锁存信号 END IF;END IF;
END IF;TIMEB<=P1;TIMEA<=P0;END PROCESS;END ARCHITECTURE;
程序中,因为每次减一后的时间值需要保存,用于下次继续减一,所以程序中使用了不完整的IF语句引入寄存器,用于保存每次减一后的时间值。P1、P0定义为变量而不是信号的原因是,变量的赋值是即时的,减一后可以马上进行判断;若定义为信号,不能即时进行判断,并且减一操作后的赋值要经过一个δ延时,程序不好控制。
本模块仿真波形如图所示:
图5 倒计时模块仿真波形
用元件例化语句将以上两个子模块组合,得到整个抢答启动模块。如下图所示:
图6 由两个子模块组成抢答启动模块
两个子模块组合的程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY STARTER IS PORT(CLK1,CLK2,L_CR,RST,START5,START20:IN STD_LOGIC;
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE THREE OF STARTER IS
COMPONENT START_5_20 IS
--调用元件START_5_20声明
PORT(CLK1,RST,START5,START20:IN STD_LOGIC;
B,A:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
S_FLAG:OUT STD_LOGIC);END COMPONENT;COMPONENT DE_COUNT IS
--调用元件DE_COUNT声明
PORT(CLK2,LOAD,L_CR,RST:IN STD_LOGIC;
B,A:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEB,TIMEA:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
TIMEOUT,SR1:OUT STD_LOGIC);END COMPONENT;SIGNAL m,n:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL p:STD_LOGIC;
--对应图7中的中间信号 BEGIN
--按照图7将两个元件连接起来
U1:START_5_20 PORT MAP(CLK1=>CLK1,START5=>START5,START20=>START20,RST=>RST,B=>m,A=>n,S_FLAG=>p);U2:DE_COUNT PORT MAP(CLK2=>CLK2,B=>m,A=>n,LOAD=>p,RST=>RST,L_CR=>L_CR,TIMEB=>TIMEB,TIMEA=>TIMEA, TIMEOUT=>TIMEOUT,SR1=>SR1);END ARCHITECTURE;
2、选手抢答模块
在一个结构体中用8个进程同时对8个选手按键电平变化的监测是不可实现的,所以将本模块划分为两个子模块:单个选手按键模块和判断抢答选手模块。最后将8个选手按键模块和1个判断抢答选手模块连接起来,得到整个选手抢答模块。
1)单个选手按键子模块
按键输入相当于该实体的时钟信号,键被按下,等于来一个脉冲,输出信号给判断模块进行选手号的判断。只要有选手抢答成功,相关模块会输出信号使8个按键模块的LOCK信号有效,禁止其他选手抢答。如图所示。
图7 单个选手按键模
本模块程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BUTTON1 IS PORT(LOCK , BUTTON , RST :IN STD_LOGIC;PRESSED:OUT STD_LOGIC);END ENTITY;ARCHITECTURE B1 OF BUTTON1 IS BEGIN
PROCESS(RST , BUTTON)
--使用进程时刻监测RST、BUTTON信号 BEGIN
IF RST='0' THEN
PRESSED<='0';
--复位
IF LOCK='1' THEN
--键被按下并且LOCK信号无效 PRESSED<='1';
--则输出信号给判断模块 END IF;ELSIF BUTTON'EVENT AND BUTTON='0' THEN END IF;END PROCESS;END ARCHITECTURE;
图8 倒计时模块仿真波形
2)判断抢答选手子模块
本子模块接收8个按键子模块的输出信号,如收到1号子模块输出的高电平,则输出选手号“0001”;并发出信号使扬声器发声并控制8个按键子模块使它们的LOCK信号有效,禁止其他选手抢答。本子模块端口设置如图所示。
图9判断选手模块
本子模块程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY IDENTIFIER IS
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);LOCK,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF IDENTIFIER IS
SIGNAL P:STD_LOGIC_VECTOR(7 DOWNTO 0);BEGIN
P<=PP8&PP7&PP6&PP5&PP4&PP3&PP2&PP1;
--8个输入放在一起判断 BEGIN
CASE P IS
WHEN “00000001”=>P_NUM<=“0001”;LOCK<='0';SR1<='1';--1号选手 WHEN “00000010”=>P_NUM<=“0010”;LOCK<='0';SR1<='1';--2号选手 WHEN “00000100”=>P_NUM<=“0011”;LOCK<='0';SR1<='1';--3号选手 WHEN “00001000”=>P_NUM<=“0100”;LOCK<='0';SR1<='1';--4号选手 WHEN “00010000”=>P_NUM<=“0101”;LOCK<='0';SR1<='1';--5号选手 WHEN “00100000”=>P_NUM<=“0110”;LOCK<='0';SR1<='1';--6号选手 WHEN “01000000”=>P_NUM<=“0111”;LOCK<='0';SR1<='1';--7号选手 WHEN “10000000”=>P_NUM<=“1000”;LOCK<='0';SR1<='1';--8号选手 WHEN OTHERS=>P_NUM<=“0000”;LOCK<='1';SR1<='0';PRO1:PROCESS(P)
--输入若发生变化,马上启动进程进行判断
END CASE;END PROCESS;END ARCHITECTURE;9
图10 判断抢答选手模块仿真波形
所以将以上两个子模块用元件例化语句连接起来,组成整个选手抢答模块,如下图所示
图11 选手抢答模块
实现程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY BUTTON IS
PORT(P1,P2,P3,P4,P5,P6,P7,P8,RST,LOCK:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);LOCK_S,SR1:OUT STD_LOGIC);END ENTITY;ARCHITECTURE BB1 OF BUTTON IS COMPONENT BUTTON1 IS
--调用元件BUTTON1声明
PORT(LOCK,B,RST:IN STD_LOGIC;PRESSED:OUT STD_LOGIC);END COMPONENT;COMPONENT IDENTIFIER IS
--调用元件IDENTIFIER声明
PORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:IN STD_LOGIC;P_NUM:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);10 LOCK,SR1:OUT STD_LOGIC);END COMPONENT;SIGNAL a1,a2,a3,a4,a5,a6,a7,a8:STD_LOGIC;
--定义图12中的中间信号 BEGIN
--按照图12将两个元件连接起来
U1:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P1,RST=>RST,PRESSED=>a1);U2:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P2,RST=>RST,PRESSED=>a2);U3:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P3,RST=>RST,PRESSED=>a3);U4:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P4,RST=>RST,PRESSED=>a4);U5:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P5,RST=>RST,PRESSED=>a5);U6:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P6,RST=>RST,PRESSED=>a6);U7:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P7,RST=>RST,PRESSED=>a7);U8:BUTTON1 PORT MAP(LOCK=>LOCK,B=>P8,RST=>RST,PRESSED=>a8);U9:IDENTIFIER PORT MAP(PP1=>a1,PP2=>a2,PP3=>a3,PP4=>a4,PP5=>a5,PP6=>a6,PP7=>a7,PP8=>a8,P_NUM=>P_NUM,LOCK=>LOCK_S,SR1=>SR1);END ARCHITECTURE;
3、加减分模块
加减分模块要识别按下的按键:加5分按键及减5分按键。所以采用状态机的方法来识别。将本模块划分为三个子模块:组别判断子模块,加减及寄存器子模块,分数选择输出子模块。
1)组别判断子模块
该模块要实现的功能是根据抢答成功的选手编号,判断出该选手属于哪组,并输出使能信号允许该组的分数寄存器进行加减操作。如图所示。
图12 组别判断模块
实现程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY DECODE IS PORT(CLK:IN STD_LOGIC;P_NUM:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
EN1,EN2,EN3,EN4:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF DECODE IS
SIGNAL E:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
PROCESS(CLK)
--引入时钟信号,协调各部分电路的工作
BEGIN IF CLK'EVENT AND CLK='1' THEN
CASE P_NUM IS WHEN “0001”=>E<=“0001”;WHEN “0010”=>E<=“0001”;--
1、2号选手属第一组
WHEN “0011”=>E<=“0010”;WHEN “0100”=>E<=“0010”;--
3、4号选手属第二组 WHEN “0101”=>E<=“0100”;WHEN “0110”=>E<=“0100”;--
5、6号选手属第三组 WHEN “0111”=>E<=“1000”;WHEN “1000”=>E<=“1000”;--
7、8号选手属第四组 WHEN OTHERS=>E<=“0000”;
--其他情况则四个分数锁存器都不工作
END CASE;END IF;
END PROCESS;
EN4<=E(3);EN3<=E(2);EN2<=E(1);EN1<=E(0);END ARCHITECTURE;程序仿真波形如图所示:
图13 组别判断模块仿真波形
2)加减及寄存器子模块
本模块的状态机转换过程为:将ADD和SUB信号并置,并检测其电平变化。当ADD按下时,“ADD&SUB”的电平为“01”,弹起时恢复为“11”。当SUB按下时,“ADD&SUB”的电平为“10”,弹起时恢复为“11”。本模块另外还需实现的功能是寄存功能。如下图所示:
图14 加减及寄存器模块
实现程序如下: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER1 IS PORT(CLK,EN:IN STD_LOGIC;
ADD,SUB:IN STD_LOGIC;
AA2,AA1,AA0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY;ARCHITECTURE ONE OF COUNTER1 IS SIGNAL A:STD_LOGIC_VECTOR(1 DOWNTO 0);TYPE ST_TYPE IS(ST0,ST1,ST2);SIGNAL C_ST:ST_TYPE;BEGIN A<=ADD&SUB;
--将ADD信号和SUB信号并置在一起判断
PROCESS(CLK)VARIABLE P2,P1,P0:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN
IF EN='1' THEN
--使能端有效,才对该分数寄存器进行操作
IF CLK'EVENT AND CLK='1' THEN
CASE C_ST IS
WHEN ST0=>IF A=“01” THEN--A为“01”,说明ADD按下
C_ST<=ST1;
--下一状态转ST1,以等待按键弹起
IF P0=“1001” THEN--个位为9,进1为0,再向十位进1
P0:=“0000”;
IF P1=“1001” THEN
--十位为9,进一为0
P1:=“0000”;
IF P2=“1001” THEN
--百位为9,进一为0
P2:=“0000”;
ELSE P2:=P2+1;
--百位不为9,百位加1
END IF;
ELSE P1:=P1+1;
--十位不为9,加一
END IF;
ELSE P0:=P0+1;
--个位不为9,加一
END IF;
ELSIF A=“10” THEN
--A为“10”,说明SUB按下
C_ST<=ST2;--下一状态转ST2,以等待按键弹起
IF(P2/=0 OR P1/=0 OR P0/=0)THEN
IF P0=“0000” THEN P0:=“1001”;
P1:=P1-1;--个位向十位借1 P2:=P2-1;--十位向百位借1
IF P1=“0000” THEN
ELSE P1:=P1-1;--十位不为0,直接减1
END IF;
P1:=“1001”;
ELSE P0:=P0-1;--个位不为0,直接减1
END IF;
END IF;
ELSE C_ST<=ST0;
END IF;WHEN ST1=>IF A=“11” THEN
--A为“11”,说明按键弹起
C_ST<=ST0;
--回到ST0继续监视按键
ELSE C_ST<=ST1;--否则等待按键弹起
END IF;
C_ST<=ST0;WHEN ST2=>IF A=“11” THEN
ELSE C_ST<=ST2;
END IF;WHEN OTHERS=>C_ST<=ST0;END CASE;END IF;END IF;
AA2<=P2;AA1<=P1;AA0<=P0;
--操作后的分数输出 END PROCESS;END ARCHITECTURE;
加减及寄存器模块仿真波形图如下:
图15 加减及寄存器模块仿真波形
图中,加分按键ADD按下,输出“010”;减分按键SUB按下,输出回到“000”;又来两个加分按键,输出“020”。当EN信号无效时,有按键按下输出不变。
3)分数选择输出模块
四组分数要显示出来,需要12个7段数码管。若只显示当前抢答成功选手的分数,则只需3个数码管。所以设置一个分数选择器,根据抢答成功的选手编号,选择其分数输出给显示模块显示。
程序为:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY MUXX IS PORT(P_NUM,AA2,AA1,AA0,BB2,BB1,BB0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
CC2,CC1,CC0,DD2,DD1,DD0:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
D2,D1,D0:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY;ARCHITECTURE ONE OF MUXX IS BEGIN
PROCESS(P_NUM)
--P_NUM为选手编号
BEGIN
CASE P_NUM IS
WHEN “0001”=>D2<=AA2;D1<=AA1;D0<=AA0;WHEN “0010”=>D2<=AA2;D1<=AA1;D0<=AA0;--1号和2号选手为一组 WHEN “0011”=>D2<=BB2;D1<=BB1;D0<=BB0;WHEN “0100”=>D2<=BB2;D1<=BB1;D0<=BB0;--3号和4号选手为一组 WHEN “0101”=>D2<=CC2;D1<=CC1;D0<=CC0;WHEN “0110”=>D2<=CC2;D1<=CC1;D0<=CC0;--5号和6号选手为一组 WHEN “0111”=>D2<=DD2;D1<=DD1;D0<=DD0;WHEN “1000”=>D2<=DD2;D1<=DD1;D0<=DD0;--7号和8号选手为一组 WHEN OTHERS=>D2<=“0000”;D1<=“0000”;D0<=“0000”;
END CASE;
END PROCESS;END ARCHITECTURE;仿真波形如图所示。
图16分数选择输出模块仿真波形
4、显示模块
本模块根据送来的数据:抢答成功选手号,选手分数、倒计时时间,将相应的字形码送数码管显示。端口设置如图所示。
图17显示模块
图18数码管分配
显示0,“00111111”;3F;显示1,“00000110”;06;显示2,“01011011”;5B;显示3,“01001111”;4F;显示4,“01100110”;66;显示5,“01101101”;6D;显示6,“01111101”;7D;显示7,“00000111”;07;显示8,“01111111”;7F;显示9,“01101111”;6F;显示10,“00000000”;00;
17图中,BT为数码管的位选信号,SG为数码管的段选信号。另外图18为数码管的分配。左起第一位为选手编号,第3、4位为该选手的分数,最后两位为倒计时。程序如下:
LIBRARY IEEE;16
USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DISPLAY IS
PORT(CLK:IN STD_LOGIC;SCORE2,SCORE1,SCORE0,P_NUMBER,TIMEB,TIMEA:IN BT,SG:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
STD_LOGIC_VECTOR(3 DOWNTO 0);END ENTITY;ARCHITECTURE ONE OF DISPLAY IS SIGNAL CNT8:STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL A:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN P1:PROCESS(CLK)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
--时钟信号一来,显示下一位 CNT8<=CNT8+1;END IF;END PROCESS;BEGIN
CASE CNT8 IS
WHEN “000”=>BT<=“10000000”;A<=P_NUMBER;--第一位显示选手号
WHEN “001”=>BT<=“01000000”;A<=“1010”;
--第二位不用,灭
WHEN “010”=>BT<=“00100000”;A<=SCORE2;
--第三位显示分数百位
WHEN “011”=>BT<=“00010000”;A<=SCORE1;
--第四位显示分数十位
WHEN “100”=>BT<=“00001000”;A<=SCORE0;
--第五位显示分数个位
WHEN “101”=>BT<=“00000100”;A<=“1010”;
--第六位不用,灭
WHEN “110”=>BT<=“00000010”;A<=TIMEB;
--第七位显示倒计时十位
WHEN “111”=>BT<=“00000001”;A<=TIMEA;
--第八位显示倒计时个位 END CASE;P2:PROCESS(CNT8)
END PROCESS;BEGIN
CASE A IS
--根据数据选择相应的字形码送数码管显示
WHEN “0000”=>SG<=“00111111”;WHEN “0001”=>SG<=“00000110”;
WHEN “0010”=>SG<=“01011011”;WHEN “0011”=>SG<=“01001111”;
WHEN “0100”=>SG<=“01100110”;WHEN “0101”=>SG<=“01101101”;
WHEN “0110”=>SG<=“01111101”;WHEN “0111”=>SG<=“00000111”;
WHEN “1000”=>SG<=“01111111”;WHEN “1001”=>SG<=“01101111”;
WHEN “1010”=>SG<=“00000000”;WHEN OTHERS=>NULL;END CASE;P3:PROCESS(A)END PROCESS;END ARCHITECTURE;本模块仿真波形如图所示。
图19显示模块仿真波形
5、蜂鸣器模块
当SR1鸣声信号来时,输出CLK2(2KHz)驱动蜂鸣器发声。CLK1用于扫描SR1的电平变化,SR1上升沿来到,允许CLK2输出,并持续一段时间。模块图如下:
图20蜂鸣器模块
本模块程序如下:
LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY SPEAKER IS PORT(CLK1,SR1,CLK2:IN STD_LOGIC;
S:OUT STD_LOGIC);END ENTITY;ARCHITECTURE ONE OF SPEAKER IS TYPE ST_TYPE IS(ST0,ST1);SIGNAL C_ST:ST_TYPE;SIGNAL A:STD_LOGIC;BEGIN PROCESS(CLK1)
VARIABLE P:STD_LOGIC_VECTOR(7 DOWNTO 0);--P用于定时,使蜂鸣器发声持续
BEGIN
IF CLK1'EVENT AND CLK1='1' THEN
CASE C_ST IS WHEN ST0=>IF SR1='1' THEN
--SR1信号有上升沿
P:=“00111111”;18
C_ST<=ST1;A<='1';--蜂鸣器发声,开始定时
ELSE C_ST<=ST0;A<='0';--否则等待
END IF;
P:=P-1;C_ST<=ST1;
A<='0';--定时到,蜂鸣器停止发声 IF SR1='1' THEN
C_ST<=ST1;--等待系统复位 END IF;WHEN ST1=>IF P/=0 THEN
--定时还没到,等待
ELSE
ELSE C_ST<=ST0;--复位
END IF;WHEN OTHERS=>C_ST<=ST0;A<='0';END CASE;END IF;S<=CLK2 AND A;
--只有A为1时,蜂鸣器才发声 END PROCESS;END ARCHITECTURE;本模块的仿真波形如图所示。
图21 蜂鸣器模块仿真波形
3设计心得及总结
刚开始确定这个课题时,我首先确定了要用到哪些知识,主要是VHDL程序的设计,软件的仿真。首先我查阅课本质料,找了不少关于这方面的程序,尽量的把它们都弄懂了。然后我确定了总体方案,把整体方案划分成了几个模块,形成了一个整体的框架,然后各个击破。有了总体的思路做指导我很快我就仿真调试好了抢答启动模块选手抢答模块,这样一来就增加了我的信心,一鼓作气拿下了以后的模块。当然任何事情都不会一帆风顺,也遇到许多难题,不懂的地方我就请叫老师和同学,最后所有的模块都被我一个一个的做出来了,我很高兴,觉得我这两天来的努力没有白费。
此次课程设计不仅加强了我对专业知识的学习与了解,更有许多的感慨,主要有以下几点:
(1)加强了我们动手、思考和解决问题的能力。我们很少能有这种机会来锻炼自己,通过这次课程设计,起到了很好的锻炼效果。
(2)我在做课程设计同时也是对课本知识的巩固和加强,课本 的知识太多,平时课间的学习并不能很好的理解程序的功能,所以在这次课程设计过程中,我们了解了很多程序的功能,并且对于其在实际中的使用有了更多的认识。
(3)我们两人一组相互合作,共同解决问题也认识到了团队精神的重要性
最后,我要感谢老师和同学们给我的帮助,没有你们的帮助,我是不能完成此次课程设计的,真的很感谢你们!
第三篇:verilog简易数字频率计报告
一、实验原理
根据原理图,将计数器模块、显示模块、扫描模块、译码器模块等分别做出。其原理是在1S内用待测信号给计数器计数,并在一秒结束时给计数器清零,计出来用缓存器缓存,在数码管中显示出来。
二、方案论证
一、通过50M的时钟进行计数获得精密的1HZ——计数器用Verilog HDL语言实现在1HZ为底电平时计数——门控电路用或门开启——1HZ为高电平时进行数据锁存与显示——利用Verilog HDL语言使前面的0不显示。
计数器用Verilog HDL语言在写代码时可以用复制粘贴的方法可以简便的实现。通过50M的时钟进行计数获得精密的1HZ后只是经过很短的时间内进行计数器的清零及数据的琐存,并且得到的是1HZ的精密时钟。把锁存的数据进行清0的转换后利用分时扫描,后通过数码管译码显示。
说明:
Cnt9999:0000~9999计数器; Buffer:锁存器; Scan:扫描显示 共8个模块
三、实验步骤
一、计数器模块 计数器模块的仿真波形
二、锁存模块
利用32位的D触发器进行储存计数器送给它的数据。在时钟为上升沿的时候触发保存数据。锁存模块的源代码:
module buffer_32(clr,clear,in,out);input
clear,clr;input[31:0] in;output[31:0] out;reg[31:0]
out;always@(posedge clear or negedge clr)
if(!clr)out<=0;
//else if(clear)out=in;
else out<=in;
endmodule
三、转化清零模块 波形仿真波形
module cnt9999(clr,clk,q,c);
input clr,clk;output c;output [15:0]q;reg c;reg [15:0]q;
always @(posedge clk or negedge clr)begin
if(!clr)begin q[15:0]<=0;c<=1'b0;end
else if(q[15:0]==16'H9999)begin q[15:0]<=0;c<=1'b1;end
else if(q[11:0]==12'H999)begin q[15:0]<=q[15:0]+12'H667;c<=1'b0;end
else if(q[7:0]== 8'H99)begin q[15:0]<=q[15:0]+8'H67;c<=1'b0;end
else if(q[3:0]== 4'H9)begin q[15:0]<=q[15:0]+4'H7;c<=1'b0;end
else begin q[15:0]<=q[15:0]+1'b1;c<=1'b0;end end endmodule
四、扫描显示模块
把存储的数据分别分给8个数码管,利用循环扫描即可显示出所要显示的数据。
扫描显示模块的仿真波形
module scan(clk,q);input clk;output [2:0]q;reg
[2:0]q;
always @(posedge clk)
begin
q=q+1;
end
endmodule
四、引脚分配
五、实验总结
频率就是信号在1s内发生相同变化的次数,简易频率计就是基于这个原理设计的。我们先产生一个低电平为1s,高电平为1/50M秒的周期信号clk,用该信号与待测信号相与作为计数器的输入时钟,并把clk的上升沿作为缓存器的开关,把clk的高电平作为计数器的清零信号,这样就能保证缓冲器中存放的始终是待测信号在一秒内的跳变次数,也即待测信号的频率。
实验的原理尽管很清楚,但真正看到实验现象还是经历了一番波折,在写8选1数据选择器的时候,定义模块端口时,由于疏忽,把四位位宽漏写成了1位,结果在数码管上显示的始终只有0和1两种数字。为了改正这个错误,我把程序的主要模块都检查了一遍,结果不管怎么改实验现象都没有出来,这让我郁闷了很长一段时间,原理明明是对的,为什么就没有效果呢?最后我把整个程序都打印出来,一行一行地检查,最后终于找到了症结所在,就是8选1数据选择器的位宽弄错了!经历了这次错误,让我明白了写程序还是不能大意,8选1数据选择器虽然简单,却因为位宽这个小小的错误让我浪费了很长的时间,检查错误时也因为其简单而没有认真对待。
第四篇:简易数字频率计设计报告
EDA技术基础 简易数字频率计 必做实验
电子信息科学与技术
物电学院
2011-06-24 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
简易数字频率计
一.实验要求
用Verilog硬件描述语言设计一个时序逻辑电路,能够对输入的TTL信号进行1s时长计数,将计数结果在数码管上显示,让该电路循环运行,则数码管显示的就是输入信号的频率。
用标准DDS信号发生器输入TTL信号,测试信号的频率与DDS输出设定的频率比较,分析误差以及误差产生的原因。
显示效果好,无闪烁,高位零不显示。
二.方案原理图
总体框图:
三、主要部分原理说明及实验步骤
根据原理图,先把计数器模块、显示模块、扫描模块分别做出。对于计数器模块因为要实现00000000~99999999的计数器,所以要用32bit,即要用
32第2页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
个D触发器。从而要用8个数码管进行循环扫描显示。对于1HZ的精密脉冲在低电平时,一方面和被测脉冲通过或门,当被测脉冲为高电平时门电路开启,另一方面通过一个非门把计数器的清零端置1,计数器正常工作开始计数。高电平时对计数器清零的同时,把测得的数据送入BUFFER中进行显示锁存。数码管的扫描时钟由外部提供。在此基础上把前面的0清除。
1、我在该设计中使用了一个或门作为门控电路,当输入时钟clka为低电平时,被测信号clk通过,当输入时钟clka为高电平时,被测信号被阻止。从clka端输入的是一个24M的脉冲,经过1HZ模块处理后生成一秒赫兹信号(如下图)
由这个信号来控制99999999计数器的清零和buffer中数据的更新以及被测信号的通过与阻止
其verilog语言代码如下 module clk_1hz(clk,clked);input clk;output clked;reg clked;reg[31:0]jishu;always @(posedge clk)begin if(jishu==24000000)begin jishu=0;clked=1;end else begin jishu=jishu+1;clked=0;end end endmodule
2、门控电路部分
其verilog语言代码如下
第3页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule
99999999计数器计数在到达1S的瞬间,1HZ时钟出现上升沿,控制缓存器将此时的计数值锁存起来,然后送出显示。很短一段时间后,1HZ时钟恢复低电平,在这很短的时间内1HZ时钟经非门也完成了计数器的清零,之后计数器又恢复计数状态,进入下一秒的计数。
其verilog语言代码如下 module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule
3、计数模块
第4页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
99999999计数器是本次实验的关键所在,它的主要功能是:在1hz精密时钟和门控电路的控制下,在1s的时间内,对输入信号进行计数,1s后,由于门控电路的存在,计数器停止计数 其verilog语言代码如下 module cnt99999999(clr,clk,q);input clr,clk;output [31:0]q;reg [31:0]q;always @(posedge clk or negedge clr)begin if(!clr)q[31:0]=0;else if(q[31:0]==31'H99999999)q[31:0]=q[31:0]+32'H66666667;else if(q[27:0]==27'H9999999)q[31:0]=q[31:0]+28'H6666667;else if(q[23:0]==24'H999999)
q[31:0]=q[31:0]+24'H666667;else if(q[19:0]==20'H99999)
q[31:0]=q[31:0]+20'H66667;else if(q[15:0]==16'H9999)
q[31:0]=q[31:0]+16'H6667;else if(q[11:0]==12'H999)
q[31:0]=q[31:0]+12'H667;else if(q[ 7:0]== 8'H99)
q[31:0]=q[31:0]+8'H67;else if(q[ 3:0]== 4'H9)
q[31:0]=q[31:0]+4'H7;else q[31:0]=q[31:0]+1;end endmodule
4、显示数据缓冲buffer的设计
数据缓冲buffer的功能是当用计数器对输入信号计数,这些数据都暂时存在这个里面,每当时钟的上升沿到来的时候,它就向后面的模块输送数据,这样就可以得到相对稳定的显示。
第5页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
其verilog语言代码如下
module buff(in,clk,n1,n2,n3,n4,n5,n6,n7,n8);input clk;input [31:0]in;output [3:0]n1,n2,n3,n4,n5,n6,n7,n8;reg [3:0]n1,n2,n3,n4,n5,n6,n7,n8;
always @(posedge clk)begin begin n1=in[3:0];n2=in[7:4];n3=in[11:8];n4=in[15:12];n5=in[19:16];n6=in[23:20];n7=in[27:24];n8=in[31:28];end end endmodule
5、显示部分
由于要用到8个数码管对实验结果进行显示,我们可以设计一个译码模块:
其verilog语言代码如下 module yima(in,a,b,c,d,e,f,g,dp);input
[3:0]in;output a,b,c,d,e,f,g,dp;reg
a,b,c,d,e,f,g,dp;always @(in)begin case(in)
第6页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
4'b0000:{dp,g,f,e,d,c,b,a}=8'b00111111;4'b0001:{dp,g,f,e,d,c,b,a}=8'b00000110;4'b0010:{dp,g,f,e,d,c,b,a}=8'b01011011;4'b0011:{dp,g,f,e,d,c,b,a}=8'b01001111;4'b0100:{dp,g,f,e,d,c,b,a}=8'b01100110;4'b0101:{dp,g,f,e,d,c,b,a}=8'b01101101;4'b0110:{dp,g,f,e,d,c,b,a}=8'b01111101;4'b0111:{dp,g,f,e,d,c,b,a}=8'b00000111;4'b1000:{dp,g,f,e,d,c,b,a}=8'b01111111;4'b1001:{dp,g,f,e,d,c,b,a}=8'b01101111;default:{dp,g,f,e,d,c,b,a}=8'b01000000;endcase end endmodule 部分引脚功能的排列如下图所示
数码管的引脚排列 以上5部分就是顶层原理图的主要部分
四、实验总结
1、要用1HZ的精确时钟不能直接接一个外接的信号源,这样的误差太大,只能将一个标准的24M的时钟进行24分频,才能的到相对稳定的时钟信号。
2、数据缓冲部分不能少,如果没有这部分,将得不到想要的结果,数码管上会出现一排乱跳的数字。
3、在整个实验设计过程中,我发现只要弄清楚所需要的几个模块,然后将模块分开来进行生成,设计也并不是想象中的那么难。
第7页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告
4、在此程序设计中,对各个模块的功能有针对性的设计思路有了一定的提高,对于一个程序的需要哪些功能模块,需要什么样的输入输出,都比以前有了一定的提高。
5、学EDA已经有一学期了,现在对那些原理框图并不陌生了,现在也可以写一些简单的代码。我发现只要我们认真的去学习,虚心的的去请教他人,我们谁都可以把这门课学好。虽然在学习这门课以及做实验的过程中,我们往往会遇到种种困难,但是当实验结果与现象出来的那一刹那,我们就会感受那成功的快乐。
第8页,共8页
第五篇:EDA课程设计——数字频率计
燕 山 大 学 EDA课程设计报告书
题目:数字频率计
姓名:Eric 班级:09电子x班 学号: 090104020xxxx 成绩:
(注:此文件应以同学学号为文件名)
一、设计题目及要求
1.输入为矩形脉冲,频率范围0~99MHz;
2.用五位数码管显示;只显示最后的结果,不要将计数过程显示出来;
3.单位为Hz和KHz两档,自动切换。
二、设计过程及内容 1.总体设计思路
总电路图主要有两部分组成,即测频电路和扫描电路。
图1 总电路图
图2 总电路图仿真波形
测频电路测量一秒钟内通过计数器的脉冲个数,将其送至扫描电路中显示。
2.主要模块实现方法(1)扫描电路
试验箱上共有8个数码管,但共用一个显示输入端,因此如要显示两位以上的数字,就必须使用扫描电路。其作用就在于不同的时间使不同的数码管显示当前输入的与其对应的数字,由于扫描的频率很高,带给人眼的感觉就是同时在显示。四个八选一数据选择器。扫描电路由一个八进制计数器、四个八选一数据选择器74151、一个七段译码器7448组成。
图3 扫描电路
图4 四个74151接法
图5 扫描电路仿真波形
(2)测频电路
测频电路由一个366进制计数器和计数换挡及寄存电路组成
图6 测频电路
图 7 测频电路仿真波形
在366进制计数器输入频率为366Hz的时钟信号,当该计数器通过366个脉冲,即经过时间一秒后366进制计数器的进位端输出高电平,将脉冲计数器置零,并控制储存寄存电路输出一秒内通过脉冲计数器的脉冲个数,以达到测量频率的效果,并且保证只显示最后结果不显示中间计数过程。
图8 366进制计数器
计数换挡及寄存电路由1个一亿进制计数器和20个门电路组合以及20个D触发器组成的寄存电路组成。
图9 计数换挡及寄存电路
因为要求测量0到99MHz的频率所以选用一亿进制计数器计脉冲的个数,置零端通过一个非门和366进制计数器的进位输出端相连,又要求使用5喂数码管,所以当计数器十万位的数为1时就换挡,换挡后将不显示后3位数,测试的单位由Hz变为kHz。
图10 一亿进制计数器
(3)换挡的实现
换挡电路由20个门电路的组合构成,20个电路组合的A端分别接一亿进制计数器的Q0到Q19即低五位,B端分别接一亿进制计数器的Q12到Q31即高五位,CO和NCO接一亿进制计数器的进位输出端。S端接寄存电路D触发器的出入端。
S=AC’+BC
图11 换挡门电路组合
(4)寄存电路
寄存电路由20个D触发器接成,输入输出端分别接换挡电路和扫描电路。CLK端接366进制计数器的进位输出端以实现对数据的存储和输出。
图12 寄存电路
三、设计结论(包括设计过程中出现的问题;对EDA课程设计感想、意见和建议)(1)出现过的问题
在使用Max-Plus时在画图的初始阶段不知道如何旋转器件,仿真阶段endtime设置的过长,时钟脉冲周期设置的过小导致因器件延迟造成的仿真失效。在试验箱的使用过程中因没插跳线导致程序无法下载到芯片。
(2)对EDA课程设计感想
刚拿到题目是觉得无从下手十分躁,第二天思考了一天仍无法突破,也曾有所抱怨。当看到每个分立的模块仿真均正确而组合起来的总电路仿真效果十分混乱的时候感到极其的困惑,在老师的建议下把电路图下载到了试验箱里解决了这个问题。最后当自己的设计通过老师验收的时候心里无比的轻松喜悦……
应用软件MAX-Plus的使用大大减小了因在纸上画电路图的工作量,通过简单的电路设计,提高了我的独立思考能力,通过连结实验箱增强了我的动手能力,并延伸了我在课堂上学到的知识,此次课程设计让我认识到高新技术的快速发展和应用,让我看到了EDA技术功能的强大,也让我认识到掌握他们的重要性,同时也看到了自己的差距与不足,我知道只有今后自己努力学习,拓宽自己的知识面,才能更好的掌握这项技术,也才能适应社会的发展。
(3)意见和建议
希望能更新更多的题目。