基于Verilog的串口接收程序
一、模块框图及基本思路
detect_module:检测输入引脚的下降沿,以此判断一帧数据的开始
rx_bps_module:波特率时钟产生模块
rx_control_module:串口接收的核心控制模块
rx_module:前三个模块的组合
control_module2:接受控制模块,不断接收串口数据
rx_top_module:将接收到数据的第四位以LED的形式显示
二、软件部分
detect_module:
module detect_module(
CLK,RSTn,
RX_Pin_in,
H2L_Sig
);
input CLK,RSTn;
input RX_Pin_in;
output H2L_Sig; /**********************************/
reg RX_r1;
reg RX_r2; always @(posedge CLK or negedge RSTn)
begin
if(!RSTn)
begin
RX_r1<='b1;
RX_r2<='b1;
end
else
begin
RX_r1<=RX_Pin_in;
RX_r2<=RX_r1;
end
end
/*********************************/ assign H2L_Sig=RX_r2&(!RX_r1); endmodule
rx_bps_module:
module rx_bps_module #(parameter Baud=)(
CLK,RSTn,
Count_Sig,
BPS_CLK
);
input CLK;
input RSTn;
input Count_Sig;
output BPS_CLK; /***************************/
localparam Baud_Div=50_000_000/Baud-;
localparam Baud_Div2=Baud_Div/; reg[:] Count_BPS;
/*************************/
always @(posedge CLK or negedge RSTn)
begin
if(!RSTn)
Count_BPS<='d0;
else if(Count_BPS==Baud_Div)
Count_BPS<='d0;
else if(Count_Sig)
Count_BPS<=Count_BPS+;
else Count_BPS<='d0;
end
/************************/
assign BPS_CLK=(Count_BPS==Baud_Div2)?'b1:1'b0;
endmodule
rx_control_module:
module rx_control_module(
CLK,RSTn,
H2L_Sig,BPS_CLK,RX_Pin_in,
Count_Sig,RX_En_Sig,RX_Done_Sig,RX_Data
); input CLK,RSTn;
input H2L_Sig,BPS_CLK,RX_En_Sig,RX_Pin_in;
output Count_Sig,RX_Done_Sig;
output [:] RX_Data; reg[:] i;
reg isCount;
reg isDone;
reg [:] rData;
/********************************************/
always @(posedge CLK or negedge RSTn)
begin
if(!RSTn)
begin
i<='d0;
isCount<='b0;
isDone<='b0;
rData<='d0;
end
else if(RX_En_Sig)
begin
case(i)
'd0:if(H2L_Sig) begin i<=i+1'b1;isCount<='b1; end //接收到下降沿开始启动波特率计数
'd1:if(BPS_CLK) begin i<=i+1'b1; end //起始位
'd2,4'd3,'d4,4'd5,'d6,4'd7,'d8,4'd9:
if(BPS_CLK) begin rData[i-]<=RX_Pin_in;i<=i+'b1;end //数据位
'd10:if(BPS_CLK) begin i<=i+1'b1; end //校验位
'd11:if(BPS_CLK) begin i<=i+1'b1; end //停止位
'd12:if(BPS_CLK) begin i<=i+1'b1;isDone<='b1;isCount<=1'b0; end //一个时钟脉冲的 isDone 信号
'd13:begin i<=1'b0;isDone<='b0; end
endcase
end end /********************************************/
assign Count_Sig=isCount;
assign RX_Done_Sig=isDone;
assign RX_Data=rData; endmodule
rx_module:
module rx_module(
CLK,RSTn,
RX_Pin_in,RX_Done_Sig,RX_Data,RX_En_Sig
); input CLK,RSTn;
input RX_Pin_in,RX_En_Sig;
output RX_Done_Sig;
output [:] RX_Data; wire Count_Sig;
wire BPS_CLK;
wire H2L_Sig; rx_bps_module U0(
.CLK(CLK),.RSTn(RSTn),
.Count_Sig(Count_Sig),
.BPS_CLK(BPS_CLK)
); detect_module U1(
.CLK(CLK),.RSTn(RSTn),
.RX_Pin_in(RX_Pin_in),
.H2L_Sig(H2L_Sig)
); rx_control_module U2(
.CLK(CLK),.RSTn(RSTn),
.H2L_Sig(H2L_Sig),.BPS_CLK(BPS_CLK),.RX_Pin_in(RX_Pin_in),
.Count_Sig(Count_Sig),.RX_En_Sig(RX_En_Sig),.RX_Done_Sig(RX_Done_Sig),.RX_Data(RX_Data)
); endmodule
control_module2:
module control_module2(
CLK,RSTn,
RX_Done_Sig,
RX_En_Sig,
RX_Data,
Number_Data
); input CLK;
input RSTn;
input RX_Done_Sig;
input [:]RX_Data;
output RX_En_Sig;
output [:] Number_Data; /***************************************/
reg[:] rData;
reg rEn;
always @(posedge CLK or negedge RSTn)
begin
if(!RSTn)
begin
rData<='d0;
rEn<='b0;
end
else if(RX_Done_Sig)
begin
rEn<='b0;
rData<=RX_Data;
end
else rEn<='b1;
end
/***************************************/
assign Number_Data=rData;
assign RX_En_Sig=rEn; endmodule
rx_top_module:
module rx_top_module(
CLK,RSTn,
RX_Pin_in,Led
);
input CLK,RSTn;
input RX_Pin_in;
output [:]Led; wire RX_Done_Sig;
wire RX_En_Sig;
wire [:] Number_Data;
wire [:] RX_Data; rx_module U0(
.CLK(CLK),.RSTn(RSTn),
.RX_Pin_in(RX_Pin_in),.RX_Done_Sig(RX_Done_Sig),.RX_Data(RX_Data),.RX_En_Sig(RX_En_Sig)
); control_module2 U1(
.CLK(CLK),.RSTn(RSTn),
.RX_Done_Sig(RX_Done_Sig),
.RX_En_Sig(RX_En_Sig),
.RX_Data(RX_Data),
.Number_Data(Number_Data)
); assign Led=Number_Data[:];
endmodule
三、硬件部分
黑金SPARTAN-6开发板
NET "CLK" LOC = T8;
NET "RSTn" LOC = L3;
NET "RX_Pin_in" LOC = C11;
NET "Led[0]" LOC = P4;
NET "Led[1]" LOC = N5;
NET "Led[2]" LOC = P5;
NET "Led[3]" LOC = M6;
基于Verilog的串口接收程序的更多相关文章
- 基于Verilog的串口发送程序
一.模块框图及基本思路 tx_bps_module:波特率时钟产生模块 tx_control_module:串口发送的核心控制模块 tx_module:前两个模块的组合 control_module: ...
- 基于Verilog的带FIFO输出缓冲的串口接收接口封装
一.模块框图及基本思路 rx_module:串口接收的核心模块,详细介绍请见“基于Verilog的串口接收实验” rx2fifo_module:rx_module与rx_fifo之间的控制模块,其功能 ...
- 基于Verilog的带FIFO写入缓冲的串口发送接口封装
一.模块框图及基本思路 tx_module:串口发送的核心模块,详细介绍请参照前面的“基于Verilog的串口发送实验” fifo2tx_module:当fifo不为空时,读取fifo中的数据并使能发 ...
- Qt编写串口通信程序全程图文解说
(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...
- 转:Qt编写串口通信程序全程图文讲解
转载:http://blog.csdn.net/yafeilinux/article/details/4717706 作者:yafeilinux (说明:我们的编程环境是windows xp下,在Q ...
- Qt编写串口通信程序全程图文讲解 .
在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qex ...
- 【转】Qt编写串口通信程序全程图文讲解
本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
- 018_STM32程序移植之_串口接收中文
(一)在平时数据传输中很少用到接收中文的情况,但是最近需要用到就花了半天时间来弄弄 (二)接收原理,从现在接收情况分析:一个中文占两个数据的空间,也就是两个十六进制可以转化成为一个中文 (三)示例情况 ...
随机推荐
- tomcat启动闪退问题
tomcat的bin->setclasspath.bat文件中 将两个set加上,并且将if not “%JAVA_HOME%”放到%JRE_HOME%上面.
- 史上最全python面试题详解(一)(附带详细答案(持续更新))
1.简述解释型和编译型编程语言? 概念: 编译型语言:把做好的源程序全部编译成二进制代码的可运行程序.然后,可直接运行这个程序. 解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束! 区别: ...
- Technical poem
Apartment Good apartment be booked the second it bring to market. low product sold to many man, and ...
- java4/9 异常处理
- 安卓内嵌H5只展示部分静态页面
问题: 安卓内嵌H5在华为P9部分机型只展示h5静态页面无法展示接口返回渲染的页面 解决办法: Android 关闭硬件加速 android:hardwareAccelerated=" ...
- [C++ Primer Plus] 第5章、循环和关系表达式(一)程序清单——指针自加减优先级
程序5.4 #include<iostream> using namespace std; ; void main() { long long factorials[Size]; fact ...
- css的再深入7(更新中···)
1.transparent 透明的 2.placeholder 提示语 写页面 搞清结构层次, 保证模块化,让他们之间不能受到影响 (1) 元素性质 (2) 标准流 浮动带来的脱离文档流撑不起父级 ...
- Intellij IDEA 修改默认配置
更新IDEA,是配置无缝对接 idea里面的配置文件主要就idea64.exe.vmoptions,idea.properties 不要更新idea自带的这两个文件,因为在更新IntelliJ IDE ...
- js实现千位分隔
最近一个项目中使用到了千位分隔这个功能,在网上也看见一些例子,但是实现起来总觉有些复杂.因此,自己实现了一个千位分隔,留给后来的我们. 先上源码吧. 该方法支持传入的是一个数字字符串,数字.第二个参数 ...
- Codeforces 587 E. Duff as a Queen
题目链接:http://codeforces.com/contest/587/problem/E 其实就是线段树维护区间线性基,合并的时候注意一下.复杂度${O(nlog^{3})}$ #includ ...