3

vhdlで信号を数サイクル遅らせたいのですが、vhdlで信号を数サイクル遅らせる方法を使用するのに問題があります

登録された信号は必要ありませんか?つまり、次のようなものです。


a_store and a_store_registered would be std_logic_vector(cycles_delayed-1 downto 0)

process(clk)
begin
    if rising_edge(clk) then
      a_store_registered <= a_store;
    end if;
end process;    
a_out <= a_store_registered(cycles_delayed-1);

process(a_store_registered, a)
begin    
      a_store <= a_store_registered(size-2 downto 0) & a;
end process;

4

3 に答える 3

4

リンクするソリューションrising_edge(clk)、レジスターされたシグナルです。修飾子を使用してプロセス内のシグナルに書き込むという行為自体が、レジスターを作成します。

遅延線のさらに単純な実装は、1行のコードで行うことができます(+上位ビットを出力にコピーする場合は別の行)

a_store <= (a_store(a_store'high-1 downto 0) & a) when rising_edge(clk);
a_out <= a_store(a_store'high);

リンクされた質問への回答でこれについて言及しなかった理由がわかりません!

于 2012-08-08T09:08:43.690 に答える
3

なぜあなたが今のように問題に取り組んでいるのかわかりません。ここでは2番目のプロセスは必要ありません。リンクされた質問で提案された方法の何が問題になっていますか?

if rising_edge(clk) then
  a_store <= a_store(store'high-1 downto 0) & a;
  a_out <= a_store(a_store'high);
end if;

この場合、入力はaであり、出力はa_outです。遅延を長くしたい場合はa_store、シグナル宣言のサイズを変更してサイズを大きくしてください。

他の理由で中間信号にアクセスしたい場合は、次のようにすることができます。

a_store <= a_store_registered(cycles_delayed-2 downto 0) & a;
process(clk)
begin
    if rising_edge(clk) then
      a_store_registered <= a_store;
    end if;
end process;    
a_out <= a_store_registered(cycles_delayed-1);
于 2012-08-07T15:57:46.737 に答える
2

foo'delayed(N ns)属性またはfoo <= sig after N nsシミュレーションで使用できることを忘れないでください。

于 2013-02-20T20:20:20.780 に答える