FPGA开发——VHDL实现各类触发器

前言

小编最近在学习时序电路的VHDL设计,通过此文对触发器和VHDL相关知识进行总结,以便日后进行复习、查阅。本文首先回顾了各类触发器的基本知识包括特性方程、状态图等,最后通过VHDL来实现各类触发器。

一、触发器知识回顾

在实际的数字系统中往往包含大量的存储单元,而且经常要求他们在同一时刻同步动作,为达到这个目的,在每个存储单元电路上引入一个时钟脉冲(CLK)作为控制信号,只有当CLK到来时电路才被“触发”而动作,并根据输入信号改变输出状态。把这种在时钟信号触发时才能动作的存储单元电路称为触发器,常见的触发器有D触发器、RS触发器、JK触发器、T触发器,它们是构成时序逻辑电路的基本单元。

名称特性方程逻辑符号状态图
D触发器Q^{n+1} = D
RS触发器(或非门实现)

Q^{n+1} = S+\overline{R}Q^{n}

SR=0(约束条件)

JK触发器Q^{n+1} = J\overline{Q^{n}}+\overline{K}Q^{n}
T触发器Q^{n+1} = T\overline{Q^{n}}+\overline{T}Q^{n}

D触发器真值表:

DQ^{n}Q^{n+1}
000
010
101
111

RS触发器真值表:

SRQ^{n}Q^{n+1}
0000
0011
0100
0110
1001
1011
110不确定
111不确定

RS触发器真值表:

JKQ^{n}Q^{n+1}
0000
0011
0100
0110
1001
1011
1101
1110

T触发器真值表:

YQ^{n}Q^{n+1}
000
011
101
110

二、VHDL实现

在VHDL中完整的条件语句只能构成组合逻辑电路,例如下面的二选一数据选择器。

entity select1of2 is 
	port (a, b, s : in bit;
				y : out bit);
end entity select1of2;

architecture bhv of select1of2 is 
	begin
	process(a,b,s)
	begin
		if(s='1') then y<=a; else y<=b;
		end if;
	end process;
end architecture bhv;

可以观察到二选一数据选择器的RTL电路没有触发器或者锁存器,即没有存储功能。

在VHDL实现时序电路的核心思想就是通过不完整条件语句。为了实现记忆、存储功能,对于不满足条件的的语句,VHDL综合器解释为不予执行,即信号保持前一次的值,不发生改变。对于数字电路来说,当输入改变后仍能保持原值不变,就意味着使用了具有存储功能的元件,其中输出不仅仅取决于输入,还取决于所处的状态。

D触发器代码实现

library ieee;
use ieee.std_logic_1164.all;
entity dff2 is
	port(CLK, RST, EN, D : in std_logic;
					   Q : out std_logic);
end entity dff2;
architecture bhv of dff2 is
	signal Q1 : std_logic;
	begin
	process(CLK, Q1, RST, EN)
		begin
		if RST = '1' then Q1 <= '0';
		elsif CLK'EVENT and CLK = '1' then 
			if EN = '1' then Q1 <= D;
			end if;
		end if;
	end process;
	Q <= Q1;
end architecture bhv;

      

D触发器仿真波形

RS触发器代码实现

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity SR is
	port(S, R, CLK : in std_logic;
				Q  : buffer std_logic);
end entity SR;

architecture bhv of SR is
	signal Q_TEMP : std_logic;
	begin
	process(CLK)
	begin
		if CLK'EVENT and CLK = '1' then 		--或非门构成的SR触发器
			if S = '0' and R = '1' then
			Q_TEMP <= '0';
			elsif S = '1' and R = '0' then 
			Q_TEMP <= '1';
			end if;
		end if;
	Q <= Q_TEMP;
	end process;
end architecture bhv;

RS触发器仿真波形

JK触发器代码实现

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity JK is
	port(CLK,J, K : in std_logic;
			Q, NQ : out std_logic);
end entity JK;

architecture bhv of JK is
	signal Q_TEMP : std_logic;
	signal NQ_TEMP: std_logic;
	begin
	process(CLK, J, K)
	begin
		if CLK'EVENT  and CLK = '1' then
			if (J = '0') and  (K = '1') then
			Q_TEMP <= '0';
			NQ_TEMP <= '1';
			elsif (J = '1') and (K ='0') then
			Q_TEMP <= '1';
			NQ_TEMP <= '0';
			elsif (J = '1') and (K = '1') then
			Q_TEMP <=  not Q_TEMP;
			NQ_TEMP <= not NQ_TEMP;
			end if;
		end if;
	Q <= Q_TEMP;
	NQ <= NQ_TEMP;
	end process;
end architecture bhv;
			
	

JK触发器仿真波形

T触发器代码实现

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity t_ff is
	port(CLK, T : in std_logic;
			Q: buffer  std_logic);
end entity t_ff;

architecture bhv of t_ff is
	signal Q_TEMP : std_logic;
	begin
	process(CLK)
		begin
		if CLK'EVENT and CLK = '1' then
			if T = '1' then 
			Q_TEMP <= not Q_TEMP;
			else
			Q_TEMP <= Q_TEMP;
			end if;
		end if;
	Q <= Q_TEMP;
	end process;
end architecture bhv;
	

T触发器仿真波形

总结

以上就是本文的全部内容,非常感谢你能看到这里(仿真波形有一定的延迟)。

  • 13
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

门牙会稍息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值