我有
douta : in std_logic_vector (3 downto 0);
doutb : in std_logic_vector (3 downto 0);
c0 : in std_logic;
f1 : in std_logic;
f0 : in std_logic;
res : out std_logic_vector (3 downto 0);
我正在尝试构建一个简单的ALU,这个ALU提供的功能之一就是 什么时候
f1 and f0 both = 1
res = douta plus b plus c0
所以我写了
f1 = '1' and f0 = '1' then res <= douta + doutb + c0;
但很明显它不会起作用,因为douta
和doutb
的数据类型为std_logic_vector
,其中co
只是std_logic
我在编译时遇到了这个错误
' Error 603 line 34 : Incompatible types for arithmetic operator: LHS=std_logic_vector!18, RHS=std_logic
任何想法如何解决这个问题?
修改 也尝试了
f1 = '1' and f0 = '1' then res <= douta + doutb + ("000" & c0);
但仍然没有运气,这次编译器说
LHS=std_logic_vector!7, RHS=array_1_of_std_logic_3_d_0
答案 0 :(得分:8)
如果您要对它们进行算术运算,请不要使用std_logic_vector
。使用ieee.numeric_std
,并使用signed
或unsigned
类型。然后你可以添加'0'或'1'。
使用std_logic_arith.all
的解决方法是使用非标准库的软糖,当您更改工具链时,这会让您陷入可移植性问题。
我写了一个更详细的页面:http://parallelpoints.com/node/3
在comp.lang.vhdl上对此进行了一些讨论:http://groups.google.com/group/comp.lang.vhdl/browse_thread/thread/549e1bbffd35914d/83cc0f19350fc392?hl=en&q=group:comp.lang.vhdl+numeric_std#83cc0f19350fc392以及comp.lang.vhdl FAQ。
答案 1 :(得分:1)
您可以将c0转换为std_logic_vector。自从我制作VHDL以来已经很久了......
if f1 = '1' and f0 = '1' then
if c0 = '1' then
res <= douta + doutb + "0001";
else
res <= douta + doutb;
end if;
end if;
这可能不是那么高效,也许硅编译器合成它以便做好事,也许这是一个更好的想法来编写它以便将c0修改为向量然后添加所有三个douta,doutb和转换器c0。另一个选择是逐位进行计算,但是你有什么编译器?
这可能听起来很荒谬,但有时编译器会产生更好的结果,如果你给它一些这样的提示(只需尝试一下并验证输出,通过这么小的例子并不是什么大不了的事):
if f1 = '1' and f0 = '1' then
if c0 = '1' then
res <= douta + doutb + "0001";
else
res <= douta + doutb + "0000";
end if;
end if;
另一个建议,如果你写if并且结果有些奇怪,引入一个else来修复未定的状态(有些编译器表现得很糟糕,如果他们有太多的自由!)。但是根据我的经验,这已经回到2004年了!!!
答案 2 :(得分:0)
哦,我觉得我找到了修复,需要添加以下库
use ieee.std_logic_arith.all;
我们尝试过的将会有效:)感谢@jdehaan
答案 3 :(得分:0)
您无需将std_logic转换为std_logic_vector即可进行添加。只需按原样添加,并确保“res”有足够的位来保持最大答案。在这种情况下,res需要为5位宽,以便它现在溢出。
作为样式,不要将输入端口命名为“dout”。那是不好的形式。在这里称他们为din,因为他们就是这样。在体系结构中实例化这个,你将另一个组件的输出端口“dout”连接到该组件的“din”。