SLA运算符在VHDL中的实际应用

SLA运算符在VHDL中的实际应用,vhdl,Vhdl,大多数(如果不是全部的话)VHDL教科书随意地列出了算术运算符,其中更随意地列出了左移位算术(SLA),即用最右边的元素填充的左移位。虽然我甚至不同意这个定义,但我从未见过有人对这个定义眨眼,它只是带着一个表面的价值,“是的,有意义” 然而,在二进制算术中填充最右边的值显然是完全无用的,这让我想知道-有人在现实生活中找到了SLA的真正好用途吗 (我不反对SLA的存在,也不想从VHDL中消除它。这只是复活节假期的一点乐趣…当然,当你需要乘以2^n时,你只需要将SLA乘以n位 我在当前项目中使用它,

大多数(如果不是全部的话)VHDL教科书随意地列出了算术运算符,其中更随意地列出了左移位算术(SLA),即用最右边的元素填充的左移位。虽然我甚至不同意这个定义,但我从未见过有人对这个定义眨眼,它只是带着一个表面的价值,“是的,有意义”

然而,在二进制算术中填充最右边的值显然是完全无用的,这让我想知道-有人在现实生活中找到了SLA的真正好用途吗


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

当然,当你需要乘以2^n时,你只需要将SLA乘以n位

我在当前项目中使用它,以减少FPGA使用的资源,在划分之前我使用SRA,结果得到的数字比原来少,使用划分,然后使用SRL来获得正确的值比例

它看起来像是,
C=A/B
,减少了
C*N=(A/N)/B

在C中会出现一些错误,但会减少使用的资源

网站提到:

有一次,VHDL中内置了实际的移位运算符。这些是:srl,sll,sra,sla。但是,这些移位运算符从未正确工作,已从语言中删除。本网站详细介绍了,并讨论了为什么它们被shift_right()和shift_left()函数取代

然而,这种联系被打破了

你链接的维基百科页面显示了一些非常重要的东西

VHDL算术左移位运算符[sla]不常见。它将原始LSB复制到新LSB中,而不是用零填充结果的LSB。虽然这是算术右移的精确镜像,但它不是运算符的常规定义,也不等于乘以2的幂。在VHDL 2008标准中,对于没有强制数字解释(例如,位向量)的参数类型,这种奇怪的行为保持不变,但对于无符号和有符号参数类型,“SLA”以预期方式运行(即,最右边的位置用零填充)。VHDL的左移位逻辑(SLL)函数实现了前面提到的“标准”算术移位

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


然而,这是意料之中的。。。根据我的经验,IEEE标准化委员会主要由许多老年人组成,有些人在委员会成立时就在那里(我相信你需要SLL来实现这一点……很抱歉,这是错误的。例如,如果你在
上使用
sla 2
('0','0','0','1')
=1,你将得到
('0','1','1'))
=7。当2^2=4.@J.H.Bonarius时,你真的这么认为吗?使用逻辑或算术左移,你必须用
'0'
而不是最后一个LSB值填充LSB。因此在你的示例中
的sla 2
将得到
('0''0''1')
('0''1'))
=4(十进制)和1*2^2=4。我误解了你用2^3=8的说法,这与你的例子有什么关系?似乎对于
无符号
位向量
的sla行为是不同的。我将发布一个答案。
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;