【FPGA入门】第六篇、异步串口通信

异步串口通信 阅读详情

目录

第一部分、相关知识     

1、UART和RS232的区别

2、UART与USART的区别

3、全双工?

4、RS232通信协议

5、波特率

6、如何将外部异步信号变为内部同步信号?

7、什么时间点让FPGA去采集rx线上的数据?

第二部分、串口通信时序图

1、发送线RX流程

1.1、模块图

1.2、端口介绍

1.3、时序波形图

1.4、RX接收代码

2、接收线TX流程

2.1、模块图

2.2、时序波形图

2.3、 TX发送代码

3、Top层代码

第三部分、仿真代码的编写

1、testbench代码

 2、仿真结果

3、上板测试

 第四部分、总结


第一部分、相关知识     

1、UART和RS232的区别

  • UART就是一堆电路,是异步串行通信的一种电路实现;
  • RS232属于异步串行通信方式,跟UART相比,区别仅在于UART使用的是TTL电平,而RS232使用的是另一种电平标准。

2、UART与USART的区别

UART:UART 的全称叫做通用异步收发传输器。

  • 将数据在串行通信和并行通信间的传输转换。通俗的讲就是把多比特的数据转化为单比特的数据,或者把单比特的数据转化为多比特的数据。工作原理是将数据的每个 bit 一位接一位地传输。
  • UART 是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收

USART:通用同步和异步收发器

  • 当进行异步通信时,这两者是没有区别的。
  • 区别在于USART比UART多了同步通信功能,因此USART可以提供一个主动的时钟线。使用外部时钟使 USART 的数据速率远高于标准 UART 的数据速率。

3、全双工?

        全双工:表示发送和接收不会相互影响。

4、RS232通信协议

        rs232 是 uart 的一种,有两根线,分别是 rx 和 tx,这两根线都是 1 比特位宽的。其中 rx 是接收线, tx 是发送线。

  • rx,位宽为 1 比特, pc 机通过串口往 FPGA 发 8 比特数据时, FPGA 通过串口线 rx 一位一位地接收,从最低位到最高位依次接收,最后在 FPGA 里面位拼接成8 比特数据。
  • tx,位宽为 1 比特, FPGA 通过串口往 pc 机发 8 比特数据时, FPGA 把 8 比特数据通过 tx 线一位一位的传给 pc 机,从最低位到最高位依次发送,最后上位机通过串口助手把这一位一位的数据位拼接成 8 比特数据。

        在不发送或者不接收数据的情况下, rx 和 tx 处于空闲状态,此时 rx 和 tx 线都保持高电平

        如果有数据传递,首先会有一个起始位(0),然后是 8 比特的数据位,接着有 1 比特的停止位

        如果停止位以后不再发数据,将进入空闲状态,否则又将数据线拉低(进入起始位状态)。

        注意:起始位和停止位各算一位,因此一共是10位数据,而停止位不需要去做判断。

5、波特率

        波特率:在串口通信时的速率,单位时间内载波变化的次数,这里选用的是9600Bd,即发送一比特数据需要的时间为 1/9600 秒。

        用串口发送或者接收数据(起始位、数据位、停止位)时,每发送或者接收一位数据的时间都需要 1 个波特,即 1/9600 秒。

        串口发送或者接收一比特数据的时间为一个波特(1/9600),因此如果用 50M的系统时钟来计数,就需要记数 cnt=(1/9600s)/20ns≈5208 个系统时钟,才再次发送或者接收下一个数据。

        注意:cnt=(1/9600s)/20ns≈5208.33 ,累计误差0.33 * 10 = 3ns,这个误差太小了,是不会影响到传输的。而且计数器每次都是从0开始计数,因此,该误差也不会累加。

        上位机通过串口发 8 比特数据时,会自动在发 8 位有效数据前发一个波特时间的起始位,也会自动在发完 8 位有效数据后发一个停止位。同理,串口助手接收 fpga 发送的数据前,必须检测到一波特的起始位才会接收数据,接收完数据后,再接收一个停止位,所以 FPGA 通过串口除了发数据以外,还要发起始位和停止位。

6、如何将外部异步信号变为内部同步信号?

        通过前面的介绍可知,RS232为通用异步收发传输器,那么rx传到FPGA内部的数据与系统的时钟是不匹配的,没有任何逻辑关系,因此要借助寄存器将rx进行打两拍操作后,才能用来进行逻辑运算。

        这么做的目的是尽量降低亚稳态,如果不做这样 的处理,就可能导致采集的数据不稳定,只有做了亚稳态处理后的数据才在后面使用。

7、什么时间点让FPGA去采集rx线上的数据?

        外部的数据通过 rx 线传到 FPGA, FPGA 采数据时,在中间时刻采数可以保证采的数据最 稳定。

第二部分、串口通信时序图

1、发送线RX流程

        1.1、模块图

         1.2、端口介绍

         1.3、时序波形图

        1.4、RX接收代码

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// 优快云   : 大屁桃
// E-mail : 2624507313@qq.com
// File   : uart_rx.v
// Create : 2023-06-20 12:45:49
// -----------------------------------------------------------------------------
module uart_rx(
	input wire sclk,
	input wire s_rst_n,
	input wire rx,
	output reg [7:0]po_data,
	output reg po_flag
	);
// //9600波特率参量
// parameter BAUD_END = 5207;//波特率9600,接收间隔最大计数MAXEND = 50M/9600 = 5208.33 - 1 = 5207
// parameter BAUD_HALF = 2602;//5208/2 - 1 = 2603,要在2603这里点看到波形
// parameter BAUD_BIT_WIDTH = 12;//5207需要13位来保存,[12:0]

//115200波特率参量
parameter BAUD_END = 433;//波特率115200,接收间隔最大计数MAXEND = 50M/115200 = 434.02 - 1 = 433
parameter BAUD_HALF = 216;//434/2 - 1 = 216
parameter BAUD_BIT_WIDTH = 8;//5207需要9位来保存,[8:0]

//变量
reg rx1;//用来降低亚稳态
reg rx2;//用来降低亚稳态
reg rx2_reg;//用来打拍rx2,判断下降沿

reg rx_flag;//rx信号有效标志位

reg [12:0]baud_cnt;//9600波特率的1个波特时间1/9600s的计数器

reg capture_flag;//中间采集数据的时间点

reg [3:0]capture_cnt;//采集数据的计数器

//利用移位寄存器打拍,打拍信号可以不加复位
always @(posedge sclk) begin
	{rx2_reg,rx2,rx1} <= {rx2,rx1,rx};
end

//rx有效标志位,rx_flag
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		rx_flag <= 1'b0;
	end
	//rx_flag受baud_cnt影响,究竟是什么样的影响?
	else if(capture_flag == 1'b1 && capture_cnt == 'd8)begin
		rx_flag <= 1'b0;
	end
	else if (rx2 == 1'b0 && rx2_reg == 1'b1) begin
		rx_flag <= 1'b1;
	end
end

//一波特时间对应的计数器
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		baud_cnt <= 'd0;
	end
	else if(baud_cnt == BAUD_END)begin
		baud_cnt <= 'd0;
	end
	//baud_cnt会计数到2603,若判断条件换成rx_flag == 1'b0,baud_cnt会计数到2604
	else if(capture_flag == 1'b1 && capture_cnt == 'd8)begin
		baud_cnt <= 'd0;
	end
	else if (rx_flag == 1'b1) begin
		baud_cnt <= baud_cnt + 1'b1;
	end
end

//中间采集数据的时间点标志
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		capture_flag <= 1'b0;
	end
	else if (baud_cnt == BAUD_HALF) begin
		capture_flag <= 1'b1;
	end
	else begin
		capture_flag <= 1'b0;
	end
end

//采集数据的计数
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		capture_cnt <= 'd0;
	end
	else if (capture_cnt == 'd8 && capture_flag == 1'b1) begin
		capture_cnt <= 'd0;
	end
	else if(capture_flag == 1'b1)begin
		capture_cnt <= capture_cnt + 1'b1;
	end
end

//输出po_data
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		po_data <= 'd0;
	end
	else if (capture_cnt >= 1'b1 && capture_flag == 1'b1) begin
		po_data <= {rx2_reg,po_data[7:1]};
	end
end

//输出结束标志
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		po_flag <= 1'b0;
	end
	else if (capture_cnt == 'd8 && capture_flag == 1'b1) begin
		po_flag <= 1'b1;
	end
	else begin
		po_flag <= 1'b0;
	end
end


endmodule

2、接收线TX流程

        2.1、模块图

         2.2、时序波形图

        2.3、 TX发送代码

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// 优快云   : 大屁桃
// E-mail : 2624507313@qq.com
// File   : uart_tx.v
// Create : 2023-06-20 14:14:25
// -----------------------------------------------------------------------------
module uart_tx(
	input wire sclk,
	input wire s_rst_n,
	input wire [7:0]pi_data,
	input wire pi_flag,
	output reg tx
	);
// //9600波特率参量
// parameter BAUD_END = 5207;//波特率9600,接收间隔最大计数MAXEND = 50M/9600 = 5208.33 - 1 = 5207


//115200波特率参量
parameter BAUD_END = 433;//波特率115200,接收间隔最大计数MAXEND = 50M/115200 = 434.02 - 1 = 433

//变量
reg [7:0]pi_data_reg;//保存输入的数据
reg tx_flag;		 //发送数据的有效位,服务于计数器 
reg [12:0]baud_cnt;  //9600波特率的1个波特时间1/9600s的计数器
reg bit_flag;		 //计满flag
reg [3:0]bit_cnt;	 //发送数据计数。


//保存输入的数据,因为po_data在接收数据的时候一直在变
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		pi_data_reg <= 'd0;
	end
	else if(pi_flag == 1'b1)begin//这里是寄存的作用,不是直接传过来
		pi_data_reg <= pi_data;
	end
end

//发送数据有效时间段
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		tx_flag <= 1'b0;
	end
	else if(bit_flag == 1'b1 && bit_cnt == 'd8)begin
		tx_flag <= 1'b0;
	end
	else if (pi_flag == 1'b1) begin
		tx_flag <= 1'b1;
	end
end

//一波特时间对应的计数器
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		baud_cnt <= 'd0;
	end
	else if (baud_cnt == BAUD_END) begin
		baud_cnt <= 'd0;
	end
	else if(tx_flag == 1'b1)begin
		baud_cnt <= baud_cnt + 1'b1; 
	end
end

//bit_flag
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		bit_flag <= 1'b0;
	end
	else if (baud_cnt == BAUD_END - 1'b1) begin
		bit_flag <= 1'b1;
	end
	else begin
		bit_flag <= 1'b0;
	end
end

//发送数据计数
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		bit_cnt <= 'd0;
	end
	else if(bit_cnt == 'd8 && bit_flag == 1'b1)begin
		bit_cnt <= 'd0;
	end
	else if (bit_flag == 1'b1) begin
		bit_cnt <= bit_cnt + 1'b1;
	end
end

//发送数据
always @(posedge sclk or negedge s_rst_n) begin
	if (!s_rst_n) begin
		tx <= 1'b1;
	end
	else if(pi_flag == 1'b1)begin
		tx <= 1'b0;//起始位,判断到有输入,立马拉低
	end
	else if (bit_flag == 1'b1 && bit_cnt <= 'd7) begin
		tx <= pi_data_reg[bit_cnt];
	end
	else if(bit_flag == 1'b1 && bit_cnt == 'd8)begin
		tx <= 1'b1;//停止位
	end
end

endmodule

3、Top层代码

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// 优快云   : 大屁桃
// E-mail : 2624507313@qq.com
// File   : top.v
// Create : 2023-06-20 14:31:06
// -----------------------------------------------------------------------------
module top(
	input wire clk,
	input wire rst_n,
	input wire rx,
	output wire tx
	);

wire [7:0]data;
wire flag;


uart_rx inst_uart_rx (
		.sclk    (clk),
		.s_rst_n (rst_n),
		.rx      (rx),
		.po_data (data),
		.po_flag (flag)
	);

uart_tx  inst_uart_tx (
		.sclk    (clk),
		.s_rst_n (rst_n),
		.pi_data (data),
		.pi_flag (flag),
		.tx      (tx)
	);


endmodule

第三部分、仿真代码的编写

        注意:在testbench同文件位置建立如下文本

00000001
00000010
00000011
00000100
00000101
00000110
00000111
00001000
00001001
00001010
00001011
00001100
00001101
00001110
00001111
11111111

1、testbench代码

          关于top层的testbench代码如下: 

// -----------------------------------------------------------------------------
// Copyright (c) 2014-2023 All rights reserved
// -----------------------------------------------------------------------------
// Author : BigFartPeach
// 优快云   : 大屁桃
// E-mail : 2624507313@qq.com
// File   : top_sim.v
// Create : 2023-04-25 11:24:00
// -----------------------------------------------------------------------------
module top_sim();

reg clk;
reg rst_n;
reg rx;
wire tx;

reg [7:0]mem[15:0];

initial begin
	clk = 0;
	rst_n = 0;
	rx = 1;
	#100;
	rst_n = 1;
end

always #10 clk = ~clk;

initial begin
	$readmemb("./data.txt",mem);
end

initial begin
	#200;
	read_text();
end

//多次读文本数据
task read_text();
	integer i;
	begin
		for(i = 0; i < 16; i = i + 1)begin
			send_bit_data(mem[i]);
		end
	end
endtask

task send_bit_data(input [7:0]data_txt);
	integer i;
	begin
		for(i = 0; i < 10;i = i + 1)begin
			case (i)
				0: rx = 0;//起始位
				1: rx = data_txt[0];//rx = mem[i - 1];	
				2: rx = data_txt[1];//rx = mem[i - 1];	
				3: rx = data_txt[2];//rx = mem[i - 1];	
				4: rx = data_txt[3];//rx = mem[i - 1];	
				5: rx = data_txt[4];//rx = mem[i - 1];	
				6: rx = data_txt[5];//rx = mem[i - 1];	
				7: rx = data_txt[6];//rx = mem[i - 1];	
				8: rx = data_txt[7];//rx = mem[i - 1];	
				9: rx = 1;//停止位
			endcase
			#104166;//1/9600波特时间
		end
	end
endtask

top inst_top (
	.clk(clk), 
	.rst_n(rst_n),
	.rx(rx),
	.tx(tx)
	);

endmodule

 2、仿真结果

        可以看到rx与tx的波形一致。

3、上板测试

        波特率为9600发送后返回的数据

             波特率为115200发送后返回的数据

 第四部分、总结

        本篇博客介绍了串口的基本知识以及驱动代码的编写,博客中若有错误欢迎大家及时私信我。

        最后,希望我的博客对你有帮助😎😎😎😎,有需要的小伙伴可以查看本专栏更多的往期文章专栏链接如下:FPGA的学习之旅_大屁桃的博客-优快云博客

        博客中涉及到的工程链接如下,工程基于ISE软件,没有积分的小伙伴评论留下邮箱即可:

        FPGA入门第六篇、异步串口通信工程资源-优快云文库

串行通信——异步串行通信 目录 I、串口通信简介 一、定义 二、意义 三、分类 II、异步串行通信详解 一、数据格式 1. 起始位 2. 数据位 3. 奇偶校验位 4. 停止位 二、通信制式 1. 单工 2. 半双工 3. 全双工 三、通信速率 I、串口通信简介 一、定义 在一条传输线上,数据以“位”为单位进行逐个传输,即为串行通信。 二、意义 并行通信控制简单、相对传输速度快... 阅读详情

相关推荐

【串口通信中异步模式与同步模式的区别和选择】

详细讲解异步模式和同步模式的区别,并分析在实际开发中如何选择使用,结合 STM32 等 MCU 的实际开发经验提供指导

SpringWJN的博客 2391

同步串口通信与异步串口通信

而51的异步串口从本质上来说,因为收发都是用的同一个寄存器,所以是半双工工作,但是在接受和发送频率不这么高的地方,一般也就当做全双工用。如果每个码元在通讯传输中,有 0V、2V、 4V 以及 6V 这4种状态,对应二进制数 00、 01、 10、 11,4种情况,相当于2个二进制,所以码元数是二进制比特位数的一半,这个时候的波特率为比特率的一半。传输数据为被除数,发送数据方有个除数,两者的余数为校验位,接收方,将接收到的数据作为除数,然后除以相同的被处数,比较余数是否相等。一帧数据结束,进行CRC校验。

qq_57628024的博客 7040

【Python】串口通信-与FPGA、蓝牙模块实现串口通信(Python+FPGA)

Python与FPGA、蓝牙BLE模块实现串口通信,主要使用USB转TTL模块实现转接。

m0_56262476的博客 4224

异步串口和同步串口(USART和UART)

(USART和UART都是用于串行通信的通信协议,其中USART代表“Universal Synchronous/Asynchronous Receiver/Transmitter”,而UART代表“Universal Asynchronous Receiver/Transmitter”。UART的优点是易于实现和使用,并且能够通过简单的硬件电路实现,缺点是传输速度较慢。而USART既支持异步通信又支持同步通信,可以根据需要进行配置。此外,USART还可以支持双工通信,可以在同时进行数据的发送和接收。

ZNCDD的博客 7529

用FPGA实现多路电压采集器:(1)在FPGA上实现异步串口通信

前几周微机课上布置了一个Project,要求用FPGA实现多路电压采集器,对多路模拟信号采集并显示其电压幅值。我们小组的设计思路是利用ADC芯片对模拟电压输入信号进行采集,转换为数字信号,然后交由FPGA进行处理,最后将处理结果通过串口传输给电脑并由串口助手显示读数。基本框图如下 经过好几天的努力,现在来做一个小小总结。 所谓多路电压采集器,指的是在同一时刻采集到的数据,虽然好...

diju5626的博客 1918

FPGA第四篇:异步串口的实现

本文要搞清楚两个问题: (1)异步串口通信的原理及通信协议 (2)用verilog实现UART并仿真

刘兵马俑的博客 1万+

FPGA入门系列13--异步串口通信

假设我们通过 PC 端发送一个 8bit 的数据到 FPGA 端,由于 FPGA 的接收总线 rxd 只有 1bit,所以需要将 PC 端发送的 8bit 数据分成 8 次发送,发送的频率称为比特率,比特率=波特率*N,其中 N 指的是数据的位宽,在此由于传输的数据位宽为 1,所以波特率和比特率相等。由图1可以看出,要实现 PC 机与 FPGA 之间的通信,FPGA 需要控制的其实也就是两条信号线:rxd 和 txd,分别为数据接收线和数据发送线。通过判断发送的数据与接收的数据是否一致来验证传输的正确性。

mochenbaobei的博客 1149

FPGA专题——串口通信

目录 一、前言 二、串口RS232协议介绍 三、程序设计 四、实验分析 五、总结 六、参考资料 一、前言 最近在利用空闲时间学FPGA,学到串口通信这里了,跟着例程做了个串口收发的实验,FPGA型号EP4CE6E22C8,FPGA接收PC发来的数据然后原样返回给PC,通过这个实验加深了对串口232通信协议的认识,同时在实验中发现了一些关于串口模块的问题,在这里进行记录。 二...

心城追梦的博客 4841

基于FPGA实现异步串口UART

1、UART硬件 1.1、逻辑电平 1.1、电平转换芯片 2、UART协议 2.1、串口参数 2.2、通信时序 2.3、系统时钟 3、基于FPGA实现UART协议 3.1

weixin_43813325的博客 6131

基于RS422通信的FPGA软件设计第五天

基于RS422通信的接收端FPGA软件设计报告 一、需求分析 1 设计输入 1)发送端采用RS-422标准异步串行协议,波特率为115.2kbps,每个字节发送时包含1bit起始位,8bit数据位,1bit奇校验位,1bit停止位。数据字节内部的传输顺序为低位在前高位在后,高字节在前低字节在后。(大端模式) 2)软件版本使用Vivado2016.1,硬件平台选择Xilinx A7系列XC7A100T; 3)FPGA的系统时钟为40MHz; 2 具体要求 1) 设计一个异步422接收端FPGA软件,并将接收到

皇甫春云的博客 5857

【光学仿真】基于Matlab的LG/BG/PV/HG光束生成与特性分析【附完整源码】

本文详细介绍了如何使用Matlab进行拉盖尔-高斯(LG)、贝塞尔-高斯(BG)、完美涡旋(PV)和厄米-高斯(HG)四种特殊光束的仿真与特性分析。通过提供完整的Matlab源码,手把手指导读者生成光束、分析其强度、相位、传播特性及轨道角动量,为光学研究、激光应用及教学提供了直观高效的数值实验平台。

3a9bq4r8t2y的博客 492

FPGA verilog HDL rs232 UART异步串口通信

项目一:rs232 UART异步串口通信        UART的全称叫做通用异步收发传输器。将数据在串行通信和并行通信间的传输转换。通俗的讲就是把多比特的数据转化为单比特的数据,或者把单比特的数据转化为多比特的数据。工作原理是将数据的每一个BIT一位接一位的传输。        UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接受。RS232是UART的一种...

张华山 3779

MounRiver避坑实录:手把手迁移CH32V307 EVT工程到自定义目录

本文详细记录了将沁恒CH32V307的EVT工程迁移到自定义目录的完整流程与避坑指南。针对MounRiver Studio的虚拟链接机制,重点讲解了如何清理旧配置、重新设置头文件路径、链接脚本等关键步骤,帮助开发者创建独立、可维护的MCU项目工程。

uber9的博客 243

10 vm 添加串口_FPGA入门系列13异步串口通信

文章简介本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码书写以及代码的讲解,可作为读者参考。14第十四章:异步串口通信 UART 串行接口简称串口,是我们各类芯片最常用的一种异步通信...

weixin_31212247的博客 193

从零到一:Zephyr RTOS 在 STM32F4 上的移植与实战(含设备树配置详解)

本文详细介绍了如何从零开始将Zephyr RTOS移植到STM32F4开发板,涵盖开发环境搭建、硬件抽象层分析、设备树配置及系统裁剪等关键步骤。通过实战案例,帮助开发者掌握Zephyr RTOS在嵌入式设备中的应用,提升物联网边缘计算设备的开发效率。

weixin_26976635的博客 590

DeerFlow 系列教程 附录 | 核心文件索引、官方文档索引与推荐阅读顺序

DeerFlow 系列教程 附录本附录汇集了 DeerFlow 项目的核心文件索引、官方文档索引和推荐阅读顺序三份速查资料,方便读者在日常开发和学习中快速定位关键代码与文档。内容按实际项目目录结构整理,所有路径均基于 DeerFlow 2.0 版本验证。

weixin_43674738的博客 328

FPGA学习[4]——异步串口的接收实验与环回测试

异步串口的接收跟发送不一样,本质上串口的发送属于并行转串行,而接收则属于串行转并行。 跟发送一样,接收也需要约定波特率与设置波特率计数器,使得FPGA能够按照约定的波特率接收数据。 在FPGA学习[3]里面,已经计算了计数器计数值与波特率之间的关系 countbaud=fclkbaudcount_{baud} = \frac{f_{clk}}{baud}countbaud​=baudfclk​​ ...

庸手著文章 1269

王者荣耀AI绝悟如何选英雄?

王者荣耀AI绝悟如何选英雄? 【抢射手?抢中单位?「绝悟」在打王者荣耀时是如何选英雄的?】 腾讯 AI Lab 开发的 AI 智能体「绝悟」已让王者峡谷不再只是人类召唤师的竞技场,而且这个 AI 战队在上月底进化成了「完全体」。在一局完整的比赛中,英雄选择阶段是至关重要的(比如五射手或五法师阵容会有官方劝退)。 近日,腾讯 AI Lab 和上海交通大学发布的一篇论文介绍了绝悟的英雄选择策略:Ju...

不断学习,不断进步,提高自己 1万+

异步串口通信和逻辑分析仪

x_data信号是参与移位的数据,在移位的过程中数据是变动的,不可以被后级模块所使用,而可以肯定的是在移位完成标志信号rx_flag为高时,rx_data信号一定是移位完成的稳定的8bit有用数据。由于在PC机中波特率和rx信号是同步的,而rx信号和FPGA的系统时钟sys_clk是异步的关系,我们此时要做的是将慢速时钟域(PC机中的波特率)系统中的rx信号同步到快速时钟域(FPGA中的sys_clk)系统中,所使用的方法叫电平同步,俗称。有两根线,分别是rx和tx,这两根线都是1比特位宽的。

orange_life的博客 1058

【Simulink教程案例19】基于simulink的扩频通信系统建模与仿真

扩频是一种应用于数字调制信号的调制技术,可以提高传输信号的带宽。扩频通信具有抗干扰能力强,扩频增益越大,抗干扰能力越强。而且扩频通信具有很强的保密性,扩频后信号近似白噪声,功率谱密度也很低。扩频通信可用于多址通信。扩频调制有如下三个特点:① 扩频后信号的带宽远大于信号所需的带宽② 使用扩频码进行扩频调制,扩频码与信号中的数据相互独立③ 在接收端,通过将接收信号与扩频码的同步副本进行相关,实现解扩。

FPGA/MATLAB学习教程/源码/项目合作开发 2197

App爬虫实战篇-以华为真机手机爬取集换社的app为例

在开始学习这篇文章之前,建议你先按照之前2篇文章(和),配置必要的环境,才可以继续完成本章节内容。

youbingchen的博客 780

第21节 国产安路FPGA 异步串口通讯UART原理说明

通常FPGA的异步串口通讯的应用是比较常见的通讯方式,比较常见的RS485通讯,RS422通讯,RS232总线通讯也尝试用串口通讯格式,在一些MCU控制器中会有这样的外设,但是MCU由于硬件资源固定,UART的外设数量是有限的,MCU的使用过程当中使用多数量的外设通讯也会占用一定的MCU处理性能,但是FPGA具备灵活和并发的优势。在FPGA中UART的使用也是比较重要的,这一节主要介绍UART的原理。

qq_42189951的博客 967

华为OD机考双机位C卷 - 构成正方形的数量 (Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 成正方形的数量 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 5938

uart异步串口通信电路设计Verilog代码Quartus FPGA_C4_V2.1实验板

1.优化波特率分频 使用更高的系统时钟频率(如100MHz)和更小的分频系数。 例如,系统时钟为100MHz,波特率为115200时,分频系数为 text    0复制代码 Baud Rate Divisor 100, 000, 000115,200≈868 2.使用PLL生成精确时钟 使用FPGA的PLL(锁相环)模块生成精 确的波特率时钟,減少时钟误差。 3.多倍采样

xiakunpei123的博客 689

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【FPGA功能模块】异步串口通讯_8n1@uart_8n1

【FPGA功能模块】异步串口通讯_8n1@uart_8n1

sinat_36503471的博客 763

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 【FPGA入门】第五篇、按键消抖
下一篇: 【FPGA入门】第七篇、FPGA实现VGA接口驱动
大屁桃
博客等级 码龄8年 2万+粉丝 54原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大屁桃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值