2016-11-26 7 views
0

Позвольте var подписать подписанный вектор (библиотека IEEE.NUMERIC_STD.ALL) размером m.Сочетание выражения `other` с` signed` cast

Позвольте foo быть другой переменной типа std_logic_vector(n-1 downto 0), где n меньше, чем m.

Я хочу конкатенацию «0» слева от foo, затем пэда нулей в своем праве, пока размер не m, а затем сохранить результат в var.

Я попытался

rdsor <= signed('0' & divisor & others=>'0'); 

Но Xilinx жалуется следующее сообщение о синтезе:

Syntax error near "others". 

Как делать то, что я хочу?

+1

Вы не предоставили декларацию для 'divisor,' или 'rdsor', необходимых для предоставления решения. Обратите внимание, что в вашем одном фрагменте строки не отображаются ни 'var', ни' foo'. Вы также не указали, какую версию VHDL вы планируете ожидать. – user1155120

ответ

2

Допуская rdsor эквивалентен ваш теоретическую var и делители эквивалентного foo вы могли бы использовать два задание в процессе заявления:

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

entity jsevillamol is 
end entity; 

architecture fum of jsevillamol is 
    constant M:  natural := 42; 
    constant N:  natural := 23; 
    signal rdsor: signed (M - 1 downto 0); 
    signal divisor: std_logic_vector (N - 1 downto 0); 
begin 
    -- rdsor <= signed('0' & divisor & others=>'0'); 
    process (divisor) 
    begin 
     rdsor <= (others => '0'); 
     rdsor (rdsor'LEFT downto rdsor'LEFT - divisor'LENGTH) 
      <= signed('0' & divisor); 
    end process; 
end architecture; 

Это работает, потому что каждый элемент rdsor отдельный знак al и есть только одно значение для любого конкретного времени в прогнозируемом выходном сигнале . Не создавая aftertime_expression в элементе формы сигнала второго присвоения элементам срезу будут присвоены значения значений второго присваивания. (Элементы первого присваивания вытесняются вторым). Этот метод перезаписи прогнозируемого выходного сигнала обычно используется для предоставления значений по умолчанию до покрытия неполного условия с помощью операторов if.

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

Обратите внимание, что это избегает вопроса о конкатенации или агрегации, вызванной ответом Мэтью Тейлора.

Для одного присвоения сигнала в методе не чувствителен к пересмотру VHDL инструмента:

architecture fie of jsevillamol is 
    constant M:  natural := 42; 
    constant N:  natural := 23; 
    signal rdsor: signed (M - 1 downto 0); 
    signal divisor: std_logic_vector (N - 1 downto 0); 
    subtype other is signed (rdsor'LEFT - divisor'LENGTH - 1 downto 0); 
begin 
    -- rdsor <= signed('0' & divisor & others=>'0'); 
    rdsor <= '0' & signed(divisor) & other'(others => '0'); 
end architecture; 

Это использует конкатенацию и вбирает в others в агрегат. Существует объявление подтипа для конечной части «0», чтобы агрегированное выражение могло быть целевым для квалифицированного выражения.

Эта архитектура также анализирует, разрабатывает и моделирует доказательную арифметику индекса.

+0

Упс, я перепутал имена переменных. Спасибо за исчерпывающее решение! – Jsevillamol

1

Вы должны использовать others как часть совокупного не является частью конкатенации. Вот решение с использованием агрегата и атрибутов (который зависит от вас, используя VHDL 2008):

rdsor <= (rdsor'LEFT => '0', (rdsor'LEFT-1) downto (rdsor'LEFT-divisor'LENGTH) => signed(divisor), others => '0'); 

https://www.edaplayground.com/x/5Yuw

+0

Обратите внимание на вариант -2008. – user1155120

+0

@ user1155120 Вы правы. Не в первый раз я непреднамеренно придумал решение, требующее VHDL 2008, потому что этот переключатель установлен по умолчанию для Riviera Pro на EDA Playground. –