FPGA - 串口发送多字节数据

news2024/9/25 7:20:47

1,任务要求

关于uart串口接收与发送可以参考我的这篇博客:《FPGA-UART串口》。这篇博客实现了单字节发送与接收。

接下来,来使用串口发送多字节数据到电脑。

2,模块框图以及简单时序分析图

串口发送多字节数据的思路是把写入的数据存到FIFO中,然后读FIFO完成发送。

框架图如下:

整个过程可以用状态机来实现,首先写入FIFO之前为IDLE状态,当FIFO中的empty信号(当FIFO为空时,empty为高电平1,当FIFO中写入数据时,empty拉低)拉低时进入SEND状态(发送数据),当FIFO中的数据发送结束时,uart_tx_done信号拉高进入END状态。

根据框架图分析简单时序图:

3,整体代码设计

3.1 FIFO配置

        

3.2 发送多字节逻辑代码

然后编写uart_send代码:

`timescale 1ns / 1ps
module uart_send(
	input            clk          ,
	input            reset        ,
	input            wr_en        ,
	input  [7:0]     wr_data      ,

	output reg       uart_tx_en   ,
	output reg [7:0] uart_tx_data ,
	input            uart_tx_busy
    );
	


	reg [1:0]  state       ;

	localparam IDLE = 2'b00;
	localparam SEND = 2'b01;
	localparam END  = 2'b10;

	reg  [7:0]    din  ;
	reg           wren ;
	reg           rd_en;
	wire [7:0]    dout ;
	wire          full ;
	wire          empty;

	reg           uart_tx_busy_d0;
	reg           uart_tx_busy_d1;

	always @(posedge clk ) begin 
		uart_tx_busy_d0  <= uart_tx_busy     ;
		uart_tx_busy_d1  <= uart_tx_busy_d0  ;
	end


	always @(posedge clk ) begin 
		din  <= wr_data;
		wren <= wr_en  ;
	end

	always @(posedge clk) begin 
		if(reset) begin
			state <= IDLE;
		end 
		else begin
			 case(state)
			 	IDLE: begin
			 		if(~empty)
			 			state <= SEND ;
			 		else
			 			state <= state;
			 	end
			 	SEND : begin
			 		if(~uart_tx_busy_d0 && uart_tx_busy_d1)
			 			state <= END  ;
			 		else
			 			state <= state;
			 	end
			 	END : begin
			 		state <= IDLE;
			 	end
			 	default : state <= IDLE;
			 endcase
		end
	end

	always @(posedge clk) begin 
		if(state == IDLE && ~empty) begin
			rd_en <= 1'b1;
		end 
		else 
			rd_en <= 1'b0;
	end

	always @(posedge clk or negedge reset) begin 
		if(reset) begin
			uart_tx_en   <= 1'b0;
			uart_tx_data <= 1'b0;
		end 
		else begin
			uart_tx_en   <= rd_en;
			uart_tx_data <= dout ;
		end
	end


	fifo_w8xd128 fifo_w8xd128 (
		.clk(clk),      // input wire clk
		.srst(reset),    // input wire srst
		.din(din),      // input wire [7 : 0] din
		.wr_en(wren),  // input wire wr_en
		.rd_en(rd_en),  // input wire rd_en
		.dout(dout),    // output wire [7 : 0] dout
		.full(full),    // output wire full
		.empty(empty)  // output wire empty
		);


endmodule

然后设计顶层模块,在顶层模块我们为了上板可以看到接收效果,我们定义一个计数器,在计数器器开始计数时wr_en拉高,在wr_en拉高期间,wr_data自加,计数器计数到49时wr_en拉低,看下图:

3.3 顶层模块

在顶层模块中,其中定义了一个时钟管理单元 (PLL实现)来管理时钟和复位信号(目的使其同源),我们利用ILA逻辑分析仪来控制vio_wr来实现对wr_en的控制。

顶层文件代码如下:

`timescale 1ns / 1ps

module top(
	input	wire		clkin_50m,
	output              uart_txd
    );
    
	wire              reset  ;
	wire              clk    ;
 
	parameter 		  CLK_FREQ   = 50000000;      
	parameter 		  BAUD_RATE  = 115200  ;      
	parameter         DATA_WIDTH = 8       ;      
	parameter         STOP_WIDTH = 1       ;      
	parameter         CHACK_TYPE = 0       ;  


	wire                  uart_tx_en  ;
	wire [7:0]            uart_tx_data;
	wire                  uart_tx_busy;   
	reg                   wr_en       ;
    reg  [7:0]            wr_data     ;
	
	wire                  vio_wr      ;
	reg                   vio_wr_d0   ;
	reg                   vio_wr_d1   ;
	reg                   vio_wr_d2   ;

	reg [7:0]             cnt         ;

	always @(posedge clk ) begin
		vio_wr_d0 <= vio_wr   ;
		vio_wr_d1 <= vio_wr_d0;
		vio_wr_d2 <= vio_wr_d1;
	end

	always @(posedge clk ) begin 
		if(wr_en && cnt == 'd49)
			wr_en <= 1'b0;
		else if(vio_wr_d1 && ~vio_wr_d2) begin
			wr_en <= 1'b1;
		end
	end

	always @(posedge clk) begin
		if(reset) begin
			cnt <= 1'b0;
		end else if(wr_en && cnt == 'd49) begin
			cnt <= 1'b0;
		end
		else if(wr_en) begin
			cnt <= cnt + 1'b1;
		end
	end

	always @(posedge clk ) begin 
		if(reset) begin
			wr_data <= 1'b0;
		end else if(wr_en) begin
			wr_data <= wr_data + 1;
		end
	end
		



	clock_and_reset clock_and_reset 
	(
		.clkin_50m (clkin_50m), 
		.clkout_50M(clk), 
		.reset     (reset)
	);

	uart_send uart_send
		(
			.clk          (clk),
			.reset        (reset),

			.wr_en        (wr_en),
			.wr_data      (wr_data),
			
			.uart_tx_en   (uart_tx_en),
			.uart_tx_data (uart_tx_data),
			.uart_tx_busy (uart_tx_busy)
		);


	uart_tx #(
			.CLK_FREQ(CLK_FREQ),
			.BAUD_RATE(BAUD_RATE),
			.DATA_WIDTH(DATA_WIDTH),
			.STOP_WIDTH(STOP_WIDTH),
			.CHACK_TYPE(CHACK_TYPE)
		) inst_uart_tx (
			.clk          (clk),
			.reset        (reset),

			.uart_txd     (uart_txd),

			.uart_tx_en   (uart_tx_en),
			.uart_tx_data (uart_tx_data),
			.uart_tx_busy (uart_tx_busy)
		);
		
		
    vio_0 vio_0 (
          .clk(clk),                // input wire clk
          .probe_out0(vio_wr)  // output wire [0 : 0] probe_out0
        );
endmodule

4,上板验证

        生成bitstream文件,板级验证,在Hardware Manager界面中添加ILA:

串口接收:

再次切换vio_wr 0/1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1517645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows提示“无法删除文件:无法读源文件或磁盘”怎么办?

当用户在Mac电脑上创建一个文件&#xff0c;又将文件共享到Windows系统后&#xff0c;该文件可能无法被Windows正常识别和使用&#xff0c;并且在删除时出现“无法删除文件&#xff1a;无法读源文件或磁盘”的提示&#xff0c;这可能和Windows不支持Mac电脑创建的某些文件名有关…

Jmeter扩展开发--自定义java取样器

简介 jmeter内置了包括&#xff1a;http、https、tcp等各种协议的支持&#xff0c;通常情况只需要做简单的参数配置即可使用。但在某些特殊情况下&#xff0c;还是希望能做自定义压测处理&#xff0c;此时就涉及Jmeter的扩展开发自定义Java取样器&#xff0c;如下图所示&#…

基于物联网的智能家居监测与控制系统(全套资料)

项目源码资料下载地址&#xff1a; http://comingit.cn/?id29 易学蔚来全套毕设演示&#xff08;看上哪个选那个&#xff09;&#xff1a; https://www.yuque.com/javagongchengshi/ccadbu/nh92kcpyqodhf07l 毕设服务真实反馈&#xff0c;在线观看&#xff1a; https://www.yu…

opencv中的图像高斯模糊—GaussianBlur

高斯模糊&#xff08;Gaussian Blur&#xff09;是一种广泛应用于图像处理的平滑技术&#xff0c;其通过对图像应用高斯函数来减少图像噪声和细节。与简单平均模糊&#xff08;均值滤波&#xff09;不同&#xff0c;高斯模糊给予中心像素更高的权重&#xff0c;而远离中心的像素…

介绍Oracle的SQL调化健康检查脚本(SQLHC)

概述 Oracle提供了一个SQL调优健康检查脚本&#xff08;SQLHC&#xff09;&#xff0c;用于检查需要优化的SQL的运行环境&#xff0c;生成报告以便帮助DBA找到SQL性能不佳的原因。SQLHC是SQLT的一个子集&#xff08;我后续的文章会介绍SQLT&#xff09;&#xff0c;但SQLHC与S…

#微信小程序(一个emo文案界面)

1.IDE&#xff1a;微信开发者工具 2.实验&#xff1a;一个emo文案界面 &#xff08;1&#xff09;最好使用rpx &#xff08;2&#xff09;图片宽度占不满&#xff0c;在CSS中设置width为100% &#xff08;3&#xff09;imag图片全部为网页链接图片 3.记录 4.代码 index.htm…

sqllab第二十关通关笔记

知识点&#xff1a; cookie注入 可以进行url解析错误注入传参位置 get请求post请求cookie传参 输入admin admin进行登录&#xff0c;抓取当前数据包 通过放包发现是一个302跳转的响应包&#xff0c;页面只有一个 I Love Cookies&#xff1b;没什么信息 通过点击页面上方的按钮…

Linux搭建FTP服务器

一、概念简介 vsftpd&#xff08;very secure FTP daemon&#xff09;是Linux下的一款小巧轻快、安全易用的FTP服务器软件&#xff0c;本次实验介绍如何在Linux上安装并配置vsftpd。 FTP&#xff08;File Transfer Protocol&#xff09;是一种文件传输协议&#xff0c;基于客户…

vue antd table嵌套表格 左侧展开图标动态控制显示隐藏

antd a-table想要实现如以下效果&#xff0c;有子级就显示展开图标&#xff0c;没有就不显示图标&#xff1a; 话不多说&#xff0c;直接上代码&#xff1a; <template><a-table :columns"columns" :data-source"dataSource"><template #b…

电机参数辨识算法(1)——基于高频注入的电感辨识策略

今天将开启参数辨识的第一期。通过复现论文来学习电机参数在线辨识的方法。我会尽可能讲述我在仿真遇到的问题以及解决办法。 1.文章内容介绍 参考文献如下&#xff1a; 这篇文章的复现估计要分为几个部分&#xff0c;电感辨识、电阻辨识、磁链辨识。 文章是以无差拍预测电流…

【MySQL】MySQL主从复制

目录 技术背景数据库架构演变1.单机MySQL数据库的美好年代2.Memcached(缓存)MySQL3.主从复制&#xff1a;读写分离4.垂直拆分业务数据5.分库分表 结论——生产环境的MySQL架构 什么是主从复制作用读写分离一主多从 应用场景原理解析MySQL主从复制工作方式master 记录二进制日志…

提升零售行业竞争力的信息抽取技术应用与实践

一、引言 在当今快速发展的零售行业中&#xff0c;沃尔玛、家乐福等大型连锁超市为消费者提供了丰富的日常食品和日用品。为了进一步提升客户体验和优化库存管理&#xff0c;这些零售巨头纷纷开始探索和应用先进的信息抽取技术。 本文将深入探讨一个成功的信息抽取项目&#…

vue iview 级联选择器遇到的坑

我们PC项目用到的前端技术栈是vue+iview,最近有个需求,要做个级联选择器,并且是懒加载动态加载后端返回的数据。效果如下: 如下图所示,在我们封装的公共组件form-box.vue里有我们级联选择器: 代码如下: <!--级联选择器--><template v-else-if="item.type…

【小白学机器学习9】自己纯手动计算验证,EXCEL的一元线性回归的各种参数值

目录 0 目标 1 构造模型 1.1 构造模型的思路 1.2 具体模型构造的EXCEL公式和过程 2 直接用EXCEL画图&#xff0c;然后生成趋势线的方式进行回归分析 2.1 先选择“观测值Y”的数据&#xff0c;用散点图或者折线图作图 2.2 然后添加趋势线和设置趋势线格式 2.3 生成趋…

IP代理技术革新:探索数据采集的新路径

引言&#xff1a; 随着全球化进程不断加深&#xff0c;网络数据采集在企业决策和市场分析中扮演着愈发重要的角色。然而&#xff0c;地域限制和IP封锁等问题常常给数据采集工作带来了巨大挑战。亿牛云代理服务凭借其强大的网络覆盖和真实住宅IP资源&#xff0c;成为解决这些问…

C++ //练习 10.37 给定一个包含10个元素的vector,将位置3到7之间的元素按逆序拷贝到一个list中。

C Primer&#xff08;第5版&#xff09; 练习 10.37 练习 10.37 给定一个包含10个元素的vector&#xff0c;将位置3到7之间的元素按逆序拷贝到一个list中。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /******************…

ChatGPT赋能遥感研究:精准分析处理遥感影像数据,推动科研新突破

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。重点介绍ChatGPT在遥感中的应用&#xff0c;人工智能在解…

就业班 2401--3.13 走进网络

走进网络 长风破浪会有时&#xff0c;直挂云帆济沧海。 1.认识计算机 1.计算机网络是由计算机和通讯构成的&#xff0c;网络研究的是“通信”。 ------1946 世界上第一台计算机 2.终端&#xff1a;只有输入和输出功能&#xff0c;没有计算和处理功能。 3.数据&#xff1a;一串…

【Linux】Ubuntu使用Netplan配置静态/动态IP

1、说明 Ubuntu 18.04开始,Ubuntu和Debian移除了以前的ifup/ifdown命令和/etc/network/interfaces配置文件,转而使用ip link set或者/etc/netplan/01-netcfg.yaml模板和sudo netplan apply命令实现网络管理。 Netplan 是抽象网络配置描述器,用于配置Linux网络。 通过netpla…

command failed: npm install --loglevel error --legacy-peer-deps

在使用vue create xxx创建vue3项目的时候报错。 解决方法&#xff0c;之前使用的https://registry.npm.taobao.org 证书过期更换镜像地址即可 操作如下&#xff1a; 1.cd &#xff5e;2.执行rm .npmrc3. sudo npm install -g cnpm --registryhttp://registry.npmmirror.com…