2013-09-16 2 views
1

Я пишу небольшой бит VHDL, чтобы повернуть значения на восьми 7-сегментных дисплеях.Как назначить несколько значений нескольким портам в VHDL

Я что-то вроде этого:

-- handle the rotation of displays 
process(rot_select, d0, d1, d2, d3, d4, d5, d6, d7) 
begin 
    case rot_select is 
     when "000" => -- rotate by 0 
     when "001" => -- rotate by 1 
     when "010" => -- rotate by 2 
     when "011" => -- rotate by 3 
     when "100" => -- rotate by 4 
     when "101" => -- rotate by 5 
     when "110" => -- rotate by 6 
     when "111" => -- rotate by 7 
    end case; 
end process; 

Где rot_select является селектор, чтобы выяснить размер вращения (первый дисплей перемещается на второй дисплей, и т.д.) и d0-d7 представляют собой 7-битовые векторы, которые являются входы каждого дисплея.

Мне было интересно, если вместо того, чтобы выполнять ручное назначение, как d1 <= d0; d2 <= d1; ... каждый раз, я могу сделать его более автоматическим и использовать меньше кода? Возможно, что-то вроде (d0,d1,d2,d3,d4,d5,d6,d7) <= (d7,d0,d1,d2,d3,d4,d5,d6); или что-нибудь, что имеет больше смысла.

ответ

3

Совокупного присвоение более способное в VHDL-2008, так что если вы используете VHDL-2008, вы можете написать:

(d0,d1,d2,d3,d4,d5,d6,d7) <= d7 & d0 & d1 & d2 & d3 & d4 & d5 & d6; 

Предполагая, что d0 и т.д. объявлен как std_logic_vector или аналогичные.

Обратите внимание, что если вы используете VHDL-2008, вы также можете написать список чувствительности как (all), а не указывать все сигналы явно.

Но, как пишет Джош, представление как массив более подходит, и это также будет работать с предыдущими версиями VHDL. Код может выглядеть примерно так:

... 

    -- 7-segment display 
    subtype ssd_t is std_logic_vector(1 to 7); -- Type for display 
    type ssd_arr_t is array(natural range <>) of ssd_t; -- Type for array of display 
    signal d_cur : ssd_arr_t(0 to 7); -- Current value 
    signal d_nxt : ssd_arr_t(0 to 7); -- Next value 
    -- Rotation 
    signal rot_select : std_logic_vector(2 downto 0); 

begin 

    -- Handle the rotation of displays 
    process (rot_select, d_cur) 
    variable idx_cur_v : unsigned(2 downto 0); 
    begin 
    for idx in d_nxt'range loop 
     idx_cur_v := to_unsigned(idx, 3) - unsigned(rot_select); -- Handles modulo operation 
     d_nxt(idx) <= d_cur(to_integer(idx_cur_v)); 
    end loop; 
    end process; 

    ... 
1

Эта проблема была бы проще, если бы вы определили дисплеи, d0-d7 как массив из 7-битных векторов, а не как отдельные сигналы. Тогда у вас будет сигнал display, например, где display(0) соответствует тому, что есть d0 прямо сейчас.

Как только у вас есть массив значений, вы можете использовать что-то вроде for...loop, чтобы описать смещение значений из одной позиции дисплея в другую.

1

Цель сигнальных задания, которые являются агрегаты были законным все вместе увидеть IEEE Std 1076-1987 8.3 Signal Assignment Statement. Независимо от того, поддерживался ли он конкретным продавцом инструмента в определенный момент времени, это отдельный вопрос.

Операторы сдвига присутствуют с -1993 и предопределены для одномерных массивов (композитов) типа бит (бит_вектор).

ror определен для подписанных и неподписанных композитных типов в пакете numeric_std as is to_integer.

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

entity rot_display is 
end entity; 

architecture foo of rot_display is 
    signal d0:   std_logic := '1'; 
    signal d1:   std_logic := '1'; 
    signal d2:   std_logic := '0'; 
    signal d3:   std_logic := '0'; 
    signal d4:   std_logic := '0'; 
    signal d5:   std_logic := '1'; 
    signal d6:   std_logic := '0'; 
    signal d7:   std_logic := '1'; 

    signal rot_select: std_logic_vector(2 downto 0) := "000"; 
    type rot is array (integer range 0 to 7) of std_logic_vector(2 downto 0); 
    constant rotation: rot := 
      ("111", "110", "101", "100", "011", "010", "001", "000"); 

begin 
TEST: 
    process  
    begin 
     wait for 10 ns; 

     for i in rot'range loop 
      rot_select <= rotation(i); 
      wait for 1 ns;   
      (d0,d1,d2,d3,d4,d5,d6,d7) <=    
       std_logic_vector ( 
        unsigned'(d0,d1,d2,d3,d4,d5,d6,d7) 
            ror 
        to_integer(unsigned(rot_select))   
       ); 
      wait for 9 ns; 
     end loop; 

    -- put (d0,d1,d2,d3,d4,d5,d6,d7) back to original position by completing 
    -- modulo 8 shift (total of 32 shifts) 

     rot_select <= "100"; 
     wait for 1 ns; 
     (d0,d1,d2,d3,d4,d5,d6,d7) <=    
      std_logic_vector ( 
       unsigned'(d0,d1,d2,d3,d4,d5,d6,d7) 
           ror 
       to_integer(unsigned(rot_select)) 
     ); 
     wait for 9 ns;  

     wait; -- stops simulation 
    end process; 
end architecture; 

Использование to_integer может подвергнуть вас metavalue вопросы, что этот тест надуманный, чтобы избежать.

Ожидание 1 нс-заявлений гарантирует, что результат новых значений rot_select, а не предыдущего, за счет обеспечения цикла симуляции, сначала обновляется rot_select. Ожидание 9 нс-операторов выводит транзакции на время моделирования.

Waveform from test case

Последнее rot_select назначение и последующее вращение демонстрирует значение (d0, d1, d2, d3, d4, d5, d6, d7) не была изменена путем завершения следующего по модулю 8 число сдвиг позиции сдвигов.

Вы можете ввести свою собственную функцию преобразования ror и целого в исключенные преобразования типов. Ваша собственная функция ror может принимать расстояние как standard_logic_vector.

+0

Вы говорите, что '(d0, d1, d2, d3, d4, d5, d6, d7) <= d7 & d0 & d1 & d2 & d3 & d4 & d5 & d6;' должно быть законным даже в VHDL-2002 , и причина, по которой ModelSim сообщает об ошибке в связи с отсутствием поддержки инструмента? –

+1

@MortenZdk - Стоит прочитать историю отчетов о проблемах, которые ищут конфликты в интерпретациях. Конечно, левая сторона вашего назначения сигнала действительна. Любая проблема возникла бы с правой стороны и была бы ли «тип агрегата должен определяться из контекста, исключая сам агрегат, но включающий тот факт, что тип агрегата должен быть составным» (IEEE Std 1076-1993 , 8.4, Операция присвоения сигналов, параграф 7). Для меня это похоже на действительный VHDL. Работает для d0, .. как тип BIT, RHS для std_logic требует квалифицированного выражения. – user1155120

+1

@MortenZdk Квалифицированное выражение, поскольку «&» может иметь конфликты перегрузки между std_ulogic_vector и std_logic_vector, которые -2008 вылечивает, делая std_logic_vector разрешенным подтипом. Любой инструмент, который просто жалуется на левую сторону, вероятно, ошибочен. – user1155120

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