2015-11-08 3 views
1
entity hex_kp is 
    Port (row : out STD_LOGIC_VECTOR (3 downto 0); 
      coloumn : in STD_LOGIC_VECTOR (3 downto 0); 
      sevenseg : out STD_LOGIC_VECTOR (7 downto 0); 
      ca : out STD_LOGIC_VECTOR (3 downto 0)); 
end hex_kp; 

architecture Behavioral of hex_kp is 

begin 

ca <="0111"; 

if(row = "0111") then 

    if(coloumn = "0111") then sevenseg <= "00000110" ; 
    elsif (coloumn = "1011") then sevenseg <= "01011011" ; 
    elsif (coloumn = "1101") then sevenseg <= "01001111" ; 
    elsif (coloumn = "1110") then sevenseg <= "01110001" ; 
    end if; 
end if; 

Это моя часть моего кода VHDL для 4x4 клавиатурного сканера для Basys2. Это приводит к ошибке «if (row =« 0111 ») then» statement. Я не мог найти, зачем нужна помощь.Код vhdl для сопряжения с клавиатурой

+1

Чтения порта «OUT» является недействительным, если не указан VHDL-2008. –

+0

И вам не разрешено принимать решения о значениях других сигналов на основе значения выхода -в -2008. Это функция, предназначенная для поддержки конструкций проверки. – user1155120

+0

И где задано значение сигнала 'row'? – user1155120

ответ

1

Вы пытаетесь использовать оператор if в параллельном контексте. Однако if заявления должны быть в последовательном контексте - например, в process заявление:

process(row, column) 
begin 
    if(row = "0111") then 
     if(coloumn = "0111") then 
      sevenseg <= "00000110"; 
     elsif(coloumn = "1011") then 
      sevenseg <= "01011011"; 
     elsif(coloumn = "1101") then 
      sevenseg <= "01001111"; 
     elsif(coloumn = "1110") then 
      sevenseg <= "01110001"; 
     end if; 
    end if; 
end process; 

Однако - обратите внимание, что если вы синтезировать выше, скорее всего, в конечном итоге дает вам хороший набор фиксаторов (который вы обычно не хотите), так как вы не назначаете sevenseg во всех возможных случаях (если row отличается от 0111, или если coloumn не соответствует ни одному из заявлений if).

Чтобы исправить это, либо 1) использовать с тактовой частотой process, или 2) назначить sevenseg значение по умолчанию, если row и coloumn не соответствует ни одному из указанных случаев. Например:

process(row, column) 
begin 
    sevenseg <= (others => '0'); 
    if(row = "0111") then 
     if(coloumn = "0111") then 
      sevenseg <= "00000110"; 
     elsif(coloumn = "1011") then 
      sevenseg <= "01011011"; 
     elsif(coloumn = "1101") then 
      sevenseg <= "01001111"; 
     elsif(coloumn = "1110") then 
      sevenseg <= "01110001"; 
     end if; 
    end if; 
end process; 

Я добавил sevenseg <= (others => '0');, который сделает sevenseg по умолчанию для всех 0-х, если ни один из указанных случаев не пострадал - если они есть, они перекроют дополнительную линию и установить sevenseg к соответствующему значению.

Еще лучше способ сделать это состоит в использовании case заявления, так что, вероятно, лучше описывает то, что вы на самом деле хотите:

process(row, column) 
begin 
    if(row = "0111") then 
     case coloumn is 
     when "0111" => 
      sevenseg <= "00000110"; 
     when "1011" => 
      sevenseg <= "01011011"; 
     when "1101" => 
      sevenseg <= "01001111"; 
     when "1110" => 
      sevenseg <= "01110001"; 
     when others => 
      sevenseg <= (others => '0'); 
     end case; 
    else 
     sevenseg <= (others => '0'); 
    end if; 
end process; 
+0

Я добавляю процесс, однако теперь он дает ошибку этой строке. –

+1

Оператор if - это последовательный оператор, который можно найти не только в процессах (например, подпрограммы). Просто случается, что Айка Экин пытается использовать оператор if в месте, где подходит параллельный оператор, который требует условного оператора присваивания сигнала * или * процесса, содержащего оператор if или оператор case. – user1155120

+0

Ошибка связана с комментарием Брайана на ваш вопрос. Покажите сообщение об ошибке, как предлагает Брайан на Stack Exchange ([vhdl-интерфейс с интерфейсом fpga] (http://electronics.stackexchange.com/questions/199802/vhdl-code-interfacing-keypad-with-fpga)). – user1155120

1

Вы можете использовать условный оператор присваивания сигнала:

architecture behave of hex_kp is 

begin 

    ca <="0111"; 

-- if(row = "0111") then 
-- 
--  if(coloumn = "0111") then sevenseg <= "00000110" ; 
--  elsif (coloumn = "1011") then sevenseg <= "01011011" ; 
--  elsif (coloumn = "1101") then sevenseg <= "01001111" ; 
--  elsif (coloumn = "1110") then sevenseg <= "01110001" ; 
--  end if; 
-- end if; 

    sevenseg <= "00000110" when coloumn = "0111" and row = "0111" else 
       "01011011" when coloumn = "1011" and row = "0111" else 
       "01001111" when coloumn = "1101" and row = "0111" else 
       "01110001" when coloumn = "1110" and row = "0111" else 
       "00000000" when      row = "0111"; 
end architecture behave; 

Обратите внимание, что, как и ваш вопрос об обмене в стеке (vhdl code interfacing keypad with fpga) Есть заведомые защелки на sevenseg, вызванные использованием row = "0111" в качестве условия для назначения.

Вышеупомянутая архитектура дает тот же результат, что и мой ответ на ваш вопрос об обмене столами (vhdl code interfacing keypad with fpga).

Ваш измененный код анализирует, разрабатывает и добавил испытательный стенд там имитирует выше архитектуру:

hex_kp_tb

Избавление от защелок будет так же просто, как удаление row = "0111" от окончательного выбора в условном сигнале назначение выше или в примере Stack Exchange с использованием case-case, предоставляя else для прилагаемого оператора if.

Весь код, включая тестбенч и оба архитектуры, основывается на использование строки в качестве ввода:

library ieee; 
use ieee.std_logic_1164.all; 

entity hex_kp is 
    port ( 
     row:  in std_logic_vector (3 downto 0); 
     coloumn: in std_logic_vector (3 downto 0); -- 'column 'is mispelled 
     sevenseg: out std_logic_vector (7 downto 0); -- why is 7 segs 8 long? 
     ca :  out std_logic_vector (3 downto 0) 
    ); 
end entity hex_kp; 

architecture behavioral of hex_kp is 
    -- signal row: std_logic_vector(3 downto 0); -- who drive row? 
begin -- this was missing 
UNLABELLED: 
    process(row, coloumn) -- was 'column' (didn't match declaration) 
    begin 
     ca <="0111"; 
     if row = "0111" then 
      case coloumn is 
       when "0111" => 
        sevenseg <= "00000110"; 
       when "1011" => 
        sevenseg <= "01011011"; 
       when "1101" => 
        sevenseg <= "01001111"; 
       when "1110" => 
       sevenseg <= "01110001"; 
       when others => 
        sevenseg <= (others => '0'); 
      end case; 
     end if; 
    end process; 
end architecture behavioral; 

architecture behave of hex_kp is 

begin 

    ca <="0111"; 

-- if(row = "0111") then 
-- 
--  if(coloumn = "0111") then sevenseg <= "00000110" ; 
--  elsif (coloumn = "1011") then sevenseg <= "01011011" ; 
--  elsif (coloumn = "1101") then sevenseg <= "01001111" ; 
--  elsif (coloumn = "1110") then sevenseg <= "01110001" ; 
--  end if; 
-- end if; 

    sevenseg <= "00000110" when coloumn = "0111" and row = "0111" else 
       "01011011" when coloumn = "1011" and row = "0111" else 
       "01001111" when coloumn = "1101" and row = "0111" else 
       "01110001" when coloumn = "1110" and row = "0111" else 
       "00000000" when      row = "0111"; 
end architecture behave; 

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity hex_kp_tb is 
end entity; 

architecture foo of hex_kp_tb is 
    signal row:   std_logic_vector (3 downto 0); 
    signal coloumn:  std_logic_vector (3 downto 0); 
    signal sevenseg: std_logic_vector (7 downto 0); 
    signal ca:   std_logic_vector (3 downto 0); 
    signal count:  unsigned (7 downto 0) := (others => '0'); 
begin 

DUT: 
    entity work.hex_kp 
     port map (
      row => row, 
      coloumn => coloumn, 
      sevenseg => sevenseg, 
      ca => ca 
     ); 
STIMULUS: 
    process 
    begin 
     row <= std_logic_vector (count(3 downto 0)); 
     coloumn <= std_logic_vector (count(7 downto 4)); 
     wait for 100 ns; 
     count <= count + 1; 
     if count = "11111111" then 
      wait; 
     end if; 
    end process; 
end architecture; 
+0

Я бы предположил, что 8-й сегмент/7-й бит в 'sevenseg: out std_logic_vector (7 downto 0)' является точкой :). – Paebbels

+0

Итак, что представляют персонажи Paebbels? – user1155120

+0

В вашем коде есть комментарий: '- почему 7 segs 8 long?', О котором я говорю. Обычно 7-сегментный дисплей имеет 7 катодных контактов с именем 'a..g' (по одному для каждого сегмента светодиода) и 8-й вывод для точки. Это объясняет, почему OP объявила порт как '7 downto 0'. – Paebbels