2012-07-02 3 views
1

Я новичок в программировании VHDL FPGA, и мой модуль (см. Полный код ниже) не работает.VHDL, когда еще не работает

Этот модуль должен заботиться, если пользовательские настройки ввода/вывода, основанные на регистре, доступны пользователю (так что режимы могут быть изменены через регистр без необходимости касания прошивки FPGA). Имеется 8 входных контактов и 8 выходных контактов, а также 4 режима работы: 1x8, 2x8, 4x8, 8x8. Выход поступает в модуль генератора задержки/затвора, а затем выходит. Еще одна функция этого модуля состоит в том, чтобы преобразовать 32-битный входной вектор, где на самом деле назначено только 8 контактов и несут значение (специфичное для взаимодействия FPGA-платы) во что-то, что имеет больше смысла.

Как и сейчас, все остальные функции (00), соответствующие режиму 1x8, работают независимо от значения clockcontrolREG. (я наблюдаю правильный вывод на осциллографе), поэтому нет ничего плохого в назначении контактов. Похоже, почему-то все мои, когда предложения игнорируются.

Я установил начальное значение clockcontrolREG на «00000011» (который должен установить режим 8x8), и я сделал доступ к регистру и проверил, действительно ли это значение.

Я пробовал 2 разных способа синтаксиса для описания того же (строка: signalforclkgen (1)), без эффекта.

Похоже, что я пропустил что-то очень фундаментальное ..... но на третий день я сижу на нем без результата. Благодарим за помощь.

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.std_logic_arith.all; 
use ieee.std_logic_unsigned.all; 

entity clkgencontrol is 
    port(
     clockcontrolREG : in std_logic_vector(31 downto 0); 
     signalinput  : in std_logic_vector(31 downto 0); 
     signalforclkgen : out std_logic_vector(7 downto 0) 

     ); 
end clkgencontrol; 


architecture rtl of clkgencontrol is 

begin 


    signalforclkgen(0) <= signalinput(31); 

    signalforclkgen(1) <= signalinput(15) when (clockcontrolREG(0) = '1' and clockcontrolREG(1) = '1') else 
          signalinput(31); 

    signalforclkgen(2) <= signalinput(30) when (clockcontrolREG = "00000011") else 
          signalinput(15) when (clockcontrolREG = "00000010") else 
          signalinput(31); 

    signalforclkgen(3) <= signalinput(14) when (clockcontrolREG = "00000011") else 
          signalinput(15) when (clockcontrolREG = "00000010") else 
          signalinput(31); 

    signalforclkgen(4) <= signalinput(19) when (clockcontrolREG = "00000011") else 
          signalinput(30) when (clockcontrolREG = "00000010") else 
          signalinput(15) when (clockcontrolREG = "00000001") else 
          signalinput(31); 

    signalforclkgen(5) <= signalinput(3) when (clockcontrolREG = "00000011") else 
          signalinput(30)when (clockcontrolREG = "00000010") else 
          signalinput(15)when (clockcontrolREG = "00000001") else 
          signalinput(31); 


    signalforclkgen(6) <= signalinput(18) when (clockcontrolREG = "00000011") else 
          signalinput(14) when (clockcontrolREG = "00000010") else 
          signalinput(15) when (clockcontrolREG = "00000001") else 
          signalinput(31); 

    signalforclkgen(7) <= signalinput(2) when (clockcontrolREG = "00000011") else 
          signalinput(14) when (clockcontrolREG = "00000010") else 
          signalinput(15) when (clockcontrolREG = "00000001") else 
          signalinput(31); 
end rtl; 
+0

Я подтвердить все КОГДА положения игнорируются, путем изменения signalforclkgen (7) назначения, делая улов все остальное от 0, вместо того, действительный сигнал (и добавление опции для значения reg «00000000»). и на выходе имеется 0. –

+0

Какая цепочка инструментов скомпилирована? –

+0

Quartus II v 11.0 Web, FPGA - это Cyclone, если это то, о чем вы просите. –

ответ

4

Возможно, вы намерены использовать шестнадцатеричные константы в своих сравнениях? Вы должны получать предупреждения в вашей компиляции о несогласованных длинах, и если вы ожидаете шестнадцатеричное значение 0x00000010 в clockcontrolREG (b00000000_00000000_00000000_00010000), который не будет соответствовать двоичному значению, которое вы для сравнения: bxxxxxxxx_xxxxxxxx_xxxxxxxx_00000010

Попробуйте использовать 32-разрядные шестнадцатеричные константы для ваших clockcontrolREG сравнений и посмотреть, если это помогает:

signalforclkgen(2) <= signalinput(30) when (clockcontrolREG = x"00000011") else 
        signalinput(15) when (clockcontrolREG = x"00000010") else 
        signalinput(31); 
+1

Ты мой герой Чарльз, спасибо тебе большое, это помогло и сейчас работает. В компиле не было таких предупреждений, хотя ... –

Смежные вопросы