Выход детектора последовательности на FPGA с использованием 3 входных переключателей

Я создал детектор битовой последовательности (для последовательности 1110), используя VHDL. Для выполнения этой задачи я использовал конечный автомат Мура.

Я могу скомпилировать свой код и получить желаемый результат.

Но на плате FPGA я должен использовать SW0 в качестве часов, SW1 в качестве ввода данных, SW2 в качестве RESET, любой светодиод в качестве вывода данных.

Проблемы, с которыми я сталкиваюсь:

  1. Я не могу назначить тактовый сигнал переключателю, я всегда получаю сообщение об ошибке. Поэтому я назначил тактовый сигнал тактовому сигналу по умолчанию на плате, т. Е. LOC = «E3», он работает нормально. Но по моему вопросу мне нужно назначить его переключателю. Как это сделать?

  2. Я не могу показать вывод на плате fpga, т.е. светодиод загорается слишком быстро для невооруженного глаза после применения данных на выводе. Любое предложение о том, как отображать выход с помощью 3 входных переключателей и светодиода в качестве выхода в соответствии с приведенным выше вопросом?

Следующий код является моей реализацией дизайна:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Design is

    Port ( clock : in STD_LOGIC;
           din : in STD_LOGIC;
           rst : in STD_LOGIC;
           dout : out STD_LOGIC);
end Design;

architecture Behavioral of Design is

type state is (st0, st1, st2, st3, st4);
signal present_state, next_state : state;
begin

synchronous_process: process (clock)

begin
if rising_edge(clock) then
if (rst = '1') then
present_state <= st0;
else
present_state <= next_state;
end if;
end if;
end process;

output_decoder : process(present_state, din)
begin
next_state <= st0;

case (present_state) is

when st0 =>
if (din = '1') then
next_state <= st1;
else
next_state <= st0;
end if;

when st1 =>
if (din = '1') then
next_state <= st2;
else
next_state <= st0;
end if;

when st2 =>
if (din = '1') then
next_state <= st3;
else
next_state <= st0;
end if;

when st3 =>
if (din = '1') then
next_state <= st3;
else
next_state <= st4;
end if;

when st4 =>
if (din = '1') then
next_state <= st1;
else
next_state <= st0;
end if;

when others =>
next_state <= st0;
end case;
end process;

next_state_decoder : process(present_state)
begin
case (present_state) is

when st0 =>

dout <= '0';
when st1 =>
dout <= '0';
when st2 =>
dout <= '0';
when st3 =>
dout <= '0';
when st4 =>
dout <= '1';
when others =>
dout <= '0';
end case;

end process;

end Behavioral;

Ниже приведен мой тестовый стенд:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity tb_moore is
end tb_moore;

architecture Behavioral of tb_moore is

-- Component Declaration for the Unit Under Test (UUT)

COMPONENT Design
PORT(
clock : IN std_logic;
din : IN std_logic;
rst : IN std_logic;
dout : OUT std_logic
);
END COMPONENT;

--Inputs
signal clock : std_logic := '0';
signal din : std_logic := '0';
signal rst : std_logic := '0';

--Outputs
signal dout : std_logic;

-- Clock period definitions
constant clk_period : time := 20 ns;

BEGIN

-- Instantiate the Unit Under Test (UUT)
uut: Design PORT MAP (
clock => clock,
din => din,
rst => rst,
dout => dout
);

-- Clock process definitions
clk_process :process
begin
clock <= '0';
wait for clk_period/2;
clock <= '1';
wait for clk_period/2;
end process;

-- Stimulus process
stim_proc: process
begin

rst <= '1';

wait for 20 ns;

rst <= '0';

din <= '1';

wait for 20 ns;

din <= '1';

wait for 20 ns;

din <= '1';

wait for 20 ns;

din <= '1';

wait for 20 ns;

din <= '1';

wait for 20 ns;

din <= '0';

wait for 20 ns;

din <= '1';

wait for 20 ns;

din <= '1';

end process;

END;

а ниже приведен файл ограничений, который я использовал для платы Nexys DDR4 FPGA.

## Clock signal
NET "clock"   LOC = "E3"    | IOSTANDARD = "LVCMOS33";  

## Switches
NET "din"          LOC=L16 | IOSTANDARD=LVCMOS33; 
NET "rst"          LOC=M13 | IOSTANDARD=LVCMOS33; 

## LEDs
NET "dout"         LOC=H17 | IOSTANDARD=LVCMOS33; 

person Allen Mathew    schedule 03.12.2017    source источник
comment
Во-первых: какую ошибку вы получаете? Во-вторых, где в ваших входных данных логика синхронизации и устранения дребезга? Это требуется для ВСЕХ переключателей, включая сброс. См. мой ответ здесь.   -  person JHBonarius    schedule 03.12.2017
comment
Ах да, и о тактовом входе: внутри FPGA назначает определенные входные буферы для тактовых сигналов. Они доступны не для всех контактов. В качестве механизма безопасности размещение не удастся при попытке направить тактовый сигнал на «нормальный» контакт. К счастью, вы можете обойти это, изменив некоторые настройки. Я не знаю их наизусть. Поиск Google с использованием сообщения об ошибке.   -  person JHBonarius    schedule 04.12.2017
comment
извините за поздний ответ Какую ошибку вы получаете?   -  person Allen Mathew    schedule 10.12.2017
comment
Какая у вас ошибка? ==> Я не получаю ошибку, я получаю желаемый результат на волне из графика, проблема в том, что когда я запускаю код на плате FPGA, светодиод загорается слишком быстро (не видно невооруженным глазом)   -  person Allen Mathew    schedule 10.12.2017
comment
Во-вторых, где в ваших входных данных логика синхронизации и устранения дребезга? я не уверен в этом, я новичок в VHDL, но код работал правильно без этого   -  person Allen Mathew    schedule 10.12.2017
comment
(edaplayground.com/x/32AF) это ссылка на мой код, если вы запустите это вы сможете увидеть WPwave, после того, как вы установите флажок слева   -  person Allen Mathew    schedule 10.12.2017
comment
То, что он работает в симуляции, никогда не гарантирует, что он будет работать в реализации. FPGA требуют определенного стиля кодирования. Ваш испытательный стенд — это всего лишь грубая имитация того, что происходит на самом деле. Проверьте мой связанный пост и связанные статьи в нем, чтобы узнать о рассеянии.   -  person JHBonarius    schedule 10.12.2017