配套教程及源碼-xilinx fpga verilog編程_第1頁(yè)
配套教程及源碼-xilinx fpga verilog編程_第2頁(yè)
配套教程及源碼-xilinx fpga verilog編程_第3頁(yè)
配套教程及源碼-xilinx fpga verilog編程_第4頁(yè)
配套教程及源碼-xilinx fpga verilog編程_第5頁(yè)
已閱讀5頁(yè),還剩375頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第一章Verilog語(yǔ)法基 技術(shù)背 學(xué)習(xí)VHDL還是 時(shí)序設(shè)計(jì)第一種辦法——狀態(tài)機(jī)設(shè) 時(shí)序設(shè)計(jì)第二種方法——FPGA中運(yùn)行 用FPGA好還是的集成電路 一段求和的C代 一段求和的verilog代 Verilog最最基礎(chǔ)語(yǔ) C語(yǔ)言和verilog相對(duì)應(yīng)的和結(jié)構(gòu) C語(yǔ)言和verilog相對(duì)應(yīng)的運(yùn)算 關(guān)鍵 信 結(jié) 符 參 預(yù)處理命 Verilog中數(shù)值表示的方 第二章Verilog語(yǔ)法實(shí) 簡(jiǎn)單的Verilog模 EX01-加法器設(shè) EX02-計(jì)數(shù)器設(shè) Verilog語(yǔ)言模塊的調(diào) EX03-8bit計(jì)數(shù) EX01-RunLed設(shè) EX02-RunLed另一種實(shí) EX03-FlashLed閃耀燈設(shè) EX04-按鈕實(shí)驗(yàn)(延時(shí)去抖動(dòng),同步電路設(shè)計(jì) EX05-SPI通信協(xié)議設(shè) EX06-SPI通過(guò)74HC595擴(kuò)展IO數(shù)碼動(dòng)態(tài)顯 EX07-SPI通過(guò)74HC595擴(kuò)展IO實(shí)現(xiàn)數(shù)碼計(jì)數(shù) EX08-常規(guī)串口發(fā)送模塊設(shè) EX09-常規(guī)的串口接受模塊設(shè) EX10-PS2鍵盤實(shí) EX11-VGA彩條實(shí) EX12-VGA多彩動(dòng)畫屏 EX13-I2C通信協(xié)議設(shè)計(jì)讀寫EEPROM EX14-串口發(fā)送代碼的優(yōu)化設(shè) EX15-串口接收模塊的優(yōu)化改進(jìn)設(shè) EX16-UartLOOP串口回傳程 第四章SRAM、SDRAM、DDR2內(nèi)存應(yīng)用實(shí) 異步SRAM-61LV25616Busrt讀寫測(cè)試 SDRSDRAM讀寫測(cè)試 DDR2SDRAM基于MCB硬核讀寫測(cè)試 第五章Block模塊方案實(shí) ADC/DAC模塊使用實(shí) 主要硬件參 ADC部分原理 DAC部分原理 基于FPGA的高速ADCDAC驅(qū)動(dòng)程序設(shè) CY7C68013AUSB2.0高速模塊使用實(shí) 主要硬件參 ADC部分原理圖 USB2.0部分原理 CY7C68013AUSB2.0FPGAADC方 CY7C68013AUSB2.0固件設(shè) 基于MFC界面設(shè) 圖像卡圖像輸 圖像輸出原 基于SRAM的簡(jiǎn)單的輸 基于SDRSDRAM的簡(jiǎn)單的輸 基于DDR2SDRAM的簡(jiǎn)單的輸 第六章MicroblazeAXI4BUS32BITSCPUSOC開(kāi)發(fā)實(shí) SOC第一課:o SOC第二課:DDR2SDRAM內(nèi)存測(cè) SOC第三課:RunLed流水 SOC第四課:Button按鈕輸 SOC第五課:STimer自定義超級(jí)定時(shí) SOC第六課:Timer系統(tǒng)定時(shí)器中 SOC第七課:GPIO中 SOC第八課:UART中 SOC第九課:SPI回 SOC第十課:I2C讀寫24LC02實(shí) SOC第十一課:數(shù)碼管Verilog驅(qū) SOC第十二課:CPU+Verilog驅(qū)動(dòng)彩 SOC第十三課:CPU+Verilog顯示實(shí) SOC第十四課:SD卡測(cè)試實(shí) SOC第十五課:SD卡顯示實(shí) SOC第十六課:UCOSIII操作系統(tǒng)實(shí) SOC第十七課:100M以太網(wǎng)通信實(shí) 第七章XILINX常用IP測(cè)試實(shí) IP第一課:簡(jiǎn)單端口 IP第二課:?jiǎn)味丝谙葘懩?IP第三課:?jiǎn)味丝谙茸x模 IP第四課:?jiǎn)味丝跓o(wú)變化模 IP第五課:簡(jiǎn)單雙端口RAM無(wú)改變模 IP第六課 IP第七課 IP第八課 第八章ISE新建工程以及聯(lián) 仿真實(shí) ISE新建工 新建源碼文 新建仿真測(cè)試文件- 設(shè)置第仿真工 編譯XILINX仿真 ISE 聯(lián)合仿 添加UCF管腳約束文件并編譯工 第九章邏輯分析儀Chipscope仿真實(shí) 添加ChipcopeIP- 設(shè)置需要觀察的仿真信 編譯工程并啟動(dòng)chipscope邏輯分析 確保開(kāi)發(fā)板通電,并通過(guò)JTAG到電腦之后運(yùn)行邏輯分析 第十章XILINX器使 XILINXJTAG程序入 酷炫XILINXJTAG器MINI工程師便攜 酷炫XILINXJTAG器示意 BIT格式程序到FPGA 程序到 序玩開(kāi)發(fā)板是一件很有趣和有意義的事情,一方面用開(kāi)發(fā)板可以DIY實(shí)用的小東西,另一方面開(kāi)發(fā)板2009XILINXFPGAspartan3e的開(kāi)發(fā)板國(guó)產(chǎn)的很少,至少后根據(jù)提供spartan3e的開(kāi)發(fā)板圖紙,簡(jiǎn)化設(shè)計(jì)了一款板子,那可是國(guó)產(chǎn)第一款低價(jià)的sparan3e的開(kāi)經(jīng)這幾年的累,目前筆的開(kāi)發(fā)板容也是越越豐,但是總覺(jué)只是做開(kāi)板,不是么大的想也沒(méi)太的意。是經(jīng)一時(shí)間考以筆和網(wǎng)的討,者位為完開(kāi)源礎(chǔ)學(xué)類的內(nèi),且提技術(shù)支。以礎(chǔ)習(xí)費(fèi)開(kāi)源免技術(shù)持術(shù)技術(shù)支持形式收取一定費(fèi)用的的思路。2014年下半年是我們實(shí)現(xiàn)第一步計(jì)劃關(guān)鍵的一年,這半年首先 大量免費(fèi)技術(shù)資料和源碼,以及免費(fèi)的技術(shù)支持,對(duì)于工作0-5年內(nèi)從事FPA工作的新手,或者工程師都會(huì)有很多參考學(xué)習(xí)的價(jià)值。目前,筆者已經(jīng)建設(shè)了,歡迎技術(shù)者參與進(jìn)來(lái),和我們一起分享玩轉(zhuǎn)開(kāi)發(fā)板的樂(lè)趣,技術(shù)帶來(lái)的成就感,也歡迎志同道合合者,一起參與到2016版的編程大全的編寫做。在這里面簡(jiǎn)單介紹下<<XILINXFPGAVerilog2015版>>,本版本是筆者編寫的第一個(gè)版本,Verilog基礎(chǔ)語(yǔ)法、XILINXFPGA編程基礎(chǔ)、內(nèi)存操作、圖像處理、網(wǎng)絡(luò)傳輸、MicroblazeSOC嵌入式開(kāi)發(fā) 仿真,Chipcope邏輯分析的使用,仿真器的使用在后續(xù)的版本中筆者將同小伙伴們對(duì)FPGA的三大應(yīng)用領(lǐng)域進(jìn)行詳細(xì)講說(shuō),即通信行業(yè)、圖像行業(yè)、工控自動(dòng)化行業(yè)。在三個(gè)行業(yè)領(lǐng)域內(nèi),從該行業(yè)的常用接口、常用算法、常用協(xié)議等等方面的FPGA實(shí)現(xiàn)為基礎(chǔ),進(jìn)一步深入到各個(gè)行業(yè)各個(gè)應(yīng)用,提高讀者對(duì)感的一個(gè)行業(yè)的認(rèn)識(shí)。具體而言,通信行業(yè)主要講到光通信,無(wú)線通信,計(jì)算機(jī)網(wǎng)絡(luò)通信;圖像行業(yè),講到圖像壓縮,圖像密寫,圖像預(yù)處理算法,壓縮,特效,拼接;工控自動(dòng)化行業(yè),講到運(yùn)動(dòng)控制,ETHERCT總線控制與機(jī)器人,機(jī)器視覺(jué),數(shù)控系統(tǒng)等等。由于時(shí)間和精力有限,本版本難免會(huì)有錯(cuò)誤和遺漏之處,懇請(qǐng)讀者給予批評(píng)和指正。有夢(mèng)想就有希望,感恩感謝!201496第一章Verilog語(yǔ)法基技術(shù)背景統(tǒng)往往要進(jìn)行一些復(fù)雜的數(shù)算和數(shù)據(jù)的處理,并且又有實(shí)時(shí)響應(yīng)的要求,它們通常是由高速數(shù)字邏輯系統(tǒng)或數(shù)字信號(hào)處理器所構(gòu)成,電路是相當(dāng)復(fù)雜的。因此只有在高速術(shù)的進(jìn)步?,F(xiàn)代集成電路的設(shè)計(jì)是借助于電子電路設(shè)計(jì)自動(dòng)化(EDA)工具完成的。學(xué)學(xué)習(xí)VHDL因?yàn)檫@門古老的語(yǔ)言的歷史遺留問(wèn)題,現(xiàn)在還有很多VHDL的模塊,有的時(shí)候我們要拿來(lái)主為了更方面地切入,筆者假設(shè),你已經(jīng)學(xué)過(guò)單片機(jī),并且掌握C語(yǔ)言。因?yàn)閱纹瑱C(jī),和C10CPU想而知,很可能就沒(méi)法實(shí)現(xiàn)這個(gè)功能,或者需要用非常高,非常高的CPU頻率。這是筆者簡(jiǎn)單舉了兩種情況,那么如果使用FPGA被我們控制著,一個(gè)任務(wù),一個(gè)任務(wù)來(lái)走,那就麻煩了。因?yàn)镕PGA總是瞬間完成了。時(shí)序設(shè)計(jì)第一種辦法——狀態(tài)機(jī)設(shè)計(jì)候,我們寫代碼的人也很痛苦,一個(gè)大一點(diǎn)的工程,N多的模塊,N多的狀態(tài)機(jī)。時(shí)序設(shè)計(jì)第二種方法——FPGA中運(yùn)行FPGA也可以運(yùn)行CPU?是的,沒(méi)錯(cuò),F(xiàn)PGA也可以像單片機(jī)一樣使用,這樣我們就可以用C一些邏輯控制順序復(fù)雜的事情用C代碼來(lái)實(shí)現(xiàn),而實(shí)時(shí)處理的部分仍然用verilog來(lái)實(shí)現(xiàn)。并且那部分verilog可以被C代碼控制。XilinxFPGA目前支持的CPUMicroblaze,ARM9,POWERPCMicroblaze是一款軟CPU,是軟核。ARM9POWERPC是硬核。這里兩種核各有各的軟核FPGA寶貴硬核不占用FPGA的資源,并且由于是的功能,速度和性能更好。比如Xilinx的DDR內(nèi)存控制器,就是一用FPGA好還是的集成電路加方便。一般來(lái)說(shuō),F(xiàn)PGA一段求和的Cu32sum({a=b=c=a+b;return}modulesum(clk{always@(posedgea=b=c=}clkVerilog最基礎(chǔ)語(yǔ)C語(yǔ)言和verilog相對(duì)應(yīng)的和結(jié)構(gòu)Cverilog相對(duì)應(yīng)的運(yùn)算符 關(guān)鍵字信input,模塊的輸入信號(hào),比如 ClkClk是外面關(guān)鍵輸入的時(shí)鐘信號(hào)這種中括號(hào)[a:b]C,的寫法稍微有點(diǎn)不同,并且表示的意義要簡(jiǎn)單一些,主要是為了簡(jiǎn)化描述。Output類型可以是wire,output,inout類型;wire,線信號(hào),如果wireC1_Clk;C1_Clk,就是wire類型的信號(hào)TIGinput,output,inoutreg,寄存器,比如reg[3:0]Led;表示了一組寄存器結(jié)…always@(always@(posedgeClkposedgeClknegedgeClk還可以是*這個(gè)一符號(hào)。如果是一個(gè)*則表示一直是敏感的。assignifelse條件判斷,和高級(jí)語(yǔ)言一樣的用法。ifelseif(....)casebegin.....endalways@(posedgeclk)beginif(...)elseelseif(...)case符(FALSH0,TRUEcasecasealwaysalways非阻塞賦值always@(posedgeclkbeginA<=B;C<=阻塞賦always@(posedgeclkbeginA=B;C=+,-,*veriolg2C1C11'b1;A<BABABTUREFALSE,看以上L14-L17之間的代碼,小于號(hào)被用在了條件判讀語(yǔ)句中。A>BABABTURE,FALSEA>=BA和BBTURE,FALSEA==BABABTURE,FALSEA>>2A2A<<2A2~A=8’b1111_0000;~A&A=8’b1111_0000;B=8’b1010_1111;A&B^A=8’b1111_0000;B=8’b1010_1111;A^B8’b0101_1111;&&邏輯與,比如A=1,B=2;A&&BTRUE;A=1,B=0,A&&BFALSE.A=BCDBTRUECA,DA.assignC1_Clk(C125'd2499999910;C1_Clk,是一個(gè)wireC1==25'd249999991,0.{}verilog<={d,e,f};wire類型的信號(hào),也可以這樣{a,b,c}={d,e,f}參parametera180;//32bit(編譯器默認(rèn))parametera=8’d180;//十進(jìn)制parametera8’haa;parametera8’b1010_1010;預(yù)處理命令`include`define`deine`ifdef么我們可以`includexx.v就可以包含找個(gè)文件中定義的一些宏參數(shù)。Verilog中數(shù)值表示的方式備這些基礎(chǔ)知識(shí),下面筆者將帶你通過(guò)代碼來(lái)學(xué)習(xí)Veriog語(yǔ)言。檔。其中提供的代碼,很多時(shí)候代表了的用法,或者推薦的用法。讀者學(xué)習(xí),首先第二章Verilog實(shí)EX01-加法器設(shè)計(jì)輸入信號(hào)為ina,inb,cin輸出信號(hào)為moduleadder4(cout,sum,ina,inb,cin);//此為模塊接口outputcout;//求和輸出結(jié)果溢出標(biāo)志input[3:0]ina,inb;4bitinputcin;1bitendmoduleRTL`timescale1ns1ps1ns1psmodulereg[3:0]inainareg[3:0]inbinbregcin;//輸入信號(hào)cinwirecoutwire[3:0]sum;//reg[4:0]i,j;adder4uutcout(cout.sum(sum.ina(ina.inb(inb),.cin(cin));initialbegin//initial是仿真用的初始化for(i=1;i<16;i=i+1#10ina //給是輸入信號(hào)inainitialfor(j=1;j<16;j=j+110inbj;//inbinitial$monitor($time,,,"%dd%b={%b,%d}",ina,inb,cin,cout,sum#160$finish;160nsEX02-計(jì)數(shù)器設(shè)計(jì)output[3:0]out;inputreset,clk;//輸入信號(hào),resetclkreg[3:0] always@(posedgeclk)if(reset)out<=0; endmoduleRTLRTL`timescale1ns1ps1ns,1psmoduleregreset;//輸入復(fù)位信號(hào)regclk;//輸入時(shí)鐘信號(hào)wire[3:0]out;parameterDELY=100;//調(diào)用被測(cè)試的模count4uut(.out(out),.reset(reset),alwaysDELY/2)clk~clk;1000M/(DELY)=20MHZinitialbeginclk=0;reset=0; reset=1; reset=0;initial$monitor($time,,,"clk=%dreset=%dout=%d",clk,reset,out);(x,zVerilog語(yǔ)言模塊的調(diào)用中,我們也有子模塊這個(gè)概念。VerilogVerilog頂頂層模子模子模子模子模子模EX03-8bit數(shù)input[5:0]a;//輸入信號(hào)ainput[5:0]b;//輸入信號(hào)binput[5:0]c;//輸入信號(hào)ainput[5:0]d;//輸入信號(hào)boutput[7:0e;wire[6:0]outa1,outa2assigneouta2+outa1;通常,我們模塊的調(diào)用寫法如下adderu1(ina1,inb1,outa1);這種寫法必須確保信號(hào)的順序一致,這種寫法幾乎沒(méi)有人采adderu1(.ina(a),.inb(b),.outa(outa1adderu1adderu2(.ina(c),.inb(d),.outa(outa2adderu2addermoduleadder(ina,inb,outainput[5:0]ina;//ina-輸入信號(hào)input[5:0]inb;//inb-輸入信號(hào)output[6:0]outa;//outa-輸入信號(hào)assignoutainainb;endmoduleRTLmodulereg[5:0]reg[5:0]reg[5:0]reg[5:0]wire[7:0]reg[5:0]i;adder8uut(.a(a),.b(b),.c(c),.d(d),.e(e));initialbegininitialfor(i=1;i<31;i=i+1)begin#10;a=b=c=d=end//給是輸入信號(hào)ainitial$monitor($time,,,"%dddd={%d}",a,b,c,d,e#500EX04-8bit串進(jìn)并出,并進(jìn)串出使用移位模塊設(shè)移位模塊8BIT,1bit1bit,8bitmoduleSHIFT88(inputClk,//系統(tǒng)時(shí)鐘輸入inputSlClk,//移位時(shí)鐘inputRst,//復(fù)位信號(hào)inputIsLoad,input[7:0]DataIn,8bitinputSftIn,//1bitinputSftEn,//移位使能outputSftOut,//1bitreg[7:0]DataInt;assignDataOut=DataInt;//輸出數(shù)據(jù)移位工作模MSB行輸入,不斷從LSB往MSB;always@(posedgeClkif(!Rst)DataInt0;//elseif(IsLoad)DataInt<=DataIn;//加載數(shù)據(jù)到寄存elseif(SlClk)beginif(SftEnDataIntDataInt[6:0SftInRTLRTLmodule//InputsregClk;regSlClk;regRst;regIsLoad;reg[7:0]DataIn;regSftIn;reg//OutputswireSftOut;wire[7:0]//InstantiatetheUnitUnderTest(UUT)SHIFT8uut(initial//InitializeInputsClk=0;SlClk=Rst=IsLoad=DataIn=SftIn=SftEn=10Clk!Clk110Clk!Clk110Clk!Clk1Rst=1;//復(fù)位完成forever10Clk!Clk;reg[3:0]always@(posedgeClkSlClk!SlClk;always@(posedgeClk)if(!RstbeginIsLoad<=1'b1;DataIn<=8'hAA;SftIn<=1'b0;C1<=elseif(SlClkbeginC1<8if(C1<4'd8)beginIsLoad<=1'b0;SftEn<=1'b1;SftIn<=!SftIn;C1<=C1+SftEn<=1'b0;C1<=4'd0;DataIn<=IsLoad<=

initial",調(diào)試的經(jīng)驗(yàn),下章開(kāi)始就是講解可以到開(kāi)發(fā)板中驗(yàn)證的實(shí)驗(yàn)了。筆者編寫的適合各種FPGA,各種開(kāi)發(fā)板,是通用,讀者如果筆者的開(kāi)發(fā)板,所有板子的除了外擴(kuò)部很好的,換一個(gè)平臺(tái),換一個(gè),不同的開(kāi)發(fā)板往往只要重新定義管腳就可以了。第三章Verilog實(shí)戰(zhàn)應(yīng)用案EX01-RunLed筆者學(xué)習(xí)單片機(jī),F(xiàn)PGAmoduleRunLed(Clk,Rst,LedRunLedClk,Rst,LedinputClk;//輸入時(shí)鐘inputRst;//輸入復(fù)位信號(hào)output3:0]Led;Ledreg30Led;reg1:0]Ledn;reg[24:0] wireC1=25'd24999999C1_Clk10assignC1_Clk=(C1==25'd24999999)?1:0;always@(posedgeClkClkif(!Rst)C1<=elseif(C125'd24999999)C1C11'b1;50MHZ0.5selseC1<=25'd0;always@(posedgeClkLEDif(!Rst)Ledn<=elseif(C1_Clk)LednLedn1'b1;always@(posedgeClk)begin//點(diǎn)亮LEDif(!Rst)beginLed<=4'hf;Led4'b0000;Led[Ledn]4'd1;//1endmodule實(shí)際的電路輸出C1_CLK輸出是在T1延時(shí)一定時(shí)間后才開(kāi)始輸出的,在T2時(shí)候延遲一RTL runled器的設(shè)計(jì)。首先時(shí)鐘一個(gè)C1的延時(shí)計(jì)數(shù)器,每0.5S,觸發(fā)一次,讓移位模塊移動(dòng)一位,這樣來(lái)控制LED的點(diǎn)亮順序。代碼如下。moduleRunLed(Clk,Rst,Led)inputClk;//輸入時(shí)鐘inputRst;//復(fù)位信號(hào)output[3:0Led;Ledreg[3:0]Led;Ledreg[24:0]C1;C1wire assignC1_Clk(C125'd2499999910;C10.5SC1_ClkC1always@(posedgeClk)if(!Rst)C1<=25'd0;elseif(C1<25'd24999999)C1<=C1+elseC1<=always@(posedgeClk)beginif(!Rst)elseif(C1_Clk)Led{Led[20]Led[3]};RTLRunLedEX03-FlashLed耀燈設(shè)LED55閃5下,如此循環(huán)。moduleFlashLed(Clk,RstFLed0,FLed1inputClk;//輸入時(shí)鐘inputRst;//復(fù)位信號(hào)outputFLed0;Led0outputFLed1;Led1regFLed0;regreg[25:0]C1;/C1LED0LED1reg[23:0]C2;//C2計(jì)數(shù)器,控制LED的閃爍頻率wireC1_Clk,C2_Clk; //產(chǎn)生一個(gè)脈動(dòng)時(shí)鐘regSWLED;//切換LED標(biāo)志parameterT500MS25'd29999999;//50mhz500MSparameterT50MS23'd2999999;//50mhz50MSassignC1_Clk(C1T500MS10C1500msC1_Clk1assignC2_Clk=(C2==T50MS)?1:0C1計(jì)數(shù)到50C1_Clk1always@(posedgeClk)if(!Rst)SWLEDelseif(C1_Clk)SWLED!SWLED;1sC1always@(posedgeClk)if(!Rst)C1<=elseif(C1<T500MS)C1<=C1+elseC1<=C2always@(posedgeClk)if(!Rst)C2<=elseif(C2<T50MS)C2<=C2+elseC2<=reg[3:0]LED0_C//LED0reg[3:0]LED1_C//LED1always@(posedgeClk){FLed1,FLed0}<=2'b0;LED0_C<=0;LED1_CelseFLed0!FLed0;4LED0_C<=LED0_C+1'b1;LED1_C<=if(LED1_C<10&&C2_Clk)begin//閃爍2FLed1<=LED1_C<=LED1_C+

LED0_C<=本設(shè)計(jì)的要點(diǎn)是設(shè)計(jì)一個(gè)定時(shí)計(jì)數(shù)器-C1-500MSC2-之后設(shè)計(jì)一個(gè)切換開(kāi)關(guān)SWLED,SWLED每500MS切換一次,當(dāng)SWLED為1的時(shí)候,C2計(jì)數(shù)到50MS時(shí),輸出C2_Clk,輸出10次,驅(qū)動(dòng)5次LED0閃爍,之后當(dāng)SWLED0的時(shí)候,C2_Clk同樣輸出105LED1閃爍。RTLEX04-按鈕實(shí)驗(yàn)(延時(shí)去抖動(dòng),同步電路設(shè)計(jì)inputClk;//時(shí)鐘信號(hào)inputRst;//復(fù)位信號(hào)inputSw1;SW1inputSw2;SW2output[10]Ledled中的開(kāi)發(fā)板是4LED,本開(kāi)發(fā)板2LED稍作修0]C1;//去抖動(dòng)延時(shí)計(jì)時(shí)器0]C2;//去抖動(dòng)延時(shí)計(jì)時(shí)器:0]Ledn;LED:0]Led;//LedregSw1D,Sw1D1,Sw2D,Sw2D1;//同步延時(shí)中間信號(hào) 通過(guò)同步電路,實(shí)現(xiàn)判斷按鈕按下一assignSw1_IsDwon=!Sw1D1&&Sw1D;SW2SW1assignSw2_IsDwon=!Sw2D1&&always@(posedgeClk)beginif(!Rst)begin//Sw1D1<=1'b0;Sw2D1<=elseSw1D1<=Sw1D;Sw2D1<=always@(posedgeClk)if(!Rst)beginSw1D<=1'b0;Sw2D<=elseif(C1[20])Sw1D<=elseif(Sw1D&&C1==0)Sw1Dif(C2[20])Sw2D<=elseif(Sw2D&&C2==0)Sw2D<=1'b0;always@(posedgeClk)if(!Rst)beginC1<=21'd0;C2<=elseif(!Sw1)beginif(!C1[20])C1<=C1+1'b1;elseif(C1>0)C1<=C1-if(!Sw2)beginif(!C2[20])C2<=C2+1'b1;endelseif(C2>0)C2<=C2-1'b1;//控制LED的輸出模//每次按下LED后,LED移動(dòng)移//移動(dòng)方向由按鈕控always@(posedgeClk)Ledn<=1'd0;Led<=2'h0;endelsebeginif(Sw1_IsDwon)Ledn<=Ledn+1'b1;elseif(Sw2_IsDwonLednLedn1'b1;Led<=2'h0;//LED0滅掉Led[Ledn]1'b1;/LED1//有些開(kāi)發(fā)板是0點(diǎn)亮,1滅51STM32計(jì)通信協(xié)議是一件有的事情,也是充滿樂(lè)趣的事情,自己設(shè)計(jì)出來(lái)的SPI協(xié)議,是對(duì)FPGASPISPI,是一種高速的,全雙工,同步的通信總線,并且在的管腳上只占用四根線,節(jié)約幾乎現(xiàn)在所有的單片機(jī)都有這個(gè)功能。SPISDO(,SC(,CS(MOSIMISOSCLKCSSPI模塊為了和外設(shè)進(jìn)行,根據(jù)外設(shè)工作要求,其輸出串行同步時(shí)鐘極性和相位可以進(jìn)行配置,時(shí)鐘極性(CPOL)對(duì)傳輸協(xié)議沒(méi)有重大的影響。如果CPOL=0,串行同步時(shí)鐘能夠配置用于選擇兩種不同的傳輸協(xié)議之一進(jìn)行數(shù)據(jù)傳輸。如果CPHA=0,在串行同步時(shí)鐘筆者這里設(shè)計(jì)的時(shí)序采用了CPOL=0;CPHA=0,即:串行同步時(shí)鐘的空閑狀態(tài)為低電平;在這是筆者設(shè)計(jì)的SPI協(xié)議仿真波形圖放大,可以看到發(fā)送的數(shù)據(jù)是在SCK低電平后改變的,這本例設(shè)計(jì)的是一個(gè)SPI回傳的功能,即SPI發(fā)出數(shù)據(jù),并且都會(huì)數(shù)據(jù)。在SPI外部,用一根線把SPI的MOSI,MISO短接起來(lái),這樣單個(gè)SPI模塊就可以實(shí)現(xiàn)一次發(fā)送,同時(shí)一次接受發(fā)送的數(shù)據(jù)。之后點(diǎn)亮LED。鐘周期輸出,下一個(gè)時(shí)鐘周期才能被采樣。在設(shè)計(jì)狀態(tài)機(jī)的時(shí)候,比如:case態(tài)1時(shí)序設(shè)計(jì)的是狀態(tài)機(jī)的設(shè)計(jì)。在FPGA中,由于FPGA是并行運(yùn)行的,如果要讓FPGA可以FPGA準(zhǔn)準(zhǔn)備好要發(fā)送的使能發(fā)送數(shù)等待發(fā)送完成接收數(shù)moduleSPI_LOOP(Clk,Rst,Mosi,Miso,Sck,Led);inputClk;inputRst;outputMosi;inputMiso;outputSck;outputreg[3:0]regIsSta;//啟動(dòng)發(fā)送標(biāo)志reg[7:0]WrData;wire[7:0]RdData;reg[2:0]s;//狀態(tài)機(jī)wireIsDone;SPIalways@(posedgeClk)beginif(!Rst)Led<=0;elseif(IsDone)LedRdData[3:0]always@(posedgeClk)beginIsSta<=1'b0;s<=3'b0;WrData<=0;C1elseIsSta<=0;s<=3'd1;C1if(WrData<15)WrData<=WrData+1'b1;elseWrDatas<=s+ //beginIsSta1;s4;end

beginIsSta<=0;if(IsDone)s<=5//beginif(C1[25])s<=0;elseC1<=C1+1'b1;endlocalparamSPI_LEN8//SPIspi#(//此模塊這個(gè)部分為一些常量參)SPI_PORT(//這個(gè)模塊是信下面看下SPI協(xié)議模塊狀態(tài)機(jī)的設(shè)計(jì):1:IsSta=1,SckEn1,SHIFTmodulespi#parameterSPI_LEN4'd8SPIparameterSPI_DIV4'd1,02,14)(SPIinputClkinputRst;//復(fù)位輸入outputSck;//Spi時(shí)鐘outputMosi;//主出從進(jìn)inputMiso;//主進(jìn)從出output[SPI_LEN-1:0]RdData;input[SPI_LEN-1:0]WrData;//并行寫入的數(shù)據(jù)inputIsSta;//啟動(dòng)一次數(shù)據(jù)讀或?qū)憆eg[1:0]SckState;Spiregs;regSckEn;SPIregIsDone;reg[6:0]SckC=0;Sckreg[3:0]BitC=0;bitwire[SPI_LEN-1:0]DataOut;wireSftOut;regSck,SckD1;wireSckUp,SckNp;assign//串行數(shù)據(jù)數(shù)據(jù)在Sck下降沿發(fā)//通常發(fā)送數(shù)據(jù)是下降沿,改變數(shù)assignalways@(posedgeClk)SckD1<=SPIalways@(posedgeif(SckEn&&SckUp)BitCBitC1'b1elseif(BitCSPI_LEN)BitC<=4'd0;assignMosi=SftOut;//移位模塊串行輸出always@(posedgeClk)s<=1'b0;IsDone<=1'b0;SckEn<=elsebeginIsDone<=1'b0;SckEn<=1'b0;if(IsSta)s<=1'b1;SckEn<=1'b1;if(BitC==SPI_LEN)beginSckEn<=1'b0;IsDone<=1'b1;s<=1'b0;endspialways@(posedgeif(!Rst)beginSckC<=7'd0;Sck<=1'b0;SckState<=2'd0;endelsebegincase(SckStatebeginSckC<=7'd0;Sck<=1'd0;if(SckEn)SckState<=2;endbeginSck<=1'b1;if(SckC>=SPI_DIV)beginSckState<=2;SckC<=7'd0;endelseSckC<=SckC+1'b1;Sck<=if(SckC>=SPI_DIV)beginSckC<=7'd0;if(SckEn)SckState<=1;elseSckState0;

elseSckC<=SckC+1'b1;wireassignIsSpiLd=()moduleSHIFT#)(inputClk,//系統(tǒng)時(shí)鐘inputSckWr,//寫觸發(fā)時(shí)鐘inputSckRd,//讀觸發(fā)時(shí)鐘inputRst, //系統(tǒng)復(fù)位inputSftIn,//移位輸入inputSftEn,//移位使能outputSftOut,outputreg[SPI_LEN-1:0]DataOutreg[SPI_LEN-1:0]DataInt;assignSftOut=DataInt[7];//移位輸出always@(posedgeClk)if(!Rst)beginDataInt<=DataOut<=elseif(IsLoadDataIntDataIn;elseif(SftEn)if(SckWrDataIntDataInt[SPI_LEN-2:0],1'b0if(SckRd)DataOutDataOut[SPI_LEN-2:0],SftInmoduletb_spi_loop;regClk;regRst;regMiso;wireMosi;wireSck;wire[3:0]SPI_LOOPuutalways@(*)Miso=Mosi;initialbeginClk=Rst=#10Clk=!Clk;#10Clk=!Clk;#10Clk=

Rst=forever10ClkClk;foreverinitial$monitor($time,,,"Ledb",Led);EX06-SPI74HC595IO碼動(dòng)態(tài)顯2508192A3B4C5D6E7FData25碼管是亮的。上面途中,databusselect08192A3B4C5D6E7F驅(qū)動(dòng)數(shù)碼的代碼,在擴(kuò)展IO方面是ExIOX16的代碼都是一樣的。下面筆者貼出此部分代moduleDpy4(Clk,Rst,SftClk,LchClk,SDout,SRst,Dpy0,Dpy1,Dpy2,Dpy3);inputClk;inputRst;outputSftClk;outputLchClk;outputSDout;outputSRst;input[3:0]Dpy0;input[3:0]Dpy1;inputinputparameterzero=8'b1100_0000,one=8'b1111_1001,two=8'b1010_0100,three=8'b1011_0000,four=8'b1001_1001,five=8'b1001_0010,six=8'b1000_0010,seven=8'b1111_1000,eight=8'b1000_0000,nine=8'b1001_0000;IDLEBYT0=1,BYT1=3,regLchClk;regSRst;regrdy;regIsSta;reg[7:0]WrData;reg[2:0]s;reg[2:0]Dpy_n;reg[3:0]dp;regreg[7:0]dat;wireIsDone;always@(posedgeClk)beginIsSta<=1'b0;s<=1'b0;LchClk<=1'b0;SRst<=

else0beginIsSta<=0;s<=3'd1;rdy<=0;SRst<=1;end1,2://nop2clocks<=s+ beginWrDatadp;IsSta1SRst1s4;LchClk0;end //等待寫完成beginIsSta<=0;if(IsDonebegins5LchClk0;endend5://寫HC5958beginWrDatadat;IsSta1;s6;end //等待寫完成beginIsSta<=0;if(IsDone)begins<=0;LchClk<=1;rdy<=1;endendalways@(posedgeClk)beginif(rdy)beginDpy_n<=Dpy_n+if(Dpy_n>3)Dpy_n<=1'b0;always@(posedgeClkcaseDpy_nbegindata<=Dpy0;dp<=4'b1000;endbegindata<=Dpy1;dp<=4'b0100;endbegindata<=Dpy2;dp<=4'b0010;endbegindata<=Dpy3;dp<=4'b0001;endalways@(posedgeClkcase(data0:dat<=zero;1:dat<=one;2:dat<=two;3:dat<=three;4:dat<=four;5:dat<=five;6:dat<=six;7:dat<=seven;8:dat<=eight;9:dat<=nine;localparamSPI_LEN=4'd8;localparamSPI_DIV)

modulemain(Clk,Rst,SftClk,LchClk,SDout,SRst); outputSftClk;outputoutputSDout;outputSRst; Dpy4.Dpy3(3)EX07-SPI74HC595IO現(xiàn)數(shù)碼計(jì)數(shù)modulemain(Clk,Rst,SftClk,LchClk,SDout,SRst); outputSftClk;outputLchClk;outputSDout;outputSRst; reg[3:0]reg[3:0]reg[3:0]reg[3:0]reg[6:0]reg[9:0]reg[13:0]reg[22:0]reg[3:0]i,j,always@(posedgeClkif(!Rst)begini<=4'd0;j<=4'd0;k<=4'd0;endelsebeginif(C4> )begin//計(jì)算最數(shù)碼管if(1000*(k+1)<=C4)k<=k+1'b1;elsebeginLed4<=k;C3<=(C4-1000*k);k<=4'd0;endendelsebeginC3<=C4;Led4<=4'd0;if(C3>10'd99)begin//計(jì)算次數(shù)碼管if(100*(i+1)<=C3)i<=i+1'b1;elsebeginLed3<=i;C2<=(C3-100*i);i<=4'd0;endendelsebeginC2<=C3;Led3<=4'd0;if(C2 10*(j1)C2jj1'b1;elsebeginLed2j;Led1(C210*jj<=4'd0;end//計(jì)算百位endelsebeginLed1C2Led24'd0endalways@(posedgeif(!Rst)C5<=23'd0;C4<=if(C5<23'd5000000)C5<=C5+elsebegin//C4C5<=23'd0;if(C4<14'd9999)C4<=C4+1'b1;elseC4<=Dpy4if(C4>14'd999)begin//計(jì)算最數(shù)碼管if(1000*(k+1)<=C4)k<=k+1'b1;elsebeginLed4<=k;C3<=(C4-1000*k);k<=4'd0;end1000*(k1C4kk1'b1;10001C4kC3C41000*k同樣的方法求百位,之后也用同樣的方法求出10位。最后剩下的C2就是各位值,直接給數(shù)碼EX08-常規(guī)串口發(fā)送模塊設(shè)計(jì)Uart_Txd奇偶校驗(yàn)位:8BIT的數(shù)據(jù)的奇偶校驗(yàn)位(很多時(shí)候沒(méi)有這位)平持續(xù)1個(gè)波特率周期(有的是1.5個(gè)停止位波特率周期)時(shí)鐘是50MHZ,如何計(jì)算這個(gè)分頻系數(shù)?筆者用了最笨的方便,寫了這個(gè)串口發(fā)送模塊。當(dāng)然這種方法也是最容易理解的。IDLE:個(gè)波特率周期,之后進(jìn)入IDLE狀體moduleUartTxdClk,IsSta,Din,IsDone,Txd);inputClk;//時(shí)鐘是輸入inputIsSta;input[7:0]Din;//需要發(fā)送的數(shù)據(jù)outputIsDone;//發(fā)送完成信號(hào)outputTxd;//串口發(fā)送數(shù)據(jù)線regIsDone=0;regTxd=0;reg[10:0]regClkEn=0;regClkt=0;always@(posedge if(ClkEn)beginif(C1<11'd1301)beginClkt<=11'd0;C1<=C1+1'b1;endelsebeginClkt<=1'b1;C1<=11'd0;endelsebeginClkt<=1'b0;C1<=11'd0;regalways@ parameterIDLE=0;//空閑狀態(tài)parameterSTART1;parameterBIT02BIT0parameterBIT13BIT1parameterBIT24BIT2parameterBIT35BIT3parameterBIT46BIT4parameterBIT57BIT5parameterBIT68BIT6parameterBIT79BIT7parameterSTOP=10;//發(fā)送停止位regassignTxdUp=IsSta1&(!IsSta2);always@(posedgeClk)begincaseif(TxdUp)beginClkEn<=1;s<=s+1'b1;endif(Clkt)beginTxd<=0;ss+1'b1;endBIT0://發(fā)送BIT0if(Clkt)beginTxd<=Din[0];ss+1'b1;endBIT1://發(fā)送BIT1if(Clkt)beginTxd<=Din[1];ss+1'b1;endBIT2://發(fā)送BIT2if(Clkt)beginTxd<=Din[2];ss+1'b1;endBIT3://發(fā)送BIT3if(Clkt)beginTxd<=Din[3];s<=sif(Clkt)beginTxd<=Din[4];ss+1'b1;endBIT5://發(fā)送BIT5if(Clkt)beginTxd<=Din[5];ss+1'b1;endBIT6://發(fā)送BIT6if(Clkt)beginTxd<=Din[6];ss+1'b1;endBIT7://發(fā)送BIT7if(Clkt)beginTxd<=Din[7];ss+1'b1;endSTOP://發(fā)送停止為,之后轉(zhuǎn)為狀態(tài)0if(Clkt)beginTxd<=1;s<=0;IsDone<=1;enddefault:s<=0;inputClk;inputSw;SW1outputSw_IsDwon;//標(biāo)示按鈕按下的信reg[20:0]C1=0;//去抖動(dòng)延時(shí)計(jì)時(shí)器C1regSwD=0,SwD1=0; 通過(guò)同步電路,實(shí)現(xiàn)判斷按鈕按下一assignSw_IsDwon=!SwD1&&SwD;always@(posedgeClk)SwD1<=always@(posedgeClkif(C1[20])SwD<=elseif(SwD&&C1==0)SwDalways@(posedgeClkif(!Sw)beginif(!C1[20])C1<=C1+1'b1;endelseif(C1>0)C1<=C1-1'b1;modulemain(Clk,Txd,Sw1);inputClk;outputTxd;inputSw1;wirereg[7:0]Din=0;always@(posedgeClk)beginDin1if(Sw_IsDwon)Din<=Din+1'b1; U0(.Clk(Clk),.Sw(Sw1),.Sw_IsDwon(Sw_IsDwon));//對(duì)按鈕模塊的封UartTxdU1(.Clk(Clk),.IsSta(Sw_IsDwon),.IsDone(IsDone),.Din(Din),.Txd(Txd));//sendRTL此圖中,DinEX09-常規(guī)的串口接受模塊設(shè)計(jì)電腦上發(fā)的數(shù)據(jù)通過(guò)開(kāi)發(fā)板上4個(gè)LED顯示。Uart_Rxd接收模塊采樣分頻系數(shù)=系統(tǒng)時(shí)鐘/波特率/16-次(這種方法能力差,特別是工業(yè)場(chǎng)合)之后進(jìn)入IDLE狀體moduleUartRxdinputClk;//時(shí)鐘是輸入output[7:0Dout;//接收的數(shù)據(jù)outputIsDone;//接收完成信號(hào)inputRxd;//串口接收數(shù)據(jù)線regIsDone=0;reg[7:0]Dout=0;reg[6:0]C1=0;regClkEn=0;regClkt=0;always@(posedge if(ClkEn)beginif(C1<7'd80)beginClkt<=7'd0;C1<=C1+1'b1;endelsebeginClkt<=1'b1;C1<=7'd0;endelsebeginClkt<=1'b0;C1<=7'd0;regalways@ parameterIDLE=0;//空閑狀態(tài)parameterSTART=1;//起始位狀態(tài)parameterBIT02;/BIT0parameterBIT13;/BIT1parameterBIT24;/BIT2parameterBIT35;/BIT3parameterBIT46;/BIT4parameterBIT57;/BIT5parameterBIT68;/BIT6parameterBIT79;/BIT7parameterSTOP=10;//發(fā)送停止位regregalways@(posedgeClk)begincase(s)IsDone<=0;ClkEn<=0;C2<=if(!Rxd2)beginClkEn<=1;s<=s+1'b1;endif(Clkt)C2<=if(C215)beginC20ss+1'b1;endif(Clkt)C2<=if(C2==8)Dout[0]=Rxd2;//中間采樣一次if(C215)beginC2<=0;ss+1'b1;endif(Clkt)C2<=if(C2==8)Dout[1]=Rxd2;//中間采樣一次if(C215)beginC2<=0;ss+1'b1;endif(Clkt)C2<=if(C2==8)Dout[2]=Rxd2;//中間采樣一次if(C215)beginC2<=0;ss+1'b1;endif(Clkt)C2<=if(C2==8)Dout[3]=Rxd2;//中間采樣一次if(C215)beginC2<=0;ss+1'b1;endif(Clkt)C2<=if(C2==8)Dout[4]=Rxd2;//中間采樣一次if(C215)beginC2<=0;ss+1'b1;endif(Clkt)C2<=if(C2==8)Dout[5]=Rxd2;//中間采樣一次if(C215)beginC2<=0;ss+1'b1;endif(Clkt)C2<=if(C2==8)Dout[6]=Rxd2;//中間采樣一次if(C215)beginC2<=0;ss+1'b1;endif(Clkt)C2<=if(C2==8)Dout[7]=Rxd2;//中間采樣一次if(C215)beginC2<=0;ss+1'b1;endif(ClktC2C2+1IsDoneif(C2>15)beginIsDone<=1;s<=s

default:s<=0;modulemain(Clk,Rxd,Led);inputClk;inputoutputwireIsDonealways@(posedgeClk)beginif(IsDone)Led<=UartRxdU1(.Clk(Clk),.Dout(Dout),.IsDone(IsDone),.Rxd(Rxd));//sendRTL一個(gè)串口調(diào)試助手,軟件16進(jìn)制發(fā)送可能有問(wèn)題)EX10-PS2鍵盤實(shí) 模 Uart_Txd發(fā)送面筆者對(duì)PS2協(xié)議做一個(gè)簡(jiǎn)單的介紹。相對(duì)Uart的接收模塊來(lái)說(shuō),PS2鍵盤的數(shù)據(jù)采樣,有著很大的相同之處。因此PS2就是小菜序也是有時(shí)鐘的,只不過(guò)那個(gè)時(shí)鐘是的。唯一不同的,是我們的Uart設(shè)計(jì)的時(shí)候沒(méi)有我們有必要認(rèn)識(shí)一下PS2鍵盤的工作原理PCPS/2(makecode)和斷碼(breakcode)。當(dāng)一個(gè)鍵被按下或持續(xù)按住時(shí),鍵盤會(huì)將該鍵的通碼發(fā)送如果按下“W”鍵不放,每秒大輸出10個(gè)“8'h1d”的“通碼。然后釋放“W”鍵,就會(huì)輸出“8'hF08'h1d”的“斷碼。編碼鍵盤還有一個(gè)老規(guī)則,就是一次只能有一個(gè)輸出而“8'h1d“8'h22“8'h22” W塊發(fā)送到PC上。moduleinputClk;inputRst;inputPSClk;//PS2inputPSData;PS2output[7:0]RdData;//鍵盤后的數(shù)據(jù)輸outputIsDown;//鍵盤完成信regIsDown;//KeyisdownregPSClk0,PSClk1;reg[7:0]KeyData;reg[7:0]KeyDataD;reg[7:0]PSASCII;reg[3:0]C1;wirealways@(posedgeClkornegedgeRst)if(!Rst)beginPSClk0<=1'b0;PSClk1<=PSClk0<=PSClk;PSClk1<=assignPSCLKNp!PSClk0&PSClk1;regIsDataSig,IsDataSigD1;//數(shù)據(jù)接收完成信號(hào)wireIsDsig;assignIsDsig=IsDataSig&&(!IsDataSigD1);//整形觸發(fā)always@(posedgeClkornegedgeRst)beginif(!Rst)always@(posedgeClkornegedgeRst)beginif(!Rst)beginC1<=KeyData<=8'd0;elseif(PSCLKNp)begincase(C1)4'd0:beginIsDataSig<=0;if!PSData)C1C11'b1;end4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8:C1<=C1+KeyData[7:0{PSDataKeyData7:1C1<=C1+1'b1;

4'd10:beginC1<=4'd0;IsDataSig<=1;enddefault:;regalways@(posedgeClkornegedgeRst)if(!Rst)beginIsDown<=elsebeginIsDown<=1'b1;s<=1;end1:begin//等待鍵盤松開(kāi)斷碼IsDown<=1'b0;begins<=2;endbegins0endalways@(posedgeClk)beginif(!Rst)beginPSASCII<=endelsebegincase(KeyDataD)

8'h2a:PSASCII<= 8'h32:PSASCII<= 8'h31:PSASCII<= 8'h3a:PSASCII<= default:;assignRdData=PSASCII;狀態(tài)10:等待一個(gè)停止位后,回到狀態(tài)0控制和發(fā)送狀態(tài)機(jī)通過(guò)串口發(fā)送出來(lái),進(jìn)入狀態(tài)1狀態(tài)1:當(dāng)有接收數(shù)據(jù)采樣完成觸發(fā)的時(shí)候,查看是否是斷碼,如果是斷碼則進(jìn)入狀態(tài)2moduleinputClk;inputRst;inputPSClk;inputPSData;outputTxd;wire[7:0]RdData;wireIsDown;PSScanu1//串口發(fā)送模UartTxdu2EX11-VGA實(shí)如果是R,G,B顏色是單色的,可以顯示顏色為2X2X2=8種VGA125`defineH_FRONT`defineH_SYNC 所以Fre=50000000/691600=72HZ,完全滿足了大于125次的要求。modulelcd_driver//global //system //sync//lcd //lcdpixel //lcd //lcd //lcdhorizontalsync //lcdverticalsync //lcddisplayenableoutput[15:0]lcd_rgb, //lcddisplaydata//user lcd_request,//lcddata //lcddata lcd_framesync,//lcdframesyncoutput[10:0]lcd_xpos, //lcdhorizontalcoordinateoutput[10:0]lcd_ypos, //lcdverticalcoordinate //lcddata`include//h_synccounter&generatorreg[10:0]hcnt;always@(posedgeclkornegedgerst_n)if

hcnt<=if(hcnt<`H_TOTAL-1'b1) //lineoverhcnt<=hcnt+1'b1;

hcnt<=assignlcd_hs=(hcnt<=`H_SYNC-1'b1)?1'b0://v_synccounter&generatorreg[10:0]vcnt;always@(posedgeclkornegedgerst_n)ifvcnt<=elseif(hcnt==`H_TOTAL-1'b1) //lineoverif(vcnt<`V_TOTAL-1'b1) //frameovervcnt<=vcnt+1'b1;

vcnt<=assignlcd_vs=(vcnt<=`V_SYNC-1'b1)?1'b0: lcd_clr=(vcnt<`V_SYNC+`V_BACK)||(vcnt>=`V_SYNC+`V_BACK+//LCELLLCELL(.in(clk),.out(lcd_dclk));assignlcd_dclk=~clk;assignlcd_blank=lcd_hs&lcd_vs;assignlcd_sync=1'b0;assignlcd_en (hcnt>=`H_SYNC+`H_BACK&&hcnt<`H_SYNC+`H_BACK+`H_DISP)&&(vcnt>=`V_SYNC+`V_BACK&&vcnt<`V_SYNC+`V_BACK+`V_DISP)?1'b1:assignlcd_rgb lcd_en?lcd_data:16'd0;assignlcd_framesync=lcd_vs;//aheadaassignlcd_request (hcnt>=`H_SYNC+`H_BACK-1'd1&&hcnt<`H_SYNC+`H_BACK+-1'd1)(vcnt>=`V_SYNC+`V_BACK&&vcnt<`V_SYNC+`V_BACK+?1'b1:assignlcd_xpos lcd_request?(hcnt-(`H_SYNC+`H_BACK-1'b1)):11'd0;assign lcd_request?(vcnt-(`V_SYNC+`V_BACK-1'b1)):vga_top(inputClk,inputoutputreg[2:0]outputvga_hs,outputvga_vsreglcd_vs_sync;wirelcd_req;RGB彩條顏色,RGB3bitRGBalways@(posedgeClk)beginRGB<=elseRGB<=3'd0;RGB<=RGB+1'b1;elseRGB<=

VGAwirelcd_clr;reglcd_vs_r0;regalways@(posedgeClk)beginlcd_vs_r0<=1'b0;lcd_vs_r1<=1'b0;lcd_vs_sync<=1'b0; <=lcd_clr; <=lcd_vs_r0;if((lcd_vs_r0==1'b1)&&(lcd_vs_r1==1'b0))lcd_vs_sync<=1'b1;

lcd_vs_sync<=wire( (lcd_req),//VGA 頂頂層模VGA內(nèi)存顯示模圖形移動(dòng)模vga_top(inputClk,inputoutput[2:0]RGB,outputvga_hs,outputvga_vsreglcd_vs_sync;wirelcd_req;reg[9:0] always@(posedgeClk)begint<=elset<=elset t+elset<=

reg[9:0] always@(posedgeClk)begint<=elset<=else t t+

VGAwirelcd_clr;reglcd_vs_r0;regalways@(posedgeClk)beginlcd_vs_r0<=1'b0;lcd_vs_r1<=1'b0;lcd_vs_sync<=1'b0; <=lcd_clr; <=lcd_vs_r0;if((lcd_vs_r0==1'b1)&&(lcd_vs_r1==1'b0))lcd_vs_sync<=1'b1;

lcd_vs_sync<=wire[15:0]lcd_rgb; (lcd_req),//VGA wirewire[9wire[2 MOVE(modulePX,UPY,UColor,MColor,MPX,MPY);//內(nèi)存顯示模塊input[10:0]UPX;//用戶坐標(biāo)Xinput[9:0]UPY;//用戶坐標(biāo)Xinput8:0]UColor;output[8:0]MColor;input[10:0]MPX; //內(nèi)存參考坐標(biāo)Xinput[9 //內(nèi)存參考坐標(biāo)wireassignHVaildMPXUPX&&MPX(UPX300assignVVaildMPYUPY&&MPY(UPY100)assignMColorHVaild&&VVaild)UColor9'd0moduleMOVE(Clk,UPX,UPY,UColor);inputClk;//輸入的系統(tǒng)時(shí)鐘output[10:0]UPX;//用戶坐標(biāo)Xoutput[9:0]UPY;//用戶坐標(biāo)Youtput[8:0]UColor;//用戶顏色regreg[8assignUPYUPX;X,Y [21:0]C1;//延時(shí)計(jì)數(shù)器,控制移動(dòng)速度,和顏色的更新速always@(posedgeClk)beginC1<=C1+1;regalways@(posedgeClk)beginendelses<=1;if(C1==0)UPX<=UPX-endelses<=0;always@(posedgeClk)beginEX13-I2C議設(shè)計(jì)EEPROM對(duì)于嵌入式開(kāi)發(fā)的讀者來(lái)說(shuō),I2CI2C協(xié)議中最重要的一點(diǎn)是I2C地址。這個(gè)地址有7位和10位兩種形式。7位能夠表除了GND以外,I2C有兩根線,分別是SDA和SCL,所有的設(shè)備都是接到這兩根線上。I2C的地址是固定的,比如0x50,0x60等等。因?yàn)橹荒苡?27個(gè)地址,地址是很常見(jiàn)的,所以一般設(shè)備都會(huì)有一個(gè)地址選擇PIN,比如拉高時(shí)候?yàn)?x50,接地為0x60。如果無(wú)論拉高還是接地,都和別的有,那該怎么辦呢?答案是:涼拌,沒(méi)辦法。遇到這種情況,只能SCL1,SDA01時(shí),標(biāo)明傳輸結(jié)束。設(shè)備都只是發(fā)送ACK進(jìn)行確認(rèn)而已。筆者這里用I2C協(xié)議往24LC02的地址寫入1BYTE數(shù)據(jù),然后,讀出這個(gè)地址的數(shù)據(jù),并且通過(guò)數(shù)碼管的第4位和第3位顯示出1BYTE的高4位和低4為。數(shù)碼管的第2位和第1位顯I2CI2C24LC02A0~A2IAddressSerialdataSerialclockdataWriteNegativepowerPositivepower并保持一定時(shí)間,后進(jìn)入狀態(tài)START。否則進(jìn)入IDLE,否則等8bits數(shù)據(jù)發(fā)送完后,進(jìn)入狀態(tài)ACK_HEADER。首先等待SCL為高電平,并且滿足高電平持續(xù)時(shí)間后,檢測(cè)從機(jī)ACK,如果檢測(cè)到SDA為0的時(shí)候,有ACK,否則無(wú)ACK。ACK正確:如果是發(fā)送則進(jìn)入XMIT_DATA,如果是接收則進(jìn)入RCV_DATA;ACK錯(cuò)誤:則進(jìn)入STOP,產(chǎn)生停止位。果有重復(fù)起始請(qǐng)求,則進(jìn)入IDLE,否則等8bits數(shù)據(jù)發(fā)送完后,進(jìn)入狀態(tài)ACK_XMIT。首先等待SCL為高

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論