VHDL: назначение параметризованных шин в процессе

В качестве академического упражнения я разрабатываю регистр сдвига с определенными ограничениями, одно из которых заключается в том, что я должен использовать заданное количество триггеров d-типа (количество которых исходит из общего).

Как я могу изменить ширину входной шины в зависимости от количества имеющихся у меня триггеров?

Это был первоначальный план (с циклами for и использованием i в качестве возрастающего значения), но мы не могли использовать цикл for внутри процесса!

 else --SHIFT LEFT
 if (CTRL = "10") then


 internalInputBus (i+1) <= internalOutputBus(i);
 internalInputBus (0) <= SHIFT_IN;

 else --SHIFT RIGHT
 if (CTRL = "01")  then
 internalInputBus (i) <= internalOutputBus(i+1);
 internalInputBus (n-1) <= SHIFT_IN; --use interesting test length thing

person Edward Prentice    schedule 14.02.2014    source источник
comment
Конечно, вы можете использовать цикл FOR внутри процесса. Вне процесса вместо этого можно использовать оператор For.. Generate.   -  person user_1818839    schedule 16.02.2014


Ответы (2)


Поскольку вы указываете i+1 для сдвига влево и i-1 для сдвига вправо, мы можем сделать вывод, что вы выражаете диапазон как прямой (вниз).

Размер «регистра» может быть назначен с помощью общего значения, используемого для соответствия размеру порта и любому размеру значения внутреннего массива.

signal internalInputBus: std_logic_vector (REGSIZE-1 downto 0);

В вашем операторе процесса, где сдвиг влево

internalInputBus <= internalInputBus(REGSIZE-2 downto 0) & right_shift_input;

Использование оператора конкатенации справа от большинства битов REGSIZE-1 и сдвиг ввода.

При смещении вправо

internalInputBus <= left_shift_input & internalInputBus(REGSIZE-1 downto 1);

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

Операторы цикла — это допустимые последовательные операторы внутри оператора процесса. Я полагаю, у вас были проблемы с конечными границами. Поиск решения приведет вас к аналогу использования операторов конкатенации.

Левая и правая границы двух приведенных выше примеров операторов конкатенации привели бы вас к тому, как использовать цикл, не пересекающий все элементы, вместе с дополнительным оператором присваивания, чтобы охватить все элементы целевого массива.

-- LEFT
for i in REGSIZE-2 downto 0 loop
    internalInputBus(i+1) <= internalInputBus(i);
end loop;

internalInputBus(0) <= right_shift_input;

а также

-- RIGHT
for i in REGIZE-1 downto 1 loop
    internalInputBus(i-1) <= internalInputBus(i);
end loop;
internalInputBus(REGSIZE-1) <= left_shift_input;

Это просто сделано из головы. Пусть покупатель будет бдителен.

Обратите внимание, что назначения сигналов без промежуточных ожиданий (как в операторе цикла) могут считывать текущее значение значения, которое вы только что запланировали для обновления. Если бы вместо этого вы использовали целевую переменную, вы бы хотели изменить порядок, чтобы предотвратить перезапись следующего оцениваемого значения. (В данном случае в примере -- ПРАВИЛЬНО, for i in 1 to REGIZE-1 loop).

person Community    schedule 14.02.2014

Вы можете написать шифтер в одну строку. Я переименовал ваши сигналы i и o, чтобы не печатать и сделать основную мысль более ясной (я думаю, что это так и есть!):

i <= o(o'high-1 downto 0) & SHIFT_IN;

Это берет сигнал o, отсекает самый старший бит и помещает новый бит в «нижний» конец, что приводит к сдвигу влево.

Точно так же для сдвига вправо отбросьте младший бит и поместите новый бит в «высокий» конец:

i <= SHIFT_IN & o(o'high downto 1);
person Martin Thompson    schedule 25.02.2014