国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

FPGA自學筆記--串口通信發(fā)送多字節(jié)數(shù)據(jù)(verilog版)

這篇具有很好參考價值的文章主要介紹了FPGA自學筆記--串口通信發(fā)送多字節(jié)數(shù)據(jù)(verilog版)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1.需求分析

????????關于uart協(xié)議實現(xiàn)這部分大家可以參考我上一篇的博客?!禙PGA自學筆記--串口通信實現(xiàn)(vivado&verilog版)》。在上一篇博客中,主要實現(xiàn)了將單字節(jié)的數(shù)據(jù),我們其實就是用上一篇博客的模塊來實現(xiàn)多字節(jié)數(shù)據(jù)的發(fā)送。

????????在真實的數(shù)據(jù)傳輸過程中,我們不只是發(fā)送 6 7 8 位數(shù)據(jù),也有可能發(fā)送12 16 20位的數(shù)據(jù),所以我們需要調(diào)用多次串口發(fā)送模塊來發(fā)送多字節(jié)數(shù)據(jù)。通過狀態(tài)機實現(xiàn),假設我們這次發(fā)送一個40位,5字節(jié)的數(shù)據(jù),所以樸素的來講,我們可以有6個狀態(tài),0狀態(tài)是整個模塊等待狀態(tài),1,2,3,4,5狀態(tài)分別為5個字節(jié)數(shù)據(jù)的發(fā)送狀態(tài)。

2.總體模塊和狀態(tài)轉(zhuǎn)移圖。

????????上一篇博客中,單字節(jié)的串口發(fā)送模塊為uart_tx。實現(xiàn)的具體功能為,當send_go為高電平時,將data里的并行數(shù)據(jù)以串行數(shù)據(jù)發(fā)出,發(fā)送完成時 tx_done 產(chǎn)生一個單脈沖。我們需要在上層模塊中調(diào)用這個模塊。上層模塊的框圖如昨圖。需要調(diào)用的uart_tx模塊如右圖所示。

????????FPGA自學筆記--串口通信發(fā)送多字節(jié)數(shù)據(jù)(verilog版)FPGA自學筆記--串口通信發(fā)送多字節(jié)數(shù)據(jù)(verilog版)

所以,需要trans_go啟動狀態(tài)機,狀態(tài)機內(nèi)部產(chǎn)身send_go信號,傳輸一字節(jié)數(shù)據(jù)。發(fā)送完成后,uart_tx模塊會產(chǎn)生tx_done信號,tx_done信號用來激活狀態(tài)機的下一個狀態(tài),開始發(fā)送下一個數(shù)據(jù),再次產(chǎn)生一個send_go脈沖,送入data數(shù)據(jù),依次送完5字節(jié)數(shù)據(jù),當最后一個字節(jié)發(fā)送完成成,最后一個狀態(tài)5在tx_done下返回第一個狀態(tài),并產(chǎn)生五字節(jié)發(fā)送完成信號,trans_down.回到第一個狀態(tài)后,等待發(fā)送下一個四十位,五字節(jié)數(shù)據(jù)的trans_go。

狀態(tài)轉(zhuǎn)移圖如下。

FPGA自學筆記--串口通信發(fā)送多字節(jié)數(shù)據(jù)(verilog版)

當然,這個狀態(tài)轉(zhuǎn)移圖也可以簡化,由于我目前也是小白狀態(tài),只能寫出這種比較好理解,簡單的寫法,大家以后也可以嘗試比較高級的寫法。即只用兩個狀態(tài)機實現(xiàn),或者講后面五個狀態(tài)總結(jié)為一個大狀態(tài),

3.設計文件和testbench文件

????????在top文件中例化uart_byte_tx模塊,這部分具體代碼請參考上一個博客。代碼參考了B站小梅哥的視頻。新手強烈推薦。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/04/30 20:20:59
// Design Name: 
// Module Name: uart_tx_5byte
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
// 使用串口發(fā)送5個字節(jié)(40 bit)的數(shù)據(jù)到電腦

module uart_tx_5byte(
    clk,
    reset,
    data40,
    trans_go,
    uart_tx,
    trans_done
    );
    
    input clk;
    input reset;
    input trans_go;
    input [39:0]data40;
    output uart_tx;
    output reg trans_done;
    reg [7:0]data;
    reg send_go;
    //reg tx_done;
    
uart_byte_tx uart_byte_tx(
        .clk(clk),
        .reset(reset),
        .send_go(send_go),
        .data(data),
        .baud_set(4),
        .uart_tx(uart_tx),
        .tx_done(tx_done)
    );

    reg [2:0]state;
   
    always@(posedge clk or negedge reset)
        if(!reset)begin
            state <= 0;
            send_go <= 0;
            data <= 0;
            trans_done <= 0;
        end
        else if(state == 0)begin
            trans_done <= 0;
            //if(tx_done)begin             // 當發(fā)完的時候  發(fā)新的
            if(trans_go)begin             //  由trans_go 點燃第一個狀態(tài)  啟動狀態(tài)  用tx_done 是無法啟動狀態(tài)機的  tx_done 是 0狀態(tài)結(jié)束標志
                data <= data40[7:0];
                send_go <= 1;
                state <= 1;
            end
            else begin
                data <= data;
                send_go <= 0;
                state   <= 0;
            end        
        end
        else if(state == 1)begin
            if(tx_done)begin
                data <= data40[15:8];
                send_go <= 1;
                state <= 2;
            end
            else begin
                data <= data;
                send_go <= 0;
                state   <= 1;
            end        
        end
        else if(state == 2)begin
            if(tx_done)begin
                data <= data40[23:16];
                send_go <= 1;
                state <= 3;
            end
            else begin
                data <= data;
                send_go <= 0;
                state   <= 2;
            end        
        end
        else if(state == 3)begin
            if(tx_done)begin
                data <= data40[31:24];
                send_go <= 1;
                state <= 4;
            end
            else begin
                data <= data;
                send_go <= 0;
                state   <= 3;
            end        
        end
        else if(state == 4)begin
            if(tx_done)begin
                data <= data40[39:32];
                send_go <= 1;
                state <= 5;
            end
            else begin
                data <= data;
                send_go <= 0;
                state   <= 4;
            end        
        end
        else if(state == 5)begin
            if(tx_done)begin               // 當發(fā)完的時候 回到初始狀態(tài)
                send_go <= 0;
                state <= 0;
                trans_done <= 1;
            end
            else begin                    // 當沒發(fā)完的時候 等他發(fā)完
                data <= data;
                send_go <= 0;
                state   <= 5;
            end        
        end
endmodule

對應的testbench文件

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/04/30 21:51:02
// Design Name: 
// Module Name: uart_tx_5byte_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module uart_tx_5byte_tb(
    );
    reg clk;
    reg reset;
    reg [39:0]data40;
    reg trans_go;
    wire trans_done;
    wire uart_tx;
   
    
uart_tx_5byte uart_tx_5byte(
    .clk(clk),
    .reset(reset),
    .data40(data40),
    .trans_go(trans_go),
    .uart_tx(uart_tx),
    .trans_done(trans_done)
    );
    
    initial clk = 1;
    always #10 clk = ~clk;
    
    initial begin
    reset = 0;
    data40 = 0;
    trans_go = 0;
    # 201;
    # 200;
    reset = 1;
    data40 = 40'h123456789a;
    trans_go = 1;
    # 20
    trans_go = 0;
    
    @(posedge trans_done);
    # 200000;
    data40 = 40'habc1234655;
    trans_go = 1;
    # 20
    trans_go = 0;
    @(posedge trans_done);
    # 200000;
    $stop;
    end 
endmodule

?4.仿真結(jié)果分析

FPGA自學筆記--串口通信發(fā)送多字節(jié)數(shù)據(jù)(verilog版)

顯然,如圖所示,一定要注意,多字節(jié)發(fā)送,每個字節(jié)還是存在起始位和終止位的,所以應該還是10位10位的發(fā),看時序圖的時候一定不要看錯了,去除箭頭所示的標志位后,對比數(shù)據(jù),并行40位輸入和串行輸出,結(jié)果一致,從低位到高位,完全正確。有興趣的同學可以直接下載我的vivado工程。文章來源地址http://www.zghlxwxcb.cn/news/detail-416002.html

到了這里,關于FPGA自學筆記--串口通信發(fā)送多字節(jié)數(shù)據(jù)(verilog版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • FPGA入門學習筆記(十)Vivado設計狀態(tài)機實現(xiàn)UART多字節(jié)數(shù)據(jù)發(fā)送

    FPGA入門學習筆記(十)Vivado設計狀態(tài)機實現(xiàn)UART多字節(jié)數(shù)據(jù)發(fā)送

    使用串口發(fā)送5個字節(jié)數(shù)據(jù)到電腦 1、ADC采樣的結(jié)果為12位,如何使用串口發(fā)送 2、16位數(shù)據(jù),如何通過串口發(fā)送 3、多個字節(jié)的數(shù)據(jù),如何通過串口發(fā)送 UART規(guī)定,發(fā)送的數(shù)據(jù)位只能有6、7、8位,若直接修改發(fā)送位數(shù),接收模塊將不適配。 兩種情況: 1、沒有開始發(fā)送(上一次的

    2024年02月12日
    瀏覽(24)
  • 【個人筆記】51單片機串口通信的字符串接收和發(fā)送,串口通信調(diào)節(jié)數(shù)碼管顯示時鐘(串口通信,定時器,數(shù)碼管)

    【個人筆記】51單片機串口通信的字符串接收和發(fā)送,串口通信調(diào)節(jié)數(shù)碼管顯示時鐘(串口通信,定時器,數(shù)碼管)

    ? ? ???目的:利用PROTUES仿真軟件、串口調(diào)試助手、虛擬串口,搭建單片機與PC通信仿真平臺,熟悉單片機串口的配置及與PC機的通信方法;嘗試制定通信協(xié)議,單片機根據(jù)通信協(xié)議解析接收到的內(nèi)容,并根據(jù)接收的指令執(zhí)行相應的操作。 基本功能: 1.時分秒的動態(tài)顯示。

    2024年02月11日
    瀏覽(102)
  • FPGA串口(RS422)調(diào)試筆記:理解串口通信與調(diào)試記錄

    探索FPGA串口(RS422)通信的調(diào)試過程與記錄,包括串口通信概念解析、調(diào)試步驟、代碼示例以及數(shù)據(jù)拼接方法。記錄調(diào)試中遇到的問題與解決方案,展示對串口通信功能的實現(xiàn)與樂趣體驗。

    2023年04月08日
    瀏覽(25)
  • 串口通信-發(fā)送和接收數(shù)據(jù)

    串口通信-發(fā)送和接收數(shù)據(jù)

    目錄 通信方式 硬件電路 軟件部分 USART外設(同步/異步收發(fā)器) 波特率 引腳復用 初始化基本流程 發(fā)送 接收 語言簡述 常用的函數(shù) 使用的結(jié)構(gòu)體 引腳模式 打印數(shù)據(jù)的三種方法 使用printf 在實際的串口中,只能發(fā)送二進制數(shù),也就是十六進制的最直接數(shù)據(jù)。如果想發(fā)送字符,

    2024年02月12日
    瀏覽(94)
  • 【友善串口調(diào)試助手Serial Port Utility以ASCII形式發(fā)送字節(jié)數(shù)據(jù)顯示0D的問題】

    【友善串口調(diào)試助手Serial Port Utility以ASCII形式發(fā)送字節(jié)數(shù)據(jù)顯示0D的問題】

    在做DS18B20溫度檢測時自己想通過UART串口接收上位機發(fā)出的指令來進行相應的操作,但是第一次上板未能成功,所以回過頭來逐步排查問題 自己考慮FPGA與DS18B20數(shù)據(jù)交互對DS18B20的控制可分為三類:復位、寫操作與讀操作,每種操作后面還需跟相應具體的指令,如SKIP ROM [CCh]、

    2024年04月28日
    瀏覽(23)
  • SpringBoot+RXTXcomm實現(xiàn)Java串口通信 讀取串口數(shù)據(jù)以及發(fā)送數(shù)據(jù)

    SpringBoot+RXTXcomm實現(xiàn)Java串口通信 讀取串口數(shù)據(jù)以及發(fā)送數(shù)據(jù)

    記錄一下使用SpringBoot+RXTXcomm實現(xiàn)Java串口通信,使用Java語言開發(fā)串口,對串口進行讀寫操作。 案例源碼:SpringBoot+RXTXcomm實現(xiàn)Java串口通信 讀取串口數(shù)據(jù)以及發(fā)送數(shù)據(jù) RXTXcomm.jar這個包支持的系統(tǒng)較多,但是更新太慢,在win系統(tǒng)下使用沒有問題,但是在centos的工控機系統(tǒng)里使用

    2024年02月04日
    瀏覽(24)
  • SpringBoot+jSerialComm實現(xiàn)Java串口通信 讀取串口數(shù)據(jù)以及發(fā)送數(shù)據(jù)

    SpringBoot+jSerialComm實現(xiàn)Java串口通信 讀取串口數(shù)據(jù)以及發(fā)送數(shù)據(jù)

    記錄一下使用SpringBoot+jSerialComm實現(xiàn)Java串口通信,使用Java語言開發(fā)串口,對串口進行讀寫操作,在win和linux系統(tǒng)都是可以的,有一點好處是不需要導入額外的文件。 案例demo源碼:SpringBoot+jSerialComm實現(xiàn)Java串口通信 讀取串口數(shù)據(jù)以及發(fā)送數(shù)據(jù) 之前使用RXTXcomm實現(xiàn)Java串口通信,這

    2024年02月05日
    瀏覽(24)
  • 孩子都能學會的FPGA:第九課——多字節(jié)數(shù)據(jù)的發(fā)送和接收

    孩子都能學會的FPGA:第九課——多字節(jié)數(shù)據(jù)的發(fā)送和接收

    (原創(chuàng)聲明:該文是 作者的原創(chuàng) ,面向?qū)ο笫?FPGA入門者 ,后續(xù)會有進階的高級教程。宗旨是 讓每個想做FPGA的人輕松入門 , 作者不光讓大家知其然,還要讓大家知其所以然 !每個工程作者都搭建了全自動化的仿真環(huán)境,只需要雙擊 top_tb.bat 文件就可以完成整個的仿真(前

    2024年02月04日
    瀏覽(42)
  • Unity串口通信、接受和發(fā)送數(shù)據(jù)、C#

    Unity串口通信、接受和發(fā)送數(shù)據(jù)、C#

    串行接口(串口)通常指COM接口,是采用串行通信方式的擴展接口。串口按位(bit)發(fā)送和接收字節(jié)。盡管比按字節(jié)(byte)的并行通信慢,但是串口可以在使用一根線發(fā)送數(shù)據(jù)的同時用另一根線接收數(shù)據(jù)。特別適用于遠距離通信。 查看串口:右鍵 我的電腦-管理-設備管理器

    2023年04月13日
    瀏覽(87)
  • ZYNQ 7020 之 FPGA知識點重塑筆記一——串口通信

    ZYNQ 7020 之 FPGA知識點重塑筆記一——串口通信

    目錄 一:串口通信簡介 二:三種常見的數(shù)據(jù)通信方式—RS232串口通信 2.1 實驗任務 2.2 串口接收模塊的設計 2.2.1 代碼設計 2.3?串口發(fā)送模塊的設計 2.3.1 代碼設計 2.4 頂層模塊編寫 2.4.1 代碼設計 2.4.2?仿真驗證代碼 2.4.3 仿真結(jié)果 2.4.4 板上驗證 ?????? 通信方式一般分為 串行

    2024年02月03日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包