EDA基于Verilog串口通信設(shè)計(jì)_第1頁(yè)
EDA基于Verilog串口通信設(shè)計(jì)_第2頁(yè)
EDA基于Verilog串口通信設(shè)計(jì)_第3頁(yè)
EDA基于Verilog串口通信設(shè)計(jì)_第4頁(yè)
EDA基于Verilog串口通信設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、石家莊經(jīng)濟(jì)學(xué)院信息工程學(xué)院電子信息工程專業(yè)EDA技術(shù)課程設(shè)計(jì)報(bào)告題目: 串口通信設(shè)計(jì) 姓 名 學(xué) 號(hào) 班 級(jí) 指導(dǎo)教師 2014年 1 月 09 日課程設(shè)計(jì)任務(wù)書班級(jí) 姓名 學(xué)號(hào) 課程設(shè)計(jì)題目 串口通信設(shè)計(jì) 課程設(shè)計(jì)起止日期 2013年12月23日 至 2014年1月10日 實(shí)習(xí)地點(diǎn) 實(shí)驗(yàn)樓5308 課程設(shè)計(jì)內(nèi)容與要求:串口通信設(shè)計(jì):(計(jì)算機(jī)安裝串口調(diào)試助手)及格:上電后能通過串口向計(jì)算機(jī)發(fā)送數(shù)據(jù)(ABCD),能夠?qū)⒂?jì)算機(jī)發(fā)送的固定長(zhǎng)度的字符(5位),原樣返回發(fā)送給計(jì)算機(jī)。中:可接收任意字符長(zhǎng)度(小于20個(gè)字符),并原樣輸出;良:在中的基礎(chǔ)上,串口接收到數(shù)據(jù)后能在液晶1602上顯示出來,并顯示

2、接收的字符個(gè)數(shù)。如果字符長(zhǎng)度大于液晶顯示的長(zhǎng)度,則通過按鍵能夠翻頁(yè)顯示。優(yōu):在良的基礎(chǔ)上,用鍵盤可以輸入字符(輸入數(shù)字)并在液晶上顯示,輸完后按發(fā)送鍵可以從串口發(fā)出給計(jì)算機(jī)。 指導(dǎo)教師 2013年 12月23日課程設(shè)計(jì)報(bào)告一、設(shè)計(jì)原理與技術(shù)方法:1.設(shè)計(jì)方案該課程設(shè)計(jì)任務(wù)實(shí)現(xiàn)了從及格到中的要求,而良和優(yōu)的要求還沒有完全實(shí)現(xiàn)。該串口通信設(shè)計(jì)最重要實(shí)現(xiàn)的設(shè)計(jì)共需要6個(gè)模塊分別是:頂層模塊、LCD1602顯示模塊、4*4矩陣鍵盤模塊、串口發(fā)送模塊、串口接收模塊、計(jì)算機(jī)調(diào)試助手發(fā)送接受顯示模塊。但是由于自己思路設(shè)計(jì)的問題只完成了串口通信設(shè)計(jì)中的要求:可接收任意字符長(zhǎng)度(小于20個(gè)字符),并原樣輸出。而

3、后面的設(shè)計(jì)只完成了部分模塊的設(shè)計(jì)。串口通信設(shè)計(jì)中的設(shè)計(jì)任務(wù)完成了串口的任意字符發(fā)送和接收的功能,該部分分為四個(gè)小模塊:頂層模塊、波特率產(chǎn)生模塊、接收模塊、發(fā)送模塊。1) 頂層模塊該模塊主要是為了將各個(gè)底層模塊連接在一起完成整個(gè)的發(fā)送和接受過程,只是做模塊的聲明和端口聲明,不做任何的邏輯處理。由波特率產(chǎn)生模塊、UART接收模塊和UART發(fā)送模塊構(gòu)成。UART發(fā)送模塊的用途是將準(zhǔn)備輸出的并行數(shù)據(jù)按照基本UART幀格式加上起始位和停止位轉(zhuǎn)換為發(fā)送信號(hào)串行輸出。UART接收模塊的用途是根據(jù)起始位和停止位將接收到的輸入串行信號(hào)將其轉(zhuǎn)化為并行數(shù)據(jù)。波特率發(fā)生模塊的用途是專門產(chǎn)生一個(gè)等于波特率的本地時(shí)鐘信號(hào)

4、對(duì)輸入數(shù)據(jù)不斷進(jìn)行采樣,并使接收模塊和發(fā)送模塊保持同步。2)波特率產(chǎn)生模塊該模塊主要是為了產(chǎn)生所需要的特定的數(shù)據(jù)采樣時(shí)鐘和數(shù)據(jù)傳輸時(shí)鐘,因此該模塊實(shí)際上是一個(gè)分頻器。由于串口通信必須要設(shè)定波特率,所以當(dāng)串口的波特率為9600Hz時(shí),而系統(tǒng)的主頻是50MHz的。所以這時(shí)就需要對(duì)主頻時(shí)鐘進(jìn)行分頻得到所需要的數(shù)據(jù)采樣時(shí)鐘和傳輸時(shí)鐘均為9600Hz。在所設(shè)計(jì)的異步串行通信中數(shù)據(jù)的傳送方式為雙全工制,即數(shù)據(jù)的發(fā)送和接收分開,分別由兩根不同的傳輸線傳送時(shí)通信雙方都能在同一時(shí)刻進(jìn)行發(fā)送和接收操作,所以根據(jù)使用的異步串行總線RS232的異步通信協(xié)議可知該數(shù)據(jù)的傳輸以幀的形式進(jìn)行傳輸,所以這就需要用某種方式使接

5、收與發(fā)送數(shù)據(jù)同步。3) 接收模塊該模塊主要是為了接收由計(jì)算機(jī)的串口調(diào)試助手發(fā)過來的串行數(shù)據(jù)并保存,當(dāng)接收到接收信號(hào)置位時(shí),對(duì)接收到的數(shù)據(jù)進(jìn)行采集并存儲(chǔ)。根據(jù)起始位和停止位的設(shè)置提取傳輸過來的8位ASCALL碼數(shù)據(jù)并保存在寄存器中。該設(shè)計(jì)為1位起始位,8位數(shù)據(jù)位,無奇偶校驗(yàn)位,1位停止位。4)發(fā)送模塊該模塊主要是為了實(shí)現(xiàn)當(dāng)檢測(cè)到到由接收模塊傳輸過來的并行數(shù)據(jù)時(shí),對(duì)并行數(shù)據(jù)的緩存、并串轉(zhuǎn)換,并把串行數(shù)據(jù)按照既定的數(shù)據(jù)幀格式進(jìn)行輸出,通過串口傳送給計(jì)算機(jī)的串口調(diào)試助手的接收區(qū)。2. 方案設(shè)計(jì)流程圖如圖1所示:圖1 總體方案設(shè)計(jì)流程圖3.實(shí)驗(yàn)程序和原理圖一串口傳輸任意字符模塊1)頂層模塊的實(shí)驗(yàn)程序:m

6、odule uart_top(clk,rst_n,rs232_rx,rs232_tx); /頂層模塊input clk; /系統(tǒng)時(shí)鐘輸入信號(hào)50MHzinput rst_n; /復(fù)位信號(hào),低有效input rs232_rx; /串行數(shù)據(jù)輸入信號(hào)output rs232_tx; / 串行數(shù)據(jù)輸出信號(hào)wire bps_start1,bps_start2; /接收到數(shù)據(jù)后,波特率時(shí)鐘啟動(dòng)信號(hào)置位wire clk_bps1,clk_bps2; / 高電平時(shí)為接收或者發(fā)送數(shù)據(jù)位的中間采樣點(diǎn)wire 7:0rx_data; /接收數(shù)據(jù)寄存器,保存接收到的數(shù)據(jù)直至下一個(gè)數(shù)據(jù)來到wire rx_int; /接

7、收數(shù)據(jù)中斷信號(hào),接收數(shù)據(jù)期間始終為高電平speed_select speed_rx(.clk(clk),.rst_n(rst_n),.bps_start(bps_start1),.clk_bps(clk_bps1); /數(shù)據(jù)接收波特率選擇模塊uart_rx uart_rx(.clk(clk),.rst_n(rst_n),.bps_start(bps_start1),.clk_bps(clk_bps1),.rs232_rx(rs232_rx),.rx_data(rx_data),.rx_int(rx_int); /接收數(shù)據(jù)模塊speed_select speed_tx(.clk(clk),.rs

8、t_n(rst_n),.bps_start(bps_start2),.clk_bps(clk_bps2); /數(shù)據(jù)發(fā)送波特率選擇模塊uart_tx uart_tx(.clk(clk),.rst_n(rst_n),.bps_start(bps_start2),.clk_bps(clk_bps2),.rs232_tx(rs232_tx),.rx_data(rx_data),.rx_int(rx_int); /發(fā)送數(shù)據(jù)模塊endmodule2)頂層模塊時(shí)序仿真波形圖如圖2所示:圖2 串口數(shù)據(jù)傳輸頂層模塊的時(shí)序仿真波形圖3)頂層模塊的RTL圖如圖3所示:圖3 串口數(shù)據(jù)傳輸頂層模塊的RTL圖4)設(shè)計(jì)分析

9、: 該頂層模塊主要是對(duì)底層模塊的連接和端口的定義,通過定義幾個(gè)網(wǎng)線型的連接線將底層元件連接起來進(jìn)行數(shù)據(jù)傳輸,用元件利化法將底層模塊組合起來實(shí)現(xiàn)串口對(duì)任意字符的發(fā)送和接收功能。由時(shí)序仿真波形圖可以看出當(dāng)輸入端rs232_rx輸入什么數(shù)據(jù)之后接收端rs232_tx接收到什么數(shù)據(jù),實(shí)驗(yàn)設(shè)計(jì)完成了串口通信設(shè)計(jì)的數(shù)據(jù)傳輸功能,實(shí)驗(yàn)設(shè)計(jì)成功。5)波特率產(chǎn)生模塊實(shí)驗(yàn)程序:module speed_select(clk,rst_n,bps_start,clk_bps); /波特率產(chǎn)生模塊input clk; /系統(tǒng)時(shí)鐘輸入信號(hào)50MHzinput rst_n; /復(fù)位信號(hào),低有效input bps_start

10、; /波特率時(shí)鐘啟動(dòng)信號(hào),高有效output clk_bps; /接收或者發(fā)送數(shù)據(jù)位的中間采樣點(diǎn)時(shí)鐘,高電平采樣reg 12:0cnt; /分頻計(jì)數(shù)寄存器reg clk_bps_r; /波特率采樣時(shí)鐘寄存器always (posedge clk or negedge rst_n) /計(jì)數(shù)分頻過程塊beginif(!rst_n) /復(fù)位信號(hào),低有效cnt<=13'd0;else if(cnt=5207)|!bps_start) /判斷計(jì)數(shù)是否到達(dá)一個(gè)脈寬或波特率啟動(dòng)時(shí)鐘為低電平時(shí)將分頻計(jì)數(shù)置數(shù)為0cnt<=13'd0;elsecnt<=cnt+1'b1;

11、 /否則波特率時(shí)鐘計(jì)數(shù)啟動(dòng)endalways (posedge clk or negedge rst_n) /波特率采樣時(shí)鐘過程塊beginif(!rst_n) /復(fù)位信號(hào),低有效clk_bps_r<=1'b0;else if(cnt=2603) /當(dāng)波特率時(shí)鐘計(jì)數(shù)到一半時(shí),進(jìn)行采樣存儲(chǔ)clk_bps_r<=1'b1; /將波特率采樣時(shí)鐘寄存器置1else /否則波特率采樣時(shí)鐘寄存器置0,不進(jìn)行采樣clk_bps_r<=1'b0;endassign clk_bps=clk_bps_r; /將波特率采樣時(shí)鐘輸出endmodule6)波特率產(chǎn)生模塊時(shí)序仿真

12、波形圖如圖4所示:圖4 串口波特率產(chǎn)生模塊時(shí)序仿真波形圖7)設(shè)計(jì)分析: 該波特率產(chǎn)生模塊通過對(duì)主頻時(shí)鐘進(jìn)行分頻產(chǎn)生與波特率相同頻率的采樣時(shí)鐘和數(shù)據(jù)傳輸時(shí)鐘,完成異步串行通信中對(duì)數(shù)據(jù)的發(fā)送和接收。當(dāng)波特率時(shí)鐘計(jì)數(shù)到一半時(shí),通過對(duì)波特率采樣時(shí)鐘信號(hào)clk_bps_r置1進(jìn)行數(shù)據(jù)的采樣,并以9600Hz的時(shí)鐘周期信號(hào)進(jìn)行數(shù)據(jù)的傳輸,從而與計(jì)算機(jī)的串口調(diào)試助手的波特率匹配。由波特率產(chǎn)生模塊的時(shí)速仿真波形圖可以看出輸入的主頻時(shí)鐘為50MHz,輸出的cik_bps周期為9600Hz,輸出的每個(gè)周期都有一個(gè)高脈沖的采樣信號(hào),對(duì)接受和發(fā)送的數(shù)據(jù)進(jìn)行采樣。產(chǎn)生了滿足實(shí)驗(yàn)設(shè)計(jì)要求的波特率時(shí)鐘。 8)數(shù)據(jù)接收模塊實(shí)

13、驗(yàn)程序:module uart_rx(clk,rst_n,bps_start,clk_bps,rs232_rx,rx_data,rx_int); /數(shù)據(jù)接收模塊input clk; /系統(tǒng)時(shí)鐘輸入信號(hào)50MHzinput rst_n; /復(fù)位信號(hào),低有效input rs232_rx; /串行數(shù)據(jù)輸入信號(hào)input clk_bps; /波特率采樣時(shí)鐘信號(hào),高有效output bps_start; /波特率時(shí)鐘啟動(dòng)信號(hào),高有效output 7:0rx_data; /串并轉(zhuǎn)換后的8位輸出寄存器output rx_int; /接收數(shù)據(jù)中斷信號(hào),接收過程中為高reg rs232_rx0,rs232_rx

14、1,rs232_rx2,rs232_rx3; /接收數(shù)據(jù)寄存器wire neg_rs232_rx; /表示數(shù)據(jù)線接收到下沿,開始啟動(dòng)接收數(shù)據(jù)always (posedge clk or negedge rst_n) /脈沖檢測(cè)法確定起始信號(hào)確實(shí)到來而不是毛刺引起的beginif(!rst_n) /復(fù)位信號(hào),低有效beginrs232_rx0<=1'b0;rs232_rx1<=1'b0;rs232_rx2<=1'b0;rs232_rx3<=1'b0;endelse /否則連續(xù)接收4個(gè)輸入信號(hào)一旦出現(xiàn)4個(gè)寄存器都為0,那么可以認(rèn)定起始位到來,

15、開始準(zhǔn)備接收數(shù)據(jù)beginrs232_rx0<=rs232_rx;rs232_rx1<=rs232_rx0;rs232_rx2<=rs232_rx1;rs232_rx3<=rs232_rx2;endendassign neg_rs232_rx=rs232_rx3&rs232_rx2&rs232_rx1&rs232_rx0; /用啟動(dòng)接收數(shù)據(jù)信號(hào)neg_rs232_rx表示數(shù)據(jù)線接收到下沿可以開始接收數(shù)據(jù)reg bps_start_r; /波特率時(shí)鐘啟動(dòng)信號(hào)中間寄存器,高有效reg 3:0num; /移位次數(shù)寄存器reg rx_int; /接收中斷

16、信號(hào),接收到數(shù)據(jù)期間始終為高電平always (posedge clk or negedge rst_n)beginif(!rst_n) /復(fù)位信號(hào),低有效begin bps_start_r<=1'bz; rx_int<=1'b0; endelse if(neg_rs232_rx) /啟動(dòng)串口準(zhǔn)備接收數(shù)據(jù),啟動(dòng)接收數(shù)據(jù)信號(hào)置1,接收數(shù)據(jù)中斷使能信號(hào)置1begin bps_start_r<=1'b1; rx_int<=1'b1; endelse if(num=4'd10) /數(shù)據(jù)接收完畢,啟動(dòng)接收數(shù)據(jù)信號(hào)置0,接收數(shù)據(jù)中斷使能信號(hào)置

17、0begin bps_start_r<=1'b0; rx_int<=1'b0; endendassign bps_start=bps_start_r; /輸出波特率時(shí)鐘啟動(dòng)信號(hào)reg 7:0rx_data_r; /接收到數(shù)據(jù)的中間寄存器,保存直至下一個(gè)數(shù)據(jù)來到reg 7:0rx_temp_data; /接收當(dāng)前數(shù)據(jù)寄存器always (posedge clk or negedge rst_n)beginif(!rst_n) /復(fù)位信號(hào),低有效begin rx_temp_data<=8'd0; num<=4'd0; rx_data_r<

18、;=8'd0; endelse if(rx_int) /接收數(shù)據(jù)處理beginif(clk_bps) /當(dāng)采樣時(shí)鐘信號(hào)為高電平時(shí)進(jìn)行數(shù)據(jù)的接收并保存,接收數(shù)據(jù)為一個(gè)起始位,8bit數(shù)據(jù),一個(gè)結(jié)束位beginnum<=num+1'b1;case(num)4'd1:rx_temp_data0<=rs232_rx; /接收bit04'd2:rx_temp_data1<=rs232_rx; /接收bit14'd3:rx_temp_data2<=rs232_rx; /接收bit24'd4:rx_temp_data3<=rs23

19、2_rx; /接收bit34'd5:rx_temp_data4<=rs232_rx; /接收bit44'd6:rx_temp_data5<=rs232_rx; /接收bit54'd7:rx_temp_data6<=rs232_rx; /接收bit64'd8:rx_temp_data7<=rs232_rx; /接收bit7default:;endcaseend else if(num=4'd10) /數(shù)據(jù)接收完畢,復(fù)位并將當(dāng)前寄存器的值輸出給數(shù)據(jù)接收中間寄存器begin num<=4'd0; rx_data_r<

20、=rx_temp_data; endendendassign rx_data=rx_data_r; /將接收到的數(shù)據(jù)輸出endmodule9)設(shè)計(jì)分析: 該數(shù)據(jù)接收模塊通過用脈沖檢測(cè)法進(jìn)行確定是否傳輸數(shù)據(jù)確實(shí)到來,一旦檢測(cè)到由計(jì)算機(jī)調(diào)試助手發(fā)送過來的一幀數(shù)據(jù)的起始位,就開始進(jìn)行數(shù)據(jù)的接收并存儲(chǔ)在接收數(shù)據(jù)寄存器中,用于傳輸給發(fā)送模塊。當(dāng)開始接收數(shù)據(jù)時(shí)接收數(shù)據(jù)中斷信號(hào)rx_int置為1,確保接收數(shù)據(jù)過程中不被打擾,當(dāng)數(shù)據(jù)接收完畢后接收數(shù)據(jù)中斷信號(hào)rx_int被復(fù)位為0,并再次開始檢測(cè)下一個(gè)數(shù)據(jù)是否到來進(jìn)而準(zhǔn)備數(shù)據(jù)的接收和存儲(chǔ)然后傳輸給數(shù)據(jù)輸出端輸出給發(fā)送模塊。10)數(shù)據(jù)發(fā)送模塊實(shí)驗(yàn)程序:modul

21、e uart_tx(clk,rst_n,bps_start,clk_bps,rs232_tx,rx_data,rx_int); /數(shù)據(jù)接收模塊input clk; /系統(tǒng)時(shí)鐘輸入信號(hào)50MHzinput rst_n; /復(fù)位信號(hào),低有效input clk_bps; /波特率采樣時(shí)鐘信號(hào),高有效input 7:0rx_data; /輸入的8位并行數(shù)據(jù)input rx_int; /接收數(shù)據(jù)中斷信號(hào),接收過程中為高output rs232_tx; /并串轉(zhuǎn)換后傳輸?shù)囊晃粩?shù)據(jù)output bps_start; /波特率時(shí)鐘啟動(dòng)信號(hào),高有效reg rx_int0,rx_int1,rx_int2; /接收

22、數(shù)據(jù)寄存器,捕捉下降沿wire neg_rx_int; /表示數(shù)據(jù)線接收到下沿,開始啟動(dòng)接收數(shù)據(jù)always (posedge clk or negedge rst_n) /脈沖檢測(cè)法確定起始信號(hào)確實(shí)到來而不是毛刺引起的beginif(!rst_n) /復(fù)位信號(hào),低有效beginrx_int0<=1'b0;rx_int1<=1'b0;rx_int2<=1'b0;endelse /否則連續(xù)接收3個(gè)輸入信號(hào)一旦出現(xiàn)3個(gè)寄存器都為0,那么可以認(rèn)定起始位到來,開始準(zhǔn)備接收數(shù)據(jù)beginrx_int0<=rx_int;rx_int1<=rx_int0

23、;rx_int2<=rx_int1;endendassign neg_rx_int=rx_int1&rx_int2; /捕捉到下降沿后,neg_rx_int拉低保持一個(gè)主頻時(shí)鐘周期reg 7:0tx_data; /待發(fā)送數(shù)據(jù)的寄存器reg bps_start_r; /波特率時(shí)鐘啟動(dòng)信號(hào)中間寄存器,高有效reg tx_en; /發(fā)送數(shù)據(jù)使能信號(hào),高有效reg 3:0num; /移位次數(shù)寄存器always (posedge clk or negedge rst_n)beginif(!rst_n) /復(fù)位信號(hào),低有效begin bps_start_r<=1'bz; tx_

24、en<=1'b0; tx_data<=8'd0; endelse if(neg_rx_int) /接收數(shù)據(jù)完畢,準(zhǔn)備把接收到的數(shù)據(jù)發(fā)回去begin bps_start_r<=1'b1; tx_data<=rx_data; tx_en<=1'b1; endelse if(num=4'd10) /數(shù)據(jù)發(fā)送完成,復(fù)位begin bps_start_r<=1'b0; tx_en<=1'b0; endendassign bps_start=bps_start_r; /輸出波特率時(shí)鐘啟動(dòng)信號(hào)reg rs232

25、_tx_r; / RS232發(fā)送數(shù)據(jù)信號(hào)中間寄存器always (posedge clk or negedge rst_n)beginif(!rst_n) /復(fù)位信號(hào),低有效begin num<=4'd0; rs232_tx_r<=1'b1; endelse if(tx_en) /發(fā)送數(shù)據(jù)使能信號(hào)有效,開始發(fā)送數(shù)據(jù)beginif(clk_bps) /當(dāng)采樣時(shí)鐘信號(hào)為高電平時(shí)進(jìn)行數(shù)據(jù)的發(fā)送和傳輸,發(fā)送數(shù)據(jù)為一個(gè)起始位,8bit數(shù)據(jù),一個(gè)結(jié)束位beginnum<=num+1'b1;case(num)4'd1:rs232_tx_r<=1'

26、;b0; /發(fā)送1位起始位4'd2:rs232_tx_r<=tx_data0; /發(fā)送bit04'd3:rs232_tx_r<=tx_data1; /發(fā)送bit14'd4:rs232_tx_r<=tx_data2; /發(fā)送bit24'd5:rs232_tx_r<=tx_data3; /發(fā)送bit34'd6:rs232_tx_r<=tx_data4; /發(fā)送bit44'd7:rs232_tx_r<=tx_data5; /發(fā)送bit54'd8:rs232_tx_r<=tx_data6; /發(fā)送bit6

27、4'd9:rs232_tx_r<=tx_data7; /發(fā)送bit74'd10:rs232_tx_r<=1'b1; /發(fā)送1位結(jié)束位default:rs232_tx_r<=1'b1;endcaseend else if(num=4'd10) /數(shù)據(jù)發(fā)送完畢,復(fù)位num<=4'd0;endendassign rs232_tx=rs232_tx_r; /將要發(fā)送數(shù)據(jù)輸出endmodule11)設(shè)計(jì)分析:該數(shù)據(jù)發(fā)送模塊通過對(duì)輸入信號(hào)的接收并將接收到的數(shù)據(jù)進(jìn)行并串轉(zhuǎn)換后加上一位起始位和一位停止位后通過串口發(fā)送給計(jì)算機(jī)調(diào)試助手,計(jì)算

28、機(jī)調(diào)試助手接收到數(shù)據(jù)后根據(jù)ASCALL碼轉(zhuǎn)換成相應(yīng)的數(shù)據(jù)顯示在接收區(qū)。當(dāng)檢測(cè)到接收中斷信號(hào)rx_int被拉低并保持一個(gè)主頻時(shí)鐘周期時(shí)開始接收傳輸過來的8位并行數(shù)據(jù)并保存在待發(fā)送數(shù)據(jù)的寄存器中,此時(shí)發(fā)送數(shù)據(jù)使能信號(hào)有效,開始發(fā)送數(shù)據(jù),將一幀數(shù)據(jù)通過串口發(fā)送出去,當(dāng)數(shù)據(jù)發(fā)送完畢后發(fā)送數(shù)據(jù)使能信號(hào)無效,停止數(shù)據(jù)的發(fā)送并繼續(xù)檢測(cè)是否有數(shù)據(jù)傳輸過來,是否需要進(jìn)行數(shù)據(jù)的并串轉(zhuǎn)換然后將數(shù)據(jù)傳輸出去,完成串口和計(jì)算機(jī)的串口調(diào)試助手之間的任意字符的發(fā)送和接收過程。二串口接收特定字符模塊該設(shè)計(jì)模塊主要是為了理解串口通信的協(xié)議以及傳輸原理,進(jìn)而為發(fā)送和接收程序的調(diào)試做準(zhǔn)備,通過設(shè)計(jì)可以實(shí)現(xiàn)上電后計(jì)算機(jī)的串口調(diào)試助手

29、可以接收到ABCD字符。1)上電后接收ABCD字符模塊實(shí)驗(yàn)程序:module uart_tx(clk,rs232_tx); /發(fā)送ABCD字符模塊input clk; /系統(tǒng)時(shí)鐘輸入信號(hào)50MHzoutput rs232_tx; /并串轉(zhuǎn)換后傳輸?shù)囊晃粩?shù)據(jù)reg 12:0cnt; /分頻計(jì)數(shù)寄存器reg clk_bps_r; /波特率采樣時(shí)鐘寄存器always (posedge clk) /計(jì)數(shù)分頻過程塊beginif(cnt=2603) cnt<=13'd0; /判斷是否到達(dá)計(jì)數(shù)的最大值,若到達(dá)則清零else cnt<=cnt+1'b1; /否則繼續(xù)加一endal

30、ways (posedge clk) /波特率采樣時(shí)鐘過程塊beginif(cnt=2603)clk_bps<=clk_bps; /產(chǎn)生波特率時(shí)鐘endreg rs232_tx_r; /定義串口輸出數(shù)據(jù)為寄存器型變量reg 7:0tx_data; /輸出的8位數(shù)據(jù)寄存器reg 7:0tx_data_r; /輸出的8位數(shù)據(jù)中間寄存器reg 3:0num; /移位次數(shù)寄存器reg clk_st; /數(shù)據(jù)并串轉(zhuǎn)換控制變量parameter s0=1,s1=2,s2=3,s3=4; /定義四個(gè)常量reg 2:0c_st,next_st; /定義現(xiàn)態(tài)和次態(tài)變量always (posedge clk

31、_st) /狀態(tài)轉(zhuǎn)換過程塊begin c_st<=next_st; end /將下一狀態(tài)傳給現(xiàn)態(tài)always (c_st) /狀態(tài)輸出過程塊begincase(c_st)s0:begin next_st<=s1;tx_data_r<=8'b01000001; end /“A”s1:begin next_st<=s2;tx_data_r<=8'b01000010; end /“B”s2:begin next_st<=s3;tx_data_r<=8'b01000011; end /“C”s3:begin next_st<=s0

32、;tx_data_r<=8'b01000100; end /“D”default:begin next_st<=s1;tx_data_r<=8'b01000001; end /“A”endcaseendalways (posedge clk_bps) /狀態(tài)轉(zhuǎn)換控制過程塊begin /tx_data=tx_data_r; /將中間寄存器的數(shù)據(jù)輸出if(num<4'd15) /并串轉(zhuǎn)換數(shù)據(jù)輸出過程beginnum<=num+1'b1; clk_st<=1'b0;case(num)4'd0:rs232_tx_r&l

33、t;=1'b0;4'd1:rs232_tx_r<=tx_data0;4'd2:rs232_tx_r<=tx_data1;4'd3:rs232_tx_r<=tx_data2;4'd4:rs232_tx_r<=tx_data3;4'd5:rs232_tx_r<=tx_data4;4'd6:rs232_tx_r<=tx_data5;4'd7:rs232_tx_r<=tx_data6;4'd8:rs232_tx_r<=tx_data7;4'd9:rs232_tx_r<=

34、1'b1;default:rs232_tx_r<=1'b1;endcaseend else if(num=4'd15) /并串轉(zhuǎn)換完畢后,復(fù)位begin num<=4'd0; clk_st<=1'b1; endendassign rs232_tx=rs232_tx_r; /輸出串行數(shù)據(jù)endmodule2)設(shè)計(jì)分析:該設(shè)計(jì)實(shí)現(xiàn)了上電后打開計(jì)算機(jī)的串口調(diào)試助手并設(shè)置相應(yīng)的波特率為9600Hz,數(shù)據(jù)位為8位,無校驗(yàn)位,1位停止位,然后在接收區(qū)就可以接收到由開發(fā)板編程發(fā)送的特定字符ABCD,實(shí)現(xiàn)了通過串口接收數(shù)據(jù)的功能。三.LCD1602液晶

35、顯示模塊由于對(duì)LCD1602的理解不夠,還不能完成對(duì)實(shí)驗(yàn)要求的設(shè)計(jì),只是能讓LCD1602顯示特定的字符,并不能實(shí)現(xiàn)將輸入的數(shù)據(jù)進(jìn)行顯示。1)LCD1602顯示模塊實(shí)驗(yàn)程序:module KCSJ_LCD11602(clk, rs, rw, en,dat); /LCD1602顯示模塊input clk; /系統(tǒng)時(shí)鐘輸入信號(hào)50MHzoutput 7:0 dat; /8位雙向數(shù)據(jù)線傳輸指令和數(shù)據(jù)output rs; / rs為寄存器選擇信號(hào),高電平選擇數(shù)據(jù)寄存器,低電平選擇指令寄存器 output rw; /rw為讀寫選擇信號(hào),高電平進(jìn)行讀操作,低電平進(jìn)行寫操作 output en; /en為使

36、能信號(hào)下降沿有效,液晶模塊執(zhí)行命令reg e; /液晶的E腳信號(hào)reg 7:0 dat; /定義8位數(shù)據(jù)線的輸出為寄存器型變量reg rs; /定義寄存器選擇信號(hào)rs為寄存器型變量reg 12:0 counter; /時(shí)鐘分頻計(jì)數(shù)寄存器reg 4:0 current,next; /定義當(dāng)前狀態(tài)和下一狀態(tài)變量reg clkr; /分頻后的時(shí)鐘信號(hào)reg 1:0 cnt; /計(jì)數(shù)寄存器 /定義LCD1602狀態(tài)機(jī)需要的狀態(tài)parameter set0=4'h0;parameter set1=4'h1;parameter set2=4'h2;parameter set3=4&

37、#39;h3;parameter dat0=4'h4;parameter dat1=4'h5;parameter dat2=4'h6;parameter dat3=4'h7;parameter dat4=4'h8;parameter dat5=4'h9;parameter dat6=4'hA;parameter dat7=4'hB;parameter dat8=4'hC;parameter dat9=4'hD;parameter dat10=4'hE;parameter dat11=5'h10;pa

38、rameter nul=4'hF;always (posedge clk) /時(shí)鐘分頻過程塊begincounter=counter+1; /啟動(dòng)計(jì)數(shù)if(counter=13'd5000) /產(chǎn)生5khz的時(shí)鐘信號(hào)clkr=clkr; /產(chǎn)生分頻后的時(shí)鐘end always (posedge clkr) /狀態(tài)機(jī)轉(zhuǎn)換過程塊begincurrent=next; /將下一狀態(tài)傳給當(dāng)前狀態(tài)寄存器case(current) /初始化設(shè)置set0: begin rs<=0; dat<=8'h30; next<=set1; end /顯示模式設(shè)置,設(shè)置8位1行5

39、*7點(diǎn)陣set1: begin rs<=0; dat<=8'h0c; next<=set2; end /顯示狀態(tài)開關(guān)設(shè)置,顯示器開,光標(biāo)不顯示,光標(biāo)不允許閃爍set2: begin rs<=0; dat<=8'h6; next<=set3; end /顯示光標(biāo)移動(dòng)設(shè)置,地址加一,寫入數(shù)據(jù)的時(shí)候光標(biāo)右移set3: begin rs<=0; dat<=8'h1; next<=dat0; end /顯示清屏設(shè)置 /顯示設(shè)置dat0: begin rs<=1; dat<="H" next<

40、;=dat1; end /顯示Hdat1: begin rs<=1; dat<="E" next<=dat2; end /顯示Edat2: begin rs<=1; dat<="L" next<=dat3; end /顯示Ldat3: begin rs<=1; dat<="L" next<=dat4; end /顯示Ldat4: begin rs<=1; dat<="O" next<=dat5; end /顯示Odat5: begin rs&l

41、t;=1; dat<=" " next<=dat6; end /顯示空格dat6: begin rs<=1; dat<="W" next<=dat7; end /顯示W(wǎng)dat7: begin rs<=1; dat<="O" next<=dat8; end /顯示Odat8: begin rs<=1; dat<="R" next<=dat9; end /顯示Rdat9: begin rs<=1; dat<="L" nex

42、t<=dat10; end /顯示Ldat10: begin rs<=1; dat<="D" next<=dat11; end /顯示Ddat11: begin rs<=1; dat<="!" next<=nul; end /顯示!nul: begin rs<=0; dat<=8'h00; /把液晶的E腳拉高 if(cnt!=2'h2) / 開始的時(shí)候E初始為0,然后置1,延時(shí)一段時(shí)間后再置0,產(chǎn)生一個(gè)高脈沖begin e<=0; next<=set0; cnt<=c

43、nt+1; endelsebegin next<=nul; e<=1; endenddefault: next=set0;endcase end assign en=clkr|e; /輸出使能信號(hào)assign rw=0; /輸出讀寫選擇信號(hào),低電平進(jìn)行寫操作endmodule 2)設(shè)計(jì)分析: 該實(shí)驗(yàn)設(shè)計(jì)過程只是通過簡(jiǎn)單地測(cè)試使LCD1602顯示特定的字符串“HELLO WORLD!”證明LCD1602能夠正常工作,但是由于對(duì)LCD1602的理解不夠所以不能很好地理解設(shè)計(jì)如何將接收到的數(shù)據(jù)進(jìn)行輸出顯示,所以沒有準(zhǔn)確的完成良的設(shè)計(jì)要求,只是簡(jiǎn)單地能夠顯示自己設(shè)定的特定字符。實(shí)驗(yàn)設(shè)計(jì)采用

44、狀態(tài)機(jī)的狀態(tài)轉(zhuǎn)換實(shí)現(xiàn)字符的顯示,首先進(jìn)行LCD1602的初始化定義,然后進(jìn)行顯示字符的設(shè)置,最后設(shè)定使能信號(hào)en下降沿有效,使液晶模塊執(zhí)行命令,完成顯示設(shè)計(jì)。四.4*4矩陣鍵盤模塊可能對(duì)4*4矩陣鍵盤的工作方式和輸出不是很理解,所以設(shè)計(jì)的矩陣鍵盤還是不是很好,按鍵會(huì)存在抖動(dòng),而且還不能準(zhǔn)確的將所得到的鍵值通過串口發(fā)送給計(jì)算機(jī)顯示,由于LCD1602的理解不是很好,所以還不能將矩陣鍵盤的鍵值輸出給LCD1602顯示,這只是個(gè)簡(jiǎn)單地通過按鍵控制led燈亮的小模塊。1)4*4矩陣鍵盤輸入模塊實(shí)驗(yàn)程序:module key_JZ(clk,reset,row,col,led); /4*4矩陣鍵盤輸入模塊

45、input clk; /系統(tǒng)時(shí)鐘輸入信號(hào)50MHz input reset; /復(fù)位信號(hào),低有效input 3:0row; /矩陣鍵盤行輸入output 3:0col; /矩陣鍵盤列輸出output 7:0led; /8個(gè)led燈輸出reg 7:0 led; /定義8個(gè)led燈輸出為寄存器型變量reg 3:0col; /定義矩陣鍵盤列輸出為寄存器型變量reg 3:0key_value; /矩陣鍵盤鍵值寄存器reg 18:0count; /延時(shí)20ms的分頻計(jì)數(shù)器reg 2:0state; /狀態(tài)標(biāo)志位reg key_flag; /按鍵標(biāo)志位reg clk_50hz; /分頻后的50HZ時(shí)鐘信號(hào)

46、reg 3:0col_reg; /寄存掃描列值reg 3:0row_reg; /寄存掃描行值always (posedge clk or negedge reset) /時(shí)鐘分頻過程塊beginif(!reset) /復(fù)位信號(hào),低有效begin clk_50hz<=0; count<=0; endelse beginif(count>=499999) /輸出分頻時(shí)鐘begin clk_50hz<=clk_50hz; count<=0; endelse count<=count+1; /分頻計(jì)數(shù)endendalways (posedge clk_50hz or

47、 negedge reset) /掃描行列輸出鍵值過程塊beginif(!reset) /復(fù)位信號(hào),低有效begin col<=4'b0000; state<=0; endelse begincase (state) /狀態(tài)轉(zhuǎn)換輸出0: begin col3:0<=4'b0000; key_flag<=1'b0;if(row3:0!=4'b1111) begin state<=1; col3:0<=4'b1110; end /有鍵按下,掃描第一行else state<=0; /否則繼續(xù)保持0狀態(tài)end 1: be

48、ginif(row3:0!=4'b1111) begin state<=5;end /判斷為第一行嗎else begin state<=2;col3:0<=4'b1101;end /掃描第二行end 2: begin if(row3:0!=4'b1111) begin state<=5;end /判斷為第二行嗎else begin state<=3;col3:0<=4'b1011;end /掃描第三行end3: begin if(row3:0!=4'b1111) begin state<=5;end /判斷為第三

49、行嗎else begin state<=4;col3:0<=4'b0111;end /掃描第四行end4: begin if(row3:0!=4'b1111) begin state<=5;end /判斷為第一行嗎else state<=0;end5: begin if(row3:0!=4'b1111) begin col_reg<=col; /保存掃描列值row_reg<=row; /保存掃描行值state<=5;key_flag<=1'b1; /有鍵按下,標(biāo)志置1end else state<=0; /否

50、則返回0狀態(tài)endendcaseendendalways (clk_50hz or col_reg or row_reg) /輸出鍵值過程塊beginif(key_flag=1'b1) /當(dāng)有鍵按下時(shí)執(zhí)行下面程序begincase (col_reg,row_reg)8'b1110_1110:key_value<=0;8'b1110_1101:key_value<=1;8'b1110_1011:key_value<=2;8'b1110_0111:key_value<=3;8'b1101_1110:key_value<=

51、4;8'b1101_1101:key_value<=5;8'b1101_1011:key_value<=6;8'b1101_0111:key_value<=7;8'b1011_1110:key_value<=8;8'b1011_1101:key_value<=9;8'b1011_1011:key_value<=10;8'b1011_0111:key_value<=11;8'b0111_1110:key_value<=12;8'b0111_1101:key_value<=13;8'b0111_1011:key_value<=14;8'b0111_0111:key_value<=15;endcaseendendalways ( key_value ) /8位led顯示過程塊begincase (key_value) /輸出8位led燈0: begin led<=8'b11111110; end1: begin led<=8'b11111101; end2: begin led<=8'b11111011; end3: begin led

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(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)論