新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于FPGA/CPLD設計與實現UART

        基于FPGA/CPLD設計與實現UART

        ——
        作者:江陰職業技術學院電子信息工程系 井新宇 時間:2007-01-26 來源:《》 收藏

        uart(即universal asynchronous receiver transmitter 通用異步收發器)是廣泛使用的串行數據傳輸協議。uart允許在串行鏈路上進行全雙工的通信。
        ---串行外設用到rs232-c異步串行接口,一般采用專用的集成電路即uart實現。如8250、8251、ns16450等芯片都是常見的uart器件,這類芯片已經相當復雜,有的含有許多輔助的模塊(如fifo),有時我們不需要使用完整的uart的功能和這些輔助功能。或者設計上用到了fpga/cpld器件,那么我們就可以將所需要的uart功能集成到fpga內部。使用vhdl將uart的核心功能集成,從而使整個設計更加緊湊、穩定且可靠。本文應用eda技術,基于fpga/cpld器件設計與實現uart。

        本文引用地址:http://www.104case.com/article/20863.htm

        一 uart簡介

        1 uart結構

        uart主要有由數據總線接口、控制邏輯、波特率發生器、發送部分和接收部分等組成。

        功能包括微處理器接口,發送緩沖器(tbr)、發送移位寄存器(tsr)、幀產生、奇偶校驗、并轉串、數據接收緩沖器(rbr)、接收移位寄存器(rsr)、幀產生、奇偶校驗、串轉并。

        圖1是uart的典型應用。

        2 uart的幀格式

        uart的幀格式如圖2所示。

        包括線路空閑狀態(idle,高電平)、起始位(start bit,低電平)、5~8位數據位(data bits)、校驗位(parity bit,可選)和停止位(stop bit,位數可為1、1.5、2位)。
        ---這種格式是由起始位和停止位來實現字符的同步。
        ---uart內部一般有配置寄存器,可以配置數據位數(5~8位)、是否有校驗位和校驗的類型、停止位的位數(1,1.5,2)等設置。

        二 uart的設計與實現

        1 uart發送器
        發送器每隔16個clk16時鐘周期輸出1位,次序遵循1位起始位、8位數據位(假定數據位為8位)、1位校驗位(可選)、1位停止位。

        cpu何時可以往發送緩沖器tbr寫入數據,也就是說cpu要寫數據到tbr時必須判斷當前是否可寫,如果不判這個條件,發送的數據會出錯。

        數據的發送是由微處理器控制,微處理器給出wen信號,發送器根據此信號將并行數據din[7..0]鎖存進發送緩沖器tbr[7..0],并通過發送移位寄存器tsr[7..0]發送串行數據至串行數據輸出端dout。在數據發送過程中用輸出信號tre作為標志信號,當一幀數據發送完畢時,tre信號為1,通知cpu在下個時鐘裝入新數據。

        發送器端口信號如圖3所示。

        引入發送字符長度和發送次序計數器length_no,實現的部分vhdl程序如下。

        if std_logic_vector(length_no) = “0001” then
        tsr <= tbr ; --發送緩沖器tbr數據進入發送移位寄存器tsr
        tre <= 0 ; --發送移位寄存器空標志置“0”
        elsif std_logic_vector(length_no) = “0010” then
        dout <= 0 ; --發送起始位信號“0”
        elsif std_logic_vector(length_no) >= “0011” and std_logic_vector(length_no) <= “1010” then
        tsr <= 0 & tsr(7 downto 1); --從低位到高位進行移位輸出至串行輸出端dout
        dout <= tsr(0) ;
        parity <= parity xor tsr(0) ; --奇偶校驗
        elsif std_logic_vector(length_no) = “1011” then
        dout <= parity ; 校驗位輸出
        elsif std_logic_vector(length_no) = “1100” then
        dout <= 1 ; --停止位輸出
        tre <= 1 ; --發送完畢標志置“1”
        end if ;
        發送器仿真波形如圖4所示。

        2 uart接收器

        串行數據幀和接收時鐘是異步的,發送來的數據由邏輯1變為邏輯0可以視為一個數據幀的開始。接收器先要捕捉起始位,確定rxd輸入由1到0,邏輯0要8個clk16時鐘周期,才是正常的起始位,然后在每隔16個clk16時鐘周期采樣接收數據,移位輸入接收移位寄存器rsr,最后輸出數據dout。還要輸出一個數據接收標志信號標志數據接收完。

        接收器的端口信號如圖5所示。

        實現的部分vhdl程序如下。
        elsif clk1xevent and clk1x = 1 then
        if std_logic_vector(length_no) >= “0001” and std_logic_vector(length_no) <= “1001” then
        數據幀數據由接收串行數據端移位入接收移位寄存器
        rsr(0) <= rxda ;
        rsr(7 downto 1) <= rsr(6 downto 0) ;
        parity <= parity xor rsr(7) ;
        elsif std_logic_vector(length_no) = “1010” then
        rbr <= rsr ; --接收移位寄存器數據進入接收緩沖器
        ......
        end if ;
        接收器仿真波形如圖6所示。

        3 波特率發生器

        uart的接收和發送是按照相同的波特率進行收發的。波特率發生器產生的時鐘頻率不是波特率時鐘頻率,而是波特率時鐘頻率的16倍,目的是為在接收時進行精確地采樣,以提出異步的串行數據。

        根據給定的晶振時鐘和要求的波特率算出波特率分頻數。

        波特率發生器仿真波形如圖7所示。

        三 小結

        通過波特率發生器、發送器和接收器模塊的設計與仿真,能較容易地實現通用異步收發器總模塊,對于收發的數據幀和發生的波特率時鐘頻率能較靈活地改變,而且硬件實現不需要很多資源,尤其能較靈活地嵌入到fpga/cpld的開發中。在eda技術平臺上進行設計、仿真與實現具有較好的優越性。



        關鍵詞:

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 新闻| 龙山县| 天峻县| 宁强县| 昆山市| 祁阳县| 巴彦淖尔市| 新民市| 福安市| 崇左市| 武汉市| 金寨县| 马边| 临夏市| 安阳县| 汉川市| 宜兴市| 大英县| 会同县| 高邮市| 开阳县| 永德县| 旌德县| 昌都县| 舟山市| 连平县| 黎城县| 安丘市| 宜兰市| 遵化市| 休宁县| 扶绥县| 福建省| 邵武市| 旌德县| 达拉特旗| 湖州市| 清徐县| 怀仁县| 称多县| 象州县|