【问题标题】:Program Counter's Increment Won't Work程序计数器的增量不起作用
【发布时间】: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 &lt;= "0000000000"; 来设置一个初始值,但是这样的并发语句会导致冲突。设置初始值的正确方法是在您的信号声明中,如下所示:signal s_COUNT : STD_LOGIC_VECTOR (9 downto 0) := "0000000000";signal s_COUNT : STD_LOGIC_VECTOR (9 downto 0) := (others =&gt; '0');。 `

标签: vhdl counter increment


【解决方案1】:

QuantumRipple 的评论很有用

begin
--s_COUNT <= "0000000000";
...

我试图评论这样的行,它奏效了。 尝试这样做,并在开始计数之前进行RST

【讨论】:

    【解决方案2】:

    请尝试这种方式并告诉我,我更正了您的代码,但我无法尝试:

    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
    
    proc: process(RST, CLK)
    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;
    end process;
    
    PC_TRI <= s_COUNT when (PC_OE = '1') else (others => 'Z');
    PC_COUNT <= s_COUNT;
    
    
    
    end Behavioral;
    

    【讨论】:

    • 第二个驱动 s_count 会导致它在第一个增量中从 "0000000000" 变为 "0000000000X",并在下一个增量中由于 std_logic_1164 的解析功能而变为 "XXXXXXXXXX"。这与描述的症状不匹配“......从 0 到 1、1 到 2,然后从 2 变为“1111111111”。”
    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 2012-05-17
    • 2019-01-08
    • 2022-01-18
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多