精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

FPGA之家 ? 來源:AriesOpenFPGA ? 作者:AriesOpenFPGA ? 2021-05-27 18:05 ? 次閱讀

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

UART

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

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

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

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

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

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

5、基本的思想就是移位

6、傳輸條件就是握手

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

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

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

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

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

// 代碼注釋有些匆忙,如有錯誤注釋還請批評,僅作參考// UART// 1開始位+8位數據+1停止位(無校驗)// prescale是完成一個bit需要主時鐘計數的次數(其和主時鐘以及波特率之間的關系參考網上文章)// 進入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ā)送出去的數據 input wire s_axis_tvalid, // 有數據要輸入到這個模塊 output wire s_axis_tready, // 該模塊準備好接收數據

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; // 位計數器初始化為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) //比特計數器為0 begin s_axis_tready_reg 《= 1; // 從機把ready信號拉高 busy_reg 《= 0; // 忙信號拉低無效 if (s_axis_tvalid) // 如果從機準備好接收數據 begin s_axis_tready_reg 《= !s_axis_tready_reg; // prescale_reg 《= (prescale 《《 3)-1; // bit_cnt 《= DATA_WIDTH+1; // 一共10次計數 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; // 經過(prescale 《《 3)-1次的系統(tǒng)時鐘計數,完成一位的移位 {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) // 初始化各種參數 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) // 準備有數據要發(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時,開始計數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

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

文章出處:【微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

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

    關注

    28

    文章

    1345

    瀏覽量

    109989
  • 代碼
    +關注

    關注

    30

    文章

    4751

    瀏覽量

    68359

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

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

收藏 人收藏

    評論

    相關推薦

    如何自動生成verilog代碼

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

    怎么樣提高verilog代碼編寫水平?

    優(yōu)秀代碼:在網上查找開源的、經過驗證的高質量 Verilog 代碼,學習他人的編程風格、代碼結構和設計思路。 實踐項目:嘗試自己設計和實現(xiàn)一些較為復雜的項目,如復雜的控制器、
    發(fā)表于 09-25 20:05

    使用tc377進行uart通信,數據未通過UART發(fā)送的原因?

    我使用 tc377 進行 uart 通信,我必須使用定時器(Gpt12)從 tx 發(fā)送數據而不中斷 ,當我使用時,數據存儲在 Tx 緩沖區(qū),但沒有傳輸到 Rx。 這是定時器函數 voi
    發(fā)表于 05-27 07:15

    TC399 UART能夠接收數據,但無法發(fā)送任何數據,為什么?

    傳輸數據。 我能夠接收數據,但無法發(fā)送任何數據。 我用示波器監(jiān)測了 TX 引腳,它始終保持在 VDD 電平。 目前,我使用以下步驟來初始化 ASCLIN
    發(fā)表于 05-21 06:48

    STM8S UART應用代碼占用FLASH較大的原因?

    如題今天在做STM8S應用的時候 發(fā)現(xiàn)添加uart代碼后,在.map中查看發(fā)現(xiàn)uart簡單的發(fā)送數據就占用了3k的FLASH大家有沒有遇到類
    發(fā)表于 04-17 08:12

    STM8S105C6T6 UART2串口能接收數據,不能發(fā)送數據是為什么?

    STM8S105C6T6 UART2串口,能接收數據,不能發(fā)送數據,哪位大神能幫忙看看。現(xiàn)在單片機自發(fā)自收沒有問題,串口自發(fā)自收也沒有問題,但是兩個連接起來就單片機只能接收
    發(fā)表于 04-10 08:05

    Verilog實現(xiàn)uart串口設計

    Verilog 和 VHDL。本應用說明 Verilog 在數字 UART(通用異步接收器和發(fā)送器)的設計和驗證中的使用。 UART 由兩
    發(fā)表于 04-01 14:41

    PSoC? 6 UART通信反復發(fā)送字符串是為什么?

    我正在嘗試使用 UART 代碼,但我修改了代碼,一次又一次地發(fā)送字符串,而這次他只詢問用戶一次。 所以我想再三詢問用戶。 我還設置了一個 while (1) 循環(huán),但仍然不起作用。 因
    發(fā)表于 03-05 07:26

    verilog中input和output作用

    Verilog中,input和output用于定義模塊的輸入和輸出端口。它們是用于通信的關鍵元素,定義了模塊與其它模塊之間的數據傳輸接口。
    的頭像 發(fā)表于 02-23 10:29 ?2964次閱讀

    verilog調用模塊端口對應方式

    Verilog中的模塊端口對應方式,并提供示例代碼和詳細解釋,以幫助讀者更好地理解和應用。 首先,我們來了解一下Verilog中的模塊
    的頭像 發(fā)表于 02-23 10:20 ?1644次閱讀

    verilog function函數的用法

    Verilog 中被廣泛用于對電路進行模塊化設計,以簡化和組織代碼。 本文將詳細介紹 Verilog 函數的用法,并探討函數在硬件設計中的重要性和實際應用場景。 一.
    的頭像 發(fā)表于 02-22 15:49 ?5101次閱讀

    常見的UART收發(fā)方式

    這種方式適合大多數單片機,只要有中斷就行。使用UART Write發(fā)送數據時,數據并不是直接寫入到UART
    的頭像 發(fā)表于 02-19 16:23 ?838次閱讀

    TSMaster 序列發(fā)送模塊在汽車開發(fā)測試中的應用

    眾所周知,序列發(fā)送模塊可以不需要腳本代碼實現(xiàn)測試中特定控制報文序列的發(fā)送,該模塊多用于循環(huán)順序控制的測試案例中。序列
    的頭像 發(fā)表于 02-19 14:00 ?632次閱讀
    TSMaster 序列<b class='flag-5'>發(fā)送</b><b class='flag-5'>模塊</b>在汽車開發(fā)測試中的應用

    怎么用emac實現(xiàn)Verilog自動連線呢?

    我們在編寫一些比較復雜的Verilog代碼時,通常需要進行大量的手動連線工作,這種工作十分容易出錯,并且在代碼模塊的嵌套層級較多時,更改里層的一個
    的頭像 發(fā)表于 01-24 10:03 ?1230次閱讀

    GD32F103C8T6 Uart3無法發(fā)送數據

    以用來實現(xiàn)與其他外設或者外部設備的數據交互。 然而,在一些情況下,用戶可能會遇到UART3無法發(fā)送數據的問題。在接下來的文章中,我們將深入探討這個問題,并提供一些解決方案。 首先,我們
    的頭像 發(fā)表于 01-09 10:57 ?1610次閱讀