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

ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信

這篇具有很好參考價(jià)值的文章主要介紹了ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

一:串口通信簡(jiǎn)介

二:三種常見的數(shù)據(jù)通信方式—RS232串口通信

2.1 實(shí)驗(yàn)任務(wù)

2.2 串口接收模塊的設(shè)計(jì)

2.2.1 代碼設(shè)計(jì)

2.3?串口發(fā)送模塊的設(shè)計(jì)

2.3.1 代碼設(shè)計(jì)

2.4 頂層模塊編寫

2.4.1 代碼設(shè)計(jì)

2.4.2?仿真驗(yàn)證代碼

2.4.3 仿真結(jié)果

2.4.4 板上驗(yàn)證

一:串口通信簡(jiǎn)介

?????? 通信方式一般分為串行通信并行通信。并行通信是指多比特?cái)?shù)據(jù)同時(shí)通過并行線進(jìn)行傳送。這種傳輸方式通信線多、成本高,故不宜進(jìn)行遠(yuǎn)距離通信,通常傳輸距離小于 30 米。串行通信是指數(shù)據(jù)在一條數(shù)據(jù)線上,一比特接一比特地按順序傳送的方式。這種運(yùn)輸方式通常節(jié)省傳輸線,大大降低使用成本,但數(shù)據(jù)傳送速度慢。綜上可知,串行通信主要應(yīng)用于長(zhǎng)距離、低速率的通信場(chǎng)合。本次實(shí)驗(yàn)我們主要講解下串行通信。文章來源地址http://www.zghlxwxcb.cn/news/detail-774915.html

? ? ? ?串行通信一般有 2 種通信方式: 同步串行通信 異步串行通信 。 同步串行通信需要通信雙方在同一時(shí)鐘的控制下同步傳輸數(shù)據(jù); 異步串行通信是指具有不規(guī)則數(shù)據(jù)段傳送特性的串行數(shù)據(jù)傳輸。在常見的通信總線協(xié)議中,I2C,SPI 屬于同步通信而 UART 屬于異步通信。同步通信的通信雙方必須先建立同步,即雙方的時(shí)鐘要調(diào)整到同一個(gè)頻率,收發(fā)雙方不停地發(fā)送和接收連續(xù)的同步比特流。異步通信在發(fā)送字符時(shí),發(fā)送端可以在任意時(shí)刻開始發(fā)送字符,所以,在 UART 通信中,數(shù)據(jù)起始位和停止位是必不可少的。
? ? ? ?UART 串口通信需要兩根信號(hào)線來實(shí)現(xiàn),一根用于串口發(fā)送,另外一根負(fù)責(zé)串口接收,如下圖所示。對(duì)于 PC 來說它的 TX 要和對(duì)于 FPGA 來說的 RX 連接,同樣 PC RX 要和 FPGA TX 連接,如果是兩個(gè)TX 或者兩個(gè) RX 連接那數(shù)據(jù)就不能正常被發(fā)送出去或者接收到。
? ? ? ? ?? ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記
UART 在發(fā)送或接收過程中的一幀數(shù)據(jù)由 4 部分組成,起始位、數(shù)據(jù)位、奇偶校驗(yàn)位和停止位,如下圖所示。
? ? ? ? ? ? ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記
起始位:當(dāng)不傳輸數(shù)據(jù)時(shí),UART 數(shù)據(jù)傳輸線通常保持高電平。若要開始數(shù)據(jù)傳輸,發(fā)送 UART 會(huì)將傳輸線從高電平拉到低電平并保持 1 個(gè)波特率周期。當(dāng)接收 UART 檢測(cè)到高到低電壓躍遷時(shí),便開始以波特率對(duì)應(yīng)的頻率讀取數(shù)據(jù)幀中的位。
數(shù)據(jù)幀: 數(shù)據(jù)幀包含所傳輸?shù)膶?shí)際數(shù)據(jù)。如果使用奇偶校驗(yàn)位,數(shù)據(jù)幀長(zhǎng)度可以是 5 位到 8 位。如果不使用奇偶校驗(yàn)位,數(shù)據(jù)幀長(zhǎng)度可以是 9 位。在很多情況下,數(shù)據(jù)以最低有效位優(yōu)先發(fā)送。
奇偶校驗(yàn):奇偶性描述數(shù)字是偶數(shù)還是奇數(shù)。通過奇偶校驗(yàn)位,接收 UART 判斷傳輸期間是否有數(shù)據(jù)發(fā)生改變。
停止位 為了表示數(shù)據(jù)包結(jié)束,發(fā)送 UART 將數(shù)據(jù)傳輸線從低電壓驅(qū)動(dòng)到高電壓并保持 1 2 位時(shí)間。
波特率:即每秒傳輸?shù)奈粩?shù) (bit) 。一般選波特率都會(huì)有 9600 , 19200 , 115200等選項(xiàng)。其實(shí)意思就是每秒傳輸這么多個(gè)比特位數(shù)(bit) 。

二:三種常見的數(shù)據(jù)通信方式—RS232串口通信

rs232通信: RS-232 是單端輸入輸出,
RS-232 標(biāo)準(zhǔn)的串口最常見的接口類型為 DB9 ,樣式如圖 27.1.3 所示,工業(yè)控制領(lǐng)域中用到的工控機(jī) 一般都配備多個(gè)串口,很多老式臺(tái)式機(jī)也都配有串口。但是筆記本電腦以及較新一點(diǎn)的臺(tái)式機(jī)都沒有串 口,它們一般通過 USB 轉(zhuǎn)串口線(下圖所示 )來實(shí)現(xiàn)與外部設(shè)備的串口通信。
? ? ? ? ? ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記
DB9 接口定義以及各引腳功能說明如下圖所示,我們一般只用到其中的 2 RXD )、 3 TXD )、 5 (GND)引腳,其他引腳在普通串口模式下一般不使用,如果大家想了解,可以自行百度下。
? ? ? ? ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記

2.1 實(shí)驗(yàn)任務(wù)

? ? ? 本節(jié)實(shí)驗(yàn)任務(wù)是上位機(jī)通過串口調(diào)試助手發(fā)送數(shù)據(jù)給zynq開發(fā)板,zynq開發(fā)板 PL 端通過 USB ????
_UART 串口接收數(shù)據(jù)并將接收到的數(shù)據(jù)發(fā)送給上位機(jī),完成串口數(shù)據(jù)環(huán)回實(shí)驗(yàn)。主要模塊如下表所示:
ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記

2.2 串口接收模塊的設(shè)計(jì)

? ? ? 首先完成串口接收模塊的設(shè)計(jì),串口接收模塊我們的輸入信號(hào)主要有系統(tǒng)時(shí)鐘信號(hào)、系統(tǒng)復(fù)位信號(hào)與串口接收端口。當(dāng)我們將一幀的數(shù)據(jù)接收完成后,那么要告訴下級(jí)模塊已經(jīng)將一幀數(shù)據(jù)接收完了,所以輸出為接收完成標(biāo)志和串口接收數(shù)據(jù)信號(hào)。 模塊接口框圖如下所示:
? ? ? ? ? ? ? ? ? ? ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記
串口接收模塊端口與功能描述如下表所示:
ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記
繪制波形圖:
在繪制波形圖之前,我們首先要確定串口通信的數(shù)據(jù)格式及波特率。在這里我們選擇串口比較常用的 一種模式,數(shù)據(jù)位為 8 位,停止位為 1 位,無校驗(yàn)位,波特率為 115200bps 。則傳輸一幀數(shù)據(jù)的時(shí)序圖如下圖所示:
ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記

2.2.1 代碼設(shè)計(jì)

//串轉(zhuǎn)并
module zdyz_rs232_rx(
    input sys_clk , //系統(tǒng)時(shí)鐘
    input sys_rst_n , //系統(tǒng)復(fù)位,低有效
    
    input uart_rxd , //UART 接收端口
    output reg uart_rx_done, //UART 接收完成信號(hào)
    output reg [7:0] uart_rx_data //UART 接收到的數(shù)據(jù)
);

parameter CLK_FREQ = 5000_0000; //系統(tǒng)時(shí)鐘頻率
parameter UART_BPS = 115200 ; //串口波特率
localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS; //為得到指定波特率,對(duì)系統(tǒng)時(shí)鐘計(jì)數(shù) BPS_CNT 次

reg uart_rxd_d0;
reg uart_rxd_d1;//定義兩個(gè)D觸發(fā)器進(jìn)行異步打拍處理
reg rx_flag ; //接收過程標(biāo)志信號(hào)
reg [3:0] rx_cnt ; //接收數(shù)據(jù)位計(jì)數(shù)器    
reg [15:0] baud_cnt ; //波特率計(jì)數(shù)器(位寬為16,防止溢出)
reg [7:0 ] rx_data_t ; //接收數(shù)據(jù)寄存器

wire start_flag;//開始接收的標(biāo)志,下降沿到來。
    
//打兩拍:波特率時(shí)鐘和系統(tǒng)時(shí)鐘不同步,為異步信號(hào),所以要進(jìn)行打拍處理,防止產(chǎn)生亞穩(wěn)態(tài)  
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        uart_rxd_d0 <= 1'b0;
        uart_rxd_d1 <= 1'b0;
    end
    else begin
        uart_rxd_d0 <= uart_rxd;
        uart_rxd_d1 <= uart_rxd_d0;
    end
end  
    
assign start_flag = (uart_rxd_d0 == 0)&&(uart_rxd_d1 == 1);//下降沿到來的表示方法
// rx_flag接收信號(hào)的拉高與拉低   
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        rx_flag <= 1'b0;
    else if(start_flag) //檢測(cè)到起始位
        rx_flag <= 1'b1; //接收過程中,標(biāo)志信號(hào) rx_flag 拉高
    //在停止位一半的時(shí)候,即接收過程結(jié)束,標(biāo)志信號(hào) rx_flag 拉低
    else if((rx_cnt == 4'd9) && (baud_cnt == BAUD_CNT_MAX/2 - 1))//rx_flag 要提前拉低,防止其影響下一幀數(shù)據(jù)的接收
        rx_flag <= 1'b0;
    else
        rx_flag <= rx_flag;
    end 
//波特率的計(jì)數(shù)器計(jì)數(shù)邏輯 
always @(posedge sys_clk or negedge sys_rst_n)begin 
    if(!sys_rst_n) 
        baud_cnt <= 0;      
    else if(rx_flag)begin
        if(baud_cnt == BAUD_CNT_MAX - 1)
            baud_cnt <= 0;
        else
            baud_cnt <= baud_cnt + 1;       
    end
    else
        baud_cnt <= 0;
end 
//位計(jì)數(shù)實(shí)現(xiàn)邏輯
always @(posedge sys_clk or negedge sys_rst_n)begin 
    if(!sys_rst_n)
        rx_cnt <= 0;   
    else if(rx_flag)begin
        if(baud_cnt == BAUD_CNT_MAX - 1)
            rx_cnt <= rx_cnt + 1;        
        else
            rx_cnt <= rx_cnt;
    end
    else
        rx_cnt <= 0;//其他情況下都為0,所以不用擔(dān)心計(jì)數(shù)超過9,且其計(jì)數(shù)也不會(huì)超過9,當(dāng)rx_flag為0時(shí)就不計(jì)數(shù)了
end
//根據(jù) rx_cnt 來寄存 rxd 端口的數(shù)據(jù)
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        rx_data_t <= 0;    
    else if(rx_flag)begin   //系統(tǒng)處于接收過程時(shí)
        if(baud_cnt == BAUD_CNT_MAX/2 - 1)begin//判斷 baud_cnt 是否計(jì)數(shù)到數(shù)據(jù)位的中間 
            case(rx_cnt)
                1:rx_data_t[0] <= uart_rxd_d1; //寄存數(shù)據(jù)的最低位
                2:rx_data_t[1] <= uart_rxd_d1;
                3:rx_data_t[2] <= uart_rxd_d1;
                4:rx_data_t[3] <= uart_rxd_d1;
                5:rx_data_t[4] <= uart_rxd_d1;
                6:rx_data_t[5] <= uart_rxd_d1;
                7:rx_data_t[6] <= uart_rxd_d1;
                8:rx_data_t[7] <= uart_rxd_d1;//寄存數(shù)據(jù)的高低位
                default:rx_data_t <= rx_data_t; 
            endcase
        end
        else 
            rx_data_t <= rx_data_t;
    end
    else
        rx_data_t <= 0; 
end
//給接收完成信號(hào)和接收到的數(shù)據(jù)賦值    
always @(posedge sys_clk or negedge sys_rst_n)begin 
    if(!sys_rst_n)begin    
        uart_rx_done <= 0;   
        uart_rx_data <= 0;
    end
    //當(dāng)接收數(shù)據(jù)計(jì)數(shù)器計(jì)數(shù)到停止位,且 baud_cnt 計(jì)數(shù)到停止位的中間時(shí)
    else if((rx_cnt == 4'd9) && (baud_cnt == BAUD_CNT_MAX/2 - 1))begin
        uart_rx_done <= 1; //拉高接收完成信號(hào)
        uart_rx_data <= rx_data_t;//并對(duì) UART 接收到的數(shù)據(jù)進(jìn)行賦值
    end    
    else begin
        uart_rx_done <= 0; 
        uart_rx_data <= uart_rx_data;     
    end
end    
endmodule

2.3?串口發(fā)送模塊的設(shè)計(jì)

串口發(fā)送模塊我們的輸入信號(hào)主要有系統(tǒng)時(shí)鐘信號(hào)、系統(tǒng)復(fù)位信號(hào)以及發(fā)送使能信號(hào)和待發(fā)送數(shù)據(jù), 輸出信號(hào)主要有發(fā)送忙狀態(tài)標(biāo)志和串口發(fā)送端口。模塊接口框圖如下所示:
ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記
串口發(fā)送模塊端口與功能描述如下表所示:
ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記

2.3.1 代碼設(shè)計(jì)

module zdyz_rs232_tx(
   input sys_clk , //系統(tǒng)時(shí)鐘
   input sys_rst_n , //系統(tǒng)復(fù)位,低有效
   input uart_tx_en , //UART 的發(fā)送使能(發(fā)送是有標(biāo)志起始時(shí)間的,接收是根據(jù)下降沿到來就開始進(jìn)入起始位)
   input [7:0] uart_tx_data, //UART 要發(fā)送的數(shù)據(jù)
   output reg uart_txd , //UART 發(fā)送端口 
   output reg uart_tx_busy //發(fā)送忙狀態(tài)信號(hào) 
);
   
   //parameter define
   parameter CLK_FREQ = 50000000; //系統(tǒng)時(shí)鐘頻率
   parameter UART_BPS = 115200 ; //串口波特率
   localparam BAUD_CNT_MAX = CLK_FREQ/UART_BPS; //為得到指定波特率,對(duì)系統(tǒng)時(shí)鐘計(jì)數(shù) BPS_CNT 次    
    
   reg [7:0] tx_data_t; //發(fā)送數(shù)據(jù)寄存器 
   reg [3:0] tx_cnt ; //發(fā)送數(shù)據(jù)位計(jì)數(shù)器 
   reg [15:0] baud_cnt ; //波特率計(jì)數(shù)器 
   
 //當(dāng) uart_tx_en 為高時(shí),寄存輸入的并行數(shù)據(jù)(防止發(fā)生變化影響發(fā)送),并拉高 BUSY 信號(hào)  
always @(posedge sys_clk or negedge sys_rst_n) begin   
    if(!sys_rst_n)begin  
        tx_data_t <= 0;   
        uart_tx_busy <= 0;            
    end
    else if(uart_tx_en)begin
        tx_data_t <= uart_tx_data;   
        uart_tx_busy <= 1;
    end
    /*為了確保環(huán)回實(shí)驗(yàn)的成功,在程序的 36 行我們將 uart_tx_busy 提前 1/16 個(gè)停止位拉低。盡管串口發(fā)送數(shù)據(jù)只是接收數(shù)據(jù)的反過程,
    理論上在傳輸?shù)臅r(shí)間上是一致的,但是考慮到我們模塊里計(jì)算波特率會(huì)有較小的偏差,并且串口對(duì)端的通信設(shè)備(如電腦等)收發(fā)數(shù)據(jù)的波特率
    同樣可能會(huì)出現(xiàn)較小的偏差,因此為了確保環(huán)回實(shí)驗(yàn)的成功,這里將發(fā)送模塊的停止位略微提前結(jié)束。需要說明的是,較小偏差的波特率在
    串口通信時(shí)是允許的,同樣可以保證數(shù)據(jù)可靠穩(wěn)定的傳輸*/
else if((tx_cnt == 4'd9) && (baud_cnt == BAUD_CNT_MAX - BAUD_CNT_MAX/16))begin
        uart_tx_busy <= 0; 
        tx_data_t <= 0;
    end
else begin
        uart_tx_busy <= uart_tx_busy; 
        tx_data_t <= tx_data_t;    
    end         
end 

//波特率的計(jì)數(shù)器計(jì)數(shù)邏輯
always @(posedge sys_clk or negedge sys_rst_n)begin 
    if(!sys_rst_n) 
        baud_cnt <= 0;      
    else if(uart_tx_busy)begin //當(dāng)處于發(fā)送過程時(shí),波特率計(jì)數(shù)器(baud_cnt)進(jìn)行循環(huán)計(jì)數(shù)
        if(baud_cnt == BAUD_CNT_MAX - 1)
            baud_cnt <= 0; //計(jì)數(shù)達(dá)到一個(gè)波特率周期后清零
        else
            baud_cnt <= baud_cnt + 1;       
    end
    else
        baud_cnt <= 0;//發(fā)送過程結(jié)束時(shí)計(jì)數(shù)器清零
end
//位計(jì)數(shù)實(shí)現(xiàn)邏輯
always @(posedge sys_clk or negedge sys_rst_n)begin 
    if(!sys_rst_n)
        tx_cnt <= 0;   
    else if(uart_tx_busy)begin//處于發(fā)送過程時(shí) tx_cnt 才進(jìn)行計(jì)數(shù)
        if(baud_cnt == BAUD_CNT_MAX - 1)//當(dāng)波特率計(jì)數(shù)器計(jì)數(shù)到一個(gè)波特率周期時(shí)
            tx_cnt <= tx_cnt + 1;   //發(fā)送數(shù)據(jù)計(jì)數(shù)器加 1     
        else
            tx_cnt <= tx_cnt;
    end
    else
        tx_cnt <= 0;//其他情況下都為0,所以不用擔(dān)心計(jì)數(shù)超過9,且其計(jì)數(shù)也不會(huì)超過9,當(dāng)rx_flag為0時(shí)就不計(jì)數(shù)了
end

//根據(jù) tx_cnt 來給 uart 發(fā)送端口賦值
always @(posedge sys_clk or negedge sys_rst_n)begin 
    if(!sys_rst_n)
        uart_txd <= 1 ;//空閑態(tài)為1
    else if(uart_tx_busy)begin
        case(tx_cnt)
            4'd0 : uart_txd <= 1'b0 ; //起始位
            4'd1 : uart_txd <= tx_data_t[0]; //數(shù)據(jù)位最低位
            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]; //數(shù)據(jù)位最高位
            4'd9 : uart_txd <= 1'b1 ; //停止位            
            default:uart_txd <= 1'b1 ;
        endcase
    end
    else
        uart_txd <= 1 ; //空閑時(shí)發(fā)送端口為高電平
end 
endmodule 

2.4 頂層模塊編寫

? ? ? ?在頂層模塊中完成了對(duì)其余各個(gè)子模塊的例化。本次實(shí)驗(yàn)我們需要設(shè)置 2 個(gè)參數(shù)變量,分別是系統(tǒng)時(shí)鐘頻率 CLK_FREQ 與串口波特率 UART_BPS ,大家使用時(shí)可以根據(jù)不同的系統(tǒng)時(shí)鐘頻率以及所需要的串口波特率設(shè)置這兩個(gè)變量。zynq7020開發(fā)板上的系統(tǒng)時(shí)鐘為 50MHz ,所以這里將 CLK_FREQ 參數(shù)設(shè)為50000000。在前文我們說過本次實(shí)驗(yàn)的波特率設(shè)為 115200 ,所以這里的參數(shù) UART_BPS 就設(shè)為 115200 。我們可以嘗試將串口波特率 UART_BPS 設(shè)置為其他值(如 9600 ),在模塊例化時(shí)會(huì)將這個(gè)變量傳遞到串口接收與發(fā)送模塊中,從而實(shí)現(xiàn)不同速率的串口通信。

2.4.1 代碼設(shè)計(jì)


module top_uart(
    input sys_clk , //外部 50MHz 時(shí)鐘
    input sys_rst_n, //系外部復(fù)位信號(hào),低有效
    
    //UART 端口 
    input uart_rxd , //UART 接收端口(串行數(shù)據(jù))
    output uart_txd //UART 發(fā)送端口
    );
    
    parameter CLK_FREQ = 50000000; //定義系統(tǒng)時(shí)鐘頻率
    parameter UART_BPS = 115200 ; //定義串口波特率
   
    //wire define
    wire uart_rx_done; //UART 接收完成信號(hào)
    wire [7:0] uart_rx_data; //UART 接收數(shù)據(jù)(并行數(shù)據(jù))
    wire uart_tx_busy;
 //*****************************************************
 //**                      main code
 //***************************************************** 
 //串口接收
   zdyz_rs232_rx #(
       .CLK_FREQ (CLK_FREQ),
       .UART_BPS (UART_BPS)
   )zdyz_rs232_rx(
    .sys_clk(sys_clk) , //系統(tǒng)時(shí)鐘
    .sys_rst_n(sys_rst_n) , //系統(tǒng)復(fù)位,低有效
    
    .uart_rxd(uart_rxd) , //UART 接收端口
    .uart_rx_done(uart_rx_done), //UART 接收完成信號(hào)
    .uart_rx_data(uart_rx_data)//UART 接收到的數(shù)據(jù)
); 
    
   zdyz_rs232_tx #(
       .CLK_FREQ (CLK_FREQ),
       .UART_BPS (UART_BPS)
   )zdyz_rs232_tx(
   .sys_clk(sys_clk) , //系統(tǒng)時(shí)鐘
   .sys_rst_n(sys_rst_n) , //系統(tǒng)復(fù)位,低有效
   .uart_tx_en(uart_rx_done) , //UART 的發(fā)送使能
   .uart_tx_data(uart_rx_data), //UART 要發(fā)送的數(shù)據(jù)
   .uart_txd(uart_txd) , //UART 發(fā)送端口 
   .uart_tx_busy(uart_tx_busy) //發(fā)送忙狀態(tài)信號(hào) 
); 
    
endmodule

2.4.2?仿真驗(yàn)證代碼

 `timescale 1ns/1ns //仿真的單位/仿真的精度
 
 module tb_uart_loopback();
 
//parameter define
parameter CLK_PERIOD = 20;//時(shí)鐘周期為 20ns

//reg define
 reg sys_clk ; //時(shí)鐘信號(hào)
 reg sys_rst_n; //復(fù)位信號(hào)
 reg uart_rxd ; //UART 接收端口

 //wire define
 wire uart_txd ; //UART 發(fā)送端口

 //*****************************************************
 //** main code
 //*****************************************************

 //發(fā)送 8'h55 8'b0101_0101
 initial begin
 sys_clk <= 1'b0;
 sys_rst_n <= 1'b0;
 uart_rxd <= 1'b1;
 #200
 sys_rst_n <= 1'b1; 
 #1000
 uart_rxd <= 1'b0; //起始位
 #8680

 uart_rxd <= 1'b1; //D0
 #8680
 uart_rxd <= 1'b0; //D1
 #8680
 uart_rxd <= 1'b1; //D2
 #8680
 uart_rxd <= 1'b0; //D3
 #8680
 uart_rxd <= 1'b1; //D4
 #8680
 uart_rxd <= 1'b0; //D5
 #8680
 uart_rxd <= 1'b1; //D6
 #8680
 uart_rxd <= 1'b0; //D7 
 #8680
 uart_rxd <= 1'b1; //停止位
 #8680
 uart_rxd <= 1'b1; //空閑狀態(tài) 
 end

 //50Mhz 的時(shí)鐘,周期則為 1/50Mhz=20ns,所以每 10ns,電平取反一次
 always #(CLK_PERIOD/2) sys_clk = ~sys_clk;

 //例化頂層模塊
 top_uart top_uart(
     .sys_clk (sys_clk ),
     .sys_rst_n (sys_rst_n),
     .uart_rxd (uart_rxd ),
     .uart_txd (uart_txd )
 );

 endmodule

2.4.3 仿真結(jié)果

ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信,FPGA掌握不牢固的知識(shí)點(diǎn)重塑,fpga開發(fā),筆記

2.4.4 板上驗(yàn)證

? ? ? ? 上述程序已經(jīng)經(jīng)過板上驗(yàn)證了,代碼正確,注意若發(fā)送和接受都選擇了16進(jìn)制的話,那么就輸入0~F,如果不選擇16進(jìn)制的話,就可以任意輸入阿拉伯?dāng)?shù)字和26個(gè)字母。

到了這里,關(guān)于ZYNQ 7020 之 FPGA知識(shí)點(diǎn)重塑筆記一——串口通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • FPGA知識(shí)點(diǎn)(不斷增加......)

    1.1讀寫同時(shí)進(jìn)行的FIFO ??對(duì)于讀寫同時(shí)進(jìn)行的FIFO,有一個(gè)簡(jiǎn)便計(jì)算深度的公式: ??FIFO_Depth = Burst_length -Burst_length* (rd_clk/ wr_clk)*(rd_rate) (其中Burst_length可以認(rèn)為是連續(xù)兩個(gè)cycle可以寫入的數(shù)據(jù)量) ??如:同步fifo,100個(gè)cycle可以寫入80個(gè)數(shù)據(jù),10個(gè)cycle可以讀出8個(gè)數(shù)據(jù),f

    2024年02月13日
    瀏覽(16)
  • 平時(shí)積累的FPGA知識(shí)點(diǎn)(9)

    平時(shí)積累的FPGA知識(shí)點(diǎn)(9)

    平時(shí)在FPGA群聊等積累的FPGA知識(shí)點(diǎn),第9期: 解釋:Xilinx公司的Zynq UltraScale+ RFSoC系列芯片進(jìn)行項(xiàng)目開發(fā),在某些芯片型號(hào)中,自身帶有SD-FEC硬核資源,具體查詢方式,可在Xilinx官方網(wǎng)站檢索DS889手冊(cè)。 SD-FEC集成塊硬核資料可在Xilinx網(wǎng)站下載,PG256便是該IP產(chǎn)品手冊(cè)。這個(gè)SD-FEC

    2024年02月20日
    瀏覽(20)
  • 平時(shí)積累的FPGA知識(shí)點(diǎn)(6)

    平時(shí)積累的FPGA知識(shí)點(diǎn)(6)

    平時(shí)在FPGA群聊等積累的FPGA知識(shí)點(diǎn),第六期: 原因:沒做時(shí)鐘約束,萬兆網(wǎng)接口的實(shí)現(xiàn),本質(zhì)上都是高速serdes,用IP的話,IP會(huì)自帶約束。 解釋:如果是7系列FPGA就要約束,之后的就不用。 解釋:上次閃退的時(shí)候破壞了run文件夾里的內(nèi)容,把這個(gè)文件夾刪除了之后就可以正常

    2024年02月20日
    瀏覽(24)
  • 平時(shí)積累的FPGA知識(shí)點(diǎn)(8)

    平時(shí)積累的FPGA知識(shí)點(diǎn)(8)

    平時(shí)在FPGA群聊等積累的FPGA知識(shí)點(diǎn),第八期: 有遇到過FFT IP核測(cè)量頻率不準(zhǔn)確的問題嗎?大部分情況下都是準(zhǔn)的,偶爾偏差比較大,IP核輸入的數(shù)據(jù)用matlab計(jì)算出的頻率是對(duì)的。 解釋:可能是采樣點(diǎn)數(shù)不對(duì), 如果采樣率是固定的,那只有點(diǎn)數(shù)會(huì)影響頻率了。IP不會(huì)自動(dòng)處理,要

    2024年02月20日
    瀏覽(18)
  • 平時(shí)積累的FPGA知識(shí)點(diǎn)(7)

    平時(shí)積累的FPGA知識(shí)點(diǎn)(7)

    平時(shí)在FPGA群聊等積累的FPGA知識(shí)點(diǎn),第七期: 解釋:ug949 解釋:無法單獨(dú)指定IP的使用方式。 解釋:是的,這一條命令對(duì)所有層次的子模塊都起作用 解釋:因?yàn)橛胷eport_high_fanout_net報(bào)告的net個(gè)數(shù)太少,把選項(xiàng)-max的值放大,同時(shí)添加選項(xiàng)fanout_greater_than 或者fanout_lesser_than 解釋:

    2024年02月20日
    瀏覽(24)
  • 【進(jìn)口控制器替代】基于Zynq-7020 FPGA的NI 8槽CompactRIO控制器

    【進(jìn)口控制器替代】基于Zynq-7020 FPGA的NI 8槽CompactRIO控制器

    667 MHz雙核CPU,512 MB DRAM,1 GB存儲(chǔ)容量,Zynq-7020 FPGA,更寬工作溫度范圍,8槽CompactRIO控制器 cRIO-9068是一款堅(jiān)固耐用的無風(fēng)扇嵌入式控制器,可用于高級(jí)控制和監(jiān)測(cè)應(yīng)用。這款軟件設(shè)計(jì)控制器搭載FPGA、運(yùn)行NI Linux Real-Time操作系統(tǒng)的實(shí)時(shí)處理器以及嵌入式用戶界面功能。cRIO-906

    2024年01月25日
    瀏覽(39)
  • 【ALINX】FPGA ZYNQ視頻教程AX7020教程—02_Vivoda初體驗(yàn)LED燈工程

    【ALINX】FPGA ZYNQ視頻教程AX7020教程—02_Vivoda初體驗(yàn)LED燈工程

    【ALINX】FPGA ZYNQ視頻教程——AX7010/AX7020教程——FPGA實(shí)驗(yàn)篇 File=New Project 工程文件命名:不能出現(xiàn)中文、空格等非法字符 選擇芯片型號(hào): 視頻定位鏈接 03:45 AX7020開發(fā)板速度選擇“ -2 ”;型號(hào)選擇“ xc7Z020clg400-2 ” ** Vivado窗口介紹 視頻定位鏈接05:44 視頻定位鏈接 08:43 1.選擇點(diǎn)

    2024年02月06日
    瀏覽(16)
  • redis核心知識(shí)點(diǎn)簡(jiǎn)略筆記

    value數(shù)據(jù)類型 string 二進(jìn)制安全 list 有序、可重復(fù) set 無序、不重復(fù) hash field-value的map sorted set 不重復(fù)、通過double類型score分?jǐn)?shù)排序 場(chǎng)景 string 計(jì)數(shù)器 緩存 分布式鎖 訪問頻率控制 分布式session hash 購物車等對(duì)象屬性靈活修改 list 定時(shí)排行榜 set 收藏 sorted set 實(shí)時(shí)排行榜 持久化

    2024年02月13日
    瀏覽(32)
  • CSP初賽知識(shí)點(diǎn) 學(xué)習(xí)筆記

    CSP初賽知識(shí)點(diǎn) 學(xué)習(xí)筆記

    對(duì)于咱們信奧選手來說,會(huì)做的題要堅(jiān)決不丟分,不會(huì)做的題要學(xué)會(huì)盡量多拿分,這樣你的競(jìng)賽之路才能一路亨通! 文件(文件夾)操作 點(diǎn)擊查看代碼 G++/Gcc 基礎(chǔ)指令 訪問速度:寄存器 () 高速緩存 () 內(nèi)存(ROM + RAM) () 外存,斷電僅保留 ROM 和外存中的數(shù)據(jù)。 (texttt

    2024年02月09日
    瀏覽(19)
  • 高等數(shù)學(xué)重積分知識(shí)點(diǎn)筆記小結(jié)

    高等數(shù)學(xué)重積分知識(shí)點(diǎn)筆記小結(jié)

    (1)首先知道什么叫曲頂柱體。(這里不多講,不會(huì)百度)。 (2)定義:設(shè)f(x,y)是有界閉區(qū)域D上的有界函數(shù),將閉區(qū)域D任意分成n個(gè)小閉區(qū)域oi,在每個(gè)小區(qū)域上取一點(diǎn)f(ai,bi),做乘積f(ai,bi)oi,并作和。如果當(dāng)各個(gè)閉區(qū)域的直徑中的最大值max趨近于0時(shí),這和的極限總存在,且

    2024年02月05日
    瀏覽(29)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包