• 締切済み

FPGAで立ち下がりエッジ動作FF

いつもお世話になります。 (カテゴリが違ったら済みません) verilogでFPGAを設計しています。 基本、同期回路設計でクロックの立ち上がりを使用しています。 外部回路の都合で、180度ずれたタイミングでデータを受け取りたく検討しています。 その際に、FFの記述で always@(negedge clk) と記述しようかと思ったのですが、通常ライブラリ等を見みますと立ち上がりエッジの FFしか見た事が無く、タイミング制約を守れなくなり、結果NGになるのではと思って 躊躇しています。 質問をまとめますと以下の通りです。 (1)always@(negedge clk)は、今時普通に使用しても良いものでしょうか? (2)上記のように記述しコンパイル出来たとした場合、クロックを反転させるインバータは  どこにある資源を使用するものなのでしょうか?  ・一括で反転してそのクロックで動く全FFに供給する。  ・各FF単位で反転してFF自信に繋ぐ。 お分かりになる方、ご教授願います。 宜しくお願い致します。 以上

  • rkt7
  • お礼率92% (50/54)

みんなの回答

  • monova
  • ベストアンサー率68% (68/100)
回答No.1

(1) 普通に negedge を使ってます。 ライブラリなどは、わざわざ、negedgeを使う意味が 無いからでは? もし、使ってはいけないのなら、その理由を 私も勉強したいです。 (2) これは、FPGAの仕様に寄ります。 専用開発ツールを使っているのなら、 マニュアルや、ハードの仕様書に 書いてませんか? セルの構成や、クロック専用ラインの有無で 異なってきます。 もし、選択肢がある様なFPGAなら、 どの様に構成するかコマンドなり スイッチがあると思います。

rkt7
質問者

お礼

ご回答ありがとうございました。 私の経験上、negedgeを禁止する様な注記を、マニュアル系で見た事がないです。 極力、自分自身も避けてきたのですが、今回はnegedgeを普通感覚で使用出来ると設計工数が少なくて済みありがたい感じでした。 ちょっとした事くらいでは使用した経験があるのですが、いつも不安にも思っていました。FPGAはディレーやスキューとの調整が大変になりそうで。 もう少し自分も調べてみたいと思います。 ありがとうございました。

関連するQ&A

  • Verilog-HDLのFF記述について

    先程アップしたのは、図が変になってしまいました。 改めて質問します。 1つのFF(非同期リセット)をVerilog-HDLで記述すると、以下のように記述出来ますよね? always @ ( posedge CLK or negedge RESET ) begin if ( !RESET ) begin Q <= 1'b0 ; xQ <= 1'b1 ; end else begin Q <= D ; xQ <= ~D ; end end この1つのFFをalways文を2つ使って記述出来るんですか? ご回答宜しくお願いします。

  • フリップフロップ(D-FF)回路について

    D-FF回路でT-FF回路を作成した場合、Qバーの出力をDに入力させます。 このとき、Qバーの出力ピンに丸印(小さい○)をつけると、クロック(CLOCK)の立ち上がりエッジから遅延して、Qバーからの出力が反転されます。 ここで、なぜ、Qバーの出力ピンに丸印(小さい○)をつけると、クロック(CLOCK)の立ち上がりエッジから遅延して、Qバーからの出力が反転されるのかが、分かりません。 ご教授をよろしくお願いします。

  • verilog HDL のレジスタ記述について

    こんにちは verilog初心者です。論理合成をしていて気になる点があったので質問させていただきました。 二つのクロックの立ち上がりで書き込むレジスタを記述していて、 (全て1bit、clkはクロック) always @(posedge clk1 or posedge clk2) begin q <= d; end としたところ、シミュレーションはできますが論理合成はできませんでした。 自分の持っている参考書に「複数の書き込み信号があるレジスタはない」という記述があったので一応納得しました。 ところが、 always @(posedge clk1 or posedge clk2) begin if (clk1==1) q <= d; else if (clk2==1) q <= d; end と記述すると論理合成できてしまいます。 両者の書き込み信号に対する振る舞いは同じように思うのですが、一体何が違うのでしょうか。 わかる方いましたら是非ご教示下さい。よろしくお願いします。

  • Verilog HDLで立下りと立ち上がり両方のエッジを検出する方法を

    Verilog HDLで立下りと立ち上がり両方のエッジを検出する方法を探しています。 色々試してみたのですが、そのようなことはできないとエラーがでました。 元の周波数を2倍にして立ち上がりだけ見るという方法は、今回私が想定している仕様では使えないので、どうしても両エッジを検出したいのです。 どなたかご存知の方いらっしゃいましたら回答のほうよろしくお願いします。 ちなみに使用しているFPGAはXC3S200で使用ツールはXilinx社のISEです。

  • verilogでの記述、always@の使い方

    verilogでの記述の仕方について質問です。 画像のようなタイミングチャートを考えています。 clkとplsは入力、dataが出力です。 構成は、  pls↑の次のclk↑で、dataをアサートする。 というのを考えています。 pls↑やclk↑は、posedgeを使えばよいと思うのですが、 私の考え通りに記述すると always @(posedge pls)begin @(posedge clk)begin data <= 1; end end こんな感じになるのか?となってしまいます。 @()begin end の中に@()beginを記述することが出来るのか というところから疑問です。 出来たとしても、これが私が意図したとおりに動作するのかがよくわかりません。 ネットで、 always @() @() と記述すると順序回路ができるとあったのですが、いまいち動作が分かりません。 どなたか、動作を教えていただけないでしょうか。 また、pls↑の次のclk↑で、dataをアサートする方法を教えていただけないでしょうか。 よろしくお願い致します。

  • FPGAを独学で学ぶ方法

    FPGAを独学で学ぶ方法 自分は大学でVerilogHDLを学びました。 加算器やデコーダ、セレクタ、ステートマシンなど 専門書に書いてある内容は大体理解できました。 しかし、応用回路が全く記述できません。 たとえばPWM発生回路、信号処理、マイコンと接続など 行数が長くなるプログラムは組めません そこでもう一度Verilogを勉強しなおしたいのですが 開発環境がありません。 XilinxのISEは無料で手に入るのですが、ボードはどうすればいいのでしょう? また、開発環境について詳しく書いてある書籍がほしいです。 予算は1万円前後です。 また、コードを組むコツを教えてください。 C言語やVBは得意でしたがVerilogはあまり理解できませんでした。

  • FPGA/Verilogでのモジュールの違い

    現在,FPGAとVerilogを用いて、モータの回転数をセンサでカウントする回路を作成しています。 countという名前のカウント回路を作成し、2つのセンサ(センサ1とセンサ2)があるため、count1,count2とインスタンスを2つ作成しています。 トップモジュールでは以下のように宣言しています。 count count1( .CLK( CLK), .SENSOR( SENSOR1), .COUNT_DIGI_0( COUNT_DIGI_20), .COUNT_DIGI_1( COUNT_DIGI_21), .COUNT_DIGI_2( COUNT_DIGI_22), ); count count2( .CLK( CLK), .SENSOR( SENSOR2), .COUNT_DIGI_0( COUNT_DIGI_0), .COUNT_DIGI_1( COUNT_DIGI_1), .COUNT_DIGI_2( COUNT_DIGI_2), ); countモジュール内では、SENSORが入力されると、カウント数が1upするだけです。 COUNT_DIGI_*は別の回路にカウント数を伝えるためにwireで接続しています。 最初に,センサ1をcount1に、センサ2をcount2に接続したところ、2つのカウント数に相違がでてしまいました。(count2のカウント数が多い) センサの配線が悪いと思い、センサ1の出力をcoun1とcount2に接続してテストしてもカウント数に相違がでてしまいました。 なぜ、同じモジュールを使用し、入力も同じなのに、結果に違いが出るのでしょうか? FPGAの特性などがあるのでしょうか? お分かりになられる方がいらっしゃいましたら宜しくご教授お願い致します。

  • ディジタル回路 JK-FFを用いた回路

    同一クロックで動作する2つのJK-FFの回路なんですが 片方のJK-FFの入出力をそれぞれJ1,K1,Q1,¬Q1 もう片方の入出力をそれぞれJ2,K2,Q2,¬Q2とします。 J1とK2が常にHで、¬Q1とJ2がつながっていて、K1と¬Q2が つながっている回路のQ1,¬Q1,Q2,¬Q2のタイミングチャートは _| |_| |_| |_| |_ CLK ___     _________     |    |          K1=¬Q2 ___|       |_____ Q1 ___         _____     |        |      ¬Q1=J2 ___|   |_________ Q2 このようにあるテキストに書いてあるのですが、この4本すべて 回路を見れば最初からわかるのですか、それともどれか一本が あたえられれば残りがわかるのですか、回路を見ればわかるとすれば どう考えればいいのか教えてください。

  • PLDデバイスのリセット信号に関して

    PLDデバイス(CPLD、FPGA)でHDL言語できしょうしています、 always@(posedge clk or negedge rst)begin if(!rst)begin reg <= 0; end if begin レジスタのリセットを上記の様に記述しますが、この「rst」の信号はPLDデバイスの外部から 入力される設定なのですが、通常PLDのリセット信号をどの様な回路構成で生成するのでしょうか? PLD外部にCPUが有る場合はCPUから入力すればよいと思いますが、CPUなどが無くPLDデバイス 単体の場合、PLDデバイス用のリセットICなどあるのでしょうか? PLDデバイスはCPLDタイプであっても内部的にロジックをローディングするコンフィギュレーション動作が必要でこの間は数百msec程度かかると思われます。 ※CPUのリセット時間に比べかなり長いと思われます。 しかし通常のCPU用のリセットICはそんなに長い期間用はあまり無いと思います。 又はアルテラ社のデバイスを見ると「POR](パワーオンリセット)なる、ブロックが内蔵されていますが、このモジュールをリセット回路として使用できるのでしょうか。その場合、冒頭のVerilog言語で どの様に記述すればいいのでしょうか。 よろしくお願いします。

  • FPGAのシミュレーションに関して

    いつもお世話になっています。 以下の開発環境におけるFPGAのロジックのシミュレーションに疑問があるので質問します。 環境 modelsim Altera starter edition 質問概要 10進カウンターを作ってクロックの立ち上がりで動作するように作ったのに立下りで動作するのは何故か。(10進数をカウンター内部変数TQで数え上げqに出力しているがTQはクロックの立ち上がりで動いているが、qは立下りで動いている様に見える) 10進カウンターの内部構造 ソース概要 ・内部変数TQが0から始まり、+1していき10回数えたら0から桁上がりの変数cを1にしてやりなおし。 ・計算中の内部変数TQで7SEG LEDを駆動させるためのアウトプットqがある。 ・リセットは0の時リセットされる。 VHDLのソースを載せます。 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; entity COUNT10 is port(RESET,CLK : in std_logic; Q: out std_logic_vector(3 downto 0); C: out std_logic ); end COUNT10; architecture RTL of COUNT10 is signal TQ : std_logic_vector(3 downto 0); begin process (RESET,CLK ) begin if(RESET='0') then TQ <= "0000"; C<='0'; elsif(CLK 'event and CLK ='1') then if(TQ="1001") then TQ <= "0000"; C <='1'; elsif(TQ="0000") then C <='0'; TQ <= TQ + '1'; else TQ <= TQ + '1'; end if; end if; Q<=TQ; end process; end RTL; シミュレーション結果 クロックを数え上げた内部変数TQがqへ値を渡す仕組みになっています。 これがたち下がりの時に行われている様に見える。