最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【基于FPGA的圖像處理工程】邊緣檢測工程之串口接收模塊代碼解析

2023-02-02 07:56 作者:明德?lián)P易老師  | 我要投稿

基于FPGA的圖像處理工程

? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??—邊緣檢測工程:串口接收模塊代碼解析

本文為明德?lián)P原創(chuàng)文章,轉載請注明出處!

串口接收模塊的功能:接收上位機通過串口發(fā)送過來的數(shù)據(jù),進行串并轉換之后送給下游模塊。


注:串口波特率9600,無奇偶校驗位。


一、設計架構


上圖是與上位機通信的串口的時序圖。我們從圖中可以獲取到如下關鍵信息。


1.?串口數(shù)據(jù)線位寬為1bit,默認狀態(tài)下為高電平。

2.?每次上游模塊發(fā)送數(shù)據(jù),都是先發(fā)送1位的起始位0,然后發(fā)送8位的數(shù)據(jù),最后是1位的停止位1。

3.?每1位所占的時間,可以通過波特率來計算。計算方法如下:

波特率是指1s內發(fā)送或接受了多少比特數(shù)據(jù),若波特率為9600 bit/s,則1s可以傳輸9600bit,那么傳輸1bit的時間為:1/9600(s)。以MP801開發(fā)板為例,時鐘頻率為50M,那么發(fā)送1bit就需要5208個時鐘周期。


串口接收模塊采用兩個計數(shù)器的架構,這兩個計數(shù)器分別表示接收1bit需要的時間和共需要接收多少bit。其結構圖如下:

計數(shù)器cnt0:對接收1bit數(shù)據(jù)需要的時間進行計數(shù);接收1bit需要5208個時鐘周期。該計數(shù)器的計數(shù)周期為5208。

計數(shù)器cnt1:對接收多少bit的數(shù)據(jù)進行計數(shù);停止位不參與,起始位加上數(shù)據(jù)位共9bit。該計數(shù)器的計數(shù)周期為9。

本工程使用了檢測信號下降沿的方法,信號下降沿的檢測方法:

檢查uart_rx的下降沿,就要用到FPGA里的邊沿檢測技術。所謂的邊沿檢測,就是檢測輸入信號,或者FPGA內部邏輯信號的跳變,即上升沿或者下降沿的檢測。就比如前面uart_rx由1變0時,就出現(xiàn)了下降沿,接著一次指令結束,uart_rx由0變1時,就出現(xiàn)了上升沿,邊沿檢測技術這在FPGA電路設計泛。電路圖如下:


? 對應的信號列表如下圖所示:


中間信號,trigger連到觸發(fā)器的信號輸入端D,觸發(fā)器的輸出器連的是tri_ff0。將trigger取反,與tri_ff0相與,就得到信號neg_edge,如果neg_edge=1就表示檢測到trigger的下降沿。將tri_ff0取反,與trigger相與,就得到信號pos_edge,如果pos_edge=1,就表示檢測到trigger的上升沿。

我們來講解這個原理,信號的波形圖如下:

?Tri_ff0是觸發(fā)器的輸出,因此tri_ff0的信號與trigger信號相似,但是相差了一個時鐘周期。我們也可以理解為:每個時鐘上升沿看到的tri_ff0的值,其實就是triffer信號上一個時鐘看到的值,也就是tri_ff0是trigger之前的值。

我們在看第3時鐘上升沿,此時trigger值為0,而tri_ff0的值為1,即當前trigger的值為0,之前的值為1,這就是下降沿,此時neg_edge為1。當看到neg_edge為1,就表示檢測到trigger的下降沿了。同理在第7個時鐘上升沿,看到trigger值為1,而之前值為0,pos_edge為1,表示檢測到trigger的上升沿。

本模塊輸入信號uart_rx是異步信號,異步信號都需要經(jīng)驗同步化后,才能夠使用。異步信號同步化如下。

在前面討論邊沿檢測的波形中,我們把trigger當做理想的同步信號來考慮,也就是trigger滿足D觸發(fā)器的建立和保持時間,在同步系統(tǒng)中實現(xiàn)邊沿檢測不是問題。但如果trigger不是理想的同步信號,例如外部按鍵信號,以及本工程的uart_rx信號。這些信號什么時候產(chǎn)生變化,是外部傳輸指令給FPGA,對于FPGA來說完全是隨機的。很有可能出現(xiàn),信號在時鐘上升沿產(chǎn)生變化的情況,從而無法滿足觸發(fā)器的建立時間和保持時間要求,出現(xiàn)亞穩(wěn)態(tài)的情況,從而導致系統(tǒng)崩潰。如下圖,我們先將信號用2個觸發(fā)器進行了寄存,確定了信號的穩(wěn)定性,然后再進行邊沿檢測,達成了同步系統(tǒng)中實現(xiàn)邊沿檢測的需求。


?那么邊沿檢測的代碼設計就需要先進行觸發(fā)器的設計,假設輸入的信號trigger不是同步信號,要將該信號用2個觸發(fā)器進行寄存,得到tri_ff0和tri_ff1。需要特別注意的是,在第一個觸發(fā)器階段,信號依舊有亞穩(wěn)態(tài)的情況,因此tri_ff0絕對不可以拿來當條件使用,只能使用tri_ff1。接著進行檢測邊沿,根據(jù)前面所說,得出同步信號后再用寄存器寄存,得到tri_ff2。根據(jù)tri_ff1和tri_ff2,我們就可以得到邊沿檢測結果。當tri_ff1==1且tri_ff2==0時,上升沿的pos_edge有效;當tri_ff1==0且tri_ff2==1時,下降沿的neg_edge有效,代碼如下:

綜上所述,如果進來的信號是異步信號,那么就需要先進行同步化,再做檢測,即通過打兩拍的方式,實現(xiàn)了信號的同步化;再通過打一拍的方式,實現(xiàn)邊沿檢測電路。反之,如果進來的信號本身就是同步信號,那就沒有必要做同步化了,可以直接做邊沿檢測。


二、信號的意義



三、參考代碼

下面展出本模塊的設計,歡迎進一步交流,如果需要源代碼,歡迎與本人聯(lián)系。


【基于FPGA的圖像處理工程】邊緣檢測工程之串口接收模塊代碼解析的評論 (共 條)

分享到微博請遵守國家法律
临湘市| 泸定县| 新泰市| 越西县| 武陟县| 蓬溪县| 晋宁县| 精河县| 阿克陶县| 金秀| 固原市| 疏勒县| 子长县| 马龙县| 全州县| 平顶山市| 漳州市| 高邮市| 乌兰察布市| 巴塘县| 钟山县| 栖霞市| 郎溪县| 崇礼县| 察隅县| 钟祥市| 锦州市| 渭南市| 东安县| 从江县| 呈贡县| 综艺| 延津县| 家居| 静安区| 银川市| 罗源县| 玉门市| 佛冈县| 航空| 德安县|