这里发生了什么?为什么我得到'运算符参数类型不匹配',我该怎么做才能解决它?
--
-- 32-bit counter with enable and async reset
--
architecture synthesis1 of counter_32bit is
signal nextvalue : std_logic_vector ( 31 downto 0 );
begin
--
-- combo
--
nextvalue <= value + 1; -- here
--
-- sequential
--
ff:process( clk, rst )
begin
if( rst = '1' ) then
value <= 0; -- and here...
elsif( clk'event and ( clk ='1' ) ) then
if( ena = '1' ) then
value <= nextvalue;
end if;
end if;
end process ff;
end synthesis1;
由于
答案 0 :(得分:24)
您无法直接增加std_logic,您需要将其转换为unsigned
,并使用std_logic_vector
包将结果返回numeric_std
。
use ieee.numeric_std.all
...
nextvalue <= std_logic_vector( unsigned(value) + 1 );
例如,请参阅How Do Perform STD_LOGIC_VECTOR Addition Using IEEE.NUMERIC_STD。
答案 1 :(得分:3)
另一种方法是重载“+”,在这种情况下你可以写:
function "+" ( a : std_logic_vector; b : integer ) return std_logic_vector is
variable result : unsigned(a'range);
begin
result := unsigned( a ) + 1 ;
return std_logic_vector( result ) ;
end function ;
创建一个包并在该包中包含此函数,这将起到作用。还有一件事包括ieee numeric_std包,因为它包含转换函数。
答案 2 :(得分:3)
试试这段代码:
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
...
nextvalue <= value + "1";
就我而言,这个解决方案是有效的!
答案 3 :(得分:2)
除了已经提供的答案之外,您还可以重写代码,将nextvalue
定义为具有unsigned
数据类型(下方)。请注意使用nextvalue <= to_unsigned(0, 32);
清除计数器,并使用rising_edge(clk)
触发上升沿。
-- 32-bit counter with enable and async reset
architecture synthesis1 of counter_32bit is
signal nextvalue : unsigned ( 31 downto 0 );
begin
ff:process( clk, rst )
begin
if( rst = '1' ) then
nextvalue <= to_unsigned(0, 32); -- reset the count
elsif rising_edge(clk) then
if( ena = '1' ) then
nextvalue <= nextvalue + 1; -- increment the count
end if;
end if;
end process ff;
-- Concurrent assignment statement
value <= std_logic_vector(nextvalue);
end synthesis1;
这种并发分配形式似乎是我在书籍和网上找到的更新计数器的首选方法。
此外,如果您继续使用std_logic_vector
nextvalue
类型,则清除它的首选方法似乎是nextvalue <= (others => '0');
,而不仅仅是nextvalue <= 0;
。
答案 4 :(得分:1)
简而言之,STD_LOGIC_VECTOR只是一个位向量。它本身并不意味着什么,所以你不能指望vhdl在语义上假设增量操作将对它起作用。这里关于将其转换为无符号的其他帖子应该可以解决问题。
答案 5 :(得分:0)
这也有效:
nextvalue <= value + '1';
不知道你是否真的精通VHDL。如果您使用std_logic_arith包
,则以下语法是逻辑上正确的