4

我有

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;

但显然它不会起作用,因为doutaand的数据类型doutbstd_logic_vectorasco只是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

4 回答 4

8

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

于 2009-10-26T15:55:17.643 回答
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 年的经验!!!

于 2009-10-20T05:29:05.680 回答
0

哦,我想我找到了解决方法,需要添加以下库

use ieee.std_logic_arith.all;

我们尝试过的将起作用:) 感谢@jdehaan

于 2009-10-20T05:46:26.690 回答
0

您无需将 std_logic 转换为 std_logic_vector 即可进行添加。只需按原样添加,并确保“res”有足够的位来保存最大答案。在这种情况下, res 需要 5 位宽才能使其现在溢出。

并且作为风格 nit,不要将您的输入端口命名为“dout”。那是不好的形式。在这里叫他们din,因为他们就是这样。在体系结构中,您将另一个名为“dout”的组件的输出端口连接到该组件的“din”。

于 2009-10-21T20:32:46.543 回答