矢量索引的VHDL宏

时间:2014-12-30 15:15:29

标签: macros attributes constants vhdl

我正在寻找一个宏,常量或属性,无论它是什么,取代"(x downto y)"。要详细解释复数,

有一个通用值WIDTH,

signal num : std_logic_vector(2*WIDTH downto 0);

**pseudo** re = 2*WIDTH-1 downto WIDTH; im = WIDTH-1 downto 0; **pseudo**

x <= num(re); y <= num(im); etc

也可能是某些属性,如范围。例如

x <= num(num're); y <= num(num'im);

我经常使用它,它应该是更好的可读性和编写干净的代码

2 个答案:

答案 0 :(得分:3)

subtype可用于声明整数范围,如:

-- **pseudo** re = 2*WIDTH-1 downto WIDTH; im = WIDTH-1 downto 0; **pseudo**
subtype re is natural range 2*WIDTH-1 downto WIDTH;
subtype im is natural range   WIDTH-1 downto 0;

然后可以这样做:

x <= num(re);
y <= num(im);

xy声明为std_logic_vector(WIDTH-1 downto 0),或std_logic_vector(re)std_logic_vector(im)

顺便说一下。 num应该具有最高索引2*WIDTH-1,而不是2*WIDTH(逐个错误)。

答案 1 :(得分:2)

也许不完全是你的想法,但VHDL记录似乎非常适合你想要做的事情。

您可以定义记录类型:

type mycomplex_t is record
    re : std_logic_vector(WIDTH-1 downto 0);
    im : std_logic_vector(WIDTH-1 downto 0);
end record;

然后,您声明您的信号属于这种类型:

signal num : mycomplex_t;

你可以这样使用它:

x <= num.re;
y <= num.im;

你也可以像这样分配:

num <= (re => x2, im => y2);

或者,像这样:

num.re  <= x2;
num.im  <= y2;

或者同时来自同一类型的另一个信号:

signal other_complex : mycomplex_t;
-- (...)
num <= other_complex;