VHDL中的4位U / D计数器

时间:2013-12-16 17:11:26

标签: counter vhdl

我正在尝试在VHDL中编码一个4位计数器,从“0000”到“1111”或从“1111”到“0000”计数,具体取决于我的UD变量的值(如果UD ='1'它应该倒计时,如果它是'0',那么。当我的计数器到达计数器的一侧(0或15)时,还有一个信号RCO_L得到值='0'。最后有一个ENP_L信号,当它被设置为1时禁止我的计数器。

我发现很难编码,因为我是VHDL的新手,而且我遇到了很多错误。如果有人能帮助我,我真的很感激。

这是我到目前为止所做的:

*entity contador is
    Port ( A : in  STD_LOGIC_VECTOR(3 downto 0);
           CLK : in  STD_LOGIC;
           LOAD_L : in  STD_LOGIC;
           UD : in  STD_LOGIC;
           ENP_L : in  STD_LOGIC;
              Q : out  STD_LOGIC (3 downto 0);
           RCO_L : out  STD_LOGIC);
end contador;
architecture Behavioral_contador of contador is
signal contador : STD_LOGIC_VECTOR(3 downto 0);
begin
process (CLK,UD,LOAD_L,ENP_L)
    begin
    if (CLK'event AND LOAD_L='0') then
        Q <= A;
    elsif (CLK'event AND LOAD_L='1') then
        if (UD='0') then
            contador <= contador + 1;
        elsif (UD='1') then
            contador <= contador - 1;
        end if;
        if (contador="0000" and ENP_L='0') then
            RCO_L='0';
            if (UD='0') then
                contador="0001";
            elsif (UD='1') then
                contador="1111";
            end if;
        else
        RCO='1';
        end if;
    end if;
end process;
Q <= contador;
end Behavioral_contador;*

PD,如果它有助于这是错误控制台结果:

*ERROR:HDLCompiler:535 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 40: Index constraint prefix std_logic should be an array type
ERROR:HDLCompiler:854 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 34: Unit <contador> ignored due to previous errors.
ERROR:HDLCompiler:374 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 44: Entity <contador> is not yet compiled.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 46: <std_logic_vector> is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 53: <q> is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 56: <contador> is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 58: <contador> is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 57: <ud> is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 55: <ud> is not declared.
ERROR:HDLCompiler:806 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 61: Syntax error near "=".
ERROR:HDLCompiler:806 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 63: Syntax error near "=".
ERROR:HDLCompiler:837 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 63: Type  void does not match with a string literal
ERROR:HDLCompiler:806 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 65: Syntax error near "=".
ERROR:HDLCompiler:837 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 65: Type  void does not match with a string literal
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 64: <ud> is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 62: <ud> is not declared.
ERROR:HDLCompiler:806 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 68: Syntax error near "=".
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 60: <contador> is not declared.
ERROR:HDLCompiler:69 - "/home/edig/Escritorio/vhdl/contador.vhd" Line 54: <clk> is not declared.*

2 个答案:

答案 0 :(得分:1)

首先,您的计数变量应为unsigned而不是std_logic_vectorIf you want a vector to represent a number, choose the right type

其次,只需要一条clk'event行。事实上,这些日子的成语是使用rising_edge(clk)函数。您不需要灵敏度列表中的所有信号,只需要时钟。

然后将所有控制逻辑放在if rising_edge(clk) then

一旦你修复了所有的语法错误(使用编译器,或得到像Sigasi's这样的编辑器,然后构建一个测试平台,它将创建时钟和其他输入信号,以便你可以看到它是否正常工作。为了获得额外的功劳,让测试台实际检查输出是否符合您的要求,而不是自己盯着波形 - 这很快就会变得乏味!

此外,对未来的建议 - 如果您在这里提问,请发布

代码
  • 正确缩进(再次使用Sigasi,它对于小代码是免费的,只是完成工作)
  • 没有语法错误。

粗俗的问题不太可能对答案产生太大影响,抱歉!

答案 1 :(得分:0)

大多数都是语法错误。例如, Q 应为 std_logic_vector 。此外,当您需要在输出处写一些内容时,您提到如下:输出&lt; =输入而不是 RCO_L ='0'; 。信号 contador 属于std_logic_vector,您无法以这种方式在std_logic_vector中递增/递减 1 。首先,您必须将它们转换为无符号值,只需提及here