05月18, 2017

用Xilinx ISE在FPGA上使用VHDL编程时报错找不到乘法定义

今天用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,遇到各种各样的低级错误,慢慢攻克吧!

本文链接:https://debug.fanzheng.org/post/an-vhdl-error-cannot-determine-exact-overloaded-matching-definition-for-multiply-on-fpga-using-xilinx-ise.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。