基于VHDL八位频率计设计
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARCHITECTURE ART OF FREQ IS
COMPONENT CNT10 --待调用的有时钟使能的十进制计数器端口定义 PORT(CLK,CLR,ENA:IN STD_LOGIC; CQ:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); CARRY_OUT:OUT STD_LOGIC); END COMPONENT;
SIGNAL TSTEN:STD_LOGIC; SIGNAL CLR_CNT:STD_LOGIC; SIGNAL LOAD:STD_LOGIC; SIGNAL CARRY1:STD_LOGIC; SIGNAL CARRY2:STD_LOGIC; SIGNAL CARRY3:STD_LOGIC; SIGNAL CARRY4:STD_LOGIC; SIGNAL CARRY5:STD_LOGIC; SIGNAL CARRY6:STD_LOGIC; SIGNAL CARRY7:STD_LOGIC; SIGNAL CARRY8:STD_LOGIC; SIGNAL DIN:STD_LOGIC_VECTOR(31 DOWNTO 0); SIGNAL DOUT:STD_LOGIC_VECTOR(31 DOWNTO 0);
COMPONENT REG32B --待调用的32位锁存器端口定义 port(LOAD:in std_logic; DIN:in std_logic_vector(31 downto 0); DOUT:out std_logic_vector(31 downto 0)); END COMPONENT;
--1 Hz时钟
--产生计数器
2、寄存器REG40B的设
计
• 设置锁存器的好处是,显示的数据稳定,不会由 于周期性的清零信号而不断闪烁。若已有40位 BCD码存在于此模块的输入口,在信号LOAD的 上升沿后即被锁存到寄存器REG40B的内部,并 由REG40B的输出端输出,然后由实验板上的7段 译码器译成能在数码管上显示输出的相对应的 数值。
BEGIN U0:TESTCTL PORT MAP(CLK=>CLK,TSTEN=>TSTEN, CLR_CNT=>CLR_CNT,LOAD=>LOAD); U1:CNT10 PORT MAP(CLK=>FSIN,CLR=>CLR_CNT,ENA=>TST EN, CQ=>DIN (3 DOWNTO 0),CARRY_OUT=>CARRY1); U2:CNT10 PORT MAP(CLK=>CARRY1,CLR=>CLR_CNT,ENA=> TSTEN, CQ=>DIN (7 DOWNTO 4),CARRY_OUT=>CARRY2); U3:CNT10 PORT MAP(CLK=>CARRY2,CLR=>CLR_CNT,ENA=>
程序如下:
• • • • • • • • • • • • • • • LIBRARY IEEE; --32位锁存器 USE IEEE.STD_LOGIC_1164.ALL; ENTITY REG32B IS PORT(LOAD:IN STD_LOGIC; DIN:IN STD_LOGIC_VECTOR(31 DOWNTO 0); DOUT:OUT STD_LOGEC_VECTOR(31 DOWNTO 0)); END REG32B; ARCHITECTURE ART OF REG32B IS BEGIN PROCESS ( LOAD, DIN ) BEGIN IF LOAD 'EVENT AND LOAD= '1' THEN DOUT<=DIN; --锁存输入数据 END IF ; END PROCESS; END ART;
3、十进制计数器的设计
• 十进制计数器的特殊之处是,有一时钟使能 输入端ENA,用于锁定计数值。当高电平时 计数允许,低电平时禁止计数。
程序如下
• 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 15; --4位计数结果输出 • CARRY_OUT:OUT STD_LOGIC);
COMPONENT TESTCTL --待调用的测频控制信号发生器端口定义 port(clk:in std_logic; tsten,clr_cnt,load:out std_logic); END COMPONENT;
component HC4511 port(datain :in std_logic_vector(3 downto 0); a:out std_logic; b:out std_logic; c:out std_logic; d:out std_logic; e:out std_logic; f:out std_logic; g:out std_logic); end component;
程序如下
• • • • • • • • • • • • LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; --测频控制信号发生器 USE IEEE.STD_LOGIC_UNSIGNED.ALL ENTITY TESTCTL IS PORT (CLK:IN STD_LOGIC; --1 Hz测频控制时钟 TSTEN:OUT STD_LOGIC; --计数器时钟使能 CLR_CNT:OUT STD_LOGIC; --计数器清零 LOAD:OUT STD_LOGIC); --输出锁存信号 END TESTCTL; ARCHITECTURE ART OF TESTCTL IS SIGNAL Dvi2CLK :STD_LOGIC; BEGIN
4、将各部分整合在一起
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY FREQ IS PORT(FSIN:IN STD_LOGIC; CLK:IN STD_LOGIC; a0,b0,c0,d0,e0,f0,g0:out STD_LOGIC; a1,b1,c1,d1,e1,f1,g1:out STD_LOGIC; a2,b2,c2,d2,e2,f2,g2:out STD_LOGIC; a3,b3,c3,d3,e3,f3,g3:out STD_LOGIC; a4,b4,c4,d4,e4,f4,g4:out
频率计的设计
一、设计思路
本次设计的频率计是8位十进制数字频率计, 它由一个测频控制信号发生器TESTCTL、8 个有时钟使能的十进制计数器CNT10、8个 4-16译码器74HC4511和一个32位锁存器 REG32B组成。以下分别叙述频率计各逻辑 模块的功能与设计方法。
1、测频信号发生器的设计
• 其中控制信号时钟CLK的频率取1 Hz,而信号 TSTEN的脉宽恰好为1 s,可以用作闸门信号。此 时,根据测频的时序要求,可得出信号LOAD和 CLR_CNT的逻辑描述。在计数完成后,即计数使 能信号TSTEN在1 s的高电平后,利用其反相值的 上跳沿产生一个锁存信号LOAD,0.5 s 后,CLR_CNT产生一个清零信号上跳沿。 •
• PROCESS ( CLK ) • BEGIN • IF CLK'EVENT AND CLK= '1' THEN 二分频 • Div2CLK<=NOT Div2CLK; • END IF ; • END PROCESS; • PROCESS ( CLK,Div2CLK ) • BEGIN • IF CLK= '0' AND Div2CLK = '0' THEN 清零信号 • CLR_CNT<= '1'; • ELSE CLR_CNT<= '0' ; END IF; • END PROCESS; • LOAD<=NOT Div2CLK; TSTEN<=Div2CLK; • END ART;
• END ART;
4、74HC4511译码器的设计
• 每个十进制的计数器对应一个译码器输出, 然后将译码器的a,b,c,d,e,f,g分别接到LED 数码管的a,b,c,d,e,f,g端。
Fra Baidu bibliotek 程序如下
library ieee; use ieee.std_logic_1164.all; entity HC4511 is port(Din:in std_logic_vector(3 downto 0); a:out std_logic; b:out std_logic; c:out std_logic; d:out std_logic; e:out std_logic; f:out std_logic; g:out std_logic); end entity;
• • • • • • • • • • • • •
ELSIF CLK'EVENT AND CLK= '1' THEN IF ENA= '1' THEN IF CQI<9 THEN CQI<=CQI+1; ELSE CQI<=0;END IF; --大于9,则计数器清零 END IF; END IF; END PROCESS; PROCESS (CQI) BEGIN IF CQI=9 THEN CARRY_OUT<= '1'; --进位输出 ELSE CARRY_OUT<= '0';END IF; END PROCESS; CQ<=CQI;
case Din is when "0001" => a<='0';b<='1';c<='1';d<='0';e<='0';f<='0';g<='0'; when "0010" => a<='1';b<='1';c<='0';d<='1';e<='1';f<='0';g<='1'; when "0011" => a<='1';b<='1';c<='1';d<='1';e<='0';f<='0';g<='1'; when "0100" => a<='0';b<='1';c<='1';d<='0';e<='0';f<='1';g<='1'; when "0101" => a<='1';b<='0';c<='1';d<='1';e<='0';f<='1';g<='1'; when "0110" => a<='0';b<='0';c<='1';d<='1';e<='1';f<='1';g<='1'; when "0111" => a<='1';b<='1';c<='1';d<='0';e<='0';f<='0';g<='0'; when "1000" => a<='1';b<='1';c<='1';d<='1';e<='1';f<='1';g<='1'; when "1001" => a<='1';b<='1';c<='1';d<='1';e<='0';f<='1';g<='1'; when others => a<='1';b<='1';c<='1';d<='1';e<='1';f<='1';g<='0'; end case; end process; end architecture ART ;
• 频率测量的基本原理是计算每秒钟内待测信号的 脉冲个数。这就要求TESTCTL的计数使能信号 TSTEN能产生一个1秒脉宽的周期信号,并对频率 计的每一计数器CNT10的ENA使能端进行同步控 制。当TSTEN高电平时,允许计数;低电平时,停止 计数,并保持其所计的数。在停止计数期间,首先需 要一个锁存信号LOAD的上跳沿将计数器在前1秒 钟的计数值锁存进32位锁存器REG32B中,并由外 部的7段译码器译出并稳定显示。锁存信号之后, 必须有一清零信号CLR_CNT对计数器进行清零, 为下1秒钟的计数操作作准备。为了产生这个时序 图,需首先建立一个由D触发器构成的二分频器,在 每次时钟CLK上沿到来时其值翻转。