今天用VHDL编程时遇到一个报错信息:
Line 200: found '0' definitions of operator "*", cannot determine exact overloaded matching definition for "*"
首先想到的一定是类型不匹配的问题,我引入了use IEEE.STD_LOGIC_UNSIGNED.ALL;
,这样std_logic_vector
可以当做unsigned参与计算。但是还是不行。我的代码如下:
signal blockIdx: std_logic_vector(10 downto 0);
signal rom1addr: std_logic_vector(10 downto 0);
rom1addr<=4*blockIdx+1;
其实也很容易想到,4是integer类型,肯定不能直接运算,因此我们要把它转成std_logic_vector
类型,使用conv_std_logic_vector
就可以了,注意要引入use IEEE.STD_LOGIC_ARITH.ALL;
。
于是,把语句改成rom1addr<=conv_std_logic_vector(4,11)*blockIdx+conv_std_logic_vector(1,11);
。
但是新问题又来了,两个11位数相乘的结果要用22位来存,所以结果不能和11位数相加,怎么办呢?我们新建一个变量来存储就可以了。
于是,使用如下代码就可以了:
variable tempmul: std_logic_vector(21 downto 0);
tempmul:=conv_std_logic_vector(4,11)*blockIdx;
rom1addr<=tempmul(10 downto 0)+conv_std_logic_vector(1,11);
刚开始学VHDL,遇到各种各样的低级错误,慢慢攻克吧!
Comments
注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。