SSブログ

PSoC 3 で RS フリップフロップを作ろう [PSoC]このエントリーを含むはてなブックマーク#

RS フリップフロップ

ひょんなことから、 Verilog HDL で RS フリップフロップを記述してみました。

記事を書くのは、久しぶりだね。 ちゃんと、書けるかな。

Verilog で RS フリップフロップを書きたい

Twitter で、「 Verilog で書いた RS フリップフロップが、うまく合成できない。」という声があがりました。 非同期順序回路を論理合成するのは、苦労ばかり多いのですが、試しに挑戦してみます。 使用する論理合成ツールは、大人の事情により、 PSoC Creator です。

ゲートで書いてみた

ゲートで書いた RS-FF

お題は、 Verilog の HDL で記述することだったのですが、まずは、 RS フリップフロップをゲートで書いて、どんな回路が合成されるのかを確認してみました。 ハードウェアには、 CY8CKIT-030 を使用しています。 二つのタクトスイッチを入力に、二つの LED を出力にしています。

合成中に以下のような警告が表示されました。


Warning-1361: The design contins a combinational loop. Check the design for unintentional latches. Breaking the loop at QB/main_2 --> QB/q

The static timing analyzer reported a warning. See the warning message for details. Additional information may be available in the timing report file.

これは、組み合わせ回路にループが存在するから、意図しないラッチが合成されるかも知れない、という警告です。 今回は、 RS-FF というラッチを合成するために書いたのですから、もちろん「意図しない」というわけではありません。 論理合成ツールは、ループが存在するままでは、タイミング制約を解決することができません。 そのため、勝手にループを切って処理してくれたようです。

合成後のゲート記述

合成された回路は、 Look Up Table (LUT) で実装され、その論理式は RPT ファイルにレポートされます。 この論理式を Programmable Logic Array (PLA) 形式に書き起こすと、このような回路になっています。 もとの回路からみると、かなり無駄に見えますが、論理積項数 (product term: pterm) は、 2 で収まっているので、良い合成結果と言えるでしょう。

HDL で書いてみた

Verilog で書いた RS-FF

では、本題に戻って、 Verilog HDL で RS フリップフロップを記述してみます。 最上位の回路図は、こんな風になっています。 箱の中身は、 Verilog で記述されています。



//`#start header` -- edit after this line, do not edit this line
// ========================================
//
// Copyright noritan.org, 2012
// All Rights Reserved
// UNPUBLISHED, LICENSED SOFTWARE.
//
// CONFIDENTIAL AND PROPRIETARY INFORMATION
// WHICH IS THE PROPERTY OF NORITAN.ORG.
//
// ========================================
`include "cypress.v"
//`#end` -- edit above this line, do not edit this line
module RSFF (
	q,
	qb,
	rb,
	sb
);

//`#start body` -- edit after this line, do not edit this line

    output  q;
    output  qb;
    input   rb;
    input   sb;
    reg     q;
    reg     qb;
    
    always @(rb or sb or q or qb) begin
        casez ({rb,sb})
            2'b01:      {q,qb} = 2'b01;     // Reset
            2'b10:      {q,qb} = 2'b10;     // Set
            2'b11:      {q,qb} = {q,qb};    // Hold
            2'b00:      {q,qb} = 2'b11;     // Prohibited
        endcase
    end

//`#end` -- edit above this line, do not edit this line
endmodule
//`#start footer` -- edit after this line, do not edit this line
//`#end` -- edit above this line, do not edit this line

端子名を大文字で書くと、定数と認識されてしまったので、小文字で書きました。 動作記述のキーになっている部分は、 casez 構文です。 入力 rbsb の値によって、 RS-FF の動作が変わります。

動作のうち、 Reset と Set は、わかりやすいので説明は不要でしょう。 Hold の場合には、出力 qqb の値をフィードバックします。 このため、 always のリストには、 q および qb も追加してあります。 Prohibited は、通常の RS-FF では使用不可の組み合わせです。 この回路では、 NAND を使った場合の動作に合わせて、 q および qb の双方が 1 になるとしました。

論理合成すると、やはり、組み合わせ回路がループしている旨の警告が表示されます。 しかも、今回は2か所の警告が出てきます。 ループが二つできているということですが、二つもループがありましたっけ?

合成後の HDL 記述

論理合成した結果、こうなりました。 ありゃ? なんだか余分な回路が付いていますね。 どうやら、 QQB に対して、個別にラッチを合成してくれたようです。

この回路、ラッチが二つあるために、問題が発生する可能性があります。 それは、二つのラッチが独立しているために、別々の状態をとることがあるということです。 電源投入直後は、電源の立ち上がり方によって、初期状態が異なってきます。 また、 rbsb がほぼ同時に立ち上がる場合には、内部遅延の差によって、二つのラッチの動作が異なってくる可能性があります。

いずれにしても、これでは、 RS フリップフロップとしては使えないと考えられます。

本日の結論

Verilog HDL で記述した RS フリップフロップを PSoC Creator に合成させてみましたが、ラッチが二つ合成されてしまいました。 このままでは、実際の RS フリップフロップと同じ動作にはなりません。 やはり、ゲートで記述するか、別のロジックで実現するか、考えたほうがよさそうです。

関連文献


nice!(0)  コメント(2)  トラックバック(0)  このエントリーを含むはてなブックマーク#

nice! 0

コメント 2

すん

はじめまして
PSoC3最近始めました。
Verilogも少しやったことがあるので
興味のある話で読ませていただきました。

レジスタを使わない書き方がないかと
ネットで検索していたら以下の
ようなコードを発見してました。

ネットリストの見方がいまいち正しく
理解できてないので、確認してもらえると嬉しいです。

module RSFF(
q,
qb,
rb,
sb
);
output q;
output qb;
input rb;
input sb;

assign qb = ~( sb & q );
assign q = ~( rb & qb );

endmodule
by すん (2012-05-03 16:47) 

すん

式を間違えました。すみません。

assign qb = ~( rb & q );
assign q = ~( sb & qb );
by すん (2012-05-03 17:06) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

トラックバックの受付は締め切りました

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。