多路生理信號(hào)數(shù)據(jù)采集模塊設(shè)計(jì)_第1頁
多路生理信號(hào)數(shù)據(jù)采集模塊設(shè)計(jì)_第2頁
多路生理信號(hào)數(shù)據(jù)采集模塊設(shè)計(jì)_第3頁
多路生理信號(hào)數(shù)據(jù)采集模塊設(shè)計(jì)_第4頁
多路生理信號(hào)數(shù)據(jù)采集模塊設(shè)計(jì)_第5頁
已閱讀5頁,還剩140頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

③RTL電路圖圖3.2.6系統(tǒng)原理圖設(shè)計(jì)及引腳分配頂層模塊硬件連線及引腳配置:《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》:三眼電圖形刺激器設(shè)計(jì)(棋盤格)系統(tǒng)原理圖設(shè)計(jì)及引腳分配圖3.3.1RTL圖圖3.3.2仿真結(jié)果:圖3.3.3硬件連線圖圖3.3.4《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》:三眼電圖形刺激器設(shè)計(jì)(棋盤格)結(jié)果分析及心得體會(huì)硬件顯示結(jié)果(部分)結(jié)果分析及心得體會(huì)由硬件實(shí)驗(yàn)結(jié)果可知,本次設(shè)計(jì)的眼電刺激圖形滿足實(shí)驗(yàn)要求,即每隔5S循環(huán)顯示一種圖形,顏色有黑白、紅綠、藍(lán)綠,圖形形式有橫豎條紋和方格,顯示方式有全屏和半屏,共18種狀態(tài)。本次實(shí)驗(yàn)做了很多前期準(zhǔn)備,包括認(rèn)真閱讀相關(guān)文獻(xiàn)、與同學(xué)進(jìn)行討論和交流等。并且在編寫程序后多次修改優(yōu)化,反復(fù)調(diào)試。在最初硬件顯示調(diào)試時(shí)沒有屏幕輸出顯示,檢查程序并沒有錯(cuò),檢查硬件時(shí)發(fā)現(xiàn)是由于硬件VGA端口有RGB各兩個(gè),而本設(shè)計(jì)實(shí)際使用為其中三個(gè),引腳分配與硬件不相符導(dǎo)致結(jié)果無法正常顯示,調(diào)換跳線帽位置后顯示結(jié)果正確??傮w來說本次課程設(shè)計(jì)過程曲折,但最終還是圓滿地完成了任務(wù),實(shí)現(xiàn)了了8x6的棋盤顯示。通過此次課程設(shè)計(jì),我收獲頗豐。對(duì)于自己負(fù)責(zé)的課題,VGA的時(shí)序關(guān)系以及顏色成像的原理。同時(shí),對(duì)于本次設(shè)計(jì)過程中幫助確定方案思路及硬件調(diào)試的組員王孜同學(xué)表示感謝。參考文獻(xiàn)[1]《EDA技術(shù)與VHDL》第3版潘松,黃繼業(yè)清華大學(xué)出版社2006.6[2]《EDA技術(shù)基礎(chǔ)》實(shí)驗(yàn)指導(dǎo)書趙曉明[3]《基于FPGA的VGA顯示模塊設(shè)計(jì)》張亞平,賀占莊《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》:病房溫度測(cè)控系統(tǒng)的設(shè)計(jì)病房溫度測(cè)控系統(tǒng)的設(shè)計(jì)王孜重慶大學(xué)生物醫(yī)學(xué)工程聯(lián)合學(xué)院生物醫(yī)學(xué)工程2班20106836設(shè)計(jì)要求(1)FPGA控制溫度傳感器對(duì)病房溫度進(jìn)行監(jiān)控;(2)將檢測(cè)的溫度值實(shí)時(shí)顯示在數(shù)碼管上(十進(jìn)制顯示);(3)當(dāng)溫度值高于28度時(shí),點(diǎn)亮FPGA主板LED1指示燈(模擬通知空調(diào)室降溫),當(dāng)溫度值高于30度時(shí),通過蜂鳴器發(fā)出間隔時(shí)間為1S的報(bào)警聲,連續(xù)5聲,點(diǎn)亮FPGA主板LED2。當(dāng)溫度值低于22度時(shí),鳴器發(fā)出間隔時(shí)間為500MS的報(bào)警聲,連續(xù)3聲后點(diǎn)亮FPGA主板LED3指示燈(模擬通知空調(diào)室升溫)。其余狀態(tài),LED4亮。(4)不同溫度情況,用不同占空比PWM信號(hào)模擬電機(jī)調(diào)速。設(shè)計(jì)思路 為滿足設(shè)計(jì)要求作出以下針對(duì)性設(shè)計(jì):采用I2C接口的LM75A溫度傳感器采集溫度;采用四位數(shù)碼管將LM75A采集并由FPGA轉(zhuǎn)換格式后的數(shù)據(jù)顯示出來;將0~50度分為4個(gè)溫度區(qū)間,分情況執(zhí)行“要求”中的操作。為了便于實(shí)驗(yàn),溫度區(qū)間劃分為:0~32,33~37,38~40,41~50。這樣的話可以通過使用電烙鐵加熱芯片快速的觀察實(shí)驗(yàn)效果。《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》:病房溫度測(cè)控系統(tǒng)的設(shè)計(jì)所用硬件所用的硬件CycloneIV開發(fā)板1塊紅色LED5個(gè)LM75A1片按鍵1個(gè)數(shù)碼管4位蜂鳴器1個(gè) CycloneIV開發(fā)板EP4CE10E22C8是ALTER的CYCLONEIV四代FPGA器件,采用優(yōu)化后的60nm工藝,降低了內(nèi)核電壓,和前一代相比,總功耗降低了25%,器件含有1萬多個(gè)寄存器資源Altera新的Cyclone?IV系列FPGA器件鞏固了Cyclone系列在低成本、低功耗FPGA市場(chǎng)的領(lǐng)導(dǎo)地位,并且目前提供集成收發(fā)器功能的型號(hào)。CycloneIV器件旨在用于大批量,成本敏感的應(yīng)用,使系統(tǒng)設(shè)計(jì)師在降低成本的同時(shí)又能夠滿足不斷增長(zhǎng)的帶寬要求。CycloneIV器件系列是建立在一個(gè)優(yōu)化的低功耗工藝基礎(chǔ)之上,并提供E和GX兩種型號(hào)。CycloneIVE—最低的功耗,通過最低的成本實(shí)現(xiàn)較高的功能性。右表顯示了所用器件的資源。LM75ALM75A是一個(gè)使用了內(nèi)置帶隙溫度傳感器和Σ-△模數(shù)轉(zhuǎn)換技術(shù)的溫度-數(shù)字轉(zhuǎn)換器。它也是一個(gè)溫度檢測(cè)器,可提供一個(gè)過熱檢測(cè)輸出。LM75A包含許多數(shù)據(jù)寄存器:配置寄存器(Conf),用來存儲(chǔ)器件的某些配置,如器件的工作模式、OS工作模式、OS極性和OS故障隊(duì)列等;溫度寄存器(Temp),用來存儲(chǔ)讀取的數(shù)字溫度;設(shè)定點(diǎn)寄存器(Tos&Thyst),用來存儲(chǔ)可編程的過熱關(guān)斷和滯后限制,器件通過2線的串行I2C總線接口與控制器通信。LM75A還包含一個(gè)開漏輸出(OS),當(dāng)溫度超過編程限制的值時(shí)該輸出有效。LM75A有3個(gè)可選的邏輯地址管腳,使得同一總線上可同時(shí)連接8個(gè)器件而不發(fā)生地址沖突。LM75A可配置成不同的工作條件。它可設(shè)置成在正常工作模式下周期性地對(duì)環(huán)境溫度進(jìn)行監(jiān)控或進(jìn)入關(guān)斷模式來將器件功耗降至最低。OS輸出有2種可選的工作模式:OS比較器模式和OS中斷模式。OS輸出可選擇高電平或低電平有效。故障隊(duì)列和設(shè)定點(diǎn)限制可編程,為了激活OS輸出,故障隊(duì)列定義了許多連續(xù)的故障。溫度寄存器通常存放著一個(gè)11位的二進(jìn)制數(shù)的補(bǔ)碼,用來實(shí)現(xiàn)0.125℃的精度。這個(gè)高精度在需要精確地測(cè)量溫度偏移或超出限制范圍的應(yīng)用中非常有用。正常工作模式下,當(dāng)器件上電時(shí),OS工作在比較器模式,溫度閾值為80℃,滯后75℃,這時(shí),LM75A就可用作一個(gè)具有以上預(yù)定義溫度設(shè)定點(diǎn)的獨(dú)立的溫度控制器。特性1.器件可以完全取代工業(yè)標(biāo)準(zhǔn)的LM75,并提供了良好的溫度精度(0.125℃),單個(gè)器件的電源可超出2.8V~5.5V的范圍。2.小型8腳封裝:SO8和TSSOP8。3.具有I2C總線接口,同一總線上可連接多達(dá)8個(gè)器件。4.電源電壓范圍:2.8V~5.5V。5.溫度范圍:-55℃~+125℃。6.提供0.125℃的精度的11位的ADC。7.溫度精度:-25℃~+100℃時(shí)為±2℃-55℃~+125℃時(shí)為±3℃8.可編程溫度閾值和滯后設(shè)定點(diǎn)。9.為了降低功耗,關(guān)斷模式下消耗的電流僅為3.5uA。10.上電時(shí)器件可用作一個(gè)獨(dú)立的溫度控制器。11.ESD保護(hù):JESD22-A114為2000VHBM,JESD22-A115為200V和JESD22-C101為1000VCDM。12.超過100mA的JESDEC標(biāo)準(zhǔn)JESD78要進(jìn)行栓鎖測(cè)試(Latch-uptesting)。系統(tǒng)功能描述 按下rst按鍵,使系統(tǒng)復(fù)位到預(yù)定的狀態(tài)。此時(shí)數(shù)碼管顯示”000C“,一段時(shí)間后,顯示當(dāng)前溫度的整數(shù)值。 溫度在33~37度LED4亮,為預(yù)設(shè)的正常溫度,PWM驅(qū)動(dòng)的LED中等亮度;溫度在38~40度LED3亮,PWM驅(qū)動(dòng)的LED中等亮度;溫度在從40度以下進(jìn)入到41度以上時(shí),蜂鳴器以1s為間隔鳴叫5次,之后LED2點(diǎn)亮。PWM控制的LED高亮度;溫度在從32度以上進(jìn)入到31度以上時(shí),蜂鳴器以500ms為間隔鳴叫3次,之后LED3點(diǎn)亮。PWM控制的LED低亮度;《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》:病房溫度測(cè)控系統(tǒng)的設(shè)計(jì)系統(tǒng)模塊系統(tǒng)模塊如圖,把系統(tǒng)的實(shí)現(xiàn)分成5個(gè)模塊。分別為:LM75A,數(shù)碼管,數(shù)據(jù)轉(zhuǎn)換與處理,蜂鳴器,PWM。其中LM75A模塊負(fù)責(zé)與溫度傳感器的接口,通過I2C獲得溫度數(shù)據(jù)。數(shù)據(jù)轉(zhuǎn)換與處理模塊是系統(tǒng)中功能最復(fù)雜的模塊,負(fù)責(zé)4種溫度狀態(tài)的判斷與轉(zhuǎn)換。數(shù)碼管模塊負(fù)責(zé)將溫度傳感器的數(shù)據(jù)動(dòng)態(tài)掃描顯示在數(shù)碼管上。蜂鳴器和PWM模塊的功能與其命名相同。其中最難得一點(diǎn)是正確的實(shí)現(xiàn)蜂鳴器鳴叫和隨后的LED點(diǎn)亮。溫度過高提示時(shí),蜂鳴器間隔1s響5次,之后點(diǎn)亮LED。要求從38~40度到41~50度溫度時(shí)進(jìn)行一次,也就是說,只有在40到41度變化之后才使蜂鳴器鳴叫,溫度反向變化,或是停在41~50區(qū)間都不會(huì)使蜂鳴器鳴叫。換言之,要判斷溫度從40度變化到41度,只有唯一的經(jīng)歷這一過程才會(huì)使蜂鳴器鳴叫。溫度過低的蜂鳴器警報(bào)也是如此。所以,除了編寫4個(gè)溫度區(qū)間的狀態(tài)機(jī)外,要單獨(dú)考慮過冷和過熱的蜂鳴器警報(bào)。將上述內(nèi)容圖形化:蜂鳴器模塊采用了狀態(tài)機(jī)控制蜂鳴器在特定的時(shí)間間隔鳴叫,并且鳴叫后點(diǎn)亮LED?!犊删幊踢壿嬙O(shè)計(jì)課程設(shè)計(jì)》:病房溫度測(cè)控系統(tǒng)的設(shè)計(jì)仿真代碼(見附錄)仿真 因?yàn)槭褂玫氖荙uartusII11.064-bit版本,沒有仿真功能,所以借助第三方仿真工具M(jìn)odelSimSE10.0c64-bit。 Modelsim介紹Mentor公司的ModelSim是業(yè)界最優(yōu)秀的HDL語言仿真軟件,它能提供友好的仿真環(huán)境,是業(yè)界唯一的單內(nèi)核支持VHDL和Verilog混合仿真的仿真器。它采用直接優(yōu)化的編譯技術(shù)、Tcl/Tk技術(shù)、和單一內(nèi)核仿真技術(shù),編譯仿真速度快,編譯的代碼與平臺(tái)無關(guān),便于保護(hù)IP核,個(gè)性化的圖形界面和用戶接口,為用戶加快調(diào)錯(cuò)提供強(qiáng)有力的手段,是FPGA/ASIC設(shè)計(jì)的首選仿真軟件。主要特點(diǎn):·RTL和門級(jí)優(yōu)化,本地編譯結(jié)構(gòu),編譯仿真速度快,跨平臺(tái)跨版本仿真;·單內(nèi)核VHDL和Verilog混合仿真;·源代碼模版和助手,項(xiàng)目管理;·集成了性能分析、波形比較、代碼覆蓋、數(shù)據(jù)流ChaseX、SignalSpy、虛擬對(duì)象VirtualObject、Memory窗口、Assertion窗口、源碼窗口顯示信號(hào)值、信號(hào)條件斷點(diǎn)等眾多調(diào)試功能;·C和Tcl/Tk接口,C調(diào)試;·對(duì)SystemC的直接支持,和HDL任意混合;·支持SystemVerilog的設(shè)計(jì)功能;·對(duì)系統(tǒng)級(jí)描述語言的最全面支持,SystemVerilog,SystemC,PSL;·ASICSignoff。·可以單獨(dú)或同時(shí)進(jìn)行行為(behavioral)、RTL級(jí)、和門級(jí)(gate-level)的代碼。ModelSim分幾種不同的版本:SE、PE、LE和OEM,其中SE是最高級(jí)的版本,而集成在Actel、Atmel、Altera、Xilinx以及Lattice等FPGA廠商設(shè)計(jì)工具中的均是其OEM版本。SE版和OEM版在功能和性能方面有較大差別,比如對(duì)于大家都關(guān)心的仿真速度問題,以Xilinx公司提供的OEM版本ModelSimXE為例,對(duì)于代碼少于40000行的設(shè)計(jì),ModelSimSE比ModelSimXE要快10倍;對(duì)于代碼超過40000行的設(shè)計(jì),ModelSimSE要比ModelSimXE快近40倍。ModelSimSE支持PC、UNIX和LINUX混合平臺(tái);提供全面完善以及高性能的驗(yàn)證功能;全面支持業(yè)界廣泛的標(biāo)準(zhǔn);MentorGraphics公司提供業(yè)界最好的技術(shù)支持與服務(wù)。 使用ModelSim時(shí)發(fā)現(xiàn),這個(gè)軟件功能很強(qiáng)大,甚至提供斷點(diǎn)功能,還有很多高級(jí)功能,比如Dataflow。由于我們做的工程比較簡(jiǎn)單,所以沒有用到這些功能。在熟練地掌握這些軟件并養(yǎng)成良好的工作習(xí)慣之前,這些軟件并不能有效的提供幫助。這個(gè)工程是我第一次做的功能比較綜合的FPGA,完全沒有仿真,只是按照自己的思路加上電路板上的實(shí)驗(yàn)效果調(diào)試出來的。以后在做更復(fù)雜的工程時(shí),會(huì)嘗試進(jìn)行仿真,提高效率。整個(gè)工程中,大概有三種功能型結(jié)構(gòu):1.時(shí)鐘產(chǎn)生,即為分頻;2.由case語句產(chǎn)生的狀態(tài)機(jī);3.由if語句組成的判斷。所以相同功能的模塊就不進(jìn)行仿真了。以下是時(shí)序仿真結(jié)果:數(shù)碼管動(dòng)態(tài)掃描模塊仿真命令:forceclk11,02–repeat2 Run@1000000使用四位共陰數(shù)碼管,輸入x”0123”,可以觀察到位選信號(hào)和段碼的改變,即動(dòng)態(tài)顯示的原理。時(shí)鐘產(chǎn)生模塊仿真命令:forceclk11,02–repeat2 Run–all Break數(shù)據(jù)轉(zhuǎn)換與控制模塊仿真命令:forceclk11,02–repeat2 用force設(shè)定某時(shí)間段datain的值,模擬從LM75獲取數(shù)據(jù) Run-all break PWM模塊仿真命令:forceclk11,02–repeat2 用force設(shè)定某時(shí)間段dy的值,模擬從convert獲取數(shù)據(jù) Run-all break 可以看出pwm占空比的變化?!犊删幊踢壿嬙O(shè)計(jì)課程設(shè)計(jì)》:病房溫度測(cè)控系統(tǒng)的設(shè)計(jì)SignalTapII蜂鳴器模塊仿真命令:forceclk11,02–repeat2 用force設(shè)定某時(shí)間段datain的值,模擬從LM75獲取數(shù)據(jù) Run-all break 可以看出蜂鳴器正確的鳴叫,而且在之后點(diǎn)亮LED。各溫度區(qū)間LED點(diǎn)亮情況也正確。SignalTapII 主要使用SignalTapII觀察系統(tǒng)整個(gè)系統(tǒng)和單獨(dú)觀察LM75模塊。27C時(shí)36C時(shí)39C時(shí)44C時(shí)過熱時(shí)蜂鳴器情況過冷時(shí)蜂鳴器情況LM75時(shí)序數(shù)據(jù)通信主機(jī)和LM75A之間的通信必須嚴(yán)格遵循I2C總線管理定義的規(guī)則。LM75A寄存器讀/寫操作的協(xié)議通過下列描述之后的各個(gè)圖來說明:1.通信開始之前,I2C總線必須空閑或者不忙。這就意味著總線上的所有器件都必須釋放SCL和SDA線,SCL和SDA線被總線的上拉電阻拉高。2.由主機(jī)來提供通信所需的SCL時(shí)鐘脈沖。在連續(xù)的9個(gè)SCL時(shí)鐘脈沖作用下,數(shù)據(jù)(8位的數(shù)據(jù)字節(jié)以及緊跟其后的1個(gè)應(yīng)答狀態(tài)位)被傳輸。3.在數(shù)據(jù)傳輸過程中,除起始和停止信號(hào)外,SDA信號(hào)必須保持穩(wěn)定,而SCL信號(hào)必須為高。這就表明SDA信號(hào)只能在SCL為低時(shí)改變。4.S:起始信號(hào),主機(jī)啟動(dòng)一次通信的信號(hào),SCL為高電平,SDA從高電平變成低電平。5.RS:重復(fù)起始信號(hào),與起始信號(hào)相同,用來啟動(dòng)一個(gè)寫命令后的讀命令。6.P:停止信號(hào),主機(jī)停止一次通信的信號(hào),SCL為高電平,SDA從低電平變成高電平。然后總線變成空閑狀態(tài)。7.W:寫位,在寫命令中寫/讀位=0。8.R:讀位,在讀命令中寫/讀位=1。9.A:器件應(yīng)答位,由LM75A返回。當(dāng)器件正確工作時(shí)該位為0,否則為1。為了使器件獲得SDA的控制權(quán),這段時(shí)間內(nèi)主機(jī)必須釋放SDA線。10.A’:主機(jī)應(yīng)答位,不是由器件返回,而是在讀2字節(jié)的數(shù)據(jù)時(shí)由主控器或主機(jī)設(shè)置的。在這個(gè)時(shí)鐘周期內(nèi),為了告知器件的第一個(gè)字節(jié)已經(jīng)讀走并要求器件將第二個(gè)字節(jié)放到總線上,主機(jī)必須將SDA線設(shè)為低電平。11.NA:非應(yīng)答位。在這個(gè)時(shí)鐘周期內(nèi),數(shù)據(jù)傳輸結(jié)束時(shí)器件和主機(jī)都必須釋放SDA線,然后由主機(jī)產(chǎn)生停止信號(hào)。12.在寫操作協(xié)議中,數(shù)據(jù)從主機(jī)發(fā)送到器件,由主機(jī)控制SDA線,但在器件將應(yīng)答信號(hào)發(fā)送到總線的時(shí)鐘周期內(nèi)除外。13.在讀操作協(xié)議中,數(shù)據(jù)由器件發(fā)送到總線上,在器件正在將數(shù)據(jù)發(fā)送到總線和控制SDA線的這段時(shí)間內(nèi),主機(jī)必須釋放SDA線,但在主器件將應(yīng)答信號(hào)發(fā)送到總線的時(shí)間周期內(nèi)除外。電路原理圖set_location_assignmentPIN_91-toclkset_location_assignmentPIN_25-torstset_location_assignmentPIN_142-toSCLKset_location_assignmentPIN_141-toSDAset_location_assignmentPIN_128-toweima[0]set_location_assignmentPIN_127-toweima[1]set_location_assignmentPIN_132-toweima[2]set_location_assignmentPIN_129-toweima[3]set_location_assignmentPIN_114-toduanma[0]set_location_assignmentPIN_115-toduanma[1]set_location_assignmentPIN_119-toduanma[2]set_location_assignmentPIN_120-toduanma[3]set_location_assignmentPIN_121-toduanma[4]set_location_assignmentPIN_124-toduanma[5]set_location_assignmentPIN_125-toduanma[6]《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》:病房溫度測(cè)控系統(tǒng)的設(shè)計(jì)電路原理圖set_location_assignmentPIN_126-toduanma[7]《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》:病房溫度測(cè)控系統(tǒng)的設(shè)計(jì)總結(jié)總結(jié) 這是我做的第一個(gè)較為復(fù)雜的FPGA工程,因?yàn)槿鄙俳?jīng)驗(yàn)所以調(diào)試了挺久的。但是完成了之后還是學(xué)了很多,比如語法格式、狀態(tài)機(jī)的寫法、ModleSim的使用等。 在動(dòng)手編寫程序之前,更重要的是讀懂題目的要求,將具體的功能實(shí)現(xiàn)轉(zhuǎn)化為狀態(tài)機(jī)。在這一步驟中,理清思路特別重要,最好可以在紙上推演一下,盡可能簡(jiǎn)化狀態(tài)。比如AD采集程序中的核心部分的狀態(tài)機(jī),想清楚后可以簡(jiǎn)化為3個(gè)狀態(tài),空想的話在實(shí)驗(yàn)室調(diào)試了一個(gè)下午都沒有結(jié)果。所以思路清晰很重要。 總的來說,當(dāng)初初識(shí)FPGA的興奮還沒有消退。感覺單片機(jī)是編軟件,F(xiàn)PGA是編寫硬件,有完全不同的思路和風(fēng)格?!犊删幊踢壿嬙O(shè)計(jì)課程設(shè)計(jì)》附件:多路生理信號(hào)采集模塊設(shè)計(jì)程序清單附件材料多路生理信號(hào)采集模塊設(shè)計(jì)程序清單鍵盤掃描模塊程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYMATRIKEYSCANISPORT( CLK :INSTD_LOGIC;--50MHZ時(shí)鐘 CLKOUT:OUTSTD_LOGIC;--1KHZOUTPUTNEXT COL :INSTD_LOGIC_VECTOR(3DOWNTO0);--LIESIGNAL ROW :OUTSTD_LOGIC_VECTOR(3DOWNTO0);--HANGSIGNAL KEYOUT :OUTSTD_LOGIC_VECTOR(3DOWNTO0);--MARKTHENUMBER PUTDOWN:OUTSTD_LOGIC);--PUTDOWN=1表示鍵盤輸出值有效ENDMATRIKEYSCAN;ARCHITECTUREBEHAVEOFMATRIKEYSCANIS SIGNALROWREG:STD_LOGIC_VECTOR(3DOWNTO0); SIGNALCOLREG,COLREG0,COLREG1,COLREG2:STD_LOGIC_VECTOR(3DOWNTO0); SIGNALCON:STD_LOGIC_VECTOR(7DOWNTO0); SIGNALCNT:INTEGERRANGE0TO50000; SIGNALCLKREG:STD_LOGIC;--1KHZ時(shí)鐘BEGINPROCESS(CLK)--50MHZCLK分頻輸出1KHZCLKREGBEGIN IFCLK'EVENTANDCLK='1'THEN IFCNT=49999THEN--49999 CNT<=0; CLKREG<='0'; ELSIFCNT=24999THEN--24,999 CNT<=CNT+1; CLKREG<='1'; ELSE CNT<=CNT+1; ENDIF; ENDIF;ENDPROCESS;CLKOUT<=CLKREG;PROCESS(CLKREG)--輸出列信號(hào),掃描鍵盤BEGIN IFCLKREG'EVENTANDCLKREG='1'THEN CASEROWREGIS WHEN"0001"=>ROWREG<="0010"; WHEN"0010"=>ROWREG<="0100"; WHEN"0100"=>ROWREG<="1000"; WHEN"1000"=>ROWREG<="0001"; WHENOTHERS=>ROWREG<="0001"; ENDCASE; ENDIF;ENDPROCESS; ROW<=ROWREG;--列信號(hào)輸出 CON<=ROWREG&COL;PROCESS(CLKREG)--MARKTHENUMBERBEGIN IFCLKREG'EVENTANDCLKREG='1'THEN CASECONIS WHEN"10001000"=>KEYOUT<="0000";PUTDOWN<='1';--1 WHEN"01001000"=>KEYOUT<="0001";PUTDOWN<='1';--2 WHEN"00101000"=>KEYOUT<="0010";PUTDOWN<='1';--3 WHEN"00011000"=>KEYOUT<="0011";PUTDOWN<='1';--4 WHEN"10000100"=>KEYOUT<="0100";PUTDOWN<='1';--5 WHEN"01000100"=>KEYOUT<="0101";PUTDOWN<='1';--6 WHEN"00100100"=>KEYOUT<="0110";PUTDOWN<='1';--7 WHEN"00010100"=>KEYOUT<="0111";PUTDOWN<='1';--8 WHEN"10000010"=>KEYOUT<="1000";PUTDOWN<='1';--9 WHEN"01000010"=>KEYOUT<="1001";PUTDOWN<='1';--10 WHEN"00100010"=>KEYOUT<="1010";PUTDOWN<='1';--11 WHEN"00010010"=>KEYOUT<="1011";PUTDOWN<='1';--12 WHEN"10000001"=>KEYOUT<="1100";PUTDOWN<='1';--13 WHEN"01000001"=>KEYOUT<="1101";PUTDOWN<='1';--14 WHEN"00100001"=>KEYOUT<="1110";PUTDOWN<='1';--15 WHEN"00010001"=>KEYOUT<="1111";PUTDOWN<='1';--16 WHEN"00010000"=>PUTDOWN<='0'; WHEN"00100000"=>PUTDOWN<='0'; WHEN"01000000"=>PUTDOWN<='0'; WHEN"10000000"=>PUTDOWN<='0'; WHENOTHERS=>NULL; ENDCASE; ENDIF;ENDPROCESS;ENDBEHAVE;數(shù)碼管顯示模塊程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDISPLAY_LEDISPORT(CLOCK:INSTD_LOGIC;--1KHZINPUTNUMIN:INSTD_LOGIC_VECTOR(3DOWNTO0);--MARKEDNUMBERST:INSTD_LOGIC;--0OR1EN:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--WEIXUAND_OUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0)--DUANXUAN);END;ARCHITECTURERTLOFDISPLAY_LEDISSIGNALCOUNTER:INTEGERRANGE0TO7;SIGNALNUMA:STD_LOGIC_VECTOR(3DOWNTO0);BEGINPROCESS(ST)BEGINIFRISING_EDGE(ST)THENNUMA(3DOWNTO0)<=NUMIN;ENDIF;ENDPROCESS; PROCESS(CLOCK) VARIABLENUM:STD_LOGIC_VECTOR(3DOWNTO0); BEGIN IFRISING_EDGE(CLOCK)THEN EN<="00000001"; IFCOUNTER>=7THEN--WEIXUANJISHU COUNTER<=0; ELSE COUNTER<=COUNTER+1; ENDIF; CASECOUNTERIS WHEN7=> NUM:=NUMA(3DOWNTO0); WHENOTHERS=> NUM:="0000"; ENDCASE; CASENUMIS--DUANXUANDISPLAY WHEN"0000"=>D_OUT<="00111111";--0 WHEN"0001"=>D_OUT<="00000110";--1 WHEN"0010"=>D_OUT<="01011011";--2 WHEN"0011"=>D_OUT<="01001111";--3 WHEN"0100"=>D_OUT<="01100110";--4 WHEN"0101"=>D_OUT<="01101101";--5 WHEN"0110"=>D_OUT<="01111101";--6 WHEN"0111"=>D_OUT<="00000111";--7 WHEN"1000"=>D_OUT<="01111111";--8 WHEN"1001"=>D_OUT<="01101111";--9 WHEN"1010"=>D_OUT<=X"77";--A WHEN"1011"=>D_OUT<=X"7C";--B WHEN"1100"=>D_OUT<=X"39";--C WHEN"1101"=>D_OUT<=X"5E";--D WHEN"1110"=>D_OUT<=X"79";--E WHEN"1111"=>D_OUT<=X"71";--F WHENOTHERS=>D_OUT<="00000000"; ENDCASE; ENDIF; ENDPROCESS; END;時(shí)鐘分頻模塊程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;ENTITYCLK_DIVISPORT(CLKIN:INSTD_LOGIC;FSEL:INSTD_LOGIC_VECTOR(3DOWNTO0);CLK_OUT_1,CLK_OUT_2:OUTSTD_LOGIC);END;ARCHITECTUREBEHAVEOFCLK_DIVISSIGNALCOUNTER_1:INTEGERRANGE0TO400;SIGNALCOUNTER_2:INTEGERRANGE0TO2500;SIGNALCLK_1,CLK_2:STD_LOGIC:='0';SIGNALFNUM:INTEGERRANGE0TO20;SIGNALNUM:INTEGERRANGE0TO400;BEGINPROCESS(FSEL)BEGINFNUM<=CONV_INTEGER(FSEL);--CONVERTTOINTEGERENDPROCESS;PROCESS(FNUM)--FENPINBEISHUBEGINCASEFNUMIS WHEN0=>NUM<=1; WHEN1=>NUM<=2; WHEN2=>NUM<=4; WHEN3=>NUM<=8; WHEN4=>NUM<=16; WHEN5=>NUM<=32; WHENOTHERS=>NUM<=4;ENDCASE;ENDPROCESS; PROCESS(CLKIN) BEGIN IFRISING_EDGE(CLKIN)THEN IFCOUNTER_1>=(330/NUM-1)THEN--330 COUNTER_1<=0;CLK_1<=NOTCLK_1; ELSECOUNTER_1<=COUNTER_1+1; ENDIF; ENDIF; ENDPROCESS;CLK_OUT_1<=CLK_1;PROCESS(CLKIN)--10KDIV BEGIN IFRISING_EDGE(CLKIN)THEN IFCOUNTER_2>=2499THEN--2499 COUNTER_2<=0;CLK_2<=NOTCLK_2; ELSECOUNTER_2<=COUNTER_2+1; ENDIF; ENDIF; ENDPROCESS; CLK_OUT_2<=CLK_2;END;AD時(shí)序產(chǎn)生模塊程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYADS7822_TIME_CONTROLISPORT( CLK:INSTD_LOGIC; ADS7822_CS,ADS7822_SCLK_OUT:OUTSTD_LOGIC);END;ARCHITECTURERTLOFADS7822_TIME_CONTROLISTYPESTATESIS(IDLE,SCLK_STATE_1,SCLK_STATE_0,SCLK_STATE_3,CS_STATE_0,CS_STATE_1,CS_STATE_2);--定義各子狀態(tài)SIGNALSTATE:STATES:=IDLE;SIGNALCNT:INTEGER:=0;SIGNALCNT2:INTEGER:=0;SIGNALCS,AD_SCLK:STD_LOGIC;BEGINADS7822_CS<=CS;ADS7822_SCLK_OUT<=AD_SCLK;PROCESS(CLK)BEGINIFRISING_EDGE(CLK)THENCASESTATEISWHENIDLE=> CS<='1';AD_SCLK<='0';CNT<=0; IFCNT2>2THEN STATE<=CS_STATE_0;CNT2<=0; ELSE CNT2<=CNT2+1;STATE<=IDLE; ENDIF; WHENSCLK_STATE_1=> AD_SCLK<='1';STATE<=CS_STATE_0; WHENCS_STATE_0=> CS<='0'; IFCNT>14THEN STATE<=CS_STATE_1; ELSE STATE<=SCLK_STATE_0; ENDIF; WHENSCLK_STATE_0=> AD_SCLK<='0';CNT<=CNT+1;STATE<=SCLK_STATE_3; WHENSCLK_STATE_3=> AD_SCLK<='0';CNT<=CNT;STATE<=SCLK_STATE_1; WHENCS_STATE_1=> AD_SCLK<='0'; IFCNT2>5THEN STATE<=CS_STATE_2;CNT2<=0; ELSE CNT2<=CNT2+1;STATE<=CS_STATE_1; ENDIF; WHENCS_STATE_2=> CS<='1';STATE<=IDLE; ENDCASE; ENDIF;ENDPROCESS;ENDRTL;AD轉(zhuǎn)換模塊程序 LIBRARYIEEE; USEIEEE.STD_LOGIC_1164.ALL; USEIEEE.STD_LOGIC_UNSIGNED.ALL; ENTITYSHIFT_AD_DATAIS PORT( CLK,CLK_CAP,AD_IN,CS:INSTD_LOGIC; AD_DATA:OUTSTD_LOGIC_VECTOR(11DOWNTO0)); END; ARCHITECTUREBEHAVEOFSHIFT_AD_DATAIS SIGNALAD_SIG:STD_LOGIC_VECTOR(14DOWNTO0); SIGNALAD_DATA_S:STD_LOGIC_VECTOR(11DOWNTO0); BEGINAD_DATA<=AD_DATA_S; PROCESS(CLK,AD_IN) BEGIN IFCLK'EVENTANDCLK='1'THEN AD_SIG(14)<=AD_IN; FORIIN1TO14LOOP AD_SIG(14-I)<=AD_SIG(15-I); ENDLOOP; ENDIF; ENDPROCESS; PROCESS(CLK_CAP,CS) BEGIN IFCLK_CAP'EVENTANDCLK_CAP='1'THEN IFCS='1'THEN AD_DATA_S<=AD_SIG(14DOWNTO3); ELSE AD_DATA_S<=AD_DATA_S; ENDIF; ENDIF; ENDPROCESS; ENDBEHAVE;存儲(chǔ)地址控制模塊程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYSELISPORT( CS,RST:INSTD_LOGIC; KEYIN:INSTD_LOGIC; ST:OUTSTD_LOGIC_VECTOR(1DOWNTO0);--CHANNELMARK EN,A,B,C:OUTSTD_LOGIC; ADDRESS:OUTSTD_LOGIC_VECTOR(9DOWNTO0); LED,WEN:OUTSTD_LOGIC );ENDENTITYSEL;ARCHITECTURERTLOFSELISSIGNALSTREG:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALADDREG:STD_LOGIC_VECTOR(9DOWNTO0);SIGNALRD,FLAG:STD_LOGIC;SIGNALSTATE:STD_LOGIC_VECTOR(1DOWNTO0);BEGINADDRESS<=ADDREG;--DATAADDRESSWEN<=FLAG;--I/OENABLEST<=STREG;--CHANNELMARKPROCESS(ADDREG,RST)BEGIN IFRST='0'THEN STATE<="00"; ELSIF((ADDREG="0000011111")AND(FLAG='1')AND(STATE="00"))THEN--(ADDREG="1111111111") STATE<="01"; ELSIF(KEYIN='0'ANDSTATE="01")THEN STATE<="10"; ENDIF;ENDPROCESS;PROCESS(CS,STATE,RST)--CASE_SWITCHBEGINIFRST='0'THEN ADDREG<="0000000000"; STREG<="00"; LED<='1'; FLAG<='1';--WENELSIFRISING_EDGE(CS)THEN CASESTATEIS WHEN"00"=> STREG<=STREG+1; FLAG<='1'; LED<='1'; ADDREG<=ADDREG+1;--INPUT WHEN"01"=> ADDREG<="0000000000"; FLAG<='0'; LED<='0';--STOPTOWAIT WHEN"10"=> ADDREG<=ADDREG+1; FLAG<='0'; LED<='1';--OUTPUT WHENOTHERS=>NULL; ENDCASE;ENDIF;ENDPROCESS;PROCESS(STREG)--CHANNALMARKAUTORETURNBEGINCASESTREGIS WHEN"00"=>EN<='0';C<='0';B<='0';A<='0'; WHEN"01"=>EN<='0';C<='0';B<='0';A<='1'; WHEN"10"=>EN<='0';C<='0';B<='1';A<='0'; WHEN"11"=>EN<='0';C<='0';B<='1';A<='1'; WHENOTHERS=>NULL;ENDCASE;ENDPROCESS;ENDARCHITECTURERTL;數(shù)據(jù)合并模塊程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCOMBIS--MERGETHEDATASIGNAL&STATEMARKPORT( CLK:INSTD_LOGIC; DATAH:INSTD_LOGIC_VECTOR(1DOWNTO0); DATAL:INSTD_LOGIC_VECTOR(11DOWNTO0); DATACOMB:OUTSTD_LOGIC_VECTOR(15DOWNTO0); DATARAW:OUTSTD_LOGIC_VECTOR(11DOWNTO0) );ENDENTITYCOMB;ARCHITECTURERTLOFCOMBISSIGNALDATAREG:STD_LOGIC_VECTOR(15DOWNTO0);SIGNALDATAHREG:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALDATALREG:STD_LOGIC_VECTOR(11DOWNTO0);BEGINDATAHREG<=DATAH;DATALREG<=DATAL;DATARAW<=DATAL;--DIRECTLYPASSFOROBSERVATIONDATAREG<="00"&DATAHREG&DATALREG;DATACOMB<=DATAREG;ENDARCHITECTURERTL;數(shù)據(jù)分離模塊程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCONVIS--SEPARATETHESIGNALPORT( CLK:INSTD_LOGIC; DATAIN:INSTD_LOGIC_VECTOR(15DOWNTO0);--RAMOUTPUT SEL:OUTSTD_LOGIC_VECTOR(1DOWNTO0);--SIGNALMARK CH1:OUTSTD_LOGIC_VECTOR(11DOWNTO0); CH2:OUTSTD_LOGIC_VECTOR(11DOWNTO0); CH3:OUTSTD_LOGIC_VECTOR(11DOWNTO0); CH4:OUTSTD_LOGIC_VECTOR(11DOWNTO0) );ENDENTITYCONV;ARCHITECTURERTLOFCONVISSIGNALST:STD_LOGIC_VECTOR(1DOWNTO0);SIGNALCHREG:STD_LOGIC_VECTOR(11DOWNTO0);BEGINST<=DATAIN(13DOWNTO12);SEL<=ST;CHREG<=DATAIN(11DOWNTO0);PROCESS(CLK,ST)BEGINIFRISING_EDGE(CLK)THEN CASESTIS WHEN"00"=>CH4<=CHREG; WHEN"01"=>CH1<=CHREG; WHEN"10"=>CH2<=CHREG; WHEN"11"=>CH3<=CHREG; WHENOTHERS=>NULL;ENDCASE;ENDIF;ENDPROCESS;ENDARCHITECTURERTL;《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》附件:多路生理信號(hào)采集模塊設(shè)計(jì)系統(tǒng)頂層設(shè)計(jì)圖系統(tǒng)頂層設(shè)計(jì)圖《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》附件:多路生理信號(hào)采集模塊設(shè)計(jì)原理電路圖原理電路圖《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》附件:多路生理信號(hào)采集模塊設(shè)計(jì)RTL視圖RTL視圖鍵盤掃描模塊RTL時(shí)鐘分頻模塊RTL存儲(chǔ)地址控制模塊RTL數(shù)據(jù)合并模塊RTL數(shù)據(jù)分離模塊RTL《可編程邏輯設(shè)計(jì)課程設(shè)計(jì)》附件:異步串行接口電路及數(shù)據(jù)傳輸模塊設(shè)計(jì)程序清單

異步串行接口電路及數(shù)據(jù)傳輸模塊設(shè)計(jì)UART模塊LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYUARTISPORT(CLK:INSTD_LOGIC;--系統(tǒng)時(shí)鐘50MHZRST:INSTD_LOGIC;--系統(tǒng)復(fù)位RXD:INSTD_LOGIC;--串行數(shù)據(jù)接收端 ROMIN:INSTD_LOGIC_VECTOR(7DOWNTO0);--中間傳送的并行數(shù)據(jù)TXD:OUTSTD_LOGIC;--串行數(shù)據(jù)發(fā)送端EN:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--數(shù)碼管使能SEG_DATA:OUTSTD_LOGIC_VECTOR(7DOWNTO0);--數(shù)碼管7段碼 ROMADD:OUTSTD_LOGIC_VECTOR(7DOWNTO0);KEY_INPUT:INSTD_LOGIC);--按鍵輸入ENDUART;ARCHITECTUREARCHOFUARTIS--//////////////////INNERREG////////////////////SIGNALDIV_REG:STD_LOGIC_VECTOR(15DOWNTO0);--分頻計(jì)數(shù)器,分頻值由波特率決定。分頻后得到頻率為16倍波特率的時(shí)鐘SIGNALDIV16_TRAS_REG:STD_LOGIC_VECTOR(3DOWNTO0);--該寄存器的計(jì)數(shù)值對(duì)應(yīng)發(fā)送時(shí)當(dāng)前位于的時(shí)隙數(shù)SIGNALDIV16_REC_REG:STD_LOGIC_VECTOR(3DOWNTO0);--寄存器的計(jì)數(shù)值對(duì)應(yīng)接收時(shí)當(dāng)前位于的時(shí)隙數(shù)SIGNALSTATE_TRAS:STD_LOGIC_VECTOR(3DOWNTO0);--發(fā)送狀態(tài)寄存器SIGNALSTATE_REC:STD_LOGIC_VECTOR(3DOWNTO0);--接受狀態(tài)寄存器SIGNALCLKBAUD_TRAS:STD_LOGIC;--以波特率為頻率的發(fā)送使能信號(hào)SIGNALCLKBAUD_REC:STD_LOGIC;--以波特率為頻率的接受使能信號(hào)SIGNALCLKBAUD16X:STD_LOGIC;--以16倍波特率為頻率的時(shí)鐘,它的作用是將發(fā)送或接受一個(gè)BIT的時(shí)鐘周期分為16個(gè)時(shí)隙SIGNALRECSTART:STD_LOGIC;--開始發(fā)送標(biāo)志SIGNALRECSTART_TMP:STD_LOGIC;--開始接受標(biāo)志SIGNALTRASSTART:STD_LOGIC;--發(fā)送開始標(biāo)志(開始發(fā)送一幀)SIGNALRXD_REG1:STD_LOGIC;--接收寄存器1SIGNALTXD_REG:STD_LOGIC;--發(fā)送寄存器SIGNALRXD_BUF:STD_LOGIC_VECTOR(7DOWNTO0);--接收數(shù)據(jù)緩存SIGNALTXD_BUF:STD_LOGIC_VECTOR(7DOWNTO0);--發(fā)送數(shù)據(jù)緩存SIGNALSEND_STATE:STD_LOGIC;--發(fā)送狀態(tài)寄存器SIGNALCNT_DELAY:STD_LOGIC_VECTOR(19DOWNTO0);--延時(shí)去抖計(jì)數(shù)器SIGNALSTART_DELAYCNT:STD_LOGIC;--開始延時(shí)計(jì)數(shù)標(biāo)志SIGNALKEY_ENTRY1:STD_LOGIC;--確定有鍵按下標(biāo)志SIGNALKEY_ENTRY2:STD_LOGIC;--確定有鍵按下標(biāo)志SIGNALKEY_UP:STD_LOGIC;SIGNALADDREG:STD_LOGIC_VECTOR(7DOWNTO0);--ROM存儲(chǔ)地址SIGNALRXREG:STD_LOGIC_VECTOR(3DOWNTO0);CONSTANTDIV_PAR:STD_LOGIC_VECTOR(15DOWNTO0):="0000000010100011";--325--分頻參數(shù),其值由對(duì)應(yīng)的波特率計(jì)算而得,按此參數(shù)分頻的時(shí)鐘頻率是波特率的16倍,此處值對(duì)應(yīng)9600的波特率,即分頻出的時(shí)鐘頻率是9600*16 SIGNALTXD_XHDL3:STD_LOGIC;BEGINEN<="0001";--7段數(shù)碼管使能信號(hào)賦值TXD<=TXD_XHDL3;TXD_XHDL3<=TXD_REG; ROMADD<=ADDREG;PROCESS(CLK,RST)--延時(shí)去抖16MSBEGINIF(NOTRST='1')THENCNT_DELAY<="00000000000000000000";--延時(shí)去抖計(jì)數(shù)器START_DELAYCNT<='0';--開始延時(shí)計(jì)數(shù)標(biāo)志 KEY_UP<='1';ELSIF(CLK'EVENTANDCLK='1')THENIF(START_DELAYCNT='1')THENIF(CNT_DELAY/="11000011010100000000")THEN--800000CNT_DELAY<=CNT_DELAY+"00000000000000000001";ELSECNT_DELAY<="00000000000000000000";START_DELAYCNT<='0';ENDIF;ELSE--IF((NOTKEY_INPUT='1')AND(CNT_DELAY="00000000000000000000"))THEN--按鍵按下開始計(jì)時(shí)IF((KEY_UP='1')AND(NOTKEY_INPUT='1'))THEN KEY_UP<='0'; ELSIF((KEY_UP='0')AND(KEY_INPUT='1'))THEN START_DELAYCNT<='1'; KEY_UP<='1';ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(CLK,RST)--按鍵BEGINIF(NOTRST='1')THENKEY_ENTRY1<='0';ELSIF(CLK'EVENTANDCLK='1')THENIF(KEY_ENTRY2='1')THENKEY_ENTRY1<='0';ELSEIF(CNT_DELAY="11000011010100000000")THEN--IF(NOTKEY_INPUT='1')THEN--判斷按鍵確實(shí)按下 IF(KEY_INPUT='1')THEN--判斷按鍵確實(shí)彈起KEY_ENTRY1<='1';ENDIF;ENDIF;ENDIF;ENDIF;ENDPROCESS;PROCESS(CLK,RST)--計(jì)數(shù)值162則DIV_REG清零BEGINIF(NOTRST='1')THENDIV_REG<="0000000000000000";ELSIF(CLK'EVENTANDCLK='1')THENIF(DIV_REG=DIV_PAR-"0000000000000001")THENDIV_REG<="0000000000000000";ELSEDIV_REG<=DIV_REG+"0000000000000001";ENDIF;ENDIF;ENDPROCESS;PROCESS(CLK,RST)--分頻得到16倍波特率的時(shí)鐘=50M/(163*2)BEGINIF(NOTRST='1')THENCLKBAUD16X<='0';ELSIF(CLK'EVENTANDCLK='1')THENIF(DIV_REG=DIV_PAR-"0000000000000001")THENCLKBAUD16X<=NOTCLKBAUD16X;--DIV_REG計(jì)數(shù)值162則反轉(zhuǎn)ENDIF;ENDIF;ENDPROCESS;PROCESS(CLKBAUD16X,RST,RECSTART)--判斷接收條件,產(chǎn)生接收16位的頻率BEGINIF(NOTRST='1')THENDIV16_REC_REG<="0000";ELSEIF(CLKBAUD16X'EVENTANDCLKBAUD16X='1')THENIF(RECSTART='1')THEN--接收開始標(biāo)志DIV16_REC_REG<=DIV16_REC_REG+"0001";--接收開始后,時(shí)隙數(shù)在16倍波特率的時(shí)鐘下加1循環(huán)ENDIF; ENDIF;ENDIF;ENDPROCESS;PROCESS(CLKBAUD16X,RST)--判斷發(fā)送條件BEGINIF(NOTRST='1')THENDIV16_TRAS_REG<="0000";K,ELSEIF(CLKBAUD16X'EVENTANDCLKBAUD16X='1')THENIF(TRASSTART='1')THENDIV16_TRAS_REG<=DIV16_TRAS_REG+"0001";--發(fā)送開始后,時(shí)隙數(shù)在16倍波特率的時(shí)鐘下加1循環(huán)ENDIF; ENDIF;ENDIF;ENDPROCESS;PROCESS(DIV16_REC_REG)--接收使能BEGINIF(DIV16_REC_REG="1111")THENCLKBAUD_REC<='1';在第16個(gè)時(shí)隙,接收使能信號(hào)有效,將數(shù)據(jù)打入ELSECLKBAUD_REC<='0';ENDIF;ENDPROCESS;PROCESS(DIV16_TRAS_REG)--發(fā)送使能BEGINIF(DIV16_TRAS_REG="1111")THENCLKBAUD_TRAS<='1';--在第16個(gè)時(shí)隙,發(fā)送使能信號(hào)有效,將數(shù)據(jù)發(fā)出ELSECLKBAUD_TRAS<='0';ENDIF;ENDPROCESS;PROCESS(CLKBAUD16X,RST)--發(fā)送BEGINIF(NOTRST='1')THENTXD_REG<='1';--發(fā)送寄存器TRASSTART<='0';--開始發(fā)送標(biāo)志TXD_BUF<="00000000";--發(fā)送數(shù)據(jù)緩存STATE_TRAS<="0000";--發(fā)送狀態(tài)寄存器SEND_STATE<='1';--發(fā)送狀態(tài)寄存器KEY_ENTRY2<='0';--確定有鍵按下標(biāo)志 ADDREG<="00000000"; ELSEIF(CLKBAUD16X'EVENTANDCLKBAUD16X='1')THENIF(NOTKEY_ENTRY2='1')THEN--KEY_ENTRY2=1開始發(fā)送IF(KEY_ENTRY1='1')THENKEY_ENTRY2<='1';--TXD_BUF<="00110010";--"2" TXD_BUF<=ROMIN;ADDREG<=ADDREG+1;ENDIF;ELSECASESTATE_TRASISWHEN"0000"=>--發(fā)送啟動(dòng)位IF((NOTTRASSTART='1')AND(SEND_STATE='1'))THENTRASSTART<='1';--開始發(fā)送狀態(tài)ELSEIF(SEND_STATE='1')THENIF(CLKBAUD_TRAS='1')THEN--以波特率為頻率的發(fā)送使能信號(hào)TXD_REG<='0';--起始位STATE_TRAS<=STATE_TRAS+"0001";ENDIF;ELSEKEY_ENTRY2<='0';STATE_TRAS<="0000"; SEND_STATE<='1'; ENDIF;ENDIF;WHEN"0001"=>--發(fā)送第1位IF(CLKBAUD_TRAS='1')THENTXD_REG<=TXD_BUF(0);TXD_BUF(6DOWNTO0)<=TXD_BUF(7DOWNTO1);STATE_TRAS<=STATE_TRAS+"0001";ENDIF;WHEN"0010"=>--發(fā)送第2位IF(CLKBAUD_TRAS='1')THENTXD_REG<=TXD_BUF(0);TXD_BUF(6DOWNTO0)<=TXD_BUF(7DOWNTO1);STATE_TRAS<=STATE_TRAS+"0001";ENDIF;WHEN"0011"=>--發(fā)送第3位IF(CLKBAUD_TRAS='1')THENTXD_REG<=TXD_BUF(0);TXD_BUF(6DOWNTO0)<=TXD_BUF(7DOWNTO1);STATE_TRAS<=STATE_TRAS+"0001";ENDIF;WHEN"0100"=>--發(fā)送第4位IF(CLKBAUD_TRAS='1')THENTXD_REG<=TXD_BUF(0);TXD_BUF(6DOWNTO0)<=TXD_BUF(7DOWNTO1);STATE_TRAS<=STATE_TRAS+"0001";

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論