fpga не может получить простой регистр - PullRequest
0 голосов
/ 30 июня 2018

Я знаю, что это просто, но мне трудно заставить это работать. Я «читаю» с выводов ввода-вывода и хочу «сохранить» биты в простом буфере. По какой-то причине я ничего не получаю в выводе. Вот код, который я запускаю, анализатор Netlist и форма волны, которую я получил, запустив тестовый стенд. Я пытался применить то, что видел в других кодах, но это не сработало.

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity InputBuffer is
    generic( n: natural := 4 );
    Port (    
        clk    : in STD_LOGIC;
        CLK65  : IN STD_LOGIC;
        En     : in STD_LOGIC;
        STRT   : OUT STD_LOGIC;
        Ipin   : in  STD_LOGIC_VECTOR (n-1 downto 0);
        Output : out  STD_LOGIC_VECTOR (n-1 downto 0)
        );
end InputBuffer;

architecture Behavioral of InputBuffer is
    signal temp : STD_LOGIC_VECTOR(n-1 downto 0);
    SIGNAL CLK2 : STD_LOGIC;
begin
    -- invert the signal from the push button switch and route it to the LED
    process(clk, En)
    begin
        if( En = '1') then
            temp <= B"0000";
        elsif rising_edge(clk) then
            temp <= Ipin; 
        end if;
    end process;
    Output <=  temp;
    STRT <= CLK65;
end Behavioral;

а вот тестовый стенд, который я использую.

     -- VHDL Test Bench Created from source file InputBuffer.vhd -- Fri Jun 29 22:45:57 2018

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.numeric_std.ALL;

ENTITY testbench IS
END testbench;

ARCHITECTURE behavior OF testbench IS 

    COMPONENT InputBuffer
    PORT(
        clk : IN std_logic;
        CLK65 : IN std_logic;
        En : IN std_logic;
        Ipin : IN std_logic_vector(3 downto 0);          
        STRT : OUT std_logic;
        Output : OUT std_logic_vector(3 downto 0)
        );
    END COMPONENT;

    SIGNAL clk :  std_logic;
    SIGNAL CLK65 :  std_logic;
    SIGNAL En :  std_logic;
    SIGNAL STRT :  std_logic;
    SIGNAL Ipin :  std_logic_vector(3 downto 0);
    SIGNAL Output :  std_logic_vector(3 downto 0);  

    constant delay : time := 10 ns;

BEGIN

-- Please check and add your generic clause manually
    uut: InputBuffer PORT MAP(
        clk => clk,
        CLK65 => CLK65,
        En => En,
        STRT => STRT,
        Ipin => Ipin,
        Output => Output
    );

    En <= '0';
    clk <= '0';
    clk65 <= '0';
    Ipin <= B"0000";
-- *** Test Bench - User Defined Section ***
   tb : PROCESS
   BEGIN  
      wait for delay;
      clk <='1'; 
      clk65 <='1';
      wait for delay;
      clk <='0';


      wait for delay;
      clk <='1';
      clk65 <='0';

      wait for delay;
      clk <='0';
      --wait; -- will wait forever
   END PROCESS;
-- *** End Test Bench - User Defined Section ***

END;

enter image description here

enter image description here

1 Ответ

0 голосов
/ 01 июля 2018

Добавление вашего тестового стенда к вашему вопросу при условии Минимальный, полный и проверяемый пример .

Для тех из нас, кто не может правильно интерпретировать отображение вашей формы сигнала, может помочь цветная версия вместе с курсором, показывающим значения, перемещенные в критическую часть вашей формы сигнала:

testbench.jpg

В этом отображении осциллограммы мы видим, что скалярные сигналы (clk и т. Д.) Отображаются в виде «X», как в вашей цепочке инструментов «Решетка», в виде красных прямоугольников для «X» (вышеупомянутая форма сигнала выполняется с помощью gtkwave и ghdl).

То, что часы меняются между «X» и «0», говорит о том, что в тестовом стенде есть два драйвера для clk, и «0» появляется, когда оба драйвера запускают «0».

Драйвер создается путем назначения сигнала в процессе.

Параллельные назначения сигналов разрабатываются в эквивалентный процесс (IEEE Std 1076-2008 11.6 Параллельные операторы назначения сигналов «Оператор одновременного назначения сигналов представляет собой эквивалентный оператор процесса, который присваивает значения сигналам». чей список чувствительности определяется с помощью 10.2 оператора ожидания «Это правило также используется для построения наборов чувствительности операторов ожидания в эквивалентных операторах процесса для операторов одновременного вызова процедуры (11.4), операторов одновременного утверждения (11.5) и операторов одновременного назначения сигналов (11.6). ".

Значение сигналов с несколькими драйверами определяется, как указано в 14.7.3.2 Управляющие значения:

e) Если S является основным сигналом:

...
- Если S является разрешенным сигналом и имеет один или несколько источников, то исследуются значения возбуждения источников S. Будет ошибкой, если какое-либо из этих значений возбуждения является составным, когда одно или несколько значений субэлемента определяются нулевой транзакцией (см. 10.5.2.2), а одно или несколько значений субэлемента не определяются нулевой транзакцией. Если S имеет регистр типа сигнала, и все источники S имеют значения, определенные нулевой транзакцией, то значение S для возбуждения не изменяется по сравнению с его предыдущим значением. В противном случае управляющее значение S получается путем выполнения функции разрешения, связанной с S, где эта функция вызывается с входным параметром, состоящим из объединения значений возбуждения источников S, за исключением значения любого источника. из S, текущее значение которого определяется нулевой транзакцией.

Где функция разрешения для типа std_logic находится в пакете IEEE std_logic_1164.

Так где же два драйвера для clk (и clk64)?

    En <= '0';
    clk <= '0';
    clk65 <= '0';
    Ipin <= B"0000";
-- *** Test Bench - User Defined Section ***
   tb : PROCESS
   BEGIN  
      wait for delay;
      clk <='1'; 
      clk65 <='1';
      wait for delay;
      clk <='0';


      wait for delay;
      clk <='1';
      clk65 <='0';

      wait for delay;
      clk <='0';
      --wait; -- will wait forever
   END PROCESS;

Непосредственно над процессом tb находятся четыре одновременных оператора присваивания. Два вызывающих нескольких драйвера могут быть закомментированы (clk и clk64), не требуя начальных значений в объявлениях сигналов, потому что вы форсируете их значение в процессе.

Если мы закомментируем параллельные назначения сигналов для clk и clk65, ваш тестовый стенд сработает:

testbench_fixed.jpg

...