09 AB 10串口通信发送原理

这篇具有很好参考价值的文章主要介绍了09 AB 10串口通信发送原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        通用异步收发传输器( Universal Asynchronous Receiver/Transmitter, UART)是一种异步收发传输器,其在数据发送时将并行数据转换成串行数据来传输, 在数据接收时将接收到的串行数据转换成并行数据, 可以实现全双工传输和接收。它包括了 RS232、 RS449、 RS423、RS422 和 RS485 等接口标准规范和总线标准规范。 换句话说, UART 是异步串行通信的总称。而 RS232、 RS449、 RS423、 RS422 和 RS485 等,是对应各种异步串行通信口的接口标准和总线标准,它们规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容。

1. 09AB 基于FPGA的串口(UART)发送实验

  1. 串口通信模块设计的目的是用来发送数据的,因此需要有一个数据输入端口。
  2. 串口通信,支持不同的波特率,所以需要有一个波特率设置端口。
  3. 串口通信的本质就是将8位的并行数据,在不同的时刻传输并行数据的不同位,通过一根信号线将八位并行数据全部传出。
  4. 串口通信以1位的低电平标志串行传输的开始,待8位数据传输完成之后,再以1位的高电平标志传输的结束。
  5. 控制信号,控制并转串模块什么时候开始工作,什么时候一个数据发送完成?所以需要一个发送开始信号,以及一个发送完成信号

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

设计代码

  1. bps_cnt在空闲状态下保持为0,而bps_cnt为0会使得uart_tx为0,为了解决该问题,我们避开空闲状态下的bps_cnt=0,使bps_cnt从1开始判定。
  2. 但是这又会导致bps_cnt从0到1存在空闲,发送起始位时会延后一段数据位,于是我们将基础计数时间改为1时counter1开始加一。
  3. 为了出现bps_clk脉冲信号,当(div_cnt == (bps_dr - 1)成立时会输出1,我们利用该特性作为我们的脉冲信号。
  4. 我们要输入八位数据以及起始位和终止位共十位数据,为了保证十位数据完整输出,我们需要设置到第十一位停止,发送tx_done信号。
  5. 输入信号不能是reg类型,否则综合设计代码时报错:Non-net port key_in cannot be of mode input,写代码时遇到的问题。

 1.1 tx_done只保持1拍的方法

写法一相比于写法二来说,可以使bps_cnt等于11时只保持1拍,然后bps_cnt变为0,由于tx_done信号受bps_cnt影响,如果bps_cnt等于11只保持1拍就变为0的话,tx_done就可以变成我们需要的脉冲信号了(也只保持1拍为1的情况)。 

//写法一相比于写法二来说,可以使bps_cnt等于11时只保持1拍,
//然后bps_cnt变为0,由于tx_done信号受bps_cnt影响,
//如果bps_cnt等于11只保持1拍就变为0的话,
//tx_done就可以变成我们需要的脉冲信号了(也只保持1拍为1的情况)。  

   reg[3:0] bps_cnt;    
     always@(posedge clk or negedge rstn)
     if(!rstn)
         bps_cnt <= 0;
     else if(send_en)begin
         if(bps_cnt == 11)
         bps_cnt <= 0;
     else if(div_cnt == 1)   //写法1
            bps_cnt <= bps_cnt + 4'd1;
    end
    else
        bps_cnt <= 0;


    reg[3:0] bps_cnt;    
    always@(posedge clk or negedge rstn)
    if(!rstn)
        bps_cnt <= 0;
    else if(send_en)begin
        if(div_cnt == 1)    //写法2
            if(bps_cnt == 11)
                bps_cnt <= 0;
            else 
                bps_cnt <= bps_cnt + 4'd1;
    end
    else
        bps_cnt <= 0;
module uart_byte_tx(
    clk,
    rstn,
    blaud_set,
    data,
    send_en,
    uart_tx,
    tx_done
);
    
    input clk;
    input rstn;
    input [2:0]blaud_set;
    input [7:0]data;
    input send_en;
    output reg uart_tx;
    output tx_done;
    
    //Blaud_set = 0时,波特率 = 9600;
    //Blaud_set = 1时,波特率 = 19200;
    //Blaud_set = 2时,波特率 = 38400;
    //Blaud_set = 3时,波特率 = 57600;
    //Blaud_set = 4时,波特率 = 115200;
    
    reg[17:0] bps_dr;
    always@(*)
        case(blaud_set)
            0: bps_dr = 1000000000/9600/20;
            1: bps_dr = 1000000000/19200/20;
            2: bps_dr = 1000000000/38400/20;
            3: bps_dr = 1000000000/57600/20;
            4: bps_dr = 1000000000/115200/20;
        endcase
    
    wire bps_clk;
    assign bps_clk = (div_cnt == (bps_dr - 1)); //3.为了出现bps_clk脉冲信号

    reg[17:0] div_cnt;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        div_cnt <= 0;
    else if(send_en)begin
        if(bps_clk)
            div_cnt <= 0;
        else
            div_cnt <= div_cnt + 1'd1;
    end
    else
        div_cnt <= 0;    
    
    reg[3:0] bps_cnt;    
    always@(posedge clk or negedge rstn)
    if(!rstn)
        bps_cnt <= 0;
    else if(send_en)begin
        if(bps_cnt == 11)
            bps_cnt <= 0;
        else if(div_cnt == 1) //注意2
            bps_cnt <= bps_cnt + 4'd1;
    end
    else
        bps_cnt <= 0;
    
    reg tx_done;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        uart_tx <= 1'd1;
    else 
        case(bps_cnt)
            1: begin uart_tx <= 1'd0; tx_done <= 0; end //注意1
            2: uart_tx <= data[0];
            3: uart_tx <= data[1];
            4: uart_tx <= data[2];
            5: uart_tx <= data[3];
            6: uart_tx <= data[4];
            7: uart_tx <= data[5];
            8: uart_tx <= data[6];
            9: uart_tx <= data[7];
            10: uart_tx <= 1'd1;
            11: begin uart_tx <= 1'd1; tx_done <= 1; end //注意4
            default: uart_tx <= 1'd1;
        endcase
 
endmodule

仿真代码:

`timescale 1ns/1ns

module uart_byte_tx_tb();
    
    reg clk;
    reg rstn;
    reg [2:0] blaud_set;
    reg [7:0] data;
    reg send_en;
    wire uart_tx;
    wire tx_done;    
    
    uart_byte_tx uart_byte_tx_inst(
        .clk(clk),
        .rstn(rstn),
        .blaud_set(blaud_set),
        .data(data),
        .send_en(send_en),
        .uart_tx(uart_tx),
        .tx_done(tx_done)
    );
    
    initial clk = 1;
    always #10 clk = ~clk;
    
    initial begin
        rstn = 0;
        data = 0;
        send_en = 0;
        blaud_set = 4;
        #201;
        rstn = 1;
        #100
        data = 8'h57;
        send_en = 1;
        #20;
        @(posedge tx_done);
        send_en = 0;
        #20000;
        data = 8'h75;
        send_en = 1;
        #20;
        @(posedge tx_done);
        #20000;
        send_en = 0;
        $stop;
    
    end

endmodule

仿真波形

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

2. 10 串口发送应用之发送数据

使用上一节课设计的串口发送模块,设计一个数据发送器,每10ms以115200的波特率发送一个数据,每次发送的数据比前一个数据大一(计数器)。

在实际应用的时候,我们不能通过counter去控制data,只能通过控制信号去控制。要求就是通过tx_done和send_en这两个控制信号,控制我要发送的数据内容。

思路:通过顶层模块调用uart_byte_tx发送模块来发送数据,将顶层模块命名为uart_tx_test。

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

 设计代码(第一版,不完善)

2.1 直接使用上一节的uart_byte_tx模块:

module uart_tx_test(
    clk,
    rstn,
    uart_tx
);

    input clk;
    input rstn;
    output uart_tx;
    
    reg [7:0] data;
    reg send_en;
    uart_byte_tx uart_byte_tx_inst(
        .clk(clk),
        .rstn(rstn),
        .blaud_set(3'd4),
        .data(data),
        .send_en(send_en),
        .uart_tx(uart_tx),
        .tx_done(tx_done)
    );
         
    //10ms周期计数器
    reg [18:0] counter;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        counter <= 0;
    else if(counter == 499999)
        counter <= 0;
    else
        counter <= counter + 1'd1;
      
    always@(posedge clk or negedge rstn)
    if(!rstn)
        send_en <= 0;
    else if(counter == 0)
        send_en <= 1;
    else if(tx_done)
        send_en <= 0;
        
    always@(posedge clk or negedge rstn)
    if(!rstn)
        data <= 8'b0000_0000;
    else if(tx_done)
        data <= data + 1'd1;

    
endmodule
module uart_byte_tx(
    clk,
    rstn,
    blaud_set,
    data,
    send_en,
    uart_tx,
    tx_done
);
    
    input clk;
    input rstn;
    input [2:0]blaud_set;
    input [7:0]data;
    input send_en;
    output reg uart_tx;
    output tx_done;
    
    //Blaud_set = 0时,波特率 = 9600;
    //Blaud_set = 1时,波特率 = 19200;
    //Blaud_set = 2时,波特率 = 38400;
    //Blaud_set = 3时,波特率 = 57600;
    //Blaud_set = 4时,波特率 = 115200;
    
    reg[17:0] bps_dr;
    always@(*)
        case(blaud_set)
            0: bps_dr = 1000000000/9600/20;
            1: bps_dr = 1000000000/19200/20;
            2: bps_dr = 1000000000/38400/20;
            3: bps_dr = 1000000000/57600/20;
            4: bps_dr = 1000000000/115200/20;
        endcase
    
    wire bps_clk;
    assign bps_clk = (div_cnt == (bps_dr - 1)); 

    reg[17:0] div_cnt;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        div_cnt <= 0;
    else if(send_en)begin
        if(bps_clk)
            div_cnt <= 0;
        else
            div_cnt <= div_cnt + 1'd1;
    end
    else
        div_cnt <= 0;    
    
    reg[3:0] bps_cnt;    
    always@(posedge clk or negedge rstn)
    if(!rstn)
        bps_cnt <= 0;
    else if(send_en)begin
        if(bps_cnt == 11)
            bps_cnt <= 0;
        else if(div_cnt == 1) 
            bps_cnt <= bps_cnt + 4'd1;
    end
    else
        bps_cnt <= 0;
    
    reg tx_done;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        uart_tx <= 1'd1;
    else 
        case(bps_cnt) //不完善
            1: begin uart_tx <= 1'd0; tx_done <= 0; end 
            2: uart_tx <= data[0];
            3: uart_tx <= data[1];
            4: uart_tx <= data[2];
            5: uart_tx <= data[3];
            6: uart_tx <= data[4];
            7: uart_tx <= data[5];
            8: uart_tx <= data[6];
            9: uart_tx <= data[7];
            10: uart_tx <= 1'd1;
            11: begin uart_tx <= 1'd1; tx_done <= 1; end
            default: uart_tx <= 1'd1;
        endcase
 
endmodule

仿真代码

`timescale 1ns / 1ps

module uart_tx_test_tb();
    
    reg clk;
    reg rstn;
    wire uart_tx;
    
    uart_tx_test uart_tx_test_inst(
        .clk(clk),
        .rstn(rstn),
        .uart_tx(uart_tx)
    );
    
    initial clk = 1;
    always #10 clk = ~clk;
    
    initial begin
        rstn = 0;
        #201;
        rstn = 1;
        #200000000
        $stop;
    end

endmodule

仿真波形

data确实在一直加一,但是data并未发出(uart_tx一直保持为1)

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

2.2 修改tx_done逻辑后(能运行)

设计代码

module uart_tx_test(
    clk,
    rstn,
    uart_tx
);

    input clk;
    input rstn;
    output uart_tx;
    
    reg [7:0] data;
    reg send_en;
    uart_byte_tx uart_byte_tx_inst(
        .clk(clk),
        .rstn(rstn),
        .blaud_set(3'd4),
        .data(data),
        .send_en(send_en),
        .uart_tx(uart_tx),
        .tx_done(tx_done)
    );
         
    //10ms周期计数器
    reg [18:0] counter;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        counter <= 0;
    else if(counter == 499999)
        counter <= 0;
    else
        counter <= counter + 1'd1;
      
    always@(posedge clk or negedge rstn)
    if(!rstn)
        send_en <= 0;
    else if(counter == 0)
        send_en <= 1;
    else if(tx_done)
        send_en <= 0;
        
    always@(posedge clk or negedge rstn)
    if(!rstn)
        data <= 8'b0000_0000;
    else if(tx_done)
        data <= data + 1'd1;

    
endmodule
module uart_byte_tx(
    clk,
    rstn,
    blaud_set,
    data,
    send_en,
    uart_tx,
    tx_done
);
    
    input clk;
    input rstn;
    input [2:0]blaud_set;
    input [7:0]data;
    input send_en;
    output reg uart_tx;
    output tx_done;
    
    //Blaud_set = 0时,波特率 = 9600;
    //Blaud_set = 1时,波特率 = 19200;
    //Blaud_set = 2时,波特率 = 38400;
    //Blaud_set = 3时,波特率 = 57600;
    //Blaud_set = 4时,波特率 = 115200;
    
    reg[17:0] bps_dr;
    always@(*)
        case(blaud_set)
            0: bps_dr = 1000000000/9600/20;
            1: bps_dr = 1000000000/19200/20;
            2: bps_dr = 1000000000/38400/20;
            3: bps_dr = 1000000000/57600/20;
            4: bps_dr = 1000000000/115200/20;
        endcase
    
    wire bps_clk;
    assign bps_clk = (div_cnt == 1);
    reg[17:0] div_cnt;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        div_cnt <= 0;
    else if(send_en)begin
        if(div_cnt == (bps_dr - 1))
            div_cnt <= 0;
        else
            div_cnt <= div_cnt + 1'd1;
    end
    else
        div_cnt <= 0;    
    
    reg[3:0] bps_cnt;    
    always@(posedge clk or negedge rstn)
    if(!rstn)
        bps_cnt <= 0;
    else if(send_en)begin
        if(bps_cnt == 11)
            bps_cnt <= 0;
        else if(div_cnt == 1)
            bps_cnt <= bps_cnt + 4'd1;
    end
    else
        bps_cnt <= 0;
    
    reg tx_done;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        uart_tx <= 1'd1;
    else 
        case(bps_cnt)
            0: tx_done <= 0;
            1: uart_tx <= 1'd0;
            2: uart_tx <= data[0];
            3: uart_tx <= data[1];
            4: uart_tx <= data[2];
            5: uart_tx <= data[3];
            6: uart_tx <= data[4];
            7: uart_tx <= data[5];
            8: uart_tx <= data[6];
            9: uart_tx <= data[7];
            10: uart_tx <= 1'd1;
            11: begin uart_tx <= 1'd1; tx_done <= 1; end
            default: uart_tx <= 1'd1;
        endcase
 
endmodule

仿真波形

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

 09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

2.3 完善串口模块,使其能接入数据采集模块

  • 数据采集模块data_gen,每采集到一个数据data result[7:0],会产生一个data_done的脉冲信号,uart串口在就接收到data_done的脉冲信号后会将data result[7:0]发送出去。
  • 思路:我们可以利用脉冲信号data_done来使能我们的send_en信号,然后将接收到的data result[7:0]通过串口发送
  • 为了模拟这个过程,我们让顶层uart_tx_test每隔10ms产生一个data[7:0]和一个send_go的单脉冲信号发送给uart_byte_tx模块。让uart_byte_tx模块根据send_go脉冲信号去发数据即可。
  • 为了防止数据发送途中data发生变化,我们在接收到send_go信号后,先将data存储起来,即声明一个r_data[7:0],使将data[7:0]的值赋值给r_data[7:0]。

 09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

 设计代码

module uart_tx_test1(
    clk,
    rstn,
    uart_tx
);

    input clk;
    input rstn;
    output uart_tx;
    
    reg [7:0] data;
    reg send_go;
    uart_byte_tx uart_byte_tx_inst(
        .clk(clk),
        .rstn(rstn),
        .blaud_set(3'd4),
        .data(data),
        .send_go(send_go),
        .uart_tx(uart_tx),
        .tx_done(tx_done)
    );
         
    //10ms周期计数器
    reg [18:0] counter;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        counter <= 0;
    else if(counter == 499999)
        counter <= 0;
    else
        counter <= counter + 1'd1;
      
    always@(posedge clk or negedge rstn)
    if(!rstn)
        send_go <= 0;
    else if(counter == 0)
        send_go <= 1;
    else
        send_go <= 0;
        
    always@(posedge clk or negedge rstn)
    if(!rstn)
        data <= 8'b0000_0000;
    else if(tx_done)
        data <= data + 1'd1;

    
endmodule
module uart_byte_tx(
    clk,
    rstn,
    blaud_set,
    data,
    send_go,
    uart_tx,
    tx_done
);
    
    input clk;
    input rstn;
    input [2:0]blaud_set;
    input [7:0]data;
    input send_go;
    output reg uart_tx;
    output tx_done;
    
    //Blaud_set = 0时,波特率 = 9600;
    //Blaud_set = 1时,波特率 = 19200;
    //Blaud_set = 2时,波特率 = 38400;
    //Blaud_set = 3时,波特率 = 57600;
    //Blaud_set = 4时,波特率 = 115200;
    
    reg[17:0] bps_dr;
    always@(*)
        case(blaud_set)
            0: bps_dr = 1000000000/9600/20;
            1: bps_dr = 1000000000/19200/20;
            2: bps_dr = 1000000000/38400/20;
            3: bps_dr = 1000000000/57600/20;
            4: bps_dr = 1000000000/115200/20;
        endcase
        
    reg [7:0] r_data;
    always@(posedge clk)
    if(send_go)
        r_data <= data;
    else
        r_data <= r_data;
        
    reg send_en;  
    always@(posedge clk or negedge rstn)
    if(!rstn)
        send_en <= 0;
    else if(send_go)
        send_en <= 1;
    else if(tx_done)
        send_en <= 0;
        
    
    wire bps_clk;
    assign bps_clk = (div_cnt == 1);
    reg[17:0] div_cnt;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        div_cnt <= 0;
    else if(send_en)begin
        if(div_cnt == (bps_dr - 1))
            div_cnt <= 0;
        else
            div_cnt <= div_cnt + 1'd1;
    end
    else
        div_cnt <= 0;    
    
    reg[3:0] bps_cnt;    
    always@(posedge clk or negedge rstn)
    if(!rstn)
        bps_cnt <= 0;
    else if(send_en)begin
        if(bps_cnt == 11)
            bps_cnt <= 0;
        else if(div_cnt == 1)
            bps_cnt <= bps_cnt + 4'd1;
    end
    else
        bps_cnt <= 0;
    
    reg tx_done;
    always@(posedge clk or negedge rstn)
    if(!rstn)
        uart_tx <= 1'd1;
    else 
        case(bps_cnt)
            0: tx_done <= 0;
            1: uart_tx <= 1'd0;
            2: uart_tx <= r_data[0];
            3: uart_tx <= r_data[1];
            4: uart_tx <= r_data[2];
            5: uart_tx <= r_data[3];
            6: uart_tx <= r_data[4];
            7: uart_tx <= r_data[5];
            8: uart_tx <= r_data[6];
            9: uart_tx <= r_data[7];
            10: uart_tx <= 1'd1;
            11: begin uart_tx <= 1'd1; tx_done <= 1; end
            default: uart_tx <= 1'd1;
        endcase
 
endmodule

仿真代码

`timescale 1ns / 1ps

module uart_tx_test_tb();
    
    reg clk;
    reg rstn;
    wire uart_tx;
    
    uart_tx_test1 uart_tx_test_inst(
        .clk(clk),
        .rstn(rstn),
        .uart_tx(uart_tx)
    );
    
    initial clk = 1;
    always #10 clk = ~clk;
    
    initial begin
        rstn = 0;
        #201;
        rstn = 1;
        #200000000
        $stop;
    end

endmodule

仿真波形

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

 在开发板上跑程序

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习

调试结果:确实按照每100ms法发一个数据

09 AB 10串口通信发送原理,verilog学习,fpga开发,笔记,经验分享,学习文章来源地址https://www.toymoban.com/news/detail-829482.html

到了这里,关于09 AB 10串口通信发送原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA教程案例40】通信案例10——基于FPGA的简易OFDM系统verilog实现

    FPGA教程目录 MATLAB教程目录 --------------------------------------------------------------------------------------- 目录 1.软件版本 2.OFDM原理 3.OFDM系统的verilog实现

    2024年02月12日
    浏览(54)
  • 【FPGA零基础学习之旅#14】串口发送字符串

    🎉欢迎来到FPGA专栏~串口发送字符串 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 发送Hello: 🥝 发送数字字符并自

    2024年02月08日
    浏览(40)
  • 【FPGA零基础学习之旅#13】串口发送模块设计与验证

    🎉欢迎来到FPGA专栏~串口发送模块 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 发送测试: 🥝 issp调试测试: 数据

    2024年02月09日
    浏览(55)
  • 蓝桥杯模块学习10——串口通信(深夜学习——单片机)

    51单片机——串口通信详解(STC89C51为例)_佛科院深夜学习的博客-CSDN博客 (1)波特率与SMOD无关 (2)波特率等于溢出率除4 (1)T2R:控制定时器2是否允许使用,置“1”为允许 (2)T2_C/T:控制定时器2用作定时器还是计数器,置“0”为定时器(默认) (3)T2X12:控制定时器

    2023年04月08日
    浏览(51)
  • 【FPGA/verilog -入门学习10】verilog 查表法实现正弦波形发生器

    用查找表设计实现一个正弦波形发生器 寻址的位宽是10位,数据量是1024个,输出的数据是16位 数据量是1024个: x = linspace(0,2*pi,1024) 输出数据是16位: y范围:0~2^16 -1 = 0~65535 y =( sin(x)+1)*65535/2 寻址的位宽是10位 输入是0~1023 1023 占用10位 操作步骤 1,使用matlab 生成数据,制作

    2024年02月05日
    浏览(66)
  • 串口通信实现-串口接收(vivado&verilog版)

    串口系列知识分享: (1)串口通信实现-串口发送 (2)串口通信发送多字节数据 (3)串口通信实现-串口接收 (4)UART 通信-使用VIO进行板级验证 (5)串口接收-控制LED闪烁 (6)使用串口发送实现ACX720开发板时钟显示 (7)串口发送+RAM+VGA传图 此文介绍uart串口协议(串口接

    2024年02月12日
    浏览(35)
  • Verilog(1)UART串口通信

    第一部分为uart串口通信的接收部分,用pc端虚拟串口来对其发送数据。 第三部分为uart串口通信的发送部分,用此部分对pc端虚拟串口发送数据。 第二部分loop,处理数据,形成回环,使发送部分有数据来源,以此来保证实验的完成。 串口接收 :  输入: sys_clk、sys_rst_n、u

    2024年02月03日
    浏览(78)
  • 基于FPGA的串口发送

    串口简称UART 设计的 目的 是用来发送数据的,因此需要有一个数据输入端口,用来发送这8bit数据。 类似于实验中的Ctrl,用来指定亮灭模式 支持 不同的波特率,所以需要有一个波特率设置端口。 类似于计数器实验中的Time 如下图所示, 本质 是把这8位的并行数据通过一根信

    2024年02月15日
    浏览(35)
  • FPGA 按键控制串口发送

    消抖时间一般为10ms,我使用的板子是ACX720,晶振为50MHZ,20ns为一周期。 状态机 模块设计 设计文件 仿真验证 **注意:**电平信号的传输线中有一个参考电平线(一般是GND),然后信号线上的信号值是由信号线电平和参考电平线的电压差决定。 所以我们一定要养成模块之间共地的

    2024年04月11日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包