在VHDL中实际使用SLA运算符

时间:2017-04-12 07:17:10

标签: vhdl

大多数(如果不是全部)VHDL教科书随便列出算术运算符,其中甚至更为随意的左移算术(SLA)作为向左移动,填充最右边的元素。虽然即使wikipedia也不同意这个定义,但我从来没有见过任何人甚至眨眼睛看到这个定义,它只是带着一个面值,"是的,有道理和#34;

然而,在二元算术中填充最合适的值显然完全没用,让我想知道 - 有没有人在现实生活中找到了很好的SLA用途

(我不反对SLA的存在,也不想从VHDL中消除它。这对复活节假期来说只是一点乐趣......)

2 个答案:

答案 0 :(得分:2)

This网站提及:

  

有一次,VHDL中内置了实际的移位运算符。这些是:srl,sll,sra,sla。然而,这些移位运算符从未正常工作并从语言中删除。本网站详细介绍了history of these VHDL shift operators,并讨论了它们被shift_right()和shift_left()函数替换的原因。

但链接已断开。

您链接的维基百科页面显示了一些非常重要的内容

  

VHDL算术左移运算符 [sla] 不常见。它不是将结果的LSB填充为零,而是将原始LSB复制到新的LSB中。虽然这是算术右移的精确镜像,但它不是传统的运算符定义,并不等于乘以2的幂。在VHDL 2008标准中,这种奇怪的行为保持不变< / strong>(对于向后兼容性)对于没有强制数字解释的参数类型(例如,BIT_VECTOR)但是&#39; SLA&#39;对于无符号和有符号的参数类型,以预期的方式行为(即,最右边的位置用零填充)。 VHDL的左移逻辑(SLL)功能确实实现了上述标准&#39;算术转移。

即。现在我们有一种特殊的情况,sla对于不同的数据类型表现不同。这听起来对我来说是一件非常愚蠢的事情。

然而,这是预期的......根据我的经验,IEEE标准化委员会主要由许多老年人组成,其中一些人在委员会开始时就在那里(&lt;&#87; 87)。其余的是公司的代表,也不喜欢改变。如果sla等将被删除,这将意味着必须重写许多旧代码。 然后经过几个月的讨论,他们决定通过保留旧数据类型的旧行为,并改变新数据类型的行为来让老人们高兴....

修改

为了让它变得更加尴尬,似乎没有为slastd_logic_vector类型定义unsigned等等......但它会返回ufixed类型等等。所以我设法写了一些(vhdl-2008)代码来证明行为上的差异:

entity test_e is
end entity;

library ieee;

architecture test_a of test_e is
    constant value1 : bit_vector(3 downto 0) := "0001";
    constant value2 : bit_vector(3 downto 0) := value1 sla 2;

    use ieee.fixed_pkg.all;
    constant value3 : ufixed(3 downto 0) := to_ufixed(1,3,0);
    constant value4 : ufixed(3 downto 0) := value3 sla 2;    
begin
end architecture;

模拟时,value2将保持&#34; 0111&#34;和value4将保持&#34; 0100&#34;。

答案 1 :(得分:-1)

当然,当你需要多个到2 ^ n时,你只需要SLA到n位。

我在当前项目中使用它,为了减少FPGA的使用资源,在我使用SRA之前,结果我得到的数字比较小,使用除了然后使用SRL得到正确的数值。

看似C=A/B,缩小C*N=(A/N)/B

您在C中遇到一些错误,但减少了使用的资源。