2016-07-14 161 views
0

変換の問題に直面しています。同様のトピックがたくさんありますが、コードはまだ動作していません.Plsは私にいくつかのヒントを教えてください。 Quartusは私にエラーを与える:std_logic_vectorから整数への変換vhdl

Error (10476): VHDL error at true_dual_port_ram_single_clock.vhd(44): type of identifier "random_num_i" does not agree with its usage as "std_logic_vector" type

LIBRARY ieee; 
USE ieee.std_logic_1164.all; 
use IEEE.std_logic_signed.all; 
use IEEE.std_logic_unsigned.all; 
use IEEE.NUMERIC_STD.ALL; 
use IEEE.STD_LOGIC_ARITH.ALL; 

entity write_ram is 
    generic(width : integer := 32); 
    port(clock_i : IN STD_LOGIC; 
     we_w  : IN STD_LOGIC; 
     wr_addr : IN INTEGER RANGE 0 to 31; 
     read_add : IN INTEGER RANGE 0 to 31; 
     q_out : out STD_LOGIC_VECTOR(2 DOWNTO 0) 
); 
end write_ram; 

architecture rtl of write_ram is 
    --- Component decalarartion 
    component random is 
    port(clk  : in std_logic; 
     random_num : out std_logic_vector(width - 1 downto 0) --output vector 
    ); 
    end component; 

    component single_clock_ram is 
    port(clock   : IN STD_LOGIC; 
     data   : IN INTEGER RANGE 0 to 31; 
     write_address : IN INTEGER RANGE 0 to 31; 
     read_address : IN INTEGER RANGE 0 to 31; 
     we   : IN STD_LOGIC; 
     q    : OUT STD_LOGIC_VECTOR(2 DOWNTO 0) 
    ); 
    end component; 
    for all : random use entity work.random(rtl); 
    for all : single_clock_ram use entity work.single_clock_ram(rtl); 
    Signal random_num_i : INTEGER RANGE 0 to 31; --interanal signals 
begin 
    -- Component Instantiation 

    C1 : random Port map(
     clk  => clock_i, 
     --random_num <=to_integer(to_signed(random_num_i)) 
     random_num => random_num_i 
    ); 
    random_num <= to_integer(to_signed(random_num_i)); -- error 

    C2 : single_clock_ram 
    Port map(
     clock   => clock_i, 
     we   => we_w, 
     read_address => read_add, 
     write_address => wr_addr, 
     data   => random_num_i, 
     q    => q_out 
    ); 

end rtl; 

答えて

1

あなたの質問はランダムとsingle_clock_ram現在のコンフィギュレーション仕様にMCVEではありません。あなたはそれらのエンティティ宣言とアーキテクチャ本体(rtl)を提供しませんでした。それらをコメントアウトして

は、この分析:

library ieee; 
use ieee.std_logic_1164.all; 
-- use ieee.std_logic_signed.all; -- NOT USED 
-- use ieee.std_logic_unsigned.all; -- NOT USED 
use ieee.numeric_std.all; 
-- use ieee.std_logic_arith.all; -- NOT USED 

entity write_ram is 
    generic (width: integer := 32); 
    port (clock_i: in std_logic; 
     we_w:  in std_logic; 
     wr_addr: in integer range 0 to 31; 
     read_add: in integer range 0 to 31; 
     q_out:  out std_logic_vector(2 downto 0) 
); 
end entity write_ram; 

architecture rtl of write_ram is 
    --- component declaration 
    component random is 
    port (clk:   in std_logic; 
     random_num: out std_logic_vector(width - 1 downto 0) --output vector 
    ); 
    end component; 

    component single_clock_ram is 
    port (clock:   in std_logic; 
      data:   in integer range 0 to 31; 
      write_address: in integer range 0 to 31; 
      read_address: in integer range 0 to 31; 
      we:    in std_logic; 
      q:    out std_logic_vector(2 downto 0) 
    ); 
    end component; 
    -- for all: random use entity work.random(rtl); 
    -- for all: single_clock_ram use entity work.single_clock_ram(rtl); 
    signal random_num_i: integer range 0 to 31; -- internal signals 
    signal random_num: std_logic_vector(width - 1 downto 0); -- added 
begin 
    -- component instantiation 

    c1: random port map (
     clk  => clock_i, 
     -- random_num <=to_integer(to_signed(random_num_i)) 
     -- random_num => random_num_i -- DELETED 
     random_num => random_num -- ADDED 
    ); 
    -- random_num <= to_integer(to_signed(random_num_i)); -- error DELETED 
    random_num_i <= to_integer(signed(random_num)); -- ADDED 

    c2: single_clock_ram 
    port map (
     clock   => clock_i, 
     we   => we_w, 
     read_address => read_add, 
     write_address => wr_addr, 
     data   => random_num_i, 
     q    => q_out 
    ); 

end architecture rtl; 

注データをsingle_clock_ramするための入力として使用される整数random_num_iを変換してランダムの出力にフックアップすると宣言random_numのSTD_LOGIC_VECTORがあっています。 single_clock_ramの出力qは少し疑わしく見えますが、それは整数かより広いstd_logic_vectorでしょうか?

+0

助けてくれてありがとう、@ user1155120。私の目的は、2つのエンティティrandomとsingle_clock_ramのトップレベルを作成することです。だから私はあなたのコメントに基づいてRAMブロックにランダムに出力を接続しようとしています。私のコードを変更しましたが、私はまだ同じエラーがあります。 – Kooss

+0

もう1つ質問std_vectorと整数の長さを同じにするには? – Kooss

1

まず、非標準のライブラリを削除します。

use IEEE.std_logic_signed.all; 
use IEEE.std_logic_unsigned.all; 
use IEEE.STD_LOGIC_ARITH.ALL; 

のみstd_logic_1164numeric_stdを残します。

重複した宣言が複数あるため、何が起きているのかを判断することが難しく、同一の引数と結果の型を持つ同じ演算子の宣言が複数あると、コンパイラはピッキングするのではなく、任意のもの。


次に、何をしようとしているのかを決めます。これは現在、あいまいで矛盾しています。

(1)あなたは32ビット・ワードを扱っているお勧めgeneric (width : integer :=32);とポート宣言

random_num : out std_logic_vector (width-1 downto 0) 

を持っています。

(2)負の値がエラーであることをさらに明確にするためには、(a)はNATURALの範囲にする必要があり、(b)は5ビットの単語を扱っていることを示しています。

どちらですか?あなたは正確に何をしようとしていますか?

そしてここで、あなたは明らかにポートマップにそれらを一緒に接続しようとしている...

C1: random Port map ( 
    clk => clock_i, 
    --random_num <=to_integer(to_signed(random_num_i)) 
    random_num =>random_num_i 
); 
random_num <=to_integer(to_signed(random_num_i)); -- error 

ものの数が間違ってここにあります。

1)random_num =>random_num_iのような単純なポートマッピングでは、両方のタイプが同じタイプである必要があります。あなたは、信号の宣言

random_num_slv : std_logic_vector (width-1 downto 0); 

を追加した場合、たとえば、その後、ポートマッピングrandom_num =>random_num_slvは動作します:両側は実際には同じ種類だった場合、これは動作します。これで、信号割当で必要なタイプrandom_num_iに変換することができます。

random_num_i <= to_integer (unsigned(random_num_slv)); 

これにはまだ問題があります。32ビット出力が5ビット整数をオーバーフローする可能性があります。

中間信号random_num_slvを追加すると、非効率的で冗長に見えるかもしれませんが、デザインをクリーンかつシンプルに保つことができます。これは、ポートのタイプ変換を理解していないツールを扱う場合に重要です。

よりきれいなアプローチがある場合でも、中間信号の使用方法を理解してください。他のすべてが失敗したときにあなたを救うことができます。

(2)コメントアウトポートマッピング

random_num <=to_integer(to_signed(random_num_i)) 

は、三つのことを除いて、それを行うための方法だろう... (a)の<=は信号の割り当てで、あなたは=>関連のオペレータを必要とします (b)整数を整数に変換し、それを使ってstd_logic_vectorを駆動しています。それは本当に動作しません... (c)コンポーネントポートはOUTPUTなので、最初にそれを動かすべきではありません。あなたはおそらく何を意味するのか

to_integer(unsigned(random_num)) => random_num_i 

であり、このポートでは、あなたのツールのサポートの変換が適切にマッピングしている場合はそれを行うためのクリーンな方法だろう。 注:

  • は再びそれはオーバーフローの問題を有している、32ビットのベクトルは、5ビットの整数に適合しないであろう。
  • std_logic_vectorは、変換関数to_signedではなく、unsignedをキャストして符号付きまたは符号なしのいずれかに変換できます。これらは密接に関連する型です。整数はこれらと密接に関連していないので、変換関数to_integerが必要です。
  • random_num_iの宣言では負の数を使用できないため、signedではなくunsignedを使用してください。

(3)既存の信号割当

random_num <=to_integer(to_signed(random_num_i)); -- error 

は再びいくつかのエラーを含みます。最大の問題は、コンポーネント宣言の外側に表示されるrandom_numポートがないことです。この行を削除するだけで、ポートマッピングの1つを使用する必要があります。


さらに考察:

(1)いくつかの型変換は避けられません。しかし、あなたがあまりにも多くをやっているなら、一般的には、std_logic_vectorのような設計上のエラーを指しています。アドレスは必然的に符号なしの整数なので、unsignedまたはnaturalのどちらかが良い選択でしょう。デザインはできるだけシンプルで読みやすいものにしておきます。私はここintegerの使用は一般的に良いと思いますが、naturalが良いだろう

あなたのような一般的なwidthの柔軟性を追加する場合(2)、正しくそれを一貫して使用します(あなたが負のアドレスを必要としない限り!) - OR - それが有効であることを確認してください。

ここで説明したように、このエンティティがwidth => 5でインスタンス化されている場合、デザインは驚くことなく正しく動作します。

この前提条件が満たされていない場合は、値を確認して中止してください。

または、他の量を有効な方法でそれに依存させるなど、ジェネリックのすべての合理的な値に対する設計を行います。たとえば、次のように

constant DEPTH : natural := 2**WIDTH - 1; 
    signal random_num_i : natural range 0 to DEPTH; 

のように...

関連する問題