第4章HDL邏輯設(shè)計(jì)_第1頁
第4章HDL邏輯設(shè)計(jì)_第2頁
第4章HDL邏輯設(shè)計(jì)_第3頁
第4章HDL邏輯設(shè)計(jì)_第4頁
第4章HDL邏輯設(shè)計(jì)_第5頁
已閱讀5頁,還剩132頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第4章HDL邏輯設(shè)計(jì)14.1基本組合電路設(shè)計(jì)組合電路的輸出可以表達(dá)為瞬間輸入信號的布爾函數(shù)形式,組合電路不包含反饋結(jié)構(gòu)。通常,布爾函數(shù)可表示為“積之和”或“和之積”的形式,可以兩級與-或邏輯電路實(shí)現(xiàn)。邏輯電路的優(yōu)化:卡諾圖、代數(shù)化簡法、EDA工具自動優(yōu)化。組合邏輯建模方法:結(jié)構(gòu)化建模:實(shí)例化基本邏輯門。數(shù)據(jù)流建模:assign連續(xù)賦值語句。行為建模:電平敏感控制的always結(jié)構(gòu)。2多路選擇器功能:根據(jù)選擇信號從多個(gè)輸入信號中選擇一個(gè)送到輸出端。例1:4選1多路選擇器外框圖:abcdselout圖1:4選1多路選擇器外框圖3例1:4選1多路選擇器的數(shù)據(jù)流模型:modulemux4_1(out,a,b,c,d,sel);output[7:0]out;input[7:0]a,b,c,d;input[1:0]sel;assignout=(sel==0)?a:(sel==1)?b:(sel==2)?c:(sel==3)?d:8’bx;endmodule4例1:4選1多路選擇器的行為模型:modulemux4_1(out,a,b,c,d,sel);output[7:0]out;input[7:0]a,b,c,d;input[1:0]sel;reg[7:0]out;always@(aorborcordorsel)

case(sel)0:out=a;1:out=b;2:out=c;3:out=d;

defult:out=8’bx;endcaseendmodule5例1:帶三態(tài)輸出控制的4選1多路選擇器的行為模型:modulemux4_1(out,a,b,c,d,sel,enable);output[7:0]out;input[7:0]a,b,c,d;input[1:0]sel;inputenable;reg[7:0]temp;assignout=enable?temp:8’bz;always@(aorborcordorsel)

case(sel)0:temp=a;1:temp=b;2:temp=c;3:temp=d;

defult:out=8’bx;endcaseendmodule62、譯碼器功能:譯碼器有n個(gè)輸入變量,2n個(gè)(或少于2n個(gè))輸出,每個(gè)輸出對應(yīng)于n個(gè)輸入變量的一個(gè)最小項(xiàng)。當(dāng)輸入為某一組合時(shí),對應(yīng)的僅有一個(gè)輸出為“0”(或?yàn)椤?”),其余輸出均為“1”(或?yàn)椤?”)。譯碼器的用途是把輸入代碼譯成相應(yīng)的控制電位,以實(shí)現(xiàn)代碼所要求的操作。圖2給出了二輸入四輸出譯碼器的邏輯圖。譯碼器中常設(shè)置“使能”控制端,當(dāng)該端為“1”時(shí),譯碼器功能被禁止,此時(shí)所有輸出均為“1”。使能端的一個(gè)主要功能是用來擴(kuò)充輸入變量數(shù)。圖3是用兩片三輸入八輸出譯碼器擴(kuò)展成一個(gè)四輸入十六輸出譯碼器的實(shí)例。7圖2二輸入四輸出譯碼器8圖3兩塊三輸入變量譯碼器擴(kuò)展成四輸入譯碼器

9例2:3-8譯碼器的行為模型:moduledecoder3_8(data,code);output[7:0]data;input[2:0]code;always@(code)

case(code)0:data=8’b0000_0001;1:data=8’b0000_0010;2:data=8’b0000_0100;3:data=8’b0000_1000;4:data=8’b0001_0000;5:data=8’b0010_0000;6:data=8’b0100_0000;7:data=8’b1000_0000;

defult:data=8’bx;endcaseendmodule103、加法器一位全加器:真值表:abciscoabcicos00000001010100101110100011011011010111111位全加器邏輯表達(dá)式:S=abci+abci+abci+abci=abciCo=abci+abci+abci+abci=ab+aci+bci11由多個(gè)一位全加器把進(jìn)位信號串聯(lián)而成,每個(gè)全加器都有2級門的延遲時(shí)間,故這種n位加法器有2n級門的延遲時(shí)間。多位加法器電路設(shè)計(jì)abscicoabscicoabscicoFAabscicocicoa<3:0>b<3:0>a<0>a<1>a<3>a<2>b<0>b<1>b<3>b<2>s<0>s<1>s<3>s<2>s<3:0>FAFAFA12串行加法器完成一次加法所需時(shí)間較長。這是因?yàn)槠湮婚g進(jìn)位是串行傳送的,本位全加和Fi必須等低位進(jìn)位Ci-1來到后才能進(jìn)行,加法時(shí)間與位數(shù)有關(guān)。只有改變進(jìn)位逐位傳送的路徑,才能提高加法器工作速度。解決辦法之一是采用“超前進(jìn)位產(chǎn)生電路”來同時(shí)形成各位進(jìn)位,從而實(shí)現(xiàn)快速加法。我們稱這種加法器為超前進(jìn)位加法器。超前進(jìn)位產(chǎn)生電路是根據(jù)各位進(jìn)位的形成條件來實(shí)現(xiàn)的。只要滿足下述兩條件中任一個(gè),就可形成Ci:

(1)Xi,Yi均為“1”;

(2)Xi,Yi任一個(gè)為“1”,且進(jìn)位Ci-1為“1”。由此,可寫得Ci的表達(dá)式為

Ci=XiYi+(Xi+Yi)Ci-1 (2.16)超前進(jìn)位加法器13引入進(jìn)位傳遞函數(shù)Pi和進(jìn)位產(chǎn)生函數(shù)Gi的概念,定義為:

Pi=Xi+Yi

Gi=Xi·YiPi的意義是:當(dāng)Xi,Yi中有一個(gè)為“1”時(shí),若有進(jìn)位輸入,則本位向高位傳送進(jìn)位,這個(gè)進(jìn)位可看成是低位進(jìn)位越過本位直接向高位傳遞的。Gi的意義是:當(dāng)Xi,Yi均為“1”時(shí),不管有無進(jìn)位輸入,定會產(chǎn)生向高位的進(jìn)位。將Pi、Gi代入(2.16)式,便可得:

Ci=Gi+PiCi-1 (2.17)14反復(fù)應(yīng)用上式,便可得:

C1=G1+P1C0 (2.22) C2=G2+P2G1+P2P1C0 (2.23) C3=G3+P3G2+P3P2G1+P3P2P1C0 (2.24) C4=G4+P4G3+P4P3G2+P4P3P2G1+P4P3P2P1C0 (2.25)經(jīng)過恒等變換可得:

C1=P1+G1C0 (2.26) C2=P2+G2P1+G2G1C0 (2.27) C3=P3+G3P2+G3G2P1+G3G2G1C0 (2.28) C4=P4+G4P3+G4G3P2+G4G3G2P1+G4G3G2G1C0 (2.29)15四位超前進(jìn)位加法器邏輯圖16超前進(jìn)位的4位加法器門級模型:moduleadder_4(sum,c_out,a,b,c_in);output[3:0]sum;outputc_out;input[3:0]a,b;inputc_in;

wirep0,g0,p1,g1,p2,g2,p3,g3;wirec1,c2,c3,c4;assignp0=a[0]|b[0];assignp1=a[1]|b[1];assignp2=a[2]|b[2];assignp3=a[3]|b[3];assigng0=a[0]&b[0];assigng1=a[1]&b[1];assigng2=a[2]&b[2];assigng3=a[3]&b[3];17assignc1=g0|(p0&c_in);assignc2=g1|(p1&g0)|(p1&p0&c_in);assignc3=g2|(p2&g1)|(p2&p1&g0)|(p2&p1&p0&c_in);assignc4=g3|(p3&g2)|(p3&p2&g1)|(p3&p2&p1&g0)|(p3&p2&p1&p0&c_in);assignsum[0]=a[0]^b[0]^c_in;assignsum[1]=a[1]^b[1]^c1;assignsum[2]=a[2]^b[2]^c2;assignsum[3]=a[3]^b[3]^c3;assignc_out=c4;endmodule184.2基本時(shí)序電路設(shè)計(jì)時(shí)序電路的輸出不僅與當(dāng)前的輸入有關(guān),而且與電路內(nèi)部狀態(tài)有關(guān)。在時(shí)序電路中,大部分應(yīng)用系統(tǒng)是同步的,即電路工作時(shí)由一個(gè)公共的時(shí)鐘信號有節(jié)奏的推進(jìn),每當(dāng)時(shí)鐘信號到來時(shí)(上升沿或下降沿),電路狀態(tài)發(fā)生一次更新。同步系統(tǒng)在兩次時(shí)鐘脈沖之間保持狀態(tài)的穩(wěn)定,使得系統(tǒng)更具穩(wěn)定性,便于設(shè)計(jì)、調(diào)試,所以占據(jù)系統(tǒng)的大部分。與同步系統(tǒng)相對應(yīng)的是異步系統(tǒng),在任何時(shí)刻多個(gè)信號到來時(shí),狀態(tài)都有可能發(fā)生變化。常見的時(shí)序電路:鎖存器、觸發(fā)器、移位器、計(jì)數(shù)器等。19鎖存器功能:當(dāng)使能信號有效時(shí),鎖存器輸出完全跟隨輸入的變化;無效時(shí),輸出信號保持剛才的狀態(tài)。鎖存器數(shù)據(jù)流模型:modulelatch(out,in,enable);outputout;inputin,enable;assignout=enable?in:out;endmodule20鎖存器行為模型:modulelatch(out,in,enable);outputout;inputin,enable;regout;

always@(inorenable)

if(enable)out=in;endmodule21帶異步置位與復(fù)位邏輯的鎖存器modulelatch(q,enable,set,clr,d);inputenable,d,set,clr;outputq;regq;always@(enableorsetorclrord)beginif(set)q<=1;elseif(clr)q<=0;elseif(enable)q<=d;endendmodule222、D觸發(fā)器D觸發(fā)器是由信號邊沿觸發(fā)的器件,是最基本的同步時(shí)序電路。功能:當(dāng)規(guī)定的時(shí)鐘沿到達(dá)時(shí),D觸發(fā)器的輸出等于輸入;否則,輸出信號保持原來狀態(tài)不變。上升沿D觸發(fā)器模型:moduledff(q,data,clk);outputq;inputdata,clk;regq;always@(posedgeclk);q<=data;endmodule23帶異步復(fù)位的觸發(fā)器moduleasyn_ff(d,clk,rstout);inputd,clk,rst;outputq;regq;always@(posedgeclkornegedgerst)beginif(rst==0)q<=0;elseq<=d;endendmodule24帶同步復(fù)位的觸發(fā)器modulesync_set(d,clk,rst,out);inputd,clk,st;outputq;regq;always@(posedgeclk)beginif(rst==0)q<=0;elseq<=d;endendmodule252、計(jì)數(shù)器功能:用于對脈沖信號計(jì)數(shù),定時(shí)、分頻等。帶計(jì)數(shù)使能端和異步復(fù)位端的8位計(jì)數(shù)器行為模型:modulecounter(out,clk,en,rst_n);parameterSIZE=8;output[SIZE-1:0]out;inputclk,en,rst_n;reg[SIZE_1:0]out;always@(posedgeclkornegedge

rst_n);

if(~rst_n)out<=8’b0;elseif(en)out<=out+1;endmodule264.3同步狀態(tài)機(jī)設(shè)計(jì)同步狀態(tài)機(jī)的電路結(jié)構(gòu):狀態(tài)寄存器、下一狀態(tài)產(chǎn)生邏輯、輸出信號產(chǎn)生邏輯。下圖給出了一個(gè)同步狀態(tài)機(jī)的電路結(jié)構(gòu)圖:多周期處理機(jī)的控制部件的電路結(jié)構(gòu)圖。狀態(tài)機(jī)類型:Mealy型、Moore型。狀態(tài)機(jī)設(shè)計(jì)方法:狀態(tài)劃分與定義。畫出狀態(tài)轉(zhuǎn)移圖。建立下一狀態(tài)及輸出信號真值表。建立VerilogRTL模型。狀態(tài)機(jī)設(shè)計(jì)舉例:多周期處理機(jī)的控制部件設(shè)計(jì)。27多周期處理機(jī)控制部件的電路結(jié)構(gòu)下一狀態(tài)產(chǎn)生模塊控制信號產(chǎn)生模塊狀態(tài)寄存器CLKZEROOPCODEQ3Q2Q1Q0D3D2D1D0Q0Q1Q2Q3OPCODED0D1D2D3Q0Q1Q2Q3OPCODEZEROWRITEPCSELLDSTWRITEMEMWRITEIRSELLOADSELSTWRITEREGSELALUASELALUBALUOPWRITEZERO28有限狀態(tài)機(jī)的描述?有限狀態(tài)機(jī)是通過現(xiàn)態(tài)、次態(tài)、輸入和輸出之間的相互作用構(gòu)成的。?有限狀態(tài)機(jī)可以分成兩類:–Mealy型:輸出與現(xiàn)態(tài)和輸入相關(guān)。–Moore型:輸出只與現(xiàn)態(tài)相關(guān),和輸入無關(guān)。?有限狀態(tài)機(jī)需要有復(fù)位處理。?有限狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換應(yīng)當(dāng)在同一個(gè)時(shí)鐘信號的同一個(gè)邊沿發(fā)生。?有限狀態(tài)機(jī)可以有兩種描述方式:–隱式描述:多數(shù)邏輯綜合器不支持。–顯式描述:明確說明狀態(tài)寄存器和狀態(tài)賦值。29有限狀態(tài)機(jī)的顯式描述?結(jié)構(gòu)化程度更好。?可以比較容易地控制缺省狀態(tài)。?可以處理復(fù)雜的狀態(tài)轉(zhuǎn)換。?所有綜合器都支持。?可以有如下幾種方式:–一個(gè)procedure:在一個(gè)procedure中處理所有的狀態(tài)轉(zhuǎn)換、次態(tài)產(chǎn)生和輸出邏輯。–兩個(gè)procedure:將處理狀態(tài)轉(zhuǎn)換的時(shí)序邏輯和處理次態(tài)與輸出的組合邏輯分開。–三個(gè)procedure:一個(gè)處理狀態(tài)轉(zhuǎn)換的時(shí)序邏輯,一個(gè)處理次態(tài)的組合邏輯,一個(gè)處理輸出的組合邏輯。?通常的描述方式如下:–指定保存狀態(tài)的寄存器。–在一個(gè)過程塊中使用case語句描述各個(gè)狀態(tài)的次態(tài)和輸出。–case分支內(nèi)部的條件分支使用if描述。30顯式FSM舉例-MooreStyle`timescale1ns/100psmodulestate4(clock,reset,out);inputreset,clock;output[1:0]out;reg[1:0]out;parameter[1:0]stateA=2'b00,stateB=2'b01,stateC=2'b10,stateD=2'b11;reg[1:0]state;reg[1:0]nextstate;always@(posedgeclock)beginif(reset)state<=stateA;elsestate<=nextstate;end31顯式FSM舉例-MooreStyle(續(xù))always@(state)begin:machinecase(state)stateA:beginnextstate=stateB;out=2'b00;endstateB:beginnextstate=stateC;out=2'b01;endstateC:beginnextstate=stateD;out=2'b10;endstateD:beginnextstate=stateA;out=2'b11;endendcaseendendmodule32顯式FSM舉例-MealyStyle`timescale1ns/100psmodulestate4(clock,reset,out,condition1,condition2);inputreset,clock,condition1,condition2;output[1:0]out;reg[1:0]out;parameter[1:0]stateA=2'b00,stateB=2'b01,stateC=2'b10,stateD=2'b11;reg[1:0]state;reg[1:0]nextstate;always@(posedgeclock)beginif(reset)state<=stateA;elsestate<=nextstate;end33顯式FSM舉例-MealyStyle(續(xù))

always@(stateorcondition1orconditiona2)begin:machinecase(state)stateA:beginif(condition1==1)beginnextstate=stateB;out=2'b00;endelsebeginnextstate=stateA;out=2'b01;endendstateB:beginif(conditiona2==1)beginnextstate=stateC;out=2'b01;endelsebeginnextstate=stateB;out=2'b00;endenddefault:beginnextstate=stateA;out=2’b00;endendcaseendendmodule343個(gè)過程塊的FSM舉例//現(xiàn)態(tài):always@(posedgeclock)beginif(reset)beginstate<=stateA;endelsestate<=nextstate;end353個(gè)過程塊的FSM舉例(續(xù)1)//次態(tài)always@(stateorcondition1orcondition2)begin:machinecase(state)stateA:beginif(condition1==1)nextstate=stateB;elsenextstate=stateA;endstateB:beginif(conditiona2==1)nextstate=stateC;elsenextstate=stateB;enddefault:beginnextstate=stateA;endendcaseend363個(gè)過程塊的FSM舉例(續(xù)2)//輸出always@(stateorcondition1orcondition2)begin:otptcase(state)stateA:beginif(condition1==1)out=2'b00;elseout=2'b01;endstateB:beginif(condition2==1)out=2'b01;elseout=2'b00;enddefault:beginout=2’b00;endendcaseend37狀態(tài)機(jī)設(shè)計(jì)舉例1:多周期處理機(jī)的控制部件設(shè)計(jì)多周期處理機(jī)執(zhí)行一條指令要用多個(gè)時(shí)鐘周期,依據(jù)指令類型的不同,所用的時(shí)鐘周期的數(shù)量也不相同。假設(shè)處理機(jī)的指令系統(tǒng)如下:31262521201615540指令000000rdrs1rs2andrd,rs1,rs2000001rdrs1immeandird,rs1,imme000010rdrs1rs2orrd,rs1,rs2000011rdrs1immeorird,rs1,imme000100rdrs1rs2addrd,rs1,rs2000101rdrs1immeaddird,rs1,imme000110rdrs1rs2subrd,rs1,rs2000111rdrs1immesubird,rs1,imme001000rdrs1immeloadrd,rs1,imme001001rdrs1immestorerd,rs1,imme001010dispbnedisp001011dispbeqdisp001100dispbranchdisp38多周期處理機(jī)的數(shù)據(jù)路徑PC寄存器堆ALUABZERO存儲器addressdataoutdatainCSOEWEWRITEMEMALUOPZEROZEROWRITEZEROMUXMUXMUX1偏移量符號擴(kuò)展立即數(shù)符號擴(kuò)展WRITEREGDIADA1A2Q2Q1SELLOADSELST偏移量立即數(shù)rdrs1rs2rdWRITEPCMUXIRMUXSELLDSTSELALUASELALUBABIMWRITEIR39多周期處理機(jī)的控制信號控制信號定義:參見上圖,數(shù)據(jù)路徑所需要的控制信號如下:WRITEPC:PC寫使能信號,為1時(shí),CLK上升沿把PC輸入端的數(shù)據(jù)寫入PC;SELLDST:存儲器地址輸入選擇,為1時(shí),選ALU計(jì)算出的地址,為0選PC;WRITEMEM:寫存儲器使能信號,由store指令產(chǎn)生;WRITEIR:IR寫使能信號,為1時(shí),CLK上升沿把由PC訪問到的指令寫入IR;SELLOAD:寄存器堆數(shù)據(jù)輸入選擇,為1時(shí)選存儲器輸出,為0選ALU輸出;SELST:執(zhí)行store指令時(shí),從寄存器堆Q2端口讀出寄存器rd的內(nèi)容;WRITEREG:寫寄存器堆使能信號;SELALUA:ALUA輸入端選擇,0選寄存器RS1,1選PC;SELALUB:ALUB輸入端選擇,00選寄存器RS2,01選立即數(shù)IM,10選1,11選偏移量;ALUOP:ALU操作控制碼;WRITEZERO:寫標(biāo)志寄存器ZERO的使能信號;40多周期處理機(jī)執(zhí)行指令的5個(gè)周期把指令的操作分成若干個(gè)周期,并力圖使每個(gè)周期完成的操作基本上達(dá)到平衡;時(shí)鐘周期的時(shí)間長度最好以某種器件的延遲時(shí)間為基準(zhǔn),如ALU、寄存器堆、存儲器等,且以較長延遲時(shí)間為基準(zhǔn)。通常把指令的執(zhí)行分為以下5個(gè)步驟,每個(gè)步驟用一個(gè)時(shí)鐘周期。取指令及PC+1周期指令譯碼、讀寄存器及轉(zhuǎn)移周期ALU執(zhí)行或者存儲器地址計(jì)算周期ALU指令結(jié)束周期或者存儲器訪問周期寫回周期41多周期處理機(jī)的總體電路圖PC寄存器堆ALUABZERO存儲器addressdataoutdatainCSOEWEWRITEMEMALUOPZEROZEROWRITEZEROMUXMUXMUX1偏移量符號擴(kuò)展立即數(shù)符號擴(kuò)展WRITEREGDIADA1A2Q2Q1SELLOADSELST偏移量立即數(shù)rdrs1rs2rdWRITEPCMUXIRMUXSELLDSTSELALUASELALUBABIMWRITEIRZEROOPCODE控制部件控制信號42多周期處理機(jī)的狀態(tài)劃分、定義及其轉(zhuǎn)移圖狀態(tài):完成某些特定功能的一個(gè)時(shí)鐘周期,例如我們把取指令周期定義為一個(gè)狀態(tài),把指令譯碼周期定義為下一個(gè)狀態(tài)。狀態(tài)之間的轉(zhuǎn)化發(fā)生在時(shí)鐘上升沿。對于同一個(gè)問題,狀態(tài)的定義和劃分可以是不同的。下面給出一種多處理機(jī)的狀態(tài)劃分方案。見下圖:IF(S0)ID(S1)ALURR(S2)LDWB(S10)ALURI(S3)LOAD(S4)STORE(S5)LDMEM(S8)STMEM(S9)ALURWB(S6)ALUIWB(S7)ALUR-RALUR-IloadstorebranchIFIDEXEMEMWB43多周期處理機(jī)的狀態(tài)轉(zhuǎn)移表當(dāng)前狀態(tài)Q3Q2Q1Q0當(dāng)前輸入下個(gè)狀態(tài)D3D2D1D00000(S0)X0001(S1)0001(S1)BR0000(S0)0001(S1)RR0010(S2)0001(S1)RI0011(S3)0001(S1)load0100(S4)0001(S1)store0101(S5)0010(S2)X0110(S6)0011(S3)X0111(S7)0100(S4)X1000(S8)0101(S5)X1001(S9)0110(S6)X0000(S0)0111(S7)X0000(S0)1000(S8)X1010(S10)1001(S9)X0000(S0)1010(S10)X0000(S0)其中:RR=and+or+add+sub(寄存器-寄存器操作);RI=andi+ori+addi+subi(寄存器-立即數(shù)操作);BR=branch+bne+beq(轉(zhuǎn)移指令);X=任意。44多周期處理機(jī)的下一狀態(tài)表達(dá)式D0=S0+S1*RI+S1*store+S3+S5;D1=S1*RR+S1*RI+S2+S3+S8;D2=S1*load+S1*store+S2+S3;D3=S4+S5+S8;將上述表達(dá)式化簡,畫出邏輯圖,即可得到多周期處理機(jī)的狀態(tài)轉(zhuǎn)移電路。45多周期處理機(jī)的控制信號表S0S1S2S3S4S5S6S7S8S9S10WRITEPC1BT000000000SELLDST0XXX1*1*XX111WRITEMEM00000000010WRITEIR10000000000SELLOADXXXX1*X001*X1SELSTX00XX

10XX1XWRITEREG00000011001SELALUA11000000000SELALUB111000000000SELALUB001011101111WRITEZERO00000011000ALUOP111OP1OP111OP1OP1111ALUOP000OP0OP000OP0OP0000BT=branch+bne*ZERO+beq*ZERO(轉(zhuǎn)移發(fā)生)OP0=or+ori+sub+subiOP1=add+addi+sub+subi46多周期處理機(jī)控制信號的表達(dá)式WRITEPC=S0+S1*BT

SELLDST=S4+S5+S8+S9+S10WRITEMEM=S9WRITEIR=S0SELLOAD=S4+S8+S10SELST=S5+S9WRITEREG=S6+S7+S10SELALUA=S0+S1SELALUB1=S0+S1SELALUB0=S1+S3+S4+S5+S7+S8+S9+S10WRITEZERO=S6+S7ALUOP1=S0+S1+S2*OP1+S3*OP1+S4+S5+S6*OP1+S7*OP1+S8+S9+S10ALUOP0=S2*OP0+S3*OP0+S6*OP0+S7*OP047modulecontrol(clk,start,zero,opcode,writepc,selldst,writemem,writeir,selload,selst,writereg,selalua,selalub,aluop,writezero);inputclk,start,zero;input[5:0]opcode;outputwritepc,selldst,writemem,writeir,selload,selst,writereg,selalua,writezero;output[1:0]selalub,aluop;reg[3:0]q;wire[3:0]d;wirezero;多周期處理機(jī)控制部件的RTL模型48always@(posedgeclk) begin if(start) q<=4'd0; else q<=d; endassignd[0]=(~q[3]&~q[2]&~q[1]&~q[0])|((~q[3]&~q[2]&~q[1]&q[0])&(~opcode[3]&opcode[0]))|((~q[3]&~q[2]&~q[1]&q[0])&(opcode[3]&~opcode[2]&~opcode[1]&opcode[0]))|(~q[3]&~q[2]&q[1]&q[0])|(~q[3]&q[2]&~q[1]&q[0]);

49assignd[1]=((~q[3]&~q[2]&~q[1]&q[0])&(~opcode[3]&~opcode[0]))|((~q[3]&~q[2]&~q[1]&q[0])&(~opcode[3]&opcode[0]))|(~q[3]&~q[2]&q[1]&~q[0])|(~q[3]&~q[2]&q[1]&q[0])|(q[3]&~q[2]&~q[1]&~q[0]);

assignd[2]=((~q[3]&~q[2]&~q[1]&q[0])&(opcode[3]&~opcode[2]&~opcode[1]&~opcode[0]))|((~q[3]&~q[2]&~q[1]&q[0])&(opcode[3]&~opcode[2]&~opcode[1]&opcode[0]))|(~q[3]&~q[2]&q[1]&~q[0])|(~q[3]&~q[2]&q[1]&q[0]);assignd[3]=(~q[3]&q[2]&~q[1]&~q[0])|(~q[3]&q[2]&~q[1]&q[0])|(q[3]&~q[2]&~q[1]&~q[0]);

50assignwritepc=(~q[3]&~q[2]&~q[1]&~q[0])|((~q[3]&~q[2]&~q[1]&q[0])&((opcode[3]&opcode[2]&~opcode[1]&~opcode[0])|(opcode[3]&~opcode[2]&opcode[1]&~opcode[0]&~zero)|(opcode[3]&~opcode[2]&opcode[1]&opcode[0]&zero)));assignselldst=(~q[3]&q[2]&~q[1]&~q[0])|(~q[3]&q[2]&~q[1]&q[0])|(q[3]&~q[2]&~q[1]&~q[0])|(q[3]&~q[2]&~q[1]&q[0])|(q[3]&~q[2]&q[1]&~q[0]);assignwritemem=q[3]&~q[2]&~q[1]&q[0];assignwriteir=~q[3]&~q[2]&~q[1]&~q[0];assignselload=(~q[3]&q[2]&~q[1]&~q[0])|(q[3]&~q[2]&~q[1]&~q[0])|(q[3]&~q[2]&q[1]&~q[0]);assignselst=(~q[3]&q[2]&~q[1]&q[0])|(q[3]&~q[2]&~q[1]&q[0]);

51assignwritereg=(~q[3]&q[2]&q[1]&~q[0])|(~q[3]&q[2]&q[1]&q[0])|(q[3]&~q[2]&q[1]&~q[0]);assignselalua=(~q[3]&~q[2]&~q[1]&~q[0])|(~q[3]&~q[2]&~q[1]&q[0]);assignselalub[1]=(~q[3]&~q[2]&~q[1]&~q[0])|(~q[3]&~q[2]&~q[1]&q[0]);assignselalub[0]=(~q[3]&~q[2]&~q[1]&q[0])|(~q[3]&~q[2]&q[1]&q[0])|(~q[3]&q[2]&~q[1]&~q[0])|(~q[3]&q[2]&~q[1]&q[0])|(~q[3]&q[2]&q[1]&q[0])|(q[3]&~q[2]&~q[1]&~q[0])|(q[3]&~q[2]&~q[1]&q[0])|(q[3]&~q[2]&q[1]&~q[0]);assignwritezero=(~q[3]&q[2]&q[1]&~q[0])|(~q[3]&q[2]&q[1]&q[0]);52assignaluop[1]=(~q[3]&~q[2]&~q[1]&~q[0])|(~q[3]&~q[2]&~q[1]&q[0])|((~q[3]&~q[2]&q[1]&~q[0])&(~opcode[3]&opcode[2]))|((~q[3]&~q[2]&q[1]&q[0])&(~opcode[3]&opcode[2]))|(~q[3]&q[2]&~q[1]&~q[0])|(~q[3]&q[2]&~q[1]&q[0])|((~q[3]&q[2]&q[1]&~q[0])&(~opcode[3]&opcode[2]))|((~q[3]&q[2]&q[1]&q[0])&(~opcode[3]&opcode[2]))|(q[3]&~q[2]&~q[1]&~q[0])|(q[3]&~q[2]&~q[1]&q[0])|(q[3]&~q[2]&q[1]&~q[0]);assignaluop[0]=((~q[3]&~q[2]&q[1]&~q[0])&(~opcode[3]&opcode[2]))|((~q[3]&~q[2]&q[1]&q[0])&(~opcode[3]&opcode[2]))|((~q[3]&q[2]&q[1]&~q[0])&(~opcode[3]&opcode[2]))|((~q[3]&q[2]&q[1]&q[0])&(~opcode[3]&opcode[2]));endmodule5354狀態(tài)機(jī)設(shè)計(jì)舉例2:可移動高性能電腦加密機(jī)

系統(tǒng)總體結(jié)構(gòu)可移動高性能電腦加密機(jī)的硬件主要由加密芯片、USB接口芯片以及晶體振蕩器等元器件構(gòu)成,其中加密芯片又包括AES加密/解密模塊、RSA加密/解密模塊和控制模塊??梢苿痈咝阅茈娔X加密機(jī)的軟件主要包括加密機(jī)控制軟件和USB驅(qū)動軟件等。其樣機(jī)照片和系統(tǒng)結(jié)構(gòu)圖見下頁。系統(tǒng)功能描述可移動高性能電腦加密機(jī)可用于進(jìn)行信息加密/解密和數(shù)字簽名。具體工作流程是:將可移動高性能電腦加密機(jī)插入電腦的USB接口,在加密機(jī)控制軟件的控制下,將存儲在PC機(jī)上的各種信息文件傳輸至電腦加密機(jī)進(jìn)行加解密處理或數(shù)字簽名,并將加解密或數(shù)字簽名后的結(jié)果文件傳輸回PC機(jī)保存。55565758AES模塊系統(tǒng)結(jié)構(gòu)圖59USBSLAVEFIFO與AES模塊的接口(控制)模塊60表1USB與AES接口模塊外部信號說明信號名稱傳輸方向信號含義clk輸入時(shí)鐘信號rst輸入復(fù)位信號,1有效。load輸出數(shù)據(jù)裝載使能信號,用于控制輸入明/密文、密鑰、S盒配置數(shù)據(jù)等,1有效。address<7:0>輸出寄存器或RAM地址,用于表示明文/密文/密鑰寄存器、S盒RAM單元。keyexpen輸出密鑰擴(kuò)展使能信號,1有效。keyexprdy輸入密鑰擴(kuò)展完成標(biāo)識信號,1有效。staenc輸出開始加密使能信號,1有效。stadec輸出開始解密使能信號,1有效。encdecrdy輸入加/解密運(yùn)算完成標(biāo)識信號,1有效。din<15:0>輸出接AES輸入數(shù)據(jù)總線,用于輸入明/密文、密鑰、配置數(shù)據(jù)等。61表1USB與AES接口模塊外部信號說明(續(xù))信號名稱傳輸方向信號含義dout<15:0>輸入AES輸出數(shù)據(jù)總線,用于輸出加/解密結(jié)果到接口模塊。shift輸出結(jié)果移位輸出使能信號,1有效。有效時(shí),每個(gè)時(shí)鐘周期移位輸出16位結(jié)果。SLOE輸出USBFIFO輸出使能信號,0有效。SLRD輸出讀USBFIFO輸出使能信號,0有效。SLWR輸出寫USBFIFO輸出使能信號,0有效。FIFOADR<1:0>輸出USBFIFO地址。FULL輸入U(xiǎn)SBFIFO滿標(biāo)志信號,0有效。EMPTY輸入U(xiǎn)SBFIFO空標(biāo)志信號,0有效。FD<15:0>輸入/輸出USBFIFO讀寫數(shù)據(jù)總線。62狀態(tài)劃分及定義S0:初始狀態(tài)。從USBSLAVEFIFO中讀出一個(gè)控制字,根據(jù)控制字內(nèi)容轉(zhuǎn)到相應(yīng)狀態(tài)。需要控制的信號:SLOE、SLRD、FIFOADR<1:0>。復(fù)位后處于初始狀態(tài)。S1:密鑰裝載狀態(tài)。需要控制的信號:load、address、din、SLOE、SLRD、FIFOADR<1:0>。S2:密鑰擴(kuò)展?fàn)顟B(tài)。需要控制的信號:keyexpen。S3:加密S盒配置狀態(tài)。需要控制的信號:load、address、din、SLOE、SLRD、FIFOADR<1:0>。S4:明文裝載狀態(tài)。需要控制的信號:load、address、din、SLOE、SLRD、FIFOADR<1:0>。S5:加密狀態(tài)。需要控制的信號:staenc。63狀態(tài)劃分及定義(續(xù))S6:加密結(jié)果輸出狀態(tài)。需要控制的信號:shift、FD<15:0>、SLWR、FIFOADR<1:0>。S7:解密S盒配置狀態(tài)。需要控制的信號:load、address、din、SLOE、SLRD、FIFOADR<1:0>。S8:密文裝載狀態(tài)。需要控制的信號:load、address、din、SLOE、SLRD、FIFOADR<1:0>。S9:解密狀態(tài):需要控制的信號:stadec。S10:解密結(jié)果輸出狀態(tài)。需要控制的信號:shift、FD<15:0>、SLWR、FIFOADR<1:0>。64狀態(tài)轉(zhuǎn)移圖65狀態(tài)轉(zhuǎn)移及控制信號取值表當(dāng)前狀態(tài)當(dāng)前輸入下一狀態(tài)當(dāng)前輸出S0CONWD≠下述5個(gè)值,EMPTYS0SLOE、SLRD、FIFOADR<1:0>S0CONWD=8000HS1SLOE、SLRD、FIFOADR<1:0>S0CONWD=4000HS3SLOE、SLRD、FIFOADR<1:0>S0CONWD=2000HS4SLOE、SLRD、FIFOADR<1:0>S0CONWD=1000HS7SLOE、SLRD、FIFOADR<1:0>S0CONWD=0800HS8SLOE、SLRD、FIFOADR<1:0>S1密鑰裝載結(jié)束S2load、address、din、SLOE、SLRD、FIFOADR<1:0>S1密鑰裝載沒結(jié)束S1load、address、din、SLOE、SLRD、FIFOADR<1:0>66狀態(tài)轉(zhuǎn)移及控制信號取值表(續(xù)1)當(dāng)前狀態(tài)當(dāng)前輸入下一狀態(tài)當(dāng)前輸出S2密鑰擴(kuò)展結(jié)束S0keyexpenS2密鑰擴(kuò)展沒結(jié)束S2keyexpenS3加密S盒配置結(jié)束S0load、address、din、SLOE、SLRD、FIFOADR<1:0>S3加密S盒配置沒結(jié)束S3load、address、din、SLOE、SLRD、FIFOADR<1:0>S4明文裝載結(jié)束S5load、address、din、SLOE、SLRD、FIFOADR<1:0>S4明文裝載沒結(jié)束S4load、address、din、SLOE、SLRD、FIFOADR<1:0>S5加密結(jié)束S6staencS5加密沒結(jié)束S5staenc67S6加密結(jié)果輸出結(jié)束S0shift、FD<15:0>、SLWR、FIFOADR<1:0>S6加密結(jié)果輸出沒結(jié)束S6shift、FD<15:0>、SLWR、FIFOADR<1:0>S7解密S盒配置結(jié)束S0load、address、din、SLOE、SLRD、FIFOADR<1:0>S7解密S盒配置沒結(jié)束S7load、address、din、SLOE、SLRD、FIFOADR<1:0>S8密文裝載結(jié)束S9load、address、din、SLOE、SLRD、FIFOADR<1:0>S8密文裝載沒結(jié)束S8load、address、din、SLOE、SLRD、FIFOADR<1:0>S9解密結(jié)束S10stadecS9解密沒結(jié)束S9stadecS10解密結(jié)果輸出結(jié)束S0shift、FD<15:0>、SLWR、FIFOADR<1:0>S10解密結(jié)果輸出沒結(jié)束S10shift、FD<15:0>、SLWR、FIFOADR<1:0>狀態(tài)轉(zhuǎn)移及控制信號取值表(續(xù)2)68moduleusb_aes_intf(clk,rst,full,empty,fd,keyexprdy,encdecrdy,dout,load,address,keyexpen,staenc,stadec,din,shift, sloe,slrd,slwr,fifoadr);

inputclk,rst,full,empty,keyexprdy,encdecrdy; inout[15:0]fd; input[15:0]dout;

outputload,keyexpen,staenc,stadec,shift,sloe,slrd,slwr; output[7:0]address; output[15:0]din; output[1:0]fifoadr;

RTL代碼69

reg[10:0]cur_state,nxt_state,state_delay; reg[4:0]con_word;//con_word=5'b10000,gotoKEY_LOADstate,//con_word=5'b01000,gotoENC_SBOX_CFGstate, //con_word=5'b00100,gotoPTEXT_LOADstate,//con_word=5'b00010,gotoDEC_SBOX_CFGstate, //con_word=5'b00001,gotoCTEXT_LOADstate.

reg[15:0]usb_in_data,aes_in_data; wireaes_in_reg_en,data_to_usb_en,key_load_end,key_expand_end,enc_sbox_cfg_end,ptext_load_end; wireencrypt_end,enc_result_out_end,dec_sbox_cfg_end; wirectext_load_end,decrypt_end,dec_result_out_end; regslrd,load,slwr; reg[6:0]wordcount; wirecon_reg_en,writefifo,sloe; wire[1:0]fifoadr; reg[7:0]address1,address;

70parameterINITIAL=11'b100_0000_0000, KEY_LOAD=11'b000_0000_0001, KEY_EXPAND=11'b000_0000_0010, ENC_SBOX_CFG=11'b000_0000_0100, PTEXT_LOAD=11'b000_0000_1000, ENCRYPT=11'b000_0001_0000, ENC_RESULT_OUT=11'b000_0010_0000, DEC_SBOX_CFG=11'b000_0100_0000, CTEXT_LOAD=11'b000_1000_0000, DECRYPT=11'b001_0000_0000, DEC_RESULT_OUT=11'b010_0000_0000;

71//controlwordregister always@(posedgeclk) if(rst) con_word<=5'd0; else if(con_reg_en) con_word<=fd[4:0]; else if(con_word!=5'd0) con_word<=5'd0; else con_word<=con_word; 72//usbindataregister always@(posedgeclk)if(rst)usb_in_data<=16'd0;elseif(slrd==0) usb_in_data<=fd;elseusb_in_data<=usb_in_data;

73//aesindataregisteralways@(posedgeclk)if(rst)aes_in_data<=16'd0;elseif(aes_in_reg_en) aes_in_data<=dout;else aes_in_data<=aes_in_data;assignaes_in_reg_en=encdecrdy|shift;

//fdisbidirectiondatabusassignfd=data_to_usb_en?aes_in_data:16'bzzzz_zzzz_zzzz_zzzz;assigndata_to_usb_en=(cur_state==ENC_RESULT_OUT)|(cur_state==DEC_RESULT_OUT);

74//mainFSMalways@(posedgeclk)if(rst)cur_state<=INITIAL;elsecur_state<=nxt_state;

always@(cur_stateorcon_wordorkey_load_endorkey_expand_endorenc_sbox_cfg_endorptext_load_endorencrypt_endorenc_result_out_endordec_sbox_cfg_endorctext_load_endordecrypt_endordec_result_out_end)case(cur_state)INITIAL:case(con_word)5'b10000:nxt_state=KEY_LOAD;5'b01000:nxt_state=ENC_SBOX_CFG;5'b00100:nxt_state=PTEXT_LOAD;5'b00010:nxt_state=DEC_SBOX_CFG;5'b00001:nxt_state=CTEXT_LOAD;default:nxt_state=INITIAL;endcase

75KEY_LOAD: if(key_load_end) nxt_state=KEY_EXPAND; else nxt_state=KEY_LOAD; KEY_EXPAND: if(key_expand_end) nxt_state=INITIAL; else nxt_state=KEY_EXPAND; ENC_SBOX_CFG: if(enc_sbox_cfg_end) nxt_state=INITIAL; else nxt_state=ENC_SBOX_CFG; PTEXT_LOAD: if(ptext_load_end) nxt_st

溫馨提示

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

最新文檔

評論

0/150

提交評論