by yang
最近準(zhǔn)備數(shù)字IC崗時(shí)復(fù)習(xí)整理的知識(shí)點(diǎn),參考了比較火的fpga面試題壹瘟,和一些相關(guān)知識(shí)其障。主要是寫(xiě)著自己看著方便的达罗,有很多不嚴(yán)謹(jǐn)?shù)牡胤剑行┑胤接袇⒖兼溄泳哺眩切┎┛蛯?xiě)的都很好粮揉。
Part.4
三分頻:奇次數(shù)分頻,計(jì)數(shù)器★★
- 二分頻抚笔,每個(gè)上升沿讓q翻轉(zhuǎn)就可以了扶认。
- 三分頻,設(shè)置一個(gè)計(jì)數(shù)器殊橙,第①個(gè)上升沿和下降沿分別生成兩個(gè)占空比都為1/3的q1與q2辐宾,q1|q2進(jìn)行或運(yùn)算狱从,得到占空比為50%的三分頻輸出q。
在①和③上升沿翻轉(zhuǎn)叠纹,每個(gè)占空比(3-1)2T/1T,上升沿下降沿相與錯(cuò)開(kāi)0.5T季研,結(jié)果為-0.5T,得到1.5T誉察。
想要5/2T,就得到3T与涡,再減0.5T。就是1,4持偏,或2,5計(jì)數(shù)驼卖。其他奇數(shù)次分頻同理。
三分頻.png
具體代碼就不放了鸿秆,我做過(guò)一個(gè)公司的筆試題是現(xiàn)場(chǎng)寫(xiě)三分頻代碼和異步FIFO代碼的酌畜,這兩個(gè)應(yīng)該好好掌握。如果是面試的話(huà)要能說(shuō)明白實(shí)現(xiàn)的原理就可以卿叽。
狀態(tài)機(jī)問(wèn)題 ★★
FSM有限狀態(tài)機(jī)有兩大類(lèi):Mealy型和Moore型桥胞。
Moore型狀態(tài)機(jī)的輸出只與當(dāng)前狀態(tài)有關(guān),而Mealy型狀態(tài)機(jī)的輸出不僅取決于當(dāng)前狀態(tài)考婴,還受到輸入的直接控制埠戳,并且可能與狀態(tài)無(wú)關(guān)。
當(dāng)使用Verilog來(lái)描述一個(gè)簡(jiǎn)單狀態(tài)機(jī)的設(shè)計(jì)時(shí)蕉扮,應(yīng)將狀態(tài)寄存器的控制器的控制和狀態(tài)機(jī)狀態(tài)里的組合邏輯分開(kāi)整胃。
- 狀態(tài)編碼方式,獨(dú)熱碼
0100 0010
喳钟,寄存器資源豐富屁使,這樣好。 - 兩段式:①
state <= next;
專(zhuān)門(mén)切換下一狀態(tài)奔则;②用于定義每個(gè)state的操作和其next是啥(可以用阻塞賦值和組合邏輯)蛮寂。
優(yōu)點(diǎn)在于可以避免生成latch。 - 三段式:①
state <= next;
易茬;② 組合邏輯的方式判斷狀態(tài)轉(zhuǎn)移條件酬蹋、描述狀態(tài)轉(zhuǎn)移規(guī)律;③同步時(shí)序的方式描述每個(gè)狀態(tài)的輸出
狀態(tài)機(jī)模塊框圖.png
標(biāo)準(zhǔn)三段式one-hot碼狀態(tài)機(jī):
// synopsys state_vector state
reg [4:0] // synopsys enum code
CS, NS;
always @(posedge clk) begin //同步時(shí)序進(jìn)行狀態(tài)轉(zhuǎn)移
if (rst) begin
CS <= 5'd0;
CS[IDLE] <= 1'b1;
end
else begin
CS <= NS;
end
end
always @* begin //組合邏輯判斷狀態(tài)轉(zhuǎn)移條件抽莱,描述狀態(tài)轉(zhuǎn)移規(guī)律范抓,某某條件下NS應(yīng)該為啥
NS = 5'b0;
case (1'b1) // synopsys full_case parallel_case
CS[IDLE]: begin
if () //...
else if () //...
else NS[ERROR] = 1'b1;
end
CS[S1]: begin
if () //...
else if () //...
else NS[ERROR] = 1'b1;
end
......
CS[ERROR]: begin
if (restart) NS[IDLE] = 1'b1;
endcase
end
always @(posedge clk) begin //同步時(shí)序,描述每個(gè)狀態(tài)的輸出
if (rst) begin
// reset
end
else begin
// default output
case (1'b1)
NS[IDLE]: begin
// ...
end
......
NS[ERROR]: begin
// ...
end
endcase
end
end