FPGA串口收发(一):串口发送 - 源代码与仿真测试

FPGA入门 —— FPGA UART 串口通信 UART 通用异步收发传输器( Universal Asynchronous Receiver/Transmitter) ,通常称作 UART。UART 是一种通用的数据通信协议,也是异步串行通信口(串口)的总称,它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。它包括了ch340、 RS232、 RS499、 RS423、 RS422 和 RS485 等接口标准规范和总线标准规范。 阅读详情

串口发送的数据:0 -> A (1010) -> C (1100) ->0
时钟40MHz,波特率115200

1、源文件

uart_tx.v
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: Myminieye
// Engineer: Nill
//
// Create Date:  2020-05-29
// Design Name:
// Module Name:  uart_tx
// Project Name:
// Target Devices:
// Tool Versions:
// Description: 串口发送
// 三段式状态机,发送8位数据。波特率指定 115200
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
/////////////////////////////////////////////////////////////////////////////////
`define UD #1
module uart_tx #(
   parameter   BPS_NUM =  16'd347  // 时钟/波特率,用时钟周期构造波特率周期
    //  BPS_NUM = 40_000_000/115200 = 347.22 = 16'd347
    //  1 bit位宽所需时钟周期的个数。最长的波特率计数,10417,二进制有14位,取16位
    //  parameter BPS_4800: 40MHz set 8333 ; 50MHz set 10417  
    //  parameter BPS_9600: 40MHz set 4167 ; 50MHz set 5208  
    //  parameter BPS_115200: 40MHz set 347; 50MHz set 434    
)
(
    input clk,              //clock
    input [7:0]    tx_data, //等待发送的字节数据 uart tx data signal byte;
    

    input tx_pulse,         //外部传入,触发串口发送
    //input rx_finish,    //接收应答,表示接收完成(自发自收)
    output reg uart_tx,   // 发送模块串口发送信号线 uart tx transmit data line
    output tx_busy,        // 发送模块忙状态指示 uart tx module work states,high is busy;
    
    //仿真信号
    output reg tx_finish = 1'b0 //串口发送数据结束标志,8位数据发完,拉高一个BPS

);
//==========================================================================
//wire and reg 定义:信号与参数
//==========================================================================
    

    //parameter BPS_NUM_MID  = (BPS_NUM + 2'd1) / 2'd2 - 2'd1; //波特率周期的中间点
    reg [3:0] tx_cur_st    = 0;         //发送 当前状态
    reg [3:0] tx_nxt_st    = 0;         //发送 下一状态
    reg       tx_pulse_reg = 0;         //发送触发信号缓存
    reg [3:0] pulse_delay_cnt = 0;      //触发延时
    reg       tx_en = 0;                //开启串口发送,整个发送周期都拉高
    //data_gen模块 ,产生数据后,就开启串口发送  (write_en)->tx_en
    reg [2:0] tx_bit_cnt   = 0;         //发送位数,计数
    reg [15:0]clk_div_cnt  = 0;         //波特周期计数,计到一个波特周期
    reg [7:0] tx_data_reg  = 0;         //发送数据缓冲寄存器

//=================================================
// FSM Statement:状态声明
// 发送状态机4个状态:等待、发送起始位、发送数据、发送结束
//=================================================
    //one hot with zero idle
    localparam  [3:0] IDLE  = 4'b0000,  //tx state machine's state.空闲状态
                SEND_START  = 4'b0001,  //tx state machine's state.发送start状态
                SEND_DATA   = 4'b0010,  //tx state machine's state.发送数据状态
                SEND_STOP   = 4'b0100,  //tx state machine's state.发送stop状态
                SEND_END    = 4'b1000;  //tx state machine's state.发送结束状态

//==========================================================================
//logic:逻辑信号初始化与判断
//==========================================================================
    //发送模块:忙碌状态
    assign tx_busy = (tx_cur_st != IDLE);//非空闲,发送态忙
    //tx_cur_st = SEND_XXX,正在发送,忙状态
    //tx_cur_st = IDLE, 发送结束了/空闲状态,不忙
    //发送模块这8位发完了,传出tx_busy不忙,进入data_gen,又返回发送模块,tx_pulse触发下一组8位发送
    //触发串口发送 tx_pulse  0->1
    //打一拍,D触发器,构造上升沿触发
    always @ (posedge clk)
    begin
        tx_pulse_reg <= `UD tx_pulse;
    end

    //开启串口发送状态 tx_en:整个发送周期都拉高
    always @(posedge clk )
    begin
    // rstn复位 tx_en=0,在 data_gen中实现
        if(~tx_pulse_reg & tx_pulse)   //tx_pulse 上升沿触发
            tx_en <= 1'b1;
        else if(tx_cur_st == SEND_END) //串口发送结束,关闭串口发送
            tx_en <= 1'b0;
    end
    
    //时钟信号,波特周期计数器(时钟分频)
    always @ (posedge clk)
    begin   //发送触发信号,且打了一拍,时间也计到了一个波特周期
        if( (clk_div_cnt == BPS_NUM) || (~tx_pulse_reg & tx_pulse))
            clk_div_cnt   <= `UD 16'h0;
            //clk_out <= 16'h1;
        else
            clk_div_cnt   <= `UD clk_div_cnt + 16'h1;
            //clk_out <= 16'h0;
    end
    
    //发送数据状态中,发送bit位计数(8),以波特周期累加 count the number has transmited
    always @(posedge clk )
    begin
        if(!tx_en)
            tx_bit_cnt <= `UD 3'h0;
        else if((tx_bit_cnt == 3'h7) && (clk_div_cnt == BPS_NUM))
            tx_bit_cnt <= `UD 3'h0;
        else if ((tx_cur_st == SEND_DATA) && (clk_div_cnt == BPS_NUM))
            tx_bit_cnt <= `UD tx_bit_cnt +3'h1;
        else
            tx_bit_cnt <= `UD tx_bit_cnt;
    end
    
    //触发信号延时:触发条件进来,延时15个clk (4'hf)
    always @(posedge clk)
    begin
        if (tx_cur_st != IDLE)
            pulse_delay_cnt <= `UD 4'hf;
        else
            pulse_delay_cnt <= pulse_delay_cnt + 4'h1;
    end

//=================================================
// FSM input:1st always block:sequential state transition
// 第一段:时序电路 - 现态与次态转换
//=================================================
    //state change 状态跳转
    always @ (posedge clk)
        tx_cur_st <= tx_nxt_st;   //下一状态赋给当前状态
//=================================================
// FSM Change: 2nd always block:combinational condition judgment
// 第二段:组合电路 tate change condition 状态跳转条件及规律
//=================================================
  always @ (*)
    begin
        case(tx_cur_st)
            IDLE:      //4'b0000
            begin     //触发发送,15个时钟周期延时,再转到发送start状态
                if( (tx_en) & (pulse_delay_cnt == 4'hf) )
                    tx_nxt_st = SEND_START;//接收完成,可以开始发送数据
                else
                    tx_nxt_st = tx_cur_st;//否则,状态保持不变
            end
            SEND_START:    //4'b0001
            begin //发送一个波特周期的低电平后进入,发送数据状态
                if(clk_div_cnt == BPS_NUM)
                    tx_nxt_st = SEND_DATA;
                else
                    tx_nxt_st = tx_cur_st;
            end
            SEND_DATA:     //4'b0010
            begin 
                if((tx_bit_cnt == 3'h7) && (clk_div_cnt == BPS_NUM))
                    tx_nxt_st = SEND_STOP;
                else
                    tx_nxt_st = tx_cur_st;
            end
            SEND_STOP:     //4'b0100
            begin //计时8个波特周期后(发送了8bit数据),跳转到发送stop状态
                if(clk_div_cnt == BPS_NUM)
                    tx_nxt_st = SEND_END;
                else
                    tx_nxt_st = tx_cur_st;
            end
            SEND_END:      //4'b1000
                tx_nxt_st = IDLE;   //变化太快,1个clk,而不是1个BPS就跳转了
            default:    tx_nxt_st = IDLE;
        endcase
    end

//=================================================
// FSM Output:3rd always block:the sequential FSM output
// 第三段:状态输出,Moorer,判断当前状态Current State
//=================================================
    //发送数据给输出:并行转串行
    always @(posedge clk) begin
        if(tx_en) begin
            case(tx_cur_st)
                IDLE        : uart_tx <= `UD 1'h1;
                SEND_START  : begin
                    uart_tx   <= `UD 1'h0;  //发送数据,先把串口线拉低
                    tx_finish <= `UD 1'b0;  //串口发送数据结束标志,先拉低
                end
                SEND_DATA   : begin
                /* //-------------方法一、循环右移------------------------
                        tx_data_reg[6:0]  <= `UD tx_data_reg[7:1];
                        //已经有了完整8位数据,循环右移,高位依次移到低位/最低位0
                        uart_tx      <= `UD tx_data_reg[0];
                        //uart_tx数据输出, 每次把缓冲寄存器的最低位0传出去
                         //同一个clk触发 数据发送与移位,每次发送的是上一次的移位结果
                 */
                //------------方法二、计数到相应位,直接赋值------------
                    case(tx_bit_cnt)
                        3'h0    : uart_tx <= `UD tx_data[0];
                        3'h1    : uart_tx <= `UD tx_data[1];
                        3'h2    : uart_tx <= `UD tx_data[2];
                        3'h3    : uart_tx <= `UD tx_data[3];
                        3'h4    : uart_tx <= `UD tx_data[4];
                        3'h5    : uart_tx <= `UD tx_data[5];
                        3'h6    : uart_tx <= `UD tx_data[6];
                        3'h7    : uart_tx <= `UD tx_data[7];
                        default : uart_tx <= `UD 1'h1;
                    endcase
                end
                SEND_STOP   : begin
                    uart_tx <= `UD 1'h1;  //发送停止状态 输出1个波特周期高电平
                    //每次输出,uart_tx串行只传一位,不能直接把tx_data_reg 并行输出
                    tx_finish <= `UD 1'b1;  //串口发送数据结束标志,拉高
                end
                default     : begin
                    uart_tx <= `UD 1'h1; // 其他状态默认与空闲状态一致,保持高电平输出
                    tx_finish <= `UD 1'b0;
                end
            endcase
            //case(tx_cur_st)
        end
        else
            uart_tx <= `UD 1'h1;
    end
endmodule
//module uart_tx

2、仿真文件testbench

uart_tx_tb.v

`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: Myminieye
// Engineer: Nill
//
// Create Date:
// Design Name:
// Module Name:
// Project Name:
// Target Devices:
// Tool Versions:
// Description: 测试串口发送
// 串口发送的数据由内部提供:0 -> A (00001010) -> C (00001100)
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
`define UD #1
module tb_uart_tx();

//==========================================================================
//wire and reg 定义:信号与参数
//==========================================================================
    reg       sim_clk;      //模拟时钟信号
    reg       sim_rst_n;
    reg       tx_pulse;     // active posedge
    

    reg [7:0] tx_data;      //送入串口发送模块,准备发送的数据
    wire      uart_tx;      //串口发送信号线
    wire      tx_busy;      //串口发送模块状态
    //时钟参数
    parameter SYS_CLK_FRE = 40_000_000;     //系统频率40MHz  40_000_000
    parameter SYS_CLK_PERIOD = 1_000_000_000/SYS_CLK_FRE;  //周期25ns
    parameter BAUD_RATE = 115200;   //串口波特率
    parameter BAUD_RATE_PERIOD  = 1_000_000_000/BAUD_RATE;
    //波特率周期,0.104ms = 104us,1/9600 s = 1^9 /9600 ns = 4167 sim_clk
    //波特率周期, 1/115200 = 8680 ns  =  8.7us = 347 sim_clk
    parameter [15:0]  BPS_NUM = SYS_CLK_FRE / BAUD_RATE; //时钟/波特率,用时钟周期构造波特率周期
    //  BPS_NUM = 40_000_000/115200 = 347.22 = 16'd347
    //  1 bit位宽所需时钟周期的个数。最长的波特率计数,10417,二进制有14位,取16位
    //  parameter BPS_4800: 40MHz set 8333 ; 50MHz set 10417
    //  parameter BPS_9600: 40MHz set 4167 ; 50MHz set 5208
    //  parameter BPS_115200: 40MHz set 347; 50MHz set 434

//==========================================================================
//模拟:信号的输入,显示输出结果
//==========================================================================
    //模拟系统时钟:40MHz,25ns
    always #((SYS_CLK_PERIOD+1)/2-1) sim_clk = ~sim_clk; //延时,电平翻转
    initial begin
        //模拟复位信号:拉低一次
        #0;
            sim_clk = 1'b0;
            sim_rst_n = 1'b0;      //复位拉低,有效,
        //#RST_TIME;               //延时:保持足够长时间(至少5个clk)
        #BAUD_RATE_PERIOD;         //5个clk时间轴太短,仿真改为1个BPS,更明显
            sim_rst_n = 1'b1;      //解除复位       
        //==========================================================================
        //模拟串口发送:并行数据,串行输出
        //==========================================================================    
        

        tx_pulse = 0;
        tx_data = 8'd0; 
        repeat( BPS_NUM*1 ) @(posedge sim_clk);   //循环347个时钟周期,即一个波特率周期
        //#BAUD_RATE_PERIOD;        //直接延时,一个波特率周期      
        
        $display("Initialization complete. BAUD_RATE is %d",BAUD_RATE); //命令行显示初始化完成,输出BAUD_RATE
        //传递 第一组数据:8位并行数据,一次性送入串口发送模块
        tx_data = 8'hA;             //00001010
        #BAUD_RATE_PERIOD;
        
        //开启触发信号:串口发送
        tx_pulse = 1;               //高有效
        #BAUD_RATE_PERIOD;
        
        //结束触发:串口发送
        tx_pulse = 0;
        #BAUD_RATE_PERIOD;
        $display("The first tx_data  A (1010) has been sent.");  //命令行显示:第1组数据发送完
        //延时 12个 BPS 波特率周期,再发第二组数据
        repeat( BPS_NUM*12 ) @(posedge sim_clk);
        //传递 第二组数据:8位并行数据,一次性送入串口发送模块
        tx_data = 8'hC; //00001100
        #BAUD_RATE_PERIOD;
        
        //开启触发信号:串口发送
        tx_pulse = 1;
        #BAUD_RATE_PERIOD;
        
        //结束触发:串口发送
        tx_pulse = 0;
        #BAUD_RATE_PERIOD;
        $display("The second tx_data C (1100) has been sent.");   //命令行显示:第2组数据发送完
        
        repeat( BPS_NUM*5 ) @(posedge sim_clk);
            $stop;      //结束仿真
    end

//==========================================================================
//调用top模块
//==========================================================================
    //串口发送
    uart_tx #(
         //.CLK_SYS   (  SYS_CLK_FRE), //系统时钟
         .BPS_NUM (  BPS_NUM  )  // 时钟/波特率,用时钟周期构造波特率周期
     )
     u_uart_tx(
        .clk      (  sim_clk      ),// input       clk,
        .tx_data  (  tx_data  ),// input [7:0] tx_data,
        .tx_pulse (  tx_pulse   ),// input       外部输入,开始产生数据->开启串口发送状态
        .uart_tx  (  uart_tx  ),// output reg  uart_tx,
        .tx_busy  (  tx_busy  ) // output      输出,串口接收忙状态
    );

endmodule

3、ModelSim仿真结果

第一组数据 8’hA -> 00001010

在这里插入图片描述

第二组数据 8’Hc -> 00001100

在这里插入图片描述

命令行显示结果

在这里插入图片描述

FPGA—串口RS232(附实现代码) FPGA中RS232通信协议、如何避免亚稳态、uart串口通信、数据串行转并行 阅读详情

相关推荐

FPGA串口收发(二):串口接收 - 源代码与仿真测试

FPGA串口收发(二):串口接收 - 源代码与仿真测试 串行接收数据 1101_1000 ,转换为并行数据, 并显示 D8。 时钟40MHz,波特率115200 1、源文件 uart_rx.v `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: Myminieye // Engineer: Nill // // Create Da

踏雪的专栏 4331

基于FPGA的串口发送

待8位数据传输完成之后。

weixin_45739895的博客 2557

FPGA实现串口通信(RS232)含代码

硬件需求 带有CH340的FPAG开发板 接收模块 该模块的功能是接收通过 PC 机上的串口调试助手发送的固定波特率的数据,串口接收模块按照串口的协议准确接收串行数据,解析提取有用数据后需将其转化为并行数据;简单的说,接收模块的功能就是解析+串转并; 具体实现步骤如下: 1、算出波特率和FPGA时钟的对应关系 每个码元的持续时间=FPGA时钟计数Fclk/Baud次 例如波特率为9600,代表着每秒传输9600个码元,每个码元的持续时间为1/9600秒,设FPGA时钟为50MHz,则需要计数约5028次(细

m0_46272475的博客 8763

FPGA学习笔记(三)——串口通信之发送数据(调试过程)

本学习笔记主要参考小梅哥B站教学视频,网址如下: https://www.bilibili.com/video/BV1va411c7Dz?p=1 使用的编译器为Vivado,HDL语言为verilog

weixin_45719141的博客 5415

【深入浅出玩转FPGA学习13-----------测试用例设计1】

在输入被乘数后,启动乘法运算器,直到FPGA有效运算输出标志位done位置时,测试脚本将乘数、被乘数以及乘积保存到txt文本中,如图3.5所示,并且判断该输出是否正确,输出判断结果。因此,在Testbench的用例设计中,使用了遍历测试和随机测试,对发送出去的数据和接收到的数据进行检测对比,最后测试者只要根据打印输出的信息即可判断源代码的设计是否符合要求。对于这两种不同的测试观测手段,虽然波形观测较直观,但是该用例中所有512个结果都通过肉眼来观测肯定让人看花眼,而且还很浪费时间。...

暮雨中的坚果的博客 1406

FPGA调试心得

FPGA调试心得一、下载到板子上却是没有反应        用modelsim仿真,看看功能是否正确,测试文件应该要尽可能多的考虑各种问题。建议下载到板子之前要先做功能仿真。二、当代码写完后,仿真通过后,下载到板子上却是没有反应,可以尝试以下方法        a)仔细的看看警告的信息,没有错误并不代表就是正确的,还要看看警告的信息,            1)对那些一直为低或者为高的要注意,看看...

乘风的博客 9846

基于FPGA的串口(UART) 发送实验

串口通信之串口发送数据,每10ms发送一个数据,每次发送的数据比前一个数据大一;发送一四十位数据。

m0_70935984的博客 1671

FPGA实现串口的任意字节数发送

基于FPGA的任意字节数(单字节、多字节)的串口(UART)发送,真的不来看看吗?

孤独的单刀 1万+

FPGA基础入门【11】开发板USB-UART串口通信配置

上一篇教程介绍了NEXYS4 开发板中DDR2的使用方式,这一篇介绍不可或缺的网络接口RJ45在FPGA开发板中的使用 FPGA基础入门【11】开发板USB-UART串口通信配置开发板串口芯片 开发板串口芯片 NEXYS 4开发板自带一根USB mini-B线,在板子上的接口上写着PROG_UART,就是程序烧写和UART串口通信通用接口复用的。 用来实现串口通信的芯片名称是FTDI(Future...

qimoDIY的博客 2万+

FPGA UART串口源码详解:从协议到回环验证的完整指南

串口通信是嵌入式系统最基础的调试手段,而UART作为经典的异步串行协议,以简单的帧结构和灵活的波特率配置,成为FPGA开发中绕不开的必备技能。理解UART的工作原理,需要从起始位、数据位、停止位构成的帧格式入手,掌握收发双方如何通过波特率匹配实现无时钟线的可靠传输。在FPGA工程中,UART通常由状态机驱动的发送模块和基于中间采样法的接收模块组成,这种设计既能锻炼时序控制能力,又能直接服务于板级调试、数据采集、远程参数配置等真实场景。当串口收发通路出现乱码或丢帧时,通过回环测试、逻辑分析仪观察波形、核对分频

weixin_30983965的博客 256

LVGL字体优化实战:如何将中文字库放到外部SPI Flash并动态加载(节省内部RAM)

本文详细介绍了LVGL在嵌入式UI开发中如何通过外部SPI Flash存储中文字库并动态加载,以节省内部RAM资源。通过对比不同存储介质和字库格式,提供多种实现方案及性能优化技巧,帮助开发者在资源受限设备上实现高效的中文显示。

weixin_28693683的博客 345

FPGA串口收发(三):接收数据,再转发出去

FPGA串口收发(三):接收数据,再转发出去 功能:测试串口接收数据,再将数据从串口发出 // 模拟串口信号线,串行接收数据 1101_1000 ,转换为并行数据, 并显示 D8 // 把并行数据 D8 传给串口输出模块,串行输出数据 1101 1000 时钟40MHz,波特率115200 1、源文件 uart_rx.v uart_tx.v 2、仿真文件 testbench tb_uart_rx_tx.v `timescale 1ns / 1ps //////////////////////////////

踏雪的专栏 2180

别再只会用555了!手把手教你用运放和RC电路搭一个50Hz正弦波信号源(附Multisim仿真文件)

本文详细介绍了如何使用运放LM358和RC电路搭建一个精准的50Hz正弦波信号源,涵盖文氏电桥核心原理、单电源供电解决方案、Multisim仿真及实物调试技巧。通过实战指南和优化建议,帮助电子爱好者快速掌握低频信号生成技术,适用于各种测试和校准场景。

weixin_34116482的博客 366

串口发送数据_FPGA大赛【七】具体模块设计ddr+串口联合测试

【注】该项目是我们团队参加2019届全国大学生FPGA大赛的作品,系统主要实现视频任意角度旋转。该项目最终晋级决赛,并获得紫光同创企业特别奖。该系列文章介绍我们团队的作品。关注公众号“数字积木”对话框回复 FPGA2019 ,即可获得该项目的工程源代码,详细的文档说明,MATLAB仿真代码。4.5 ddr+串口联合测试4.5.1总体设计DDR端的数据通过AXI总线进行数据传输。在前面章节...

weixin_39767645的博客 340

高通8155车机系统里,安卓和QNX是怎么‘打电话’的?聊聊HAB通信框架那些事

本文深入解析了高通8155车机系统中HAB通信框架如何实现安卓与QNX的高效协同。作为异构系统的通信桥梁,HAB通过共享内存和中断信号机制,在多媒体数据传输中展现出零拷贝、硬件加速等优势,成为智能座舱实现实时性与生态丰富性平衡的关键技术。

weixin_42715608的博客 383

瑞萨芯片串口配置,基于RL78芯片的串口使用配置

在这里隆重给大家介绍瑞萨编辑器CS+ for CA 的自动生成代码功能,只需要配置几个参数,就可以得到你想要的串口配置了,我现在已经忘记怎么手动配置寄存器了,哈哈。选择设置,此时将端口设置成功接下来设置时钟,根据自己的芯片所需设置相应的时钟,自己芯片是什么时钟查看数据手册和原理图可以找到。瑞萨芯片的串口配置其实和ST芯片的串口配置差不多,只是ST芯片的中文数据手册比较多,就更好配置了,找到所需要的串口配置IO口,此时将UART0 配置为引脚P61和P62,瑞萨芯片的串口配置竟然要配置串口。

qq_45315904的博客 4303

FPGA大赛【七】具体模块设计--ddr+串口联合测试

FPGA大赛【七】具体模块设计--ddr+串口联合测试 【注】该项目是我们团队参加2019届全国大学生FPGA大赛的作品,系统主要实现视频任意角度旋转。该项目最终晋级决赛,并获得紫光同创企业特别奖。该系列文章介绍我们团队的作品。关注公众号“数字积木”对话框回复 FPGA2019 ,即可获得该项目的工程源代码,详细的文档说明,MATLAB仿真代码。 4.5 ddr+串口联合测试 ...

weixin_42905573的博客 1242

57、各向异性材料力学问题的分析与求解

本文系统分析了各向异性材料在扭转和平面变形问题中的力学行为,介绍了基于应力和位移的求解方法,包括应力函数推导、位移场假设、艾里应力函数法等。通过具体示例,如椭圆截面杆的扭转和各向异性板的均匀拉伸,展示了求解过程,并讨论了各向异性材料在工程应用中的意义及未来研究方向。

7h6j5k4l3的博客 204

UART接口的FPGA实现(二)——UART接口的Verilog代码实现以及仿真测试

废话不多说,先上源代码链接和testbench的链接,推荐使用UE查看源代码,UE中的VHDL语法、Verilog语法和SystemVerilog语法高亮文件的下载链接在这里。上篇的最后给出了本篇所附代码的uart通信模型的工作过程。本篇的主要内容在源代码里,因此文章内容略显简单。 一、寄存器描述 本篇所写的uart接口的内部寄存器的定义如下表: 表1 内部寄存器定义 寄存器名 地址 属性 说明 复位寄存器 0x00 w/r 低3位才有意义,第0位用于对发送电

mikusic的博客 2696

数据分析之AB测试基础知识

在 A/B 测试中,零假设是两组的指标是相同的,当假设检验推断出两组指标不同,但事实上两组指标相同时,就是第一类错误。

qq_45727498的博客 561

【脑肿瘤分类与迁移学习技术】Swin UNETR:当 Swin Transformer 遇见 3D 医学图像分割——从黑盒到白盒的逐层拆解

医学图像分割的终极目标是让算法成为医生的可靠副手,而非黑箱替代品。理解 Swin UNETR 的每一层如何流动、每一个窗口如何移位、每一次拼接如何融合,不仅是为了调参,更是为了在临床场景中。

u012133341的博客 55

PPGA 16 工程模块 uart_Tx串口发送模块设计

PPGA 16 工程模块 设计 uart_Tx串口发送模块设计 UART 发送时序图: 1、串口数据构成: 一个起始位 start,8个数据位,一个停止位STOP negedge_cnt =0 ; start = 0 ; negedge_cnt =1 ; DS =bit[0]; negedge_cnt =2 ; DS =bit[1]; negedge_cnt =3 ; DS =bit[2]; 串口发送模块有2个主要组件: ​ 1、波特率生成器,生成常用的波特率(如:9600,19200.

lj1986817902的博客 743

YOLOv11改进策略【卷积层】| DEConv: 强度信息与梯度特征融合的细节增强 适用于小目标与细节目标检测任务

本文记录的是利用 模块优化 的目标检测网络模型。(Detail-Enhanced Convolution,细节增强卷积)的设计旨在,解决 目标检测网络中传统普通卷积缺乏目标细节相关先验、对小目标边缘、目标与背景边界等关键细节捕捉能力不足的问题,同时避免引入额外参数量与计算开销,以适配 对实时推理性能与检测精度的双重需求。DEA-Net: Single image dehazing based on detail-enhanced convolution and content-guided atte

Limiiiing的博客 1498

在FPGA上实现Cortex-M3 MCU的RTL设计与仿真

这个项目的目的是实现一个完整的MCU硬件架构,支持用户程序的编译和运行。:作为核心控制器。AHB和APB总线:用于外部设备的数据传输。UART:串口收发模块。四通道定时器:用于定时中断的配置。SWD仿真模型:支持仿真测试和数据读写。firmware驱动:便于开发和调试。整个工程使用了cmsdk的模型IP,并通过FPGA IP核和AHB/APB生成代码实现。系统支持仿真测试和硬件仿真,可以在Altera或Xilinx FPGA上运行。

Q18080951的博客 607

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

FPGA串口通信与FIFO转发设计:项目推荐文章

FPGA串口通信与FIFO转发设计:项目推荐文章 去发现同类优质开源项目:https://gitcode.com/ FPGA串口通信与FIFO转发设计 FPGA串口通信与FIFO转发设计,一款基于FPGA平台的串口通信解决方案,内嵌FIFO缓存机制,提升数据处理效率。 项目介绍 在现代电子系统中,FPGA因其高度可编程性、灵活性和强大的并行处理能力而得到广泛应用。本项目正是针对FPGA平台上串口通...

gitblog_06737的博客 251

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: 群晖NAS公网访问(IP+DNSPOD+桥接+端口转发+DDNS+WebDAV)
下一篇: FPGA串口收发(二):串口接收 - 源代码与仿真测试
nomil9
博客等级 码龄15年 251粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值