何が起きてる? 「演算子の引数の型の不一致」が発生するのはなぜですか?それを修正するにはどうすればよいですか?
--
-- 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;
ありがとう
std_logicを直接インクリメントすることはできません。それをunsigned
に変換し、std_logic_vector
パッケージを使用して結果をnumeric_std
に戻す必要があります。
use ieee.numeric_std.all
...
nextvalue <= std_logic_vector( unsigned(value) + 1 );
たとえば、 IEEE.NUMERIC_STD を使用してSTD_LOGIC_VECTORを追加する方法を参照してください。
もう1つの方法は、この場合に「+」をオーバーロードすることです。
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パッケージがもう1つ含まれています。
このコードを試してください:
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
...
nextvalue <= value + "1";
私の場合、この解決策はうまくいきます!
すでに提供されている回答に加えて、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;
_
この形式の同時割り当ては、私が本やオンラインで見つけたものからカウンターを更新する好ましい方法のようです。
また、nextvalue
に_std_logic_vector
_型を引き続き使用する場合、_nextvalue <= 0;
_だけではなく、nextvalue <= (others => '0');
を使用してクリアすることをお勧めします。
一言で言えば、STD_LOGIC_VECTORはまさにビットのベクトルです。それ自体は何も意味しないので、vhdlがインクリメント操作が機能することを意味的に想定することはできません。それを署名なしに変換することについてここの他の投稿はトリックを行う必要があります。
これも機能します:
nextvalue <= value + '1';
あなたが本当にVHDLに精通しているかどうかわからない。 std_logic_arithパッケージを使用している場合、次の構文は論理的に正しいです