• ベストアンサー

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

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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

回答が無いようなのでHDLはよく知らないのですが参考になりそうなページを貼っておきます。 http://fenrir.naruoka.org/archives/000701.html 原因は両エッジを検出できるようなフリップフロップが普通のFPGAには無いことのようですが、解決策はよく分かりません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 「入門Verilog HDL記述」 の 一例について

    「入門Verilog HDL記述」を読みながらVerilog を勉強中なのですが、周りに聞ける人がいないので、質問させてください。 (ちなみに VHDL は習得しているつもりです。) いろいろ疑問点があるので、分けて何点か質問させていただきました。 改訂版 入門Verilog HDL記述の240ページのリスト II.5に generate ブロックと if 分についての以下のようなコードがありますが、 これは期待通りには動かないと思うのですが。。。 module sel2to1_2( input sel, input [3:0] d0, d1, output [3:0] dout ); parameter sel_type = 1; generate if(sel_type == 1) begin: sel_always reg [3:0] dout; always @* begin if(sel) dout <= d1; else dout <= d0; end end else if(sel_type == 2) begin: sel_cond wire [3:0] dout; assign dout = (sel == 1) ? d1 : d0; end endgenerate endmodule ModelSimでシミュレーションしてみましたが、generate文の中の reg [3:0] dout は generate 文の中のスコープでのみ定義されているらしく、 output [3:0] dout とは別の信号らしいです。よってoutputには何も代入されず。 試しに、xilinx の ISE でコンパイルしてみたが、やっぱり output には なにも接続されず、セレクタなんて生成されませんでした。 そもそも module sel2to1_2( input sel, input [3:0] d0, d1, output [3:0] dout ); reg [3:0] dout; みたいに書くと、2回宣言されているとなってエラーになります。 よって、参照ソースコードみたいに reg と wire を切り替えるような書き方はそもそもできないのでは? 皆さんどう思われますか? (インデントがうまくいかず、読みづらくてすいません。)

  • FPGAを独学で学ぶ方法

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

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

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

  • FPGAのI/Oを独学で使えるようになりたい

    お世話になります。 FPGAを独習しています。 開発環境はXilinxのISE、言語はverilog-HDLを使用しています。 Spartan3、Spartan3Eボードを所有しており、ボードに乗っている簡単な回路を書くことができるようになり、LEDや7セグを使って1秒時計のような簡単な遊び程度はできるようにはなりました。 http://www.youtube.com/watch?v=PFHpAHNxu_Q ↑ こんなのはできるようになった。 今後、キーボードから入力させたり、外部接続のディスプレイに文字を表示させたり、スピーカーをつないで音を鳴らせたりしたいです。 しかし、どうやって勉強していったらよいか、皆目見当つきません。本屋に足を運んで参考になりそうな本を探しましたが、見当たりませんでした。 http://www.youtube.com/watch?v=bcm7S6SKbCI&feature=related や http://www.youtube.com/watch?v=GV_nOtHPQ9Q&feature=related なことをできるようになるには、どのような教材を使って勉強すればよいでしょうか? 周囲にアドバイスをもらえそうな人がいないので、ここで質問させて頂きます。 どんなアドバイスでも構いません! よろしくお願いします! 将来は、FPGAでファミコンを設計できるようになりたいです。

  • [verilog言語]画像圧縮、伸張について

    こんにちは こちらに質問を投稿することが間違いであった場合は申し訳ありません。 現在画像(JPEG)処理系の勉強を行おうと考えているのですが、如何せんどの様に学習すればいいのがわからず、悩んでおります。 実際に設計する際にどのような考えや発想で考えていけばいいのかイメージがあまりついておりません。 使用言語はverilog-HDL 現在自宅で学習中なので無料版のModelSimのみ仕様可能なツールです。 今考えているものはJPEGの勧告書を読むくらいしか思いついていないので、学習方法についてアドバイスの程をよろしく御願いします。 また、単純なJPEG画像の圧縮、伸張のサンプルRTLやその概念の解説が記載されている書物やHPなどがありましたら教えてください。

  • FPGAで出力のタイミングを合わせる方法

    現在FPGAを使用しております。使用しているFPGAは以下のものです。 ■会社名 xilinx ■デバイス名 spartan6 現在、データ60本の出力と同時にクロックも出力しています。 ここで、以下のことを行いたいと考えております。 ・データバススキューが最大500ps存在するが300psに抑えたい。 ・クロックをデータに比べて400ps遅延させたい。 何か良い方法をご存じの方は教えていただけると幸いです。 現状、私が行ったアプローチとしては、クロックにディレイバッファを挟んでみたのですが、 一番ディレイが少ない設定にしても、1ns程遅延が発生してしまいました。 また、基板がもう作られているために、ピン配置を変更することはできません。 60本のデータバスに関しては、PAD近くに最終段のフリップフロップを挟んで、叩くように設定してあります。

  • Verilog HDL

    僕は「Verilog HDL」を勉強中です。 そこで、シミュレーションや論理合成をしてみたいのですが、 フリーウェアで、そういうソフトってありますか? また、あるならば、どこで手に入りますか?

  • 周波数変化の検出で質問です。

    周波数変化の検出で質問です。 100kHz程度の発振周波数が前後5.0%程度変動します。 この変動を増幅して手軽な回路で検出する 方法は何かありますでしょうか。 最終的に変動幅が必要なためその絶対値は重要ではありません。 現在はマイコン等で20ナノSのクロックでその変動を測定して いますが1usの変化が50カウント程度にしかならないので10倍以上の 変化が得られることが理想です。

  • Verilog-HDLでの記述方法

    Verilog-HDLで回路を記述しているのですが、疑問点があるので質問させていただきます。 回路記述はおおまかに以下のようなものです。 module Adder(A, B, S, C); input [3:0] A; input [3:0] B; output [3:0] S; output C; 4ビット加算器のインスタンス(.A(A), .B(B), .S(S), .C(C)); endmodule この回路への入力は上位モジュールから与えられるとします。 このような回路記述をしていたとして、たとえば入力線Aの特定のビットが常に0になってしまう故障を記述したいとき wire err = 1'b0; assign A[0] = err; という記述を追加してみたのですが、どうもA[0]には不定値が入り込んでいるようです。 このような記述ではA[0]を常に0にすることはできないのでしょうか?またこのような故障を仮定したい場合はどのように記述すべきなのでしょうか?

  • Verilog-HDLによる設計において

    現在Z8085のCPUを設計しており、テンポラリレジスタにラッチする部分でなかなか上手くいきませんので質問させていただきます。 always文を使用したステートマシンにより制御しようとしているのですが次のようなWarningが出ます。 Warning: Latch IR[0]$latch has unsafe behavior Warning: Latch IR[1]$latch has unsafe behavior            : Warning: Latch IR[7]$latch has unsafe behavior Warning: Latch TMP1[0]$latch has unsafe behavior Warning: Latch TMP1[1]$latch has unsafe behavior            : Warning: Latch TMP1[7]$latch has unsafe behavior Warning: Latch TMP2[0]$latch has unsafe behavior Warning: Latch TMP2[1]$latch has unsafe behavior            : Warning: Latch TMP2[7]$latch has unsafe behavior Warning: Latch NEXT_STATE[0]$latch has unsafe behavior Warning: Latch NEXT_STATE[1]$latch has unsafe behavior <ソース> module CPU_TMP( CLK, nRST, FROM_DCD, IR, TMP1, TMP2, STATE, NEXT_STATE ); input CLK;//クロック input nRST;//リセット input [7:0] FROM_DCD;//入力命令 output [7:0] IR;//命令レジスタ output [7:0] TMP1;//テンポラリレジスタ1 output [7:0] TMP2;//テンポラリレジスタ2 output [1:0] STATE;//現在のステート output [1:0] NEXT_STATE;//次のステート reg [7:0] IR; reg [7:0] TMP1; reg [7:0] TMP2; reg [1:0] STATE; reg [1:0] NEXT_STATE; //状態 parameter S0 = 2'b00; parameter S1 = 2'b01; parameter S2 = 2'b10; parameter SD = 2'b11; //命令 parameter INRA = 8'h11; parameter MVIA = 8'h22; parameter JMP = 8'h33; always @( posedge CLK ) begin     if( nRST == 0 )       STATE <= SD;     else       STATE <= NEXT_STATE; end always @( STATE ) begin    case( STATE )      SD : begin            IR <= 0;            TMP1 <= 0;            TMP2 <= 0;            NEXT_STATE <= S0;          end      S0 : begin            IR <= FROM_DCD;            case( FROM_DCD )              INRA : NEXT_STATE <= S0;              MVIA : NEXT_STATE <= S1;              JMP : NEXT_STATE <= S2;            endcase          end      S1 : begin              TMP1 <= FROM_DCD;              NEXT_STATE <= S0;          end      S2 : begin              TMP2 <= FROM_DCD;              NEXT_STATE <= S0;          end endcase end endmodule どのようにしたらこのWarningを消すことができるでしょうか。