0

私はVHDLを初めて使用し、遅延とゲート出力の長さを調整して、プログラマブルFPGAの遅延/ゲートアプリケーションを作成しようとしています。入力信号を受信するとすぐに、ゲート信号の生成が完了するまで、他の入力を無視する必要があります。

後でこのコンポーネントを 8 つの異なる入力と 8 つの異なる出力に使用し、レジスタを書き込むことによって、それぞれに必要な遅延/ゲート パラメータを個別に設定したいと考えています。

Quartus II v 11.0 でコンパイルしようとすると、次のエラーが発生します。

エラー (10821): clkgen.vhd(46) での HDL エラー: サポートされているレジスタ モデルと動作が一致しないため、"control_clkgen" のレジスタを推論できません

そして同様に

エラー (10822): clkgen.vhd(37) での HDL エラー: このクロック エッジで割り当て用のレジスタを実装できませんでした

何が悪いのかわかりません。コンポーネントのコードは次のとおりです。

library ieee;
use IEEE.Std_Logic_1164.all;
use IEEE.Std_Logic_arith.all;
use IEEE.Std_Logic_unsigned.all;


ENTITY clkgen is
port(
 lclk                         : in  std_logic;
start_clkgen           : in  std_logic;
gate_clkgen            : in std_logic_vector(31 downto 0);
 delay_clkgen           : in std_logic_vector(31 downto 0);
 output_clkgen          : out std_logic

 );
END clkgen ;


ARCHITECTURE RTL of clkgen is

 signal  gate_cycles_clkgen    : std_logic_vector(32 downto 0);
 signal  delay_cycles_clkgen    : std_logic_vector(32 downto 0);
 signal  total_cycles_clkgen    : std_logic_vector(32 downto 0);
 signal  counter_clkgen         : std_logic_vector(32 downto 0);
 signal  control_clkgen         : std_logic;



begin
 gate_cycles_clkgen    <= '0' & gate_clkgen;
 delay_cycles_clkgen    <= '0' & delay_clkgen;
 total_cycles_clkgen    <= gate_cycles_clkgen + delay_cycles_clkgen;


 start_proc: process(lclk, start_clkgen)
  begin
   if (start_clkgen'event and start_clkgen = '1') then
    if control_clkgen = '0' then
     control_clkgen   <= '1';
    end if;
   end if;  

   if (lclk'event and lclk = '1') then
    if control_clkgen  = '1' then
     counter_clkgen <= counter_clkgen + 1;
    if (counter_clkgen > delay_cycles_clkgen - 1 AND counter_clkgen < total_cycles_clkgen + 1) then
     output_clkgen <= '1';
    elsif (counter_clkgen = total_cycles_clkgen) then
     counter_clkgen   <= (others => '0');
     output_clkgen    <= '0';
     control_clkgen   <= '0';
    end if;
   end if;
 end if;
 end process start_proc;

END RTL;

助けてくれてありがとう。

4

2 に答える 2

2

問題は、要素を説明した方法で、 2 つの異なる信号 ( 、および)control_clkgenに対してエッジに敏感であることです。ツールがあなたに伝えていることは、「あなたの有効な VHDL デザインを実際のハードウェアに適合させようとしているので、あなたが望むものを実装できるハードウェアがないことがわかりました。基本的に、そこには2 つの信号 (1 つだけ、通常はクロック。lclkstart_clkgen

考えられる解決策: 本当にcontrol_clkgenのエッジに敏感である必要がありstart_clkgenますか? それで十分でしょうか、それともstart_proc感度が高いかlclkどうかだけをチェックするだけの別の解決策を見つけることができますか?start_clkgen

start_proc: process(lclk)
   begin
      if (rising_edge(lclk)) then
          start_clkgen_d <= start_clkgen;
          if (start_clkgen='1' and start_clkgen_d='0') then
             if control_clkgen = '0' then
                control_clkgen   <= '1';
             end if;
          end if;
      end if;
      ...
于 2012-06-25T10:55:02.163 に答える
1

control_clkgenと の2 つのクロックを持つレジスタをstart_clkgen記述していますlclk。合成ツールではサポートされていないと思います。この動作を別の方法で説明する必要があります。非同期または同期のプリセット信号として使用するstart_clkgenか、これら 2 つの信号を 1 つのクロック信号に結合するか、その機能のために複数のフリップフロップを使用します。

于 2012-06-25T10:52:54.827 に答える