• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于FPGA的CPU與保密機之間的UART通信設計

      2021-09-13 08:51李淼李娟娟
      無線互聯科技 2021年14期

      李淼 李娟娟

      摘 要:在衛(wèi)星通信系統(tǒng)的信道加密業(yè)務中,通常使用FPGA的UART通信實現CPU與保密機之間的交互。文章介紹的UART通信模塊,是一種新穎的串口發(fā)送和接收的FPGA設計,僅由Verilog中簡單的always塊就能實現,證明此方法的操作簡單且實用性強。仿真測試驗證收發(fā)模塊可實現可靠的全雙工串口通信,更容易滿足實際設計的需求。

      關鍵詞:FPGA;UART通信;always塊

      0 引言

      在衛(wèi)星通信系統(tǒng)的加密業(yè)務中,CPU通過發(fā)送不同指令控制/查詢保密機的同時,保密機又要向CPU上報狀態(tài),由FPGA實現UART串口功能(Universal Asynchronous Receiver/Transmitter)是它們之間通信的一種常用方式,UART將要傳輸的信息在串行通信與并行通信之間加以轉換[1-3]。其處理方式是FPGA采用狀態(tài)機設計,并在每一位數據的中點進行數據采樣[4-5]。本文設計的基于FPGA的UART通信模塊,省去了16倍波特率時鐘和復雜的狀態(tài)機,可實現同樣的串口功能及性能。

      FPGA在CPU與保密機之間的串行通信接口電路的設計采用了自頂而下的設計方法,主要分為UART發(fā)送模塊、UART接收模塊兩大模塊。

      1 UART發(fā)送模塊設計

      當CPU控制/查詢保密機狀態(tài)時,在固定波特率? ? ? ?(38 400 Hz)下,FPGA將CPU發(fā)送的控制信令轉化成UART幀數據格式串行數據流發(fā)送給保密機,UART串口發(fā)送時序如圖1所示。

      根據圖1設計了串口發(fā)送程序,偽代碼示例如下,其中系統(tǒng)主時鐘為60 MHz,波特率為? ? ? ? ?38 400 Hz,且使能uart_en與數據uart_din對齊,并均與主時鐘上升沿對齊。

      parameter CLK_FREQ = 60_000_000;//主時鐘parameter UART_BPS = 38400;//波特率

      parameter BPS_CNT = CLK_FREQ/UART_BPS;

      //找到使能uart_en的上升沿

      assign en_flag =( ~ uart_en_d1 ) & uart_en_d0;

      uart_en_d0 <= uart_en;

      uart_en_d1 <= uart_en_d0;

      //通過計數器控制tx_flag的長度為9.5個波特率周期

      if ( en_flag )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?tx_flag <= 1d1;

      else if ( ( tx_cnt == 4d9 ) && ( clk_cnt == BPS_CNT/2 - 1b1 ) )? ?tx_flag <= 1d0;

      //一個波特率周期

      if ( tx_flag & clk_cnt < BPS_CNT - 1b1 )? ? ? ? ? ? ? ? ? ? ?clk_cnt <= clk_cnt + 1d1;

      //串口一次發(fā)送的比特數

      if ( tx_flag & clk_cnt == BPS_CNT - 1b1 )? ? ? ? ? ? ? ? ? ? tx_cnt <= tx_cnt + 1d1;

      //輸出串口數據及起始位和停止位

      if ( tx_flag && ( clk_cnt == 16d0 ) )

      case ( tx_cnt )

      4d0 : uart_txd <= 1d0;4d1 : uart_txd <= tx_data[0];4d2 : uart_txd <= tx_data[1];

      4d3 : uart_txd <= tx_data[2];4d4 : uart_txd <= tx_data[3];4d5 : uart_txd <= tx_data[4];

      4d6 : uart_txd <= tx_data[5];4d7 : uart_txd <= tx_data[6];4d8 : uart_txd <= tx_data[7];

      4d9 : uart_txd <= 1d1;

      根據接口時序要求:首先,將計數器clk_cnt對主時鐘計數,并計數到波特率周期后清零,即在0 ~ BPS_CNT-1范圍內循環(huán)計數。其次,tx_flag作為串口輸出數據使能,故在數據使能uart_en上升沿置高,然后在滿足條件(tx_cnt == 4d9 & clk_cnt == BPS_CNT/2 - 1b1)時置低,此時正好滿足tx_flag長度為9.5個波特率周期;其中tx_cnt在0~9計數,為保證每次計數為1bit有效數據寬度,tx_cnt僅在(clk_cnt == BPS_CNT - 1b1),即一個波特率周期時累加。最后,在計數器tx_cnt為0~9時依次輸出起始位(0)、8位數據位(從低到高)、停止位(1)。

      2 UART接收模塊設計

      當CPU查詢保密機狀態(tài)后,為接收保密機發(fā)送的UART串行數據,可通過FPGA捕獲保密機發(fā)送UART串行數據,根據UART串口接收時序(見圖2),串轉并得到的數據發(fā)送給CPU。

      由圖2可知,在一定波特率下,FPGA根據UART串口接收時序依次采集起始位、數據位、停止位。設計的串口接收程序偽代碼示例如下:

      parameter CLK_FREQ = 60_000_000;//主時鐘parameter UART_BPS = 38400;//波特率

      parameter BPS_CNT = CLK_FREQ/UART_BPS;

      //找到串口數據uart_rxd的下降沿

      assign start_flag = uart_rxd_d1 & ( ~uart_rxd_d0 );

      uart_rxd_d0 <= uart_rxd;

      uart_rxd_d1 <= uart_rxd_d0;

      //通過計數器控制rx_flag的長度為9.5個波特率周期

      if ( start_flag )? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rx_flag <= 1d1;

      else if ( ( rx_cnt == 4d9 ) && ( clk_cnt == BPS_CNT/2 - 1b1 ) )? ? rx_flag <= 1d0;

      //一個波特率周期

      if ( rx_flag &clk_cnt < BPS_CNT - 1b1 )? ? ? ? ? ? ? ? ? ? ? ?clk_cnt <= clk_cnt + 1d1;

      ////串口一次接收的比特數

      if ( rx_flag & clk_cnt == BPS_CNT - 1b1 )? ? ? ? ? ? ? ? ? ? ? rx_cnt <= rx_cnt + 1d1;

      //在中點采集數據

      if ( rx_flag && ( clk_cnt == BPS_CNT/2 ) )

      case ( rx_cnt )

      4d1 : rx_data[0] <= uart_rxd_d1;4d2 : rx_data[1] <= uart_rxd_d1;

      4d3 : rx_data[2] <= uart_rxd_d1;4d4 : rx_data[3] <= uart_rxd_d1;

      4d5 : rx_data[4] <= uart_rxd_d1;4d6 : rx_data[5] <= uart_rxd_d1;

      4d7 : rx_data[6] <= uart_rxd_d1;4d8 : rx_data[7] <= uart_rxd_d1;

      //輸出串口接收完成標志uart_done

      if ( rx_cnt == 4d9 )? ? ? ? ? ? ? ? ? ? ?uart_done <= 1d1;

      uart_data <= rx_data;

      根據接口時序要求:首先,通過uart_rx的下降沿start_flag捕獲串口的起始位start bit,并同時將串口接收使能rx_flag置高,經過9.5個波特率周期后(rx_cnt == 4d9 & clk_cnt == BPS_CNT/2 - 1b1)置低,其中rx_cnt和clk_cnt兩個計數器與發(fā)送端保持一致。其次,在rx_cnt為1~8時,同時滿足在一個波特率周期的中點(clk_cnt == BPS_CNT/2)位置時,進行串口數據的采樣,采樣順序為從低位到高位。最后,在停止位處(rx_cnt == 4d9),輸出接收數據和捕獲使能信號送給CPU。

      3 仿真測試

      為了驗證2個UART串口測試模塊的準確性,搭建仿真自環(huán)的條件,即將串口接收模塊完成標志uart_done的下降沿作為串口發(fā)送模塊的發(fā)送標志,仿真結果如圖3所示。模擬發(fā)送3幀數據(0x7E,0x33,0x55)由UART發(fā)送模塊接收,并轉串后直接給接收模塊,可以看出在串口接收模塊uart_data解碼輸出的3幀數據與模擬輸入數據一致,說明UART串口收發(fā)模塊通信正確。

      4 結語

      本文介紹了一種基于FPGA實現CPU與保密機之間的UART模塊設計,通過UART接口協議,分別設計了FPGA的UART串口發(fā)送時序和UART串口接收時序,采用簡單的always塊就實現了收發(fā)功能。由于采用了一個波特率周期的計數器,接收模塊可在每個串行數據的中點進行采樣,保證了數據傳輸的準確性。最后,通過軟件仿真,進行收發(fā)自環(huán),實現了UART數據的收發(fā)功能,這種簡單可靠的設計對FPGA在uart串口通信的開發(fā)中具有較強的可操作性和應用價值。

      [參考文獻]

      [1]張繼國.一種利用FPGA實現串口通信的設計[J].電子世界,2020(12):124-125.

      [2]朱玉成,董文學.基于FPGA的串口通信電路設計與實現[J].通訊世界,2018(3):41-42.

      [3]王閩.基于FPGA的口通信設計與實現[J].通訊世界,2017(2):52.

      [4]王媛斌.FPGA與PC通信的UART串口設計[J].蘭州工業(yè)學院學報,2020(9):60-65.

      [5]陳孟春.基于有限狀態(tài)機的高速串口通信收發(fā)器的FPGA設計[J].計算機應用與軟件,2017(12):178-183.

      (編輯 姚 鑫)

      庆城县| 历史| 蒙城县| 西峡县| 湘潭市| 丹棱县| 阳朔县| 博湖县| 泰州市| 岑溪市| 章丘市| 武定县| 赤城县| 延庆县| 肇庆市| 永昌县| 东至县| 文山县| 同德县| 石首市| 靖西县| 页游| 兴和县| 双城市| 依兰县| 昌宁县| 新安县| 丽江市| 遂平县| 凤翔县| 隆林| 酒泉市| 花垣县| 常宁市| 甘谷县| 循化| 格尔木市| 凤翔县| 陆河县| 剑河县| 毕节市|