フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
webadm | 投稿日時: 2008-9-22 10:27 |
Webmaster 登録日: 2004-11-7 居住地: 投稿: 3088 |
RTL: CLOCK TIMER CLOCK TIMERブロックはおそらく一番ロジックの規模が多い部分。概略の検討は食事の合間に検討を続けメモ帳に書き留めて頭にものこっていたので気がついたらそのままQuartusを立ち上げてコードを入力していた。その時にいくつか細かな検討漏れが発覚し、やはりちゃんと内部ブロック図を描く必要があると反省。
概略を検討した時に漏れていたのは、FREQUENCY COUNTERの時は10進数でカウントすればよかったがCLOCK TIMERは60進数と12進数それに2進数を使い分けなければならないので10進数以外に2進数、6進数と12進数をサポートするように同期BCDカウンタを拡張する必要がある点と、どうしても分と時の調整のために1HZと10HZのクロックを切り替える必要からゲーテドクロック回路になってしまうがクロック選択切り替わりのタイミングをC10HZの立ち下がりに同期させないとヒゲが出て余分に更新されてしまう点。 しかし描いてみるとかなり規模が大きい。CPLDに入るのか心配になってきたが、最悪はCLOCK TIMERブロック無しで周波数表示のみでも構わないことにしよう。 bin2bcd.v: バイナリBCDデコーダー module bin2bcd(bin, bcdout); // Input Port(s) input [3:0] bin; // Output Port(s) output reg [7:0] bcdout; always@(*) case(bin) 4'h0: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'h1: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'h2: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'h3: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'h4: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'h5: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'h6: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'h7: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'h8: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'h9: begin bcdout[3:0] = bin; bcdout[7:4] = 4'h0; end 4'ha: begin bcdout[3:0] = 4'h0; bcdout[7:4] = 4'h1; end 4'hb: begin bcdout[3:0] = 4'h1; bcdout[7:4] = 4'h1; end default: begin bcdout[3:0] = 4'hf; bcdout[7:4] = 4'hf; end endcase endmodule ct.v: CLOCK TIMERモジュールRTLインプリメンテーション module ct(ac, cs, timmadj, timhadj, c10hz, c1hz, clcounter, ontimer, offtimer, sleeptimer, oncmpout, offcmpout, sleepout); // Input Port(s) input ac, timmadj, timhadj, c10hz, c1hz; input [2:0] cs; // Output Port(s) output oncmpout, offcmpout, sleepout; output [16:0] clcounter, ontimer, offtimer, sleeptimer; // Inout Port(s) // Parameter Declaration(s) // Additional Module Item(s) wire [20:0] clout; wire [12:0] onout, offout; wire clrst, onrst, offrst, slprst; wire clsel, onsel, offsel, slpsel; wire rst, madj, hadj; wire clmclk, clhclk, onmclk, onhclk, offmclk, offhclk, slpmclk; wire clmci, clhci, onmci, onhci, offmci, offhci, slpmci; wire cls1co, cls10co, clm1co, clm10co, clhco, clpmco; wire onm1co, onm10co, onhco, onpmco; wire offm1co, offm10co, offhco, offpmco; assign rst = (timmadj && timhadj); assign madj = (timmadj && !timhadj); assign hadj = (!timmadj && timhadj); assign clsel = (cs == 3'b111)?1'b1:1'b0; assign onsel = (cs == 3'b101)?1'b1:1'b0; assign offsel = (cs == 3'b100)?1'b1:1'b0; assign clrst = !ac || (clsel && rst); assign onrst = !ac || (onsel && rst); assign offrst = !ac || (offsel && rst); assign clmclk = (clsel && madj)?c10hz:c1hz; assign clhclk = (clsel && hadj)?c10hz:c1hz; assign onmclk = (onsel && madj)?c10hz:c1hz; assign onhclk = (onsel && hadj)?c10hz:c1hz; assign offmclk = (offsel && madj)?c10hz:c1hz; assign offhclk = (offsel && hadj)?c10hz:c1hz; assign clmci = (clsel && madj)?1'b1:cls10co; assign clhci = (clsel && hadj)?1'b1:clm10co; assign onmci = (onsel && madj)?1'b1:cls10co; assign onhci = (onsel && hadj)?1'b1:onm10co; assign offmci = (offsel && madj)?1'b1:cls10co; assign offhci = (offsel && hadj)?1'b1:offm10co; sbuc #(4, 9) cls1(c1hz, 1'b1, clrst, 4'h0, clout[3:0], cls1co); sbuc #(4, 5) cls10(c1hz, cls1co, clrst, 4'h0, clout[7:4], cls10co); sbuc #(4, 9) clm1(clmclk, clmci, clrst, 4'h0, clout[11:8], clm1co); sbuc #(4, 5) clm10(clmclk, clm1co, clrst, 4'h0, clout[15:12], clm10co); sbuc #(4, 11) clh(clhclk, clhci, clrst, 4'h1, clout[19:16], clhco); sbuc #(1, 1) clpm(clhclk, clhco, clrst, 1'b0, clout[20:20], clpmco); sbuc #(4, 9) onm1(onmclk, onmci, onrst, 4'h0, onout[3:0], onm1co); sbuc #(4, 5) onm10(onmclk, onm1co, onrst, 4'h0, onout[7:4], onm10co); sbuc #(4, 11) onlh(onhclk, onhci, onrst, 4'h0, onout[11:8], onhco); sbuc #(1, 1) onpm(onhclk, onhco, onrst, 1'b0, onout[12:12], onpmco); sbuc #(4, 9) offm1(offmclk, offmci, offrst, 4'h0, offout[3:0], offm1co); sbuc #(4, 5) offm10(offmclk, offm1co, offrst, 4'h0, offout[7:4], offm10co); sbuc #(4, 11) offlh(offhclk, offhci, offrst, 4'h0, offout[11:8], offhco); sbuc #(1, 1) offpm(offhclk, offhco, offrst, 1'b0, offout[12:12], offpmco); assign clcounter[7:0] = clout[15:8]; bin2bcd clbin2bcd(clout[19:16], clcounter[15:8]); assign clcounter[16:16] = clout[20:20]; assign ontimer[7:0] = onout[7:0]; bin2bcd onbin2bcd(onout[11:8], ontimer[15:8]); assign ontimer[16:16] = onout[12:12]; assign offtimer[7:0] = offout[7:0]; bin2bcd offbin2bcd(offout[11:8], offtimer[15:8]); assign offtimer[16:16] = offout[12:12]; assign oncmpout = (clout[19:8] == onout[11:0])?1'b1:1'b0; assign offcmpout = (clout[19:8] == offout[11:0])?1'b1:1'b0; endmodule よく考えたらスリープタイマーは減算カウンタでないといけないのでSLEEPタイマーは実装しなかった。 実際には組み合わせ論理の一部が2ページにまたがっているが、主要な1ページ目だけで十分大きな規模だということがわかる。 だんだんと無謀で無駄なプロジェクトの様相を帯びてきた。周波数カウンタだけだったらPICで組んだ方がまったくもって賢い選択である。しかしバカだけど最後までやり遂げよう。 |
フラット表示 | 前のトピック | 次のトピック |
投稿するにはまず登録を | |