我来分享一下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;

always@(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;

always@(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;

////////////////////////////////////////////一段式状态机
always@(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

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

  1. 使用uart串口接收模块接收信号,控制led灯闪烁

    功能描述: 使用遵循uart协议的接收模块接收控制信号,用来控制led的闪烁. 设计输入: 1.uart输入信号 2.时钟信号 3.复位信号 4.led信号 设计思路: 总体上:前面已经写了串口接收模 ...

  2. 痞子衡嵌入式:嵌入式里串口(UART)自动波特率识别程序设计与实现

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是嵌入式里串口(UART)自动波特率识别程序设计与实现. 串口(UART)是嵌入式里最基础最常用也最简单的一种通讯(数据传输)方式,可以说 ...

  3. 串口接收端verilog代码分析

    串口接收端verilog代码分析 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////// ...

  4. STC8单片机波特率115200时乱码解决

    最近开发一个STC8单片机(STC8H3K32S2)项目,需要通过传口与蓝牙模块通讯,波特率高于57600后STC接收时出现乱码,但发送时正常.当将stc8串口和蓝牙串口分别接USB转串口模块通讯正常 ...

  5. zedboard 中SDK 修改串口设置(波特率。。。。)

    其实在zedboard   SDK中不用初始化串口的也就是platform()可以不写 ,初始化在EDK导入SDK中就写好了  具体看bsp文件夹下面的汇编.但是如果我们想要在SDK中改变串口设置的话 ...

  6. 【接口时序】3、UART串口收发的原理与Verilog实现

    一.软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1.FPGA型号:XC6SLX45- ...

  7. CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)

    参考学习大神博客: http://blog.csdn.net/feilusia/article/details/51083953 : http://blog.csdn.net/xiaoleiacmer ...

  8. ESP8266 SDK开发: 外设篇-串口

    串口分布 串口切换说明 1.默认所有的数据都使用串口0输出 官方提供了函数可以选择printf利用哪一个串口输出 配置printf使用串口1打印输出,波特率115200 (注:这样配置对于调试程序很有 ...

  9. STM32 串口接收大量数据导致死机

    http://blog.csdn.net/origin333/article/details/49992383 以下文章出自上面的链接.感谢原创作者的分享. 在一项目中,使用STM32作为主控,程序运 ...

随机推荐

  1. 一个基于Asp.net MVC的博客类网站开源了!

    背景说明: 大学时毕业设计作品,一直闲置在硬盘了,倒想着不如开源出来,也许会对一些人有帮助呢,而且个人觉得这个网站做得还是不错了,毕竟是花了不少心思,希望对你有所帮助. github地址:https: ...

  2. Quartz源码——JobStore保存JonDetail和Trigger源码分析(一)

    我都是分析的jobStore 方式为jdbc的SimpleTrigger!RAM的方式类似分析方式! {0} :表的前缀 ,如表qrtz_trigger ,{0}== qrtz_ {1}:quartz ...

  3. pygame_polygon

    今天我们要在窗口上绘制简单的多边形 1.认识几个简单的常用的颜色: black=(0,0,0) while=(255,255,255) red=(255,0,0) green=(0,255,0) bl ...

  4. IFrame父页面和子页面的交互

    现在在页面里面用到iframe的情况越来越少了,但有时还是避免不了,甚至这些页面之间还需要用js来做交互,那么这些页面如何操作彼此的dom呢?下面将会逐步介绍. 1.父页面操作子页面里面的dom 下面 ...

  5. windows无法启动MySQL服务 错误1067

    启动wampmysqld 出现 1067 错误 解决方法:删除在MySQL安装目录下的Data目录中的ib_logfile0和ib_logfile1这两个文件. 重新启动MySQL服务

  6. PHP MYSQL 搜索周边坐标,并计算两个点之间的距离

    搜索附近地点,例如,坐标(39.91, 116.37)附近500米内的人,首先算出“给定坐标附近500米”这个范围的坐标范围. 虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围 ...

  7. C-一行或多行文章垂直居中

    1 样式效果 2 table布局 li span 

  8. Hadoop(四)HDFS集群详解

    前言 前面几篇简单介绍了什么是大数据和Hadoop,也说了怎么搭建最简单的伪分布式和全分布式的hadoop集群.接下来这篇我详细的分享一下HDFS. HDFS前言: 设计思想:(分而治之)将大文件.大 ...

  9. Linux-fdisk磁盘分区命令(16)

    名称: fdisk 使用: fdisk [块设备磁盘] 说明: 将一个块设备(磁盘)分成若干个块设备(磁盘),并将分区的信息写进分区表.  fdisk命令菜单常用参数如下所示: d:(del)删除一个 ...

  10. C#-WinForm 串口通信

    //C# 的串口通信,是采用serialPort控件,下面是对serialPort控件(也是串口通信必备信息)的配置如下代码: serialPort1.PortName = commcomboBox1 ...