VHDL - GHDL Инициализация std_logic_vector с меньшей длиной в битах - PullRequest
0 голосов
/ 19 мая 2019

У меня есть signal dataIn : std_logic_vector ( 15 downto 0);

Я хочу дать вход менее 16 бит, например dataIn <= x"000a", и эти биты занимают старшие значащие биты, а остальные равны нулю.В verilog вы можете сделать это очень легко, но в VHDL вы получите ошибку:

"длина строки не соответствует длине анонимного целочисленного подтипа, определенного t ...".

Я знаю, что если вы используете 16x"bit_string", это решит проблему, но это только для VHDL-2008, а ghdl пока не поддерживает VHDL-2008.

Есть ли какой-либо метод?для IEEE Std 1076-2002?

1 Ответ

0 голосов
/ 19 мая 2019

Для VHDL-87/93/2002 вы можете использовать функцию resize из пакета numeric_std.

library ieee;
use ieee.numeric_std.all;
...
constant FOO : std_logic_vector(2 downto 0) := "010";
signal dataIn : std_logic_vector(15 downto 0) := std_logic_vector(resize(unsigned(FOO), 16));

Обратите внимание, что функция resize определена только для типов signed и unsigned.
Если вы хотите, чтобы короткая битовая строка помещалась в MSB, вам может потребоваться использовать атрибут 'reverse_order.

Часто вам будет проще определить выделенную функцию, которая инкапсулирует более сложные инициализации.

constant FOO : std_logic_vector(2 downto 0) := "010";

function init_dataIn (bar : std_logic_vector; len : integer) return std_logic_vector is
begin
  return bar & (len - bar'length - 1 downto 0 => '0');
end function init_dataIn;

signal dataIn : std_logic_vector(15 downto 0) := init_dataIn(FOO, 16);
...