chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

FPGA之家 ? 來源:AriesOpenFPGA ? 作者:AriesOpenFPGA ? 2021-05-27 18:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

UART

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

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

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

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

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

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

5、基本的思想就是移位

6、傳輸條件就是握手

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

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

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

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

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

// 代碼注釋有些匆忙,如有錯誤注釋還請批評,僅作參考// UART// 1開始位+8位數(shù)據(jù)+1停止位(無校驗)// prescale是完成一個bit需要主時鐘計數(shù)的次數(shù)(其和主時鐘以及波特率之間的關(guān)系參考網(wǎng)上文章)// 進入uart模塊的異步信號,最好使用提供的同步器同步// 異步復(fù)位信號最好使用提供的同步器同步// 波特率任意選,只要時鐘夠大,能夠符合誤碼率計算即可,這里使用的是125M// 基本的思想就是移位// 傳輸條件就是握手// 如果使用Xlinx的片子,建議使用全局時鐘資源(IBUFG后面連接BUFG的方法是最基本的全局時鐘資源的使用方法)// 這個完整的代碼就是使用IBUFG+BUFG// 傳輸雖然簡單,但對于新手來講,還是有挺多的知識點值得學(xué)習(xí)的// 公眾號只是對代碼進行了簡單注釋`timescale 1ns / 1ps/* AXI4-Stream UART */module uart_tx #( parameter DATA_WIDTH = 8)( input wire clk, // 系統(tǒng)時鐘 input wire rst, // 復(fù)位信號

/* 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 預(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; // 從機沒有準備好發(fā)送 txd_reg 《= 1; // 發(fā)送線拉高 prescale_reg 《= 0; // bit_cnt 《= 0; // 位計數(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) //比特計數(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

同步(異步復(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

同步(異步信號)模塊

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

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

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

責(zé)任編輯:haq

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

    關(guān)注

    30

    文章

    1368

    瀏覽量

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

    關(guān)注

    30

    文章

    4921

    瀏覽量

    72205

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

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

    請問rt_thread的uart下如何支持9位數(shù)據(jù)發(fā)送和接收?

    目前項目中有使用UART進行數(shù)據(jù)發(fā)送和接收,但是此部分UART比較特殊,其使用9bit進行數(shù)據(jù)傳輸,其中第9位用于指示當前是地位還是
    發(fā)表于 09-28 07:56

    使用設(shè)備驅(qū)動uart數(shù)據(jù)丟幀怎么解決?

    串口中斷處理的時間太長導(dǎo)致的,為了驗證猜想,將波特率從115200改為9600,這時發(fā)送上來的數(shù)據(jù)是完整的,很奇怪,中斷中的代碼很少,600M的主頻不應(yīng)該會出現(xiàn)這個問題。我又在裸機上試了一下
    發(fā)表于 09-26 07:20

    UART在freertos中斷時不接收數(shù)據(jù),怎么解決?

    我使用帶有 freeRTOS 的 nuvoton M453 mcu,一切都工作正常,除了 UART 在中斷時沒有接收數(shù)據(jù)意味著中斷沒有觸發(fā),但我在沒有 RTOS 代碼的情況下也是如此,然后 U
    發(fā)表于 08-15 06:44

    XMC7100 F100K4160AA Uart2 dma實例程序無法運行,使用hal驅(qū)動發(fā)送丟字符并且無法接收怎么解決?

    2.dma_tx初始化代碼 uart2.dma_tx發(fā)送代碼 問題3:按tx同樣的方式配置SCB2 dma_rx,只能在初始化完成觸發(fā)一次CYHAL_DMA_TRANSFER_COM
    發(fā)表于 08-13 06:23

    2025年熱門UART射頻模塊品牌與應(yīng)用案例

    。在眾多射頻模塊中,支持UART(通用異步收發(fā)傳輸器)接口的模塊因其簡單、可靠的特性,廣泛應(yīng)用于數(shù)據(jù)傳輸和設(shè)備通信。 以下是2025年值得關(guān)注的UA
    的頭像 發(fā)表于 07-22 09:42 ?245次閱讀
    2025年熱門<b class='flag-5'>UART</b>射頻<b class='flag-5'>模塊</b>品牌與應(yīng)用案例

    verilog模塊的調(diào)用、任務(wù)和函數(shù)

    在做模塊劃分時,通常會出現(xiàn)這種情形,某個大的模塊中包含了一個或多個功能子模塊,verilog是通過模塊調(diào)用或稱為
    的頭像 發(fā)表于 05-03 10:29 ?1040次閱讀
    <b class='flag-5'>verilog</b><b class='flag-5'>模塊</b>的調(diào)用、任務(wù)和函數(shù)

    為什么無法使用Lpuart_Uart_Ip_ 發(fā)送任何數(shù)據(jù)回調(diào)中的AsyncSend?

    我已經(jīng)實現(xiàn)了基于 LPUART 的 DMA ,我可以發(fā)送使用 Lpuart_Uart_Ip_ 接收的數(shù)據(jù)同步發(fā)送 in lpuart_6_callback , 但是,我無法
    發(fā)表于 04-11 07:51

    UART、MCXA142實現(xiàn)ISP通信的主機端,發(fā)送Ping數(shù)據(jù)包并收到預(yù)期的響應(yīng),發(fā)送和接收數(shù)據(jù)包的典型順序是什么?

    我想為 UART、MCXA142 實現(xiàn) ISP 通信的主機端。我發(fā)送 Ping 數(shù)據(jù)包并收到預(yù)期的響應(yīng)。發(fā)送和接收數(shù)據(jù)包的典型順序是什么?
    發(fā)表于 04-03 08:05

    開源直接用!UDP-UART數(shù)據(jù)透傳來了

    UDP連接將數(shù)據(jù)發(fā)送到遠程設(shè)備,然后將這些數(shù)據(jù)通過UART接口發(fā)送到本地設(shè)備。 這種通信方式在需要將遠程設(shè)備的
    的頭像 發(fā)表于 02-05 17:14 ?471次閱讀
    開源直接用!UDP-<b class='flag-5'>UART</b><b class='flag-5'>數(shù)據(jù)</b>透傳來了

    Verilog 與 ASIC 設(shè)計的關(guān)系 Verilog 代碼優(yōu)化技巧

    Verilog與ASIC設(shè)計的關(guān)系 Verilog作為一種硬件描述語言(HDL),在ASIC設(shè)計中扮演著至關(guān)重要的角色。ASIC(Application Specific Integrated
    的頭像 發(fā)表于 12-17 09:52 ?1322次閱讀

    Verilog 測試平臺設(shè)計方法 Verilog FPGA開發(fā)指南

    Verilog設(shè)計的仿真需求。 編寫測試文件 : 編寫Verilog測試文件,對設(shè)計的各個模塊進行測試。測試文件應(yīng)覆蓋各種情況,包括正
    的頭像 發(fā)表于 12-17 09:50 ?1407次閱讀

    Verilog與VHDL的比較 Verilog HDL編程技巧

    Verilog 與 VHDL 比較 1. 語法和風(fēng)格 VerilogVerilog 的語法更接近于 C 語言,對于有 C 語言背景的工程師來說,學(xué)習(xí)曲線較平緩。它支持結(jié)構(gòu)化編程,代碼
    的頭像 發(fā)表于 12-17 09:44 ?2348次閱讀

    如何自動生成verilog代碼

    介紹幾種自動生成verilog代碼的方法。
    的頭像 發(fā)表于 11-05 11:45 ?1329次閱讀
    如何自動生成<b class='flag-5'>verilog</b><b class='flag-5'>代碼</b>

    Verilog硬件描述語言參考手冊

    一. 關(guān)于 IEEE 1364 標準二. Verilog簡介三. 語法總結(jié)四. 編寫Verilog HDL源代碼的標準五. 設(shè)計流程
    發(fā)表于 11-04 10:12 ?4次下載

    Verilog語法中運算符的用法

    verilog語法中使用以下兩個運算符可以簡化我們的位選擇代碼。
    的頭像 發(fā)表于 10-25 15:17 ?3074次閱讀
    <b class='flag-5'>Verilog</b>語法中運算符的用法