色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

UART的發(fā)送數(shù)據(jù)模塊與接收模塊

FPGA之家 ? 來(lái)源:FPGA之家 ? 作者:FPGA之家 ? 2022-07-01 17:08 ? 次閱讀

UART

Uart比較簡(jiǎn)單,所以僅對(duì)tx作比較詳細(xì)的注釋,但里面一些內(nèi)容還是值得新手學(xué)習(xí)的

1開始位(低電平)+8位數(shù)據(jù)+1停止位(高電平,這里選的是一個(gè)周期高電平,也可兩個(gè))(無(wú)校驗(yàn)位)

1、prescale是完成一個(gè)bit需要主時(shí)鐘計(jì)數(shù)的次數(shù)(其和主時(shí)鐘以及波特率之間的關(guān)系參考網(wǎng)上文章)

2、進(jìn)入uart模塊的異步信號(hào),最好使用提供的同步器同步

3、異步復(fù)位信號(hào)最好使用提供的同步器同步

4、波特率任意選,只要時(shí)鐘夠大,能夠符合誤碼率計(jì)算即可,這里使用的是125Mhz

5、基本的思想就是移位

6、傳輸條件就是握手

7、如果使用Xlinx的片子,建議使用全局時(shí)鐘資源(IBUFG后面連接BUFG的方法是最基本的全局時(shí)鐘資源的使用方法)

8、這個(gè)完整的代碼就是使用IBUFG+BUFG

9、傳輸雖然簡(jiǎn)單,但對(duì)于新手來(lái)講,還是有挺多的知識(shí)點(diǎn)值得學(xué)習(xí)的點(diǎn)

10、公眾號(hào)只是對(duì)代碼進(jìn)行了簡(jiǎn)單注釋

UART的發(fā)送數(shù)據(jù)模塊

// 歡迎大家關(guān)注公眾號(hào):AriesOpenFPGA// Q群:808033307// Language: Verilog 2001
// 代碼注釋有些匆忙,如有錯(cuò)誤注釋還請(qǐng)批評(píng),僅作參考// UART// 1開始位+8位數(shù)據(jù)+1停止位(無(wú)校驗(yàn))// prescale是完成一個(gè)bit需要主時(shí)鐘計(jì)數(shù)的次數(shù)(其和主時(shí)鐘以及波特率之間的關(guān)系參考網(wǎng)上文章)// 進(jìn)入uart模塊的異步信號(hào),最好使用提供的同步器同步// 異步復(fù)位信號(hào)最好使用提供的同步器同步// 波特率任意選,只要時(shí)鐘夠大,能夠符合誤碼率計(jì)算即可,這里使用的是125M// 基本的思想就是移位// 傳輸條件就是握手// 如果使用Xlinx的片子,建議使用全局時(shí)鐘資源(IBUFG后面連接BUFG的方法是最基本的全局時(shí)鐘資源的使用方法)// 這個(gè)完整的代碼就是使用IBUFG+BUFG// 傳輸雖然簡(jiǎn)單,但對(duì)于新手來(lái)講,還是有挺多的知識(shí)點(diǎn)值得學(xué)習(xí)的// 公眾號(hào)只是對(duì)代碼進(jìn)行了簡(jiǎn)單注釋`timescale 1ns / 1ps/* AXI4-Stream UART */module uart_tx #(    parameter DATA_WIDTH = 8)(    input  wire                   clk,           // 系統(tǒng)時(shí)鐘    input  wire                   rst,           // 復(fù)位信號(hào)
   /* AXI input */    input  wire [DATA_WIDTH-1:0]  s_axis_tdata,  // 輸入到這個(gè)模塊準(zhǔn)備發(fā)送出去的數(shù)據(jù)    input  wire                   s_axis_tvalid, // 有數(shù)據(jù)要輸入到這個(gè)模塊    output wire                   s_axis_tready, // 該模塊準(zhǔn)備好接收數(shù)據(jù)
    output wire                   txd,     // UART interface    output wire                   busy,    // Status 線忙    input  wire [15:0]            prescale // Configuration 預(yù)分度);
reg s_axis_tready_reg = 0;reg txd_reg           = 1;reg busy_reg          = 0;
reg [DATA_WIDTH:0] data_reg = 0;reg [18:0] prescale_reg     = 0;reg [3:0] bit_cnt           = 0;
assign s_axis_tready = s_axis_tready_reg;assign txd           = txd_reg;assign busy          = busy_reg;
always @(posedge clk) begin    if (rst)         begin            s_axis_tready_reg <= 0;  // 從機(jī)沒有準(zhǔn)備好發(fā)送            txd_reg           <= 1;  // 發(fā)送線拉高            prescale_reg      <= 0;  //             bit_cnt           <= 0;  // 位計(jì)數(shù)器初始化為0            busy_reg          <= 0;  // 復(fù)位后為不忙狀態(tài)        end    else         begin            if (prescale_reg > 0)                 begin                    s_axis_tready_reg <= 0;                    prescale_reg      <= prescale_reg - 1;                end             else if (bit_cnt == 0)     //比特計(jì)數(shù)器為0                begin                    s_axis_tready_reg <= 1;   // 從機(jī)把ready信號(hào)拉高                    busy_reg          <= 0;   // 忙信號(hào)拉低無(wú)效                    if (s_axis_tvalid)        // 如果從機(jī)準(zhǔn)備好接收數(shù)據(jù)                        begin                            s_axis_tready_reg <= !s_axis_tready_reg;   //                             prescale_reg      <= (prescale << 3)-1;    //                             bit_cnt           <= DATA_WIDTH+1;         // 一共10次計(jì)數(shù)                            data_reg          <= {1'b1, s_axis_tdata}; //                             txd_reg           <= 0;                    // 起始位0(起始位tx拉低,停止位拉高)                            busy_reg          <= 1;                    // 開始傳輸后,傳輸線進(jìn)入忙狀態(tài)                        end                end             else                 begin                    if (bit_cnt > 1)   //                         begin                            bit_cnt             <= bit_cnt - 1;                            prescale_reg        <= (prescale << 3)-1;  // 經(jīng)過(guò)(prescale << 3)-1次的系統(tǒng)時(shí)鐘計(jì)數(shù),完成一位的移位                            {data_reg, txd_reg} <= {1'b0, data_reg};   // 移位操作                        end                     else if (bit_cnt == 1)                          begin                            bit_cnt      <= bit_cnt - 1;                            prescale_reg <= (prescale << 3);                              txd_reg      <= 1;                // 停止位1                        end                end        end end
endmodule

UART的接收模塊(不詳細(xì)講解)

// Language: Verilog 2001
`timescale 1ns / 1ps
/* * AXI4-Stream UART */module uart_rx #(    parameter DATA_WIDTH = 8)(    input  wire                   clk,    input  wire                   rst,
  /* AXI output */    output wire [DATA_WIDTH-1:0]  m_axis_tdata,    output wire                   m_axis_tvalid,    input  wire                   m_axis_tready,      /* UART interface */    input  wire                   rxd,      /* Status */         output wire                   busy,    output wire                   overrun_error,    output wire                   frame_error,      /* Configuration */    input  wire [15:0]            prescale
);
reg [DATA_WIDTH-1:0] m_axis_tdata_reg = 0;reg m_axis_tvalid_reg = 0;
reg rxd_reg = 1;
reg busy_reg = 0;reg overrun_error_reg = 0;reg frame_error_reg = 0;
reg [DATA_WIDTH-1:0] data_reg = 0;reg [18:0] prescale_reg = 0;reg [3:0] bit_cnt = 0;
assign m_axis_tdata = m_axis_tdata_reg;assign m_axis_tvalid = m_axis_tvalid_reg;
assign busy = busy_reg;assign overrun_error = overrun_error_reg;assign frame_error = frame_error_reg;
always @(posedge clk) begin    if (rst) // 初始化各種參數(shù)           begin                           m_axis_tdata_reg <= 0;            m_axis_tvalid_reg <= 0;            rxd_reg <= 1;            prescale_reg <= 0;            bit_cnt <= 0;            busy_reg <= 0;            overrun_error_reg <= 0;            frame_error_reg <= 0;        end     else         begin            rxd_reg <= rxd;            overrun_error_reg <= 0;            frame_error_reg <= 0;
        if (m_axis_tvalid && m_axis_tready) // 準(zhǔn)備有數(shù)據(jù)要發(fā)以及準(zhǔn)被好發(fā)            begin                 m_axis_tvalid_reg <= 0;            end
        if (prescale_reg > 0) //             begin                                prescale_reg <= prescale_reg - 1;            end                     else if (bit_cnt > 0)             begin                if (bit_cnt > DATA_WIDTH+1)                     begin                        if (!rxd_reg)  // 實(shí)際的read為0時(shí),開始計(jì)數(shù)bit                            begin                                               bit_cnt <= bit_cnt - 1;                                prescale_reg <= (prescale << 3)-1;  //prescale是16位移3位減1位,因?yàn)閜rescale_reg                            end                         else                             begin                                bit_cnt <= 0;                                prescale_reg <= 0;                            end                    end                                 else if (bit_cnt > 1)                     begin                        bit_cnt <= bit_cnt - 1;                        prescale_reg <= (prescale << 3)-1;                        data_reg <= {rxd_reg, data_reg[DATA_WIDTH-1:1]};                    end                                 else if (bit_cnt == 1)                     begin                        bit_cnt <= bit_cnt - 1;                        if (rxd_reg)                             begin                                m_axis_tdata_reg <= data_reg;                                m_axis_tvalid_reg <= 1;                                overrun_error_reg <= m_axis_tvalid_reg;                            end                         else                             begin                                frame_error_reg <= 1;                            end                    end            end         else             begin                busy_reg <= 0;                if (!rxd_reg)                 begin                    prescale_reg <= (prescale << 2)-2;                    bit_cnt <= DATA_WIDTH + 2;                    data_reg <= 0;                       busy_reg <= 1;                end            end                    endendendmodule

UART頂層

// Language: Verilog 2001
`timescale 1ns / 1ps
/* * AXI4-Stream UART */module uart #(    parameter DATA_WIDTH = 8)(    input  wire                   clk,    input  wire                   rst,
    /*     * AXI input     */    input  wire [DATA_WIDTH-1:0]  s_axis_tdata,    input  wire                   s_axis_tvalid,    output wire                   s_axis_tready,
    /*     * AXI output     */    output wire [DATA_WIDTH-1:0]  m_axis_tdata,    output wire                   m_axis_tvalid,    input  wire                   m_axis_tready,
    /*     * UART interface     */    input  wire                   rxd,    output wire                   txd,
    /*     * Status     */    output wire                   tx_busy,    output wire                   rx_busy,    output wire                   rx_overrun_error,    output wire                   rx_frame_error,
    /*     * Configuration     */    input  wire [15:0]            prescale
);
uart_tx #(    .DATA_WIDTH(DATA_WIDTH))uart_tx_inst (    .clk(clk),    .rst(rst),    // axi input    .s_axis_tdata(s_axis_tdata),    .s_axis_tvalid(s_axis_tvalid),    .s_axis_tready(s_axis_tready),    // output    .txd(txd),    // status    .busy(tx_busy),    // configuration    .prescale(prescale));
uart_rx #(    .DATA_WIDTH(DATA_WIDTH))uart_rx_inst (    .clk(clk),    .rst(rst),    // axi output    .m_axis_tdata(m_axis_tdata),    .m_axis_tvalid(m_axis_tvalid),    .m_axis_tready(m_axis_tready),    // input    .rxd(rxd),    // status    .busy(rx_busy),    .overrun_error(rx_overrun_error),    .frame_error(rx_frame_error),    // configuration    .prescale(prescale));
endmodule

同步(異步復(fù)位)模塊

// Language: Verilog-2001// 很常用的模塊`timescale 1 ns / 1 ps
/* * Synchronizes an active-high asynchronous reset signal to a given clock by * using a pipeline of N registers. */module sync_reset #(    parameter N=2 // depth of synchronizer)(    input wire clk,    input wire rst,    output wire sync_reset_out);
reg [N-1:0] sync_reg = {N{1'b1}};
assign sync_reset_out = sync_reg[N-1];
always @(posedge clk or posedge rst) begin    if (rst)        sync_reg <= {N{1'b1}};    else        sync_reg <= {sync_reg[N-2:0], 1'b0};end
endmodule

同步(異步信號(hào))模塊

// Language: Verilog-2001//很常用的模塊`timescale 1 ns / 1 ps
/* * Synchronizes an asyncronous signal to a given clock by using a pipeline of * two registers. */module sync_signal #(    parameter WIDTH=1, // width of the input and output signals    parameter N=2 // depth of synchronizer)(    input wire clk,    input wire [WIDTH-1:0] in,    output wire [WIDTH-1:0] out);
reg [WIDTH-1:0] sync_reg[N-1:0];
/* * The synchronized output is the last register in the pipeline. */assign out = sync_reg[N-1];
integer k;
always @(posedge clk) begin    sync_reg[0] <= in;    for (k = 1; k < N; k = k + 1) begin        sync_reg[k] <= sync_reg[k-1];    endend
endmodule

原文標(biāo)題:Uart協(xié)議及Verilog代碼

文章出處:【微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 接收模塊
    +關(guān)注

    關(guān)注

    1

    文章

    22

    瀏覽量

    10584
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1249

    瀏覽量

    102525
  • 同步器
    +關(guān)注

    關(guān)注

    1

    文章

    101

    瀏覽量

    14916
  • 數(shù)據(jù)模塊
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    9819

原文標(biāo)題:Uart協(xié)議及Verilog代碼

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于uart模塊的問(wèn)題

    本人對(duì)于uart串口通訊理解比較混亂,不知道設(shè)計(jì)的uart接收模塊發(fā)送模塊應(yīng)該怎么連接,串口通
    發(fā)表于 12-18 10:47

    UART模塊接收到的數(shù)據(jù)無(wú)法顯示

    /GPS模塊分配PIN P0.2和P0.3。我試圖在GPS/GSM模塊上顯示筆記本電腦的超級(jí)終端接收數(shù)據(jù)。但是屏幕顯示只在膝上型UART
    發(fā)表于 10-11 14:04

    如何使用Assembly和pic16f877從兩個(gè)發(fā)送接收UART數(shù)據(jù)

    親愛的大家,我試圖通過(guò)以下模式使用xbee模塊發(fā)送接收數(shù)據(jù)。通過(guò)UART數(shù)據(jù)
    發(fā)表于 04-13 10:07

    怎么用UART發(fā)送接收數(shù)據(jù)

    的按鈕,電話應(yīng)用程序?qū)?b class='flag-5'>數(shù)據(jù)通過(guò)藍(lán)牙發(fā)送模塊模塊uart發(fā)送到目標(biāo)。目標(biāo)響應(yīng),
    發(fā)表于 04-20 10:07

    Verilog實(shí)現(xiàn)UART之二:發(fā)送模塊

    當(dāng)并行數(shù)據(jù)準(zhǔn)備好后,如果得到發(fā)送指令,則將數(shù)據(jù)UART協(xié)議輸出,先輸出一個(gè)低電平的起始位,然后從低到高輸出8個(gè)數(shù)據(jù)位,接著是可選的奇偶校驗(yàn)
    發(fā)表于 02-09 09:48 ?846次閱讀
    Verilog實(shí)現(xiàn)<b class='flag-5'>UART</b>之二:<b class='flag-5'>發(fā)送</b><b class='flag-5'>模塊</b>

    UART串口WiFi模塊的工作原理及應(yīng)用

    除外),而是直接將數(shù)據(jù)進(jìn)行封裝并發(fā)送。通過(guò)UART接口WiFi模塊,傳統(tǒng)的串口設(shè)備也能輕松接入無(wú)線網(wǎng)絡(luò),適合于各類智能家居或智能硬件中,比如現(xiàn)在很多帶WiFi功能的電視、空調(diào)、冰箱等。
    的頭像 發(fā)表于 01-14 09:27 ?1.1w次閱讀
    <b class='flag-5'>UART</b>串口WiFi<b class='flag-5'>模塊</b>的工作原理及應(yīng)用

    UART的基本協(xié)議與設(shè)計(jì)實(shí)例模塊劃分以及整體實(shí)現(xiàn)概述

    接收控制模塊發(fā)送控制模塊內(nèi)部都有一個(gè)波特率時(shí)鐘產(chǎn)生模塊(BuadRate_set),用于將電路輸入時(shí)鐘(clk)進(jìn)行分頻產(chǎn)生波特率時(shí)鐘,用
    的頭像 發(fā)表于 02-04 11:21 ?4116次閱讀
    <b class='flag-5'>UART</b>的基本協(xié)議與設(shè)計(jì)實(shí)例<b class='flag-5'>模塊</b>劃分以及整體實(shí)現(xiàn)概述

    Android藍(lán)牙編程如何發(fā)送接收16進(jìn)制數(shù)據(jù)

    與藍(lán)牙模塊通信最重要的地方就是數(shù)據(jù)發(fā)送接收,因?yàn)槭堑讓拥牟僮鳎愿嗍?b class='flag-5'>發(fā)送16進(jìn)制數(shù)據(jù)
    發(fā)表于 05-10 18:13 ?2次下載
    Android藍(lán)牙編程如何<b class='flag-5'>發(fā)送</b>和<b class='flag-5'>接收</b>16進(jìn)制<b class='flag-5'>數(shù)據(jù)</b>

    UART發(fā)送數(shù)據(jù)模塊及Verilog代碼

    代碼注釋有些匆忙,如有錯(cuò)誤注釋還請(qǐng)批評(píng),僅作參考 UART Uart比較簡(jiǎn)單,所以僅對(duì)tx作比較詳細(xì)的注釋,但里面一些內(nèi)容還是值得新手學(xué)習(xí)的 1開始位(低電平)+8位數(shù)據(jù)+1停止位(高電平,這里選
    的頭像 發(fā)表于 05-27 18:05 ?2652次閱讀

    STC15F104W 使用 315/433 MHz 超再生模塊發(fā)送/接收數(shù)據(jù)

    STC15F104W 使用 315/433 MHz 超再生模塊發(fā)送/接收數(shù)據(jù)一、原理圖二、發(fā)送端代碼三、
    發(fā)表于 12-17 17:45 ?77次下載
    STC15F104W 使用 315/433 MHz 超再生<b class='flag-5'>模塊</b><b class='flag-5'>發(fā)送</b>/<b class='flag-5'>接收</b><b class='flag-5'>數(shù)據(jù)</b>

    K025 基于51 315(或者433)發(fā)送接收模塊測(cè)試

    2. 接收模塊函數(shù)七.資料獲取一. 實(shí)現(xiàn)功能上電后接收端顯示接收到的數(shù)據(jù)并串口打印出來(lái)注:接收
    發(fā)表于 12-23 19:28 ?17次下載
    K025 基于51 315(或者433)<b class='flag-5'>發(fā)送</b>和<b class='flag-5'>接收</b><b class='flag-5'>模塊</b>測(cè)試

    使用STM32的射頻模塊以無(wú)線方式發(fā)送接收數(shù)據(jù)

    在這里,我們將連接一個(gè) 433MHz 射頻無(wú)線模塊與 STM32F103C8 微控制器。該項(xiàng)目分為兩部分。發(fā)送器將與 STM32 連接,接收器將與 Arduino UNO 連接。發(fā)射和接收
    的頭像 發(fā)表于 09-06 16:00 ?5571次閱讀
    使用STM32的射頻<b class='flag-5'>模塊</b>以無(wú)線方式<b class='flag-5'>發(fā)送</b>和<b class='flag-5'>接收</b><b class='flag-5'>數(shù)據(jù)</b>

    如何根據(jù)UART傳輸協(xié)議將數(shù)據(jù)發(fā)送出去呢?

    接收部分相反,UART發(fā)送數(shù)據(jù)部分是CPU將需要發(fā)送數(shù)據(jù)寫到
    的頭像 發(fā)表于 06-05 15:59 ?2977次閱讀
    如何根據(jù)<b class='flag-5'>UART</b>傳輸協(xié)議將<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>發(fā)送</b>出去呢?

    433模塊發(fā)送接收 433無(wú)線模塊使用方法

    433模塊是一種常用的無(wú)線通信模塊,用于實(shí)現(xiàn)短距離無(wú)線通信。在433模塊中,一般有發(fā)送接收兩種模式。
    發(fā)表于 06-12 17:41 ?1.4w次閱讀

    芯片設(shè)計(jì)中的UART模塊及其關(guān)鍵技術(shù)介紹

    在芯片設(shè)計(jì)中,UART(Universal Asynchronous Receiver/Transmitter,通用異步接收/發(fā)送器)模塊是一個(gè)非常重要的外設(shè)
    的頭像 發(fā)表于 10-09 14:10 ?1678次閱讀
    主站蜘蛛池模板: 中文字幕在线不卡日本v二区 | 无码日本亚洲一区久久精品 | 久久是热频国产在线 | 我不卡影院手机在线观看 | 成品片a免人看免费 | 四虎影5151毛片在线看 | 教室眠催白丝美女校花 | 91久久偷偷看嫩草影院无费 | 日韩 国产 欧美视频二区 | 女性爽爽影院免费观看 | 国产69精品久久久久乱码免费 | 在线播放无码字幕亚洲 | 亚洲精品久久久992KVTV | jaPanesmature儿母 japanese幼儿videos | 无码丰满人妻熟妇区 | 亚洲国产成人在线视频 | 99视频国产在线 | 国产在线观看香蕉视频 | 调教女M屁股撅虐调教 | 秋霞电影网视频一区二区三区 | 欧美一道本一区二区三区 | 欧美夜夜噜2017最新 | 俄罗斯美幼 | 久久久青青 | 亚洲国产高清视频在线观看 | 亚洲AV久久无码精品九号 | 99久久久免费精品国产 | 九九热这里只有精品视频免费 | 理论片午午伦夜理片I | 亚洲A片不卡无码久久尤物 亚洲a免费 | 日本精品无码久久久久APP | 妈妈的朋友6未删减版完整在线 | 国产又色又爽又刺激在线播放 | 欧美卡1卡2卡三卡2021精品 | 久久精品天天中文字幕 | 久久精品国产免费 | 不卡一区二区高清观看视频 | 入禽太深免费高清在线观看5 | 午夜精品久久久久久99热蜜桃 | 国产成人无码精品久久久影院 | 99福利视频 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品