Делитель частоты и последующее обнаружение фронта сигнала - PullRequest
0 голосов
/ 08 ноября 2019

Здравствуйте, я очень новичок в мире программирования на VHDL, и у меня возникли проблемы с реализацией делителя частоты наряду с обнаружением границ сигнала. Код состоит из 6 кнопочных входов, каждый из которых будет работать, и вырабатывает импульс с частотой 1 кГц от 50 МГц. Проблема, которую я экспериментирую, как показано на рисунке, я получаю U в каждой входной переменной. Я искал в Интернете несколько разделителей частоты, но пока не добился успеха. Также я знаю о реализации определенного способа кода для загрузки его в fpga и другого для simulatin в 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;```[Results of simulation][1]


  [1]: https://i.stack.imgur.com/rPFCF.png

1 Ответ

1 голос
/ 08 ноября 2019

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

  1. Силовые часы и постоянные из графического интерфейса симуляции. Vivado GUI
  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

...