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

【FPGA】八、UART串口通信 FPGA UART串口通信 阅读详情

一、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

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

FPGA串口通信实战:手把手教你用Verilog实现UART回环测试(附Python上位机代码) 本文提供了一份详尽的FPGA串口通信实战指南,手把手教你使用Verilog语言实现UART收发模块,并完成回环测试。文章深入解析了UART异步通信协议的核心原理、时序计算与状态机设计,同时提供了配套的Python上位机代码,用于数据收发、解析与自动化测试,帮助开发者快速打通FPGA与PC的通信链路。 阅读详情

相关推荐

FPGA实现UART串口通信:从协议解析到Verilog回环验证

UART串口通信是嵌入式系统中最基础的异步通信方式,在MCU中通过现成外设即可完成收发,但在FPGA中却需要开发者用逻辑门自行搭建控制器。理解UART协议中的起始位、停止位、数据位以及波特率分频原理,是掌握FPGA时序设计、状态机编程和异步处理的关键起点。本文从串口协议帧格式与波特率误差计算切入,讲解如何通过计数器实现位同步、如何设计发送与接收状态机,并详细阐述接收端二级同步消除亚稳态的操作方法。借助Verilog模块化设计,结合顶层回环测试的上板验证思路,读者可将理论知识转化为实际工程经验。此类实践对于F

weixin_29172201的博客 205

基于FPGA的UART通信——基础篇

基于FPGA实现的UART异步串行通信,这是基础篇.

weixin_51116586的博客 2783

VHDL实现UART串口通信:从原理到FPGA回环测试

本文详细介绍了如何使用VHDL实现UART串口通信,从基础原理到FPGA回环测试的全过程。内容涵盖UART帧结构、时序控制、抗干扰设计,以及VHDL接收机和发射机模块的具体实现,帮助开发者深入理解异步串行通信协议并完成FPGA项目开发。

weixin_42647395的博客 316

(一)FPGA之串口通信(UART)

(一)FPGA之串口通信(UART) 回到梦开始的地方,如今回过头来看串口协议,确实清晰了很多,但是奈何好记性不如烂笔头,我还是要重新记录一下学习的知识点,方便查找和学习。 波特率(Band Rate): 串口协议中很重要的一点就是波特率,波特率的概念是每秒钟传送码元的个数,就是一秒钟传输了几个二进制的个数,他的单位是Bit/s和bps两种。常见的串口速度有115200bps 9600bps等等,串口(RS232)的最大传输速率是 115200bps,表示一秒钟传输了115200个二进制 。 波特率和字节

weixin_49780322的博客 5万+

FPGA入门 —— FPGA UART 串口通信

FPGA入门 —— FPGA UART 串口通信 串口简介 UART 通用异步收发传输器( Universal Asynchronous Receiver/Transmitter) ,通常称作 UART。 UART 是一种通用的数据通信协议,也是异步串行通信口(串口)的总称,它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。 它包括了ch340、 RS2...

ppqppl的博客 7078

FPGA基础协议一:UART

赢麻了!

ChenJ_1012的博客 2279

FPGA-UART串口

UART:全称为Universal Asynchronous Receiver/Transmitter,通用异步收发器。是一种串行异步的通信协议,该协议规定了传输数据时数据的传输方式以及所使用的信号,在嵌入式领域中有着非常广泛的应用。通用异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART)是一种异步 收发传输器,其在数据发送时将并行数据转换成串行数据来传输,在数据接收时将接收到的 串行数据转换成并行数据,可以实现全双工传输和接收。

博客 4080

【FPGA练习】(一): UART串口通信实验

由于之前学习FPGA的过程中,没有做一个良好的记录,以及已学知识的扩展,所以从今天开始每一个实验例程和扩展应用,都要做文档记录。本实验,是基于正点原子达芬奇xc7a35tfgg484-2开发板。开发板时钟为50Mhz,采用RS232的通信协议。 串口数据的发送与接收都是基于帧结构的,即一帧一帧的发送与接收数据。每一帧除了中间包含8bit有效数据外,还在每一帧的开头都必须要有一个起始位,且固定为0;在每一帧的结束时,也必须要有一个停止位,且固定为1,即最基本的帧结构(不包括校验等)有10bit。

qq_42162595的博客 2003

FPGA——UART串口通信

本篇博客的实验内容是实现uart串口通信发送数据和接收数据,并加入按键模块调整波特率,数码管模块显示波特率,实现不同波特率下的PC端与FPGA板子的数据回环,并加入FIFO IP核对数据进行缓存,当数据大于等于8个的时候,一次性发送8个数据出去。实验环境:quartus 18.1 modelsim Cyclone IV开发板因为该工程是分模块化的设计,因此如果只需要串口的发送和接收功能就只需要将这两个模块直接拿去用就可以了,大大方便了之后其他工程的设计。

风起鹤归 1677

FPGA实现UART串口通信详解:从协议到收发模块设计

在数字系统设计中,串行通信是数据交互的基础,而UART作为最经典的异步串行协议,广泛应用于嵌入式调试、设备互联和工业控制场景。理解UART的帧格式、波特率配置和信号时序,是掌握更复杂通信协议的前提。FPGA凭借其并行处理能力和可编程逻辑,常被用于实现灵活的UART收发器,通过状态机设计、时钟分频和边沿检测等关键技术,完成可靠的数据传输。本文以FPGA工程实践为主线,从协议原理出发,逐步讲解接收端的起始位检测与采样窗口设计、发送端的移位输出逻辑,以及顶层回环控制与握手机制,并结合仿真验证和板级调试经验,帮助读

weixin_34117211的博客 338

FPGA实现串口(UART)

通过本文您会学到:1、什么是UART?2、如何用FPGA实现它?

孤独的单刀 27万+

基于FPGA的UART回环设计(3)

基于FPGA的UART顶层模块化设计FPGA电路设计顶层代码设计整个项目测试代码设计约束文件.XDC的书写项目下板现象结束语 FPGA电路设计 本篇文章将实现整个uart回环测试的小项目。首先查看FPGA开发板的电路设计,找准需要绑定的FPGA引脚。 顶层代码设计 uart回环测试的项目的顶层代码如下: `timescale 1ns / 1ps // **********************...

zhangningning1996的博客 1443

纯Verilog实现UART串口通信:无IP核、无PC的FPGA回环验证

UART(通用异步收发传输器)是嵌入式与FPGA系统中最基础的低速串行通信协议,其核心在于波特率生成、起始位检测、采样同步与亚稳态防护等数字电路原理。理解其内部状态机、16倍过采样机制及跨时序域处理,不仅关乎通信可靠性,更是数字IC设计、SoC集成与硬件面试的关键能力。本方案聚焦纯逻辑实现,覆盖TX/RX双模块解耦、三重采样判决、回环自验证等工程实践要点,适用于课程设计、毕设开发及底层驱动能力强化。通过按键-LED闭环调试,无需上位机或IP核,直击UART本质。

weixin_29168393的博客 254

常用串行总线(一):UART及FPGA实现

目录 一、uart及RS232协议介绍 二、实验设计 三、代码分模块展示 rx部分 tx部分 四、效果展示 一、uart及RS232协议介绍 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。通俗的讲就是把多比特的数据转化为单比特的数据,或者把单比特的数据转化为多比特的数据。..

梅菜扣肉 1510

告别臃肿!保姆级教程:用NTLite深度精简Win10,打造你的专属纯净系统(附完整组件移除清单)

本文提供了一份详细的NTLite教程,帮助用户深度精简Windows10系统,移除冗余组件并优化性能。从准备工作到组件移除清单,再到系统配置优化和无人值守安装,逐步指导用户打造专属纯净系统。附完整组件移除清单和实战经验,确保系统稳定高效运行。

weixin_30945039的博客 852

echarts实现3D地图——map3D

【代码】echarts实现3D地图——map3D。

xiaoququ的博客 7316

UART串口通信FPGA实现

UART串口通信FPGA实现——从UART通信时序到verilog代码实现

2301_81809853的博客 800

记一次使用STM32F042K6芯片内部HSI48M时钟导致CAN总线报错问题

深入去解决某个问题时,也会加深你对其它部分的了解和思考,比如这里让我又重新了解和CAN的采样点和CAN报错机制。

ApexYuan 860

FPGA通信——实现串口通信(Uart)

摘要:本文详细介绍了串口通信的原理与FPGA实现方法。首先对比了并行与串行通信特点,重点分析了UART异步通信协议的数据帧格式和电气标准。针对FPGA实现,提出了采样策略、跨时钟域处理和波特率误差控制等关键技术方案。文章提供了完整的Verilog代码实现,包括接收模块的亚稳态消除、发送模块的状态机设计以及顶层回环测试模块。最后通过实际板卡验证了115200波特率下数据收发功能正常,验证了设计的可靠性。该方案具有抗干扰能力强、误差小等特点,适用于工业控制等应用场景。

weixin_58643402的博客 1958

PCIe信号眼图总是不开?手把手教你调CTLE和DFE参数(附实测波形对比)

本文详细解析了PCIe信号眼图调试中CTLE和DFE参数的优化方法,帮助硬件工程师解决眼图无法张开的问题。通过实际案例和步骤指导,介绍了如何调整CTLE直流增益和DFE抽头系数,提升接收端均衡器性能,确保信号完整性。

weixin_26805597的博客 214

C++面向对象编程-继承与派生练习题

2、共同派生类 3、人员类Person的派生(虚基类的使用)

编程小鹏的博客 1191

基于FPGA的uart串口回环实验

但 UART 和 SPI、 IIC 不同的是,它是异步通信接口,异步通信中的接收方并不知道数据什么时候会到达,所以双方收发端都要有各自的时钟,在数据传输过程中是不需要时钟的,发送方发送的时间间隔可以不均匀,接受方是在数据的起始位和停止位的帮助下实现信息同步的。为了每位数据的接收的稳定,所以可以数据的标志信号可以在波特率信号的中间位置进行拉高。然后将每bit的数据都拼接到我们接收数据的最高位,以此类推,接收到的第8位数据,就拼接在了rx_data的最高位,最先接收的数据就存储在了rx_data的最低位。

weixin_55831197的博客 1792

如何用python自己复现worldquant brain中的回测结果

本文介绍了在Python中复现WorldQuant Brain平台上alpha 101因子1和4的回测框架构建要点。重点分析了Brain平台的策略设置:使用TOP 3000高流动性股票(可用中证1000/2000替代);delay=1表示t日信号在t+1日开盘调仓;详细解释了market/sector/industry/subindustry四级中性化方法;说明了decay参数控制持仓权重线性衰减;以及TRUNCATION参数限制单股仓位风险。文章还探讨了不同调仓时点的实现差异,为自主构建量化回测系统提供了

夏之微风的博客 731

verilog 串口收发数据 UART

功能:串口回环测试;8位数据位,1位停止,无校验。 参考:正点原子FPGA教程 top程序: module uart_top( input sys_clk, input sys_rst, input uart_rx, //接收端口 output uart_tx //发送端口 ); //parameter define parameter CLK_FREQ=32...

Bronceyang的博客 2491

完整复现YOLOv8:包括训练、测试、评估、预测阶段【本文源码已开源,地址在文章末尾】

(这里主要是在colab.research.google.com实现的,本地的配置也是类似的方法)YOLOv8是一种用于目标检测的深度学习算法。主要参考:https://github.com/ultralytics/ultralytics/blob/main/README.zh-CN.md。yolov8的权重:https://github.com/ultralytics/assets/releases。yolov8的文档:https://v8docs.ultralytics.com/

源代码杀手的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: 一文看懂单总线协议(1-wire)
下一篇: 【FPGA】FPGA实现IIC协议读写EEPROM(一) ----- IIC接口驱动实现
白码王子小张
博客等级 码龄7年 6665粉丝 121原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值