VHDL: выбор изображений с помощью переключателей

В настоящее время я работаю с VGA в Vivado на FPGA Basys3, и у меня есть некоторые проблемы. Я хочу генерировать разные изображения (тестовые болота). У меня есть отдельный файл .vhd для каждого из этих образов и файл верхнего уровня, в котором я хотел бы использовать мультиплексор для этих образов, чтобы назначить каждому из них отдельный переключатель. У меня вопрос: как назначить изображение переключателю, если выходы из каждого файла .vhd представляют собой три цветовых сигнала RGB?

Что я пробовал, так это то, что я назвал эти 3 выходных сигнала по-разному для каждого изображения и назначил их конечному выходному сигналу, когда переключатель включен, используя структуру case. Я вставлю часть этого, чтобы вы, ребята, могли получить представление:

Это высшая сущность

entity VGAdraw is                                                
Port ( CLK      : in STD_LOGIC;                              
       cntHor   : in integer range 0 to cstHorTotSize - 1;   
       cntVer   : in integer range 0 to cstVerTotSize - 1;   
       SW       : in STD_LOGIC_VECTOR (15 downto 0);         
       LED      : out STD_LOGIC_VECTOR (15 downto 0);        
       RED      : out STD_LOGIC_VECTOR (3 downto 0);         
       GREEN    : out STD_LOGIC_VECTOR (3 downto 0);         
       BLUE     : out STD_LOGIC_VECTOR (3 downto 0)          
     );                                                      
end VGAdraw;

Это одно из изображений:

signal red5, green5, blue5, red7, green7, blue7: STD_LOGIC_VECTOR (3 downto 0);

component Checkers is                                                       
Port ( CLK      : in STD_LOGIC;                                         
       cntHor   : in integer range 0 to cstHorTotSize - 1; 
       cntVer   : in integer range 0 to cstVerTotSize - 1; 
       red7      : out STD_LOGIC_VECTOR (3 downto 0);    
       green7    : out STD_LOGIC_VECTOR (3 downto 0);     
       blue7     : out STD_LOGIC_VECTOR (3 downto 0)       
     );              
end component;

component Checkers
    port map (CLK => CLK,
              cntHor => cntHor,
              cntVer => cntVer,
              red7 => RED,
              green7 => GREEN,
              blue7 => BLUE
             );

Структура дела

process                                                       
begin                                                         
case SW is                                                                     
    when "0000000000100000" => RED <= red7;        
                               GREEN <= green7;           
                               BLUE <= blue7;                    
    when others             => RED <= red5;       
                               GREEN <= green5;           
                               BLUE <= blue5;             
end case;                                         
end process;

VGADraw — это верхний объект, в котором я объявил каждое изображение отдельным компонентом. Как тот, что выше. Как мне назначить каждый из них на переключатель на моей плате FPGA, чтобы я мог изменить изображение на нужное мне, включив переключатель? Я также пробовал некоторые операторы «если генерировать», но безрезультатно. Как и в этом случае, имея 16 переключателей на Basys3, включив sw5, я хотел бы получить изображение, нарисованное компонентом Checkers.

Спасибо за любую помощь.


person Levente Rigán    schedule 01.04.2016    source источник
comment
Поскольку вы не показали нам объявления для red1 или экземпляр компонента для Checkers, любая помощь будет только диким предположением. Например, может быть, для red1 нет декларации?   -  person user_1818839    schedule 02.04.2016


Ответы (1)


Прямо над началом process ваш код должен выглядеть примерно так:

signal red1, blue1, green1, red7, green7, blue7 red5, green5, blue5 : STD_LOCIC_VECTOR(3 downto 0);

В общем, при создании дизайна Structural после завершения работы с компонентами вы должны объявить нужные вам сигналы, как указано выше.

person Maria    schedule 02.04.2016
comment
Спасибо! Я избавился от ошибки таким образом, но программа не работает. Я предполагаю, что причина этого в том, что в структуре case он использует эти объявленные сигналы, а не те, что от компонентов, которые действительно что-то рисуют? Разве нет более элегантного способа сделать выбор? Первоначально я назвал все свои цветовые сигналы от каждого компонента одинаковыми: красный, зеленый, синий. Без нумерации. Таким образом, возможно ли в структуре случая сделать выбор между самими компонентами, а не между различными цветовыми сигналами? - person Levente Rigán; 02.04.2016
comment
Поскольку проблема исчезла, вы должны принять ответ, нажав на галочку там ‹--- . - person Maria; 02.04.2016
comment
В общем, когда вы объявляете компонент, в карте портов вы должны использовать те же имена для сигналов, что и в компоненте. Что касается того, какое имя должны иметь сигналы этого компонента в качестве входов/выходов, это зависит от вас. - person Maria; 02.04.2016
comment
Я бы порекомендовал вам немного отредактировать свой пост и предоставить нам сопоставление портов хотя бы одного изображения. - person Maria; 02.04.2016
comment
Здорово. Теперь в чем проблема? Что касается переключателя, который вы хотите использовать для управления изображениями, я предполагаю, что вы используете xilinx Ise? Если это так, вам нужно создать файл ucf. Это просто. Просто сделайте это в блокноте и сохраните как NAME.ucf. Если вам нужна дополнительная помощь, скажите, какую FPGA вы используете? - person Maria; 02.04.2016
comment
Я работаю над Basys3 FPGA в Vivado 2015.3 Webpack. У меня есть файл .ucf (.xdc для Vivado). Моя проблема в том, что я не знаю, как написать структуру case, чтобы можно было управлять каждым изображением отдельным переключателем. Пока у меня есть 8 разных изображений и 16 переключателей, поэтому я хотел бы иметь возможность отображать каждое изображение на моем мониторе (включая за раз), включая связанный с ним переключатель (скажем, переключатели sw0 .. sw7) . Используя структуру корпуса, которую я привел в качестве примера выше, программа работает, даже переключатели работают, но она не отображает ни одного изображения. - person Levente Rigán; 02.04.2016
comment
В структуре кейса вы приняли во внимание только одно изображение. Вы должны сделать это для всех ваших изображений. - person Maria; 02.04.2016
comment
Ну, я написал только один, чтобы служить примером. В моей реальной программе я добавил их все аналогичным образом. Теперь он компилируется и работает без ошибок, но ни одно из изображений не отображается. Я не знаю, почему. Должно быть что-то с цветовыми сигналами, может быть? - person Levente Rigán; 02.04.2016
comment
Что ж, декларация правильная. Проблема должна быть обнаружена в том, как вы связываете свои компоненты. Проверьте соединения. Убедитесь, что правильные сигналы поступают на правильные входы/выходы. - person Maria; 02.04.2016
comment
Порядок имеет значение? Я имею в виду, если я напишу структуру случая до или после сопоставления портов компонентов? - person Levente Rigán; 02.04.2016
comment
Структура case должна быть после объявления компонентов и карты портов. - person Maria; 02.04.2016