|
鑒于以前對(duì)51單片機(jī)和STM32單片機(jī)串口的編程,對(duì)UART的了解僅僅停留在控制寄存器、波特率控制、以及數(shù)據(jù)緩存區(qū)這個(gè)層次,直到利用FPGA實(shí)現(xiàn)UART之后才對(duì)串口的工作流程有了更加深入細(xì)致的了解,以發(fā)散的思維去學(xué)習(xí)的話也會(huì)對(duì)其他通信協(xié)議以及數(shù)據(jù)的采集類FPGA的設(shè)計(jì)有一定的鋪墊意義,接下來(lái)就讓我們深度解析UART的運(yùn)行機(jī)制。
對(duì)于異步串行數(shù)據(jù)傳輸協(xié)議(UART)我們首先要解決的也要關(guān)注的就是串口波特率,波特率——BAUD bps(bit per second)那么對(duì)于一個(gè)時(shí)鐘頻率為clk的FPGA首先需要進(jìn)行分頻以及確定接收數(shù)據(jù)的采樣點(diǎn),分頻數(shù)就為clk/BAUD,那么采樣點(diǎn)就應(yīng)該在clk/BAUD/2為數(shù)據(jù)持續(xù)時(shí)間的中間,那么就需要在在這個(gè)時(shí)鐘周期產(chǎn)生一個(gè)采樣標(biāo)志,或者稱作采樣觸發(fā),另外我們不能讓波特率信號(hào)不停的差生,因?yàn)槭钱惒酱袀鬏斔灾挥挟?dāng)有數(shù)據(jù)需要接收或者需要發(fā)送時(shí),按照需要產(chǎn)生波特率信號(hào),這就需要有一個(gè)波特率啟動(dòng)標(biāo)志信號(hào)。異步串行的物理接口有兩個(gè)信號(hào)線RXD(數(shù)據(jù)接收),TXD(數(shù)據(jù)發(fā)送),在沒(méi)有數(shù)據(jù)傳輸時(shí)兩個(gè)信號(hào)線都保持高電平,當(dāng)有數(shù)據(jù)需要接受時(shí),RXD將被數(shù)據(jù)的起始位拉低,我們?cè)?/font>verilog中用脈沖邊沿檢測(cè)法來(lái)檢測(cè)接口的邊沿,就在他的下降沿我們置位波特率啟動(dòng)標(biāo)志,進(jìn)而啟動(dòng)波特率發(fā)生以接收數(shù)據(jù)。與此同時(shí)只為數(shù)據(jù)接收標(biāo)志位用以觸發(fā)中斷或者查詢用,并對(duì)波特率信號(hào)進(jìn)行計(jì)數(shù),因?yàn)楫惒酱趥鬏斆恳淮蝹鬏數(shù)臄?shù)據(jù)位數(shù)都是一定的,當(dāng)數(shù)據(jù)位被完全接收完成清空接收標(biāo)志,同時(shí)將數(shù)據(jù)存入數(shù)據(jù)接收緩存。
對(duì)于數(shù)據(jù)的發(fā)送首先應(yīng)該有一個(gè)觸發(fā)信號(hào),當(dāng)有數(shù)據(jù)需要發(fā)送時(shí)首先對(duì)此信號(hào)進(jìn)行置位,同時(shí)置位波特率起始標(biāo)志位以啟動(dòng)波特率發(fā)生。另外也需要對(duì)波特率的個(gè)數(shù)進(jìn)行計(jì)數(shù),當(dāng)所有的數(shù)據(jù)位都被發(fā)送完成后清除波特率啟動(dòng)標(biāo)志位關(guān)閉波特率發(fā)生,并將觸發(fā)信號(hào)清零以標(biāo)志數(shù)據(jù)發(fā)送完成。
脈沖邊沿檢測(cè):
對(duì)于數(shù)據(jù)的采集與接收一般都屬于時(shí)序邏輯,可以利用觸發(fā)器的時(shí)鐘延遲來(lái)進(jìn)行檢測(cè),
首先定義2個(gè)寄存器
Input singnal;
reg edge0;
reg edge1;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
……………….
Else
Edge0<=signal;
Edge1<=edge1;
end
上面的硬件描述在時(shí)鐘的上升沿將信號(hào)腳的邏輯值賦給edge0,同時(shí)將edge0 的值給edge1,那么edge0與edge1剛好相差一個(gè)時(shí)鐘,這樣就可以用下面的描述語(yǔ)言檢測(cè)出信號(hào)腳的邊沿
Assign edge=edge0^edge1;(上升沿和下降沿都可以檢測(cè))
Assign edge=edge0&~edge1;(上升沿可以檢測(cè))
Assign edge=edge1&~edge0;(下降沿檢測(cè))
|
|