IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> Verilog RTL 代码实战 08——串口通信处理DIY -> 正文阅读

[嵌入式]Verilog RTL 代码实战 08——串口通信处理DIY

1.通信处理的意义

我们现在已经在06、07两篇文章中完成了单独的发送和接收命令,但是只是传输数据而已,那什么时候传送,什么时候结束这样的问题还没解决;因此这里通过对通信的处理来实现我们想要的自定应串口通信,下面一起来DIY我们自己设计的串口通信

2.实现的功能

①假设我们一次要获得8个数据,数据位宽为8,那么在一堆数据流中怎么才能区别有用无用信号呢?我们可以通过添加起始帧和结束帧;

②当收8’h01时,表示开始传输;

③当接收完8个数据后,传输结束;

④显然,只有命令正确的时候,数据才能有效的输出,这样就多了一层我们可以控制的手段

⑤当我给出一定的数据流时,通过通信处理,可以滤除没用的信号

在这里插入图片描述

3.功能实现分析

①:判断是否符合起始帧,从起始帧开始构造传输区域flag

②:数据个数计数,当检测到起始帧开始计数,从计数器为1-7输出数据,到8结束

③:每输出一个数据,给一个使能信号

④:代码

module rs232_diy
(
    input               clk,
    input               rst_n,
    input               data_over,
    input [7:0]         data,
    output wire         en,
    output wire [7:0]   data_need
);

//参数
localparam      RX_NUM_END = 9;

//内部信号
reg [3:0]       rx_num; 
reg		flag;

//数据有限传输区域
always  @(posedge clk or negedge rst_n)begin
    	if(rst_n==1'b0)
    	flag <= 0;
	else if(data == 8'h01)
		flag <= 1;
	else if(rx_num == RX_NUM_END-1)
		flag <= 0;
end

//接收数据计数
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)
        rx_num <= 0;
    else if(data_over && rx_num == RX_NUM_END-1)
        rx_num <= 0;
    else if(data_over && flag)
        rx_num <= rx_num + 1;
end

//使能
assign en = (rx_num >= 'd1)?data_over:0;

//得出有用的数据
assign data_need  = (rx_num >= 1 && rx_num <= RX_NUM_END)?data:0;

endmodule

⑤:测试代码

`timescale 1 ns / 1 ns
module tb_rs232_diy();

reg		clk;
reg		rst_n;
reg		data_over;
reg [7:0]	data;
wire		en;
wire [7:0]	data_need;

parameter	CYCLE	=	20;

initial begin
	clk = 0;
	forever
	#(CYCLE/2)
	clk = ~clk;
end

initial begin
	rst_n = 1;
	#2
	rst_n = 0;
	#2
	rst_n = 1;
end

rs232_diy u1
(
    .clk	(clk),
    .rst_n	(rst_n),
    .data_over	(data_over),
    .data	(data),
    .en		(en),
    .data_need	(data_need)
);

initial begin
	data_over = 0;
	#14
	data	  = 8'hff;

	#16
	data_over = 1;
	#1
	data	= 8'h11;
	#1
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h22;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h01;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h11;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h22;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h33;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h44;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h55;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h66;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h77;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h88;
	#2
	data_over = 0;

	#16
	data_over = 1;
	#2
	data	= 8'h99;
	#2
	data_over = 0;	
end

endmodule

仿真结果:

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:46:32  更:2022-03-04 15:46:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:45:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码