VHDL — счетчик из семи сегментов назад и вперед

#vhdl #vivado

#vhdl #vivado

Вопрос:

Я выполняю задание в университете, где код был задан со старой платы, и мне пришлось запускать его на новой. (Nexys —> Basys3). В одной из задач было необходимо довести количество семи сегментов до 9 (0-1-2-3-4-5-6-7-8-9), а затем вернуться к 0 (9-8-7-6-5-4-3-2-1-0). Я выполнил это задание, но учителю не понравилось, как именно оно считается. Это было что-то вроде (0-1-2-3-4-5-6-7-8-9 -> 9-8-7-6-5-4-3-2-1-0-0-1 …), Но должно быть (… 1-0-1 …).

И еще одна задача заключается в том, что с каждой новой цифрой маленькая точка должна изменять ее значение (0 <—> 1) Я, честно говоря, не до конца понимаю синтаксис VHDL,. что значительно усложняет задачу.

Итак, мои вопросы:

  1. На данный момент я не могу понять, почему у меня есть этот дополнительный «0» при подсчете … и как я могу это исправить?
  2. Как заставить маленькую точку изменить ее значение, чтобы она «мигала»?

Да, я знаю, что вы должны просто изменить значение правильного бита примерно так … seg(7) <= '1'; но по какой-то причине даже это не работает … или опять я чего-то не до конца понимаю.

Код:

.vhd

 library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Nexysdemo is
    Port (
        clk    : in std_logic;
        btn     : in std_logic_vector(3 downto 0);
        sw     : in std_logic_vector(7 downto 0);
        led     : out std_logic_vector(7 downto 0); -- Cathode patterns of 7-segment
        an      : out std_logic_vector(3 downto 0); --4 Anode signals
        seg     : out std_logic_vector(7 downto 0));
end Nexysdemo;

architecture Behavioral of Nexysdemo is

    ------------------------------------------------------------------------
    -- Signal Declarations
    ------------------------------------------------------------------------

    signal clkdiv  : std_logic_vector(24 downto 0); -- 24 downto 0
    signal cntr    : std_logic_vector(4 downto 0); -- 3 downto 0
    signal cclk    : std_logic;
    signal dig     : std_logic_vector(6 downto 0);

    ------------------------------------------------------------------------
    -- Module Implementation
    ------------------------------------------------------------------------

    begin

    led <= sw;
    
    dig <=    
            "0111111" when cntr = "00000" else --0 
            "0000110" when cntr = "00001" else --1 
            "1011011" when cntr = "00010" else --2 
            "1001111" when cntr = "00011" else --3 
            "1100110" when cntr = "00100" else --4 
            "1101101" when cntr = "00101" else --5 
            "1111101" when cntr = "00110" else --6 
            "0000111" when cntr = "00111" else --7 
            "1111111" when cntr = "01000" else --8 
            "1101111" when cntr = "01001" else --9 
            
            "1111111" when cntr = "01010" else --8
            "0000111" when cntr = "01011" else --7
            "1111101" when cntr = "01100" else --6
            "1101101" when cntr = "01101" else --5
            "1100110" when cntr = "01110" else --4
            "1001111" when cntr = "01111" else --3
            "1011011" when cntr = "10000" else --2 A
            "0000110" when cntr = "10001" else --1 B
            "0111111" when cntr = "10010" else --0 C
            
            "0000000";
            

   seg(6 downto 0) <= not dig;

    an <= btn;

   seg(7) <= '1';
    

    -- Divide the master clock (100Mhz) down to a lower frequency.
    process (clk)
        begin
            if clk = '1' and clk'Event then
                clkdiv <= clkdiv   1;
            end if;
        end process;

    cclk <= clkdiv(24); --24

    process (cclk)
        begin
            if cclk = '1' and cclk'Event then
                if cntr = "10010" then --1001
                    cntr <= "00000";
                else
                    cntr <= cntr   1;
                end if;
            end if;
            
        end process;

end Behavioral;

 

Basys-3-Master.xdc

 # Clock signal
set_property PACKAGE_PIN W5 [get_ports clk]
    set_property IOSTANDARD LVCMOS33 [get_ports clk]
    create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]

## Switches
set_property PACKAGE_PIN V17 [get_ports {sw[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sw[0]}]
set_property PACKAGE_PIN V16 [get_ports {sw[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sw[1]}]
set_property PACKAGE_PIN W16 [get_ports {sw[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sw[2]}]
set_property PACKAGE_PIN W17 [get_ports {sw[3]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sw[3]}]
set_property PACKAGE_PIN W15 [get_ports {sw[4]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sw[4]}]
set_property PACKAGE_PIN V15 [get_ports {sw[5]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sw[5]}]
set_property PACKAGE_PIN W14 [get_ports {sw[6]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sw[6]}]
set_property PACKAGE_PIN W13 [get_ports {sw[7]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {sw[7]}]

## LEDs
set_property PACKAGE_PIN U16 [get_ports {led[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]
set_property PACKAGE_PIN E19 [get_ports {led[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
set_property PACKAGE_PIN U19 [get_ports {led[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]
set_property PACKAGE_PIN V19 [get_ports {led[3]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]
set_property PACKAGE_PIN W18 [get_ports {led[4]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {led[4]}]
set_property PACKAGE_PIN U15 [get_ports {led[5]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {led[5]}]
set_property PACKAGE_PIN U14 [get_ports {led[6]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {led[6]}]
set_property PACKAGE_PIN V14 [get_ports {led[7]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {led[7]}]

##7 segment display
set_property PACKAGE_PIN W7 [get_ports {seg[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {seg[0]}]
set_property PACKAGE_PIN W6 [get_ports {seg[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {seg[1]}]
set_property PACKAGE_PIN U8 [get_ports {seg[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {seg[2]}]
set_property PACKAGE_PIN V8 [get_ports {seg[3]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {seg[3]}]
set_property PACKAGE_PIN U5 [get_ports {seg[4]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {seg[4]}]
set_property PACKAGE_PIN V5 [get_ports {seg[5]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {seg[5]}]
set_property PACKAGE_PIN U7 [get_ports {seg[6]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {seg[6]}]
set_property PACKAGE_PIN V7 [get_ports {seg[7]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {seg[7]}]

set_property PACKAGE_PIN U2 [get_ports {an[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {an[0]}]
set_property PACKAGE_PIN U4 [get_ports {an[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {an[1]}]
set_property PACKAGE_PIN V4 [get_ports {an[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {an[2]}]
set_property PACKAGE_PIN W4 [get_ports {an[3]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {an[3]}]

##Buttons
set_property PACKAGE_PIN U18 [get_ports {btn[0]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {btn[0]}]
set_property PACKAGE_PIN T18 [get_ports {btn[1]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {btn[1]}]
set_property PACKAGE_PIN W19 [get_ports {btn[2]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {btn[2]}]
set_property PACKAGE_PIN T17 [get_ports {btn[3]}]
    set_property IOSTANDARD LVCMOS33 [get_ports {btn[3]}]


## Configuration options, can be used for all designs
set_property CONFIG_VOLTAGE 3.3 [current_design]
set_property CFGBVS VCCO [current_design]

 

Комментарии:

1. Эти два вопроса не относятся к VHDL и не показывают исследовательских усилий. 1. На данный момент я не могу понять, почему у меня есть этот дополнительный «0» при подсчете … и как я могу это исправить? считайте ctr от 0 до 17 («10001») вместо от 0 до 18 («10010»), прежде чем присваивать ctr значение 0 («00000»). Также удалите "0111111" when cntr = "10010" else --0 C одновременное условное присвоение dig . 2. Как заставить маленькую точку изменить ее значение, чтобы она «мигала»? Как быстро? seg(7) Вместо ‘1’ назначьте вывод счетчика. (десятичная точка подключена к выводу V7, seg(6 downto 0) имеет 7 элементов).

2. Сработало ли это в симуляции? Где ваш тестовый стенд?