Verilog教程邏輯部分北京至芯科技FPGA培訓課件_第1頁
Verilog教程邏輯部分北京至芯科技FPGA培訓課件_第2頁
Verilog教程邏輯部分北京至芯科技FPGA培訓課件_第3頁
Verilog教程邏輯部分北京至芯科技FPGA培訓課件_第4頁
Verilog教程邏輯部分北京至芯科技FPGA培訓課件_第5頁
已閱讀5頁,還剩64頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

數字系統(tǒng)設計的核心知識

復雜數字系統(tǒng)的構成;基本電路和Verilog的對應關系;同步有限狀態(tài)機在電路中的作用;時鐘樹與自動綜合技術數字邏輯電路的構成

-組合邏輯:輸出只是輸入邏輯電平的函數(有延時),與電路的原始狀態(tài)無關。時序邏輯:輸出不只是輸入的邏輯電平的函數,還與電路所處的狀態(tài)有關。同步時序邏輯是在同一時鐘跳變節(jié)拍的前提下,如輸入條件滿足,則進入下一狀態(tài),否則仍留在原來的狀態(tài)的狀態(tài)機。數字邏輯電路的構成組合邏輯:由與、或、非門組成的網絡。常用的有:多路器、數據通路開關、加法器、乘法器等,沒有記憶功能。時序邏輯:

由多個觸發(fā)器和多個組合邏輯塊組成的網絡。常用的有:計數器、復雜的數據流動控制邏輯、運算控制邏輯、指令分析和操作控制邏輯。同步時序邏輯的設計是設計復雜的數字邏輯系統(tǒng)的核心。存儲器和寄存器:用于暫時存儲數據信息。一個八位數據通路控制器的波形:

in[7:0]開關out[7:0]tt31

0215

3262

88

0215

320000in[7]ControlSwitchout[7]in[0]out[0]…...…...帶寄存器的八位數據通路控制器的波形in[7]ControlSwitchout[7]CLOCKDQ[7]CLOCKin[0]ControlSwitchout[0]DQ[0]out[7]out[0]帶寄存器的八位數據通路控制器的Verilog描述`defineON1‘b1`defineOFF1‘b0wireControlSwitch;wireclockwire[7:0]out,in;always@(posedgeclock)if(ControlSwith==`ON)out<=in;elseout<=out;具有并行置數和使能控制輸入的移位寄存器R1enawclockDQQresetQ1DQQ0R0load具有并行置數和使能控制輸入的移位寄存器moduleshiftregs(R,load,ena,w,clock,Q,reset);input[3:0]R;inputw,load,ena,reset,clock;output[3:0]Q;reg[3:0]Q;integerk;always@(posedgeclockornegedgereset)if(!reset)Q<=0;elseif(load)Q<=R;elseif(ena)beginQ[0]<=W;for(k=1;k<4;k+1)Q[k]<=Q[k-1];endendmodule組合邏輯舉例之二:

一個八位三態(tài)數據通路控制器`defineON1‘b1`defineOFF1‘b0wireLinkBusSwitch;wire[7:0]outbuf;inout[7:0]bus;assignbus=(LinkBusSwitch==`ON)?outbuf:8‘hzz…...…...outbuf[7]LinkBusSwitchbus[7]靜態(tài)隨機存儲器(SRAM)

Sel信號必須維持一定時間,直到經過兩個反向器傳遞過來的Data信號可以自動保持;

Data的驅動能力必須大于小反向器的驅動能力;用的三極管很少,可以把密度做得很高。SelData靜態(tài)隨機存儲器(SRAM)陣列Sel0Data[0]Sel1Data[1]地址譯碼和SRAM塊的讀寫DataoutputAddressAm-1A1A0Am-2writereadDatainputsel0sel1Sel2m-2Sel2m-1地址譯碼器開關邏輯應用舉例

寄存器間數據流動的控制開關clock開關S5

寄存器Cqd開關S6開關S3

寄存器Bqd開關S4開關S1

寄存器Aqd開關S2開關邏輯的時延問題

控制數據運算和流動的開關的開啟和關閉時序.

組合邏輯輸出控制開關Sn

in[7:0]out[15:0]in[7:0]

8‘d31

8‘d202

16‘d93

16‘d606延時10nsSn開關out[15:0]ttt全局時鐘網和平衡樹結構全局時鐘網絡觸發(fā)器緩沖器

觸發(fā)器1觸發(fā)器n圖1全局時鐘網示意圖

圖2平衡樹結構示意圖避免冒險和競爭與流水線組合邏輯和布線的延遲在組合邏輯中的疊加ba#2#3#4cedba#2#3#4ced總延遲=Max{2,3}+4=7時鐘周期必須>7ns總延遲={Max{2,3}+4+1}=8時鐘周期必須>4ns總處理數據的吞吐量增加#1#1clock為什么要設計有限狀態(tài)機?

如果能嚴格以時鐘跳變沿為前提,按排好時時序,來操作邏輯系統(tǒng)中每一個開關Si,則系統(tǒng)中數據的流動和處理會按同一時鐘節(jié)拍有序地進行,可以控制冒險和競爭現象對邏輯運算的破壞,時延問題就能有效地加以解決。利用同步有限狀態(tài)機就能產生復雜的以時鐘跳變沿為前提的同步時序邏輯,并提供操作邏輯系統(tǒng)的開關陣列所需要的復雜控制時序(具有信號互鎖和先后次序等要求的)。為什么要設計有限狀態(tài)機?如果我們能設計這樣一個電路:1)能記住自己目前所處的狀態(tài);2)狀態(tài)的變化只可能在同一個時鐘的跳變沿時刻發(fā)生,而不可能發(fā)生在任意時刻;3)在時鐘跳變沿時刻,如輸入條件滿足,則進入下一狀態(tài),并記住自己目前所處的狀態(tài),否則仍保留原來的狀態(tài);4)在進入不同的狀態(tài)時刻,對系統(tǒng)的開關陣列做開啟或關閉的操作。為什么要設計有限狀態(tài)機?

有了以上電路,我們就不難設計出復雜的控制序列來操縱數字系統(tǒng)的控制開關陣列。能達到以上要求的電路就是時序和組合電路互相結合的產物:同步有限狀態(tài)機和由狀態(tài)和時鐘共同控制的開關邏輯陣列。我們只要掌握有限狀態(tài)機的基本設計方法,加上對基本電路的掌握,再加上對數據處理的過程的細致了解,我們就可以避免由于邏輯器件和布線延遲產生的冒險競爭現象所造成的破壞,設計出符合要求的復雜數字邏輯系統(tǒng)。數字系統(tǒng)的構成示意圖同步有限狀態(tài)機ena_2ena_3ena_nena_1clock組合邏輯1寄存器組組合邏輯2寄存器組組合邏輯3寄存器組組合邏輯N寄存器組input_1input_2input_nMealy狀態(tài)機

下一個狀態(tài)=F(當前狀態(tài),輸入信號);

輸出信號=G(當前狀態(tài),輸入信號);

圖1.時鐘同步的狀態(tài)機結構(Mealy狀態(tài)機)下一狀態(tài)的邏輯F輸出邏輯G狀態(tài)寄存器時鐘信號clkclk輸入輸入輸出當前狀態(tài)激勵信號

Moor狀態(tài)機

下一個狀態(tài)=F(當前狀態(tài),輸入信號)

輸出信號=G(當前狀態(tài));

下一狀態(tài)的邏輯F輸出邏輯G狀態(tài)寄存器時鐘信號clkclk輸入輸入輸出當前狀態(tài)激勵信號圖2.時鐘同步的狀態(tài)機結構(Moor狀態(tài)機)

帶流水線輸出的Mealy狀態(tài)機

下一個狀態(tài)=F(當前狀態(tài),輸入信號);

輸出信號=G(當前狀態(tài),輸入信號);

輸出圖3帶流水線輸出的Mealy狀態(tài)機下一狀態(tài)的邏輯F輸出邏輯G狀態(tài)寄存器時鐘信號clkclk輸入輸入當前狀態(tài)激勵信號輸出流水線寄存器

clk輸入簡單的狀態(tài)機設計舉例狀態(tài)轉移圖表示RTL級可綜合的Verilog

模塊表示有限狀態(tài)機的圖形表示圖形表示:狀態(tài)、轉移、條件和邏輯開關圖3.4狀態(tài)轉移圖Idle

Start

StopClear

A/K1=0

!AA/K2=1

!Reset/K2=0K1=0!Reset/K2=0K1=0

(!Reset|!A)/K2=0K1=1!Reset/K2=0K1=0有限狀態(tài)機的Verilog描述定義模塊名和輸入輸出端口;定義輸入、輸出變量或寄存器;定義時鐘和復位信號;定義狀態(tài)變量和狀態(tài)寄存器;用時鐘沿觸發(fā)的always塊表示狀態(tài)轉移過程;在復位信號有效時給狀態(tài)寄存器賦初始值;描述狀態(tài)的轉換過程:符合條件,從一個狀態(tài)到另外一個狀態(tài),否則留在原狀態(tài);驗證狀態(tài)轉移的正確性,必須完整和全面。表示方法之一modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;//定義時鐘、復位和輸入信號outputK2,K1;//定義輸出控制信號的端口regK2,K1;//定義輸出控制信號的寄存器reg[1:0]state;

//定義狀態(tài)寄存器parameterIdle=2’b00,Start=2’b01,Stop=2’b10,Clear=2’b11;//定義狀態(tài)變量參數值always@(posedgeClock)if(!Reset)begin//定義復位后的初始狀態(tài)和輸出值state<=Idle;K2<=0;K1<=0;end表示方法之一(續(xù))elsecase(state)Idle:beginif(A)beginstate<=Start;K1<=0;endelsestate<=Idle;endStart:beginif(!A)state<=Stop;elsestate<=Start;end表示方法之一(續(xù))

Stop:begin//符合條件進入新狀態(tài),否則留在原狀態(tài)if(A)beginstate<=Clear;K2<=1;endelsestate<=Stop;endClear:beginif(!A)beginstate<=Idle;K2<=0;K1<=1;endelsestate<=Clear;endendcaseendmodule

表示方法之二我們還可以用另一個VerilogHDL模型來表示同一個有限狀態(tài),見下例。(用可綜合的Verilog模塊設計用獨熱碼表示狀態(tài)的狀態(tài)機)

modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[3:0]state;

parameterIdle=4’b1000,Start=4’b0100,Stop=4’b0010,Clear=4’b0001;

表示方法之二(續(xù))always@(posedgeclock)if(!Reset)beginstate<=Idle;K2<=0;K1<=0;endelsecase(state)Idle:if(A)beginstate<=Start;K1<=0;endelsestate<=Idle;

表示方法之二(續(xù))

Start:if(!A)state<=Stop;elsestate<=Start;Stop:if(A)beginstate<=Clear;K2<=1;endelsestate<=Stop;Clear:if(!A)beginstate<=Idle;K2<=0;K1<=1;endelsestate<=Clear;表示方法之二(續(xù))

default:state<=Idle;endcaseendmodule

[例2]與[例1]的主要不同點是狀態(tài)編碼,[例2]采用了獨熱編碼,而[例1]則采用Gray碼,究竟采用哪一種編碼好要看具體情況而定。

表示方法之三

在比較復雜的狀態(tài)機設計過程中,我們往往把狀態(tài)的變化與輸出開關的控制分成兩部分來考慮。就象前面講過的Mealy狀態(tài)機輸出部分的組合邏輯。為了調試方便,還常常把每一個輸出開關寫成一個個獨立的always組合塊。在調試多輸出狀態(tài)機時,這樣做比較容易發(fā)現問題和改正模塊編寫中出現的問題。建議同學們在設計復雜的多輸出狀態(tài)機時采用下面的風格舉例,說明如下:

表示方法之三(續(xù))modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[1:0]state,nextstate;

parameterIdle=2'b00,Start=2'b01,Stop=2'b10,Clear=2'b11;表示方法之三(續(xù))

//--------每一個時鐘沿產生一次可能的狀態(tài)變化-----------always@(posedgeClock)beginif(!Reset)state<=Idle;elsestate<=nextstate;end//-------------------------------------------------------表示方法之三(續(xù))//------產生下一狀態(tài)的組合邏輯-------------------------

always@(stateorA)case(state)Idle:if(A)nextstate=Start;elsenextstate=Idle;Start:if(!A)nextstate=Stop;elsenextstate=Start;Stop:if(A)nextstate=Clear;elsenextstate=Stop;Clear:if(!A)nextstate=Idle;elsenextstate=Clear;default:nextstate=2'bxx;endcase表示方法之三(續(xù))//----產生輸出K1的組合邏輯--------------always@(stateorResetorA)if(!Reset)K1=0;elseif(state==Clear&&!A)//從Clear轉向IdleK1=1;elseK1=0;

//---產生輸出K2的組合邏輯---------------always@(stateorResetorA)if(!Reset)K2=0;elseif(state==Stop&&A)//從Stop轉向ClearK2=1; elseK2=0;//------------------------------------------endmodule

表示方法之四

用輸出指定的碼表示狀態(tài)的狀態(tài)機

方法四采用了另一種方法:直接把狀態(tài)碼定義為輸出。也就是把狀態(tài)碼的指定與狀態(tài)機控制的輸出聯系起來,把狀態(tài)的變化直接用作輸出,這樣做可以提高輸出信號的開關速度并節(jié)省電路器件。這種設計方法常用在高速狀態(tài)機中。建議同學們在設計高速狀態(tài)機時采用方法四的風格。例中state[3]和state[0]分別表示前面兩個例子中的輸出K2和K1。表示方法之四(續(xù))modulefsm(Clock,Reset,A,K2,K1,state);inputClock,Reset,A;outputK2,K1;output[4:0]state;reg[4:0]state;

assignK2=state[4];//把狀態(tài)變量的最高位用作輸出K2assignK1=state[0];//把狀態(tài)變量的最低位用作輸出K1表示方法之四(續(xù))parameter//-------outputcodedstateassignment---//--------K2_i_j_n_K1–Idle=5'b0_0_0_0_0,Start=5'b0_0_0_1_0,Stop=5'b0_0_1_0_0,StopToClear=5'b1_1_0_0_0,Clear=5'b0_1_0_1_0,ClearToIdle=5'b0_0_1_1_1;

表示方法之四(續(xù))

always@(posedgeClock)if(!Reset)beginstate<=Idle;endelsecase(state)Idle:if(A)state<=Start;elsestate<=Idle;

Start:if(!A)state<=Stop;elsestate<=Start;

表示方法之四(續(xù))Stop:if(A)state<=StopToClear;elsestate<=Stop;StopToClear:state<=Clear;Clear:if(!A)state<=ClearToIdle;elsestate<=Clear;

ClearToIdle:state<=Idle;

default:state<=Idle;endcaseendmodule狀態(tài)機的測試不同風格的描述適合不同規(guī)模的狀態(tài)機和不同的綜合工具,有的風格查錯和修改較容易,但寫簡單的狀態(tài)機時比較麻煩。Synopsys公司的綜合器建議使用這種風格來描述狀態(tài)機。

上面四個例子是同一個狀態(tài)機的四種不同的VerilogHDL模型,它們都是可綜合的,在設計復雜程度不同的狀態(tài)機時有它們各自的優(yōu)勢。如用不同的綜合器對這四個例子進行綜合,綜合出的邏輯電路可能會有些不同,但邏輯功能是相同的。下面列出測試這些不同風格狀態(tài)機的測試模塊,供同學們參考:

狀態(tài)機的測試模塊`timescale1ns/1nsmodulet;rega;regclock,rst;wirek2,k1;initial//initial常用于仿真時信號的給出。begina=0;rst=1;//給復位信號變量賦初始值clock=0;//給時鐘變量賦初始值#22rst=0;//使復位信號有效#133rst=1;//經過一個多周期后使復位信號無效end

狀態(tài)機的測試模塊

always#50clock=~clock;//產生周期性的時鐘

always@(posedgeclock)//在每次時鐘正跳變沿時刻產生不同的abegin#30a={$random}%2;//每次a是0還是1是隨機的。#(3*50+12);//a的值維持一段時間endinitialbegin#100000$stop;end//系統(tǒng)任務,暫停仿真以便觀察仿真波形。

//-----------調用被測試模塊t.m----------fsmm(.Clock(clock),.Reset(rst),.A(a),.K2(k2),.K1(k1));

endmodule

狀態(tài)機設計的總結:有限狀態(tài)機設計的一般步驟:

1)

邏輯抽象,得出狀態(tài)轉換圖

2)

狀態(tài)化簡

3)

狀態(tài)分配在觸發(fā)器資源豐富的FPGA或ASIC設計中采用獨熱編碼(one-hot-coding)既可以使電路性能得到保證又可充分利用其觸發(fā)器數量多的優(yōu)勢,也可以采取輸出編碼的狀態(tài)指定來簡化電路結構,并提高狀態(tài)機的運行速度。

4)選定觸發(fā)器的類型并求出狀態(tài)方程、驅動方程和輸出方程。

5)

按照方程得出邏輯圖狀態(tài)機設計的總結:

用VerilogHDL來描述有限狀態(tài)機,可以充分發(fā)揮硬件描述語言的抽象建模能力,使用always塊語句和case(if)等條件語句及賦值語句即可方便地實現。具體的邏輯化簡及邏輯電路到觸發(fā)器映射均可由計算機自動完成,上述設計步驟中的第2步及4、5步不再需要很多的人為干預,使電路設計工作得到簡化,效率也有很大的提高。邏輯電路的測試故障模型測試集合的復雜性路徑的激活樹狀結構的電路隨機測試時序電路的測試電路內部自測試(Build-inSelf-Test)線路板的測試邏輯電路的測試

故障模型信號無法變化的模型

信號w總是固定在0或1:stuck_at_0表示為:w/0stuck_at_1表示為:w/1單個故障和多個故障

把多個故障問題簡化為許多個單個故障問題來處理。CMOS電路的故障特點

晶體三極管的開路或短路:stuck_at_0或stuck_at_1復雜的情形,不定態(tài);組合邏輯變?yōu)闀r序邏輯的行為….邏輯電路的測試

測試集合的復雜性

想要知道模塊中a,b,c,d,f端中是否有電平不能變化的,需要測試信號w1,w2,w3的各種變化組合。最全的情況有8種,最少有四種:測試集合={001,010,011,100}w1fw2w3dbac邏輯電路的測試

測試路徑的激活(Sensitizing)

把w1端的變化直接傳到f端,必須把w2置1,w3置0,w4置1。這叫做從w1到f的路徑被激活。W3=0fW2=1w1bacW4=1邏輯電路的測試

樹狀結構的電路

最小測試集合的確定比較麻煩fW4

W1W4W2W2W3

W1W3 ̄W3 ̄ ̄ ̄掃描路徑的安排clockDQ

y3clockDQ

y2正常0/掃描1Dy1

Q組合邏輯電路111000掃描輸入

Y3

Y2

Y1······

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論