【发布时间】:2014-10-01 07:03:30
【问题描述】:
除了增量功能外,一切正常。它可以从 0 增加到 1,从 1 增加到 2,然后从 2 增加到“1111111111”。我被难住了。
变量:
D_IN:数据输入
PC_OE:高电平有效。驱动 PC_TRI 输出。
PC_LD:高电平有效将 D_IN 同步加载到 PC。
PC_INC:高电平有效同步递增 PC 中的值。
RST:高电平有效异步复位。
PC_COUNT:PC 中的当前值。地址。
PC_TRI:三态控制下 PC 中的当前值。当 PC_OE = '1' 时,PC_TRI
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
entity ProgramCounter is
Port ( D_IN : in STD_LOGIC_VECTOR (9 downto 0);
PC_OE : in STD_LOGIC;
PC_LD : in STD_LOGIC;
PC_INC : in STD_LOGIC;
RST : in STD_LOGIC;
CLK : in STD_LOGIC;
PC_COUNT : out STD_LOGIC_VECTOR (9 downto 0);
PC_TRI : out STD_LOGIC_VECTOR (9 downto 0));
end ProgramCounter;
architecture Behavioral of ProgramCounter is
signal s_COUNT : STD_LOGIC_VECTOR (9 downto 0);
begin
s_COUNT <= "0000000000";
proc: process(RST, CLK, PC_LD, D_IN, s_COUNT, PC_INC, PC_OE)
begin
if (RST = '1') then
s_COUNT <= "0000000000";
elsif (rising_edge(CLK)) then
if (PC_LD = '1') then
s_COUNT <= D_IN;
elsif (PC_INC = '1') then
s_COUNT <= s_COUNT + 1;
else
end if;
else
end if;
if (PC_OE = '1') then
PC_TRI <= s_COUNT;
else
PC_TRI <= "ZZZZZZZZZZ";
end if;
PC_COUNT <= s_COUNT;
end process proc;
end Behavioral;
【问题讨论】:
-
您确定 PC_LD 没有设置错误吗?
-
我很确定。我正在使用模拟器对其进行测试。它说 PC_LD 是“0”。奇怪的是,我输入的数据都不是“1111111111”。我不知道它的价值是从哪里来的。
-
在架构主体中同时分配了
"0000000000"到s_count。正在处理一个额外的驱动程序proc。 “+”将在解析s_counts(0)、'0' 和1后传播'X's。您的测试用例是否能够重现您的症状? -
看起来你想做
s_COUNT <= "0000000000";来设置一个初始值,但是这样的并发语句会导致冲突。设置初始值的正确方法是在您的信号声明中,如下所示:signal s_COUNT : STD_LOGIC_VECTOR (9 downto 0) := "0000000000";或signal s_COUNT : STD_LOGIC_VECTOR (9 downto 0) := (others => '0');。 `