ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
Main Menu
Tweet
Facebook
Line
:-?
フラット表示 前のトピック | 次のトピック
投稿者 スレッド
webadm
投稿日時: 2008-9-19 5:14
Webmaster
登録日: 2004-11-7
居住地:
投稿: 3088
RTL: CLOCK DIVIDER
次ぎはCLOCK DIVIDERブロックのRTL設計。



最も単純だが、FPGAやCPLDで水晶発振子を直接駆動する発信回路というのだけがくせ者である。ディスクリート回路ではバッファ無しのインバーターがひとつあればいいのだが、FPGAやCPLDで単純に外部からの入力を論理反転して出力するだけの記述だと、配置配線によって不確定数のバッファが挿入されることになる。

一応デバイスベンダー固有のIOプリミティブを使用することによって入出力ピンに直接接続されているIOブロック内のインバーターを使うことは可能だがうまく発振してくれるかは保証の限りではない。

うまくいかない場合には、外付けのディスクリートのインバーター回路を設けてそれで発振をさせてその出力をXT1に入力するという手もある。

cd.v: CLOCK DIVIDERインプリメンテーション

module cd(ac, xt1, xt2, c3200hz, c800hz, c10hz, c1hz);

// Input Port(s)
input ac, xt1;

// Output Port(s)
output xt2, c3200hz, c800hz;
output reg c10hz, c1hz;

// Inout Port(s)

// Parameter Declaration(s)

// Additional Module Item(s)
reg [9:0] div1024;
reg [1:0] div4;
reg [3:0] div16;
reg [2:0] div5;
reg [3:0] div10;

assign c3200hz = div1024[9];
assign c800hz = div4[1];
assign xt2 = ~xt1;

always@(posedge xt2 or negedge ac)
begin
if(!ac)
div1024 <= 0;
else if(xt2)
div1024 <= div1024 + 1'b1;
end

always@(posedge c3200hz or negedge ac)
begin
if(!ac)
div4 <= 0;
else if(c3200hz)
div4 <= div4 + 1'b1;
end

always@(posedge c800hz or negedge ac)
begin
if(!ac)
div16 <= 0;
else if(c800hz)
div16 <= div16 + 1'b1;
end

always@(posedge div16[3] or negedge ac)
begin
if(!ac)
begin
div5 <= 0;
c10hz <= 0;
end
else if(div16[3])
begin
if(div5 == 6'd5)
begin
c10hz <= ~c10hz;
div5 <= 0;
end
else
begin
div5 <= div5 + 1'b1;
end
end
end

always@(posedge c10hz or negedge ac)
begin
if(!ac)
begin
div10 <= 0;
c1hz <= 0;
end
else if(c10hz)
if(div10 == 4'd5)
begin
c1hz <= ~c1hz;
div10 <= 10;
end
else
begin
div10 <= div10 + 1'b1;
end
end

endmodule


コンパイルした結果のネットリストは以下の通り。ちょっと見た目は違うけどバイナリで分周する部分はカスケードになっているし、どうしても2カ所5分周が必要になるのでそれも期待通り。もっとエレガントで綺麗な記述方法があるかもしれない。


フラット表示 前のトピック | 次のトピック

題名 投稿者 日時
   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)
サイト内検索