在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

UART系統配置步驟詳解

冬至子 ? 來源:兩猿社 ? 作者:IC猿 ? 2023-06-05 16:05 ? 次閱讀

00 模塊簡介

CPU通過掛載到APB總線上的UART模塊,實現其與外部設備的串行通信。系統配置部分將 實現UART模塊與CPU的通信,APB總線的讀寫和模塊的功能配置,中斷信號的產生

AMBA總線中的APB總線由于功耗小,接口簡單,適用于低帶寬且不需要更高性能總線的中低速外設。UART是此類常見外設,通常使用APB總線與系統連接。

01 模塊接口與描述

1.jpg

2.jpg

02 實現

REG_IF模塊主要由 狀態信息同步APB總線讀寫FIFO讀寫使能狀態寄存器操作及中斷產生這幾部分構成。

APB總線讀寫:通過APB總線實現與CPU的通信,通過配置寄存器方式實現數據收發,控制UART模塊功能,讀取模塊工作狀態等。

FIFO讀寫使能:分別是RF_FIFO的讀使能控制和TX_FIFO的寫使能控制。

狀態寄存器操作及中斷產生:將TX、RX模塊反饋的工作狀態體現在狀態寄存器中,供CPU查詢,并產生中斷信號通知CPU進行處理。

  • 狀態信息同步

配置模塊工作在系統時鐘域,將收到來自接收模塊和發送模塊的狀態指示信息,這部分信號需要在系統時鐘域進行同步。

  • APB總線讀寫

前面我們講過APB讀寫時序。

APB讀:作為APB從設備,當APB總線發起讀操作時,需要在合適的時間將對應地址的寄存器值送到總線(如下圖T3),確保主機能收到數據。此時 PENABLE等于0,PSEL等于1,PWRITE等于0

圖片

apb讀

APB讀實現如下:

//read reg value
always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        prdata_o <= 32'h0;
    end
    elsebegin
        // APB read
        if(psel_i && (!penable_i) && (!pwrite_i)) begin
            case(paddr_i)
            4'h0:
                prdata_o <= uart_tx;
            4'h1:
                prdata_o <= uart_rx;
            4'h2:
                prdata_o <= uart_baud;
            4'h3:
                prdata_o <= uart_conf;
            4'h4:
                prdata_o <= uart_rxtrig;
            4'h5:
                prdata_o <= uart_txtrig;
            4'h6:
                prdata_o <= uart_delay;
            4'h7:
                prdata_o <= uart_status;
            4'h8:
                prdata_o <= uart_rxfifo_stat;
            4'h9:
                prdata_o <= uart_txfifo_stat;
            endcase
        end
    end
end

APB寫:類似的,當APB總線上發起寫操作時,從機需要在合適的時間接收總線上的數據(如下圖T4),放到對應的寄存器地址。此時 PENABLE等于1,PSEL等于1,PWRITE等于1

圖片

apb寫

APB寫實現如下:

//write reg value
always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        uart_tx     <= 32'h0;
        uart_baud   <= 32'hf152;
        uart_conf   <= 32'h34;
        uart_rxtrig <= 32'h1;
        uart_txtrig <= 32'h0;
        uart_delay  <= 32'h2;
    end
    elsebegin
        // APB write
        if(psel_i && penable_i && pwrite_i) begin
            case(paddr_i)
            4'h0:
                uart_tx     <= pwdata_i;
            4'h2:
                uart_baud   <= pwdata_i;
            4'h3:
                uart_conf   <= pwdata_i;
            4'h4:
                uart_rxtrig <= pwdata_i;
            4'h5:
                uart_txtrig <= pwdata_i;
            4'h6:
                uart_delay  <= pwdata_i;
            endcase
        end
    end
end
  • FIFO讀寫使能

RX_FIFO讀控制:

在cpu讀uart狀態寄存器(uart_status)時,如果rx中斷有效(即狀態位的第1bit位有效),且FIFO不為空,RX_FIFO讀使能一個時鐘周期。

或在cpu讀接收數據寄存器(uart_rx)時,RX_FIFO讀使能一個時鐘周期。

注意由于讀出FIFO數據需要1個時鐘周期,為了使cpu能及時讀到數據,在讀狀態寄存器時其實是一個預取動作。

// FIFO enable control
always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        rx_fifo_rinc <= 1'b0;
        state        <= 1'b0;
    end
    elsebegin
        case(state)
        1'b0: begin
            // when ARM read uart_status, judge interrupt bit ,if rx_int is
            // active, or ARM read uart_rx ,rx_fifo_rinc enable 1 clk
            if(psel_i && (!penable_i)&&(!pwrite_i)&&(paddr_i==4'h7)) begin
                if(uart_status[1] && !rx_fifo_rempty) begin
                    rx_fifo_rinc <= 1'b1;
                    state        <= 1'b1;
                end
            end
            // when ARM read data,rx_fifo_rinc enable 1 clk
            if(psel_i &&(!penable_i)&&(!pwrite_i)&&(paddr_i==4'h1)) begin
                rx_fifo_rinc <= 1'b1;
                state        <= 1'b1;
            end
        end
        1'b1: begin
            rx_fifo_rinc <= 1'b0;
            state        <= 1'b0;
        end
        endcase
    end
end

TX_FIFO寫控制:

在cpu寫uart_tx時,說明需要UART模塊發送數據,APB寫數據到寄存器需要1個時鐘周期,所以需要在1個時鐘之后再寫使能TX_FIFO。

always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        tx_fifo_winc <= 1'b0;
        state_en     <= 2'b0;
    end
    elsebegin
        case(state_en)
        2'b0: begin
            // ARM write uart_tx,tx_fifo_winc enable 1 clk after 1 clk
            if(psel_i && penable_i && pwrite_i && (paddr_i==4'h0)) begin
                state_en <= 2'b01;
            end
        end
        2'b01: begin
            state_en     <= 2'b10;
            tx_fifo_winc <= 1'b1;
        end
        2'b10: begin
            tx_fifo_winc <= 1'b0;
            state_en     <= 2'b0;
        end
        endcase
    end
end
  • 狀態寄存器操作及中斷產生

狀態寄存器指示4個狀態:ST_ERROR,P_ERROR,RX_INT和TX_INT。由高到低在寄存器uart_status[3:0]。分別表示接收數據停止位出錯、接收數據校驗位出錯、接收數據中斷位和發送數據中斷位。

其中接收數據中斷位有效表示RX_FIFO中數據量增加到觸發值,數據將滿(觸發值由cpu配置),通知cpu接收數據;發送數據中斷位有效表示TX_FIFO中數據減少到觸發值,數據將空(觸發值由cpu配置),通知cpu數據將要發送完畢,需補充數據。

從接收模塊接收到的ST_ERROR,P_ERROR信號響應也在此部分產生,表示已經收到此狀態。

// uart_status register operate
always@(posedge clk ornegedge rst_) begin
    if(!rst_) begin
        p_error_ack  <= 1'b0;
        st_error_ack <= 1'b0;
        uart_status  <= 32'h0;
        rx_state     <= 1'b0;
        tx_state     <= 1'b0;
    end
    elsebegin
        if(st_error_syn) begin
            uart_status[3]   <= 1'b1;
        end
        elsebegin
            if(neg_uart_status3) begin
                st_error_ack <= 1'b1;
            end
            elsebegin
                if(!st_error_syn2) begin
                    st_error_ack <= 1'b0;
                end
            end
        end
        if(p_error_syn) begin
            uart_status[2]   <= 1'b1;
        end
        elsebegin
            if(neg_uart_status2) begin
                p_error_ack  <= 1'b1;
            end
            elsebegin
                if(!p_error_syn2) begin
                    p_error_ack  <= 1'b0;
                end
            end
        end
        // when rx_fifo_cnt from less than to equal the rxtrig,
        // rx_int is active
        case(rx_state)
        1'b0: begin
            if(rx_fifo_cnt == (uart_rxtrig[3:0] - 1'b1)) begin
                rx_state      <= 1'b1;
            end
            elsebegin
                rx_state      <= 1'b0;
            end
        end
        1'b1: begin
            if(rx_fifo_cnt == uart_rxtrig[3:0]) begin
                uart_status[1] <= 1'b1;
                rx_state       <= 1'b0;
            end
            elsebegin
                rx_state       <= 1'b1;
            end
        end
        endcase
        // when tx_fifo_cnt from greater than to equal the txtrig,
        // tx_int is active
        case(tx_state)
        1'b0: begin
            if(tx_fifo_cnt == (uart_txtrig[3:0] + 1'b1)) begin
                tx_state       <= 1'b1;
            end
            elsebegin
                tx_state       <= 1'b0;
            end
        end
        1'b1: begin
            if(tx_fifo_cnt == uart_txtrig[3:0]) begin
                uart_status[0] <= 1'b1;
                tx_state       <= 1'b0;
            end
            elsebegin
                tx_state       <= 1'b1;
            end
        end
        endcase
        // ARM write 1 clean 0  uart_status
        if(psel_i && penable_i && pwrite_i && (paddr_i==4'h7)) begin
            uart_status <= uart_status & (~pwdata_i);
        end
    end
end

// produce interrupt to CPU
always @(posedge clk ornegedge rst_) begin
    if(!rst_) begin
	      uart_int_o <= 1'b0;
		end
	  elsebegin
	      if(|uart_status[3:0]) begin
            uart_int_o <= 1'b1;
        end
		    elsebegin
            uart_int_o <= 1'b0;
        end
		end
end

當uart_status中任何一位狀態位1中斷信號將有效,cpu接收到中斷后查詢狀態寄存器uart_status,處理后對uart_status寄存器寫1清零,清掉狀態位,即清除中斷。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 觸發器
    +關注

    關注

    14

    文章

    2029

    瀏覽量

    61728
  • FIFO存儲
    +關注

    關注

    0

    文章

    103

    瀏覽量

    6114
  • UART接口
    +關注

    關注

    0

    文章

    124

    瀏覽量

    15606
  • 串口中斷
    +關注

    關注

    0

    文章

    67

    瀏覽量

    14169
  • 狀態寄存器
    +關注

    關注

    0

    文章

    39

    瀏覽量

    7251
收藏 人收藏

    評論

    相關推薦

    FPGA最小系統配置電路的設計資料

    FPGA最小系統配置電路的設計資料
    發表于 05-04 16:04

    NI MAX 系統配置問題

    NI MAX 系統配置出現問題顯示不可用,請問該如何解決
    發表于 06-26 19:36

    單片機系統配置及接口相關介紹

    單片機原理及應用C語言版9ppt課件單片機原理及應用 (C語言版)第9章單片機系統配置及接口 第9章 單片機系統配置及接口 目錄9.1鍵盤接口 9.2LED顯示接口 9.3A/D轉換接口 9.4D
    發表于 07-14 08:08

    硬實時RTlinux系統配置

    更多技術干貨,歡迎掃碼關注博主微信公眾號:HowieXue,一起學習探討軟硬件技術知識經驗,關注就有海量學習資料免費領哦:硬實時RTlinux系統配置1. Linux內核下載2. 下載與Linux
    發表于 09-14 06:43

    從I2C寫入系統配置內存失敗可能是什么原因?是否按照正確的程序寫入系統配置

    我正在研究 ST25DV64KC NFC 芯片。我正在嘗試從 i2c 寫入系統配置內存。腳步:1) 我通過發送當前密碼命令打開了 i2c 安全會話。我已經從動態寄存器內存中讀取
    發表于 12-08 08:16

    MP4播放器系統配置

    MP4播放器系統配置              系統配
    發表于 12-21 16:29 ?2134次閱讀

    LPC111x系統配置

    LPC111x系統配置,有需要的朋友下來看看。
    發表于 01-13 16:04 ?15次下載

    FPGA最小系統配置電路的設計

    FPGA最小系統配置電路的設計,有興趣的同學可以下載學習
    發表于 05-04 11:31 ?37次下載

    《微機原理與匯編語言》應用系統配置及接口技術

    《微機原理與匯編語言》應用系統配置及接口技術
    發表于 12-12 22:07 ?0次下載

    ABB機器人系統配置cclink課件下載

    ABB機器人系統配置cclink課件下載
    發表于 05-19 09:36 ?3次下載

    FPGA CPLD可編程邏輯器件的在系統配置方法

    FPGA CPLD可編程邏輯器件的在系統配置方法(深圳市村田電源技術有限公司)-FPGA CPLD可編程邏輯器件的在系統配置方法? ? ? ? ? ? ? ? ? ?
    發表于 09-18 10:51 ?13次下載
    FPGA CPLD可編程邏輯器件的在<b class='flag-5'>系統配置</b>方法

    通信電源系統配置設計參數

    通信電源系統配置設計參數(安徽力普拉斯電源技術有限公司招聘)-該文檔為通信電源系統配置設計參數總結文檔,是一份不錯的參考資料,感興趣的可以下載看看,,,,,,,,,,,,,,,,,
    發表于 09-22 16:41 ?4次下載
    通信電源<b class='flag-5'>系統配置</b>設計參數

    服務器Linux系統配置IP地址的方法

    服務器Linux系統配置IP地址的方法。
    的頭像 發表于 09-21 14:50 ?8975次閱讀

    簡單的菜單系統配置開源設計

    電子發燒友網站提供《簡單的菜單系統配置開源設計.zip》資料免費下載
    發表于 06-09 10:31 ?0次下載
    簡單的菜單<b class='flag-5'>系統配置</b>開源設計

    C2000系統配置應用說明

    電子發燒友網站提供《C2000系統配置應用說明.pdf》資料免費下載
    發表于 09-14 10:12 ?0次下載
    C2000<b class='flag-5'>系統配置</b>應用說明
    主站蜘蛛池模板: 国产国拍亚洲精品mv在线观看 | 色网站在线观看 | 干干人人| 婷婷综合激情 | 天天操夜夜操狠狠操 | 五月婷婷基地 | 国产精品资源在线观看网站 | 宅男午夜视频在线观看 | 毛片在线播 | 亚洲一区亚洲二区 | 日本黄页网 | 欧美人成a视频www | 亚州视频一区 | 免费h视频在线观看 | 成人三级在线播放线观看 | 九色亚洲| 天天操丝袜 | 国产福利你懂的 | 国产精品午夜久久久久久99热 | 天堂影院jav成人天堂免费观看 | 亚洲性久久久影院 | 亚洲欧美日韩在线观看你懂的 | 国产一区二区三区免费大片天美 | 国产91小视频在线观看 | 国产大乳孕妇喷奶水在线观看 | 亚洲成a人片毛片在线 | 欧美3d成人动画在线 | h文 超乳 奶水 | 亚洲午夜视频在线观看 | 日本特黄特色大片免费播放视频 | 欧美成网 | 天天干天天爱天天操 | 日本黄大片在线观看 | 日韩欧美黄色 | 老司机精品视频免费 | 欧美人成一本免费观看视频 | 全国最大色成免费网站 | 天天撸夜夜操 | 色极影院 | 91高清在线成人免费观看 | 亚洲午夜小视频 |