VHDL实例(latest)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ELSE PRESENT_STATE:=S1; END IF; WHEN S2=> IF DATAIN=‘1’THEN PRESENT_STATE:=S3; ELSE PRESENT_STATE:=S1; END IF; WHEN S3=> IF DATAIN=‘1’THEN PRESENT_STATE:=S4; ELSE PRESENT_STATE:=S1; END IF; WHEN S4=> IF DATAIN=‘1’THEN PRESENT_STATE:=S5; ELSE PRESENT_STATE:=S1; END IF;
4 弹跳消除电路
机械开关在开关切换的瞬间会在接触点出现信号来回弹跳的 现象,对于灵敏度较高的电路这种弹跳将很可能会造成误动作输 入,从而影响到电路的正确性。 从下图可以观察出弹跳现象产生的原因,虽然只是按下按键 一次然后放掉,然而实际产生的按键信号却不止跳动一次,经过 取样信号的检查后,将会造成误判断,以为键盘按了两次。
CASE PRESENT_STATE IS WHEN S0=> IF DATAIN=‘0’ THEN PRESENT_STATE:=S1; ELSE PRESENT_STATE:=S0; END IF; WHEN S1=> IF DATAIN=‘1’ THEN PRESENT_STATE:=S2;
PROCESS(COUNT) BEGIN CASE COUNT IS WHEN "000"=>Z<=‘0’; WHEN "001"=>Z<=‘1’; WHEN "010"=>Z<=‘1’; WHEN "011"=>Z<=‘1’; WHEN "100"=>Z<=‘1’; WHEN "101"=>Z<=‘1’; WHEN "110"=>Z<=‘1’; WHEN OTHERS=>Z<=‘0’; END CASE; END PROCESS;
WHEN S5=> IF DATAIN=‘1’THEN PRESENT_STATE:=S6; ELSE PRESENT_STATE:=S1; END IF; WHEN S6=> IF DATAIN=‘1’THEN PRESENT_STATE:=S7; ELSE PRESENT_STATE:=S1; END IF; WHEN S7=> IF DATAIN=‘0’THEN PRESENT_STATE:=S8;Q<=‘1’; ELSE PRESENT_STATE:=S0;END IF; WHEN S8=> IF DATAIN=‘0’THEN PRESENT_STATE:=S1; ELSE PRESENT_STATE:=S2; END IF; END CASE; WAIT UNTIL CLK’EVENT AND CLK=‘1’; END PROCESS; END ART;
VHDL应用实例
1. 序列信号发生器
在数字信号的传输和数字系统的测试中,有时需要用到一组特定的串 行数字信号,产生序列信号的电路称为序列信号发生器。 “01111110”序列发生器 该电路可由计数器与数据选择器构成,其VHDL描述如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL;
按键信号
抽样信号
抽样结果
弹跳现象产生错误的抽样结果
弹跳消除电路的实现原理如图所示,先将键盘的输入信号D_IN做为电路的 输入信号,CLK是电路的时钟脉冲信号,也就是取样信号,D_IN经过两级D触发 器延时后再使用RS触发器处理。
VCC 13
AND2 DFF 6 NOT AND2 9 NOT R 7 Q
ARCHITECTURE A OF debounce IS SIGNAL Q0,Q1,S,R ,DLY,NDLY: STD_LOGIC; Begin Process (Clk) Begin IF Clk'EVENT AND Clk='1' THEN Q1 <= Q0; Q0 <= D_IN; S <= Q0 AND Q1; R <= NOT Q0 AND NOT Q1; END IF; End Process; DLY <= R NOR NDLY; NDLY <=S NOR DLY; D_OUT <= DLY; End A;
DFF D_ IN D PRN D0 Q
D
PRN D1 Q
S
S
Q
D_ OUT
CLRN 11 CLK 10
CLRN 8
R
弹跳消除电路的内部实现原理图
此处RS触发器的前端连接与门和非门的处理原则是: (1) 因为一般人的按键速度至多是10次/秒,亦即一次按键时间是100 ms , 所 以 按 下 的 时 间 可 估 算 为 50ms 。 以 取 样 信 号 CLK 的 周 期 为 8ms(125Hz)计,则可以取样到6次。 (2) 对于不稳定的噪声,在4ms以下则至多抽样一次。 (3) 在触发器之前,接上AND-NOT之后,SR的组态如表所示。
ENTITY SENQGEN IS PORT(CLK,CLR,CLOCK:IN STD_LOGIC; ZO:OUT STD_LOGIC); END SENQGEN;
ARCHITECTURE ART OF SENQGEN IS SIGNAL COUNT:STD_LOGIC_VECTOR(2 DOWNTO 0); SIGNAL Z:STD_LOGIC :=‘0’; BEGIN PROCESS(CLK,CLR) BEGIN IF(CLR=‘1’)THEN COUNT<="000"; ELSE IF(CLK=‘1’AND CLK'EVENT)THEN IF(COUNT="111")THEN COUNT<="000"; ELSE COUNT<=COUNT +‘1’; END IF; END IF; END IF; END PROCESS;
练习
设计一个可逆BCD码计数器BICOUNTER, 输入为CLK,BIR,输出为Q[3..0]。当BIR=‘1’时, 计数器进行加计数;当BIR=‘0’时,计数器进行减 计数。
VHDL程序如下:
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY BICOUNTER IS PORT( clk,BIR:IN STD_LOGIC; Q:OUT STD_LOGIC_VECTOR(3 DOWNTO 0) ); END BICOUNTER;
PROCESS(CLOCK,Z) BEGIN --消除毛刺的锁存器 IF(CLOCK'EVENT AND CLOCK=‘1’)THEN ZO<=Z; END IF; END PROCESS; END ART;
2. 序列信号检测器
一个“01111110”序列信号检测器的VHDL描述 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY DETECT IS PORT( DATAIN:IN STD_LOGIC; CLK:IN STD_LOGIC; Q:OUT STD_LOGIC); END DETECT; ARCHITECTURE ART OF DETECT IS TYPE STATETYPE IS(S0,S1,S2,S3,S4,S5,S6,S7,S8); BEGIN PROCESS(CLK) VARIABLE PRESENT_STATE:STATETYPE; BEGIN Q<=‘0’;
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY debounce IS PORT( D_IN,clk:IN STD_LOGIC; D_OUT:OUT STD_LOGIC ); END debounce; ARCHITECTURE behave OF debounce IS COMPONENT RSCFQ PORT(R,S,CLK:IN STD_LOGIC; Q,QB:BUFFER STD_LOGIC); END COMPONENT RSCFQ; SIGNAL D0,D1,S,R:STD_LOGIC; BEGIN
PROCESS(clk) BEGIN IF clk'event AND clk='1' THEN D0<=D_IN; D1<=D0; END IF; END PROCESS; S<=D0 AND D1; R<=(NOT D0) AND (NOT D1); u1:RSCFQ PORT MAP (R,S,CLK,QB=>D_OUT); END behave;
即D0为1,且D1也为1时,结果S=1,R=0,D_OUT才会输出1.这代表被取样 的D_IN信号,能被连续取样两次1,所以认定他已是稳定的按下按钮。 同理D0为0,且D1也为0时,结果S=0,R=1,D_OUT才会输出0.这代表被取 样的D_IN信号,能被连续取样两次0,所以认定他已是稳定的放掉按钮。 同理若是D0为1,且D1为0,结果S=0,R=0;D_OUT将维持先前的输出不变。 D0=0,D1=1也是如此。 总之,必须取样到两次1才会输出1,两次0才会输出0.
PROCESS(CLK,R,S,Q_S,QB_S) BEGIN LIBRARY IEEE; IF (CLK'EVENT AND CLK='1')THEN USE IEEE.STD_LOGIC_1164.ALL; IF(S='1' AND R='0') THEN Q_S<='0'; ENTITY RSCFQ IS QB_S<='1'; PORT(R,S,CLK:IN STD_LOGIC; ELSIF (S='0'AND R='1') THEN Q,QB:BUFFER STD_LOGIC); Q_S<='1'; END RSCFQ; QB_S<='0'; ELSIF (S='0'AND R='0') THEN Q_S<=Q_S; ARCHITECTURE ART OF RSCFQ IS QB_S<=QB_S; SIGNAL Q_S,QB_S:STD_LOGIC; ELSE BEGIN NULL; END IF; END IF ; Q<=Q_S; QB<=QB_S; END PROCESS; END ART;
ARCHITECTURE a OF BICOUNTER IS SIGNAL Q_B:STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS(clk) BEGIN IF clk'event AND clk='1' THEN IF BIR='1' THEN IF Q_B="1001" THEN Q_B<="0000"; ELSE Q_B<=Q_B+1; END IF; ELSE IF Q_B="0000" THEN Q_B<="1001"; ELSE Q_B<=Q_B-1; END IF; END IF; END IF; END PROCESS; Q<=Q_B; END a;
3 微分电路
提取脉冲前沿
百度文库
Q1
Q2
仿真结果
LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY weifen2 IS PORT( A,clk:IN STD_LOGIC; Qout:OUT STD_LOGIC ); END weifen2;
ARCHITECTURE a OF weifen2 IS SIGNAL Q1,Q2:STD_LOGIC; BEGIN PROCESS(clk) BEGIN IF clk'event AND clk='1' THEN Q1<=A; Q2<=Q1; END IF; END PROCESS; Qout<=Q1 and NOT Q2; END a;
相关文档
最新文档