【问题标题】:VHDL macro for vector indices向量索引的 VHDL 宏
【发布时间】:2014-12-30 23:46:42
【问题描述】:

我正在搜索宏、常量或属性,无论它是什么,都替换“(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);

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

【问题讨论】:

    标签: macros attributes constants vhdl


    【解决方案1】:

    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(差一个错误)。

    【讨论】:

      【解决方案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;
      

      【讨论】:

      • 是的,我一直在使用它。但是,当您大量使用 block ram 时,分配会变得更长。我的意思是,ram_data &lt;= num.re &amp; num.im; num.re &lt;= ram_data(2*W-1 downto W); num.im &lt;= ram_data(W-1 downto 0);num &lt;= (ram_data(2*W-1 downto W),ram_data(W-1 downto 0)); 还是我错了?有没有一种简单的方法可以做到这一点。我也将它添加到一个包中,但我无法使其通用。所以我认为如果我在端口映射中使用它会造成麻烦
      • @ytukel 您可以为包中的每次转化创建一个function。然后,赋值变成ram_data &lt;= to_std_logic_vector(num)num &lt;= to_mycomplex(ram_data);,大大提高了可读性。
      • @ytukel 在端口映射中,您的选项是 1) 为 reim 部分设置不同的端口,然后映射 re =&gt; num.re, im =&gt; num.im,2) 按切片映射您的端口 someport(W-1 downto 0) =&gt; num.re, someport(2*W-1 downto W) =&gt; num.im 3 ) 创建一个中间 std_logic_vector 信号(使用您的转换函数)并映射它,或者 4)使端口本身成为 mycomplex_t。
      • @ytukel 至于使其通用,这在 VHDL 中有点棘手,您要做的就是使包本身通用(VHDL-2008 功能)。 Stack Overflow 上有她的相关回答:Generic Records (attempted via vhdl 2008 generic package).
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多