新聞中心

EEPW首頁(yè) > 手機(jī)與無(wú)線通信 > 設(shè)計(jì)應(yīng)用 > Modbus通信協(xié)議的FPGA實(shí)現(xiàn)

Modbus通信協(xié)議的FPGA實(shí)現(xiàn)

作者: 時(shí)間:2010-08-11 來(lái)源:網(wǎng)絡(luò) 收藏

(4)如果檢測(cè)到兩個(gè)字符時(shí)間間隔大于1.5個(gè)字符時(shí)間,則重置幀起始標(biāo)志,把下一個(gè)接收到的字符放入接收緩沖寄存器的0x00地址,再繼續(xù)步驟(3);
(5)當(dāng)檢測(cè)到?jīng)]有字符輸入且定時(shí)器第二次檢測(cè)到3.5個(gè)字符時(shí)間,置幀接收完全標(biāo)志;
(6)把接收緩沖區(qū)接收的數(shù)據(jù)作CRC校驗(yàn),如果校驗(yàn)不正確,置幀起始標(biāo)志,轉(zhuǎn)到步驟(3),繼續(xù)等待接收;如果是基于該接口的主設(shè)備,一般應(yīng)設(shè)置超時(shí)時(shí)間,以避免無(wú)限等待;如果校驗(yàn)正確,則Re_finish發(fā)出一個(gè)脈沖,認(rèn)為接收了一個(gè)在數(shù)據(jù)鏈路層上正確的Mod-bus幀。
對(duì)于幀錯(cuò)誤(停止位為0)標(biāo)志FE,奇偶校驗(yàn)錯(cuò)誤標(biāo)志PE,最后一個(gè)接收到的數(shù)據(jù)所在接收緩沖區(qū)中的位置Rebuf_end[7..O],對(duì)外并不必須,可以留出這些端口備用,所以用虛線表示。
2.3 輸入/輸出寄存器操作
接收緩沖數(shù)據(jù)寄存器和發(fā)送緩沖數(shù)據(jù)寄存器都采用雙口RAM,這比寄存器要節(jié)省很多資源。為了保證對(duì)它們的操作是原子的,即為了避免同時(shí)對(duì)相同地址執(zhí)行寫(xiě)操作,故要求當(dāng)CE_置低時(shí),外部才可以對(duì)輸入輸出寄存器執(zhí)行寫(xiě)操作,此時(shí)接口內(nèi)部不會(huì)對(duì)接收/輸出寄存器執(zhí)行任何讀寫(xiě)操作。
2.4 發(fā)送過(guò)程
(1)在發(fā)送模式使能之前,應(yīng)先處于輸入/輸出寄存器模式,通過(guò)Trbuf_data[7..0],Trbuf_add[7..0],Trbuf_wren把待發(fā)送的不包括兩位CRC校驗(yàn)的協(xié)議幀從地址0x00依次寫(xiě)入發(fā)送緩沖寄存器中,然后使能Ld_TbNCE信號(hào)(一個(gè)時(shí)鐘周期),同時(shí)存入發(fā)送緩存寄存器所裝最后一個(gè)數(shù)據(jù)的地址,然后把該接口置于發(fā)送Modbus協(xié)議幀模式。
(2)發(fā)送模塊先對(duì)發(fā)送數(shù)據(jù)緩沖寄存器中的所有數(shù)做CRC-16校驗(yàn),然后把計(jì)算所得結(jié)果按低位在前高位在后的順序依次放到用Ld_TbNCE信號(hào)鎖存的地址的下兩個(gè)地址位置處。
(3)發(fā)送模塊從發(fā)送數(shù)據(jù)緩沖寄存器Ox00開(kāi)始,依次讀出數(shù)據(jù)并按所給的波特率發(fā)送出去,如果要求奇偶校驗(yàn),則發(fā)送完數(shù)據(jù)之后加上計(jì)算所得的奇偶校驗(yàn)位發(fā)送出去。
(4)當(dāng)發(fā)送完最后一個(gè)數(shù)據(jù)即CRC-16的高8位數(shù)據(jù)之后,Tr_finish發(fā)出一個(gè)脈沖表示發(fā)送完畢。

3 接口模塊
3.1 波特率發(fā)生器

波特率發(fā)生器就是一個(gè)分頻器,根據(jù)系統(tǒng)時(shí)鐘分別發(fā)出位時(shí)鐘(Tx_clk)和1/16位時(shí)鐘(RX_clkl6)。由于系統(tǒng)的時(shí)鐘周期可能不同,為了模塊的通用性,該模塊用一個(gè)類屬(Generic)語(yǔ)句產(chǎn)生各種分頻系數(shù)。為了保證同步設(shè)計(jì),產(chǎn)生的位時(shí)鐘和1/16位時(shí)鐘作為控制信號(hào)在主時(shí)鐘的驅(qū)動(dòng)下控制其他模塊。
3.2 接收模塊
接收模塊組包括同步濾波模塊、接收機(jī)模塊、接收控制模塊、接收狀態(tài)寄存器模塊、時(shí)間標(biāo)志產(chǎn)生模塊等。
Modbus網(wǎng)絡(luò)中設(shè)備是運(yùn)行在不相關(guān)時(shí)鐘上的,為了避免亞穩(wěn)態(tài)現(xiàn)象,要求信號(hào)進(jìn)入時(shí)通過(guò)兩個(gè)級(jí)聯(lián)的寄存器。異步輸入信號(hào)必須在足夠的時(shí)間內(nèi)保持?jǐn)?shù)據(jù)有效,從而保證被目標(biāo)時(shí)鐘域檢測(cè)到,在接收端則認(rèn)為最少是大于幾個(gè)脈沖寬度的信號(hào)才是應(yīng)該被檢測(cè)到的信號(hào),于是在接收端加入濾波模塊,具體算法如下:連續(xù)3次檢測(cè)到為高(或低)電平時(shí),才往接收寄存器寫(xiě)入高(或低)電平,否則保持原來(lái)檢測(cè)到的電平,不到3個(gè)脈沖寬度的信號(hào)被過(guò)濾。顯然,同步濾波模塊引入了5個(gè)時(shí)鐘的延遲,但這樣的延時(shí)對(duì)于Modbus協(xié)議來(lái)說(shuō)可以忽略。
接收機(jī)模塊是一個(gè)改進(jìn)的UART接收模塊,其工作流程如下:
(1)當(dāng)檢測(cè)到起始位時(shí),繼續(xù)讀取其他位并通過(guò)移位把它們移人接收移位寄存器RSR中;
(2)當(dāng)所有的數(shù)據(jù)位和停止位都接收完畢后,置RDR寄存器滿標(biāo)志RDRF位為1;
(3)檢測(cè)停止位和奇偶校驗(yàn)位,如果發(fā)現(xiàn)錯(cuò)誤置相關(guān)錯(cuò)誤標(biāo)志位;
(4)如果所接收數(shù)據(jù)正確,RSR中數(shù)據(jù)載入到接收數(shù)據(jù)寄存器RDR中,清除錯(cuò)誤標(biāo)志。
從Rxd_syn上進(jìn)入的比特流與本地的位時(shí)鐘不是同步的,為了避免可能在錯(cuò)誤的時(shí)間讀取一些位,在每個(gè)比特時(shí)間采樣16次,在時(shí)鐘Rx_-clkl6的每個(gè)上升沿采樣,為了保證最大可行度,在理想情況下將在每比特時(shí)間中間進(jìn)行采樣。首先判斷起始位,當(dāng)檢測(cè)Rxd_syn至少連續(xù)半個(gè)位時(shí)鐘為低電平時(shí),即從第一次檢測(cè)到低電平之后,再連續(xù)9次檢測(cè),如果Rxd_syn為低電平的次數(shù)大于等于8次,則認(rèn)為起始位到來(lái),此時(shí)應(yīng)該在起始位中間后兩個(gè)Rx_clkl6處。之后每隔16個(gè)Rx_clkl6時(shí)鐘周期在14,15,16個(gè)上升沿到來(lái)時(shí)分別采樣,然后對(duì)3次采樣結(jié)果取至少兩次相等的數(shù)據(jù)作為所接收到的值,以保證接收數(shù)據(jù)的準(zhǔn)確性。8個(gè)數(shù)據(jù)位采集完畢之后,根據(jù)Sel_parity[1..O]信號(hào)判斷是否奇偶校驗(yàn),如果有校驗(yàn)需求,則對(duì)第9個(gè)數(shù)據(jù)位的數(shù)據(jù)同樣做3次采樣取兩次相同值作為接收到的奇偶校驗(yàn)位,同時(shí)計(jì)算奇偶校驗(yàn)結(jié)果。在停止位(不包括起始位,無(wú)校驗(yàn)時(shí)為第9位,有校驗(yàn)時(shí)為第10位)到來(lái)時(shí),同樣經(jīng)過(guò)3次采樣,但是只要檢測(cè)到1位為高就認(rèn)為停止位正確,為了減少狀態(tài)機(jī)數(shù)量,可以在停止位到來(lái)時(shí)比較計(jì)算所得奇偶校驗(yàn)位和接收到的奇偶校驗(yàn)位從而判定接收數(shù)據(jù)是否奇偶校驗(yàn)錯(cuò)誤。由于接收控制器一定會(huì)讀取前一個(gè)數(shù)據(jù)字節(jié)并清零RDRF,所以常見(jiàn)的UART里的超限(overrun)錯(cuò)誤這里并沒(méi)有出現(xiàn)。圖3為用QuartusⅡ軟件自帶仿真器仿真結(jié)果。


評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉