0

私は vhdl (ISE プロジェクト ナビゲーターを使用) が初めてで、このプログラム (sequence.vhd) を合成するのに少し問題があります。

LIBRARY ieee ;
USE ieee.std_logic_1164.all;

PACKAGE mypack IS
VARIABLE counter: STD_LOGIC := '0' ;
VARIABLE simultaneous : STD_LOGIC := '0' ;
END PACKAGE mypack;

LIBRARY ieee ;
USE ieee.std_logic_1164.all;
use IEEE.STD_LOGIC_ARITH.ALL;

use IEEE.STD_LOGIC_UNSIGNED.ALL;


--library work;

USE WORK.mypack.ALL;

ENTITY secuencia IS

PORT(
    polh            : IN    STD_LOGIC; --uno
    polv            : IN    STD_LOGIC; --cero
    seq            : OUT   std_logic_vector(8 downto 0):= (others => 'Z')
);

END secuencia;


ARCHITECTURE registro OF secuencia IS

SIGNAL stack : std_logic_vector(1000 downto 0);


BEGIN
PROCESS(polh, polv)
 BEGIN

        IF (polh'event) and (polh='1') and (polv='0')THEN
            stack(counter) <= '1';
            counter := counter +1;

        ELSE IF (polv'event) and (polv='1') and (polh='0')THEN
            stack(counter) <= '0';
            counter := counter +1;
        ELSE IF (polh'event) and (polh='1') and (polv'event) and 
(polv='1') THEN
            simultaneous := simultaneous+1;

        END IF;

END PROCESS;

END registro;

これらは最初の 2 つのエラーです。

行 5. ここでは SHARED 変数のみを宣言できます。

行 6. ここでは SHARED 変数のみを宣言できます。

したがって、問題は宣言された変数にあります...目的は、アーキテクチャでそれらを使用することです。初心者の問題だと確信していますが、解決策がわかりません。ありがとう!

PD: コードを正しくフォーマットできませんでした。申し訳ありません


アップデート:

@Martin Thompsonを助けてくれてありがとう。私はあなたが提案したことをしましたが、今は別のタイプまたは問題を抱えています. 調べてみましたが、原因はいろいろあるようです。これがコードです

ENTITY secuencia IS
PORT(
    polh            : IN    STD_LOGIC; --uno
    polv            : IN    STD_LOGIC; --cero
    Pedido      : IN    STD_LOGIC; 
    DatoListo   : OUT    STD_LOGIC; 
    seq            : OUT   std_logic_vector(1000 downto 0):= (others =>   'Z')

);
END secuencia;


ARCHITECTURE registro OF secuencia IS

SIGNAL stack : std_logic_vector(1000 downto 0);


BEGIN

PROCESS(polh, polv, Pedido) 

variable counteria : natural;
 variable Listo : integer;
 variable simultaneo : integer;
 BEGIN
    IF (counteria < 1000) THEN

       IF (polh'event AND polh='1' AND polv='0') THEN
        --IF (polh='1' AND polv='0') THEN
            stack(counteria) <= '1';
            counteria := counteria +1;


         ELSIF (polv'event AND polv='1' AND polh='0') THEN
         --ELSIF (polv='1' AND polh='0') THEN    
                stack(counteria) <= '0';
                counteria := counteria +1;                 

        ELSIF (polh'event AND polh='1' AND polv'event AND polv='1') THEN
           simultaneo := simultaneo+1;

END IF;

    ELSIF (counteria = 1000)THEN
      DatoListo <='1';
          IF (Pedido='1')THEN
               Seq  <= stack;            
           counteria := 0;
       DatoListo <='0';
            END IF;                                 
    END IF;

END PROCESS;
END registro;

そして、それはこのエラーを与えます

25行目:シグナルスタック>合成できません、同期記述が悪いです。同期要素 (レジスタ、メモリなど) の記述に使用している記述スタイルは、現在のソフトウェア リリースではサポートされていません。


更新 2:

私はいくつかの変更を加え、プログラムの一部にコメントを付けました。それは合成します:

PROCESS(polh, polv, Pedido) 

     variable counteria : natural := 0;
     variable Listo : integer;
     variable simultaneo : integer;
 BEGIN
    IF (counteria < 1000) THEN
       IF rising_edge(polh) THEN
            IF (polv='0') THEN
               stack(counteria) <= '1';     
               counteria := counteria + 1;
            END IF;
--     ELSIF rising_edge(polv)  THEN
--          IF (polh='0') THEN
--             stack(counteria) <= '0';
--             counteria := counteria +1;                  
--          END IF;
--     END IF;

       ELSIF (counteria = 1000)THEN
           DatoListo <='1';
              IF (Pedido='1')THEN
                  Seq   <= stack;            
           counteria := 0;
           DatoListo <='0';
       ENDIF;                                           

    END IF;

END PROCESS;
END registro;

この合成。ただし、その部分のコメントを外すとELSIF rising_edge(polv) THEN、同じ問題が発生します。Signal stack<counteria<9:0>> cannot be synthesized...

4

1 に答える 1

5

今のところ、共有変数を使用しないでください。最初にいくつかの基本を理解する必要があります。

outの値を別の場所に「送信」する必要がある場合はcounter、項目を に追加しportてそこに書き込みます。

(表示されているように)単にストレージとして使用したい場合は、内で使用することを宣言しprocessます。

最後に、これを合成したい場合は、 からクロック信号を受信portする必要があり、標準のクロック プロセスを作成する必要があります。

polh と polv の入力がいつ変化したかを知りたい場合は、以前の値を保存し、それが現在の値と異なるかどうかを確認する必要があります。

process (clk)
    variable vpol_last : std_logic;
begin
  if rising_edge(clk) then
       if vpol_last /= vpol then -- it's changed
       -- do something
       end if;
       vpol_last := vpol; -- store current value for next time.
       -- etc.
  end if;
end process;
于 2012-09-12T15:48:25.943 に答える