時(shí)序邏輯電路設(shè)計(jì):從觸發(fā)器到狀態(tài)機(jī)的核心原理與實(shí)踐
1. 從組合邏輯到時(shí)序邏輯為什么“記憶”是數(shù)字電路的分水嶺如果你已經(jīng)學(xué)過(guò)了組合邏輯電路可能會(huì)覺(jué)得數(shù)字電路的世界就是一堆與門(mén)、或門(mén)、非門(mén)輸入一變輸出立刻跟著變干凈利落。但當(dāng)你開(kāi)始接觸“時(shí)序邏輯電路”時(shí)那種感覺(jué)就像是從二維平面突然跳進(jìn)了三維空間——電路有了“記憶”有了“過(guò)去”輸出不再僅僅取決于當(dāng)前的輸入還取決于電路“之前”的狀態(tài)。這就是數(shù)字電子技術(shù)從靜態(tài)走向動(dòng)態(tài)、從簡(jiǎn)單功能走向復(fù)雜系統(tǒng)的關(guān)鍵一步。我剛開(kāi)始學(xué)這部分時(shí)也卡了很久。為什么需要“記憶”一個(gè)簡(jiǎn)單的例子就能說(shuō)明想象一個(gè)樓道里的觸摸延時(shí)燈。你觸摸一下開(kāi)關(guān)輸入一個(gè)脈沖燈亮了。這個(gè)“亮”的狀態(tài)并不會(huì)在你手離開(kāi)開(kāi)關(guān)的瞬間就熄滅而是會(huì)持續(xù)一段時(shí)間。這個(gè)“持續(xù)”的過(guò)程就是電路記住了“你剛才觸摸過(guò)”這個(gè)事件并在一段時(shí)間內(nèi)維持輸出。這就是一個(gè)最基礎(chǔ)的時(shí)序邏輯電路雖然實(shí)際可能用模擬電路實(shí)現(xiàn)但邏輯是相通的。沒(méi)有時(shí)序邏輯就沒(méi)有計(jì)數(shù)器、沒(méi)有寄存器、沒(méi)有我們手機(jī)里的CPU和內(nèi)存數(shù)字世界將不復(fù)存在。本章的“時(shí)序邏輯電路”是整個(gè)數(shù)字電路設(shè)計(jì)的核心與難點(diǎn)。它不像組合邏輯那樣直來(lái)直去你需要同時(shí)考慮“當(dāng)前輸入”和“電路的歷史狀態(tài)”設(shè)計(jì)工具也從真值表升級(jí)為狀態(tài)圖、狀態(tài)表。很多人在這里會(huì)感到抽象和混亂別擔(dān)心這很正常。接下來(lái)我會(huì)帶你拆解時(shí)序邏輯的每一個(gè)核心部件從最基礎(chǔ)的存儲(chǔ)單元——觸發(fā)器開(kāi)始一步步構(gòu)建出計(jì)數(shù)器、寄存器等復(fù)雜功能模塊并分享我在學(xué)習(xí)和實(shí)踐中總結(jié)的、那些教科書(shū)上不一定寫(xiě)的“避坑指南”和設(shè)計(jì)心法。2. 時(shí)序邏輯的基石深入理解各類(lèi)觸發(fā)器的“脾氣秉性”時(shí)序邏輯電路之所以能“記憶”全靠其中的基本存儲(chǔ)單元觸發(fā)器。你可以把它理解為一個(gè)能鎖住一位二進(jìn)制數(shù)據(jù)0或1的最小記憶細(xì)胞。所有復(fù)雜的時(shí)序電路無(wú)論是計(jì)數(shù)器還是移位寄存器都是由觸發(fā)器組合而成的。因此吃透觸發(fā)器是學(xué)好本章的第一道關(guān)卡。2.1 核心概念時(shí)鐘、現(xiàn)態(tài)與次態(tài)在深入具體觸發(fā)器之前必須建立三個(gè)核心概念時(shí)鐘信號(hào)這是時(shí)序電路的“心跳”或“指揮棒”。絕大多數(shù)時(shí)序電路的動(dòng)作如狀態(tài)的改變、數(shù)據(jù)的存儲(chǔ)都與時(shí)鐘信號(hào)同步。時(shí)鐘通常是一個(gè)周期性的方波。觸發(fā)器在時(shí)鐘的特定時(shí)刻如上升沿或下降沿檢查輸入并決定輸出如何變化。沒(méi)有時(shí)鐘同步的電路稱(chēng)為異步時(shí)序電路設(shè)計(jì)起來(lái)更復(fù)雜容易產(chǎn)生“競(jìng)爭(zhēng)冒險(xiǎn)”初學(xué)者應(yīng)先掌握同步時(shí)序電路?,F(xiàn)態(tài)指觸發(fā)器在當(dāng)前時(shí)鐘沿到來(lái)之前所保持的輸出狀態(tài)通常用Q^n表示。次態(tài)指在下一個(gè)時(shí)鐘沿到來(lái)之后觸發(fā)器將要進(jìn)入的新?tīng)顟B(tài)通常用Q^{n1}表示。時(shí)序邏輯的分析與設(shè)計(jì)核心就是找出次態(tài)Q^{n1與現(xiàn)態(tài)Q^n以及輸入之間的邏輯關(guān)系。2.2 SR觸發(fā)器最原始的雙刃劍SR觸發(fā)器Set-Reset是最基本的觸發(fā)器它清晰地揭示了所有觸發(fā)器工作的底層邏輯通過(guò)兩個(gè)互斥的輸入來(lái)控制狀態(tài)。SSet置位端有效時(shí)通常為1強(qiáng)制輸出Q1。RReset復(fù)位端有效時(shí)通常為1強(qiáng)制輸出Q0。它的特性表很簡(jiǎn)單SRQ^{n1} (次態(tài))說(shuō)明00Q^n保持記憶原有狀態(tài)010復(fù)位輸出0101置位輸出111不定態(tài)禁止?fàn)顟B(tài)注意SR11是絕對(duì)禁止的這是因?yàn)楫?dāng)S和R同時(shí)有效時(shí)兩個(gè)強(qiáng)制信號(hào)沖突會(huì)導(dǎo)致輸出Q和QQ的非同時(shí)為1這違背了互補(bǔ)輸出的原則。當(dāng)信號(hào)同時(shí)撤去后最終狀態(tài)無(wú)法預(yù)測(cè)取決于門(mén)電路的微小延遲電路處于亞穩(wěn)態(tài)這是災(zāi)難性的。因此任何使用SR觸發(fā)器的設(shè)計(jì)都必須通過(guò)外部邏輯保證不會(huì)出現(xiàn)SR1的輸入組合。實(shí)操心得雖然現(xiàn)在直接使用基本SR觸發(fā)器的場(chǎng)景很少因?yàn)樗鼪](méi)有時(shí)鐘控制是電平觸發(fā)的但理解它至關(guān)重要。很多集成觸發(fā)器如帶使能的D觸發(fā)器的內(nèi)部邏輯單元仍然是SR結(jié)構(gòu)的變體。當(dāng)你看到電路出現(xiàn)不可預(yù)測(cè)的震蕩或錯(cuò)誤時(shí)第一個(gè)要懷疑的就是是否無(wú)意中產(chǎn)生了類(lèi)似“SR1”的沖突條件。2.3 JK觸發(fā)器解決SR禁區(qū)的全能選手JK觸發(fā)器可以看作是SR觸發(fā)器的“完全體”它完美解決了SR觸發(fā)器中的禁止?fàn)顟B(tài)問(wèn)題。J功能類(lèi)似S置位。K功能類(lèi)似R復(fù)位。它的神奇之處在于當(dāng)JK1時(shí)此時(shí)觸發(fā)器的次態(tài)將是現(xiàn)態(tài)的取反即Q^{n1} NOT(Q^n)。這個(gè)“翻轉(zhuǎn)”功能使得JK觸發(fā)器功能非常完備。JKQ^{n1}說(shuō)明00Q^n保持010復(fù)位101置位11Q^n (取反)翻轉(zhuǎn)JK觸發(fā)器功能強(qiáng)大理論上可以構(gòu)成任何其他類(lèi)型的觸發(fā)器。但在大規(guī)模集成電路中最常用的卻是下面這位——D觸發(fā)器。2.4 D觸發(fā)器數(shù)字系統(tǒng)中的“搬運(yùn)工”與“倉(cāng)庫(kù)”D觸發(fā)器是當(dāng)今數(shù)字系統(tǒng)如FPGA、CPU中應(yīng)用最廣泛的觸發(fā)器沒(méi)有之一。原因就在于它的簡(jiǎn)單與可靠。DData數(shù)據(jù)輸入端。其特性極其簡(jiǎn)潔在有效時(shí)鐘沿如上升沿將D端的數(shù)據(jù)“采樣”并鎖存到輸出Q。即Q^{n1} D。這意味著時(shí)鐘沿時(shí)刻D是什么輸出Q就變成什么。它就像一個(gè)受時(shí)鐘嚴(yán)格控制的單比特?cái)?shù)據(jù)通道或倉(cāng)庫(kù)。為什么D觸發(fā)器如此受歡迎無(wú)禁止?fàn)顟B(tài)D端只有一根數(shù)據(jù)線(xiàn)從根本上避免了SR/JK中兩路輸入可能沖突的問(wèn)題。設(shè)計(jì)簡(jiǎn)單次態(tài)方程就是Q^{n1}D在邏輯設(shè)計(jì)和狀態(tài)機(jī)化簡(jiǎn)時(shí)異常方便。適用于流水線(xiàn)其“直通”特性非常適合構(gòu)建寄存器、移位寄存器實(shí)現(xiàn)數(shù)據(jù)的同步傳遞和暫存。在Verilog或VHDL硬件描述語(yǔ)言中當(dāng)你寫(xiě)下一句always (posedge clk) q d;綜合工具生成的基本上就是D觸發(fā)器。2.5 T觸發(fā)器專(zhuān)為計(jì)數(shù)而生T觸發(fā)器可以看作是JK觸發(fā)器在JK情況下的特例或者D觸發(fā)器接成翻轉(zhuǎn)模式。TToggle翻轉(zhuǎn)控制端。特性當(dāng)T1時(shí)每次有效時(shí)鐘沿到來(lái)輸出翻轉(zhuǎn)一次當(dāng)T0時(shí)保持原狀態(tài)。即Q^{n1} T XOR Q^n。T觸發(fā)器的天然用途就是構(gòu)成二進(jìn)制計(jì)數(shù)器。一個(gè)T觸發(fā)器就是一個(gè)1位二進(jìn)制計(jì)數(shù)器0-1-0...。將多個(gè)T觸發(fā)器級(jí)聯(lián)就能構(gòu)成多位計(jì)數(shù)器。選型經(jīng)驗(yàn)談在實(shí)際芯片選型或FPGA設(shè)計(jì)中你幾乎不會(huì)直接去庫(kù)里面找一個(gè)叫“T觸發(fā)器”的元件。因?yàn)镈觸發(fā)器通過(guò)外部加一個(gè)異或門(mén)Q^{n1} D T XOR Q^n就可以輕松實(shí)現(xiàn)T觸發(fā)器的功能而JK觸發(fā)器也可以通過(guò)簡(jiǎn)單連接JKT實(shí)現(xiàn)。所以現(xiàn)代數(shù)字設(shè)計(jì)的基礎(chǔ)存儲(chǔ)單元幾乎清一色是D觸發(fā)器其他功能通過(guò)外部組合邏輯來(lái)實(shí)現(xiàn)。理解T觸發(fā)器的行為更多的是為了理解計(jì)數(shù)器的工作原理。3. 時(shí)序電路的分析從電路圖到行為描述給你一個(gè)由觸發(fā)器和門(mén)電路構(gòu)成的時(shí)序電路你如何知道它是干什么的這就是時(shí)序電路分析要解決的問(wèn)題。分析是設(shè)計(jì)的基礎(chǔ)只有會(huì)分析才能驗(yàn)證自己的設(shè)計(jì)是否正確。這里我分享一個(gè)標(biāo)準(zhǔn)化的四步分析法并用一個(gè)具體例子貫穿。假設(shè)我們分析一個(gè)由兩個(gè)JK觸發(fā)器構(gòu)成的電路其輸出為Q1Q0。3.1 第一步寫(xiě)出驅(qū)動(dòng)方程與時(shí)鐘方程驅(qū)動(dòng)方程就是每個(gè)觸發(fā)器輸入端的邏輯表達(dá)式。我們需要根據(jù)電路圖寫(xiě)出每個(gè)觸發(fā)器輸入信號(hào)J, K, D, T等與電路輸入、其他觸發(fā)器現(xiàn)態(tài)之間的關(guān)系。例如對(duì)于第一個(gè)JK觸發(fā)器FF0J0 X ⊕ Q1^n,K0 1假設(shè)X是外部輸入對(duì)于第二個(gè)JK觸發(fā)器FF1J1 X · Q0^n,K1 XX‘表示X的非時(shí)鐘方程通常很簡(jiǎn)單在同步電路中所有觸發(fā)器都接在同一個(gè)時(shí)鐘CLK上即CLK0 CLK1 CLK。如果時(shí)鐘不同則需要特別關(guān)注那是異步時(shí)序電路。3.2 第二步推導(dǎo)狀態(tài)方程狀態(tài)方程就是每個(gè)觸發(fā)器次態(tài)的表達(dá)式。將第一步得到的驅(qū)動(dòng)方程代入該類(lèi)型觸發(fā)器的特性方程。JK觸發(fā)器的特性方程是Q^{n1} J·Q K·Q那么FF0的狀態(tài)方程Q0^{n1} J0·Q0^n K0·Q0^n (X ⊕ Q1^n)·Q0^n 0·Q0^n (X ⊕ Q1^n)·Q0^nFF1的狀態(tài)方程Q1^{n1} J1·Q1^n K1·Q1^n (X·Q0^n)·Q1^n X·Q1^n因?yàn)镵1X‘所以K1X這一步是代數(shù)運(yùn)算需要細(xì)心特別是處理“非”運(yùn)算的時(shí)候。3.3 第三步列出狀態(tài)轉(zhuǎn)換表與狀態(tài)圖這是將抽象的方程轉(zhuǎn)化為直觀行為的關(guān)鍵一步。狀態(tài)轉(zhuǎn)換表列出了在所有可能的現(xiàn)態(tài)組合和輸入組合下對(duì)應(yīng)的次態(tài)和輸出。我們假設(shè)電路輸出Y Q1。那么對(duì)于兩個(gè)觸發(fā)器現(xiàn)態(tài)有4種組合Q1Q0 00, 01, 10, 11輸入X有0和1兩種??偣残枰?jì)算8種情況。以現(xiàn)態(tài)為00X0為例計(jì)算Q0^{n1} (0 ⊕ 0)·1 0·1 0計(jì)算Q1^{n1} (0·0)·1 0·0 0輸出Y Q1^{n1} 0 所以在(00,0)條件下次態(tài)為00輸出0。依次計(jì)算所有8行就得到了完整的狀態(tài)轉(zhuǎn)換表。根據(jù)此表可以繪制出更直觀的狀態(tài)圖。狀態(tài)圖用圓圈表示狀態(tài)圈內(nèi)寫(xiě)狀態(tài)值如00用箭頭表示狀態(tài)轉(zhuǎn)換箭頭上標(biāo)注“輸入/輸出”。例如從狀態(tài)00到00的箭頭上會(huì)標(biāo)“0/0”。狀態(tài)圖是理解電路功能的“地圖”一眼就能看出電路有幾個(gè)狀態(tài)是如何在輸入驅(qū)動(dòng)下流轉(zhuǎn)的。3.4 第四步分析邏輯功能與自啟動(dòng)檢查通過(guò)觀察狀態(tài)圖我們可以判斷電路功能。例如如果狀態(tài)圖形成一個(gè)循環(huán)可能是計(jì)數(shù)器如果狀態(tài)轉(zhuǎn)移與輸入序列有關(guān)可能是序列檢測(cè)器。一個(gè)極其重要的檢查點(diǎn)自啟動(dòng)能力。不是所有狀態(tài)圖里的狀態(tài)都是“有用”的。設(shè)計(jì)者通常只規(guī)劃了部分狀態(tài)有效狀態(tài)但觸發(fā)器組合可能產(chǎn)生的狀態(tài)總數(shù)是2^nn為觸發(fā)器數(shù)量。那些未被規(guī)劃的狀態(tài)稱(chēng)為無(wú)效狀態(tài)或“無(wú)關(guān)狀態(tài)”。在狀態(tài)轉(zhuǎn)換表中我們需要計(jì)算如果電路因?yàn)楦蓴_或上電偶然進(jìn)入了這些無(wú)效狀態(tài)在下一個(gè)時(shí)鐘沿它會(huì)去哪里。能自啟動(dòng)從任何無(wú)效狀態(tài)出發(fā)經(jīng)過(guò)一個(gè)或幾個(gè)時(shí)鐘周期后能自動(dòng)進(jìn)入有效狀態(tài)循環(huán)。不能自啟動(dòng)從某些無(wú)效狀態(tài)出發(fā)會(huì)陷入無(wú)效狀態(tài)循環(huán)死循環(huán)或無(wú)法回到有效循環(huán)。不能自啟動(dòng)的電路是不可靠的在實(shí)際應(yīng)用中必須通過(guò)修改設(shè)計(jì)例如利用無(wú)關(guān)項(xiàng)化簡(jiǎn)時(shí)謹(jǐn)慎選擇或增加上電復(fù)位電路來(lái)避免。踩坑實(shí)錄我曾設(shè)計(jì)過(guò)一個(gè)模5計(jì)數(shù)器用了3個(gè)觸發(fā)器本應(yīng)有3個(gè)無(wú)效狀態(tài)。仿真時(shí)只遍歷了有效狀態(tài)一切正常。但硬件實(shí)測(cè)中偶爾會(huì)發(fā)現(xiàn)計(jì)數(shù)器“卡死”不計(jì)數(shù)。后來(lái)才發(fā)現(xiàn)在化簡(jiǎn)次態(tài)卡諾圖時(shí)我為了得到最簡(jiǎn)表達(dá)式將無(wú)效狀態(tài)的次態(tài)隨意地圈入了某些包圍圈導(dǎo)致其中一個(gè)無(wú)效狀態(tài)的次態(tài)是另一個(gè)無(wú)效狀態(tài)形成了死循環(huán)。解決方案是在化簡(jiǎn)時(shí)強(qiáng)制指定無(wú)效狀態(tài)的次態(tài)為某個(gè)特定的有效狀態(tài)如000雖然得到的邏輯表達(dá)式可能不是最簡(jiǎn)的但保證了電路的自啟動(dòng)性。這個(gè)教訓(xùn)讓我深刻理解到時(shí)序邏輯設(shè)計(jì)不能只追求邏輯最簡(jiǎn)可靠性永遠(yuǎn)是第一位的。4. 時(shí)序電路的設(shè)計(jì)從需求到電路圖分析是“逆向工程”設(shè)計(jì)則是“正向創(chuàng)造”。當(dāng)你需要實(shí)現(xiàn)一個(gè)特定功能比如一個(gè)檢測(cè)“1101”序列的檢測(cè)器時(shí)如何用觸發(fā)器搭出來(lái)以下是標(biāo)準(zhǔn)設(shè)計(jì)流程。4.1 第一步邏輯抽象建立原始狀態(tài)圖/表這是最難也最需要?jiǎng)?chuàng)造力的一步。你需要把文字描述的需求轉(zhuǎn)化為一個(gè)狀態(tài)機(jī)模型。確定輸入/輸出變量序列檢測(cè)器輸入就是串行數(shù)據(jù)線(xiàn)X輸出就是檢測(cè)到序列時(shí)的指示信號(hào)Y。定義狀態(tài)含義狀態(tài)代表“記憶”的內(nèi)容。對(duì)于序列“1101”我們可以定義S0初始狀態(tài)沒(méi)檢測(cè)到任何有效位。S1檢測(cè)到了第一個(gè)‘1’。S2在S1基礎(chǔ)上又檢測(cè)到了一個(gè)‘1’即已收到“11”。S3在S2基礎(chǔ)上檢測(cè)到了一個(gè)‘0’即已收到“110”。當(dāng)在S3狀態(tài)且輸入為‘1’時(shí)輸出Y1并跳轉(zhuǎn)到下一個(gè)狀態(tài)可能是S1或S0取決于是否允許重疊檢測(cè)。畫(huà)出狀態(tài)轉(zhuǎn)換圖根據(jù)狀態(tài)含義畫(huà)出所有可能的狀態(tài)轉(zhuǎn)移。例如在S0狀態(tài)輸入X0則停留在S0輸入X1則進(jìn)入S1。這一步常犯的錯(cuò)誤是狀態(tài)定義冗余或遺漏。一個(gè)技巧是狀態(tài)應(yīng)該記住為了產(chǎn)生正確輸出所必需的歷史信息。對(duì)于序列檢測(cè)需要記住的就是“最近接收到的、與目標(biāo)序列前綴匹配的部分序列”。4.2 第二步狀態(tài)化簡(jiǎn)原始狀態(tài)圖可能包含多余的狀態(tài)。如果兩個(gè)狀態(tài)在所有可能的輸入序列下不僅輸出相同而且次態(tài)也相同或等價(jià)則這兩個(gè)狀態(tài)可以合并為一個(gè)。化簡(jiǎn)可以使用觀察法或隱含表法。化簡(jiǎn)后的狀態(tài)圖更簡(jiǎn)潔需要的觸發(fā)器數(shù)量更少狀態(tài)數(shù)N與觸發(fā)器數(shù)n滿(mǎn)足 2^{n-1} N ≤ 2^n。4.3 第三步狀態(tài)編碼為化簡(jiǎn)后的每個(gè)狀態(tài)分配一個(gè)唯一的二進(jìn)制代碼。這就是觸發(fā)器的輸出組合。編碼方式會(huì)影響后續(xù)組合電路的復(fù)雜程度。順序編碼如S000, S101, S210, S311。簡(jiǎn)單直觀。格雷碼編碼相鄰狀態(tài)間只有一位變化如S000, S101, S211, S310。這可以減少狀態(tài)轉(zhuǎn)換時(shí)多個(gè)觸發(fā)器同時(shí)翻轉(zhuǎn)帶來(lái)的毛刺和功耗在計(jì)數(shù)器設(shè)計(jì)中尤其常用。One-hot編碼每個(gè)狀態(tài)用一位觸發(fā)器表示如S00001, S10010, S20100, S31000。需要更多觸發(fā)器但組合邏輯非常簡(jiǎn)單在FPGA設(shè)計(jì)中有時(shí)效率更高因?yàn)镕PGA內(nèi)部有豐富的觸發(fā)器資源。4.4 第四步選定觸發(fā)器類(lèi)型求驅(qū)動(dòng)方程和輸出方程根據(jù)編碼后的狀態(tài)轉(zhuǎn)換表我們可以列出每個(gè)觸發(fā)器的次態(tài)Q^{n1}與現(xiàn)態(tài)Q^n和輸入X的真值表。然后根據(jù)我們選定的觸發(fā)器類(lèi)型通常是D觸發(fā)器因?yàn)樵O(shè)計(jì)簡(jiǎn)單反過(guò)來(lái)推導(dǎo)出每個(gè)觸發(fā)器數(shù)據(jù)輸入端D應(yīng)該是什么邏輯。例如對(duì)于D觸發(fā)器它的次態(tài)就是D端的值。所以我們實(shí)際上是為每個(gè)D端設(shè)計(jì)一個(gè)組合邏輯電路這個(gè)電路的輸入是當(dāng)前狀態(tài)和外部輸入輸出就是該D端的值。同時(shí)輸出Y也是當(dāng)前狀態(tài)和輸入對(duì)于米利型或僅是當(dāng)前狀態(tài)對(duì)于摩爾型的組合邏輯函數(shù)。這一步的核心工作是利用卡諾圖進(jìn)行化簡(jiǎn)得到最簡(jiǎn)的與或表達(dá)式或者適合特定工藝的表達(dá)式。4.5 第五步畫(huà)出邏輯電路圖并驗(yàn)證根據(jù)化簡(jiǎn)后的驅(qū)動(dòng)方程和輸出方程用觸發(fā)器和門(mén)電路畫(huà)出完整的電路圖。最后必須進(jìn)行驗(yàn)證可以通過(guò)仿真或者手動(dòng)沿著電路走一遍關(guān)鍵路徑檢查功能是否正確特別是檢查自啟動(dòng)性。設(shè)計(jì)心法對(duì)于初學(xué)者我強(qiáng)烈建議從摩爾型狀態(tài)機(jī)開(kāi)始設(shè)計(jì)。摩爾型的輸出只與當(dāng)前狀態(tài)有關(guān)這意味著輸出不會(huì)直接隨輸入變化而產(chǎn)生毛刺時(shí)序更容易分析電路也更穩(wěn)定。雖然它比米利型對(duì)輸入的反應(yīng)慢一個(gè)時(shí)鐘周期但在絕大多數(shù)同步設(shè)計(jì)中這都不是問(wèn)題。先掌握摩爾型再理解米利型是更平滑的學(xué)習(xí)路徑。5. 典型時(shí)序邏輯模塊計(jì)數(shù)器與寄存器的實(shí)戰(zhàn)解析掌握了分析和設(shè)計(jì)的一般方法我們來(lái)看兩個(gè)最經(jīng)典、應(yīng)用最廣的時(shí)序邏輯模塊計(jì)數(shù)器和寄存器。它們不是特定的芯片而是一種電路功能可以用我們剛學(xué)的方法設(shè)計(jì)出來(lái)也有大量現(xiàn)成的集成芯片可供選用。5.1 計(jì)數(shù)器數(shù)字世界的時(shí)間與秩序之源計(jì)數(shù)器的功能是記錄輸入脈沖的個(gè)數(shù)。它是分頻、定時(shí)、序列發(fā)生、地址生成等眾多功能的基礎(chǔ)。5.1.1 同步計(jì)數(shù)器與異步計(jì)數(shù)器的本質(zhì)區(qū)別這是計(jì)數(shù)器分類(lèi)的第一個(gè)維度區(qū)別在于所有觸發(fā)器的時(shí)鐘是否統(tǒng)一。異步計(jì)數(shù)器紋波計(jì)數(shù)器例如用T觸發(fā)器級(jí)聯(lián)上一個(gè)觸發(fā)器的輸出作為下一個(gè)觸發(fā)器的時(shí)鐘。這種結(jié)構(gòu)簡(jiǎn)單但存在“紋波”效應(yīng)——時(shí)鐘信號(hào)像波浪一樣從低位傳到高位導(dǎo)致各個(gè)觸發(fā)器不是同時(shí)翻轉(zhuǎn)的。在高速應(yīng)用下這會(huì)帶來(lái)嚴(yán)重的時(shí)序問(wèn)題并且譯碼輸出時(shí)容易產(chǎn)生尖峰毛刺。同步計(jì)數(shù)器所有觸發(fā)器共用同一個(gè)時(shí)鐘源。高位觸發(fā)器的翻轉(zhuǎn)與否由低位觸發(fā)器的狀態(tài)通過(guò)組合邏輯如與門(mén)共同決定大家在同一個(gè)時(shí)鐘沿同時(shí)動(dòng)作。速度快工作可靠是現(xiàn)代設(shè)計(jì)的主流。經(jīng)驗(yàn)之談除非在極低速、低成本的簡(jiǎn)單場(chǎng)合否則一律使用同步計(jì)數(shù)器。在FPGA或ASIC設(shè)計(jì)中你寫(xiě)的計(jì)數(shù)器always (posedge clk) count count 1;綜合出來(lái)就是同步計(jì)數(shù)器。千萬(wàn)不要為了“省幾個(gè)門(mén)”而去設(shè)計(jì)異步計(jì)數(shù)器帶來(lái)的時(shí)序風(fēng)險(xiǎn)遠(yuǎn)大于那點(diǎn)面積節(jié)省。5.1.2 任意模值計(jì)數(shù)器的設(shè)計(jì)關(guān)鍵設(shè)計(jì)一個(gè)模N即0到N-1循環(huán)的計(jì)數(shù)器核心在于狀態(tài)跳轉(zhuǎn)的控制邏輯。以同步計(jì)數(shù)器為例步驟是根據(jù)模值N確定需要的最少觸發(fā)器數(shù)量n2^{n-1} N ≤ 2^n。選擇狀態(tài)編碼通常就是對(duì)應(yīng)的二進(jìn)制數(shù)。畫(huà)出狀態(tài)圖0-1-2-...-N-1-0。為每個(gè)觸發(fā)器設(shè)計(jì)次態(tài)邏輯。對(duì)于D觸發(fā)器就是設(shè)計(jì)每個(gè)D端的邏輯函數(shù)使其在計(jì)數(shù)到N-1時(shí)次態(tài)能歸零。一個(gè)更工程化的方法是利用集成計(jì)數(shù)器芯片的置數(shù)或清零功能。例如經(jīng)典的74LS161是4位二進(jìn)制同步計(jì)數(shù)器。要構(gòu)成模10計(jì)數(shù)器我們可以讓它在計(jì)數(shù)到91001時(shí)不是等到16自然歸零而是利用其“同步置數(shù)”功能在下一個(gè)時(shí)鐘沿到來(lái)時(shí)將數(shù)據(jù)輸入端預(yù)先設(shè)置的00000裝入從而實(shí)現(xiàn)從0到9的循環(huán)。這種方法靈活且節(jié)省邏輯資源。5.2 寄存器數(shù)據(jù)的臨時(shí)驛站與加工流水線(xiàn)寄存器是一組觸發(fā)器通常是D觸發(fā)器的集合用于暫存二進(jìn)制數(shù)據(jù)。所有觸發(fā)器共享一個(gè)時(shí)鐘信號(hào)在時(shí)鐘沿同步地將輸入端數(shù)據(jù)存入。5.2.1 基本數(shù)據(jù)寄存器最簡(jiǎn)單的寄存器就是多個(gè)D觸發(fā)器并行連接共用時(shí)鐘和復(fù)位端。當(dāng)時(shí)鐘沿到來(lái)n位輸入數(shù)據(jù)被同時(shí)存入n個(gè)觸發(fā)器并從Q端輸出。它是CPU中通用寄存器、內(nèi)存接口緩沖器等的基本單元。5.2.2 移位寄存器串并轉(zhuǎn)換與數(shù)據(jù)延遲的神器移位寄存器是寄存器的一種特殊工作模式。除了存儲(chǔ)它還能在時(shí)鐘控制下將數(shù)據(jù)向左或向右移動(dòng)。串行輸入串行輸出可用于產(chǎn)生序列信號(hào)或?qū)崿F(xiàn)數(shù)據(jù)延遲一個(gè)信號(hào)經(jīng)過(guò)N級(jí)移位寄存器就延遲了N個(gè)時(shí)鐘周期。串行輸入并行輸出這是“串并轉(zhuǎn)換”的核心用于將一根數(shù)據(jù)線(xiàn)上串行傳送的數(shù)據(jù)轉(zhuǎn)換為多根線(xiàn)上并行數(shù)據(jù)大大提高了數(shù)據(jù)吞吐效率。USB、SPI等串行通信的接收端本質(zhì)上就是一個(gè)移位寄存器。并行輸入串行輸出“并串轉(zhuǎn)換”作用相反常用于通信發(fā)送端。雙向移位寄存器既能左移又能右移功能更靈活。實(shí)戰(zhàn)應(yīng)用用移位寄存器實(shí)現(xiàn)序列檢測(cè)還記得我們之前設(shè)計(jì)的“1101”序列檢測(cè)器嗎除了用狀態(tài)機(jī)還可以用一個(gè)4位移位寄存器來(lái)實(shí)現(xiàn)。將串行數(shù)據(jù)X依次移入寄存器每個(gè)時(shí)鐘周期比較寄存器中的4位歷史數(shù)據(jù)是否等于“1101”。這種方法思路直白但不夠靈活且延遲固定。狀態(tài)機(jī)方法更通用、更節(jié)省資源是更優(yōu)的選擇。6. 時(shí)序電路設(shè)計(jì)的核心挑戰(zhàn)時(shí)序約束與亞穩(wěn)態(tài)當(dāng)你把電路圖設(shè)計(jì)好在仿真器里跑通以為大功告成時(shí)真正的挑戰(zhàn)才剛剛開(kāi)始——將設(shè)計(jì)放到真實(shí)的硬件中運(yùn)行。這里有兩個(gè)你必須跨越的鴻溝時(shí)序約束和亞穩(wěn)態(tài)。6.1 建立時(shí)間與保持時(shí)間數(shù)字電路的物理法則這是時(shí)序邏輯電路尤其是同步電路必須遵守的鐵律。它們描述了觸發(fā)器數(shù)據(jù)輸入端D相對(duì)于時(shí)鐘沿的穩(wěn)定性要求。建立時(shí)間在時(shí)鐘有效沿如上升沿到來(lái)之前數(shù)據(jù)輸入端D的信號(hào)必須已經(jīng)穩(wěn)定保持的最小時(shí)間記為T(mén)_{su}。保持時(shí)間在時(shí)鐘有效沿到來(lái)之后數(shù)據(jù)輸入端D的信號(hào)必須繼續(xù)穩(wěn)定保持的最小時(shí)間記為T(mén)_h。違反這兩個(gè)時(shí)間要求觸發(fā)器就可能進(jìn)入一種可怕的中間狀態(tài)——亞穩(wěn)態(tài)導(dǎo)致輸出既不是0也不是1或者需要極長(zhǎng)的時(shí)間才能穩(wěn)定到一個(gè)確定值造成后續(xù)邏輯誤判。如何滿(mǎn)足時(shí)序要求這涉及到數(shù)字系統(tǒng)設(shè)計(jì)的核心時(shí)序分析。在一個(gè)同步系統(tǒng)中數(shù)據(jù)從一個(gè)觸發(fā)器FF1發(fā)出經(jīng)過(guò)組合邏輯電路產(chǎn)生延遲T_{comb}傳遞到下一個(gè)觸發(fā)器FF2的D端。這個(gè)路徑必須滿(mǎn)足建立時(shí)間約束T_{clk} - T_{skew} ≥ T_{comb} T_{su}。其中T_clk是時(shí)鐘周期T_skew是時(shí)鐘偏移。這意味著組合邏輯的延遲不能太大否則數(shù)據(jù)跑得慢趕不上下一個(gè)時(shí)鐘沿的“采樣窗口”。保持時(shí)間約束T_{cd} ≥ T_h。其中T_cd是時(shí)鐘路徑和組合邏輯的最小延遲 contamination delay。這意味著數(shù)據(jù)不能變化得太快否則新數(shù)據(jù)把舊數(shù)據(jù)沖掉了在采樣窗口后沒(méi)能保持住。在FPGA設(shè)計(jì)中綜合和布局布線(xiàn)工具會(huì)根據(jù)你設(shè)定的時(shí)鐘頻率自動(dòng)進(jìn)行時(shí)序分析并報(bào)告是否存在“建立時(shí)間違例”或“保持時(shí)間違例”。出現(xiàn)違例你就需要優(yōu)化代碼如插入流水線(xiàn)寄存器來(lái)切割長(zhǎng)組合邏輯路徑、降低時(shí)鐘頻率或調(diào)整布局約束。6.2 亞穩(wěn)態(tài)無(wú)法消除只能管理即使你滿(mǎn)足了建立和保持時(shí)間亞穩(wěn)態(tài)也無(wú)法絕對(duì)避免。因?yàn)樾盘?hào)在跳變時(shí)如果剛好在時(shí)鐘沿附近滿(mǎn)足觸發(fā)器的內(nèi)部反饋平衡點(diǎn)就會(huì)引發(fā)亞穩(wěn)態(tài)。亞穩(wěn)態(tài)的后果是輸出在較長(zhǎng)時(shí)間內(nèi)處于中間電平或者產(chǎn)生振蕩。亞穩(wěn)態(tài)的傳遞與危害 一個(gè)觸發(fā)器的亞穩(wěn)態(tài)輸出會(huì)被后續(xù)的觸發(fā)器當(dāng)作輸入。如果這個(gè)亞穩(wěn)態(tài)信號(hào)在下一個(gè)觸發(fā)器的建立/保持時(shí)間窗口內(nèi)還沒(méi)有穩(wěn)定下來(lái)就會(huì)導(dǎo)致亞穩(wěn)態(tài)的級(jí)聯(lián)傳播最終使系統(tǒng)產(chǎn)生不可預(yù)測(cè)的錯(cuò)誤。應(yīng)對(duì)亞穩(wěn)態(tài)的工程方法同步器這是最常用、最有效的方法。對(duì)于來(lái)自異步時(shí)鐘域的信號(hào)比如一個(gè)按鍵輸入不能直接接入系統(tǒng)時(shí)鐘域。標(biāo)準(zhǔn)的做法是使用兩級(jí)或多級(jí)D觸發(fā)器進(jìn)行同步。第一級(jí)觸發(fā)器很可能進(jìn)入亞穩(wěn)態(tài)但給予一個(gè)完整的時(shí)鐘周期時(shí)間其輸出有很大概率在第二級(jí)觸發(fā)器采樣前穩(wěn)定下來(lái)。兩級(jí)同步器能將亞穩(wěn)態(tài)失效的概率降低幾個(gè)數(shù)量級(jí)。// 典型的雙觸發(fā)器同步器 Verilog代碼 always (posedge clk or posedge rst) begin if (rst) begin sync_reg1 1b0; sync_reg2 1b0; end else begin sync_reg1 async_input; // 第一級(jí)可能亞穩(wěn)態(tài) sync_reg2 sync_reg1; // 第二級(jí)大概率穩(wěn)定 end end // 使用 sync_reg2 作為同步化后的信號(hào)降低時(shí)鐘頻率給信號(hào)傳輸和穩(wěn)定留出更多時(shí)間。使用更快的工藝更先進(jìn)的工藝節(jié)點(diǎn)觸發(fā)器的亞穩(wěn)態(tài)恢復(fù)時(shí)間更短。血的教訓(xùn)我早期做一個(gè)FPGA項(xiàng)目需要檢測(cè)一個(gè)外部傳感器的脈沖。我偷懶直接把傳感器信號(hào)接到了我的狀態(tài)機(jī)上。在實(shí)驗(yàn)室測(cè)試一切正常但一到現(xiàn)場(chǎng)設(shè)備就偶爾出現(xiàn)死機(jī)或計(jì)數(shù)錯(cuò)誤。排查了很久最后用邏輯分析儀抓信號(hào)發(fā)現(xiàn)傳感器信號(hào)和FPGA時(shí)鐘是異步的偶爾在時(shí)鐘沿附近變化導(dǎo)致了亞穩(wěn)態(tài)傳播進(jìn)了狀態(tài)機(jī)使其跑飛。加上一個(gè)兩級(jí)同步器后問(wèn)題徹底解決。這個(gè)坑讓我永遠(yuǎn)記住了凡是來(lái)自不同時(shí)鐘域的信號(hào)必須同步?jīng)]有例外。7. 有限狀態(tài)機(jī)時(shí)序邏輯設(shè)計(jì)的靈魂模式有限狀態(tài)機(jī)是描述和控制時(shí)序邏輯系統(tǒng)最強(qiáng)大、最清晰的工具。它將一個(gè)系統(tǒng)抽象為有限個(gè)狀態(tài)以及在這些狀態(tài)之間轉(zhuǎn)移的條件和動(dòng)作。前面設(shè)計(jì)的序列檢測(cè)器就是一個(gè)FSM。7.1 米利型與摩爾型輸出時(shí)序的差異這是FSM的兩種基本模型區(qū)別在于輸出的產(chǎn)生方式摩爾型輸出僅與當(dāng)前狀態(tài)有關(guān)。這意味著輸出會(huì)在狀態(tài)改變后立即經(jīng)過(guò)組合邏輯延遲更新并且在一個(gè)狀態(tài)周期內(nèi)保持穩(wěn)定。輸出與輸入異步但相對(duì)時(shí)鐘同步。米利型輸出與當(dāng)前狀態(tài)和當(dāng)前輸入都有關(guān)系。這意味著即使?fàn)顟B(tài)不變輸入變化也可能立即引起輸出變化。選擇指南優(yōu)先選擇摩爾型輸出穩(wěn)定沒(méi)有因輸入毛刺而產(chǎn)生的輸出毛刺設(shè)計(jì)更簡(jiǎn)單時(shí)序分析更容易。大多數(shù)情況下摩爾型是首選。當(dāng)需要快速響應(yīng)輸入時(shí)選擇米利型例如設(shè)計(jì)一個(gè)串行數(shù)據(jù)的“邊沿檢測(cè)”電路當(dāng)檢測(cè)到輸入上升沿時(shí)輸出一個(gè)時(shí)鐘周期寬的高脈沖。用摩爾型實(shí)現(xiàn)需要兩個(gè)狀態(tài)輸出會(huì)晚一個(gè)周期用米利型可以在輸入變化的同一個(gè)周期內(nèi)就產(chǎn)生輸出脈沖。7.2 三段式狀態(tài)機(jī)寫(xiě)法清晰、安全、可綜合在硬件描述語(yǔ)言中推薦使用“三段式”風(fēng)格來(lái)描述狀態(tài)機(jī)。以Verilog為例它將狀態(tài)機(jī)的描述分為三個(gè)獨(dú)立的always塊狀態(tài)寄存器時(shí)序邏輯負(fù)責(zé)在時(shí)鐘沿進(jìn)行狀態(tài)切換。always (posedge clk or posedge rst) begin if (rst) current_state IDLE; else current_state next_state; end次態(tài)邏輯組合邏輯根據(jù)當(dāng)前狀態(tài)和輸入決定下一個(gè)狀態(tài)是什么。always (*) begin next_state current_state; // 默認(rèn)保持現(xiàn)態(tài) case (current_state) IDLE: if (start) next_state WORK; WORK: if (done) next_state IDLE; default: next_state IDLE; endcase end輸出邏輯組合邏輯或時(shí)序邏輯根據(jù)當(dāng)前狀態(tài)摩爾型或當(dāng)前狀態(tài)和輸入米利型產(chǎn)生輸出。// 摩爾型輸出 always (*) begin case (current_state) IDLE: {out1, out2} 2b00; WORK: {out1, out2} 2b10; default: {out1, out2} 2b00; endcase end為什么推薦三段式清晰三個(gè)過(guò)程各司其職結(jié)構(gòu)一目了然。安全避免了在組合邏輯always塊中對(duì)同一變量既讀又寫(xiě)可能導(dǎo)致的仿真與綜合不匹配的問(wèn)題。易于綜合和優(yōu)化綜合工具可以很好地對(duì)每個(gè)部分進(jìn)行優(yōu)化。時(shí)序邏輯電路是數(shù)字系統(tǒng)的筋骨與靈魂。從記憶一比特的觸發(fā)器到構(gòu)成復(fù)雜計(jì)算核心的狀態(tài)機(jī)每一步都蘊(yùn)含著對(duì)“時(shí)間”和“狀態(tài)”的精密控制。理解并掌握它你才真正走進(jìn)了動(dòng)態(tài)數(shù)字世界的大門(mén)。紙上得來(lái)終覺(jué)淺絕知此事要躬行。最好的學(xué)習(xí)方式就是動(dòng)手用Verilog/VHDL描述一個(gè)狀態(tài)機(jī)然后用仿真工具如ModelSim觀察每一個(gè)時(shí)鐘沿下?tīng)顟B(tài)和信號(hào)的變化再把它下載到FPGA開(kāi)發(fā)板上用LED或數(shù)碼管驗(yàn)證其行為。當(dāng)你看到自己設(shè)計(jì)的計(jì)數(shù)器規(guī)律地閃爍序列檢測(cè)器對(duì)特定的按鍵序列做出響應(yīng)時(shí)那種成就感是任何理論都無(wú)法替代的。

相關(guān)新聞

軟件設(shè)計(jì)師備考全攻略:從知識(shí)體系構(gòu)建到實(shí)戰(zhàn)應(yīng)試技巧

軟件設(shè)計(jì)師備考全攻略:從知識(shí)體系構(gòu)建到實(shí)戰(zhàn)應(yīng)試技巧

1. 備考緣起與核心價(jià)值最近幾年,身邊不少朋友和同事都在討論“軟考”,尤其是中級(jí)資格的《軟件設(shè)計(jì)師》。有人是為了職稱(chēng)評(píng)定,有人是為了積分落戶(hù),也有人純粹是想系統(tǒng)梳理一下自己的知識(shí)體系,給職業(yè)生涯加個(gè)“官方認(rèn)證”…

2026/7/29 5:36:05 閱讀更多
跨境支付系統(tǒng)架構(gòu)演進(jìn):從SWIFT到本地化清算通道

跨境支付系統(tǒng)架構(gòu)演進(jìn):從SWIFT到本地化清算通道

背景:跨境支付為什么這么慢?做過(guò)跨境支付系統(tǒng)開(kāi)發(fā)的工程師應(yīng)該都有體會(huì)——一筆從國(guó)內(nèi)到海外的資金,動(dòng)輒3到5個(gè)工作日才能到賬。問(wèn)題不出在銀行系統(tǒng)慢,出在底層架構(gòu)上。傳統(tǒng)跨境支付走的是SWIFT網(wǎng)絡(luò)。資金從匯款行出發(fā)&#xff0c…

2026/7/29 5:36:05 閱讀更多
【AI物流優(yōu)化實(shí)戰(zhàn)手冊(cè)】:20年物流算法專(zhuān)家親授5大落地場(chǎng)景+3個(gè)避坑指南

【AI物流優(yōu)化實(shí)戰(zhàn)手冊(cè)】:20年物流算法專(zhuān)家親授5大落地場(chǎng)景+3個(gè)避坑指南

更多請(qǐng)點(diǎn)擊: https://kaifayun.com 第一章:AI物流優(yōu)化的核心價(jià)值與演進(jìn)脈絡(luò) 人工智能正深度重塑全球供應(yīng)鏈的運(yùn)行邏輯。在物流領(lǐng)域,AI不再僅是效率提升的輔助工具,而是驅(qū)動(dòng)網(wǎng)絡(luò)協(xié)同、動(dòng)態(tài)決策與韌性構(gòu)建的戰(zhàn)略中樞。其核心價(jià)值體…

2026/7/29 10:46:25 閱讀更多
REFRAG技術(shù)突破:16倍上下文窗口提升RAG性能

REFRAG技術(shù)突破:16倍上下文窗口提升RAG性能

1. 項(xiàng)目背景:RAG技術(shù)的瓶頸與突破去年在部署企業(yè)級(jí)知識(shí)庫(kù)系統(tǒng)時(shí),我們團(tuán)隊(duì)曾為RAG(Retrieval-Augmented Generation)的上下文窗口限制頭疼不已。傳統(tǒng)方案中,即便使用Llama 2-70B這樣的頂級(jí)模型,其4k tokens的…

2026/7/29 10:46:25 閱讀更多
為什么90%的定制音色上線(xiàn)即翻車(chē)?深度拆解聲學(xué)對(duì)齊誤差超±3.7ms的5重歸因

為什么90%的定制音色上線(xiàn)即翻車(chē)?深度拆解聲學(xué)對(duì)齊誤差超±3.7ms的5重歸因

更多請(qǐng)點(diǎn)擊: https://kaifayun.com 第一章:為什么90%的定制音色上線(xiàn)即翻車(chē)?深度拆解聲學(xué)對(duì)齊誤差超3.7ms的5重歸因 聲學(xué)對(duì)齊誤差是語(yǔ)音合成系統(tǒng)中最具隱蔽性卻最致命的性能瓶頸。當(dāng)定制音色在真實(shí)業(yè)務(wù)場(chǎng)景中出現(xiàn)“口型不同步”“語(yǔ)調(diào)斷裂”或…

2026/7/29 10:46:25 閱讀更多
SecureCRT 完整使用教程:從下載安裝到SSH連接與串口配置

SecureCRT 完整使用教程:從下載安裝到SSH連接與串口配置

前言 SecureCRT 是 VanDyke Software 開(kāi)發(fā)的終端仿真器,支持 SSH、Telnet、Serial 等多種協(xié)議,廣泛應(yīng)用于網(wǎng)絡(luò)設(shè)備管理和 Linux 服務(wù)器運(yùn)維。本文覆蓋從下載安裝到 SSH/串口連接、會(huì)話(huà)管理、License 激活的完整流程,并附 SecureCRT vs PuTTY…

2026/7/29 10:46:25 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過(guò)程中,發(fā)現(xiàn)一個(gè)問(wèn)題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過(guò)來(lái)的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂(lè)應(yīng)用,模擬了真實(shí)擲骰子的過(guò)程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫(huà)效果?!?/p>

2026/7/29 0:15:24 閱讀更多