串口接收模块(verilog) 波特率115200

我来分享一下uart协议之接收verilog代码

顶层实例化

`timecale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 17:38:36 11/07/2017
// Design Name: chendog
// Module Name: uart_receive_top
// Project Name: uart_receive
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module uart_receive_top(
input wire clk, //时钟信号
input wire rst_n, //复位信号
input wire receive, //接收信号
output wire [7:0] data //接收数据
);

wire cnt_start; //开始计数
wire bps_sig; //读数据中间位置
wire recei_nege; //下降沿开始接收数据

/////////////////////////////////////波特率设置模块
bps_set bps_set1(
.clk(clk),
.rst_n(rst_n),
.receive(receive),
.cnt_start(cnt_start),
.bps_sig(bps_sig),
.recei_nege(recei_nege)
);

////////////////////////////////////数据接收状态转换
receive_fsm receive_fsm1(
.clk(clk),
.rst_n(rst_n),
.receive(receive),
.bps_sig(bps_sig),
.recei_nege(recei_nege),
.cnt_start(cnt_start),
.data(data)
);

endmodule

波特率设置

module bps_set(
input wire clk,
input wire rst_n,
input wire receive,
input wire cnt_start,
output wire bps_sig,
output wire recei_nege
);

///////////////////////////////////////////////下降沿检测
reg receive1;
reg receive2;

[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n) begin
receive1 <= 1‘b0;
receive2 <= 1‘b0;
end
else begin
receive1 <= receive;
receive2 <= receive1;
end
end

assign recei_nege = receive2 & ~receive1;

/////////////////////////////////////////////////分频计数
parameter CONSTANT1 = 9‘d434;  //波特率115200  434 = 50m/115200

reg [8:0] cnt;

[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt <= 9‘d0;
else if(cnt_start) begin
if(cnt == CONSTANT1 - 1‘b1)
cnt <= 9‘d0;
else
cnt <= cnt + 1‘b1;
end
else
cnt <= cnt;
end

assign bps_sig = (cnt == CONSTANT1 / 2)? 1‘b1:1‘b0; //采集计数中间位置

endmodule

接收状态机

module receive_fsm(
input wire clk,
input wire rst_n,
input wire receive,
input wire bps_sig,
input wire recei_nege,
output reg cnt_start,
output reg [7:0] data
);

reg [3:0] state;

////////////////////////////////////////////一段式状态机
[email protected](posedge clk or negedge rst_n)
begin
if(!rst_n) begin
cnt_start <= 1‘b0;
state <= 4‘d0;
data <= 8‘d0;
end
else case(state)
0: if(recei_nege) begin //等待数据线下降沿 下降沿到来 进入计数状态
state <= 4‘d1;
cnt_start <= 1‘b1;
data <= 8‘d0;
end

else begin
state <= 4‘d0;
cnt_start <= 1‘b0;
data <= 8‘d0;
end

1: if(bps_sig) begin //第一位 起始位
state <= state + 4‘d1;
end
else begin
state <= state;
end

2,3,4,5,6,7,8,9: //数据位开始接收
if(bps_sig) begin
state <= state + 4‘d1;
data[state - 4‘d2] <= receive;
end

else begin
state <= state;
end

10,11:if(bps_sig) begin //停止位与校验位
state <= state + 4‘d1;
end

else begin
state <= state;
end
12:if(bps_sig) begin //完成一次接收 停止计数 回到state = 0
state <= 4‘b0;
cnt_start <= 1‘b0;
end
else begin
state <= state;
end
endcase
end

endmodule

纯代码与注释,有问题联系qq:1424307272

时间: 2024-10-25 21:40:53

串口接收模块(verilog) 波特率115200的相关文章

FPGA UART简单的串口接收模块

FPGA UART RX,FPGA设计一个简单的串口接收模块 FPGA UART TX,简单的FPGA串口发送模块

FPGA学习之串口接收模块

原文弊端,串口每次只能接受一个,再接受需要先关闭串口再打开才有效.(可能是软件问题,换一个之后OK) 首先是改波特率,例程为9600,改成115200. 115200 bps 传输速度使一位数据的周期是 0.0000086805s .以 50Mhz 时钟频率要得到上述的定时需要:N = 0.0000086805 / ( 1 / 50Mhz ) = 434 1 module rx_bps_module 2 ( 3 CLK, RSTn,Count_Sig, BPS_CLK 4 5 ); 6 inpu

Qt串口实现921600波特率的方法

环境配置: 主机:XP QT:5.4.0 写在这里的重点并不是告诉人如何在Qt的串口编程中实现921600的Bps. 1.在Qt中使用串口,我们需要一个第三方的串口类:qextserialport.在其qextserialbase.h文件中,提供了如下常用的波特率: enum BaudRateType { BAUD50, //POSIX ONLY BAUD75, //POSIX ONLY BAUD110, BAUD134, //POSIX ONLY BAUD150, //POSIX ONLY B

串口通信常用波特率,中断函数

1.12M晶振产生2400 4800波特率 /**************************************************************** 函数名:UART串口初始化函数 调  用:UART_init(); 参  数:无 返回值:无 结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用) 备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ] /********************************

STM32串口中断卡死主循环问题分析

在一项目中,使用STM32作为主控,程序运行一段时间后概率出现主循环卡死现象. 问题分析如下: 1.程序USART2不停接收并处理串口数据,波特率115200: 2.主循环卡死: 3.USART1中断及TIM2中断响应函数运行正常:(USART1及TIM2中断优先级均比USART2高) 4.出现现象后,拔掉USART2的接收数据线,现象不能回复正常: 5.出现现象后,拔掉后再插入USART2的接收数据线,现象不能回复正常: 6.并未出现HardFault现象: 基于以上4点,可能原因如下: 1.

【STM32H7的DSP教程】第9章 Matlab的串口通信实现

完整版教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=94547 第9章   Matlab的串口通信实现 本章节主要为大家讲解Matlab的串口方式波形数据传输和后期数据分析功能,非常实用. 9.1 初学者重要提示 9.2 程序设计框架 9.3 下位机STM32H7程序设计 9.4 上位机Matlab程序设计 9.5 Matlab上位机程序运行 9.6 实验例程说明(MDK) 9.7 实验例程说明(IAR) 9.8 总结 9.1 

minicom-2.4安装配置

minicom-2.4安装说明 1.#tar –zxvf minicom-2.4.tar.gz 解压开有连个文件,minicom-2[1].4.tar.gz  和minirc.dfl rpm包方式# rpm -ivh minicom-xxx.rpm 2.#tar –zxvf minicom-2[1].4.tar.gz #cd minicom-2.4 #./configure #make &&make install 如果在make时有重复定义错误,将冲突语句注释掉 3.#cp  minir

为什么要有uboot?带你全面分析嵌入式linux系统启动过程中uboot的作用

1.为什么要有uboot 1.1.计算机系统的主要部件 (1)计算机系统就是以CPU为核心来运行的系统.典型的计算机系统有:PC机(台式机+笔记本).嵌入式设备(手机.平板电脑.游戏机).单片机(家用电器像电饭锅.空调) (2)计算机系统的组成部件非常多,不同的计算机系统组成部件也不同.但是所有的计算机系统运行时需要的主要核心部件都是3个东西: CPU + 外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM) 1.2.PC机的启动过程 (1)部署:典型的PC

HI3518c+OV9712

==================写的好,大转一把,呵呵================ hi3518C 环境说明 硬件环境: 处理器内核:   [email protected]     ,16KB I-Cache, 16KB D-Cache 视频编码:H.264 Baseline Profile 编码    H.264 Main Profile编码   MJPEG/JPEG Baseline编码 视频编码处理器性能: H.264编码可支持最大分辨率为2M Pixel (像素) H.264&