VHDL计数器0到99

时间:2014-11-13 18:03:36

标签: vhdl counter

我的代码有问题它应该从0到99计算,但我遇到的问题是计数器从" 80"并且左数仅在10秒时递增,因此它会重复..

像这样的东西 开始于:80 81 82 83 84 04 05 06 07 08 09

我的代码是:

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned;
-- pin 86 selector de display 1 
-- pin 87 selec2 display
-- Seg A pin 85, Seg B 84, Seg C 83, D 82, E 81, F 78, Seg g pin 77, H 76
entity ContadorExamen is 
    port(
        CLK : in std_logic; -- se le asigna el pin   12
        --clk1hz : out std_logic ;-- se le asigna el pin 51
        datos : out std_logic_vector (6 downto 0);
        unidades : out std_logic;
        decenas: out std_logic
    );
end entity;

architecture BH_Examen2Parcial of ContadorExamen is
    signal freq1 : integer range 0 to 5000 := 0;
    signal freqDec : integer range 0 to 24999999 := 0;
    signal freq100 : integer range 0 to 249999999 := 0;
    signal tmp1 : std_logic := '0'; 
    signal tmp100 : std_logic := '0';
    signal tmpDec : std_logic := '0';
    signal counterUnidades : integer range 0 to 10 := 0;
    signal counterDecenas : integer range 0 to 10 := 0;
    signal segDecenas : std_logic_vector(6 downto 0);
    signal segUnidades : std_logic_vector(6 downto 0);
begin
    process(CLK) is 
    begin 
        if(CLK'event and CLK = '1') then 
            if(freq1 >= 5000) then 
                freq1 <= 0;
                tmp1 <= not tmp1;
            else
                freq1 <= freq1 + 1;
                tmp1 <= tmp1;
            end if;

            if(freq100 >= 249999999) then 
                freq100 <= 0;
                tmp100 <= not tmp100;
            else
                freq100 <= freq100 + 1;
                tmp100 <= tmp100;
            end if;

            if(freqDec >= 24999999) then 
                freqDec <= 0;
                tmpDec <= not tmpDec;
            else
                freqDec <= freqDec + 1;
                tmpDec <= tmpDec;
            end if;
        end if;
    end process;

-- principio de cambios en el programa

    process(tmp1) is 
    begin 
        if(tmp1 = '1') then 
            unidades <= '0';
            decenas <= '1';
            datos <= segDecenas; 
        else
            datos <= SegUnidades;
            decenas <= '0';
            unidades <= '1';
        end if;
    end process;

    ParaContarUnidades:process(tmp100) is
    begin
        if (tmp100 = '1') then
            if(counterUnidades = 0) then 
                segUnidades <= "0000001";
            elsif (counterUnidades = 1 ) then 
                segUnidades <= "1001111";  
            elsif (counterUnidades = 2 ) then 
                segUnidades <= "0010010";
            elsif (counterUnidades = 3 ) then 
                segUnidades <= "0000110";
            elsif (counterUnidades = 4 ) then 
                segUnidades <= "1001100";
            elsif (counterUnidades = 5 ) then 
                segUnidades <= "0100100";
            elsif (counterUnidades = 6 ) then 
                segUnidades <= "1100000";
            elsif (counterUnidades = 7 ) then 
                segUnidades <= "0001111";
            elsif (counterUnidades = 8 ) then 
                segUnidades <= "0000000";
            elsif (counterUnidades = 9) then 
                segUnidades <= "0001100";
            else 
                segUnidades <= "1111111";
            end if; 
            if(counterUnidades < 9) then
                counterUnidades <= counterUnidades + 1;
            else 
                counterUnidades <= 0;
            end if;
        end if;
    end process;

    ParaContarDecenas:process(tmpDec) is
    begin
        if (tmpDec = '1') then
            if(counterDecenas = 0) then 
                segDecenas <= "0000001";
            elsif (counterDecenas = 1 ) then 
                segDecenas <= "1001111";  
            elsif (counterDecenas = 2 ) then 
                segDecenas <= "0010010";
            elsif (counterDecenas = 3 ) then 
                segDecenas <= "0000110";
            elsif (counterDecenas = 4 ) then 
                segDecenas <= "1001100";
            elsif (counterDecenas = 5 ) then 
                segDecenas <= "0100100";
            elsif (counterDecenas = 6 ) then 
                segDecenas <= "1100000";
            elsif (counterDecenas = 7 ) then 
                segDecenas <= "0001111";
            elsif (counterDecenas = 8 ) then 
                segDecenas <= "0000000";
            elsif (counterDecenas = 9) then 
                segDecenas <= "0001100";
            else 
                segDecenas <= "1111111";
            end if;
            if(counterDecenas < 9) then
                counterDecenas <= counterDecenas + 1;
            else 
                counterDecenas <= 0;
            end if;
        end if;
    end process;
end architecture;

1 个答案:

答案 0 :(得分:0)

您想要了解的几个问题:

请注意,counterDecenascounterUnidades应位于使用它们的流程的敏感度列表中,因为(如书面所示)您希望更新segUnidadessegDecenas信号当tmpDectmp100保持'1'但计数器发生变化时。

此外,您将计数器分配给基于自身的值(例如counterDecenas <= counterDecenas + 1;)在时钟进程之外 - 这将产生组合循环。这些只需要在时钟边沿触发。

除此之外,我们还不清楚这个实体应该做什么。你说它应该从0到99计数,但这显然比实现你所描述的所需功能所需的1-liner更多。