版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
重慶電子工程職業(yè)學院1項目5設計基本數(shù)字單元5.1設計組合邏輯電路5.2設計時序邏輯電路5.3設計狀態(tài)機5.4設計存儲器
5.1設計組合邏輯電路組合邏輯在任何時刻的輸出僅決定于當時的輸入信號。傳統(tǒng)方法中,基本組合邏輯電路由普通邏輯門或者專用芯片完成,對于規(guī)模較大的數(shù)字電路設計來說既花費時間又浪費資源。采用Verilog可以從行為、功能上對器件描述,從而簡化設計。本節(jié)主要介紹運算電路、編碼/譯碼電路、數(shù)據(jù)選擇/比較電路及三態(tài)門等組合電路的Verilog描述。5.1.1設計運算電路常用的運算電路主要有加法器、減法器和乘法器,主要完成多位二進制數(shù)的算術運算。下面以加法器和乘法器為例進行說明。⒈半加器半加器有兩個二進制的輸入端a和b以及一位和輸出端s和一位進位輸出端co。半加器的網(wǎng)表電路圖如圖5-1所示。用Verilog語言描述半加器的程序如例5-1。圖5-1半加器網(wǎng)表電路圖【例5-1】:半加器modulehalfadder(a,b,s,co);inputa,b;//加數(shù)與被加數(shù)輸入outputs,co;//和與進位輸出assigns=a^b;assignco=a&b;endmodule
5.1設計組合邏輯電路⒉全加器⑴原理圖方式采用原理圖設計方法可以由兩個半加器構成一個全加器。具體方法為:建立名為f_adder的工程,使用例5-1中的半加器代碼新建文本輸入文件,通過編譯后執(zhí)行【File】【Creat/Update】【CreatSysbolFilesforCurrentFile】菜單命令,為半加器Verilog設計文件生成元件符號,然后新建原理圖文件,在原理圖中調(diào)用半加器與或門電路符號作相應電路連接。最終得到的全加器的電路如圖5-2所示。
圖5-2全加器的電路圖⑵HDL描述方式基于半加器的描述,若采用COMPONENT語句和PORTMAP語句就很容易編寫出描述全加器的程序。全加器的Verilog程序見例4-5。
5.1設計組合邏輯電路⒊多位加法器被加數(shù)a和加數(shù)b均為8位二進制數(shù),輸出s為9位(含進位輸出)?!纠?-2】:多位加法器moduleadder8bit(a,b,cin,s);input[7:0]a,b;inputcin;output[8:0]s;assigns=a+b+cin;//輸出中含進位輸出位endmodule
5.1設計組合邏輯電路⒋8位乘法器8位乘法器的元件符號如圖5-3所示,a[7..0]和b[7..0]是被乘數(shù)和乘數(shù)輸入端,q[0..15]是乘積輸出端。用Verilog描述的8位乘法器源程序見例5-3?!纠?-3】:8位乘法器modulemul(a,b,q);parameters=8;input[s-1:0]a,b;output[2*s-1:0]q;assignq=a*b;endmodule8位乘法器電路的仿真波形如圖5-4所示。
圖5-48位乘法器的仿真波形
5.1設計組合邏輯電路5.1.2設計編碼器編碼器是將2N個分離的信息代碼以N個二進制碼來表示,常運用于影音壓縮或通信方面,以達到精簡傳輸量的目的。可以將編碼器看成壓縮電路,譯碼起看成解壓縮電路。傳送數(shù)據(jù)前先用編碼器壓縮數(shù)據(jù)后再傳送出去,在接收端則由譯碼器將數(shù)據(jù)解壓縮,還原其原來的數(shù)據(jù)。這樣,在傳送過程中,就可以以N個數(shù)碼來代替2N個數(shù)碼的數(shù)據(jù)量,來提升傳輸效率。⒈一般編碼器設計如果沒有特別說明,各編碼輸入端無優(yōu)先區(qū)別。圖5-5是8-3編碼器的外部端口圖,有了外部端口圖,就能夠進行ENTITY的定義,再根據(jù)表5-1所示的編碼器真值表,使用查表法就可以輕松描述結構體了。
5.1設計組合邏輯電路圖5-58-3編碼器外部端口示意圖表
5-1
8-3編碼器的真值表輸入二進制編碼輸出a0a1a2a3a4a5a6a7y2y1y01111111011111111101110111110111011111011110011101111011110111110101011111100101111111000
5.1設計組合邏輯電路【例5-4】:8-3編碼器modulech_8_3(a,y);input[7:0]a;//輸入output[2:0]y;//輸出reg[2:0]y;always@(a)begin case(a) 8'b1111_1110:y<=3'b000; 8'b1111_1101:y<=3'b001; 8'b1111_1011:y<=3'b010; 8'b1111_0111:y<=3'b011; 8'b1110_1111:y<=3'b100; 8'b1101_1111:y<=3'b101; 8'b1011_1111:y<=3'b110; 8'b0111_1111:y<=3'b111; default:y<=3'b000; endcase endendmodule8-3編碼器電路的仿真波形如圖5-6所示。圖5-6
8-3編碼器電路的仿真波形
5.1設計組合邏輯電路⒉優(yōu)先編碼器設計優(yōu)先編碼器常用于中斷的優(yōu)先級控制,例如,74LS148是一個8位輸入、3位輸出的優(yōu)先編碼器。當其某一個輸入有效時,就可以輸出一個對應的3位二進制編碼;而當同時有幾個輸入有效時,將輸出優(yōu)先級最高的那個輸入所對應的二進制編碼。該優(yōu)先級編碼器的真值表如表5-2所示。表中的“X”項表示任意項,它可以是“0”,也可以是“1”。input(0)的優(yōu)先級最高,input(7)的優(yōu)先級最低。表
5-2
優(yōu)先級編碼器真值表輸入輸出input(7)input(6)input(5)input(4)input(3)input(2)input(1)input(0)y2y1y0XXXXXXX0111XXXXXX01110XXXXX011101XXXX0111100XXX01111011XX011111010X011111100101111111000
5.1設計組合邏輯電路【例5-5】:8-3優(yōu)先編碼器modulech8_3(in,y);input[7:0]in;//編碼輸入端in,低電平有效output[2:0]y;//編碼輸出端yreg[2:0]y;always@(in)if(in[0]==0)y<=3'b111;//使用if-else語句實現(xiàn)優(yōu)先編碼功能elseif(in[1]==0)y<=3'b110;elseif(in[2]==0)y<=3'b101;elseif(in[3]==0)y<=3'b100;elseif(in[4]==0)y<=3'b011;elseif(in[5]==0)y<=3'b010;elseif(in[6]==0)y<=3'b001;elsey<=3'b000;endmodule8-3優(yōu)先編碼器電路的仿真波形如圖5-7所示圖
5-7
8-3優(yōu)先編碼器的仿真波形
5.1設計組合邏輯電路5.1.3設計譯碼器譯碼器是把輸入的數(shù)碼解出其對應的數(shù)碼,如果有N個二進制選擇線,則最多可以譯碼轉換成2N個數(shù)據(jù)。譯碼器也經(jīng)常被應用在地址總線或用作電路的控制線,像只讀存儲器(ROM)中便利用譯碼器來進行地址選擇的工作。3-8譯碼器是最常用的一種譯碼電路,其外部端口示意圖如圖5-8所示,它有3個二進制輸入端A、B、C和8個譯碼輸出端Y0N-Y7N。對輸入A、B、C的值進行譯碼,就可以確定輸出端Y0N-Y7N的哪一個輸出端變?yōu)橛行Вǖ碗娖剑瑥亩_到譯碼的目的。另外為方便譯碼器的控制或便于將來擴充用,在設計時常常會增加一個EN使能輸入腳。3-8譯碼器的真值表如表5-3所示。有了真值表,就可以直接用查表法來設計。在Verilog中,“WITH…SELECT”,“CASE…WHEN”及“WHEN…ELSE”這類指令都是執(zhí)行查表或?qū)獎幼鞯哪苁?。圖
5-8
3-8譯碼器外部端口示意圖
5.1設計組合邏輯電路表
5-3
3-8譯碼器的真值表使能二進制輸入端譯碼輸出端ENCBAY0Y1Y2Y3Y4Y5Y6Y70xxx11111111100001111111100110111111101011011111101111101111110011110111110111111011111011111101111111111110
5.1設計組合邏輯電路【例5-6】:3-8譯碼器(用“if…else”語句)moduledecoder3_8(a,b,c,en,y);inputa,b,c,en;output[7:0]y;//譯碼輸出端reg[7:0]y;wire[2:0]data_in;//信號assigndata_in={c,b,a};always@(data_inoren)beginif(en==1)if(data_in==3'b000)y<=8'b11111110;elseif(data_in==3'b001)y<=8'b11111101;elseif(data_in==3'b010)y<=8'b11111011;elseif(data_in==3'b011)y<=8'b11110111;elseif(data_in==3'b100)y<=8'b11101111;elseif(data_in==3'b101)y<=8'b11011111;elseif(data_in==3'b110)y<=8'b10111111;elseif(data_in==3'b111)y<=8'b01111111;elsey<=8'bxxxxxxxx;else y<=8'b11111111;endendmodule圖
5-9
3-8譯碼器電路的仿真波形
5.1設計組合邏輯電路【例5-7】:3-8譯碼器(用“case”語句)moduledecoder3_8(a,b,c,en,y);inputa,b,c,en;output[7:0]y;//譯碼輸出端reg[7:0]y;wire[2:0]data_in;//信號
assigndata_in={c,b,a};always@(data_inoren)beginif(en==1)case(data_in)
3'b000:y<=8'b11111110;
3'b001:y<=8'b11111101;3'b010:y<=8'b11111011;
5.1設計組合邏輯電路3'b011:y<=8'b11110111;3'b100:y<=8'b11101111;3'b101:y<=8'b11011111;3'b110:y<=8'b10111111;3'b111:y<=8'b01111111;default:y<=8'bxxxxxxxx;endcaseelsey<=8'b11111111;endendmodule5.1.4設計數(shù)據(jù)選擇器數(shù)據(jù)選擇器可以從多組數(shù)據(jù)來源中選取一組送入目的地。它的應用范圍相當廣泛,從組合邏輯的執(zhí)行到數(shù)據(jù)路徑的選擇,經(jīng)??梢钥吹剿嫩櫽啊A硗庠谌鐣r鐘、計數(shù)定時器等的輸出顯示電路中都可以利用多路選擇器設計掃描電路來分別驅(qū)動輸出裝置(通常為七段數(shù)碼顯示管,點矩陣或液晶面板)以降低功率的消耗。有時也希望把兩組沒有必要同時觀察的數(shù)據(jù),共享一組顯示電路以降低成本。數(shù)據(jù)選擇器的結構是2N個輸入線,會有N個地址線及一個輸出線配合。現(xiàn)以一個4選1數(shù)據(jù)選擇器為例,其真值表如表5-4所示,外部端口示意圖如圖5-10所示。
圖5-104選1電路
5.1設計組合邏輯電路描述4選1數(shù)據(jù)選擇器的方法有多種,例如在一個進程中使用if語句,或者在一個進程中使用case語句,或者使用結構簡單的三目運算符號?:?,F(xiàn)用if語句對它進行描述,就可以得到如例5-8所示的程序。表5-4
4選1電路真值表選擇輸入數(shù)據(jù)輸入數(shù)據(jù)輸出BAD0D1D2D3y000XXX0001XXX101X0XX001X1XX110XX0X010XX1X111XXX0011XXX11
5.1設計組合邏輯電路【例5-8】:4選1多路選擇器(使用“if”語句描述)modulemux4(data1,data2,data3,data4,a,b,y);inputdata1,data2,data3,data4;//數(shù)據(jù)輸入inputa,b;//選擇輸入outputy;//數(shù)據(jù)輸出regy;always@(data1ordata2ordata3ordata4orbora)if(!b)beginif(!a)y=data1;elsey=data2;endelse
begin圖
5-11
4選1多路選擇器的仿真波形
5.1設計組合邏輯電路if(!a)y=data3;elsey=data4;endendmodule在進程中使用case語句描述會更使程序更加清晰易讀。例5-9是用case語句描述的4選1選擇器。而例5-10是三目運算符號“?:”描述的4選1選擇器Verilog程序。【例5-9】:4選1多路選擇器(使用“case”語句)modulemux4(data1,data2,data3,data4,a,b,y);inputdata1,data2,data3,data4;//數(shù)據(jù)輸入inputa,b;//選擇輸入outputy;//數(shù)據(jù)輸出regy;always@(data1ordata2ordata3ordata4oraorb)case({b,a})2'b00:y<=data1;2'b01:y<=data2;2'b10:y<=data3;2'b11:y<=data4;endcaseendmodule【例5-10】:4選1多路選擇器(使用三目運算符“?:”描述)modulemux4(data1,data2,data3,data4,a,b,y);inputdata1,data2,data3,data4;//數(shù)據(jù)輸入inputa,b;//選擇輸入outputy;//數(shù)據(jù)輸出regy;always@(data1ordata2ordata3ordata4orbora)y=b?a?data4:data3:a?data2:data1;endmodule
5.1設計組合邏輯電路
5.1.5設計數(shù)據(jù)比較器數(shù)據(jù)比較器主要用于比較兩個二進制數(shù)的大小或是否相等的電路。例5-11是多位比較器的Verilog描述。待比較的兩個數(shù)a和b均為8位二進制數(shù),輸出信號a_equal_b、a_greater_b和a_less_b為‘1’依次表示a=b、a>b和a<b?!纠?-11】:多位比較器modulecomparator(a,b,a_equal_b,a_greater_b,a_less_b);input[7:0]a,b;//待比較數(shù)outputa_equal_b,a_greater_b,a_less_b;//比較結果輸出reg[2:0]Y;assign{a_equal_b,a_greater_b,a_less_b}=Y;always@(aorb)beginif(a>b)Y<=3'b010;//大于elseif(a==b)Y<=3'b100;//相等elseY<=3'b001;//小于endendmodule
5.1設計組合邏輯電路
5.1.6設計三態(tài)門及總線緩沖器⒈三態(tài)門電路三態(tài)電路一般用于雙向口、多路數(shù)據(jù)競爭總線或者多路選擇電路。三態(tài)門電路原理如圖5-12所示。它具有一個數(shù)據(jù)輸入端din,一個數(shù)據(jù)輸出使能端en和一個數(shù)據(jù)輸出端dout。當en=’1’時,dout=din;當en=’0’時,dout=’z’(高阻)。三態(tài)門的真值表如表5-5所示,用Verilog描述三態(tài)門電路見例5-12。【例5-12】:三態(tài)門電路moduletri_gate(din,en,dout);inputdin,en;//數(shù)據(jù)輸入與輸出使能端outputdout;//數(shù)據(jù)輸出端regdout;always@(din,en) if(en) dout=din; else dout=1'bz;endmodule數(shù)據(jù)輸入輸出使能數(shù)據(jù)輸出dinendoutX0Z010111圖
5-13
三態(tài)門電路的仿真波形
5.1設計組合邏輯電路⒉雙向總線緩沖器雙向總線緩沖器用于對數(shù)據(jù)總線的驅(qū)動和緩沖。典型的雙線總線緩沖器有兩個8位數(shù)據(jù)輸入/輸出端a和b,一個使能端en和一個方向控制端dir。當en=1時該總線驅(qū)動器選通,若dir=1,則信號由a傳至b;反之由b傳至a。例5-13是雙向總線緩沖器Verilog源程序。moduletri_bibuffer(a,b,en,dr);inout[7:0]a,b;//數(shù)據(jù)輸入/輸出端inputen,dr;//使能與方向控制端reg[7:0]a,b; always@(a,b,dr) begin if(dr&en)b<=a;//信號由a傳至b else b<=1'bz; end
圖
5-14
雙向總線緩沖器電路的仿真波形
5.1設計組合邏輯電路always@(a,b,dr) begin if(!dr&en) a<=b;//信號由b傳至a else a<=1'bz;
endendmodule
5.2設計時序邏輯電路
時序邏輯電路任一時刻的輸出信號不僅取決于當時的信號輸入,還取決于電路的原來狀態(tài),一般由組合電路和存儲電路兩部分組成。時序邏輯電路的重要標志是具有時鐘脈沖Clock,在時鐘脈沖上升沿或下降沿的控制下時序邏輯電路才能發(fā)生狀態(tài)變化。Verilog提供了測試時鐘脈沖敏感邊沿的函數(shù),為時序邏輯電路的設計帶來了極大的方便。
5.2設計時序邏輯電路
5.2.1設計觸發(fā)器觸發(fā)器是構成時序邏輯電路的基本元件,常用的觸發(fā)器包括RS、JK、D和T等類型,這里以D觸發(fā)器和JK觸發(fā)器為例,介紹觸發(fā)器的設計。⒈D觸發(fā)器上升沿觸發(fā)的D觸發(fā)器的電路符號如圖5-15所示,它有一個數(shù)據(jù)輸入端D,一個時鐘輸入端clk和一個數(shù)據(jù)輸出端Q,其真值表如表5-6所示。數(shù)據(jù)輸入端時鐘輸入端數(shù)據(jù)輸出端DclkQX0不變X1不變0↑01↑1圖5-15D觸發(fā)器電路符號表
5-6D觸發(fā)器的真值表
5.2設計時序邏輯電路【例5-14】:D觸發(fā)器的Verilog描述moduledff1(d,clk,q);inputclk,d;//時鐘與數(shù)據(jù)輸入端outputq;//數(shù)據(jù)輸出端regq;always@(posedgeclk)//檢測時鐘信號變化q<=d;endmodule程序中描述的是上升沿觸發(fā),如果要改成是下降沿觸發(fā),只要將條件改為always@(negedgeclk)即可。
5.2設計時序邏輯電路⒉異步復位D鎖存器異步復位的D鎖存器的電路符號如圖5-16所示。它和一般的D鎖存器的區(qū)別是多了一個復位輸入端clr。當clr=‘0’時,其Q端輸出被強迫置為“0”,因此clr又稱清零輸入端。用Verilog描述異步復位D鎖存器的源程序如例5-15。【例5-15】:異步復位D鎖存器的Verilog描述moduledff2(d,clk,q,clr);inputclk,d,clr;//時鐘,數(shù)據(jù)輸入與清零端outputq;regq;always@(posedgeclkornegedgeclr) begin if(!clr)//實現(xiàn)復位 q<=0; else q<=d; endendmodule圖5-16異步復位D鎖存器
5.2設計時序邏輯電路【例5-16】:異步復位/置位D鎖存器的Verilog描述moduledff3(d,clk,q,clr,prn);inputd,clk,clr,prn;outputq;regq;always@(posedgeclkornegedgeclrornegedgeprn) begin if(!prn)//異步置位 q<=1; elseif(!clr)//異步清零 q<=0; else q<=d; endendmodule圖
5-17
異步復位/置位D鎖存器從例5-16可以看到,置位的優(yōu)先級最高,復位次之,而時鐘最低。這樣,當prn=0時,無論clr和clk都是什么狀態(tài),Q一定被置為“1”。從例5-16可以看到,置位的優(yōu)先級最高,復位次之,而時鐘最低。這樣,當prn=0時,無論clr和clk都是什么狀態(tài),Q一定被置為“1”。
5.2設計時序邏輯電路
⒋JK觸發(fā)器帶有復位/置位功能的JK觸發(fā)器電路符號如圖5-18所示。JK觸發(fā)器的輸入端有置位輸入prn,復位輸入clr,控制輸入J和K以及時鐘信號輸入clk;輸出端有正向輸出端Q和反向輸出端QB。JK觸發(fā)器的真值表如表5-7所示。用Verilog描述帶有復位/置位功能的JK觸發(fā)器的源程序見例5-17。輸入端輸出端PRNCLRCLKJKQQB01XXX1010XXX0100XXXXX11↑010111↑11翻轉11↑00Q0NOTQ011↑1010110XXQ0NOTQ0表
5-7
JK觸發(fā)器的真值表圖
5-18
JK觸發(fā)器
5.2設計時序邏輯電路【例5-17】:JK觸發(fā)器的Verilog描述modulejkf(prn,clr,clk,j,k,q,qb);inputprn,clr,clk,j,k;outputq,qb;regq;wireqb;assignqb=~q;always@(posedgeclkornegedgeclrornegedgeprn)if(!prn) q<=1;//置位
elseif(!clr) q<=0; //復位 else
begin
case({j,k})
2'b00:q<=q;2'b01:q<=1'b0;2'b10:q<=1'b1;2'b11:q<=~q;default:q<=q;
endcaseend endmodule圖
5-19
JK觸發(fā)器電路的仿真波形
5.2設計時序邏輯電路
5.2.2設計鎖存器寄存器一般由多位觸發(fā)器連接而成。從功能上說,寄存器通??煞譃殒i存器和移位寄存器兩種。鎖存器是一種重要的數(shù)字電路部件,常用來暫時存放指令、參與運算的數(shù)據(jù)或運算結果等。它是數(shù)字測量和數(shù)字控制中常用的部件,是計算機的主要部件之一。鎖存器的主要組成部分是具有記憶功能的雙穩(wěn)態(tài)觸發(fā)器。一個觸發(fā)器可以儲存一位二進制代碼,要儲存N位二進制代碼,就要有N個觸發(fā)器。鎖存器用于寄存一組二進制代碼,廣泛用于各類數(shù)字系統(tǒng)。例5-18是用Verilog設計的一個8位鎖存器?!纠?-18】:8位寄存器moduleregister(d,clk,q);input[7:0]d;inputclk;output[7:0]q;reg[7:0]q;always@(posedgeclk) q<=d;endmodule
5.2設計時序邏輯電路
5.2.3設計移位寄存器移位寄存器除了具有存儲代碼的功能以外,還具有移位功能。所謂移位功能,是指寄存器里存儲的代碼能在移位脈沖的作用下依次左移或右移。因此,移位寄存器不但可以用來寄存代碼,還可用來實現(xiàn)數(shù)據(jù)的串并轉換、數(shù)值的運算以及數(shù)據(jù)處理等。例5-19給出了一個8位的移位寄存器,具有左移一位或右移一位、并行輸入和同步復位的功能。moduleshift_reg(clk,data,qout,shift_left,shift_right,mode,reset);inputclk,shift_left,shift_right,reset;input[1:0]mode;input[7:0]data;output[7:0]qout;reg[7:0]qout;always@(posedgeclk)if(reset) //同步復位功能的實現(xiàn) qout=8'b00000000;
5.1設計時序邏輯電路elsecase(mode) 2'b01:qout<={shift_right,data[7:1]};//右移一位2'b10:qout<={data[6:0],shift_left};//左移一位 2'b11:qout<=data;//并行輸入default:; endcase endmodule圖
5-20
8位移位寄存器電路的仿真波形
5.2設計時序邏輯電路
5.2.4設計計數(shù)器
計數(shù)器是在數(shù)字系統(tǒng)中使用最多的時序電路,它不僅能用于對時鐘脈沖計數(shù),還可以用于分頻、定時、產(chǎn)生節(jié)拍脈沖和脈沖序列以及進行數(shù)字運算等。計數(shù)器是一個典型的時序電路,分同步計數(shù)器和異步計數(shù)器兩種,分析計數(shù)器能更好地了解時序電路的特性。⒈同步計數(shù)器設計所謂同步計數(shù)器,就是在時鐘脈沖(計數(shù)脈沖)的控制下,構成計數(shù)器的各觸發(fā)器狀態(tài)同時發(fā)生變化的一類計數(shù)器。⑴六十進制計數(shù)器六十進制計數(shù)器常用于時鐘計數(shù)。眾所周知,用一個4位二進制計數(shù)器可構成1位十進制計數(shù)器,而2位十進制計數(shù)器連接起來可以構成一個六十進制的計數(shù)器。六十進制計數(shù)器的外部端口示意圖如圖5-21所示。該圖中bcd1wr和bcd10wr與datain配合,以實現(xiàn)對六十進制計數(shù)器的個位和十位值的預置操作。應注意,在對個位和十位進行預置操作時,datanin輸入端是公用的,因而個位和十位的預置操作必定要串行進行。利用Verilog語言描述六十進制計數(shù)器的程序如例5-20、例5-21所示。
5.2設計時序邏輯電路【例5-20】:六十進制計數(shù)器(方法1)modulebcd60count(bcd1,bcd10,co,datain,bcd1wr,bcd10wr,cin,clk);output[3:0]bcd1;output[2:0]bcd10;outputco;input[3:0]datain;inputcin,clk,bcd1wr,bcd10wr;reg[6:0]qout;always@(posedgeclkorposedgebcd1wrorposedgebcd10wr)//上升沿時刻計數(shù),異步置數(shù)圖
5-21六十進制計數(shù)器外部端口示意圖
5.2設計時序邏輯電路beginif(bcd1wr) qout[3:0]=datain;//異步置數(shù)個位 elseif(bcd10wr) qout[6:4]=datain[2:0];//異步置數(shù)十位elseif(cin)beginif(qout[3:0]==9)//低位是否為9,是則往下執(zhí)行beginqout[3:0]=0;//低位清零并判斷高位是否為5if(qout[6:4]==5)qout[6:4]=0;//高位為5則將高位清零elseqout[6:4]=qout[6:4]+1;//加1,BCD進位endelseqout[3:0]=qout[3:0]+1;endendassignco=((qout==8'h59)&cin)?1:0;//產(chǎn)生進位輸出信號assign{bcd10,bcd1}=qout;endmodule【例5-21】:六十進制計數(shù)器(方法2)modulecounter60(bin,cy60,ec,clr,cp,s);output[5:0]bin;//二進制輸出outputcy60;//計數(shù)60進位信號inputec,cp,clr,s;//使能,時鐘,清零,輸出啟動信號reg[5:0]qout_t;always@(posedgecporposedgeclr)//計數(shù)60beginif(clr)
qout_t=0;//異步復位elseif(ec)qout_t=qout_t+1;//計數(shù)值加1endassigncy60=((qout_t==6'h3B)&ec)?1:0;//產(chǎn)生進位輸出信號assignbin=s?qout_t:8'h00;//輸出二進制計數(shù)值endmodule圖5-22
六十進制計數(shù)器(方法2)電路的仿真波形
5.2設計時序邏輯電路⑵可逆計數(shù)器所謂可逆計數(shù)器,就是根據(jù)計數(shù)控制信號的不同,在時鐘脈沖作用下,計數(shù)器可以進行加1或者減1操作的一種計數(shù)器??赡嬗嫈?shù)器有一個特殊的控制端“DIR”。當DIR=‘1’時,計數(shù)器進行加1操作,當DIR=‘0’時,計數(shù)器就進行減1操作。表5-8是一個3位可逆計數(shù)器的真值表,它的Verilog語言描述如例5-22所示。輸入端輸出端DIRCPQ2Q1Q0XX0001↑計數(shù)器加1操作0↑計數(shù)器減1操作表
5-8
可逆計數(shù)器真值表
5.2設計時序邏輯電路【例5-22】:3位二進制可逆計數(shù)器modulecount3(q,cp,dir);inputcp,dir;//時鐘輸入端口與計數(shù)方向控制端口output[2:0]q;reg[2:0]q;always@(posedgecp) begin if(dir)
q=q+1;//正計數(shù),+1
else
q=q-1;//逆計數(shù),-1 endendmodule編寫可逆計數(shù)器Verilog程序時,在語法上,就是把加法和減法計數(shù)器合并,使用一個控制信號決定計數(shù)器作加法或減法運算。在本例中,利用控制信號“DIR”可以讓計數(shù)器的計數(shù)動作加1或減1。
5.2設計時序邏輯電路
⒉異步計數(shù)器設計異步計數(shù)器又稱行波計數(shù)器,它將低/高位計數(shù)器的輸出做為高/低位計數(shù)器的時鐘信號,一級一級串行連接起來就構成了一個異步計數(shù)器。異步計數(shù)器與同步計數(shù)器不同之處就在于時鐘脈沖的提供方式。由于異步計數(shù)器采用行波計數(shù),從而使計數(shù)延遲增加,在要求延遲小的領域受到了很大限制。盡管如此,由于它的電路簡單,仍有廣泛的應用。圖5-23是用Verilog語言描述的一個由8個觸發(fā)器構成的異步計數(shù)器,其Verilog程序如例5-23所示,采用元件例化方式生成。與上述同步計數(shù)器不同之處主要表現(xiàn)在對各級時鐘脈沖的描述上,這一點請讀者在閱讀程序時多加注意。圖
5-238位異步計數(shù)器原理圖
5.2設計時序邏輯電路【例5-23】:由8個觸發(fā)器構成的8位二進制異步計數(shù)器moduledffr(d,clk,q,qb,clr);//待例化元件inputd,clk,clr;outputq,qb;regq;assignqb=!q;always@(posedgeclkornegedgeclr) begin if(!clr)
q<=0;
else
q<=d; endendmodule
5.2設計時序邏輯電路modulerplcont(clk,clr,count);//頂層文件設計inputclk,clr;output[7:0]count;wire[8:0]count_in_bar;assigncount_in_bar[0]=clk;generate//循環(huán)例化 genvari; for(i=0;i<=7;i=i+1)
begin:dff_queues
dffr(.clk(count_in_bar[i]),.clr(clr),.d(count_in_bar[i+1]),.q(count[i]),.qb(count_in_bar[i+1]));//例化語句 endendgenerate endmodule
5.2設計時序邏輯電路
5.3設計狀態(tài)機狀態(tài)機(FiniteStateMachine,F(xiàn)SM)的基本結構如圖5-24所示。除了輸人、輸出信號外,狀態(tài)機還包含一組寄存器記憶狀態(tài)機的內(nèi)部狀態(tài)。狀態(tài)機寄存器的下一個狀態(tài)及輸出,不僅同輸入信號有關,而且還與寄存器的當前狀態(tài)有關,狀態(tài)機可以認為是組合邏輯和寄存器邏輯的特殊組合。組合邏輯部分又可分為狀態(tài)譯碼器和輸出譯碼器,狀態(tài)譯碼器確定狀態(tài)機的下一個狀態(tài),即確定狀態(tài)機的激勵方程,輸出譯碼器確定狀態(tài)機的輸出,即確定狀態(tài)機的輸出方程。狀態(tài)寄存器用于存儲狀態(tài)機的內(nèi)部狀態(tài)。圖5-24狀態(tài)機的基本結構
狀態(tài)機的基本操作有兩種:①狀態(tài)機的內(nèi)部狀態(tài)轉換。狀態(tài)機經(jīng)歷一系列狀態(tài),下一狀態(tài)由狀態(tài)譯碼器根據(jù)當前狀態(tài)和輸入條件決定。②產(chǎn)生輸出信號序列。輸出信號由輸出譯碼器根據(jù)當前狀態(tài)和輸入條件確定。用輸入信號決定下一狀態(tài)也稱為“轉移”。除了轉移之外,復雜的狀態(tài)機還具有重復和歷程功能。從一個狀態(tài)轉移到另一狀態(tài)稱為控制定序,而決定下一狀態(tài)所需的邏輯稱為轉移函數(shù)。在產(chǎn)生輸出的過程中,根據(jù)是否使用輸入信號可以確定狀態(tài)機的類型。兩種典型的狀態(tài)機是米里(Mealy)狀態(tài)機和摩爾(Moore)狀態(tài)機。摩爾狀態(tài)機的輸出只是當前狀態(tài)的函數(shù),而米里狀態(tài)機的輸出一般是當前狀態(tài)和輸入信號的函數(shù)。對于這兩類狀態(tài)機,控制定序都取決于當前狀態(tài)和輸入信號。大多數(shù)實用的狀態(tài)機都是同步的時序電路,由時鐘信號觸發(fā)進行狀態(tài)的轉換。時鐘信號同所有的邊沿觸發(fā)的狀態(tài)寄存器和輸出寄存器相連,使狀態(tài)的改變發(fā)生在時鐘的上升沿或下降沿。在數(shù)字系統(tǒng)中,那些輸出取決于過去的輸入和當前的輸入的部分都可以作為有限狀態(tài)機。有限狀態(tài)機的全部“歷史”都反映在當前狀態(tài)上。當給狀態(tài)機一個新的輸入時,它就會產(chǎn)生一個輸出。輸出由當前狀態(tài)和輸入共同決定,同時狀態(tài)機也會轉移到下一個新狀態(tài)。狀態(tài)機中,其內(nèi)部狀態(tài)存放在寄存器中,下一狀態(tài)的值由狀態(tài)譯碼器中的一個組合邏輯——轉移函數(shù)產(chǎn)生,狀態(tài)機的輸出由另一個組合邏輯——輸出函數(shù)產(chǎn)生。
5.3設計狀態(tài)機建立有限狀態(tài)機主要有兩種方法:狀態(tài)轉移圖(狀態(tài)圖)和狀態(tài)轉移表(狀態(tài)表)。它們是等價的,相互之間可以轉換。狀態(tài)轉移圖如圖5-25所示,圖中每個橢圓表示狀態(tài)機的一個狀態(tài),而箭頭表示狀態(tài)之間的一個轉換,引起轉換的輸入信號及當前輸出表示在轉換箭頭上。如果能夠?qū)懗鰻顟B(tài)機的狀態(tài)轉移圖,就可以使用Verilog的狀態(tài)機語句對它進行描述。摩爾狀態(tài)機和米立狀態(tài)機的表示方法不同,摩爾狀態(tài)機的狀態(tài)譯碼輸出寫在狀態(tài)圈內(nèi),米立狀態(tài)機的狀態(tài)譯碼輸出寫在箭頭旁,如圖5-26所示。圖5-25
狀態(tài)轉移圖圖5-26
摩爾和米立狀態(tài)機
5.3設計狀態(tài)機狀態(tài)轉移表形式如表5-9所示。表中的行列出了全部可能的輸入信號組合和內(nèi)部狀態(tài)以及相應的次狀態(tài)和輸出,因此狀態(tài)表規(guī)定了狀態(tài)機的轉換函數(shù)和輸出函數(shù)。然而,狀態(tài)表不適合具有大量輸入的系統(tǒng),因為隨著輸入的增加其狀態(tài)數(shù)和系統(tǒng)的復雜性會顯著增加。狀態(tài)轉移圖、狀態(tài)轉移表這兩種有限狀態(tài)機的建立方法是等價的,都描述了同一硬件結構,它們可以相互轉換,但各有優(yōu)缺點,分別適合于不同場合。現(xiàn)態(tài)輸入次態(tài)輸出S0-SnI0-ImS0-SnQ0-QP表
5-9
狀態(tài)轉移表
5.3設計狀態(tài)機摩爾有限狀態(tài)機輸出只與當前狀態(tài)有關,與輸入信號的當前值無關,是嚴格的現(xiàn)態(tài)函數(shù)。在時鐘脈沖的有效邊沿作用后的有限個門延后,輸出達到穩(wěn)定值。即使在時鐘周期內(nèi)輸入信號發(fā)生變化,輸出也會保持穩(wěn)定不變。從時序上看,Moore狀態(tài)機屬于同步輸出狀態(tài)機。Moore有限狀態(tài)機最重要的特點就是將輸入與輸出信號隔離開來。例5-24就是一個典型的Moore型狀態(tài)機實例。狀態(tài)機的狀態(tài)圖如圖5-27所示。圖
5-27
Moore狀態(tài)機的狀態(tài)圖
5.3設計狀態(tài)機【例5-24】:Moore狀態(tài)機modulemoore(reset,clk,datain,dataout);inputreset,clk;inputdatain;output[3:0]dataout;reg[3:0]dataout;reg[3:0]nextstate,currentstate;//用熱活碼設置表示狀態(tài)parameters1=4'b0001,s2=4'b0010,s3=4'b0100,s4=4'b1000;always@(posedgeclkornegedgereset)if(!reset)//異步復位currentstate<=s1;elsecurrentstate<=nextstate;//狀態(tài)轉換always@(currentstateordatain)begincase(currentstate)//當檢測到時鐘上升沿時執(zhí)行case語句s1:nextstate=(datain==1)?s2:s1;s2:nextstate=(datain==0)?s3:s2;s3:nextstate=(datain==1)?s4:s3;s4:nextstate=(datain==0)?s1:s4;default:nextstate=4'bxxxx;endcaseendalways@(resetorcurrentstate)//組合邏輯過程beginif(!reset)dataout=4'b0001;elsecase(currentstate)//確定當前狀態(tài)值s1:dataout=4'b0001;//對應狀態(tài)S1的數(shù)據(jù)輸出為"0001"s2:dataout=4'b0010;s3:dataout=4'b0100;s4:dataout=4'b1000;default:da
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年安徽工業(yè)職業(yè)技術學院單招職業(yè)技能考試備考試題含詳細答案解析
- 2026中國歌劇舞劇院招募舞蹈演員(實習生)參考考試題庫及答案解析
- 2026年廣西交通職業(yè)技術學院單招職業(yè)技能考試模擬試題含詳細答案解析
- 2026年貴州工貿(mào)職業(yè)學院高職單招職業(yè)適應性測試備考試題及答案詳細解析
- 2026年江西交通職業(yè)技術學院單招綜合素質(zhì)考試模擬試題含詳細答案解析
- 2026年長春師范高等專科學校單招綜合素質(zhì)筆試模擬試題含詳細答案解析
- 2026年重慶護理職業(yè)學院單招職業(yè)技能考試參考題庫含詳細答案解析
- 2026年石家莊郵電職業(yè)技術學院單招綜合素質(zhì)筆試參考題庫含詳細答案解析
- 2026年黑河北安市鐵南街道辦事處公開招聘公益性崗位人員1人考試重點試題及答案解析
- 2026年武夷學院單招綜合素質(zhì)考試模擬試題含詳細答案解析
- 數(shù)據(jù)恢復協(xié)議合同模板
- 地下礦山職工安全培訓課件
- 供熱安全培訓課件
- 穿越機組裝教學課件
- 培訓意識形態(tài)課件
- 招聘專員基本知識培訓課件
- 2025年麒麟運維考試題庫
- 綿陽北控水務污泥減量化及資源化中心項目環(huán)評報告
- 南通市城市綠化養(yǎng)護質(zhì)量等級標準(試行)
- 正念認知療法實證研究-洞察及研究
- cnc工廠刀具管理辦法
評論
0/150
提交評論