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

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

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

3天內不再提示

UART的發送數據模塊及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的發送數據模塊

// 代碼注釋有些匆忙,如有錯誤注釋還請批評,僅作參考// 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, // 系統時鐘 input wire rst, // 復位信號

/* AXI input */ input wire [DATA_WIDTH-1:0] s_axis_tdata, // 輸入到這個模塊準備發送出去的數據 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; // 從機沒有準備好發送 txd_reg 《= 1; // 發送線拉高 prescale_reg 《= 0; // bit_cnt 《= 0; // 位計數器初始化為0 busy_reg 《= 0; // 復位后為不忙狀態 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; // 開始傳輸后,傳輸線進入忙狀態 end end else begin if (bit_cnt 》 1) // begin bit_cnt 《= bit_cnt - 1; prescale_reg 《= (prescale 《《 3)-1; // 經過(prescale 《《 3)-1次的系統時鐘計數,完成一位的移位 {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) // 準備有數據要發以及準被好發 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協議及Verilog代碼

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

責任編輯:haq

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

    關注

    28

    文章

    1365

    瀏覽量

    111729
  • 代碼
    +關注

    關注

    30

    文章

    4886

    瀏覽量

    70209

原文標題:Uart協議及Verilog代碼

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

收藏 0人收藏

    評論

    相關推薦
    熱點推薦

    verilog模塊的調用、任務和函數

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

    為什么無法使用Lpuart_Uart_Ip_ 發送任何數據回調中的AsyncSend?

    我已經實現了基于 LPUART 的 DMA ,我可以發送使用 Lpuart_Uart_Ip_ 接收的數據同步發送 in lpuart_6_callback , 但是,我無法
    發表于 04-11 07:51

    UART、MCXA142實現ISP通信的主機端,發送Ping數據包并收到預期的響應,發送和接收數據包的典型順序是什么?

    我想為 UART、MCXA142 實現 ISP 通信的主機端。我發送 Ping 數據包并收到預期的響應。發送和接收數據包的典型順序是什么?
    發表于 04-03 08:05

    開源直接用!UDP-UART數據透傳來了

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

    Verilog 與 ASIC 設計的關系 Verilog 代碼優化技巧

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

    Verilog 測試平臺設計方法 Verilog FPGA開發指南

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

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

    Verilog 與 VHDL 比較 1. 語法和風格 VerilogVerilog 的語法更接近于 C 語言,對于有 C 語言背景的工程師來說,學習曲線較平緩。它支持結構化編程,代碼
    的頭像 發表于 12-17 09:44 ?1376次閱讀

    如何自動生成verilog代碼

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

    Verilog硬件描述語言參考手冊

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

    uart波特率和傳輸頻率的關系 UART串口的常用波特率為多少

    ) :是衡量UART通信速度的單位,表示每秒傳輸的比特數(bits per second,bps)。它反映了UART設備在發送和接收數據時使用的傳輸
    的頭像 發表于 10-06 16:12 ?6075次閱讀
    <b class='flag-5'>uart</b>波特率和傳輸頻率的關系 <b class='flag-5'>UART</b>串口的常用波特率為多少

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

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

    FPGA Verilog HDL代碼如何debug?

    monitor 語句,在關鍵位置輸出一些關鍵變量或中間結果的值,以便了解代碼執行過程中的數據變化。 分模塊調試:將復雜的設計分解為較小的模塊,分別對每個
    發表于 09-24 19:16

    為什么無法在PSoC4的UART發送16個以上字節?

    我正在使用 CY8CKIT-149 套件,我想發送 24 個字節,但一次無法發送超過 16 個字節。 如何用一條指令發送整條信息? 我在下面附上了我的代碼,下面是我使用的 API。 我
    發表于 07-23 07:19

    TCP服務器發送數據丟失的原因?

    UART數據后,Tcp服務器會獲取發送到TCP客戶端的數據。我們無法知道 UART 數據的數
    發表于 07-19 16:51

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

    我使用 tc377 進行 uart 通信,我必須使用定時器(Gpt12)從 tx 發送數據而不中斷 ,當我使用時,數據存儲在 Tx 緩沖區,但沒有傳輸到 Rx。 這是定時器函數 voi
    發表于 05-27 07:15
    主站蜘蛛池模板: 帝王受PLAY龙椅高肉NP | 国产精品毛片AV久久97 | 伊人网站在线 | 青青精品国产自在线拍 | 老阿姨才是最有味的一区二区 | 祺鑫WRITEAS流出来了 | 一手揉着乳头一手模仿抽插视频 | 久久久久综合网久久 | 午夜伦yy44880影院 | 一个人HD在线观看免费高清视频 | 日本激情在线 | 午夜国产福利 | 亚洲专区中文字幕视频专区 | 年轻的老师5理伦片 | 99久久精品毛片免费播放 | 亚洲AV国产精品无码精 | 成年人免费观看的视频 | 97视频视频人人碰视频 | 国产AV高清怡春院 | 久久久无码精品亚洲A片软件 | 在线观看视频中文字幕 | 同桌别揉我奶了嗯啊 | 小向美奈子厨房magnet | 中文字幕绝色少妇性 | 欧美精品久久久久久久久大尺度 | 365电影成人亚洲网在线观看 | 国产精品久久久久一区二区三区 | 国产黄A片在线观看永久免费麻豆 | jiz中国zz| 草莓视频在线观看完整高清免费 | 中字幕视频在线永久在线观看免费 | 亚洲深夜在线 | 日本又黄又爽又色又刺激的视频 | 久久这里只精品热在线99 | 在线亚洲免费 | 2019中文字幕乱码免费 | 茎身铃口调教 | 国产麻豆剧果冻传媒免费网站 | 好男人好资源在线播放 | 国产精品久久婷婷五月色 | 91黄色影院 |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品