黑金fpga教程veriloghdl那些事兒建模篇for db4ce_第1頁
黑金fpga教程veriloghdl那些事兒建模篇for db4ce_第2頁
黑金fpga教程veriloghdl那些事兒建模篇for db4ce_第3頁
黑金fpga教程veriloghdl那些事兒建模篇for db4ce_第4頁
黑金fpga教程veriloghdl那些事兒建模篇for db4ce_第5頁
已閱讀5頁,還剩397頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

VerilogVerilogHDL二二三三書VeilgHL和A“我在學什么,為什么不管我怎么學,我都沒有實感”VerilogHL+PA的心聲。在眾多的VerilogHDL參考書,隱隱約會出現(xiàn)這樣的一個“建模。建模在Verilog 積木,要組合樂高就是需要工具,那VerilogHDL就是FPGA建模的工具。VrilogHDL“沒有建模的技巧...網(wǎng)絡上常說學習VerilogHDL就是要明白什么是RTL級代碼,多參考別人寫的代碼,習VerilogHDL的名言“參考別人的代碼有如半死不活的受折磨當你看懂別人在寫什“沒有建模技巧...筆者一得可恨,為什么建模技巧作為VerilogHDL的基本功,它甚至比時序分析,擁有建模技巧的建模,VerilogHDL語言絕對不會亞于其他高級語言,甚至還可以VerilogHDLFPGA在這里筆者將自己養(yǎng)成的建模技巧,故筆者稱“低級建?!边@模技巧。筆者經(jīng)過一段時間使用,編輯成一本筆記好讓許初學的朋越過這一學習的大VerilogVerilogHDL四四五五前VerilogHDLFPGA學習熱情的同時,再加上無法突破學習的。筆者真的很想很想什么東西都不干,甚VerilogHDLFPGA。最后筆者一股勁將所有之前所學的資料,都一把火(ShiftDelete)通通燒掉。好似將所有有關VerilogHDL+FPGA的學習回歸到零,那種心情筆者到現(xiàn)在還猶新。筆者向自己說“好想再一次觸erilgHDL+GA呀,就這樣放棄的很不甘心。到底是偶然還是冥冥ourdevA黑金開發(fā)板(筆者真的很感謝黑金動力社區(qū)的AVIC筆者告訴自己,不會再犯同樣的錯誤,要找出“的原因。于是筆者開始測試許多不同的實驗,最后筆者發(fā)現(xiàn)到一個關鍵的東西,那就是“建模。筆者為了證實自己的想法是對的,就開始針對“建?!睂懥艘槐娟P于VelogL之后,想法越來越多“建模技巧”也越來越成大約是2010年七月末FPGA黑金開發(fā)板開始發(fā)售了,筆者很意外的接到AVIC大大為FPGA黑金開發(fā)板寫的要求。那時候的心情筆者真的很驚奇,因為筆者重來沒有干式的開端...3月學習筆記開始編寫了...“低級建?!弊鳛楣P者的“建模技巧(建模習慣,筆者真的很用心去記錄每一個內(nèi)容。雖然文中可能會出現(xiàn)許多“奇怪的字眼和用詞,關于這一點筆者希望讀者們不要太認真,akuei224-10-2010上VerilogVerilogHDL六六七七 黑金動力社區(qū)VerilogHDL的人們。這一本筆記確實有點不適合者,怎么說呢?因為這本筆記筆者按著自己的習慣編輯,則筆者不是按著典型的方向去編輯。者應該先從一些的參考書去了解“什么是VerlogL語言,對VerilgHLuarusI(版本隨便。:書 前 十第二章:低級建模-基礎知 十順序操作和并行操 十實驗一:的流水燈 十 實驗一說明 二十實驗一結論 二十傾向并行操 二十實驗二:閃耀燈和流水 二十 二十 實驗二說明 三十實驗二結論 三十VERILOGHDL不是“編程”是“建模 三十聽聽低級建模的故 三十低級建模的資 三十實驗三:消抖模塊之 三十 實驗三說明 四十實驗三結論 四十實驗四:消抖模塊之 四十 VerilogVerilogHDL八八九九實驗四說明 四十控制模塊的尷 四十實驗五:SOS信號之 四十 實驗五說明 五十實驗五結論 五十實驗六:SOS信號之 五十 實驗六說明 五十實驗六結論 五十總 五十第三章:低級建模-基礎建 五十實驗七:數(shù)碼管電路驅 五十 六十 六十 實驗七說明 七十實驗七結論 七十實驗八:PS2七十PS2的簡單認 七十對編碼鍵盤“鍵盤碼”的簡單認 七十 實驗八說 七十實驗八結 八十實驗八演示 八十 實驗八演示說明 八十實驗八演示結論 八十實驗九:VGA驅 八十實驗九之一:驅動概 八十 實驗九之一說明 九十實驗九之一結論 九十實驗九之二:向下兼容概 九十 實驗九之二說明 一實驗九之二結論 一實驗九之三:點陣概 一○ 實驗九之三說明 一一實驗九之三結 一一實驗九之四:圖層概 一一 實驗九之四說明 一二實驗九之四結論 一二實驗九之五:幀的概 一二 實驗九之五說明 一三VerilogVerilogHDL十十十十實驗九之五結論 一三實驗九說明 一三實驗九結論 一三3.4實驗十:串口模 一三實驗十之一:串口接收模 一三 一三 一三 一四實驗十之一說明 一四實驗十之一結論 一四實驗十之一演示 一四 一四實驗十之一演示說明 一四實驗十之一演示結論 一四實驗十之二:串口發(fā)送模 一四 實驗十之二說明 一五實驗十之二結論 一五實驗十之二演示:一 實驗十之二演示說明 一五實驗十之二演示結論 一五實驗十說明 一五實驗十結論 一五總結 一五第四章:低級建模-仿順序操 一六基本思 一六實驗十一:SOS信號之 一六 兩儀性和多義性的問題 一六 實驗十一說明 一七實驗十一結論 一七實驗十一演示 一七 實驗十二:12864(ST7565P)液晶驅 一七SPI發(fā)送模 一八 一八初始化模 一八 繪圖模 一九 一九 液晶模 一九 實驗十二說明 二○實驗十二結論 二○命令式的仿順序操 二○ 二○ 實驗十三:DS1302實時時鐘驅 二一 二一 實驗十三說明 二二實驗十三結論 二二實驗十三演示 二二 VerilogVerilogHDL十十十十總結 二三 二三實驗十四-獨立按鍵封 二三 實驗十四演示 二三 實驗十四演示說明 二四實驗十四演示結論 二四實驗十五:數(shù)碼管封 二四 實驗十五說明 二五實驗十五結論 二五實驗十五演示 二五 實驗十五演示說明 二五實驗十五演示結論 二五實驗十六:蜂鳴器封 二五 實驗十六說明 二六實驗十六結論 二六實驗十六演示 二六 實驗十六演示說明 二七實驗十六演示結論 二七實驗十七:PS2封 二七 實驗十七說明 二七實驗十七結論 二七實驗十七演示 二八 實驗十七演示說明 二八實驗十七演示結論 二八實驗十八:串口發(fā)送|接收封 二八串口發(fā)送接口 二八 串口接收接口 二八 二八rx_interface.v二實驗十八演示 二九 二九實驗十八演示說明 二九實驗十八演示結論 二九實驗十九:VGA封 二九 三 實驗十九說明 三○實驗十九結論 三○實驗十九演示:小綠人請加 三○ 實驗十九演示說明 三一實驗十九演示結論 三一實驗二十:LCD(12864)封 三一 三一VerilogVerilogHDL十十十十 實驗二十說明 三二實驗二十結論 三二實驗二十演示 三二 實驗二十演示說明 三二實驗二十結論說明 三二實驗二十一:RTC接 三三 三三 三四實驗二十一說明 三四實驗二十一結論 三四總結:三第六章:低級建模-系統(tǒng)建模 三五實驗二十二:SOS系 三五 實驗二十二說明 三五實驗二十二將結論 三五實驗二十三:RTC系 三五 實驗二十三說明 三五實驗二十三結論 三五實驗二十四:GUI系 三五 實驗二十四說明 三八實驗二十四結論 三八總結 三八結束 三八第一章:我眼中的FPGA和Verilog的。當然,F(xiàn)PGA也好VerilogHDL也好,也是一回事兒。今天筆者就將這個告訴讀者!FPGAVerilogHDL是什么?”。在我的心里,F(xiàn)PGA一堆樂高積木VerilogHDL是自己的手(工具)FPGAFPGA可以實現(xiàn)的“形狀FPGA就是一堆樂高積木,只要方法得到,有效,就沒有拆不出來的“形狀”,F(xiàn)PGA組裝起來。有一句話筆者一直都在強調(diào),硬件描或者是匆忙來去,無論是多么有趣的玩具在你的手中,你也不會體驗到當中的樂VerilogVerilogHDL十十十十第二章:低級建模-順序操作和并行操作限,這一點必須好好的理解。VerilogHDL語言,雖然不同與其他高級語言,有優(yōu)秀結點點亮第一個LED點亮第二個LED點亮第三個LED點亮第四個LED從上面看來,我們明白“流水燈效果的產(chǎn)生”主要是以“順序的方式5個步驟。如果現(xiàn)實中的實例,如果四個LED失去了“指揮者”,那么它們就了!因為123,FPGAC語言那么換成是“并行操作”的流水燈是如何的呢?結果我們從實驗中理解實驗一:的流水燈定為100Hz,而每一個功能模塊在特定的時間內(nèi),將輸出拉高。從上圖我們可以看到,功能模塊1在時間的第一個1/4拉高輸出,功能模塊2在時間的第(10ms),2.5msVerilogVerilogHDL十十十十module(CLK,RSTn, inputinputoutputparameterT100MS=regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount1<=elseif(Count1==T100MSCount1<=Count1<=Count1+1'b1; regalways@(posedgeCLKornegedgeRSTnif(!RSTnrLED_Out<=elseif(Count1>=23'd0&&Count1<rLED_Out<=rLED_Out<=44.module(CLK,RSTn,inputCLK;outputparameterT100MS=23'd5_000_000;reg[22:0]Count1;always@(posedgeCLKornegedgeRSTnif(!RSTnCount1<=elseif(Count1==T100MS)Count1<=23'd0;Count1<=Count1+regrLED_Out;always@(posedgeCLKornegedgeRSTn)if(!RSTn)rLED_Out<=elseif(Count1>=23'd1_250_000&&Count1<23'd2_500_000)rLED_Out<=1'b1;rLED_Out<=VerilogVerilogHDL二二assignLED_Out=45.CLK,RSTn,inputCLK;outputparameterT100MS=23'd5_000_000;regalways@(posedgeCLKornegedgeRSTn)if(!RSTn)Count1<=elseif(Count1==T100MS)Count1<=23'd0;Count1<=Count1+regrLED_Out;always@(posedgeCLKornegedgeRSTnif(!RSTnrLED_Out<=elseif(Count1>=23'd2_500_000&&Count1<23'd3_750_000)rLED_Out<=1'b1;rLED_Out<=assignLED_Out=rLED_Out;45.CLK,RSTn,inputCLK;outputparameterT100MS=23'd5_000_000;reg[22:0]Count1;always@(posedgeCLKornegedgeRSTn)if(!RSTn)Count1<=elseif(Count1==T100MS)Count1<=23'd0;Count1<=Count1+VerilogVerilogHDLregalways@(posedgeCLKornegedgeRSTnif(!RSTnrLED_Out<=lseif(Count1>=23'd3_750_000&&Count1<23'd5_000_000)rLED_Out<=1'b1;rLED_Out<=assignLED_Out=rLED_Out;45.CLK,RSTn,inputCLK;inputoutputwire.CLK(CLK.RSTn(RSTn.LED_Out(LED0_Out led1_module(.CLK(CLK.RSTn(RSTn.LED_Out(LED1_Out led2_module(.CLK(CLK.RSTn(RSTn.LED_Out(LED2_Out led3_module(.CLK(CLK.RSTn(RSTn.LED_Out(LED3_Out assignLED_Out={LED3_Out,LED2_Out,LED1_Out, 60.VerilogVerilogHDL實驗一說明led0_module.vled1_module.v,led2_module.vled3_module.v12而在28~36行是決定4個功能模塊的不同之處。led0_module.vled0_module.v1/4拉高輸出。led1_module.v1/4拉高輸出。led2_module.v1/4led3_module.v1/4top.v實驗一結論led0_module.vled0_module.v1/4拉高輸出。led1_module.v1/4拉高輸出。led2_module.v1/4led3_module.v1/4上面的內(nèi)容表示了,4個功能模塊是獨立操作的。由于輸出在時間上不同,在肉眼中才習慣。但是了“FPGA+VerilogHDL”必須使用“并行操作”的思維去理解。平傾向并行操作在2.1章理解了"順序操作"和“并行操作”的區(qū)別之后,這一章我們要討論并且習慣“并行操作”的思維。我們以“C語言”作為“順序操作”的代表,來分析一下過程。While(1While(1{Flash_Funct(); }如果按照上面的代碼,程序一開始就會先執(zhí)行閃耀功能模塊(Flash_Funct()再執(zhí)行流水燈功能模塊(Run_Funct()。但是在現(xiàn)實中,由于控制器的掃描速度很快Run_Funct()Flash_Funct()Flash_Funct()Run_Funct()理解上”,人類的思維執(zhí)行執(zhí)行執(zhí)行VerilogVerilogHDLmoduletop_modulemoduletop_module ((面筆者已經(jīng)"并行操作"的功能模塊功能都是獨立執(zhí)行。在“設計上該兩個模塊都是“分開執(zhí)行實驗二:閃耀燈和流水燈f=1/=1/(50+50)=1/100=10f=1/f=1/=1/(100+100+100)=1/=3.3VerilogVerilogHDLrun_module章和2.2章的實驗創(chuàng)作,筆者我明白“小小的細節(jié),大大的道理”的道理。原來流水燈實module(CLK,RSTn,inputCLK;inputoutputparameterT50MS=22'd2_499_999;regalways@(posedgeCLKornegedgeRSTn)if(!RSTn)Count1<=elseif(Count1==T50MS)Count1<=22'd0;Count1<=Count1+regrLED_Out;always@(posedgeCLKornegedgeRSTnif(!RSTnrLED_Out<=1'b0;elseif(Count1==T50MS)rLED_Out<=assignLED_Out=rLED_Out;40.CLK,RSTn,inputCLK;outputparameterT1MS=16'd49_999;reg[15:0]Count1;if(!RSTnCount1<=ornegedgeRSTnelseif(Count1==T1MS)Count1<=16'd0;Count1<=Count1+reg[9:0]Count_MS;always@(posedgeCLKornegedgeRSTnif(!RSTnVerilogVerilogHDL三三Count_MS<=elseif(Count_MS==10'd100)Count_MS<=10'd0;elseif(Count1==T1MSCount_MS<=Count_MS+reg[2:0]rLED_Out;always@(posedgeCLKornegedgeRSTn)if(!RSTn)rLED_Out<=elseif(Count_MS==10'd100if(rLED_Out==3'b000)rLED_Out<={rLED_Out[1:0],1'b0assignLED_Out=rLED_Out;61.CLK,RSTn,Flash_LED,inputCLK;inputoutputFlash_LED;wireFlash_LED;.CLK(CLK.RSTn(RSTn.LED_Out(Flash_LEDwire[2:0]Run_LED;.CLK(CLK.RSTn(RSTn.LED_Out(Run_LEDassignFlash_LED=Flash_LED;assignRun_LED=40.VerilogVerilogHDL實驗二說明run_module.v是一3.3hz掃描頻率的流水燈,采用“控制模塊”形式編寫。16~24行1ms的計數(shù)器。28~36行是基count1100ms的計數(shù)器。40~523Bit的移位mix_module.v是組合模塊,代碼很容易明白。自己看著辦吧。實驗二結論所以呀,思維傾向“并行操作”對,VerilogHDL語言的理解是非常重要。VerilogHDLVerilogHDLC語言不同,但是是什么地方使用“編程VerilogHDL語言使用“建?!边@一詞更適合不過了。從理解上,C語言,我們可以使用“代碼”和“編程”的形式去理解,如:函數(shù)的概念,參數(shù)然“代碼的形式VerilogHDLVerilogHDL語言又該用“什么”去前面筆者已經(jīng)VerilogHDL語言是一種富有“形狀的語言建模一詞使得VerilogHDL語言的更有形象和更有具體感。筆者的“建模風格”而已。在筆者的心中“低級建?!庇小叭f丈高樓從地起”的意思。感覺,情況如同初鴨下水。但是有一點可以肯定的是,當讀者了解“低級建?!币院螅琕erilogHDLVerilogVerilogHDL聽聽低級建模的故...“不可觸及”的感覺。我到底缺少什么呢?帶著這個問題,筆者渾渾噩噩的繼續(xù)學段時間。期間筆者寫了“SMG接口設計”和“低級建?!し马樞虿僮魉悸菲边@兩本筆記?!暗图壗!钡穆墓P者我2010年6月,筆者進入某工廠工作?,F(xiàn)實總是,同期筆者的經(jīng)濟和時間陷入,短短的一個月筆者被抽去許多學習的動力,,和感情。不知不覺我睡著了互支撐,其中每一個小組中又有多少員工互相支持(低級建模的基本思路)。呵呵,筆者再一次遇見現(xiàn)實的,我沒有資源的支持,但是學習的總是柳暗花明,在這里黑金動力社區(qū)的出現(xiàn),這個問題很巧妙的被解決了低級建模的資源“.v文件名”,相反組合模塊只含“.v文件名控制模塊的例子有“run_module.vmix_module.v”是組合模塊。就是“一個功能模塊(”。為什么這個準則那么重要呢?VerilogVerilogHDL實驗三:消抖模塊之一但檢測到按鍵資源按下(高電平到低電平變化module(CLK,RSTn,Pin_In,H2L_Sig,inputCLK;inputRSTn;inputPin_In;outputparameterT100US=reg[10:0]Count1;regalways@(posedgeCLKornegedgeRSTn)if(!RSTn)Count1<=isEn<=elseif(Count1==T100US)isEn<=1'b1;Count1<=Count1+VerilogVerilogHDLregH2L_F1;regH2L_F2;regL2H_F1;regalways@(posedgeCLKornegedgeRSTn)if(!RSTn)H2L_F1<=1'b1;H2L_F2<=1'b1;L2H_F1<=1'b0;L2H_F2<=1'b0;H2L_F1<=Pin_In;L2H_F1<=assignH2L_Sig=isEn?(H2L_F2&!H2L_F1):1'b0;assignL2H_Sig=isEn?(!L2H_F2&L2H_F1):64.detect_module.v14100us18~30行是用于延遲100us。因為電平檢測模塊是非常敏感,在復位的一瞬間,電平容易處于不穩(wěn)第34~37行,了四個寄存器。H2L_F1,H2L_F2,是針對檢測電平由高變低。相反的L2H_F1,L2H_F2,則是針對檢測電平由低變高。在41~46行,對各個寄存器初始化了,由于H2L_Fx是為了檢測由高變低的電平,所以初始化為邏輯1。L2H_Fx是為了檢測由低變高的電平,初值被設置為邏輯0。 H2L_F1H2L_F1<=1'b1;H2L_F2<=H2L_F1<=Pin_In;Pin_OutH2L_F2&上一個時間的值(也就是H2L_F1的初值。我們知道在第一個時間,H2L_F1為邏輯0,H2L_F2位邏輯1。由于H2L_F1的取反操作,H2L_F1與H2L_F2“求與”運算,所以這個表達式的輸出是邏輯1。Pin_In保持為低電平,H2L_F10,H2L_F2H2L_F10第一個時間的值)。再經(jīng)過布爾表達式的運算,在第二個時間,H2L_F10H2L_F20是邏輯0.Pin_Out=(!H2L_F1)&110011000是,Pin_Out的輸出,是發(fā)生100us之后,因100us之前isEn寄存器所限制(原因之前已經(jīng)說了。換一句話說,電平檢測模塊的有效是發(fā)生在100us的延遲之后。(CLK,RSTn,H2L_Sig,L2H_Sig,inputCLK;inputVerilogVerilogHDL四四inputoutputparameterT1MS=16'd49_999; regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount1<=elseif(isCount&&Count1==T1MSCount1<=elseif(isCountCount1<=Count1+elseif(!isCountCount1<=regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount_MS<=elseif(isCount&&Count1==T1MSCount_MS<=Count_MS+elseif(!isCountCount_MS<=regregregalways@(posedgeCLKornegedgeRSTnif(!RSTnisCount<=rPin_Out<=i<=case(i2'd0if(H2L_Sig)i<=elseif(L2H_Sig)i<=2'd1if(Count_MS==4'd10)beginisCount<=1'b0;rPin_Out<=1'b1;i<=2'd0;endelseisCount<=1'b1;2'd2if(Count_MS==4'd10)beginisCount<=1'b0;rPin_Out<=1'b0;i<=2'd0;elseisCount<=assignPin_Out=delay_module.v10ms延遲的功能模塊。模塊采用“仿順序操作”的寫法(第四章。第16~42行是“延遲”的寫法,第18~28行是1ms的定時器,而第32~40行是計數(shù)器。無論是定時器或者計數(shù)器都是由isCount標志寄存器使能。44~71行是“仿順序操作(第四章46行i寄存器用來控制執(zhí)行的步驟。開始66~6810msrPin_Out寄存器的賦值(63行與67行。VerilogVerilogHDLCLK,RSTn,Pin_In,inputCLK;inputRSTn;inputPin_In;wireH2L_Sig;.CLK(CLK.RSTn(RSTn.Pin_In(Pin_In//input-from.H2L_Sig(H2L_Sig //output-to.L2H_Sig(L2H_Sig //output-todelay_moduleU2(.CLK(CLK.RSTn(RSTn.H2L_Sig(H2L_Sig//input-from.L2H_Sig(L2H_Sig//input-from.Pin_Out(Pin_Out//output-to38.Debounce_module.v是組合模塊。模塊的組合上上圖。信號連線的地方已經(jīng)很清楚的注實驗三說明可能很多朋友會對detect_module.v的延遲100us產(chǎn)生疑問?如果把話說簡單一點就實驗三結論VerilogVerilogHDL實驗四:消抖模塊之實驗四和實驗三的區(qū)別就是在于輸出。實驗三的debounce_modulve.v當檢測到由高變debounce_module.v當檢測到由高變低的電平變化時,產(chǎn)生一個時鐘的高脈沖。當case(i3'd0if(H2L_Sig)i<=elseif(L2H_Sig)i<=3'd1if(Count_MS==4'd10)beginisCount<=1'b0;rPin_Out<=1'b1;i<=elseisCount<=3'd2beginrPin_Out<=1'b0;i<=2'd0;3'd3if(Count_MS==4'd10)beginisCount<=1'b0;i<=2'd0;elseisCount<=實驗四說明大部分的源碼和實驗三一樣,不同的地方就在delay_module.v56~74行。從上面的代碼我們可以看到,當檢測到由高變低的電平變化的時候(59行i就進入,步驟1。經(jīng)延遲10ms過后,拉高輸出,然后進入步驟2。步2會拉低輸出,然后回到步驟0。同樣的,在步驟0當檢測到由低變高的電平變化是,就會進入步驟3,經(jīng)延遲10ms過后,就會返回步驟0。VerilogVerilogHDL控制模塊的尷尬如上圖,經(jīng)理的存在是為了協(xié)調(diào)兩個部門的工作,而的存在是管理系統(tǒng)的運作。在這里無論是或者是經(jīng)理,它們都是執(zhí)行著“控制”的工作。從上圖我們可以知道,一是,協(xié)調(diào)工作。二是,管理運作實驗五:SOS信號之就是有次序的控制輸出莫斯的“點畫”和“間隔”。而control_module.v是一個簡單的定時觸發(fā)器,每一段時間都會使能sos_module.v。在這里稍微認識一下“摩斯"的基本三個元素.點_畫'空格(間隔_亦即三個長音節(jié)之中夾雜間隔。所以SOS形成了“...___...雖然事實不是如此,但是實際上鐵達尼號卻是發(fā)送了SOS信號,才有幸存者(Rose是modulemodule(CLK,RSTn,Pin_Out, VerilogVerilogHDLinputinputinputoutput//DB4CE15開發(fā)板使用的晶振為50MHz,50M*0.001-parameterT1MS=16'd49_999; regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount1<=elseif(isCount&&Count1==T1MSCount1<=elseif(isCountCount1<=Count1+elseif(!isCountCount1<=regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount_MS<=elseif(isCount&&Count1==T1MSCount_MS<=Count_MS+elseif(!isCountCount_MS<=regregregalways@(posedgeCLKornegedgeRSTnif(!RSTnisCount<=rPin_Out<=i<=case(i5'd0if(SOS_En_Sig)i<=5'd1,5'd3, //5'd13,5'd15,5'd17if(Count_MS==10'd100)beginisCount<=1'b0;rPin_Out<=1'b0;i<=i+1'b1;elsebeginisCount<=1'b1;rPin_Out<=1'b1;5'd7,5'd9,5'd11 //if(Count_MS==10'd300)beginisCount<=1'b0;rPin_Out<=1'b0;i<=i+1'b1;elsebeginisCount<=1'b1;rPin_Out<=1'b1;5'd2,5'd4,//5'd8,5'd10,5'd14,5'd16,5'd18if(Count_MS==10'd50)beginisCount<=1'b0;i<=i+1'b1;elseisCount<=5'd19beginrPin_Out<=1'b0;i<=5'd0;end//assignPin_Out=sos_module.vdelay_module.v13~3945i55~78行是“仿順序操作”的寫法,i第60~63行,定義了莫斯的短音,換句話說是100ms的拉高輸出VerilogVerilogHDL五五第65~67行,定義了摩斯 的長音,亦即300ms的拉高輸出。第69~73行,定義是空音節(jié),也就是50ms的拉低輸出。CLK,RSTn,inputCLK;inputoutputparameterT3S=regregalways@(posedgeCLKornegedgeRSTn)if(!RSTn)isEn<=1'b0;elseif(Count1==T3S)isEn<=Count1<=isEn<=Count1<=Count1+assignSOS_En_Sig=isEn;42.control_module.vCLK,RSTn,inputCLK;inputRSTn;wire.CLK(CLK.RSTn(RSTnwiresos_module.CLK(CLK.RSTn(RSTn.SOS_En_Sig(SOS_En_SigVerilogVerilogHDLassignPin_Out=37.sos_generator_module.vsos_module.vcontrol_module.v33行,實驗五說明實驗五結論在實驗五中,control_module.v3sos_module.v一個“執(zhí)行”的觸發(fā)信號。實驗六:SOS信號之圖上是,實驗六要進行的建模。按鍵消抖模塊是來至實驗四的debounce_module2.v,而sos_module.v是來至實驗五。把debounce_module2.v看成是一個輸入,而sos_module.v是一個輸出。其中inter_control_module.v負責著兩個模塊之間的“溝通”。debounce_module2.v(Trig_Sig)inter_control_module.v接收到這個高脈沖信號,它會“轉發(fā)”并且產(chǎn)生一個時鐘的高脈沖(SOS_En_Sig)信號。就這樣inter_control_module.v間接觸發(fā)sos_module.v。CLK,RSTn,Trig_Sig,inputCLK;inputRSTn;outputVerilogVerilogHDLregalways@(posedgeCLKornegedgeRSTn)if(!RSTn)i<=isEn<=case(i2'd0if(Trig_Sig)beginisEn<=1'b1;i<=1'd1;2'd1beginisEn<=1'b0;i<=1'd0;assignSOS_En_Sig=isEn;39.CLK,Pin_In,inputCLK;inputRSTn;output wire(.CLK(CLK.RSTn(RSTn.Pin_In(Pin_In //input-from.Pin_Out(Trig_Sig)//output-to wire(.CLK(CLK.RSTn(RSTn//input-from.SOS_En_Sig(SOS_En_Sig//output-to(.CLK(CLK.RSTn(RSTn.SOS_En_Sig(SOS_En_Sig //input-from.Pin_Out(Pin_Out //ouput-to實驗六說明VerilogVerilogHDLSOS_En_Sig實驗六結論debounce_module2.vsos_module.v之間節(jié)省了和inter_control_module.v即可??偺朿ontrol_module.v3sos_module.v工作一VerilogVerilogHDL第三章級建模-實驗七:數(shù)碼管電路驅動SEL1_T所有的數(shù)碼管的“段選信號(LEDA..LEDH)都共用同樣的引腳。結論來說,數(shù)碼管992個數(shù)碼管資源上。采取的現(xiàn)實方法是同步動態(tài)掃描。估計“動態(tài)掃描”應該學習過吧,“同步動態(tài)掃描”是指“行信號”實驗七的組合模塊exp07_top.v是由四個功能模塊組成。每一個功能模塊的功能都如同 “十位取位模塊99的數(shù)目。然后由該模塊進行取位的操作,將十位和各位劃分,然后輸出獨自的信號線Ten_Data和One_Data。中間是“SMG加碼模塊將由二進制組成的數(shù)目“轉換SMG碼。Ten_Data和One_Data被轉換后,再經(jīng)Ten_SMG_DataOne_SMG_Data輸出。最后由“掃描模塊”smg_can_module.v,執(zhí)十位和各位。因為是十位取位的關系,所以最大的輸入數(shù)是00~99而已。CLK,inputCLK;inputoutput[3:0]Ten_Data;output[3:0]One_Data;regregalways@(posedgeCLKornegedgeRSTn)if(!RSTn)VerilogVerilogHDL六六rOne<=rTen<=Number_Data/rOne<=Number_Data%assignTen_Data=rTen[3:0];assignOne_Data=38.上面的源碼比較簡單,但是有幾點讀者必須注意。第16~17行了32位的寄存器,27~2832位呢?余器”是32位輸出。但是經(jīng)過“編譯”過后,編譯器會“自動優(yōu)化”最適合的位寬。文件會“自動添加”在原本.v文件的層次之下。 編譯過后的.v文CLK,Ten_Data,One_Data,inputinputinput[3:0]Ten_Data;inputoutput_0=8'b1100_0000,_1=8'b1111_1001,_2=_3=8'b1011_0000,_4=8'b1001_1001,_5=_6=8'b1000_0010,_7=8'b1111_1000,_8=_9=reg[7:0]rTen_SMG_Data;always@(posedgeCLKornegedgeRSTn)if(!RSTn)4'd0:rTen_SMG_Data<=_0;4'd1:rTen_SMG_Data<=_1;4'd2:rTen_SMG_Data<=_2;4'd3:rTen_SMG_Data<=_3;VerilogVerilogHDL4'd4:rTen_SMG_Data<=4'd5:rTen_SMG_Data<=4'd6:rTen_SMG_Data<=4'd7:rTen_SMG_Data<=4'd8:rTen_SMG_Data<=4'd9:rTen_SMG_Data<=regalways@(posedgeCLKornegedgeRSTnif(!RSTnrOne_SMG_Data<=4'd0:rOne_SMG_Data<=4'd1:rOne_SMG_Data<=4'd2:rOne_SMG_Data<=4'd3:rOne_SMG_Data<=4'd4:rOne_SMG_Data<=4'd5:rOne_SMG_Data<=4'd6:rOne_SMG_Data<=4'd7:rOne_SMG_Data<=4'd8:rOne_SMG_Data<=4'd9:rOne_SMG_Data<= 80.17~20行了SMG24~45行是針對“十位數(shù)”(75~76行是輸出。smg_scan_module.v無疑是row_scan_module.vcolumn_scan_module.v的組合模塊。無論是“行掃描模塊”還是“列掃描模塊”,掃描頻率都制定位50hz。因為實驗七的要求是兩個數(shù)碼管資源,假設各個數(shù)碼管點亮時間是10ms,兩個數(shù)碼modulemodule(CLK,RSTn, VerilogVerilogHDLinputinputoutputparameterT10MS=19'd499_999;regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount1<=elseif(Count1==T10MSCount1<=Count1<=Count1+19'b1; regalways@(posedgeCLKornegedgeRSTnif(!RSTnt<=elseif(t==2'd2t<=elseif(Count1==T10MSt<=t+regalways@(posedgeCLKornegedgeRSTnif(!RSTnrColumn_Scan<=elseif(Count1==T10MScase(t2'd0:rColumn_Scan<=VerilogVerilogHDL2'd1:rColumn_Scan<=2'b01;60.第12行了10ms的常量。第16~24行是10ms的定時器,而28~36行是用來控制掃t表示了當前的掃描數(shù)目01(01個數(shù)碼管40~61column_scan_module.vt00個數(shù)碼管使能(拉低t1是將第1個數(shù)碼管使能(拉低。row_scan_module.v從字面是“行掃描column_scan_module.v我們知道10msrow_scan_module.v的功能也非常相似。row_scan_module.v10ms,SMG碼。具體的操作還是看代碼:CLK,inputCLK;inputinput[7:0]Ten_SMG_Data;input[7:0]One_SMG_Data;output[7:0]Row_Scan_Sig;parameterT10MS=19'd499_999; regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount1<=elseif(Count1==T10MSCount1<=Count1<=Count1+19'b1; regalways@(posedgeCLKornegedgeRSTnif(!RSTnt<=elseif(t==2'd2t<=elseif(Count1==T10MSt<=t+regalways@(posedgeCLKornegedgeRSTnif(!RSTnrData<=elseif(Count1==T10MScase(t2'd0:rData<=2'd1:rData<=One_SMG_Data; VerilogVerilogHDL63.16~40column_scan_module.v44~55row_scan_module.v每en_SMG_Data(行t1的時候輸出“One_SMG_Data(53行。CLK,Row_Scan_Sig,inputinputinput[7:0]Ten_SMG_Data;input[7:0]One_SMG_Data;output[7:0]Row_Scan_Sig;row_scan_module.CLK(CLK.RSTn(RSTn.Ten_SMG_Data(Ten_SMG_Data.Row_Scan_Sig(Row_Scan_Sig//input-from//input-from//output-to.CLK(CLK.RSTn(RSTn.Column_Scan_Sig(Column_Scan_Sig//output-to35.smg_scan_module.v的組合模塊。代碼比較簡單,自己看著辦吧VerilogVerilogHDL七七無無CLK,inputCLK;inputinput[7:0]Number_Data;output[7:0]Row_Scan_Sig;wire[3:0]Ten_Data;wirenumber_mod_module .CLK(CLK.RSTn(RSTn.Number_Data(Number_Data),//input-form //output-to.One_Data(One_Data //output-to wirewire(.CLK(CLK.RSTn(RSTn //input-from.One_Data(One_Data //input-from.Ten_SMG_Data(Ten_SMG_Data //output-to //output-to (.CLK(CLK.RSTn(RSTn.Ten_SMG_Data(Ten_SMG_Data //input-from //input-from.Row_Scan_Sig(Row_Scan_Sig //output-to.Column_Scan_Sig(Column_Scan_Sig)//output-to 57.exp07_top.vVerilogVerilogHDL實驗七說明實驗七結論實驗八:PS2PS2的簡單認觸發(fā),要嗎就是查詢。如果是CPLD或者FPGA的作為前提的話,PS2的解協(xié)議的時序圖。PS2協(xié)議對數(shù)據(jù)的是“Clock的下降沿”有效。PS2時鐘的頻率比較慢,大約是10Khz左右。N09PS2的一幀是11位。對PS2進行時,除了第1~8位數(shù)據(jù)位以外,其余的位都可以對編碼鍵盤“鍵盤碼”的簡單認VerilogVerilogHDLVerilogVerilogHDL(Make)(Brea)只能有一個輸出而已(多個按鍵同時按下,只有其中一個有效)。01d022”“0x22”的通碼。如果此時筆者放開“X”鍵,就會輸出“0xf00x220x1d”,“W”鍵的“斷碼”。Shift+Ctrl+?”都是軟件的工作,我們就無視吧。實驗八的目的很簡單,實驗主要對PS2進行。ps2_module.v中包含了“電平檢測模塊detect_module.v模塊"ps2_decode_module。detect_module.vPS2時鐘信號的“下降然后PS2_Done_Sig產(chǎn)生一個高脈沖,表示完成的操作。modulemodule(CLK, inputCLK;outputregH2L_F1;regalways@(posedgeCLKornegedgeRSTn)if(!RSTn)H2L_F1<=H2L_F2<=H2L_F1<=PS2_CLK_Pin_In;H2L_F2<=H2L_F1;assignH2L_Sig=H2L_F2&!H2L_F1;37.modulemodule(CLK, VerilogVerilogHDLinputinputinputinputoutputoutputregregregregalways@(posedgeCLKornegedgeRSTnif(!RSTnrData<=i<=isDone<=case(iif(H2L_Sig)i<=i+4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,if(H2L_Sig)begini<=i+1'b1;rData[i-1]<=PS2_Data_Pin_In;5'd9,if(H2L_Sig)i<=i+if(rData==8'hf0)i<=elsei<=5'd12,5'd13,5'd14,5'd15,5'd16,5'd17,5'd18,5'd19,5'd20,5'd21,if(H2L_Sig)i<=i+begini<=i+1'b1;isDone<=1'b1;begini<=5'd0;isDone<=1'b0;assignPS2_Data=rData;assignPS2_Done_Sig=isDone;ps2_decode_module.v最主要的是在第31~55行。同樣這個模塊也是采用“仿順序操作i0(33行H2L_Sig...我們PS208個位都是數(shù)據(jù)位,PS2的數(shù)據(jù)位是從最低位開始,最結束。然后對PS2_Data_Pin_In引腳進行讀值(第36~37行采取無視的操作(46~47行,最后產(chǎn)生一個高脈沖的完成信號(49~53行,然后返回第33行。CLK,PS2_Data,PS2_Done_SiginputinputVerilogVerilogHDL八八inputPS2_CLK_Pin_In;inputPS2_Data_Pin_In;output[7:0]PS2_Data;outputwireH2L_Sig;.CLK(CLK.RSTn(RSTn.H2L_Sig(H2L_Sig//input-from//output-to(.CLK(CLK.RSTn(RSTn.H2L_Sig(H2L_Sig.PS2_Data(PS2_Data//input-from//input-from//output-to//output-to41.實驗八說明實驗八的PS2僅對按鍵的“通碼”和“斷碼的0xf0”執(zhí)行操作,相反,卻對“斷碼之5000倍。而detect_module.v就是利用這5000個時鐘信號去每個PS2時鐘的下降由于布爾的表達式H2L_Sig信號。PS2協(xié)議的一幀數(shù)據(jù)大11PS21111次高脈沖的H2L_Sig。PS2時鐘在每一個上升沿的時候,PS2數(shù)據(jù)就會“設置移位數(shù)據(jù),而ps2_decode_module.v31~55PS2數(shù)據(jù)的移位進行“數(shù)據(jù)采樣”。假設PS2時鐘在第一次的下降沿,自然而然PS2數(shù)據(jù)會“設置第0位數(shù)據(jù)(ps2_decode_module.v34,ps2_decode_module.v采取無視的操作,接下來的八ps2_decode_module.v42~44行。從上面我們知道,黑金ps2的時鐘5000倍的相差,從另一個角度去理解的話,距離每一PS22000個可以執(zhí)行的時鐘42~44行只用了一個時間去判斷通碼還是斷碼,余下還剩下4999個可有的空閑時鐘。補充:筆者設計的PS2的特性是通碼和斷碼的0xf0通吃,但是不吃斷碼之后的通VerilogVerilogHDL實驗八結論實驗八是PS2模塊。然而筆者在設計上,對ps2_detect_module.v添加了PS2_Done_Sig,這個信號無疑是表示了“操作”。因為編碼的鍵盤,只要按著不實驗八演示:module(CLK,inputCLK;inputinputreg[3:0]rData;always@(posedgeCLKornegedgeRSTn)if(!RSTn)rData<=case(PS2_Data)rData<={rData[2:0],rData[3]rData<={rData[0],rData[3:1]rData<={rData[0],rData[1],rData[2],rData[3]};assignData_Out=rData;43.第16~35行是cmd_control_module.v的部分,當PS2_Done_Sig產(chǎn)生高脈沖(23行,該控制模塊就會對PS2_Data產(chǎn)生反應。8'h1d是“W”鍵的通碼,而8'h22是“X”鍵的通碼,至于8'h14是“Ctrl”鍵的通碼?!癢”鍵,產(chǎn)生左移效果(26~27行,“X”鍵,產(chǎn)生右移效果(29~30行,module VerilogVerilogHDL(CLK, inputinputinputinputoutputwirewireps2_module(.CLK(CLK.RSTn(RSTn //input-from //input-from.PS2_Data(PS2_Data //output-to //ouput-to cmd_control_module(.CLK(CLK.RSTn(RSTn //input-from.PS2_Data(PS2_Data //input-from.Data_Out(Data_Out //output-to 42.exp08_demo.vps2_modulecmd_control_module.v的組合模塊。ps2_module.v的實驗八演示說明cmd_control_module.v23行,PS2_Done_Sig很有效被利用來控制執(zhí)行的次“W“X不會對其他的按鍵的通碼或者斷碼產(chǎn)生反應。換一句話說,cmd_control_module.v只會實驗八演示結論筆者以前接觸過很多有關PS2的實驗,都非常執(zhí)著于“字符”的輸出。其實無論成為有效的“命令”或者“觸發(fā)”!?立按鍵是完全“并行”執(zhí)行,不會出現(xiàn)對輸出爭先恐后的。所以在許多方面編碼鍵VerilogVerilogHDL實驗九:VGA實驗九之一:驅動概VGA驅動實驗作為FPGA的實驗多少也有些。VGA是什么?估計有接觸過電硬件接口沒有什么好學的,VGA協(xié)議才是正點。VGA5HSYNCSignal,VSYNCSignal,RGBSignal。說簡單一點,HSYNCSignal是“列同步信號VSYNCSignal是“行同步信號”,RGBSignal是“紅色-綠色-藍色顏色信號VGA的掃描是固定的。一幀的屏幕是由“m行掃描”和“n列填充800x600x60Hz(800x600x60Hz),那么宏觀上它有600行和800列為一行。0行-0行,列填充0~799。1行-10~799。2行-20~799。m-m0~799。598-5980~799599行-5990~600行從上至下掃描,800列從左至右填充(這也是為什掃描是由超過800個列填充完成。HSYNCVSYNCHSYNC和C800x600x60Hz800x600xabcde段-總共nHSYNC800x600xopqrs段-總共nVSYNC41HSYNCSignalHSYNCSignal4個段,也就是a同步段b(后廊段)c(激活段)d(前廊段。HSYNCSignala是拉低128b88c800個列像素,而最后的d是拉高的40個列像素。一列總共有1056個列像素。VSYNCSignalVSYNCSignal4個段,o同步段p(后廊段)q(激活段)r(前廊段。VSYNCSignalo是拉4p23q600個行像素,而最后的r是拉高的1個行像素。一行總共有628個行像素?!耙粋€行像素”是以“列像素”為單位的(800x600x60Hz為例)VerilogVerilogHDL1個行像素=1056個列像素 而“一個列像素”是以“時間”為單位(以800x600x60Hz為例11=25ns1=1056=1056x25ns2.64us(800x600x60Hz為例)在上述內(nèi)容讀者可以發(fā)現(xiàn)一個事實,要完成一行的掃描,需要1056個列像素,也就是說需要1056x25ns的時間。如果要完成所有行的掃描的話,需要628x1056x25ns的時間。很遺憾的是,不是所有時間都用來顯示,有一在上圖表示了,HSYNCSignalC(紅色部分)VSYNCSignalq列像素>216&&列像素<1017&&行像素>27&&行像素<627 vga_module.vpll_module.vsync_module.vvga_control_module.vpll_module.vVGA800x600x60Hz最小單位”也就是“列像素”所占用的時間周期--25ns。換句話說,至少需要40MHz的時鐘頻率,而黑金搭載的時鐘為50Mhz,所以需要用到pll_module.v對黑金的源時鐘進行倍頻(四倍頻后五分頻得到40MHz。50Mhz50Mhz20ns時鐘周40Mhz25ns時鐘周(pllFPGA的重要硬件資源,pllsync_module.vHSYNCSignalVSYNCSignal控制的“功能模塊”。它扮演了“VGA驅動的”的角色。除此之外,sync_module.v還輸出當前的x地址(Coumn_ddr_Si,y)igvga_control_module.v是“圖像控制的”控制模塊,有關Red,Green,Blue信號的控制,xy地址的控制,圖像顯示控制,幀控制,完全都是在這個模塊中完成操作是“圖像顯示控制VerilogVerilogHDL九九module(CLK,Column_Addr_Sig, inputinputoutputoutputoutputoutputoutputregalways@(posedgeCLKornegedgeRSTnif(!RSTnCount_H<=elseif(Count_H==11'd1056Count_H<=Count_H<=Count_H+1'b1; regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount_V<=elseif(Count_V==11'd628Count_V<=elseif(Count_H==11'd1056Count_V<=Count_V+1'b1; regalways@(posedgeCLKornegedgeRSTnif(!RSTnisReady<=elseif((Count_H>11'd216&&Count_H<11'd1017)(Count_V>11'd27&&Count_V<11'd627)isReady<= assignVSYNC_Sig=(Count_V<=11'd4)?1'b0:assignHSYNC_Sig=(Count_H<=11'd128)?1'b0: assignColumn_Addr_Sig=isReady?Count_H-11'd217:11'd0;//CountfromassignRow_Addr_Sig=isReady?Count_V-11'd28:11'd0;//Countfrom0 67.pll_module.v50Mhz40Mhz,所以時800x600x60Hz的顯示標準。也就是說,時間周期要達到一個列像素的時間,亦即25ns。18Count_H是對“列像素20~26行表示了“列像素”25ns就會累計,直到Count_H1056值。30Count_V32~38行描述了,“11056個列像素(以800x600x60Hz為例”因為每1056個列像素,Count_V就會遞增(37行35Count_V628。55VSYNCSignaloVSYNCSignalooVerilogVerilogHDLSignala128HSYNCSignal128個列像后就拉高HSYNCSignal。第57行是“有效區(qū)域”的輸出信號。sync_module.v有義務輸出x地址(Column_Addr_Sig)和y(Row_Addr_Si計數(shù)是27個Count_V之后(63行)開始計數(shù)。Count_HCount_H128HSYNCSignalabCount_V27VSYNCSignal的opisReadyHSYNCSignalC*VSYNCSignalqColumn_Addr_SigHSYNCSignalb800Row_Addr_SigVSYNCSignalp600CLK,Red_Sig,Green_Sig,inputCLK;inputinputinput[10:0]Row_Addr_Sig;outputRed_Sig;outputoutputregalways@(posedgeCLKornegedgeRSTn)if(!RSTn)isRectangle<=elseif(Column_Addr_Sig>11'd0&&Row_Addr_Sig<11'd100)isRectangle<=1'b1;isRectangle<=assignRed_Sig=Ready_Sig&&isRectangle?1'b1:1'b0;assignGreen_Sig=Ready_Sig&&isRectangle?1'b1:1'b0;assignBlue_Sig=Ready_Sig&&isRectangle?1'b1:1'b0;37.vga_control_module.v18isRectangle的標志寄域內(nèi)顯示白色的矩形。Ready_Sig有時候可以作為。vga_control_module.v作為100x799的矩形module(CLK,VSYNC_Sig,HSYNC_Sig,inputCLK;inputoutputRed_Sig;outputGreen_Sig;outputBlue_Sig;wireVerilogVerilogHDLpll_module(.inclk0(CLK //input-from.c0(CLK_40Mhz //output-inter wirewiresync_module(.CLK(CLK_40Mhz.RSTn(RSTn.VSYNC_Sig(VSYNC_Sig //output-to.HSYNC_Sig(HSYNC_Sig //output-to.Column_Addr_Sig(Column_Addr_Sig //output-to //output-to.Ready_Sig(Ready_Sig //output-to (.CLK(CLK_40Mhz.RSTn(RSTn.Ready_Sig(Ready_Sig //input-from.Column_Addr_Sig(Column_Addr_Sig //input-from //input-from.Red_Sig(Red_Sig //output-to //output-to.Blue_Sig(Blue_Sig //output-to 59.實驗九之一說明這個實驗主要是驅動VGA,800x600x60Hz為顯示標準,同時也描述了sync_module.v在vga_module.v組合模塊中扮演的角色。sync_module.v直接對HSYNCSignalVSYNCSignalsync_module.vxy地址告訴vga_control_module.v好讓這個模塊作出相關的顯示控制。800x600x60Hz(Mhz1個列像素的時間)800x600x60Hz40Mhz20Mhz40Mhz的原因,因800x600x60Hz顯示標準的1個列像素需要25ns。實驗九之一結論VGAsync_module.v等于是配置VGA的顯示標準。這個實驗有一個重點,因為關于源時鐘50Mhz分頻后是40Mhz,悄悄好達到1個列像素的時間單位25ns。VerilogVerilogHDL實驗九之二:向下兼容概念假設現(xiàn)在源時鐘20Mhz翻倍到100Mhz,640x480x60Hz作為VGA的顯示標640x480x60Hz的顯示標準需要的時鐘頻率是25.175Mhz1個列39.7ns100Mhz如何向下兼容這個640x480x60Hz的顯示vga_module.vpll_module.v20Mhz翻倍至100Mhz,和sync_module.v640x480x60Hz480x60Hz25.175Mhz139.7ns,那么可以用更高的源時鐘是求得39.7ns的定時。說得簡單一點就是配置一個定時器。100Mhzxxx=39.7ns/(1/100Mhz==module(CLK,Column_Addr_Sig, inputinputoutputoutputoutputoutputoutput regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount1<=elseif(Count1==T40NSCount1<=Count1<=Count1+1'b1; regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount_H<=elseif(Count_H==11'd800Count_H<=VerilogVerilogHDLelseif(Count1==T40NSCount_H<=Count_H+1'b1; regalways@(posedgeCLKornegedgeRSTnif(!RSTnCount_V<=elseif(Count_V==11'd525Count_V<=elseif(Count_H==11'd800Count_V<=Count_V+1'b1; regalways@(posedgeCLKornegedgeRSTnif(!RSTnisReady<=elseif((Count_H>=11'd144&&Count_H<11'd784)(Count_V>=11'd35&&Count_V<11'd515)isReady<= assignVSYNC_Sig=(Count_V<=11'd2)?1'b0:assignHSYNC_Sig=(Count_H<=11'd96)?1'b0: assignColumn_Addr_Sig=isReady?Count_H-11'd144:11'd0;//CountfromassignRow_Addr_Sig=isReady?Count_V-11'd35:11'd0;//Countfrom0 83.1840ns22~3040ns的定時。那樣一來,我們不用同樣的時鐘頻率也能向下驅動不同的顯示標準(在41行的定時作用。除此之外,640x480x60HzHSVSSignal的o段拉低時間(72行xy地址的輸出(78~79行。vga_control_module.vCLK,VSYNC_Sig,HSYNC_Sig,inputCLK;inputoutputRed_Sig;outputGreen_Sig;output.inclk0(CLK.c0(CLK_100Mhz//input-from//output-tointerVerilogVerilogHDLwirewiresync_module(.RSTn(RSTn.VSYNC_Sig(VSYNC_Sig//output-to

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論