日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

Uart協(xié)議及Verilog代碼

FPGA之家 ? 來源:FPGA之家 ? 作者:FPGA之家 ? 2022-07-31 10:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

代碼注釋有些匆忙,如有錯誤注釋還請批評,僅作參考

UART

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

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

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

2、進入uart模塊的異步信號,最好使用提供的同步器同步

3、異步復位信號最好使用提供的同步器同步

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

5、基本的思想就是移位

6、傳輸條件就是握手

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

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

9、傳輸雖然簡單,但對于新手來講,還是有挺多的知識點值得學習的點

10、公眾號只是對代碼進行了簡單注釋

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


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


// 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) // 準備有數(shù)據(jù)要發(fā)以及準被好發(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)  // 實際的read為0時,開始計數(shù)bit                            begin                                               bit_cnt <= bit_cnt - 1;                                prescale_reg <= (prescale << 3)-1;  //prescale是16位移3位減1位,因為prescale_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

同步(異步復位)模塊


// 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

同步(異步信號)模塊


// 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

審核編輯 :李倩


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

    關(guān)注

    31

    文章

    1374

    瀏覽量

    114741
  • uart
    +關(guān)注

    關(guān)注

    22

    文章

    1322

    瀏覽量

    107035
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74431

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    UART數(shù)據(jù)轉(zhuǎn)發(fā)芯片 多接口可配置

    uart
    穩(wěn)控自動化
    發(fā)布于 :2026年04月10日 10:46:12

    UART的缺點介紹

    限制。例如,標準 UART 接口可能支持每秒 115200 位的最大速度(波特率),這對于某些高速應(yīng)用(如實時系統(tǒng)或高速數(shù)據(jù)記錄)可能不夠。在這種情況下,替代通信協(xié)議或更高速的接口(例如 SPI 或以太網(wǎng))可能更合適。
    發(fā)表于 11-27 06:36

    UART 串口通信還能玩出什么花樣?

    還記得打印機、鼠標和調(diào)制解調(diào)器曾經(jīng)使用粗線和笨重連接器嗎?那些必須擰進電腦里的連接器?這些設(shè)備很可能使用UART與電腦通信。雖然USB幾乎完全取代了那些老式的線纜和連接器,但UART絕非過時之物。你
    的頭像 發(fā)表于 11-24 19:05 ?586次閱讀
    <b class='flag-5'>UART</b> 串口通信還能玩出什么花樣?

    UART、SPI、I2C 實戰(zhàn)對比:哪個更適合你的項目?

    在嵌入式開發(fā)中,設(shè)備之間的通信是繞不開的話題。常見的三種總線接口——UART、SPI、I2C——各有優(yōu)缺點。不同項目需求決定了選擇哪一種協(xié)議最合適。本文結(jié)合實戰(zhàn)經(jīng)驗,逐項對比三者,并附帶實戰(zhàn)代碼
    的頭像 發(fā)表于 11-24 19:04 ?1645次閱讀
    <b class='flag-5'>UART</b>、SPI、I2C 實戰(zhàn)對比:哪個更適合你的項目?

    SPI、I2C、I2S、UART:通信協(xié)議解釋

    ? ? ? ? 在嵌入式開發(fā)中,最常用的幾種通信接口無非就是SPI、I2C、I2S、UART。名字看起來差不多,但應(yīng)用場景和特性卻大不相同。為什么都叫串行通信,結(jié)構(gòu)卻不一樣?為什么有的能傳音頻,有的
    的頭像 發(fā)表于 11-18 10:53 ?762次閱讀

    SPI、I2C、I2S、UART:通信協(xié)議對比表

    在嵌入式開發(fā)中,最常用的幾種通信接口無非就是SPI、I2C、I2S、UART。名字看起來差不多,但應(yīng)用場景和特性卻大不相同。很多初學者容易混淆:為什么都叫串行通信,結(jié)構(gòu)卻不一樣?為什么有的能傳音頻
    的頭像 發(fā)表于 11-17 10:53 ?2197次閱讀
    SPI、I2C、I2S、<b class='flag-5'>UART</b>:通信<b class='flag-5'>協(xié)議</b>對比表

    多路UART數(shù)據(jù)轉(zhuǎn)發(fā)芯片 支持1主4從UART接口 UART擴展芯片

    UART接口
    穩(wěn)控自動化
    發(fā)布于 :2025年11月13日 13:27:11

    如何使用FPGA實現(xiàn)SRIO通信協(xié)議

    本例程詳細介紹了如何在FPGA上實現(xiàn)Serial RapidIO(SRIO)通信協(xié)議,并通過Verilog語言進行編程設(shè)計。SRIO作為一種高速、低延遲的串行互連技術(shù),在高性能計算和嵌入式系統(tǒng)中廣
    的頭像 發(fā)表于 11-12 14:38 ?6125次閱讀
    如何使用FPGA實現(xiàn)SRIO通信<b class='flag-5'>協(xié)議</b>

    多路UART數(shù)據(jù)轉(zhuǎn)發(fā)芯片 支持1主4從UART接口 UART擴展芯片

    多路UART數(shù)據(jù)轉(zhuǎn)發(fā)芯片 支持1主4從UART接口 UART擴展芯片 EU104 是一款高性能 UART 數(shù)據(jù)轉(zhuǎn)發(fā)芯片,采用 SOP16 緊湊封裝,工作電壓范圍為 2.0V 至 5.5
    的頭像 發(fā)表于 11-12 10:33 ?583次閱讀

    基于Hbird-e-sdk Linux環(huán)境下使用Uart0 對串口進行輸入的軟件代碼參考

    本次代碼是基于hbird-e-sdk下software參考示例demo_gpio的中斷代碼實現(xiàn)相應(yīng)更改,然后通過蜂鳥調(diào)試器連接的UART0實現(xiàn)對串口的輸入(PC/LINUX) 一.軟件頭文件修改
    發(fā)表于 10-31 06:32

    蜂鳥E203與電腦實現(xiàn)UART通信實現(xiàn)代碼并實現(xiàn)上位機控制代碼分享

    這里想和大家分享一下蜂鳥E203與電腦的UART通信代碼,并通過UART實現(xiàn)上位機控制。 電腦端UART代碼: #include "
    發(fā)表于 10-28 06:40

    TI DMD代碼

    最近要開發(fā)DLPLCRC410EVM,想問問大家有沒示例HDL代碼,最好是verilog代碼,從翻網(wǎng)頁也發(fā)現(xiàn)實際上是有的,但是不知道為啥官網(wǎng)沒有下載代碼的地方,求求
    發(fā)表于 09-29 17:40

    JEDSD204B標準verilog實現(xiàn)-協(xié)議演進

    JEDSD204B標準verilog實現(xiàn)3-協(xié)議演進 本文對204協(xié)議的演進、子類的差異進行簡要說明,后續(xù)將直接開始數(shù)據(jù)流的處理和實現(xiàn),對協(xié)議要求的電器特性感興趣的小伙伴自行查看
    發(fā)表于 09-05 21:18

    uart接收功能不工作是怎么回事?

    我正在 TL989x 系列開發(fā)板上工作,示例代碼UART 發(fā)送和接收功能中起作用,發(fā)送功能可以工作但接收功能不工作,因此請給我 UART 接收功能的示例代碼。
    發(fā)表于 07-18 08:13

    芯知識|廣州唯創(chuàng)電子語音芯片UART通信協(xié)議解析:發(fā)碼長度與校驗碼計算

    一、UART通信協(xié)議概述UART(通用異步收發(fā)器)是一種廣泛應(yīng)用于嵌入式系統(tǒng)的串行通信協(xié)議,其核心特點為無需時鐘同步,通過起始位、數(shù)據(jù)位、校驗位和停止位構(gòu)成數(shù)據(jù)幀。在語音芯片應(yīng)用中,
    的頭像 發(fā)表于 05-27 08:48 ?924次閱讀
    芯知識|廣州唯創(chuàng)電子語音芯片<b class='flag-5'>UART</b>通信<b class='flag-5'>協(xié)議</b>解析:發(fā)碼長度與校驗碼計算
    阳高县| 桐庐县| 古交市| 中卫市| 平利县| 屯昌县| 通山县| 澄城县| 博客| 周宁县| 云霄县| 惠安县| 慈利县| 唐海县| 普安县| 浦县| 佛山市| 岑溪市| 辽宁省| 玛纳斯县| 卢湾区| 张家口市| 夏河县| 当涂县| 河北省| 获嘉县| 康平县| 怀集县| 缙云县| 嘉禾县| 灵山县| 宝坻区| 方城县| 富平县| 工布江达县| 宣武区| 彭阳县| 镇康县| 衡阳市| 洪江市| 包头市|