2017-03-27 12 views
1

デジタルタコメーター用のVHDL(ザイリンクス)にコードを書きました。 std_logic_vector m1を整数に変換する際に、コンパイラによって次のエラーが表示されました。VHDL:std_logic_vectorを整数に変換する際にエラーが発生しました

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.numeric_std.all; 

entity tacho is 
    Port (A : in STD_LOGIC; 
      B : out STD_LOGIC_vector (15 downto 0)); 
end tacho; 

architecture Behavioral of tacho is 
component counter 
      port(
      clk: in std_logic; 
      m: out std_logic_vector (4 downto 0)); 
end component; 
signal m1 : std_logic_vector (4 downto 0); 
variable y: integer := 0; 
variable z: integer := 0;   
begin 
x: counter port map(A,m1); 
y:= to_integer(unsigned(m1)); --error1:Syntax error near ":=". error2:Expecting type void for <to_integer>. 
z:= y * 60; --Syntax error near ":=". 
B <= std_logic_vector(to_unsigned(z, 16)); 
end Behavioral; 

多くのウェブサイトで、私が書いた構文が正しいことがわかりました。 助けてください!

+0

タコメータは、通常、あるサンプリング間隔でイベントの数をカウントします。それはあなたの設計で明らかではありません。 – user1155120

+0

変数を使用しないでください...少なくとも、これは好きではありません。また、32ビットの値に展開するので、合成に制約のない「整数」を使用することはお勧めしません。 – JHBonarius

答えて

1

変数yおよびzは、アーキテクチャレベルでは宣言できません。代わりに、信号を使用し、信号は次のように、<=を割り当てますよう、z

... 
    signal y : integer; 
    signal z: integer := 0;   
begin 
    x: counter port map(A, m1); 
    y <= to_integer(unsigned(m1)); 
    z <= y * 60; 
    B <= std_logic_vector(to_unsigned(z, 16)); 
... 

それとも単にそれを組み合わせて、中間体yを避け、:

... 
    x: counter port map(A, m1); 
    B <= std_logic_vector(resize(60 * unsigned(m1), B'length)); 
    ... 
1

非共有変数だけで宣言することができますプロセス文またはサブプログラムあなたは、プロセスのあなたのスケーリングのコードを配置できます。

library ieee; 
use ieee.std_logic_1164.all; 
use ieee.numeric_std.all; 

entity tacho is 
    port (A: in std_logic; 
      B: out std_logic_vector (15 downto 0) 
    ); 
end entity tacho; 

architecture behavioral of tacho is 
    component counter is 
     port (
      clk: in std_logic; 
      m: out std_logic_vector (4 downto 0) 
     ); 
    end component; 
    signal m1 : std_logic_vector (4 downto 0); 
begin 

x: counter port map (A, m1); 

scaling: 
    process (m1) 
     variable y: integer := 0; 
     variable z: integer := 0; 
    begin 
     y := to_integer(unsigned(m1)); 
     z := y * 60; 
     B <= std_logic_vector(to_unsigned(z, 16)); 
    end process; 
end architecture behavioral; 

それとも、サブプログラムにあなたの計算を移動することができ:

architecture scaled of tacho is 
    component counter is 
     port (
      clk: in std_logic; 
      m: out std_logic_vector (4 downto 0) 
     ); 
    end component; 
    signal m1 : std_logic_vector (4 downto 0); 
    function scale(m1: std_logic_vector (4 downto 0); SIZE: natural := 16) 
      return std_logic_vector is 
     variable y: integer; 
     variable z: integer; 
    begin 
     y := to_integer(unsigned(m1)); 
     z := y * 60; 
     return std_logic_vector(to_unsigned(z, SIZE)); 
    end function; 
begin 

x: counter port map (A, m1); 
scaled_output: 
    B <= scale(m1); 
end architecture; 

これらの両方が分析します。

関連する問題