用FPGA設計了數據接收和發送模塊,FIFO模塊 用串口調試工具發送數據,數據接收模塊將接收到的串列數據轉換為並行數據(串轉並),並存入FIFO中,當FIFO中的數據個數大於某個值的時候,讀出數據,通過發送模塊將並行數據轉換為串列數據(並轉串),然後就可以在串口調試工具上看到接收到的數據。 註意的點 ...
用FPGA設計了數據接收和發送模塊,FIFO模塊,此處FIFO調用的是Show-ahead模式,在下一篇博客中將會分析這個問題。
用串口調試工具發送數據,數據接收模塊將接收到的串列數據轉換為並行數據(串轉並),並存入FIFO中,當FIFO中的數據個數大於某個值的時候,讀出數據,通過發送模塊將並行數據轉換為串列數據(並轉串),然後就可以在串口調試工具上看到接收到的數據。
註意的點:
1、接收數據時,接收的數據因為不確定什麼時候會來,所以有可能出現亞穩態,因此要進行同步處理,打兩拍。
2、不論是接收還是發送數據都是從低位開始的。
3、採數據的時侯要在數據中間取值,原因下文有講。
基本概念:
波特率與比特率?
波特率:單位時間內傳輸碼元的個數(碼元是攜帶數據信息的信號單元,有可能是1位的,也有可能是多位)
比特率:單位時間內傳輸了多少位數據
比特率=波特率*碼元的位數
因為UART數據是一位一位傳輸的,所以波特率與比特率在這裡可以認為是等效的,不用過於糾結,我們就直接理解成1s傳送了多少位數據就可以了。
這是一個很不專業的總結,但是能很快理解二者關係。
常用的波特率有 9600,19200,38400等,這裡用9600進行詳細講解
波特率位9600,則每一位數據的時間為 1s/9600=1000_000_000 ns/9600 =104166.67ns
因為時鐘頻率是50Mhz,因此需要104166.67ns/20ns=5208個時鐘周期。
這裡需要註意的問題是我們的時間並不能整除,有誤差,因此設計的時候要在數據的中間取值,這樣就可以避免數據出錯。
UART數據傳輸格式
數據格式由起始位、數據位(位數可以位7、8等)、奇偶校驗位(可有可無)、停止位(接收數據時可以忽略,發送數據時必須要有停止位)
上面已經說過每個數據的時間為5208個時鐘周期,因此需要設計一個計數器cnt_5208
接收數據時為 起始位+8位數據位,即9位數,因此需要一個計數器來指示是哪一位數,cnt_bit。
發送數據時 起始位0 +8位數據位 +停止位1,同樣也需要一個計數器來指示是哪一位數。
還要註意數據傳送的時候都是從低位開始。這一點很重要很重要,否則發送的數據和接收到的數據就不一樣,我是深深被傷到了,浪費了好多時間,以後要細心,不能再想當然,要遵守協議。。。。。
調試結果:當發送超過60位元組的數據時,就會接收到數據,結果如下。
發送了01020304050607,即4位*14=56位數,即一次發送7位元組的數據。
代碼已經打包:
http://files.cnblogs.com/files/aslmer/%E4%B8%B2%E5%8F%A3%E8%B0%83%E8%AF%95%E4%BB%A3%E7%A0%81.zip
轉載請註明出處:http://www.cnblogs.com/aslmer/p/5869015.html