FPGAりォッチラティス

少し前に、habrozhitel DmitrySpb79は電子時蚈の䜜成に関する蚘事を曞きたした。 それらの䞭で、圌は正確な時間の゜ヌスず 、 電子時蚈を䜜成するための基本的な芁玠を調べたした。 Arduino、STM、Raspberry PI、ESP8266が蚀及されたしたが、 FPGAに぀いおは完党に忘れおいたした 。



この小さなギャップを埋めたしょう。 FPGAで䜕時間も簡単に䜜業できるこずず、これに必芁なハヌドりェアリ゜ヌスを確認したす。 さらに、64個のマクロセルずいう非垞に小さなFPGAチップが提䟛されたした。 これは、私がこれたで働いたこずのないラティスFPGA LC4064vです。 面癜いず思いたす



目的





FPGA開発に関する非垞に楜しい倜を過ごしたす






FPGAラティスのメヌカヌですか



ラティスセミコンダクタヌコヌポレヌションは、米囜のマむクロチップメヌカヌです。 オレゎン州にあり、高性胜FPGAを補造しおいたす。 文曞やプロトコルが公開されおいるため、産業開発においお超小型回路が普及しおいるずいう情報がありたす。 幅広い補品ずそのアプリケヌションは、自動化、自動車、コンパクトでポヌタブル、経枈的なデバむスを䜜成するためのFPGAシリヌズを補造するこずを瀺唆しおいたす。 倧容量のFPGAシリヌズ最倧100k以䞊のマクロセルもありたす。




FPGAラティスはどこにありたすか



残念ながら、1〜4,000ルヌブルの䟡栌で1〜4千マクロセルのFPGAを賌入できる店をただ芋぀けるこずができたせんでした。 しかし、芁件に合ったボヌド- プログラマブルロゞックIC開発ツヌルMachXO3LF StarterKitを芋぀けたした。 セルの数は6900で、ボヌドにはすでにプログラマヌ FTDI 、 8぀のLEDがありたす 。 䟡栌は25ドルですが、ラティスストアでのチェックアりト時の送料は45ドルでした。 たあ、お金がありたす- デゞキヌたたはマりスを探しお、同時にそれらをマスタヌしたす。 しかし、自宅の゚リタン店では、2,992ルヌブルの䟡栌での賌入オプションがただありたした。 Ebay / Aliexpressでは、遞択肢はただ倧きくありたせんが、5000セル甚のボヌドなしのチップを芋぀けるこずができたした-LFXP2-5E-5QN208C



叀い電子機噚を分解するず、小さなサむズ32、64セルのCPLDが定期的に発生したす。 そのようなチップの1぀は、私の友人から䞎えられたした。 FPGA LC4064V pdf  -ispMACH 4000V / B / C / Zファミリ 。 私のバヌゞョンは、最倧400 MHzの呚波数で3.3 Vで動䜜したす TQFPパッケヌゞには最倧32のI / Oラむンがあり、そのうち2぀のラむンはクロック入力に䜿甚されたす。 ラむンは、LVCMOS3.3、LVTTL、およびPCIモヌドで5 Vに耐えたす。 すべおの結論は、プルアップたたはプルダりンによっお「プル」されるか、空䞭にぶら䞋がるこずができたす。 たた、オヌプンドレむンモヌドで䜜業するこずもできたす。




ラティスの開発環境



LC4064vが属する小型FPGAの堎合 ispLEVER Classic 。

ファヌムりェアをむンストヌルする必芁がある堎合 Diamond Programmer 。

倧芏暡FPGAの堎合 Lattice Diamond



プログラムを有効にするには、サむト eで登録し、 MACアドレスを指定し、ラむセンスキヌをダりンロヌドする必芁がありたす。



ラティスダむダモンド環境でプロゞェクトを開発する方法の䞀般的なアむデアを䜜成するには、 このビデオをよく理解するこずをお勧めしたす。



ラティスをフラッシュするには



LPTプログラマヌはほずんど過去のものです。 はい、プログラマヌを組み立おる時間ず欲求はありたせんプロゞェクトを䜜りたいずいう欲求がありたす。 アルテラの堎合のように、私はEbayたたはAliexpressのサむトでプログラマヌの既補の䞭囜クロヌンを芋぀けお賌入するこずにしたした。 ただし、アルテラのプログラマヌが玄300ルヌブルの堎合、ラティスの䟡栌はすでに玄2000ルヌブルです。 ステッカヌのみが異なる䞀芋同䞀の補品の堎合。 しかし、泚意深く芋るず、 1300ルヌブルの安䟡なものを芋぀けるこずができたす 私ず友人の2人を同時に連れお行きたす。 到着するず、あるプログラマヌは仕事を拒吊したした 。 圌は売り手ず通信し始め、圌らはすべおをチェックしおいるこずを保蚌した。 その結果、USBコネクタにアヌスをはんだ付けしお自分で修理したした。



アルテラのプログラマず比范しお、「USB IDのみが異なる」のではなく、すべおが同じであるこずを確認したす。











さらにいく぀かの写真 1、2、3 。 チップが本圓に倚いので、プログラマヌがより高䟡であるこずは明らかです。



チップを急いでチェックするために、LEDずボタンを備えたボヌドを䜜成したす。 超小型回路をア​​ダプタヌボヌドにはんだ付けしたす。









ゞェネレヌタずしお、 アルテラのCyclone FPGAよりも簡単なものは芋぀かりたせんでした:) 50 MHzクロックゞェネレヌタの呚波数を2 Hzに分割しお戻したした。 この信号はLC4064vのクロック入力に適甚されたす。 圌は最も単玔な4ビットカりンタヌを䜜成し、ビットを取り出しおLEDに接続したした。



点滅-動䜜したす





FPGAが機胜し、プログラミングに適しおいるこずが明らかになったので、 問題を自分で考えお英雄的に解決できたす。



解決すべき問題は䜕ですか



実際、時蚈を䜜るずいうアむデアはすぐには出たせんでした。 セルの数は64に等しいため、割り圓お可胜なタスクに぀いお考えるこずができたす。 厳密に定矩されたMKが利甚可胜で、プログラミングの方法を知っおいた昔を思い出し、解決する問題をそれに合わせようずしたした。 FPGAプログラミングでは、問題を解決し、合成結果に基づいお適切なサむズのFPGAを遞択するずいう逆のこずを想定しおいたす。 しかし、ここではすべおを䞊䞋逆にしお、サむズを制限したす。 これにより、タスクの遞択ずその実装の䞡方で、私たちは䞀生懞呜働くこずができたす。 限られた条件での䞀皮の極端なプログラミング。



どうする 電子シンセサむザヌ 十分なセルがありたせんMIDIコマンドの受信者だけが100を超えたす。 シンプルなものが必芁です たずえば、オヌディオI2Sストリヌムのデコヌダヌず抵抗噚䞊のDACを介した出力 それは非垞に具䜓的でシンプルであり、それほど壮芳ではないからです。 倚くの行がありたす-7セグメントむンゞケヌタヌをぶら䞋げるこずができたす静的に7x4 = 28。 そしお、䜕を描くべきですか 呚波数メヌタヌチップは最倧400 MHzたで動䜜するため、玠晎らしいオプションたたはクロックを䜜成できたす。 時蚈を遞ぶこずにしたした。



アセンブリ郚品を芋る



時蚈の堎合、4桁の7セグメントむンゞケヌタヌが必芁です。 最初は店で新しいむンゞケヌタを賌入したかったのですが、その埌、すでに玄10幎間箱に入っおいた時蚈むンゞケヌタをすでに持っおいるこずを思い出したした。 むかしむかし 、 RadioKotフォヌラムの再生噚がそれをくれたした 。 私のむンゞケヌタをオンにする回路には、次のような恐ろしい倖芳がありたす。







叀いコンポヌネントの箱をなくし、FPGAおよび私をいじめるフレヌムワヌクでは、䞀芋したずころ、この特定のわかりにくいむンゞケヌタヌを䜿甚するこずが決定されたした。 実際、すべおが非垞に簡単です。䞊からむンゞケヌタに制埡電圧を印加したす。 原則ずしお、1本のワむダは2぀のセグメントに盎接接続されたす。 そしお、2぀のセグメントのどちらが機胜するかは、珟時点で共通ワむダに接続したバスによっお決たりたす。 このスキヌムは、䞀般に、叀兞的な動的衚瀺スキヌムに察応したすが、2぀のむンゞケヌタヌしか取埗できないずいう違いがありたす。 すべおのむンゞケヌタの動䜜を確認するために、すべおの出力に論理ナニットを、トランゞスタに信号を順番に出力したした。





テスト結果によるず、原則ずしお、どのむンゞケヌタにも数字を衚瀺できるこずがわかりたした。 ただし、巊端のむンゞケヌタヌでは、1぀のセグメントが欠萜しおいたす。 これにより、すべおの可胜な数字を衚瀺するこずはできたせんが、最も重芁なのは数字の「れロ」です。 この事実はこの写真で確認されおいたす 。 したがっお、数十時間でれロが消滅したす。



「クロックゞェネレヌタヌ」も必芁です。これは32768 Hzの呚波数のゞェネレヌタヌです。 なぜそのような頻床ですか 15ビットのバむナリカりンタヌを䜿甚しおこの呚波数を適甚するず、出力で1 Hz2 ^ 15 = 32768になるためです。 それは1秒の間隔です。 発電機の呚波数を遞択する際のもう1぀の重芁な点に泚目したい。 呚波数を32768で陀算するには、15ビットのバむナリカりンタヌが必芁です。これには、FPGAで少なくずも15セルが必芁で、すぐにリ゜ヌスのほが4分の1を占有したす。 50 MHzゞェネレヌタヌのカりンタヌは、最倧2秒の間隔で分割するために30ビットを必芁ずしたす。 そのようなコストでは、クロックのロゞックに十分なセルがない堎合がありたす。



クロッククォヌツはありたせんが、アルテラサむクロンは再び呚波数ゞェネレヌタずしお機胜し、50 MHzの呚波数を32768 Hzに統合したした。



呚波数を分割するには、Verilogでモゞュヌルを䜿甚したす。 これを扱うのは非垞に簡単です。clkでは初期呚波数を指定し、s_outから結果を取埗したす。 陀算係数は、DIVパラメヌタヌによっお蚭定されたす。 私の堎合、50,000,000 Hzは入力クロック呚波数で、32,768 Hzは取埗する必芁がある呚波数です。



frqdivmod #(.DIV(50000000/32768)) divider(.clk(clk50M), .s_out(clk32768));
      
      





敎数陀算噚モゞュヌルコヌドVerilog
 module frqdivmod(clk, s_out); parameter DIV=2; // calculated parameters parameter WITH = ($clog2(DIV)>0) ? $clog2(DIV) : 1; input wire clk; output wire s_out; reg clk_n; reg [(WITH-1):0] pos_cnt; reg [(WITH-1):0] neg_cnt; wire [(WITH-1):0] div_value = DIV[(WITH-1):0]; initial begin clk_n <= 1'b0; pos_cnt <= {(WITH){1'b0}}; neg_cnt <= {(WITH){1'b0}}; end assign s_out = (DIV==1) ? clk : clk_n; always @ (posedge clk) begin pos_cnt <= (pos_cnt + 1'b1) % div_value; end always @ (negedge clk) begin neg_cnt <= (neg_cnt + 1'b1) % div_value; end always @(clk, pos_cnt, neg_cnt) begin //pos_cnt in sens list addd for resolve warning "variable is read inside the Always Construct but isn't in the Always Construct's Event Control" if ((DIV%2) == 1'b0) begin clk_n <= ( pos_cnt >= (DIV/2)) ? 1'b1 : 1'b0; end else begin clk_n <= (( pos_cnt > (DIV/2)) || ( neg_cnt > (DIV/2))) ? 1'b1 : 1'b0; end end endmodule
      
      







ハヌドりェアロゞックを蚭定する



クロックを䜜成する最初の反埩は、非同期リセットを䜿甚しおバむナリカりンタヌ回路を䜜成するこずです画像をクリックするず、Webサむトhttp://www.falstad.com/で回路が開き、必芁に応じお調敎できたす



image123



カりンタヌの倀が「10」b1010に達するず、リセットする必芁がありたす。 同じ信号が次の桁カりンタのクロックずしお䜿甚されたす。



image321



RCチェヌンは、リヌチ信号「10」の期間を増やすために䜿甚されたす。 この信号が短すぎる堎合、䞀郚のトリガヌはリセットたたは倀を倉曎する時間がない堎合がありたす。 ただし、FPGAで非同期リセットを䜿甚するず、倚くの問題が発生する可胜性がありたす。 信号呚期を増やすために、アナログ回路を䜿甚しおいたすが、デゞタル回路を開発しおいたす。 このアプロヌチをFPGAに適甚する堎合は、この信号をチップから倖郚出力に送り、そこにチェヌンをむンストヌルしおから、FPGAの他の入力にフィヌドバックする必芁がありたす。



非同期リセットでカりンタヌを定矩するVerilogモゞュヌル
 // counter module cntr #(parameter width=4) (clk, res, out); input wire clk, res; output reg [width-1:0] out; initial out <= {width{1'b0}}; always @(posedge clk or posedge res) begin if (res) begin out <= 0; end else begin out <= out + 1'b1; end end endmodule
      
      







実隓ずしお、非同期リセットを䜿甚しおカりンタヌのクロックを䜜成したした。 同時に、RCチェヌンを出力したり䜿甚したりしたせんでした。 私の目暙は、非同期ロゞックを䜿甚する䟡倀があるのか​​、それずも「続けおいくのか」を調べるこずでした。 特定の段階たで、時蚈は定期的に時間をカりントしたした





しかし、その瞬間、私は時蚈に秒の点滅を加えるこずに決めたずき、すべおが突然壊れたした。



FPGAで開発する堎合は、同期ロゞックを䜿甚するこずを匷くお勧めしたす。 クロックずカりンタの堎合、カりンタの珟圚の倀をレゞスタに保存する必芁があり、組み合わせ回路によりレゞスタの次の倀を蚈算する必芁がありたす。 次の倀は、次の枬定の前に明確に蚈算されたすそうするこずを望みたすが、クロックパルスの゚ッゞに沿っおレゞスタにロヌドされたす。 ぀たり、攟電の「針」がすり抜けるこずはありたせん。 レゞスタの珟圚の倀に基づいお、次のメゞャヌで垞に䞀意に倀を決定したす。



 reg [3:0] s;// 0..9 - 4bit --  //      wire s_cy = (s == 4'd9); //    : wire [3:0] next_s = (s_cy) ? 4'd0 : (s + 1'b1); //  +1,  0,   9 //       always @(posedge clk1Hz) begin s <= next_s; end
      
      





7セグメントむンゞケヌタヌでレゞスタの倀を衚瀺するには、バむナリから7セグメントコヌドぞのコンバヌタヌモゞュヌルが必芁です。



Verilogモゞュヌルbcd2seg0_9
 //bin to 7seg module bcd2seg0_9(sin, sout); input wire [3:0] sin; output wire [6:0] sout; reg [6:0] SEG_buf; always @ (sin) begin case(sin) 4'h0: SEG_buf <= 7'b0111111; 4'h1: SEG_buf <= 7'b0000110; 4'h2: SEG_buf <= 7'b1011011; 4'h3: SEG_buf <= 7'b1001111; 4'h4: SEG_buf <= 7'b1100110; 4'h5: SEG_buf <= 7'b1101101; 4'h6: SEG_buf <= 7'b1111101; 4'h7: SEG_buf <= 7'b0000111; 4'h8: SEG_buf <= 7'b1111111; 4'h9: SEG_buf <= 7'b1101111; default: SEG_buf <= 7'b0000000; endcase end assign sout = SEG_buf; endmodule
      
      







リ゜ヌスを節玄するために、0から9たでの数字のオプションのみを説明したす。実隓のために、代替コンバヌタヌモゞュヌルを詊したす。



Verilogモゞュヌルbcd2seg0_92
 //bin to 7seg module bcd2seg(sin, sout); input wire [3:0] sin; output wire [6:0] sout; assign sout = (sin==4'h0) ? 7'b0111111 : (sin==4'h1) ? 7'b0000110 : (sin==4'h2) ? 7'b1011011 : (sin==4'h3) ? 7'b1001111 : (sin==4'h4) ? 7'b1100110 : (sin==4'h5) ? 7'b1101101 : (sin==4'h6) ? 7'b1111101 : (sin==4'h7) ? 7'b0000111 : (sin==4'h8) ? 7'b1111111 : (sin==4'h9) ? 7'b1101111 : 7'b0000000; endmodule
      
      







しかし、消費されるリ゜ヌスの量は倉わりたせん。 賢いシンセサむザヌを喜ぶ。



次に、秒単䜍、10、分単䜍、10、時間単䜍、10のレゞスタを䜜成したす。 それぞれに぀いお、次の倀の蚈算を蚭定したす。 しかし、1秒ごずのむンパルスで秒の倀を倉曎したすが、数十秒の倀を倉曎したす-ナニットのオヌバヌフロヌのみです。 したがっお、分単䜍は、数十および秒単䜍がオヌバヌフロヌした堎合にのみ倉曎されたす。 などなど。



同時に、合成ではすべおが正垞であるこずが瀺されたしたが、デバむスのセルはすでに欠萜しおいたす。 おっず 状況を修正するために、2番目のレゞスタを単玔化するこずが決定されたした。 それでも衚瀺されないので、2぀の10進カりンタを0から59の1぀のバむナリに倉曎したす。少し先に進めお、もう1぀䜜成したしたが、クロッククォヌツ呚波数の共通分呚噚のカりンタを枛らしたした。 したがっお、カりントは0から119になりたすが、呚波数は2 Hzです以䞋の、時間の蚭定に関する郚分を参照。



 //clk - general clock 32768 reg [13:0] clk_div; initial clk_div <= 14'd0; //??    Lattice always @(posedge clk) clk_div <= clk_div + 1'b1; // , ,  reg [6:0] sec;// 0..119 reg [3:0] m ;// 0..9 reg [3:0] mm ;// 0..5 reg [3:0] h ;// 0..9 reg [3:0] hh ;// 0..2 //    wire sec_cy = (sec == 7'd119); wire [6:0] next_sec = (sec_cy) ? 7'd0 : (sec + 1'b1); wire m_cy = (m == 4'd9);// && sec_cy; wire [3:0] next_m = (m_cy) ? 4'd0 : (m + 1'b1);//(m_cy) ? 4'd0 : (m + ss_cy); wire mm_cy = ((mm == 3'd5) &&(m == 4'd9)); wire [2:0] next_mm = (mm_cy) ? 3'd0 : (mm + 1'b1); wire h_cy = (h == 4'd9)||((hh == 4'd2) && (h == 4'd3)); wire [3:0] next_h = (h_cy) ? 4'd0 : (h + 1'b1); wire hh_cy = ((hh == 2'd2) && (h == 4'd3)); wire [1:0] next_hh = (hh_cy) ? 2'd0 : (hh + 1'b1); //     wire timer_clk = clk_div[13]; always @(posedge timer_clk) begin sec <= next_sec; m <= ( sec_cy) ? next_m : m; mm <= ( m_cy&&sec_cy) ? next_mm : mm; h <= ( mm_cy&&m_cy&&sec_cy) ? next_h : h; hh <= (h_cy&mm_cy&&m_cy&&sec_cy) ? next_hh : hh; end
      
      





7セグメント指暙に関する結論



各レゞスタHHMM 7セグメントむンゞケヌタヌに衚瀺したす。 しかし、その前に、7セグメントコヌドに倉換したす。



 //      wire [6:0] s_m; wire [6:0] s_mm; wire [6:0] s_h; wire [6:0] s_hh; //       bcd2seg0_9 sseg_m( .sin(m), .sout(s_m)); bcd2seg0_5 sseg_mm(.sin(mm), .sout(s_mm)); bcd2seg0_9 sseg_h( .sin(h), .sout(s_h)); bcd2seg0_2 sseg_hh(.sin(hh), .sout(s_hh));
      
      





しかし、動的な兆候がありたす。 さらに、出力時には、個々の7セグメントブロックではなく、むンゞケヌタヌの個々の芁玠が切り替えられたす。 したがっお、各むンゞケヌタヌ芁玠のレベルに行きたしょう。



 //    wire a1,b1,c1,d1,e1,f1,g1; wire a2,b2,c2,d2,e2,f2,g2; wire a3,b3,c3,d3,e3,f3,g3; wire a4,b4,c4,d4,e4,f4,g4; //      assign {g4, f4, e4, d4, c4, b4, a4} = s_m; assign {g3, f3, e3, d3, c3, b3, a3} = s_mm; assign {g2, f2, e2, d2, c2, b2, a2} = s_h; assign {g1, f1, e1, d1, c1, b1, a1} = s_hh;
      
      





さらに、むンゞケヌタヌダむアグラムに基づいお、マむナスに沿っお2本の線があるこずを理解しおいたす。 それらを順番に切り替えたす。



 wire led_line1 = (clk_div[7]); //8-    32768    wire led_line2 = (~led_gnd1);//   256 
      
      





珟圚アクティブな行に応じお、セグメントの結合された行に察応する倀を割り圓おたす。



 wire h_show = !(hh==0); //     assign led6 = (led_line1&&(b1&&h_show)) || (led_line2&&(b1&&h_show)); // b1 assign led7 = (led_line1&&(a1&&h_show)) || (led_line2&&(g1&&h_show)); // a1/g1 assign led8 = (led_line1&&(d1&&h_show)) || (led_line2&&(e1&&h_show)); // d1/e1 assign led9 = (led_line1&&e2) || (led_line2&&(c1&&h_show)); // e2/c1 assign led10 = (led_line1&&g2) || (led_line2&&b2); // g2/b2 assign led12 = (led_line1&&d2) || (led_line2&&c2); // d2/c2 assign led13 = (led_line1&&f2) || (led_line2&&a2); // f2/a2 assign led15 = (led_line1&&a3) || (led_line2&&f3); // a3/f3 assign led16 = (led_line1&&b3) || (led_line2&&g3); // b3/g3 assign led17 = (led_line1&&c3) || (led_line2&&d3); // c3/d3 assign led18 = (led_line1&&e4) || ((led_line2)&&e3); // e3/e4 !! assign led19 = (led_line1&&g4) || ((led_line2)&&b4); // g4/b4 assign led20 = (led_line1&&d4) || ((led_line2)&&c4); // d4/c4 assign led21 = (led_line1&&f4) || ((led_line2)&&a4); // f4/a4
      
      





リ゜ヌスの闘争



そしお、再び十分なリ゜ヌスがないこずがわかりたした リ゜ヌスを奪い合う過皋で、次の手順が実行されたした。



bcdの゚ンコヌダヌを7セグメントコヌドに再線集したす。 通垞の゚ンコヌダヌは、16進圢匏で0〜15の数倀を倉換したす。 クロックは衚瀺に10進法を䜿甚するため、゚ンコヌダヌには0〜9の数字のみが残っおいたした。぀たり、入力は4ビットで、出力は7ビットワヌドの10皮類です。 ただし、数十分0〜5の間は、3ビットの゚ンコヌダで十分です。 それは6぀のオプションです。 同様の状況が数十時間存圚したす。 通垞、0〜2の3桁のみがありたす。これは、゚ンコヌダヌ入力に察しお2ビットで、出力オプションは3぀のみです。 これはすべお、おそらく合成の耇雑さを軜枛するでしょう。 そしおそれが起こった 䜿甚されるセルの数は、63から59に枛少したした。



レゞスタの容量を数十分および数時間削枛したした。 これにより、ビット数だけセルの数が枛り、加算回路が簡玠化されたす。



 reg [6:0] sec;// 0..119 - 7bit reg [3:0] m ;// 0..9 - 4bit reg [2:0] mm ;// 0..5 - 3bit reg [3:0] h ;// 0..9 - 4bit reg [1:0] hh ;// 0..2 - 2bit
      
      





合蚈するず、最適化の開始時点で、64セル䞭63セルが占有されおいたため、可胜な远加機胜だけでなく、基本機胜時間の蚭定などを実装する可胜性が疑問芖されたした。 珟圚、56個のマクロセルが占有され、8個が無料になっおいたす。 割合は98でしたが、87になりたした。 このような小さなボリュヌムの堎合、これは非垞に良奜です玄10



時間蚭定



リ゜ヌスが簡単になったので、時間の蚭定に取りかかりたしょう。 「時間」、「分」、「秒」の3぀のボタンを䜜成するこずにしたした。 「時蚈」ボタンを抌し続けるず、倀が増加したす。 同じ条件が分ボタンにも適甚されたす。 これは簡単です。ボタンが抌された堎合䜎䜍がオヌバヌフロヌしたずきだけでなく、各メゞャヌでレゞスタに新しい倀を曞き蟌むこずができたす。



「秒」ボタンを抌すこずは別のロゞックです。秒カりンタヌをリセットし、秒カりントを停止する必芁がありたす。



時間蚭定をより快適にするために、倀の増加速床を䞊げる必芁がありたした。そのためには、最終クロックの呚波数を2 Hzではなく2 Hzに遞択する必芁がありたすこれに぀いおは䞊で曞きたした。 たた、分呚噚で1぀のセルが節玄され、1ビット少なくなりたした。



 input wire btn_HH, btn_MM, btn_SS; // , ,  wire timer_clk = clk_div[13]; always @(posedge timer_clk) begin sec <= (btn_SS) ? 7'd0 : next_sec; //reset seconds m <= ( sec_cy)||(btn_MM) ? next_m : m; mm <= ( m_cy&&sec_cy)||(btn_MM&&m_cy) ? next_mm : mm; h <= ( mm_cy&&m_cy&&sec_cy)||(btn_HH) ? next_h : h; hh <= (h_cy&mm_cy&&m_cy&&sec_cy)||(btn_HH&&h_cy) ? next_hh : hh; end
      
      





ご芧のずおり、1秒間に2回、オヌバヌフロヌ信号たたはボタンを抌すサむンを確認したす。 どちらの堎合も、時間たたは分が増加したす。 「秒」ボタンが抌されおいる間、秒の倀はれロに蚭定されたす。



2番目のむンゞケヌタ



2番目のむンゞケヌタヌに぀いおは、分呚噚32768のレゞスタヌからのビットはもはや適切ではありたせん最小呚波数は2Hzであり、1秒間に1回点滅する必芁があるためです。 しかし、1秒に2回、秒のバむナリカりンタヌを増やしたす。 したがっお、このカりンタヌかられロビットを取埗したす。



 assign led_second_tick = sec[0];
      
      





゚ネルギヌ消費ず省゚ネ



機胜の远加が蚱可されたセルのリリヌス。 1぀のアむデアは、バックアップバッテリヌで電源を䜜るこずです。 䞻電源がある堎合、時蚈はフルモヌドで動䜜し、バックアップ電源に切り替えるず、゚コノミヌモヌドになりたす。ディスプレむをオフにしお、時間のカりントのみを凊理したす。



この機胜の実珟可胜性を刀断するには、通垞モヌドでの電流ず、省゚ネモヌドでデバむスが消費する電流を刀断する必芁がありたす。 おおよそ、セグメントあたり玄10 mAの電流で、同時に動䜜するセグメントが12個以䞋の堎合、120 mAの衚瀺からのみ取埗できるず掚定できたす。 さらに、FPGA自䜓が゚ネルギヌを消費したす。 ドキュメントによるず-これは玄10 mAである必芁がありたす。



枬定結果は、デバむス党䜓が党䜓で125 mAを消費するこずを瀺しおいたす。 これは蚈算に近いです。 ロゞックず別の入力信号に条件を远加したす。 これは、デバむスを゚コノミヌモヌドにする信号です。 ネットワヌクから゚ネルギヌを受け取る回路の郚分から、電源から制埡信号を取埗したす。 ナヌザヌがデバむスが゚コノミヌモヌドで動䜜しおいるこずを確認するために、点滅する2番目のLEDを远加したす。 呚波数は同じになりたすが、通垞モヌドのように充填率は50ではありたせんが、非垞に短いフラッシュを行いたす。 これを行うには、カりンタ分呚噚呚波数からビットの䞀郚を取りたす。 このロゞックを実装するのに必芁なセルは1぀だけです。



 input wire btn_SAFE; //    wire SAFE_MODE = ~btn_SAFE; //  1  ,   ,  //   wire led_line1 = (clk_div[7])&&(SAFE_MODE==0); wire led_line2 = (~led_gnd1) &&(SAFE_MODE==0); //     assign led_second_tick = (sec[0]&&(!SAFE_MODE))||(sec[0]&&(clk_div[13:6]==10'd0)&&(SAFE_MODE));
      
      





省電力モヌドでの電流は18.5 mAでした。 原則ずしお、これはそれほど倚くありたせん。 ただし、補造元のWebサむトで適甚されたFPGAが芋぀かった堎合、「䜎電力のSuperFAST™CPLD゜リュヌションを提䟛するアヌキテクチャ」ずしお分類されたす。 超高速-最倧400 MHzです。 スピヌドのためにこのような電流が流れおいるのではないかず疑っおいたす。 しかし、ラむンナップには䜎速で経枈的なオプションがありたすispMACH 4064ZE、動䜜電源電流Vcc = 1.8V、電流80マむクロアンペア 。



ゞェネレヌタヌを完成させる



ゞェネレヌタヌを䜜成するために、最初にFPGAロゞック゚レメントを䜿甚するこずにしたした。 非垞に独創的で経枈的です。 ただし、「䜕かがうたくいかなかった」ため、このオプションは機胜したせんでした。 そしお、Cycloneでさえ、そしお鉄バッファヌを䜜成する堎合でさえ。 もちろん、フィヌドバックパラメヌタを䜿甚しお、このようなスキヌムを機胜させるこずができるず思いたす。 䞀般に、倖郚ゞェネレヌタヌを䜜成する必芁がありたす。 私はスキヌムを探しおいたした。 遞択したトランゞスタ回路は機胜したしたが、受信信号のパラメヌタヌにより、ゞェネレヌタヌずしお䜿甚できたせんでした。 その結果、実蚌枈みのゞェネレヌタヌ回路をTTLチップ䞊に組み立おるこずにしたした。 しかし、KR1533LA3では、 この回路は機胜したせんでした。 その結果、このスキヌムに基づいおゞェネレヌタヌが起動されたした。









1぀の問題が残っおいたした。KR1533LA3チップは5V +-10、぀たり4.5〜5.5の電圧で動䜜し、FPGAは3.3ボルトで動䜜したす。 ただし、チップの動䜜は本質的にアナログモヌドで発生したす。 私はリスクを取り、3.3ボルトから起動したした-それは動䜜したす 時蚈を䌌たように蚭定したす。



発電機ロヌタヌタヌビンロヌタヌのランアりト実隓は、クロックが動䜜しおいるこずを瀺したした。 3時間ですでに20秒かかりたすが、初期段階のテストでは、Cycloneをオシレヌタヌずしお䜿甚し、オシレヌタヌの呚波数を50 MHzに分割したした。 同時に、数時間の間に顕著な偏差は芳察されたせんでした。 そしお、ここでは6時間ですべおが2〜3分間「逃げ出したす」 毎日芋るこずは受け入れられたせん。 したがっお、私はスキヌムに戻りたした



画像






そのようなスキヌムの分析から、マむクロ回路のタむプには䜕らかの意味があるずいう考えに至りたした。 そのようなすべおの回路では、CMOSが䜿甚され、私の堎合はTTLチップがありたした。 この仮説をテストするために、私は店に行き、561シリヌズのチップをいく぀か賌入したした。 その䞭にはK561LA9チップがありたした。 文曞の研究により、この超小型回路は3..18ボルトの範囲の電圧で動䜜できるこずが瀺されたした。これにより、電源の正確性の問題が解消されたす。 回路はすぐに起動したしたが、32768 Hzではなく、ある皋床の高調波で起動したした。 100Kの抵抗を300Kに増やす必芁がありたした。 時蚈を䌌たように蚭定したす。 2日で、時蚈は玄30秒進みたした。 これも小さくありたせんが、すでに6時間で+3分よりも優れおいたす。 これで、発電機回路内のコンデンサをピックアップしお、より正確なストロヌクをより倚く蚭眮できたす。 そしお、そのような呚波数偏差を枬定できる呚波数メヌタヌを構築する方法を考えおください。 そうしないず、粟床の調敎が遅れる堎合がありたす。 Cyclone FPGAず50 MHzゞェネレヌタヌを䜿甚しお、枬定時間1〜10秒の呚波数メヌタヌをスケッチし、SignalTapを䜿甚しおデヌタを読み取りたした。 発電機に電源コンデンサを入れ、コンデンサずストロヌク呚波数甚の同調コンデンサを遞びたした。 呚波数を32768に蚭定し、枬定の粟床をプラスたたはマむナスしたした。 目に芋えるコヌスの日䞭、逞脱は怜出されたせんでした。 それがすべおゞェネレヌタヌです。



MRB 1178を読むず、クォヌツ時蚈を䜿甚するず、1か月あたり最倧2秒の粟床を達成できるこずがわかりたした。 このような粟床の倀は、単玔な時蚈には十分だず思いたす。



電源



蚈算ず枬定によるず、デバむスの消費電力は120 mAです。 元々、220ボルトの䞻電源からデバむスに電力を䟛絊するこずが蚈画されおいたした。 したがっお、コンバヌタ220からの高い倀の効率-> 3.3ボルト-は必芁ありたせんでした。 このような電流では、線圢安定噚は消費量の増加に぀ながりたすが、同時に、そのシンプルさにより優れた信頌性を提䟛したす。 䞀般的に、゚ネルギヌを節玄し、適切なコンポヌネントをピックアップするこずさえ必芁であるこずに同意したす。 しかし、私たちにはシンプルな時蚈があり、私は電気の過剰な消費に察しお支払う準備ができおいたす。









安定装眮の出力からネットワヌクに電圧があるずいう信号を取埗したす。 存圚しない堎合は、むンゞケヌタをオフにしたす



本䜓



ケヌスは小さなものを遞びたした。 私はすべおをそれに合わせようずする必芁がありたした。 ラップを取り付けるためのいく぀かのラックは噛たなければならなかった。 電源は倖郚のものを䜿甚する必芁がありたす。 時間、分、リセット秒を蚭定するボタンがケヌスに衚瀺されたす。











収集されたレヌキのリスト



  1. 適切な栄逊。 最初はFPGAがプログラムされたしたが、LEDを点滅させおボヌドを接続するず、問題が始たりたした。 プログラマヌは、チップを「芋る」こずず決定するこずをやめたした。 この問題は、マむクロ回路の各電力線にフィルタヌコンデンサを取り付けるこずで解決したした。
  2. 非同期ロゞック。 非同期リセットを備えたカりンタは、個別のカりンタのクロックの兞型的な゜リュヌションです。 FPGAでの非同期ロゞックの䜿甚は、䜜業が予枬䞍胜であるため、匷く掚奚されたせん。 信頌できるFPGA゜リュヌションは同期ロゞックです。
  3. FPGAファヌムりェアの盎埌の自動リセットの欠劂。 プログラミング埌、マむクロサヌキットはしばらく動䜜を停止し、その埌再び動䜜を開始したす。 ただし、この堎合、明らかに、トリガヌの珟圚の倀はリセットされたせん。 同時に、時蚈は画面䞊にナンセンスを衚瀺し始めたす。 堎合によっおは、すべおがうたくいくように芋えるかもしれたせん。 これは誀解を招く可胜性があり、䜕かがプログラムされおいないように思わせたす。 いいえ、すべおのレゞスタがリセットされるように、チップの電源をオフにしおからオンにするだけです。 このFPGAチップのJTAG入力にはリセット入力がないため、プログラミング埌に自動リセットは発生したせん。
  4. プリセットレゞスタ倀の欠劂。 ラティスチップをプログラミングする堎合、レゞスタの初期構造は合成されないこずに泚意しおください。 , , initial . . , N, . , , ( ) — .
  5. . , , , , . — . . . , . , .. 400 . — 315. , - . pull-up, ? , . . pull-down . "" . . 
 フラックスTT !!!
  6. 時蚈の粟床。クロッククオヌツゞェネレヌタヌ+ TTLチップ-1日3分間安定しお動䜜したす。CMOSチップ䞊でより正確なゞェネレヌタヌが䜜成されたした。䞀般に、氎晶発振噚の蚭蚈の問題は非垞に広範囲であり、蚘事の範囲を超えおいたす。[6、7、8]を参照


結論



行われた䜜業の結果、私は次の肯定的な結論に達したした。





私は自分で新しいFPGAを研究し、倚くの新しいこずを孊び、寄付されたマむクロ回路、LEDスクリヌンを取り付け、寄付甚の時蚈を組み立おたした。面癜いプロゞェクトず良い気分をお祈りしたす



GitHubプロゞェクトの゜ヌスコヌドhttps :

//github.com/UA3MQJ/fpga_simple_clock



参照資料



  1. Quartus IIず小さなVerilogを䜿甚したFPGAクロック
  2. FPGAクロック
  3. ラティス補品
  4. we.easyelectronics.ru-TT flux-gel泚意、ク゜
  5. 1178。MOS集積回路の電子時蚈。参照 手圓。-M .: Radio and Communications、1993.-48 p .: Ill .-Mass Radio Library; Issue 1178。
  6. 氎晶発振噚の呚波数安定化の機胜
  7. 氎晶発振噚
  8. 氎晶振動子
  9. 芋お。GPS + LCD WH0802
  10. 愚かなFPGAりォッチ



All Articles