范明轲 0958200102 南京理工大学 2012 – 03 – 26
qin4: IN STD_LOGIC_VECTOR(3 DOWNTO 0); bel: OUT STD_LOGIC ); END bell;
ARCHITECTURE behav OF bell IS SIGNAL temp: STD_LOGIC; BEGIN
PROCESS(qin1,qin2,qin3,qin4) BEGIN
IF(qin4=\AND qin3=\AND qin2=\ IF(qin1=\qin1=\OR qin1=\ temp<=clk_1k;
ELSIF(qin1=\ temp<=clk_2k; END IF; ELSE
temp<='0'; END IF; bel<=temp; END PROCESS; END behav;
封装图如下:
bellclk_1kclk_2kqin1[3..0]qin2[3..0]qin3[3..0]qin4[3..0]belinst 13. 分频模块:因为设计中要有很多不同的频率:1Hz的提供给计时模块;2Hz供给校准
用;1kHz、2kHz供给蜂鸣器报时用;1MHz用来实现动态显示。而试验台只有唯一一个48MHz的基准时钟,所以要对其进行分频其将48MHz分成1Hz、2Hz、1kHz、2kHz、1MHz。用VHDL就可以很方便的实现分频,程序代码如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY fenpin IS
PORT( clk: IN STD_LOGIC; clk_1Hz: OUT STD_LOGIC; clk_2Hz: OUT STD_LOGIC; clk_1kHz: OUT STD_LOGIC;
25
范明轲 0958200102 南京理工大学 2012 – 03 – 26
clk_2kHz: OUT STD_LOGIC; clk_1MHz: OUT STD_LOGIC ); END fenpin;
ARCHITECTURE behav OF fenpin IS SIGNAL clk_1: STD_LOGIC; SIGNAL clk_2: STD_LOGIC; SIGNAL clk_1k: STD_LOGIC; SIGNAL clk_2k: STD_LOGIC; SIGNAL clk_1M: STD_LOGIC; BEGIN
PROCESS(clk)
VARIABLE count1: INTEGER RANGE 0 TO 24; BEGIN
IF (clk'event AND clk='1') THEN IF count1=23 THEN count1:=0;
clk_1M<= NOT clk_1M; ELSE
count1:=count1+1; END IF; END IF;
clk_1MHz<=clk_1M; END PROCESS; --1MHz
PROCESS(clk_1M)
VARIABLE count2: INTEGER RANGE 0 TO 250; BEGIN
IF (clk_1M'event AND clk_1M='1') THEN IF count2=249 THEN count2:=0;
clk_2k<= NOT clk_2k; ELSE
count2:=count2+1; END IF; END IF;
clk_2kHz<=clk_2k; END PROCESS; --2KHz
PROCESS(clk_1M)
VARIABLE count3: INTEGER RANGE 0 TO 500; BEGIN
IF (clk_1M'event AND clk_1M='1') THEN IF count3=499 THEN count3:=0;
clk_1k<= NOT clk_1k; ELSE
count3:=count3+1;
26
范明轲 0958200102 南京理工大学 2012 – 03 – 26
END IF; END IF;
clk_1kHz<=clk_1k; END PROCESS; --1KHz
PROCESS(clk_1k)
VARIABLE count4: INTEGER RANGE 0 TO 250; BEGIN
IF (clk_1k'event AND clk_1k='1') THEN IF count4=249 THEN count4:=0;
clk_2<= NOT clk_2; ELSE
count4:=count4+1; END IF; END IF;
clk_2Hz<=clk_2; END PROCESS; --2Hz
PROCESS(clk_1k)
VARIABLE count5: INTEGER RANGE 0 TO 500; BEGIN
IF (clk_1k'event AND clk_1k='1') THEN IF count5=499 THEN count5:=0;
clk_1<= NOT clk_1; ELSE
count5:=count5+1; END IF; END IF;
clk_1Hz<=clk_1;
END PROCESS; --1Hz
END behav;
封装图如下:
fenpinclkclk_1Hzclk_2Hzclk_1kHzclk_2kHzclk_1MHzinst1 14. 去抖动模块:因为机械开关的抖动现象对系统产生误差,甚至使不能正常工作,所
以要适当地在开关和电路之间加入一个去抖动模块以防止机械开关所引起的不良影响。采用锁存器就可以很方便地设计去抖动电路,如图下所示。
27
范明轲 0958200102 南京理工大学 2012 – 03 – 26
因为设计中一共有4开关所以采用两片7474,每片包括两个D锁存器,7474输出端的QN是开关信号稳定状态。
封装图如下所示:
将上面所有各功能模块进行级联,生成顶层电路,实现了总体设计要求。在开发工具Quartus II 7.0的顶层电路图如图所示:
28