VHDL 中的 5 位 D 触发器计数器导致未定义的结果
5 bit D Flip Flop Counter in VHDL Results in undefined results
我正在尝试使用(上升沿)D 触发器创建 this 5 bit up counter,并使用 VHDL 启用复位和 CK,但无论我做什么,return 值始终未定义。我可以验证触发器是否运行良好。检查以下代码:
DFF.vhd
library IEEE;
use IEEE.std_logic_1164.all;
entity DFFis
port(
D: in std_logic; -- Data input
C: in std_logic; -- Clock input
CE: in std_logic; -- Clock enable
CLR: in std_logic; -- Asynchronous reset
Q: out std_logic -- Data output
);
end DFF;
architecture arch of DFF is
signal q_i: std_logic;
begin
process(C, CE, CLR)
begin
if (CLR='1') then
Q<='0';
elsif (rising_edge(C)) and (CE ='1') then
Q<=D;
end if;
end process;
end arch;
counter.vhd
library IEEE;
use IEEE.std_logic_1164.all;
entity counter is
port (
C: in std_logic;
CLR: in std_logic;
bits: out std_logic_vector(4 downto 0)
);
end counter;
architecture arch of counter is
component DFF
port(
D: in std_logic; -- Data input
C: in std_logic; -- Clock input
CE: in std_logic; -- Clock enable
CLR: in std_logic; -- Asynchronouse reset
Q: out std_logic -- Data output
);
end component;
signal q: std_logic_vector(4 downto 0);
signal nq: std_logic_vector(4 downto 0);
begin
bits<=q;
q(0) <= '1';
nq <= not q;
DFF0: DFF port map (
D=>nq(0),
C=>C,
CE=>'1',
CLR=>CLR,
Q=>q(0)
);
DFF1: DFF port map (
D=>nq(1),
C=>nq(0),
CE=>'1',
CLR=>CLR,
Q=>q(1)
);
DFF2: DFF port map (
D=>nq(2),
C=>nq(1),
CE=>'1',
CLR=>CLR,
Q=>q(2)
);
DFF3: DFF port map (
D=>nq(3),
C=>nq(2),
CE=>'1',
CLR=>CLR,
Q=>q(3)
);
DFF4: DFF port map (
D=>nq(4),
C=>nq(3),
CE=>'1',
CLR=>CLR,
Q=>q(4)
);
end arch;
并且出于测试目的,counter_TB.vhd
library IEEE;
use IEEE.std_logic_1164.all;
entity counter_TB is
end counter_TB;
architecture arch of counter_TB is
component counter
port(
C: in std_logic;
CLR: in std_logic;
bits: out std_logic_vector(4 downto 0)
);
end component;
signal C: std_logic:='0';
signal CLR: std_logic:='0';
signal bits: std_logic_vector(4 downto 0);
begin
test: counter port map (C=>C, CLR=>CLR, bits=>bits);
process
begin
C<='1'; CLR<='0';
wait for 1 us;
C<='0'; CLR<='0';
wait for 1 us;
C<='1'; CLR<='0';
wait for 1 us;
end process;
end arch;
当 运行 测试台时,我在循环中得到以下结果(我知道它为什么循环,这不是问题所在):
Result
我尝试将信号 q 初始化为“00000”和“00001”,但结果是一样的。
此处提供的代码中存在三个可观察到的错误。
首先,DFF 实体声明在 DFF 和 is 之间缺少分隔符(space)。
其次,在计数器的架构arch中有两个用于信号q(0)的驱动程序。应该删除对 q(0) 的并发分配。
第三,测试台没有为 DFF 中的清除提供 CLR = '1' 条件。一个 'U' 倒过来就是 'U'.
process
begin
C<='1'; -- CLR<='1';
if now < 1 us then
CLR <= '1';
end if;
wait for 1 us;
C<='0'; CLR<='0';
wait for 1 us;
-- C<='1'; CLR<='0';
-- wait for 1 us;
end process;
这导致:
(作为在测试台中提供重置的方法,此示例更改并不包含所有内容。)
我正在尝试使用(上升沿)D 触发器创建 this 5 bit up counter,并使用 VHDL 启用复位和 CK,但无论我做什么,return 值始终未定义。我可以验证触发器是否运行良好。检查以下代码:
DFF.vhd
library IEEE;
use IEEE.std_logic_1164.all;
entity DFFis
port(
D: in std_logic; -- Data input
C: in std_logic; -- Clock input
CE: in std_logic; -- Clock enable
CLR: in std_logic; -- Asynchronous reset
Q: out std_logic -- Data output
);
end DFF;
architecture arch of DFF is
signal q_i: std_logic;
begin
process(C, CE, CLR)
begin
if (CLR='1') then
Q<='0';
elsif (rising_edge(C)) and (CE ='1') then
Q<=D;
end if;
end process;
end arch;
counter.vhd
library IEEE;
use IEEE.std_logic_1164.all;
entity counter is
port (
C: in std_logic;
CLR: in std_logic;
bits: out std_logic_vector(4 downto 0)
);
end counter;
architecture arch of counter is
component DFF
port(
D: in std_logic; -- Data input
C: in std_logic; -- Clock input
CE: in std_logic; -- Clock enable
CLR: in std_logic; -- Asynchronouse reset
Q: out std_logic -- Data output
);
end component;
signal q: std_logic_vector(4 downto 0);
signal nq: std_logic_vector(4 downto 0);
begin
bits<=q;
q(0) <= '1';
nq <= not q;
DFF0: DFF port map (
D=>nq(0),
C=>C,
CE=>'1',
CLR=>CLR,
Q=>q(0)
);
DFF1: DFF port map (
D=>nq(1),
C=>nq(0),
CE=>'1',
CLR=>CLR,
Q=>q(1)
);
DFF2: DFF port map (
D=>nq(2),
C=>nq(1),
CE=>'1',
CLR=>CLR,
Q=>q(2)
);
DFF3: DFF port map (
D=>nq(3),
C=>nq(2),
CE=>'1',
CLR=>CLR,
Q=>q(3)
);
DFF4: DFF port map (
D=>nq(4),
C=>nq(3),
CE=>'1',
CLR=>CLR,
Q=>q(4)
);
end arch;
并且出于测试目的,counter_TB.vhd
library IEEE;
use IEEE.std_logic_1164.all;
entity counter_TB is
end counter_TB;
architecture arch of counter_TB is
component counter
port(
C: in std_logic;
CLR: in std_logic;
bits: out std_logic_vector(4 downto 0)
);
end component;
signal C: std_logic:='0';
signal CLR: std_logic:='0';
signal bits: std_logic_vector(4 downto 0);
begin
test: counter port map (C=>C, CLR=>CLR, bits=>bits);
process
begin
C<='1'; CLR<='0';
wait for 1 us;
C<='0'; CLR<='0';
wait for 1 us;
C<='1'; CLR<='0';
wait for 1 us;
end process;
end arch;
当 运行 测试台时,我在循环中得到以下结果(我知道它为什么循环,这不是问题所在):
Result
我尝试将信号 q 初始化为“00000”和“00001”,但结果是一样的。
此处提供的代码中存在三个可观察到的错误。
首先,DFF 实体声明在 DFF 和 is 之间缺少分隔符(space)。
其次,在计数器的架构arch中有两个用于信号q(0)的驱动程序。应该删除对 q(0) 的并发分配。
第三,测试台没有为 DFF 中的清除提供 CLR = '1' 条件。一个 'U' 倒过来就是 'U'.
process
begin
C<='1'; -- CLR<='1';
if now < 1 us then
CLR <= '1';
end if;
wait for 1 us;
C<='0'; CLR<='0';
wait for 1 us;
-- C<='1'; CLR<='0';
-- wait for 1 us;
end process;
这导致:
(作为在测试台中提供重置的方法,此示例更改并不包含所有内容。)