我是VHDL的新手,我无法找到问题的解决方案。我想找到一个带有T Flip Flop的3位序列计数器的VHDL代码:...,0,4,5,7,6,2,3,1,0,...我做了一个真值表最小化T_FF的方程式如下:
T0 = Q2 xor Q1 xor Q0;
T1 =(Q2 xor Q1)和Q0;
T2 = not(Q2 xor Q1)和Q0;
然后我画出电路:
最后的VHDL:
T-FLIP FLOP
library ieee;
use ieee.std_logic_1164.all;
entity tff is
port(
clk: in std_logic;
reset: in std_logic;
t: in std_logic;
q: out std_logic
);
end tff;
architecture behave of tff is
-- signal q_reg: std_logic; --v registru
-- signal q_next: std_logic; --naslednje stanje
begin
process
variable x: std_logic:='0';
begin
wait on clk;
if (clk' event and clk = '1') then
if reset='1' then
x:='0';
else x:=t;
end if;
end if;
if (t = '1') then
q<=not x;
else
q<=x;
end if;
end process;
end behave;
-----------------------------------------------------------
灰色计数器
library ieee;
use ieee.std_logic_1164.all;
entity tff_gray is
port(
clk: in std_logic;
reset: in std_logic;
q: inout std_logic_vector (2 downto 0)
--q: out std_logic
);
end tff_gray;
architecture behave of tff_gray is
component tff is
port(
clk: in std_logic;
reset: in std_logic;
t: in std_logic;
q: out std_logic
);
end component;
signal i0,i1,i2: std_logic; --v registru
--signal q_next: std_logic; --naslednje stanje
begin
i0<=q(0) xor q(1) xor q(2);
i1<=q(0) and (q(1) xor q(2));
i2<=q(0) and not(q(1) xor q(2));
Tff0: tff port map(clk, reset, i0, Q(0));
Tff1: tff port map(clk, reset, i1, Q(1));
Tff2: tff port map(clk, reset, i2, Q(2));
end behave;
我写了一堆我在互联网上找到的代码。当我编译我的代码时,它都没有问题,但模拟是错误的。我经历了很多次这段代码,我不知道出了什么问题。如果有人有任何想法请分享。 我大部分时间都在YouTube上看过这个altera网站和LBEbooks。
答案 0 :(得分:1)
很多事情。首先:
您的toggle flip-flop说明不正确。
如果T='1'
,则切换触发器会翻转输出。这样:
signal q_int : std_logic := '0';
begin
tff_proc: process(clk) begin
if rising_edge(clk) then
if t='1' then
q_int <= not q_int;
end if;
-- reset statement
if reset='1' then
q_int <= '0';
end if;
end if;
end process;
q <= q_int;
不要将wait on clk
和 if (clk'event and clk='1')
结合起来,因为他们做同样的事情。合并会导致问题。请参阅上面的示例以获得正确的实例化。
您不需要在component tff
实体中加入tff_gray
代码。只需直接从库中实例化实体即可。 e.g。
Tff0: entity work.tff port map(clk, reset, i0, q(0));
inout
类型)使用inout
类型(用于q
tff_gray
)可能会在模拟和实施中出现问题。它应该是out
。
但是,您必须遇到cannot read outputs
错误。这不再是VHDL-2008中的问题,因此您应该使用VHDL-2008模式进行编译。
或者,您需要使用中间信号,就像我在上面的示例中所做的那样。 E.g。
signal q_int : std_logic_vector(2 downto 0) := (others => '0');
[...]
q <= q_int;