设为首页 加入收藏

TOP

用状态机实现串口多字节数据发送(二)
2023-07-23 13:25:58 】 浏览:317
Tags:
nd_en; //8位数据的发送使能 wire tx_done; //8位数据的发送结束 reg [ 4:0] rounds; //需要发送的次数 uart_byte_tx //串口8位发送模块 # ( .TX_BAUD (9600), //波特率 .CLK_FQC (50_000_000)) //模块的时钟频率 uart_byte_tx_inst ( .Data (data_reg), .Send_en (send_en), .Clk (Clk), .Rst_n (Rst_n), .Uart_Tx (Uart_Tx), .Tx_done (tx_done) ); always @(posedge Clk or negedge Rst_n) begin //数据寄存 if(Rst_n == 0) bytes_data_reg <= 0; else if(Send_bytes_en) bytes_data_reg <= Bytes_data; else bytes_data_reg <= bytes_data_reg; end always @(posedge Clk or negedge Rst_n) begin //状态机 if(Rst_n == 0) begin state <= 0; data_reg <= 0; send_en <= 0; Tx_bytes_done <= 0; end else case(state) 0: begin if(Send_bytes_en) state <= 3'b1; else begin state <= 0; data_reg <= 0; send_en <= 0; Tx_bytes_done <= 0; end end 1: begin if(rounds == ROUNDS) begin Tx_bytes_done <= 1'b1; state <= 0; end else begin data_reg <= bytes_data_reg[7:0]; send_en <= 1'b1; state <= 3'd2; end end 2: begin send_en <= 0; if(tx_done) begin bytes_data_reg <= bytes_data_reg >> 8; state <= 3'd1; end else state <= 3'd2; end endcase end always @(posedge Clk or negedge Rst_n) begin //发送次数计数 if(Rst_n == 0) rounds <= 0; else if(rounds == ROUNDS & state == 1) rounds <= 0; else if(tx_done) rounds <= rounds + 1'b1; end endmodule

4、仿真验证

(1)仿真激励

`timescale 1ns / 1ps

module uart_bytes_tx_tb();

    reg Clk;
    reg Rst_n;
    reg Send_bytes_en;
    reg [63:0]Bytes_data;
    wire Tx_bytes_done;
    wire Uart_Tx;
    
    uart_bytes_tx_3   
  # (   .DATA_WIDTH             (64))
    uart_bytes_tx_inst
    (
        .Clk                    (Clk),
        .Rst_n                  (Rst_n),
        .Bytes_data             (Bytes_data),
        .Send_bytes_en          (Send_bytes_en),
        .Tx_bytes_done          (Tx_bytes_done),
        .Uart_Tx                (Uart_Tx)
    );
    defparam uart_bytes_tx_inst.uart_byte_tx_inst.BAUD_CNT = 10;
    
    initial Clk <= 1'b1;
    always #10 Clk <= ~Clk;
    
    initial begin
        Rst_n <= 0;
        Bytes_data <= 0;
        Send_bytes_en <= 0;
        #200
        Rst_n <= 1'b1;
        #20
        Bytes_data <= 64'h0123456789abcdef;
        Send_bytes_en <= 1'b1;
        #20
        Send_bytes_en <= 0;
        #20000
        Bytes_data <= 64'hfedcba9876543210;
        Send_bytes_en <= 1'b1;
        #20
        Send_bytes_en <= 0;
        @(posedge Tx_bytes_done)
        #100
        $stop;
    end

endmodule

(2)仿真波形

第一轮发送:
image
两轮发送:
image

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【HDLBits刷题笔记】15 Finding b.. 下一篇串口接收模块——verilog实现

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目