用VHDL实现计数器

时间:2017-03-19 17:34:21

标签: vhdl

以下代码实现了一个两位数的计数器,并在七个段上显示输出。可以看出,在每个时钟周期中,必须改变该值,但模拟结果不显示这样的事情。为了减少代码大小,我只将0和1放在七段驱动程序中。

library ieee;
use ieee.std_logic_1164.all;

entity two_digit_counter is
    port( clk: in std_logic;
          x, y: out std_logic_vector( 6 downto 0 ));
end;

architecture x of two_digit_counter is
begin
    process( clk )
        variable d1 : integer range 0 to 9 := 0;
        variable d2 : integer range 0 to 9 := 0;
    begin
        if (clk'event and clk = '1') then
            if d1 = 9 then
                d1 := 0;
                d2 := d2 + 1;
            elsif d2 = 9 then
                d2 := 0;
                d1 := 0;
            else
                d1 := d1 + 1;
            end if;
        end if;

        case d1 is
            when 0   =>    x <= "1111110";  -- 7E
            when 1   =>    x <= "0110000";  -- 30
        end case;
        case d2 is
            when 0   =>    x <= "1111110";
            when 1   =>    x <= "0110000";
        end case;
    end process;
end;

enter image description here

3 个答案:

答案 0 :(得分:1)

不幸的是,除了丢失的y分配外,你的d2计数器还没有正常工作:

d2_bottom_trace.png

d2底部曲线应该保存10个d1计数的每个值(此处显示为10秒.if语句不全面且应该更改.d1也显示不正确。

通过嵌套两个计数器if语句来修复它:

    process (clk)
        variable d1 : integer range 0 to 9 := 0;
        variable d2 : integer range 0 to 9 := 0;
    begin
        if rising_edge(clk) then
            -- if d1 = 9 then
            --     d1 := 0;
            --     d2 := d2 + 1;
            -- elsif d2 = 9 then
            --     d2 := 0;
            --     d1 := 0;
            -- else
            --     d1 := d1 + 1;
            -- end if;
            if d1 = 9 then       -- nested if statements
                d1 := 0;
                if d2 = 9 then
                    d2 := 0;
                else
                    d2 := d2 + 1;
                end if;
            else
                d1 := d1 + 1;
            end if;
        end if; 
        case d1 is
            when 0   =>    x <= "1111110";  -- 7E
            when 1   =>    x <= "0110000";  -- 30
            when 2   =>    x <= "1101101";  -- 6D
            when 3   =>    x <= "1111001";  -- 79
            when 4   =>    x <= "0110011";  -- 33
            when 5   =>    x <= "1011011";  -- 5B
            when 6   =>    x <= "1011111";  -- 5F
            when 7   =>    x <= "1110000";  -- 70
            when 8   =>    x <= "1111111";  -- 7F
            when 9   =>    x <= "1111011";  -- 7B
        end case;
        case d2 is
            when 0   =>    y <= "1111110";   -- WAS assignment to x
            when 1   =>    y <= "0110000";   -- ""
            when 2   =>    y <= "1101101";
            when 3   =>    y <= "1111001";
            when 4   =>    y <= "0110011";
            when 5   =>    y <= "1011011";
            when 6   =>    y <= "1011111";
            when 7   =>    y <= "1110000";
            when 8   =>    y <= "1111111";
            when 9   =>    y <= "1111011";
        end case;
    end process;

这就产生了:

two_digit_counter_tb_fixed.png

如果您的问题提供了Minimal, Complete and Verifiable example,那么您的问题的其他答案可能会指出这一点。

答案 1 :(得分:0)

不是吗?

    case d2 is
        when 0   =>    y <= "1111110";
        when 1   =>    y <= "0110000";
    end case;
    --                 ^
    --                 |
    --        shouldn't this be y ?

答案 2 :(得分:0)

您是否真的要求case d2覆盖x声明分配给case d1的值?或者你的意思是y

如果从d1和d2派生x和y的逻辑纯粹是组合的,你可以将它移出过程。