微型計算機接口-第13章-FPGA設(shè)計基礎(chǔ)_第1頁
微型計算機接口-第13章-FPGA設(shè)計基礎(chǔ)_第2頁
微型計算機接口-第13章-FPGA設(shè)計基礎(chǔ)_第3頁
微型計算機接口-第13章-FPGA設(shè)計基礎(chǔ)_第4頁
微型計算機接口-第13章-FPGA設(shè)計基礎(chǔ)_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2023/10/22計算機接口技術(shù)1第13章基于FPGA的接口電路設(shè)計本章主要內(nèi)容

接口電路實現(xiàn)的技術(shù)趨勢

FPGA設(shè)計基礎(chǔ)

用VerilogHDL進行電路設(shè)計

并行接口8255A的FPGA設(shè)計13.1接口電路實現(xiàn)的技術(shù)趨勢

●傳統(tǒng)接口設(shè)計:專用接口芯片(8251,8255,

USB,PCI等)●現(xiàn)在接口設(shè)計:FPGA●基于FPGA接口設(shè)計的優(yōu)點2023/10/22計算機接口技術(shù)2靈活性大通用性強功耗低、速度快、集成度高13.2FPGA設(shè)計基礎(chǔ)

13.2.1FPGA的工作原理●FPGA利用一種稱為查找表(LUT)的結(jié)構(gòu)實現(xiàn)反復(fù)燒寫●用戶通過原理圖或HDL語言描述邏輯電路,F(xiàn)PGA會自動計算邏輯電路的結(jié)果,把結(jié)果存入LUT中?!褫斎脒壿嬓盘枙r就相當(dāng)于輸入一個地址在LUT中查找,找出結(jié)果。2023/10/22計算機接口技術(shù)34輸入“與”門的實例2023/10/22計算機接口技術(shù)4圖13.1輸入“與”門實例對圖13.1的幾點說明

●LUT的值存入SRAM中或Flash中。●利用地址作為索引,在LUT中查找值。●完成的功能與實際電路等價,具有更快的執(zhí)行速度、更大的規(guī)模?!馲ilinx和Altera公司的FPGA是基于SRAM的,掉電后內(nèi)部邏輯消失,用戶需要添加一個外存儲器來存儲程序。2023/10/22計算機接口技術(shù)513.2.2FPGA的設(shè)計流程FPGA的設(shè)計流程如圖13.2所示。

2023/10/22計算機接口技術(shù)6電路功能設(shè)計設(shè)計輸入功能仿真綜合優(yōu)化綜合后仿真實現(xiàn)與布線時序仿真板級仿真芯片編程與調(diào)試圖13.2FPGA的設(shè)計流程13.2.3FPGA的開發(fā)工具●Xilinx的ISE:ISE是Xilinx公司的FPGA/CPLD綜合集成設(shè)計平臺,界面友好,操作簡單。ISE提供了包括代碼編寫、庫管理、HDL綜合、仿真、下載等幾乎所有FPGA開發(fā)所需的工具。

●Xilinx的Vivado:Vivado是全新的另一個XilinxFPGA開發(fā)工具,是為高端FPGA專門開發(fā)的一款開發(fā)工具。

2023/10/22計算機接口技術(shù)7ViVado相比ISE,有著顯著的進步,主要表現(xiàn)在以下幾方面。

2023/10/22計算機接口技術(shù)8強調(diào)以IP為中心的系統(tǒng)設(shè)計思想。允許設(shè)計者在多個方案中探索最優(yōu)的實現(xiàn)方法。提供了更高效的時序收斂能力。提供設(shè)計者對FPGA時序、布局布線的高效控制能力。提供了高級綜合工具VivadoHIS,用戶可以用高級語言對FPGA建模。13.3采用VerilogHDL進行電路設(shè)計13.1HDL簡介HDL語言用文本形式來描述電子系統(tǒng)硬件電路的行為、結(jié)構(gòu)、數(shù)據(jù)流,數(shù)字電路的設(shè)計者可以從頂層到底層描述自己的設(shè)計思想。主要特征:

2023/10/22計算機接口技術(shù)9兼具一些高級語言的結(jié)構(gòu)形式和硬件線路的具體結(jié)構(gòu)。HDL語言是并行處理的。使用結(jié)構(gòu)級行為描述,可以在不同的抽象層次描述設(shè)計。具有時序的概念。學(xué)習(xí)HDL時需要注意的地方

2023/10/22計算機接口技術(shù)10了解HDL的可綜合性問題。用硬件電路設(shè)計思想來編寫HDL。語法掌握貴在精,不在多。13.3.2VHDL與VerilogHDL的比較●相同點

2023/10/22計算機接口技術(shù)11都能形式化的抽象表示電路的行為和結(jié)構(gòu)。支持邏輯設(shè)計中層次與范圍的描述??梢院喕娐沸袨榈拿枋?。具有電路仿真與驗證機制。便于管理和設(shè)計重用。2023/10/22計算機接口技術(shù)12與VHDL相比,VerilogHDL最大的優(yōu)勢在于它非常容易掌握,只要有C語言的編程基礎(chǔ),就很快能夠掌握;VHDL不是很直觀,需要有Ada的編程基礎(chǔ),一般需要半年以上的專業(yè)培訓(xùn)才能掌握。一般認為VerilogHDL在系統(tǒng)級抽象方面比VHDL略差些;在門級開關(guān)電路描述方面VerilogHDL要強的多。

VHDL適合特大型的系統(tǒng)設(shè)計;VerilogHDL較為適合系統(tǒng)級、算法級、寄存器傳輸級、邏輯級、門級和開關(guān)級的電路設(shè)計?!癫煌c13.3.3基于HDL的電路設(shè)計方法●傳統(tǒng)上使用自底向上的設(shè)計方法,即:器件選擇

模塊設(shè)計

模塊間綜合

系統(tǒng)仿真。這樣只有在后期才能發(fā)現(xiàn)系統(tǒng)設(shè)計的問題,導(dǎo)致修改麻煩?!窭肏DL進行電路設(shè)計采用自頂向下的設(shè)計方法,對系統(tǒng)不斷劃分成小模塊,直到可用EDA元件實現(xiàn)為止。利用硬件描述語言對設(shè)計的模塊進行描述和定義,結(jié)合多層仿真技術(shù),在確保設(shè)計可行性的條件下完成系統(tǒng)的設(shè)計。這種設(shè)計方法的好處是在每一層都進行仿真,能夠及時發(fā)現(xiàn)設(shè)計錯誤,減輕設(shè)計成本。

2023/10/22計算機接口技術(shù)1313.3.4VerilogHDL的模塊結(jié)構(gòu)例13.1二路選擇器的Verilog實現(xiàn),如圖13.3所示。

2023/10/22計算機接口技術(shù)14as1bout圖13.3二路選擇器13.3.4VerilogHDL的模塊結(jié)構(gòu)模塊和說明

2023/10/22計算機接口技術(shù)15modulemux21(out,a,b,s1)inputa,b,s1;outputout;regout;always@(s1oraorb)if(!s1)out=a;elseout=b;endmodule●輸入端口:a,b,s1,默認1位,wire數(shù)據(jù)類型;●輸出端口:out,默認1位,reg數(shù)據(jù)類型;●模塊定義包括:端口定義、IO說明、內(nèi)部信號說明和功能定義。

13.3.5Verilog

HDL語言的描述方法●結(jié)構(gòu)化描述是通過元件實例進行描述的方法,就像在電路圖輸入方式下調(diào)入庫元件一樣,鍵入元件的名稱和相連的引腳即可?!窭Z句:使得一個模塊能夠在另外一個模塊中被引用。其格式是:

模塊名實例名(端口關(guān)聯(lián));●端口關(guān)聯(lián):指明了模塊和外部端口信號,模塊和模塊之間的連接。其格式是:連接信號名 //通過位置

.端口名(連接信號名)//通過名稱

2023/10/22計算機接口技術(shù)16例13.2

三路選擇器的例化設(shè)計三路選擇器如圖13.4所示。

2023/10/22計算機接口技術(shù)17abs1outabs1outU1U2ya2a3s0s1a1tmp圖13.4三路選擇器模塊定義和說明

2023/10/22計算機接口技術(shù)18modulemux31(y,a1,a2,a3,s0,s1)inputa1,a2,a3,s0,s1;outputy;

regy;wiretmp;mux21U1(tmp,a2,a3,s0);mux21U2(.out(y),.a(a1),.b(tmp),.s1(s1) );endmodule●實例化U1采用的是位置關(guān)聯(lián)?!駥嵗疷2采用的是名稱關(guān)聯(lián)。

13.3.5Verilog

HDL語言的描述方法數(shù)據(jù)流描述形式就是用assign連續(xù)賦值語句描述電路或系統(tǒng)中信號的傳遞關(guān)系。assign語句是并行語句。連續(xù)賦值語句將值賦給線網(wǎng)。格式:assignLHS_target=RHS_expression

右邊的值受監(jiān)控,一有變化就重新計算,結(jié)果值有變化,就賦給左邊。例如:wire[3:0]Z,Preset,Clear; assignZ=Preset&Clear,

在沒有定義時延的情況下右邊的值立即賦給左邊。

2023/10/22計算機接口技術(shù)19數(shù)據(jù)流描述形式顯式定義時延的例子例如:assign#6Ask=Quiet||Late;表示計算結(jié)果后經(jīng)過6個時間單位之后進行賦值。如圖13.5所示,時刻5Late發(fā)生變化,時刻11賦值給Ask。2023/10/22計算機接口技術(shù)20圖13.5連續(xù)賦值語句中的時延●定義時延的語法可以定義三類時延值:上升時延,下降時延,關(guān)閉時延。語法如下:●如何靈活利用時延

2023/10/22計算機接口技術(shù)21assign#(rise,fall,turn-off)LHS_target=RHS_expression;assign#4Ask=Quiet||Late;assign#(4,8)Ask=Quick;assign#(4,8,6)Arb=&DataBus;assignBus=MemAddr[7:4];例13.33-8譯碼器的電路設(shè)計3-8譯碼器的代碼模塊如下:

2023/10/22計算機接口技術(shù)22moduledecoder3x8(a,b,c,en,z);inputa,b,c,en;output[0:7]z;wirenota,notb,notc;

assign#1nota=~a;assign#1notb=~b;assign#1notc=~c;assign#2z[0]=nota¬b¬c&en;assign#2z[1]=a¬b¬c&en;assign#2z[2]=nota&b¬c&en;assign#2z[3]=a&b¬c&en;assign#2z[4]=nota¬b&c&en;assign#2z[5]=a¬b&c&en;assign#2z[6]=nota&b&c&en;assign#2z[7]=a&b&c&en;endmodule

行為描述形式●行為描述形式就是使用initial和always語句來設(shè)計行為建模?!駃nitial語句:只執(zhí)行一次,在時刻0開始執(zhí)行,若有兩個initial語句,則在時刻0并行執(zhí)行?!駃nitial語句的格式:

2023/10/22計算機接口技術(shù)23initialbegin/fork

塊內(nèi)變量說明

時序控制1行為語句1;時序控制2行為語句2;……時序控制n行為語句n;//可以是時延控制或事件控制end/join例13.4

帶有順序過程的initial語句例子程序和運行時port_A值的變化情況如圖13.6所示。

2023/10/22計算機接口技術(shù)24parameterAPPLY_DELAY=5;reg[0:7]port_A;...initialbeginPort_A='h20;#APPLY_DELAYPort_A='hF2;#APPLY_DELAYPort_A='h41;#APPLY_DELAYPort_A='h0A;end圖13.6使用initial語句產(chǎn)生的波形always語句(可以循環(huán)執(zhí)行)●格式●幾點說明

2023/10/22計算機接口技術(shù)25always@(敏感事件列表)

begin/fork

塊內(nèi)變量說明

時序控制1行為語句1;時序控制2行為語句2;……時序控制n行為語句n;end/join1.敏感事件是可選項,目的是為了觸發(fā)always語句的執(zhí)行。2.敏感事件表由一個或多個事件表達式構(gòu)成。3.過程語句、時延控制與initial語句大致相同。4.always過程塊主要對硬件功能行為進行描述,可實現(xiàn)鎖存器和觸發(fā)器,也可用來實現(xiàn)組合邏輯。例13.5initial和always語句的綜合使用

2023/10/22計算機接口技術(shù)26moduleTestXorBehavior;regSa,Sb,Zeus;initialbeginSa=0;Sb=0;#5Sb=1;#5Sa=1;#5Sb=0;endalways@(SaorSb)Zeus=Sa^Sb;always@(Zeus)$display("Attime%t,Sa=%d,Sb=%d,Zeus=%b",$time,Sa,Sb,Zeus)endmodule

時序控制●延遲控制:通過表達式定義開始遇到這條語句

和真正執(zhí)行這條語句之間的延遲時間。

●事件控制:通過表達式定義開始遇到這條語句和真正執(zhí)行這條語句之間的延遲時間。●邊沿觸發(fā)事件控制:指信號的邊沿跳變時發(fā)生指定的行為。有上升沿控制(posedge描述)和下降沿控制(negedge描述)。

2023/10/22計算機接口技術(shù)27語句間時延:Sum=(A^B)^Cin;#4T1=A&Cin;//即第一條語句執(zhí)行后四個時間單位執(zhí)行第二條語句。語句內(nèi)時延:Sum=#3(A^B)^Cin;//計算好右邊值得等3個時間單位后賦值給左邊。例13.6邊沿觸發(fā)事件計數(shù)器如果clk信號上有上升沿,那么cnt信號就會加1,實現(xiàn)計數(shù)功能。

邊沿觸發(fā)事件控制,指信號的電平發(fā)生變化使發(fā)生指定的行為。2023/10/22計算機接口技術(shù)28reg[4:0]cnt;always@(posedgeclk)beginif(reset)cnt=0;elsecnt=cnt+1;end例13.7電平觸發(fā)計數(shù)器只要a、b、c信號的電平有變化,cnt的值就會加1?!?/p>

2023/10/22計算機接口技術(shù)29reg[4:0]cnt;always@(aorborc)beginif(reset)cnt=0;elsecnt=cnt+1;end13.4并行接口8255A的FPGA設(shè)計13.4.1模塊劃分用自頂向下的設(shè)計方法,從芯片結(jié)構(gòu)入手,將要設(shè)計的芯片分成幾個子模塊,逐一設(shè)計調(diào)試。各個模塊相互獨立,利于錯誤定位和修改。2023/10/22計算機接口技術(shù)30外圍邏輯8位數(shù)據(jù)傳輸控制模塊(IOB)1位數(shù)據(jù)傳輸控制模塊(IOB1)8255內(nèi)核8255A芯片2023/10/22計算機接口技術(shù)318255A的FPGA總體設(shè)計框圖,如圖13.7

所示。圖13.78255AFPGA總體設(shè)計框圖2023/10/22計算機接口技術(shù)32//實例化語句,信號端口通過位置關(guān)聯(lián)T8255AT(reset,nCS,nRD,nWR,A,Din,PAin,PBin,PCin,DEn,PAEn,PBEn,PCEn,Dout,PAout,PBout,PCout);//內(nèi)核模塊

IOBBD(Dout,Din,Den,D);//內(nèi)部數(shù)據(jù)總線的傳輸方向控制模塊

IOBBA(PAout,PAin,PAEn,PA);//A口的傳輸方向控制模塊

IOBBB(PBout,PBin,PBEn,PB);//B口的傳輸方向控制模塊

IOB1BC(PCout,PCin,PCEn,PC);//C口的傳輸方向控制模塊13.4.2頂層主模塊設(shè)計●主模塊定義了芯片的外部接口,同時還定義了若干內(nèi)部連線,用于連接內(nèi)核模塊和其他外圍模塊?!癫捎迷Z句,將8255A內(nèi)核設(shè)計和外圍邏輯設(shè)計組裝起來,形成完整的8255A功能。主要代碼如下:2023/10/22計算機接口技術(shù)33

moduleIOB(Din,Dout,InEn,Dbus);input[7:0]Din;inputInEn;//InEn等于0時輸入,等于1時輸出

output[7:0]Dout;

inout[7:0]Dbus;

assignDbus=(InEn)?Din:8'hzz;

assignDout=(InEn)?Dout:Dbus;endmodule13.4.3IOB模塊和IOB1模塊設(shè)計●IOB模塊將內(nèi)核的單向數(shù)據(jù)總線綜合設(shè)計成雙向的數(shù)據(jù)總線,該模塊8位數(shù)據(jù)一起輸入/出;●IOB1模塊將內(nèi)核口C的單向數(shù)據(jù)總線設(shè)計成雙向的數(shù)據(jù)總線,該模塊是按位控制的。IOB模塊代碼如下:2023/10/22計算機接口技術(shù)3413.4.48255A內(nèi)核模塊設(shè)計●控制模塊●多路數(shù)據(jù)模塊●A口模塊●B口模塊●C口模塊2023/10/22計算機接口技術(shù)35●控制模塊●作用:管理內(nèi)部、外部數(shù)據(jù)信息、控制字、狀態(tài)字的傳送過程;解析CPU送來的控制信號。●輸入:復(fù)位信號reset,片選nCS,端口選擇A[1-0],寫nWR,讀nRD,輸入數(shù)據(jù)Din,Pcin。●輸出:選路信號DoutSelect。

鎖存允許信號PAInLd,PAOutLd,PBInLd,PBOutLd和PCOutLd控制?!窀鱾€口是否接受輸入或輸出:輸入輸出選擇信號Den,PAEn,PBEn和PCEn,輸出給外圍邏輯模塊?!窨刂菩盘朇trlData。2023/10/22計算機接口技術(shù)36

●多路數(shù)據(jù)選擇模塊

本質(zhì)上是一個多路選擇器,接受來自控制模塊的選路信號后將選中的數(shù)據(jù)輸出,包括PAin,PAInBuf,PBInBuf,PCin和PC_Status等。

●口A口B輸入/輸出模塊

口A和口B都有一個輸入和輸出模塊、8位的輸入數(shù)據(jù)鎖存器/緩沖器、8位輸出數(shù)據(jù)鎖存器/緩沖。

●C口輸出和控制模塊

可作為普通的數(shù)據(jù)通道,又可作為控制和狀態(tài)信息的通道,負責(zé)C口的數(shù)據(jù)輸入輸出以及準(zhǔn)確的產(chǎn)生接收和聯(lián)絡(luò)信號,在不同的工作方式、IO方向下產(chǎn)生相應(yīng)的邏輯一位一位控制PCout,PCStatus。

2023/10/22計算機接口技術(shù)37各個模塊間的數(shù)據(jù)流,如圖13.8所示。圖13.8內(nèi)核模塊間數(shù)據(jù)流圖2023/10/22計算機接口技術(shù)38

assignreset=(nCS)?1'b1:rst;//實例化

CtrlLogicU1(reset,nCS,nRD,nWR,A,Din,PCin[4],PCin[2],PCin[6],PCin[2],DEn,PAEn,PBEn,PCEn,PAInLd,PBInLd,PAOutLd,PBOutLd,PCOutLd,CtrlData,DoutSelect);DoutMuxU2(PAin,PAInBuf,PBin,PBInBuf,PCStatus,DoutSelect,Dout);PCIOU3(reset,nRD,nWR,A,Din,PCin,CtrlData,PCOutLd,PCStatus,Pcout);PAInU4(reset,PAin,PAInLd,PAInBuf);PAOutU5(reset,Din,PAOutLd,PAout);PBInU6(reset,PBin,PBInLd,PBInBuf);PBOutU7(reset,Din,PBOutLd,PBout);內(nèi)核模塊代碼設(shè)計兩條內(nèi)部數(shù)據(jù)總線Din和Dout,用于內(nèi)核內(nèi)部8位數(shù)據(jù)的輸入輸出;定義若干內(nèi)部連線用于內(nèi)核各模塊的連接,采用元件例化語句,將圖13.6中各模塊組裝起來形成8255A內(nèi)核完整功能。主要代碼如下:2023/10/22計算機接口技術(shù)39always@(resetornCSorAornWRorDin)//控制字寄存器賦值

If(reset)//復(fù)位,寄存器全部清零

……

elseif(nCS==1'b0&&A==2'b11&&nWR==1'b0&&Din[7]==1'b1)//寫入方式選擇控制字

begin

ControlFlag=1'b1; ModeA=(Din[6])?2'b10:{Din[6:5]};PAIO=~Din[4];PCUpIO=~Din[3];ModeB=Din[2];PBIO=~Din[1];PCLowIO=~Din[0];endelseif(nCS==1'b0&&A==2'b11&&nWR==1'b0&&Din[7]==1'b0)//按位置位/復(fù)位控制字

begin

ControlFlag=1'b0;BitSelect=Din[3:1];PCRS=Din[0];end控制字的判斷:判斷控制字是工作方式選擇字還是對口C的按位置位/復(fù)位控制字,以此為根據(jù),決定控制字的分解方式。實現(xiàn)該功能的always語句如下:2023/10/22計算機接口技術(shù)4013.4.5控制模塊設(shè)計

●C口控制信號CtrlData的產(chǎn)生:將解析出的相關(guān)控制字寄存器的值合成賦值給寄存器CtrlData,輸出控制C口模塊。實現(xiàn)該功能的always語句如下:always@(resetorControlFlagorModeAorModeBorPAIOorPBIO)//CtrlData輸出給C口模塊

if(reset)CtrlData=7'b0000000;elseCtrlData={PCRS,ControlFlag,ModeA,ModeB,PAIO,PBIO};2023/10/22計算機接口技術(shù)41

●輸入/輸出選擇信號的產(chǎn)生

外圍邏輯輸入/輸出選擇信號DEn:由寫、讀信號決定。相關(guān)代碼如下:always@(resetornRDornWR)//DEnif(reset)DEn=1'b0;elseif(!nWR)DEn=1'b0;elseif(!nRD)DEn=1'b1;elseDEn=1'b0;2023/10/22計算機接口技術(shù)42●PAEn與PBEn選擇信號的產(chǎn)生PAEn方式0和1時等于控制字中的PAIO方式2時取決于nACK信號PBEn:只取決于控制字中的PBIO2023/10/22計算機接口技術(shù)43●PAEn與PBEn選擇信號的產(chǎn)生always@(resetorModeAorPAIOornSTBAornACKA)//PAEnif(reset)PAEn=1'b0;//復(fù)位清0

elseif(ModeA!=2'b10)PAEn=PAIO; //A口工作于方式0/1,由輸入輸出方向決定

else //A口工作于方式2,,由nACK等信號決定

begin

if(nSTBA==1'b0)PAEn=1'b0;elseif(nACKA==1'b0)PAEn=1'b1;elsePAEn=PAIO;endalways@(resetorModeBorPBIO)//PBEnif(reset)PBEn=1'b0;//復(fù)位清0;

elsePBEn=PBIO;//由輸入輸出方向決定;2023/10/22計算機接口技術(shù)44PCEnPCEn是逐位控制的,各位的值與A/B口的工作方式和傳輸方向有關(guān)。A/B口工作在方式0:PC作為數(shù)據(jù)口使用,PCEn=PCIOA口為方式1或2時,PC部分引腳作專用的聯(lián)絡(luò)信號使用,PCEn的高5位與A口的方式和傳輸方向有關(guān)。B口為方式1時,PCEn的低三位與B口的方式和傳輸方向有關(guān)。2023/10/22計算機接口技術(shù)45●PCEnalways@(resetorModeBorPCLowIO)//PCEn[2-0],低三位由B口決定

if(reset)PCEn[2:0]=3'b000;elseif(ModeB==1'b1)PCEn[2:0]={1'b0,1'b1,1'b1};//B口方式1,固定

elsePCEn[2:0]={3{PCLowIO}};//B口方式0,由輸入輸出方向決定always@(resetorModeAorPCUpIOorPCLowIOorPAIO) //PCEn[7-3],高5位,由A口決定

if(reset)PCEn[7:3]=5'b00000;elseif(ModeA==2'b10)PCEn[7:3]=5'b10101; //A口方式2,固定

elseif(ModeA==2'b01) //A口方式1,與方向有關(guān);

begin

if(PAIO==1'b0)PCEn[7:3]={{2{PCUpIO}},1'b1,1'b0,1'b1}; //A口方式1輸入

elsePCEn[7:3]={1'b1,1'b0,{2{PCUpIO}},1'b1};//A口方式1輸出

end

elsePCEn[7:3]={{4{PCUpIO}},PCLowIO};//A口方式02023/10/22計算機接口技術(shù)46always@(resetorAornRD)//PAInLdif(reset)PAInLd=1'b0;//復(fù)位清0;

elseif(nCS==1'b0&&A==2'b00&&nRD==1'b0)PAInLd=1'b0;//A口選中,讀

elsePAInLd=1'b1;//其它情況always@(resetorAornRD)//PBInLdif(reset)PBInLd=1'b0;//復(fù)位清0

elseif(nCS==1'b0&&A==2'b01&&nRD==1'b0)PBInLd=1'b0;//B口選中,讀

elsePBInLd=1'b1;//其它情況;

●A口和B口的鎖存允許信號產(chǎn)生A/B模塊的鎖存允許信號由地址信號和讀寫信號給出。相關(guān)代碼如下:2023/10/22計算機接口技術(shù)47

ModeA=0時PC[7-5]用于輸入/輸出數(shù)據(jù)ModeB=0時PC[2-0]用于輸入/輸出數(shù)據(jù)ModeA=0且A口輸入時,PC7和PC6位用于輸入/輸出數(shù)據(jù)ModeA=0且A口輸出時,PC5和PC4位用于輸入/輸出數(shù)據(jù)

●C口的鎖存允許信號產(chǎn)生在方式選擇字控制下,當(dāng)C口的某些位作為數(shù)據(jù)口時,相應(yīng)位的PCOutLd=0;做聯(lián)絡(luò)口使用時,相應(yīng)的PCOutLd=1。PC口做數(shù)據(jù)口使用時共有以下四種情況。2023/10/22計算機接口技術(shù)48always@(resetorControlFlagorModeAorModeBorDin[3:0]orPAIO)//PCOutLdif(reset)PCOutLd=8'b00000_000;elseif(ControlFlag==0)//置位復(fù)位控制字,PC在按位操作中,PCOutLd為0的位被選中

begin

case(Din[3:1])

3'b000:PCOutLd=8'b11111110; 3'b001:PCOutLd=8'b11111101; 3'b010:PCOutLd=8'b11111011; 3'b011:PCOutLd=8'b11110111; 3'b100:PCOutLd=8'b11101111; 3'b101:PCOutLd=8'b11011111; 3'b110:PCOutLd=8'b10111111; 3'b111:PCOutLd=8'b01111111; default:PCOutLd=8'b11111111;endcaseend

相關(guān)代碼如下:2023/10/22計算機接口技術(shù)49相關(guān)代碼如下:else//方式選擇控制字,作數(shù)據(jù)I/O的相應(yīng)位為0;

if(ModeA==2'b00&&ModeB==1'b0)PCOutLd=8'b00000000;//A口方式0,B口方式0;

elseif(ModeA==2'b00&&ModeB==1'b1)PCOutLd=8'b00000111;//A口方式0,B口方式1;

elseif(ModeA==2‘b01&&PAIO==1’b0&&ModeB==1‘b0)PCOutLd=8’b00111000;

//A方式1輸入,B方式0

elseif(ModeA==2'b01&&PAIO==1'b0&&ModeB==1'b1)PCOutLd=8'b00111111; //A方式1輸入,B方式1

elseif(ModeA==2'b01&&PAIO==1'b1&&ModeB==1'b0)PCOutLd=8'b11001000; //A方式1輸出,B方式0

elseif(ModeA==2'b01&&PAIO==1'b1&&ModeB==1'b1)PCOutLd=8'b11001111; //A方式1輸出,B方式1

elseif(ModeA==2'b10&&ModeB==1'b0)PCOutLd=8'b11111000; //A口方式2,B口方式0

elseif(ModeA==2'b10&&ModeB==1'b1)PCOutLd=8'b11111111; //A口方式2,B口方式1

elsePCOutLd=8'b00000000; //其它情況;2023/10/22計算機接口技術(shù)50

always@(resetorAornRDorModeAorModeB)//輸出給Dout_Mux的選路信號

if(reset)Dout_Select=3'b000;elseif(nRD==1'b0)case(A)2'b00://數(shù)據(jù)端口A

if(ModeA==2'b00)Dout_Select=3'b000;//工作于方式0,口A輸入數(shù)據(jù)不鎖存

elseDout_Select=3'b001;//口A輸入數(shù)據(jù)鎖存

2'b01://數(shù)據(jù)端口B

if(ModeB==1'b0)Dout_Select=3'b010;//口B輸入數(shù)據(jù)不鎖存

elseDout_Select=3'b011;//口B輸入數(shù)據(jù)鎖存

2'b10:Dout_Select=3'b100;//數(shù)據(jù)端口C,口C輸入數(shù)據(jù)不鎖存

2'b11:Dout_Select=3'b110;endcaseelseDout_Select=Dout_Select;endmodule

●選路信號DoutSelect的產(chǎn)生多路數(shù)據(jù)選擇模塊的選路信號由地址信號和被選中的端口的當(dāng)前工作方式有關(guān)。相關(guān)代碼如下:2023/10/22計算機接口技術(shù)5113.4.6C口輸出及控制模塊設(shè)計●解析控制信號CtrlData

CtrlData內(nèi)含有置位/復(fù)位位、命令字的標(biāo)志位、A口方式、A口IO、B口方式、B口IO等信息。assignPCRS=CtrlData[6];assignFlag=CtrlData[5];assignModeA=CtrlData[4:3];assignModeB=CtrlData[2];assignPAIO=CtrlData[1];assignPBIO=CtrlData[0];2023/10/22計算機接口技術(shù)52A口輸入時,外設(shè)通過引腳PC4發(fā)送數(shù)據(jù)選通信號STBB口輸入時,外設(shè)通過引腳PC2發(fā)送數(shù)據(jù)選通信號STBA口輸出時,外設(shè)通過引腳PC6發(fā)送響應(yīng)信號ACKB口輸出時,外設(shè)通過引腳PC2發(fā)送響應(yīng)信號ACK●方式1/2的選通和響應(yīng)信號assignnSTBA=PCIn[4];assignnSTBB=PCIn[2];assignnACKA=PCIn[6];assignnACKB=PCIn[2];2023/10/22計算機接口技術(shù)53口C是數(shù)據(jù)口還是控制口口C作聯(lián)絡(luò)口時A/B的模式和IO例:

PCout[1]的處理描述如下:if(PC1是數(shù)據(jù)口)

PCout[1]為輸出口,將內(nèi)部總線數(shù)據(jù)Din[1]輸出elseif(B為輸入口)

PCout[1]為B口的輸入緩沖器滿信號IBFBelse PCout[1]為B口的輸出緩沖器滿信nOBFB

●C口的輸出數(shù)據(jù)PCOut2023/10/22計算機接口技術(shù)54always@(resetorFlagorPCOutLdorPCOutD)//PCOutif(reset)PCOut=8'b00000000;//復(fù)位清0;

elseif(Flag==1'b0)//置位/復(fù)位操作;

case(PCOutLd)8'b11111110:PCOut={PCOut[7:1],PCRS};8'b11111101:PCOut={PCOut[7:2],PCRS,PCOut[0]};8'b11111011:PCOut={PCOut[7:3],PCRS,PCOut[1:0]};8'b11110111:PCOut={PCOut[7:4],PCRS,PCOut[2:0]};8'b11101111:PCOut={PCOut[7:5],PCRS,PCOut[3:0]};8'b11011111:PCOut={PCOut[7:6],PCRS,PCOut[4:0]};8'b10111111:PCOut={PCOut[7],PCRS,PCOut[5:0]};8'b01111111:PCOut={PCRS,PCOut[6:0]};default:PCOut=8'b11111111;endcaseelsePCOut=PCOutD; //高位到低位依次處理C口輸出數(shù)據(jù)

always@(resetorPCOutLd[7]ornOBFAorDin[7])//PCOutD[7]if(PCOutLd[7]==1'b0)PCOutD[7]=Din[7];elsePCOutD[7]=nOBFA;always@(resetorPCOutLd[6]orDin[6])//PCOutD[6]if(PCOutLd[6]==1'b0)PCOutD[6]=Din[6];elsePCOutD[6]=PCOut[6];相關(guān)代碼如下:(PCOut需要按位處理,下面給出

6、7位的代碼)2023/10/22計算機接口技術(shù)55口C是數(shù)據(jù)口還是控制口口C作聯(lián)絡(luò)口時A/B的模式和IO例:

PCStatus[4]的處理描述如下:●C口的輸出數(shù)據(jù)PCOutCif(PC4是數(shù)據(jù)口)

PCStatus[4]為輸入口,將PCIn[4]讀入elseif(A口為方式1輸出)

PCStatus[4]為I/O,將PCIn[4]讀入elseif(A口為方式1輸入或為方式2)

PCStatus[4]為A口輸入中斷允許信號INTEAInelse鎖存原值;2023/10/22計算機接口技術(shù)56always@(resetorPCStatusBuf)//PCStatusif(reset)PCStatus=8'b00000000;elsePCStatus=PCStatusBuf; //從高位到低位依次處理口C狀態(tài)字PCStatusalways@(PCOutLd[7]orPCIn[7]orModeAorPAIOorPCOut[7]) //PCStatusBuf[7];if(PCOutLd[7]==1'b0)PCStatusBuf[7]=PCIn[7]elseif(ModeA==2'b01&&PAIO==1'b0)PCStatusBuf[7]=PCIn[7];elseif((ModeA==2'b01&&PAIO==1'b1)||ModeA==2'b10)PCStatusBuf[7]=PCOut[7];elsePCStatusBuf[7]=PCStatus[7];●C口的輸出數(shù)據(jù)PCOutC相關(guān)代碼如下:(PCStatus需要按位處理,下面給出第7位的代碼)2023/10/22計算機接口技術(shù)57

圖13.9A口方式1輸入時序狀態(tài)機●產(chǎn)生方式1/2的聯(lián)絡(luò)信號當(dāng)口A或口B工作于方式1或2時,8255還需要

產(chǎn)生一些聯(lián)絡(luò)信號。下面以口A工作于方式1輸入時產(chǎn)生的緩沖器滿信號IBFA為例說明,圖13.9是方式1輸入時序圖。2023/10/22計算機接口技術(shù)58always@(resetorModeAorPAIOornSTBAornRD)//IBFA:由nSTBA信號置位,由nRD上升沿復(fù)位;

if(reset)IBFAstate=2'd0;elsecase(IBFAstate)2'd0:if(ModeA!=2'b00&&PAIO==1'b0&&nSTBA==1'b0)IBFAstate=2'd1;elseIBFAstate=2'd0;2'd1:if(nRD==1'b0&&A==2'b00)IBFAstate=2'd2;elseIBFAstate=2'd1;2'd2:if(nRD==1'b1)IBFAstate=2'd0;elseIBFAstate=2'd2;default:IBFAstate=2'd0;endcasealways@(IBFAstate)if(IBFAstate==2'd1||IBFAstate==2'd2)IBFA=1'b1;elseIBFA=1'b0;●產(chǎn)生方式1/2的聯(lián)絡(luò)信號IBFA信號的產(chǎn)生用了2個always塊,一個完成狀態(tài)轉(zhuǎn)移寄存,另一個完成狀態(tài)譯碼和輸出,代碼如下2023/10/22計算機接口技術(shù)59

modulePAIn(reset,PAIn,PAInLd,PAInBuf);inputreset;input[7:0]PAIn;//口A輸入信號

inputPAInLd;//口A輸入使能信號

output[7:0]PAInBuf;//口A

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論