ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
Main Menu
Tweet
Facebook
Line
:-?
フラット表示 前のトピック | 次のトピック
投稿者 スレッド
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で組んだ方がまったくもって賢い選択である。しかしバカだけど最後までやり遂げよう。
フラット表示 前のトピック | 次のトピック

題名 投稿者 日時
   Poorman's MSM5524 webadm 2008-8-12 11:11
     トップレベル webadm 2008-8-13 5:51
     FREQUENCY COUNTERブロック webadm 2008-8-14 20:05
     CLOCK DIVIDERブロック webadm 2008-9-8 10:54
     CONTROLブロック webadm 2008-9-14 23:10
     CLOCK TIMERブロック webadm 2008-9-16 5:20
     DISPLAYブロック webadm 2008-9-17 10:16
     RTLスケルトン入力 webadm 2008-9-18 13:18
     RTL: FREQUENCY COUNTER webadm 2008-9-18 22:49
     RTL: CLOCK DIVIDER webadm 2008-9-19 5:14
     RTL: CONTROL webadm 2008-9-19 8:56
   » RTL: CLOCK TIMER webadm 2008-9-22 10:27
     RTL: DISPLAY webadm 2008-9-23 8:56
     動作シミュレーション webadm 2008-9-24 3:36
       Re: 動作シミュレーション webadm 2008-9-24 5:08
         周波数カウンターモードのシミュレーション webadm 2008-9-24 5:41
           QuartusのState Machine Viewer webadm 2008-9-24 6:18
             どうやらバグではないようだ webadm 2008-9-24 7:17
             周波数カウント動作は出来た webadm 2008-9-24 9:10
               時計とタイマー関連 webadm 2008-9-25 20:06
     VFDドライバ回路 webadm 2008-9-26 7:47
       Re: VFDドライバ回路 webadm 2008-10-1 10:08
         Re: VFDドライバ回路 webadm 2008-10-5 23:29
           Re: VFDドライバ回路 webadm 2008-10-6 11:09
             Re: VFDドライバ回路 webadm 2011-2-23 0:50
     XILINX ISEでコンパイルしてみた webadm 2008-9-29 11:07
     CLOCK TIMERモジュール無しでコンパイルしてみた webadm 2008-10-5 11:56
       Re: CLOCK TIMERモジュール無しでコンパイルしてみた webadm 2008-10-5 12:37
     冬休みの課題にしよう webadm 2008-12-16 9:49
       主要部品が届いた webadm 2008-12-24 20:21
         OKI MSM5524RS入手 webadm 2011-1-4 22:55
           Re: OKI MSM5524RS入手 webadm 2011-1-10 5:06

投稿するにはまず登録を
 
ページ変換(Google Translation)
サイト内検索