Делитель частоты и последующее обнаружение фронта сигнала

Я очень новичок в мире программирования VHDL, и у меня возникают проблемы с реализацией делителя частоты вместе с обнаружением фронтов сигнала. Код состоит из 6 входов кнопок, каждый из которых будет работать и выводить импульсы с частотой 1 кГц от 50 МГц.

Проблема, с которой я экспериментирую, как видно на рисунке: я получаю U в каждой входной переменной. Я искал в Интернете несколько делителей частоты, но пока безуспешно. Также я знаю о реализации определенного способа загрузки кода в fpga и другого способа моделирования в xilinx.

use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
use ieee.std_logic_unsigned.all;

entity armmov is
port(
    CLK_50MHz: in std_logic;
    rst  : in std_logic;
    BTN1 : in std_logic;
    BTN2 : in std_logic;
    BTN3 : in std_logic;
    BTN4 : in std_logic;
    BTN5 : in std_logic;
    BTN6 : in std_logic;
    PUL1 : out std_logic;
    PUL2 : out std_logic;
    PUL3 : out std_logic;
    PUL4 : out std_logic;
    PUL5 : out std_logic;
    PUL6 : out std_logic
);
end armmov;

architecture Behavioral of armmov is
signal Counter : integer := 1;
signal CLK_1KHz: std_logic := '0';

begin

process (CLK_50MHz,rst)
begin
        if (rst = '1') then
        Counter <= 1;
        CLK_1KHz <= '0';

    elsif(CLK_50MHz'event and CLK_50MHz='1') then
    Counter <= Counter + 1;
    if (Counter = 25000) then
    CLK_1KHz <= NOT CLK_1KHz;
    Counter <= 1;
    end if;
end if;
end process;


process(CLK_1KHz)
begin

if BTN1='1' then
PUL1<=CLK_1KHz;
else
PUL1 <='0';
end if;

if BTN2='1' then
PUL2<=CLK_1KHz;
else
PUL2 <='0';
end if;

if BTN3='1' then
PUL3<=CLK_1KHz;
else
PUL3 <='0';
end if;

if BTN4='1' then
PUL4<=CLK_1KHz;
else
PUL4 <='0';
end if;

if BTN1='1' then
PUL1<=CLK_1KHz;
else
PUL1<='0';
end if;

if BTN2='1' then
PUL2<=CLK_1KHz;
else
PUL2<='0';
end if;

if BTN3='1' then
PUL3<=CLK_1KHz;
else
PUL3<='0';
end if;

if BTN4='1' then
PUL4<=CLK_1KHz;
else
PUL4<='0';
end if;

if BTN5='1' then
PUL5<=CLK_1KHz;
else
PUL5<='0';
end if;

if BTN6='1' then
PUL6<=CLK_1KHz;
else
PUL6<='0';
end if;

end process;

end Behavioral;

Результаты моделирования


person Mak Buck    schedule 08.11.2019    source источник


Ответы (1)


Входные значения "U", потому что эти сигналы не управляются. Вы можете управлять этими сигналами двумя способами.

  1. Принудительные часы и константа из графического интерфейса моделирования. Графический интерфейс Vivado
  2. Напишите тестовый стенд для управления этими значениями

PS: Не используйте ieee.std_logic_unsigned и подобные библиотеки, потому что они не стандартизированы. Вместо этого используйте ieee.numeric_std.all.

Несколько полезных сайтов для изучения VHDL:

  1. https://vhdlwhiz.com/basic-vhdl-tutorials/

  2. https://insights.sigasi.com/tech/

  3. https://www.nandland.com/articles/coding-style-recommendations-vhdl-verilog.html

person maximus    schedule 08.11.2019