【Verilog硬件語言學習筆記4】FPGA串口通信

串口通信是系統設計中比較基部分,其原理其實也很通俗易懂。單次建立通信會傳輸8個bit,其時序也很簡單,這里就不再贅述了。其對應的實例代碼如下所示;

首先是接受部分(因為我的變量命名也很規范,通俗易懂,所以我不再詳細介紹):

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/03/13 12:00:48
// Design Name: 
// Module Name: uart_rx
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module uart_rx(input                               clk                        ,input                               rst_n                      ,input                               uart_rxd                   ,output reg                          uart_rx_done               ,output reg         [   7: 0]        uart_rx_data                );// parameter to defineparameter                           CLK_FREQ                   = 50000000;parameter                           UART_BPS                   = 115200;localparam                          BAUD_CNT_MAX               = CLK_FREQ / UART_BPS;// reg definereg                                 uart_rxd_d0                 ;reg                                 uart_rxd_d1                 ;reg                                 uart_rxd_d2                 ;reg                                 rx_flag                     ;reg                [   3: 0]        rx_cnt                      ;reg                [  15: 0]        baud_cnt                    ;reg                [   7: 0]        rx_data_t                   ;// wire definewire                                start_en                    ;
// Main Code
// Because the sign fall from high to low, use this to catch the signal;assign                              start_en                    = uart_rxd_d2 & (~uart_rxd_d1) & (~rx_flag);// aiming to asynchronous signal processing
always @(posedge clk or negedge rst_n)
beginif (!rst_n) beginuart_rxd_d0 <= 0;uart_rxd_d1 <= 0;uart_rxd_d2 <= 0;endelse beginuart_rxd_d0 <= uart_rxd;uart_rxd_d1 <= uart_rxd_d0;uart_rxd_d2 <= uart_rxd_d1;end
end// define the rx_flag
always @(posedge clk or negedge rst_n)
beginif (!rst_n)rx_flag <= 0;else if (start_en)rx_flag <= 1'b1;else if ((rx_cnt == 4'd9) && (baud_cnt == BAUD_CNT_MAX / 2 - 1'b1))rx_flag <= 0;elserx_flag <= rx_flag;
end// Baud rate counter amplitude
always @(posedge clk or negedge rst_n)
beginif (!rst_n)baud_cnt <= 0;else if (rx_flag) beginif (baud_cnt <= BAUD_CNT_MAX - 1)baud_cnt <= baud_cnt + 1;elsebaud_cnt <= 0;endelsebaud_cnt <= 0;
end// Accept data(rx_cnt) assignment
always @(posedge clk or negedge rst_n)
beginif (!rst_n)rx_cnt <= 0;else if (rx_flag) beginif (baud_cnt == BAUD_CNT_MAX-1) beginrx_cnt <= rx_cnt + 1;endelserx_cnt <= rx_cnt;endelserx_cnt <= 0;
end// based on the rx_cnt to restore the rxd data
always @(posedge clk or negedge rst_n)
beginif (!rst_n)rx_data_t <= 0;else if (rx_flag) beginif (baud_cnt == BAUD_CNT_MAX / 2 - 1) begincase (rx_cnt)4'd1: rx_data_t[0] <= uart_rxd_d2;4'd2: rx_data_t[1] <= uart_rxd_d2;4'd3: rx_data_t[2] <= uart_rxd_d2;4'd4: rx_data_t[3] <= uart_rxd_d2;4'd5: rx_data_t[4] <= uart_rxd_d2;4'd6: rx_data_t[5] <= uart_rxd_d2;4'd7: rx_data_t[6] <= uart_rxd_d2;4'd8: rx_data_t[7] <= uart_rxd_d2;default: ;endcaseendelserx_data_t <= rx_data_t;endelserx_data_t <= 0;
end// assignment the data received
always @(posedge clk or negedge rst_n)
beginif (!rst_n) beginuart_rx_done <= 0;uart_rx_data <= 0;endelse if (rx_cnt == 4'd9 && baud_cnt == BAUD_CNT_MAX / 2 - 1) beginuart_rx_done <= 1;uart_rx_data <= rx_data_t;endelse beginuart_rx_done <= 0;uart_rx_data <= uart_rx_data;end
endendmodule

然后是發送部分:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2025/03/13 17:14:19
// Design Name: 
// Module Name: uart_tx
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//module uart_tx(input                               clk                        ,input                               rst_n                      ,input                               uart_tx_en                 ,input              [   7: 0]        uart_tx_data               ,output reg                          uart_txd                   ,output reg                          uart_tx_busy                );// parameter defineparameter                           CLK_FREQ                   = 50000000;parameter                           UART_BPS                   = 115200;localparam                          BAUD_CNT_MAX               = CLK_FREQ/UART_BPS;// reg definereg                [   7: 0]        tx_data_t                   ;reg                [   3: 0]        tx_cnt                      ;reg                [  15: 0]        baud_cnt                    ;// Main Code
always @(posedge clk or negedge rst_n)beginif(!rst_n)     begintx_data_t<=0;uart_tx_busy<=0;endelse if(uart_tx_en)        begintx_data_t<=uart_tx_data;uart_tx_busy<=1;endelse if(tx_cnt==4'd9&&baud_cnt==BAUD_CNT_MAX-1) begintx_data_t<=0;uart_tx_busy<=0;endelse begintx_data_t<=tx_data_t;uart_tx_busy<=uart_tx_busy;endend// Baud counter
always @(posedge clk or negedge rst_n)beginif(!rst_n)baud_cnt<=0;else if(uart_tx_en)baud_cnt<=0;else if(uart_tx_busy) beginif(baud_cnt<BAUD_CNT_MAX-1)baud_cnt<=baud_cnt+1;elsebaud_cnt<=0;endelsebaud_cnt<=0;end// assign the tx_cnt
always @(posedge clk or negedge rst_n)beginif(!rst_n)tx_cnt<=0;else if(uart_tx_busy) beginif(baud_cnt==BAUD_CNT_MAX-1)tx_cnt<=tx_cnt+1;elsetx_cnt<=tx_cnt;endelsetx_cnt<=0;endalways @(posedge clk or negedge rst_n)beginif(!rst_n)uart_txd<=1;else if(uart_tx_busy) begincase(tx_cnt)4'd0: uart_txd<=1'b0;4'd1: uart_txd<=tx_data_t[0];4'd2: uart_txd<=tx_data_t[1];4'd3: uart_txd<=tx_data_t[2];4'd4: uart_txd<=tx_data_t[3];4'd5: uart_txd<=tx_data_t[4];4'd6: uart_txd<=tx_data_t[5];4'd7: uart_txd<=tx_data_t[6];4'd8: uart_txd<=tx_data_t[7];4'd9: uart_txd<=1;default: uart_txd<=1;endcaseendelseuart_txd<=1'b1;endendmodule

參考文獻:

達芬奇之 FPGA 開發指南 ?V2.2 ?-正點原子 達芬奇開發板教程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87551.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87551.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87551.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Go 語言安裝教程(Windows 系統)

2025年07月02日 準備工作 確認系統為 Windows 7 及以上版本&#xff08;推薦 Windows 10/11&#xff09;。64 位系統選擇 amd64 版本安裝包&#xff0c;32 位系統選擇 386 版本。確保安裝目錄&#xff08;默認 C:\Program Files\Go\&#xff09;有至少 1GB 空間。 下載安裝包…

接口測試之postman

一、Postman功能簡介 3天精通Postman接口測試&#xff0c;全套項目實戰教程&#xff01;&#xff01; Postman是由Postdot Technologies公司打造的一款功能強大的調試HTTP接口的工具。在做接口測試的時候&#xff0c;Postman相當于一個客戶端&#xff0c;它可以模擬用戶發起的各…

【記錄】Ubuntu安裝Mysql

本文記錄Ubuntu系統下安裝Mysql 1 查看系統信息 lsb_release -a 2 使用apt下載安裝Mysql 1 打開終端,首先更新你的系統包索引,以確保所有包都是最新的 sudo apt update 2 安裝mysql服務器 sudo apt install mysql-server (也可以選擇對應的mysql-server 版本) 3 查看mysql狀…

【深度學習:進階篇】--4.1.循環神經網絡(改進)

RNN存在的問題&#xff1a;梯度爆炸&#xff0c;長期依賴參數量過大等問題 目錄 1.GRU(門控循環單元) 1.1.什么是GRU 1.2.直觀理解 1.3.本質解決問題 2.LSTM(長短記憶網絡) 2.1.作用 3.結構擴展與效率優化? 1.GRU(門控循環單元) 2014年&#xff0c;出現的算法&#x…

中心化錢包安全方案

先來看獨立的密鑰安全技術 1 自建或單租戶 CloudHSM 優點&#xff1a;密鑰永不出硬件&#xff0c;無法導出&#xff0c;只能對外提供公鑰。 交易時&#xff0c;外部應用把消息哈希傳進去簽名&#xff0c;再把簽好名的結果拿出來用。 這種方式安全性拉滿&#xff0c;但成本高、…

Android 實現底部彈窗

文章目錄在 Android 中創建優雅的底部選項彈窗 (BottomSheetDialogFragment) &#x1f4f1;第一步&#xff1a;設計底部彈窗的布局 &#x1f3a8;第二步&#xff1a;創建 BottomSheetDialogFragment 類 ??第三步&#xff1a;觸發并顯示底部彈窗 &#x1f680;在 Android 中創…

LAN8720 寄存器概覽和STM32 HAL庫讀寫測試

目錄 寄存器0x00:Basic Control Register&#xff08;BCR&#xff09;0x01:Basic Status Register&#xff08;BSR&#xff09; 連接測試寄存器讀寫測試 補充 寄存器 // 0x00:Basic Control Register&#xff08;BCR&#xff09; BIT15:Soft Reset 寫1復位&#xff0c;寫1之…

滲透測試深度分析:空密碼Administrator賬戶引發的安全風暴

滲透測試深度分析&#xff1a;空密碼Administrator賬戶引發的安全風暴0x01 測試背景 在內網滲透測試中&#xff0c;對Windows主機 192.168.1.98 使用 enum4linux 進行枚舉&#xff1a; enum4linux -u Administrator -p -a 192.168.1.98關鍵發現&#xff1a;Administrator賬戶空…

OpenCV CUDA模塊設備層-----高效地計算兩個 uint 類型值的帶權重平均值

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模塊&#xff08;cudev&#xff09; 中的一個設備端內聯函數&#xff0c;用于高效地計算兩個 uint 類型值的帶權重平均值。 該函…

[學習記錄]Unity毛發渲染[URP]-Shell基礎版

毛發&#xff0c;無論是人類的頭發、動物的皮毛&#xff0c;還是奇幻生物的絨毛&#xff0c;都是構成生命感和真實感不可或缺的元素。它對光線的獨特散射、吸收和反射&#xff0c;賦予了物體柔軟、蓬松、有生命力的質感。它不僅僅是讓角色看起來更“毛茸茸”那么簡單&#xff0…

數字孿生技術引領UI前端設計潮流:增強現實(AR)的集成應用

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;AR 與數字孿生融合的設計革新浪潮在體驗經濟與技術融合的雙重驅動下&…

碰一碰發視頻源碼搭建與定制化開發:支持OEM

在近場通信&#xff08;NFC&#xff09;技術與移動終端深度融合的背景下&#xff0c;“碰一碰發視頻” 功能憑借便捷的交互體驗&#xff0c;在商業推廣、信息傳遞等場景中快速落地。不同于標準化解決方案的黑盒模式&#xff0c;基于源碼的定制化開發能從底層優化傳輸效率、提升…

Ubuntu 24.04 安裝配置 Redis 7.0 開機自啟

下載源碼 wget https://download.redis.io/releases/redis-7.0.12.tar.gz安裝依賴 & 準備環境 sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential tcl curl解壓 tar xzf redis-7.0.12.tar.gz編譯安裝 cd redis-7.0.12 make -j$(nproc) …

【Linux 系統】基礎IO——Linux中對文件的理解

13.基礎IO(1) 文章目錄13.基礎IO(1)文件的基本概念&#xff1a;內容與屬性文件的打開機制&#xff1a;fopen 和 open被打開的文件與磁盤文件的區別文件的內核數據結構文件與進程的交互方式標準輸入/輸出/錯誤與文件流系統調用與文件描述符文件打開模式&#xff08;r/w/a/a&…

Go調度器的搶占機制:從協作式到異步搶占的演進之路|Go語言進階(7)

想象一下這樣的場景&#xff1a;你在餐廳排隊等位&#xff0c;前面有個人點了餐卻一直霸占著座位玩手機&#xff0c;后面的人只能干等著。這就是Go早期版本面臨的問題——一個goroutine如果不主動讓出CPU&#xff0c;其他goroutine就只能餓著。 今天我們來聊聊Go調度器是如何解…

開源模型應用落地-讓AI更懂你的每一次交互-Mem0集成Qdrant、Neo4j與Streamlit的創新實踐(四)

一、前言 在人工智能迅速發展的今天,如何讓AI系統更懂“你”?答案或許藏在個性化的記憶管理之中。Mem0作為一個開源的記憶管理系統,正致力于為AI賦予長期記憶與個性化服務能力。通過結合高性能向量數據庫Qdrant、圖數據庫Neo4j的強大關系分析能力以及Streamlit的高效可視化交…

基于微信小程序的校園二手交易平臺、微信小程序校園二手商城源代碼+數據庫+使用說明,layui+微信小程序+Spring Boot

school-market 介紹 基于微信小程序的校園二手交易平臺 功能結構圖 軟件架構 系統分為三個端&#xff0c;分別是客戶端、管理端、服務端&#xff1b; 客戶端&#xff1a;使用原生微信小程序實現 管理端&#xff1a;使用Layui實現 服務端&#xff1a;使用Java SpringBoot…

IDEA與Gradle構建沖突,導致java重復類的解決方案

項目構建總是報錯&#xff1a;錯誤提示1&#xff1a;java:重復類或錯誤提示2&#xff1a;Internal error in the mapping processor: java.lang.RuntimeException: javax.annotation.processing.FilerException: Attempt to recreate a file排查發現build/generated/sources/an…

如何調節筆記本電腦亮度?其實有很多種方式可以調整亮度

長時間面對屏幕工作、學習或娛樂&#xff0c;很多人會感到眼睛干澀、疲勞&#xff0c;甚至出現視力下降等問題。其實&#xff0c;這些問題的背后&#xff0c;往往隱藏著一個看似簡單卻極易被忽視的設置—屏幕亮度。 合適的屏幕亮度不僅能提升視覺體驗&#xff0c;還能有效緩解…

國際數字影像產業園創作空間升級 打造更優質營商環境

國際數字影像產業園創作空間升級后表現顯著&#xff0c;聚焦設施數字化與用戶體驗優化。整體提升了創意生態系統的競爭力&#xff0c;有效吸引全球企業。 升級核心改進 基礎設施現代化&#xff1a;引入智能硬件如5G網絡和云渲染設備&#xff0c;支持高清影像處理&#xff0c;…