(タイトル)

概要

(詳細記述予定)

動作確認

ツール バージョン 結果
NC-Verilog 未確認
VCS-MX 未確認
ModelSim 未確認
Cver 未確認

テストコード

(概要を記述予定)
(実行方法を記述予定)
カウンタの使われ方によってはカウンタをM系列の周期性を利用する回路にしちゃうと
か。
条件がさっぱり意味不明になってコードの読みやすさは最悪かもしれないけど、軽いか
も。


【エッジ検出】
下段の立ち下がりエッジ検出で反転、それ以外でホールド。
でもこれだとクリティカルパスが改善されてない気がするので、だめか?
ALL1からALL0にいく瞬間がクリティカルパスな筈

 always@(posedge CLK or negedge RST)begin
   if(!RST)begin
     r_cnt <= 0;
   end else begin
     if(w_cnt_clr)begin
       r_cnt <= 0;
     end else begin
       r_cnt <= w_cnt;
     end
   end
 end
 assign w_cnt[0] =~r_cnt[0];
 assign w_cnt[1] = r_cnt[0] & ~w_cnt[0] ? ~r_cnt[1] : r_cnt[1];
 assign w_cnt[2] = r_cnt[1] & ~w_cnt[1] ? ~r_cnt[2] : r_cnt[2];
 assign w_cnt[3] = r_cnt[2] & ~w_cnt[2] ? ~r_cnt[3] : r_cnt[3];
 assign w_cnt[4] = r_cnt[3] & ~w_cnt[3] ? ~r_cnt[4] : r_cnt[4];
 assign w_cnt[5] = r_cnt[4] & ~w_cnt[4] ? ~r_cnt[5] : r_cnt[5];
 assign w_cnt[6] = r_cnt[5] & ~w_cnt[5] ? ~r_cnt[6] : r_cnt[6];
 assign w_cnt[7] = r_cnt[6] & ~w_cnt[6] ? ~r_cnt[7] : r_cnt[7];

【NAND+NOT】
ifのところにn入力NANDを期待。
NAND,NORはTr.数が少ない→高速 、てことで。

 always@(posedge CLK or negedge RST)begin
   if(!RST)begin
     r_cnt <= 0;
   end else begin
     if(w_cnt_clr)begin
       r_cnt <= 0;
     end else begin
                       r_cnt[0] <= w_cnt[0];
       if(!w_cnt[  0]) r_cnt[1] <= w_cnt[1];
       if(!w_cnt[1:0]) r_cnt[2] <= w_cnt[2];
       if(!w_cnt[2:0]) r_cnt[3] <= w_cnt[3];
       if(!w_cnt[3:0]) r_cnt[4] <= w_cnt[4];
       if(!w_cnt[4:0]) r_cnt[5] <= w_cnt[5];
       if(!w_cnt[5:0]) r_cnt[6] <= w_cnt[6];
       if(!w_cnt[6:0]) r_cnt[7] <= w_cnt[7];
     end
   end
 end
 assign w_cnt = ~r_cnt;

【最強最速カウンタ】
  • 組み合わせ回路なし!よってプロセスでの最高性能をお約束。
 ただしFPGAはLUTなので恩恵は薄いかも。
  • ネタです

always@(posedge CLK or negedge RESETN)begin
 if(RESETN==1'b1)begin
   r_cnt0[  1:0] <= #P_DELAY {{  1{1'b1}},{  1{1'b0}}};
   r_cnt1[  3:0] <= #P_DELAY {{  2{1'b1}},{  2{1'b0}}};
   r_cnt2[  7:0] <= #P_DELAY {{  4{1'b1}},{  4{1'b0}}};
   r_cnt3[ 15:0] <= #P_DELAY {{  8{1'b1}},{  8{1'b0}}};
   r_cnt4[ 31:0] <= #P_DELAY {{ 16{1'b1}},{ 16{1'b0}}};
   r_cnt5[ 63:0] <= #P_DELAY {{ 32{1'b1}},{ 32{1'b0}}};
   r_cnt6[127:0] <= #P_DELAY {{ 64{1'b1}},{ 64{1'b0}}};
   r_cnt7[255:0] <= #P_DELAY {{128{1'b1}},{128{1'b0}}};
 end
 else begin
   if(w_cnt_clr == 1'b1)begin
     r_cnt0[  1:0] <= #P_DELAY {{  1{1'b1}},{  1{1'b0}}};
     r_cnt1[  3:0] <= #P_DELAY {{  2{1'b1}},{  2{1'b0}}};
     r_cnt2[  7:0] <= #P_DELAY {{  4{1'b1}},{  4{1'b0}}};
     r_cnt3[ 15:0] <= #P_DELAY {{  8{1'b1}},{  8{1'b0}}};
     r_cnt4[ 31:0] <= #P_DELAY {{ 16{1'b1}},{ 16{1'b0}}};
     r_cnt5[ 63:0] <= #P_DELAY {{ 32{1'b1}},{ 32{1'b0}}};
     r_cnt6[127:0] <= #P_DELAY {{ 64{1'b1}},{ 64{1'b0}}};
     r_cnt7[255:0] <= #P_DELAY {{128{1'b1}},{128{1'b0}}};
   end
   else begin
     r_cnt0[  1:0] <= #P_DELAY {r_cnt0[0],r_cnt0[  1:1]};
     r_cnt1[  3:0] <= #P_DELAY {r_cnt1[0],r_cnt1[  3:1]};
     r_cnt2[  7:0] <= #P_DELAY {r_cnt2[0],r_cnt2[  7:1]};
     r_cnt3[ 15:0] <= #P_DELAY {r_cnt3[0],r_cnt3[ 15:1]};
     r_cnt4[ 31:0] <= #P_DELAY {r_cnt4[0],r_cnt4[ 31:1]};
     r_cnt5[ 63:0] <= #P_DELAY {r_cnt5[0],r_cnt5[ 63:1]};
     r_cnt6[127:0] <= #P_DELAY {r_cnt6[0],r_cnt6[127:1]};
     r_cnt7[255:0] <= #P_DELAY {r_cnt7[0],r_cnt7[255:1]};
   end
 end
end

assign w_cnt[7:0] = { r_cnt7[0]
                   , r_cnt6[0]
                   , r_cnt5[0]
                   , r_cnt4[0]
                   , r_cnt3[0]
                   , r_cnt2[0]
                   , r_cnt1[0]
                   , r_cnt0[0]
                   };

パタン1

(パタン内容を記述予定)
initial begin
  //verilogテストパタン1
end
 


(実行結果1)

ソースコード


ファイル1

(verilogソースコード1)
 
(概要を記述予定)

ファイル2

(verilogソースコード2)
 
(概要を記述予定)


Top > 言語 > verilog > Tips > カウンタ
link_pdfプラグインはご利用いただけなくなりました。























-

最終更新:2008年12月12日 21:58