【问题标题】:VHDL arithmetic shift_leftVHDL 算术 shift_left
【发布时间】:2017-10-10 12:22:48
【问题描述】:

使用ieee.numeric_stdshift_left 函数,我想将信号左移并从右侧插入10

signal qo: signed (3 downto 0) := (others=>'0');
qo <= shift_left(qo,1);

这只会从右侧插入0。我想在某些条件下插入1

【问题讨论】:

    标签: vhdl


    【解决方案1】:

    不使用shift_left函数,不如使用slicingconcatenation

    qo <= qo(2 downto 0) & '1';
    

    qo <= qo(2 downto 0) & '0';
    

    就个人而言,我建议使用切片和连接来进行移位和旋转。运算符(sra 等)存在问题,如您所见,使用切片和连接可以让您完全控制。

    【讨论】:

    • 好的。根据这个主题stackoverflow.com/questions/9018087/…,据说使用nmeric_std 很好,因为它允许很多函数和方法来简化编码。
    • @mahmood 好吧,这取决于您,这取决于您所说的“简化编码”是什么意思。
    【解决方案2】:

    signed 类型信号的最右边插入'1' 意味着将其值增加1。同样,插入'1' 意味着将其值增加0。

    这最好用+ 运算符表示,即overloaded by the numeric_std package

    -- Id: A.8
    function "+" (L: SIGNED; R: INTEGER) return SIGNED;
    -- Result subtype: SIGNED(L'LENGTH-1 downto 0).
    -- Result: Adds a SIGNED vector, L, to an INTEGER, R.
    

    所以简单地使用:

    shift_left(qo, 1) + 1
    

    分别

    shift_left(qo, 1) + 0
    

    无论qo 是如何定义的,这都有效,因此如果您稍后更改qo 的长度,则无需调整任何切片操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多