日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > ZYNQ


首先來解釋一下FIFO的含義,F(xiàn)IFO就是First Input First Output的縮寫,就是先入先出的意思,按照我的理解就是,先進(jìn)去的數(shù)據(jù)先出,例如一個(gè)數(shù)組的高位先進(jìn),那么讀出來的時(shí)候也就高位先出。下面是百度百科的解釋。

FIFO一般用于不同時(shí)鐘域之間的數(shù)據(jù)傳輸,比如FIFO的一端是AD數(shù)據(jù)采集,另一端是計(jì)算機(jī)的PCI總線,假設(shè)其AD采集的速率為16位 100K SPS,那么每秒的數(shù)據(jù)量為100K×16bit=1.6Mbps,而PCI總線的速度為33MHz,總線寬度32bit,其最大傳輸速率為1056Mbps,在兩個(gè)不同的時(shí)鐘域間就可以采用FIFO來作為數(shù)據(jù)緩沖。另外對(duì)于不同寬度的數(shù)據(jù)接口也可以用FIFO,例如單片機(jī)為8位數(shù)據(jù)輸出,而DSP可能是16位數(shù)據(jù)輸入,在單片機(jī)與DSP連接時(shí)就可以使用FIFO來達(dá)到數(shù)據(jù)匹配的目的。

我們將這三個(gè)模塊分別定義為dataoutput塊,fifo_ctrl塊和uart_ctrl塊?,F(xiàn)在考慮連線,具體到每一根連線,這樣根據(jù)圖來寫代碼要比直接用腦子構(gòu)圖要方便的多。三個(gè)模塊,先考慮時(shí)鐘和復(fù)位信號(hào)線,三個(gè)模塊都有,然后,數(shù)據(jù)產(chǎn)生模塊要將產(chǎn)生的數(shù)據(jù)發(fā)給FIFO模塊,所以要有數(shù)據(jù)寫入線,我們定義它為wr-datain,數(shù)據(jù)寫入FIFO塊后總要輸出,這些數(shù)據(jù)就是我們要發(fā)送的數(shù)據(jù),所以定義輸出數(shù)據(jù)線tx_data,先不管FIFO,我們?cè)賮矶x數(shù)據(jù)發(fā)送模塊的連線,數(shù)據(jù)發(fā)送總要有個(gè)啟動(dòng)信號(hào),所以我們定義變量tx_start,之后,還要有一個(gè)輸出端給PC機(jī),我們定義這個(gè)輸出端位rs232。

對(duì)于FIFO模塊的例化過程很簡(jiǎn)單就不做過多的說明,只把接口說一下,F(xiàn)IFO模塊除了時(shí)鐘,復(fù)位信號(hào)外,還有數(shù)據(jù)輸入端口,這個(gè)端口要和之前的數(shù)據(jù)產(chǎn)生模塊的數(shù)據(jù)輸出端口相連,還有寫請(qǐng)求端口,高電平有效,數(shù)據(jù)發(fā)送模塊每隔1秒鐘產(chǎn)生一個(gè)16位的數(shù)據(jù),并發(fā)送寫請(qǐng)求命令給FIFO,還有讀請(qǐng)求命令,高電平有效數(shù)據(jù)發(fā)送模塊在發(fā)送數(shù)據(jù)時(shí)要發(fā)送一個(gè)讀請(qǐng)求給FIFO,從中讀取數(shù)據(jù)后再發(fā)送給PC機(jī),還有空信號(hào)empty,只要檢測(cè)到FIFO中有數(shù)據(jù),empty就為低電平,我們可用這個(gè)信號(hào)來啟動(dòng)數(shù)據(jù)發(fā)送模塊。這樣一來,我們的整體框架就出來了有了這個(gè)整體框架,再寫代碼就容易多了。

下面是RTL視圖

按照這個(gè)框架,先把接口定義出來,中間的連線用wire型

設(shè)計(jì)完端口之后我們就來設(shè)計(jì)底層模塊,先設(shè)計(jì)數(shù)據(jù)產(chǎn)生模塊dataoutput,這個(gè)部分主要是產(chǎn)生數(shù)據(jù),可用一個(gè)分頻電路實(shí)現(xiàn)每1s發(fā)送一次的數(shù)據(jù),產(chǎn)生這16位數(shù)據(jù)的時(shí)候,需要16個(gè)時(shí)鐘,每個(gè)時(shí)鐘數(shù)據(jù)自加1,總體來說比較簡(jiǎn)單

寫完一個(gè)模塊之后養(yǎng)成好習(xí)慣,馬上把端口例化

數(shù)據(jù)產(chǎn)生以后就要進(jìn)入緩沖器FIFO,由于這段代碼我們是調(diào)用的,所以只要例化接口就好了,只需要將產(chǎn)生的fifo_ctrl_inst文件中例化好的代碼拷貝粘貼就好

最后我們要寫數(shù)據(jù)發(fā)送部分,之前已經(jīng)講過,數(shù)據(jù)發(fā)送部分還要包括兩個(gè)子模塊,一個(gè)是波特率匹配模塊,一個(gè)是發(fā)送模塊,既然又包括兩個(gè)子模塊,那么我們還要構(gòu)建一個(gè)框圖

按照之前的例子,當(dāng)FIFO當(dāng)中有數(shù)據(jù)時(shí)empty就會(huì)拉低,我們把它取反后送給發(fā)送模塊,告訴發(fā)送模塊準(zhǔn)備發(fā)送,這樣,發(fā)送模塊就會(huì)產(chǎn)生一個(gè)波特率計(jì)數(shù)器啟動(dòng)信號(hào)bps_start給波特率匹配模塊,波特率匹配模塊收到信號(hào)后立馬開始匹配計(jì)數(shù),并產(chǎn)生采集信號(hào),將采集信號(hào)傳給發(fā)送模塊,發(fā)送模塊根據(jù)采集信號(hào),將數(shù)據(jù)一位一位發(fā)送出去。知道了這個(gè)原理之后,我們構(gòu)建起這樣一個(gè)框架

根據(jù)這個(gè)框圖,我們定義端口和線

定義完端口之后,開始寫發(fā)送模塊,用邊沿脈沖檢測(cè)法檢測(cè)啟動(dòng)信號(hào)tx_start信號(hào)的上升沿來啟動(dòng)發(fā)送部分,波特率配置模塊具體代碼在前面也文章中有給出,就不在說明,寫完之后例化端口,這兩個(gè)模塊作為數(shù)據(jù)發(fā)送模塊的子模塊,要在數(shù)據(jù)發(fā)送模塊下例化

這樣一來,我們整個(gè)設(shè)計(jì)就完成了,看上去很簡(jiǎn)單,但是從我自己實(shí)踐的角度來說還是有點(diǎn)挑戰(zhàn)的,包括中間出現(xiàn)的各種問題,下面就來分享一下我在做這個(gè)設(shè)計(jì)時(shí)遇到的問題

1.例化問題

在例化端口時(shí),要注意括號(hào)里面的才是本層模塊的端口,也就是說在本層模塊上面已經(jīng)定義過的變量,括號(hào)外面的才是被調(diào)用模塊的端口,也在下層模塊的頂部被聲明,我在寫這段程序的時(shí)候?qū)⒍哳嵉沽?,?dǎo)致連線不成功,最終是通過查看RTL視圖知道了哪根線有問題才修改成功的

2.同一個(gè)變量不能在多個(gè)always語句中被賦值

我們可能習(xí)慣這么寫

1always @ (posedge clk ornegedge rst_n) 2 if(!rst_n) num <= 1'b0; 3 else num <= num+1'b1; 

那么,num的值在其他always語句中就不允許再被賦值或者清零,我在寫的時(shí)候在其他always語句中將num 清零了,導(dǎo)致編譯不成功

3.  定義變量之前不要出現(xiàn)該變量,即使后面又定義了

例如,我先進(jìn)行num的運(yùn)算,之后再定義num,reg [3:0] num,這樣寫的話雖然編譯沒有錯(cuò)誤,但是在調(diào)用modelsim仿真的時(shí)候它會(huì)出現(xiàn)編譯錯(cuò)誤,所以為了規(guī)范,不要這樣寫

4.  在邊沿脈沖檢測(cè)的時(shí)候,習(xí)慣于檢測(cè)下降沿,而這里是檢測(cè)tx_en 的上升沿,所以我在復(fù)位清零的時(shí)候錯(cuò)誤的將兩級(jí)寄存器賦值為0,實(shí)際上在檢測(cè)上升沿時(shí)要對(duì)兩級(jí)寄存器復(fù)位時(shí)置一,再把最后一級(jí)寄存器取反后與上一級(jí)相與。

5.  在發(fā)送數(shù)據(jù)部分,由于受到上次寫接收部分程序的影響,沒有將起始位發(fā)送出去,因?yàn)樵诮邮詹糠郑遣恍枰邮掌鹗嘉坏?,是從第一位開始,而在發(fā)送部分只有先發(fā)送起始位才能和上位機(jī)握手通信,還有在發(fā)送完數(shù)據(jù)后要發(fā)送停止位,其他情況下都發(fā)送高電平來阻止通信的進(jìn)行

6.最后一個(gè)問題是最棘手的問題,我找了好大一半天也沒發(fā)現(xiàn),最后還是根據(jù)源代碼找出來的,不過我還是不知道將這兩條語句顛倒了對(duì)程序有什么影響,只知道顛倒后數(shù)據(jù)會(huì)一直在發(fā)送,不會(huì)像預(yù)設(shè)一樣,每隔一秒發(fā)送一次,至今還是搞不清楚,希望大神指點(diǎn)迷津

總結(jié)

語法上的錯(cuò)誤到不至于太難,寫的多了就不會(huì)出錯(cuò)了,關(guān)鍵是邏輯上的錯(cuò)誤很隱蔽,也很難發(fā)現(xiàn),可以通過RTL視圖來檢測(cè)連線上是否正確,還可以借助仿真工具。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉