VHDL如何将带有std_logic信号的std_logic_vector一起添加?

时间:2009-10-20 05:08:48

标签: vhdl

我有

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;

但很明显它不会起作用,因为doutadoutb的数据类型为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

4 个答案:

答案 0 :(得分:8)

如果您要对它们进行算术运算,请不要使用std_logic_vector。使用ieee.numeric_std,并使用signedunsigned类型。然后你可以添加'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”。