【FPGA】FPGA实现UART串口通信回环

2023-05-16

目录

  • 一、UART协议基础
  • 二、系统模块划分
  • 三、代码实现
    • 1、uart顶层设计模块
    • 2、uart_rx串口数据接收模块
    • 3、control控制模块
    • 4、uart_tx串口数据发送模块
  • 四、仿真
  • 五、上板验证
  • 六、踩坑事项

一、UART协议基础

关于UART协议的基础理论部分已经在上一篇文章中讲述,不再重复介绍。
UART通信协议
本文主要介绍如何使用Verlilog编程,通过FPGA实现UART串口通信回环工程。在本工程中所使用的系统时钟为50MHz,如果选择115200的波特率进行数据传输,那么传输1bit所用的时钟周期数就是50_000_000 / 115200。

二、系统模块划分

在这里插入图片描述
uart模块: uart串口通信顶层设计模块,包含uart_tx、uart_rx、control模块。
uart_rx模块: UART串口数据接收模块,将上位机发送的串行数据接收后转换成并行数据发送给control模块。
control模块: UART控制模块,将接收到的并行数据存储到FIFO中,当读FIFO条件满足时输出。
uart_tx模块: UART串口数据发送模块,将从control读出的并行数据转换成串行数据发送给上位机。

三、代码实现

1、uart顶层设计模块

//  **************************************************************
//  Author: Zhang JunYi
//  Create Date: 2022.11.04                        
//  Design Name: uart    
//  Module Name: uart         
//  Target Device: Cyclone IV E (EP4CE6F17C8)             
//  Tool versions: Quartus Prime 18.1             
//  Description: UART串口通信顶层设计模块                               
//  **************************************************************           
module uart (
    input               clk             ,
    input               rst_n           ,

    input               uart_rxd        ,
    output              uart_txd         
);

    //  信号定义
    wire    [7:0]       rx_dout         ;
    wire                rx_dout_vld     ;
    wire    [7:0]       ctrl_dout       ;   
    wire                ctrl_dout_vld   ;
    wire                ready           ;

    //  模块例化
    uart_rx u_uart_rx (
        /*input               */.clk             (clk           ),
        /*input               */.rst_n           (rst_n         ),
        /*input               */.uart_rx         (uart_rxd      ),       //  接收到的串口数据
  
        /*output  [7:0]       */.rx_dout         (rx_dout       ),       //  串行数据转换成并行数据后输出给control模块
        /*output              */.rx_dout_vld     (rx_dout_vld   )
    );

    control u_control (
        /*input               */.clk             (clk           ),
        /*input               */.rst_n           (rst_n         ),
        /*//  uart_rx*/
        /*input   [7:0]       */.rx_din          (rx_dout       ),
        /*input               */.rx_din_vld      (rx_dout_vld   ),
        /*//  uart_tx*/
        /*input               */.ready           (ready         ),
        /*output  [7:0]       */.ctrl_dout       (ctrl_dout     ),
        /*output              */.ctrl_dout_vld   (ctrl_dout_vld )
    );

    uart_tx u_uart_tx (
        /*input               */.clk            (clk            ),
        /*input               */.rst_n          (rst_n          ),
        /*//  control*/
        /*input   [7:0]       */.tx_din         (ctrl_dout      ),
        /*input               */.tx_din_vld     (ctrl_dout_vld  ),
        /*output              */.ready          (ready          ),       //  给control模块的握手信号,表示可以接收数据进行发送 
        /*//  上位机*/
        /*output              */.uart_tx        (uart_txd       )
    );
    
endmodule


2、uart_rx串口数据接收模块

//  **************************************************************
//  Author: Zhang JunYi
//  Create Date: 2022.11.04                        
//  Design Name: uart    
//  Module Name: uart_rx         
//  Target Device: Cyclone IV E (EP4CE6F17C8)             
//  Tool versions: Quartus Prime 18.1             
//  Description: UART串口通信数据接收模块                               
//  **************************************************************     
`include "param.v"      
module uart_rx (
    input               clk             ,
    input               rst_n           ,
    input               uart_rx         ,       //  接收到的串口数据

    output  [7:0]       rx_dout         ,       //  串行数据转换成并行数据后输出给control模块
    output              rx_dout_vld     
);

    //  参数定义

    //  信号定义
    reg     [19:0]      cnt_baud        ;       //      波特率计数器
    wire                add_cnt_baud    ;
    wire                end_cnt_baud    ; 

    reg     [3:0]       cnt_bit         ;       //      bit计数器
    wire                add_cnt_bit     ;
    wire                end_cnt_bit     ;

    reg                 rx_flag         ;       //  开始接收数据标志
    reg     [1:0]       uart_rx_r       ;       //  uart_rx同步打拍
    wire                rx_nedge        ;       //  uart_rx下降沿

    reg     [9:0]       dout_data       ;

    //  cnt_baud
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_baud <= 0 ;
        end
        else if(add_cnt_baud)begin
            if(end_cnt_baud)begin
                cnt_baud <= 0 ;
            end				
            else begin	    
                cnt_baud <= cnt_baud + 1 ;
            end 		    
        end
    end
    assign	add_cnt_baud =	rx_flag ;
    assign	end_cnt_baud =  add_cnt_baud && (cnt_baud == `BAUD - 1) ;

    //  cnt_bit
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_bit <= 0 ;
        end
        else if(add_cnt_bit)begin
            if(end_cnt_bit)begin
                cnt_bit <= 0 ;
            end				
            else begin	    
                cnt_bit <= cnt_bit + 1 ;
            end 		    
        end
    end
    assign	add_cnt_bit = end_cnt_baud ;
    assign	end_cnt_bit = add_cnt_bit && (cnt_bit == 9 || dout_data[0] == 1'b1) ;       

    //  uart_rx_r
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            uart_rx_r <= 0 ;
        end
        else begin
            uart_rx_r <= {uart_rx_r[0],uart_rx} ;
        end
    end

    //  uart_rx下降沿检测
    assign  rx_nedge = ~uart_rx_r[0] & uart_rx_r[1] ;

    //  rx_flag
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            rx_flag <= 1'b0 ;
        end
        else if(rx_nedge)begin
            rx_flag <= 1'b1 ;
        end
        else if(end_cnt_bit)begin
            rx_flag <= 1'b0 ;
        end
    end

    //  dout_data
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            dout_data <= 0 ;
        end
        else if(rx_flag & cnt_baud == 0)begin
            dout_data[cnt_bit] <= uart_rx_r[0] ;
        end
    end

    //  输出
    assign  rx_dout = dout_data[8:1] ;
    assign  rx_dout_vld = end_cnt_bit && dout_data[0] == 1'b0 ;

endmodule

3、control控制模块

//  **************************************************************
//  Author: Zhang JunYi
//  Create Date: 2022.11.04                        
//  Design Name: uart    
//  Module Name: control         
//  Target Device: Cyclone IV E (EP4CE6F17C8)             
//  Tool versions: Quartus Prime 18.1             
//  Description: UART串口通信控制模块                               
//  **************************************************************     
`include "param.v"      
module control (
    input               clk             ,
    input               rst_n           ,
    //  uart_rx
    input   [7:0]       rx_din          ,
    input               rx_din_vld      ,
    //  uart_tx
    input               ready           ,
    output  [7:0]       ctrl_dout       ,
    output              ctrl_dout_vld   
);

    //  参数定义

    //  信号定义
    wire                rdreq           ;
    wire                wrreq           ;
    wire    [7:0]       fifo_q          ;
    wire                rdempty         ;
    wire    [2:0]       rdusedw         ;
    wire                wrfull          ;
    wire    [2:0]       wrusedw         ;

    reg                 rd_flag         ;       //  fifo可读标志

    //  rd_flag
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            rd_flag <= 1'b0 ;
        end
        else if(rdusedw > 4)begin
            rd_flag <= 1'b1 ;
        end
        else if(rdempty)begin
            rd_flag <= 1'b0 ;
        end
    end

    //  fifo例化
    fifo	fifo_inst (
	    .aclr       ( ~rst_n        ),
	    .data       ( rx_din        ),
	    .rdclk      ( clk           ),
	    .rdreq      ( rdreq         ),
	    .wrclk      ( clk           ),
	    .wrreq      ( wrreq         ),

	    .q          ( fifo_q        ),
	    .rdempty    ( rdempty       ),
	    .rdusedw    ( rdusedw       ),
	    .wrfull     ( wrfull        ),
	    .wrusedw    ( wrusedw       )
	);

    assign  wrreq = ~wrfull && rx_din_vld ;
    assign  rdreq = rd_flag && ready ;

    //  输出
    assign  ctrl_dout = fifo_q ;
    assign  ctrl_dout_vld = rdreq ;
    
endmodule

4、uart_tx串口数据发送模块

//  **************************************************************
//  Author: Zhang JunYi
//  Create Date: 2022.11.04                        
//  Design Name: uart    
//  Module Name: uart_tx         
//  Target Device: Cyclone IV E (EP4CE6F17C8)             
//  Tool versions: Quartus Prime 18.1             
//  Description: UART串口通信数据发送模块模块                               
//  **************************************************************     
`include "param.v"  
module uart_tx (
    input               clk             ,
    input               rst_n           ,
    //  control
    input   [7:0]       tx_din          ,
    input               tx_din_vld      ,
    output              ready           ,       //  给control模块的握手信号,表示可以接收数据进行发送 
    //  上位机
    output              uart_tx         
);
    
    //  参数定义

    //  信号定义
    reg     [19:0]      cnt_baud        ;       //  波特率计数器
    wire                add_cnt_baud    ;
    wire                end_cnt_baud    ; 

    reg     [3:0]       cnt_bit         ;       //  bit计数器
    wire                add_cnt_bit     ;
    wire                end_cnt_bit     ;

    reg                 tx_flag         ;       //  数据传输标志

    reg     [9:0]       tx_data         ;       //  寄存将要发送的数据
    reg                 dout            ;       //  并行数据转串行数据发送

    reg                 vld             ;


    //  cnt_baud
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_baud <= 0 ;
        end
        else if(add_cnt_baud)begin
            if(end_cnt_baud)begin
                cnt_baud <= 0 ;
            end				
            else begin	    
                cnt_baud <= cnt_baud + 1 ;
            end 		    
        end
    end
    assign	add_cnt_baud =	tx_flag ;
    assign	end_cnt_baud = add_cnt_baud && (cnt_baud == `BAUD - 1) ;

    //  cnt_bit
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            cnt_bit <= 0 ;
        end
        else if(add_cnt_bit)begin
            if(end_cnt_bit)begin
                cnt_bit <= 0 ;
            end				
            else begin	    
                cnt_bit <= cnt_bit + 1 ;
            end 		    
        end
    end
    assign	add_cnt_bit = end_cnt_baud ;
    assign	end_cnt_bit = add_cnt_bit && (cnt_bit == 9) ;   
    
    //  tx_flag
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            tx_flag <= 1'b0 ;
        end
        else if(tx_din_vld)begin
            tx_flag <= 1'b1 ;
        end
        else if(end_cnt_bit)begin
            tx_flag <= 1'b0 ;
        end
    end

    //  vld
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            vld <= 1'b0 ;
        end
        else begin
            vld <= tx_din_vld ;
        end
    end

    //  tx_data
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            tx_data <= 0 ;
        end
        else if(vld)begin
            tx_data <= {1'b1,tx_din,1'b0} ;     //      停止位 + 数据 + 起始位  低位在前发送
        end
    end

    //  dout
    always @(posedge clk or negedge rst_n)begin
        if(!rst_n)begin
            dout <= 1'b1 ;
        end
        else if(tx_flag)begin
            dout <= tx_data[cnt_bit] ;
        end
    end

    //  输出
    assign  uart_tx = dout ;
    assign  ready = ~tx_flag ;


endmodule

四、仿真

仿真代码如下:

`timescale 1ns/1ps

module uart_tb ();

    reg             tb_clk              ;
    reg             tb_rst_n            ;
    reg     [7:0]   data                ;
    reg             data_vld            ;

    wire            ready               ;
    wire            tx_data             ;
    wire            uart_txd            ;

    wire    [7:0]   rx_dout             ;
    wire            rx_dout_vld         ;

    //  模块例化
    uart_tx uart_tx_pc (        //  模拟上位机发送数据
        /*input               */.clk            (tb_clk         ),
        /*input               */.rst_n          (tb_rst_n       ),
        /*//  control*/
        /*input   [7:0]       */.tx_din         (data           ),
        /*input               */.tx_din_vld     (data_vld       ),
        /*output              */.ready          (ready          ),       //  给control模块的握手信号,表示可以接收数据进行发送 
        /*//  上位机*/
        /*output              */.uart_tx        (tx_data        )
    );

    uart u_uart (
        /*input               */.clk             (tb_clk        ),
        /*input               */.rst_n           (tb_rst_n      ),
 
        /*input               */.uart_rxd        (tx_data       ),
        /*output              */.uart_txd        (uart_txd      )
    );

    //  参数定义
    parameter   CYCLE = 20 ;

    always  #(CYCLE / 2) tb_clk = ~tb_clk ;     //  50M时钟

    initial begin
        tb_clk   = 1'b1;
        tb_rst_n = 1'b1;
        data = 0;
        data_vld = 1'b0;

        # (CYCLE * 2);
        tb_rst_n = 1'b0;
        # (CYCLE * 2);
        # 2;
        tb_rst_n = 1'b1;
        # (CYCLE * 10);

        Send(8'hf9);
        Send(8'h99);
        Send(8'hAE);
        Send(8'hBC);
        Send(8'h55);
        Send(8'hE1);

        # (CYCLE * 100);
        $stop; 
    end

    task Send;
        input   [7:0]   send_data ;
        begin
            data = send_data ;
            data_vld = 1'b1 ;
            # CYCLE ;
            data_vld = 1'b0 ;
            // @(posedge ready)
            # (CYCLE*440*10) ;
        end
    endtask
    
endmodule

在这里插入图片描述
在这里插入图片描述

五、上板验证

这里通过串口调试助手来与FPGA进行串口通信测试,可以看见通过串口收发数据正确。

在这里插入图片描述

六、踩坑事项

在调试串口的时候发现设备管理器中串口无法识别,显示PL2303HXA自2012已停产,请联系供应商,如下图:
在这里插入图片描述
这时需要下载一个旧版本的驱动,下载链接如下:
链接:https://pan.baidu.com/s/1FTtfgc2k2fw-9Ck1_tRbRQ
提取码:7kf2

下载完成后解压安装,点击更新驱动程序→浏览电脑选择旧版本双击安装即可:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【FPGA】FPGA实现UART串口通信回环 的相关文章

  • 【原创】always语句 和 initial语句

    过程语句 有 always语句 和 initial语句 相同点 1 always语句 和 initial语句 可以多次使用 2 always语句 和 initial语句 各语句块 整体 是独立运行 3 always语句 和 initial语
  • FPGA实战--等精度频率测量

    首先放置效果图 本次试验中采用的是等精度测频率 等精度测频的原理是产生一个1s的高电平 在高电平中对被测方波进行计数 所测得数字即该波形频率 具体等精度测量原理请参考 http www elecfans com d 591858 html
  • 【Xilinx DDR3 MIG】Xilinx FPGA DDR3读写实验相关用户接口引脚解释

    目录 DDR3读写实验 实验框图 时钟模块 DDR3读写及LED指示模块 MIG IP核 用户接口解释
  • Verilog之assign

    Verilog中的关键词assign主要用于如下两个地方 数据流建模 用于数据流建模的显示连续赋值语句语法格式如下
  • FPGA Lattice Diamond 开发环境搭建

    FPGA Lattice Diamond 开发环境搭建 Lattice Diamond 软件下载 在浏览器中输入 Lattice 的官网地址 http www latticesemi com 进入官网首页在上方选择产品系列选项 出现如下图所
  • FPGA_MIG驱动DDR3

    FPGA MIG驱动DDR3 说明 FPGA zynq 7z100 DDR3 MT41K256M16TW 107 内存大小为512MB 数据接口为16bit 环境 Vivado2018 2 IP核 Memory Interface Gene
  • 在vhdl中生成随机整数

    我需要在 vhdl 中生成 0 1023 之间的随机整数 但是我在互联网上找不到这方面的好资源 请问有人帮我吗 下面是生成范围 0 1023 内均匀 均匀 分布的整数的示例 请注意 floor必须在与最大值 1 相乘之后使用运算 在本例中为
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有
  • 从 Linux 用户空间设置 16550A UART 硬件 FIFO 中断级别

    我目前正在使用 16550 兼容的 UART 并且我希望能够更改 FIFO 中断触发级别 我在高 UART 负载下丢失字节 并且我想降低阈值 这是一个动力不足的嵌入式系统 当然 如果我愿意 我可以在 8250 port c 驱动程序中更改它
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • Linux驱动程序DMA传输到PC作为主机的PCIe卡

    我正在开发一个 DMA 例程 将数据从 PC 传输到 PCIe 卡上的 FPGA 我阅读了 DMA API txt 和 LDD3 ch 15 详细信息 但是 我不知道如何从 PC 到 PCIe 卡上的一致 iomem 块进行 DMA 传输
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • UIO 设备上的 mmap EINVAL 错误

    在尝试使用 UIO 而不是直接映射后 我在 Xilinx Zynq 上映射物理内存时遇到问题 dev mem 虽然计划是以普通用户身份运行应用程序 而不是root这仍在运行root 显然 第一个映射成功 其余映射到同一个文件描述符12 de
  • 英特尔伽利略裸机 UART

    我想编写一些 hello world 程序裸机申请于英特尔伽利略木板 当然 使用 UEFI 打印文本 到 UART 1 效果很好 但我想 手动 访问 UART 而不需要 UEFI 的任何帮助 在 QEMU 中我的代码运行良好 h file
  • VHDL 中的 BRAM_INIT

    我正在模拟基于处理器的设计 其中程序存储器内容保存在 BRAM 中 我正在使用 VHDL 推断 BRAM 实现程序存储器 我试图避免使用 CoreGen 因为我想保持设计的可移植性 最终该设计将进入 FPGA 我想看看是否有一种方法可以使用
  • verilog $readmemh 对于 50x50 像素 RGB 图像花费太多时间

    我正在尝试编译用于 FPGA 编程的 verilog 代码 我将在其中实现 VGA 应用程序 我使用 QuartusII 和 Altera 我正在尝试正确使用 readmemh 来逐像素获取图片 现在 我已经使用 matlab 将图片转换为
  • 赋值语句中的“others=>'0'”是什么意思?

    cmd register process rst n clk begin if rst n 0 then cmd r lt others gt 0 elsif clk event and clk 1 then cmd r lt end if
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • 映射 MMIO 区域写回不起作用

    我希望对 PCIe 设备的所有读写请求都由 CPU 缓存进行缓存 然而 它并没有像我预期的那样工作 这些是我对回写 MMIO 区域的假设 对 PCIe 设备的写入仅在缓存回写时发生 TLP 有效负载的大小是缓存块大小 64B 然而 捕获的
  • 如何从 Spartan 6 写入 Nexys 3 FPGA 板上的 Micron 外部蜂窝 RAM?

    我到处都查过了 数据表 Xilinx 网站 digilent 等等 但什么也没找到 我能够使用 Adept 工具来验证我的蜂窝 RAM 是否正常运行 但我找不到任何库存 VHDL 代码作为控制器来写入数据和从中读取数据 帮助 找到了此链接

随机推荐

  • STM32 串口通讯及实现

    目录 一 串口通讯概述1 广义的串口2 狭义的串口3 串口数据定义4 串口通讯应用 二 STM32串口工程标准库实现1 串口的初始化2 串口数据发送 3 串口的数据接收 一 串口通讯概述 1 广义的串口 广义的串口是针对并口来说的 串口是指
  • STM32串口接受和发送数据的程序(USART/UART)

    本实验中 STM32通过串口1和串口2上位机对话 xff0c STM32通过串口1在收到上位机发过来的字符串 以回车换行结束 后 xff0c 通过串口2原原本本的返回给上位机 串口 xff08 USART UART xff09 通信配置详解
  • CMakeLists.txt中第三方库编写思考

    编写ROS时经常需要自己构建第三方库或者引用别人的第三方库 xff0c 对于第三方库的调用主要有以下两种方式 xff1a 1 引用现成的第三方库 xff1a find package PCL 1 7 REQUIRED xff1a 添加依赖
  • vscode运行卡顿解决方案

    卡顿原因 主要是rg exe扩展程序占用CPU过高 xff0c 那么只需要禁用它即可 解决方案 打开 vs code xff0c 文件 gt 首选项 gt 设置 gt 搜索 search followSymlinks 取消勾选即可
  • 优象光流模块助力无人机之使用效果分享

    优象光流模块助力无人机之使用效果分享 我是一名无人机爱好者 xff0c 一直以来对无人机就有一种慕名的喜好 xff0c 只要有时间就会与队友们在实验室研究探讨 当然 xff0c 刚开始玩无人机悬停时会遇到种种问题 xff0c 例如飞机一开始
  • 如何使用光流芯片U30实现四轴无人机悬停

    如何使用光流芯片U30实现四轴无人机悬停 在没有GPS的环境下 xff0c 比如室内环境 xff0c 四轴无人机在水平方向会不断漂移 如何让无人机实现稳定的自主悬停呢 xff1f 光流芯片可以感知无人机在水平方向的运动信息 xff08 速度
  • (CMake) 库的生成和链接

    文章目录 前言前置准备当前项目的库静态库动态库 外部项目的库静态库动态库 库的总结总code函数add subdirectory 添加源文件目录add library 指定的源文件生成库target link libraries 为目标链接
  • vscode配置C++编译环境(windows环境下)

    vscode配置C 43 43 编译环境 xff08 windows环境下 xff09 记录下自己在vscode中配置C 43 43 编译环境的过程 xff0c 仅供参考 一 VSCODE MinGW编译器 cMake跨平台编译工具下载 1
  • STL标准库详解

    STL标准库 主要由容器 迭代器 算法组成 STL主要头文件 lt algorithm gt lt deque gt lt functional gt lt iterator gt lt vector gt lt list gt lt ma
  • Mask R-CNN详解(图文并茂)

    Mask R CNN Mask R CNN是一个实例分割 xff08 Instance segmentation xff09 算法 xff0c 主要是在目标检测的基础上再进行分割 Mask R CNN算法主要是Faster R CNN 43
  • python-roslaunch : 依赖: python-roslib 但是它将不会被安装

    在配置环境中将python配置删除类 xff0c 导致ROS系统的好多依赖都没了 安装配置ROS时遇到问题 xff1a 1 先按ROS WIKI上进行安装 xff0c 之后进行测试看是否安装上 2 测试代码 xff1a 第一个终端 xff1
  • pycharm函数调用关系可视化(Graphviz + pycallgraph画图)

    文章目录 介绍Graphviz 安装pycallgraph安装实践 介绍 一个 python project 中往往包含很多 py 文件 python文件中又会包含很多函数 xff0c 函数之间相互传参和调用 如果遇到代码行数很多的情况 x
  • Linux下的UDP通信

    socket 函数 函数说明 xff1a 建立新的socket通信 头文件 xff1a include lt sys socket h gt include lt sys types h gt 函数定义 xff1a int socket i
  • error: array type has incomplete element type ‘int[]‘

    项目场景 xff1a 数组作为函数的形参 问题描述 xff1a error array type has incomplete element type 39 int 39 原因分析 xff1a 多维数组做为函数参数时 xff0c 只可以省
  • 【stm32F1_GPIO初始化函数的参数含义】

    文章目录 前言一 LED 点灯实验二 疑问记录1 问题描述2 问题解决 总结 前言 之前学习过51 xff0c 现在转学32 xff0c 由于课题组需要 xff0c 我需要尽量短的时间内掌握stm32的用法以及Freertos的操作系统 从
  • 使用 curl 命令发送 POST 请求的几种方式

    使用 curl 命令发送 POST 请求的几种方式 HTTP 的 POST 请求通常是用于提交数据 xff0c 可以通过这篇文章来了解各种提交方式 xff1a 常见的 POST 提交数据方式 做 Web 后端开发时 xff0c 不可避免地要
  • Linux环境下GCC以及ELF的初步使用

    Linux环境下可执行程序的安装和GCC以及ELF的初步使用 xff0c 熟悉第三方函数库及游戏程序介绍 一 可执行程序的安装过程1 使用用gcc生成 a静态库与 so动态库文件2 静态库文件的使用3 动态库文件使用 二 gcc编译工具集中
  • 动态库和静态库

    前言 xff1a 库是已写好的 供使用的 可复用代码 xff0c 每个程序都要依赖很多基础的底层库 从本质上 xff0c 库是一种可执行代码的二进制形式 可以被操作系统载入内存执行 库分为两种 xff1a 静态库 xff08 a lib x
  • c++封装yolov4进行目标检测

    yolo4是用c 43 43 写的 xff0c 在工程中的部署特别方便 之前项目中使用yolov4 xff0c 取得了不错的效果 在这里记录一下 使用官方接口调用 xff0c 我们首先得编译darknet动态库 xff0c 下载yolov4
  • 【FPGA】FPGA实现UART串口通信回环

    目录 一 UART协议基础二 系统模块划分三 代码实现1 uart顶层设计模块2 uart rx串口数据接收模块3 control控制模块4 uart tx串口数据发送模块 四 仿真五 上板验证六 踩坑事项 一 UART协议基础 关于UAR