Vhdl 移位并添加标准逻辑向量(有36个元素,但必须有18个元素)

Vhdl 移位并添加标准逻辑向量(有36个元素,但必须有18个元素),vhdl,fpga,intel-fpga,quartus,Vhdl,Fpga,Intel Fpga,Quartus,当我尝试这个的时候,我遇到了一些来自quartus的奇怪错误 下面是代码(所有未签名和其他奇怪的函数都是我试图说服Quartus编译的。) 我遗漏了相当多的代码,但损坏的部分保持不变 我要走了 错误(10344):snake_驱动程序处的VHDL表达式错误。vhd(66):表达式有36个元素,但必须有18个元素 如何正确操作?该&运算符与VHDL中的和运算符不同。您正在寻找和运算符来执行按位and运算&是向量上的串联运算符,在两个18位向量之间使用它将产生一个36位向量(同样,向量宽度不匹配),

当我尝试这个的时候,我遇到了一些来自quartus的奇怪错误

下面是代码(所有未签名和其他奇怪的函数都是我试图说服Quartus编译的。)

我遗漏了相当多的代码,但损坏的部分保持不变

我要走了

错误(10344):snake_驱动程序处的VHDL表达式错误。vhd(66):表达式有36个元素,但必须有18个元素


如何正确操作?

&
运算符与VHDL中的
运算符不同。您正在寻找
运算符来执行按位and运算
&
是向量上的串联运算符,在两个18位向量之间使用它将产生一个36位向量(同样,向量宽度不匹配),如错误消息所示。

哦,这太傻了。好的,这把它修好了。我做得对吗?我不是很确定所有的类型铸造。这是最简单的方法吗?如果你试图通过一个常量值进行移位或旋转,那么切片和连接std_逻辑_向量通常会更容易。简单的右移4将是
data:=x“0”&data(从17降到4)。向右旋转4将是
data:=数据(从3向下到0)和数据(从17向下到4)
或者,您可以使用
unsigned
作为
数据的数据类型。你可以像对待标准逻辑向量一样对待它,+1表示“或者,你可以使用unsigned”。当你在一个问题上抛出类型转换时,停下来问问你是不是在与类型系统对抗而不是使用它。通常他们会给你指出一个更好的设计。(但并非总是如此!)
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

...
variable data : std_logic_vector(17 downto 0) := "000000000000000011";

...

-- 00000000111111000 original
-- 00000000000011111 shifted
-- 00000000000011000 result (AND)

data := std_logic_vector(unsigned(data) & shift_right(unsigned(data), 4));


-- 00000000011111000 original
-- 00000000111110000 shifted
-- 00000000111111000 result (OR)

data := std_logic_vector(unsigned(data) or shift_left(unsigned(data), 1));