串口的全程为串行接口,也称为串行通信接口,是采用串行通信方式的扩展接口。与串口对应的并行接口,例如高速AD和DA,

这些都是用的并行接口,而且在编程也简单一些。

  串口有一下特点:

  (1)通信线路简单,只要一对传输线就可以实现双向通信。

  (2)布线简单,成本低。

  (3)通信距离长,可以实现数米到数千米的通信距离。

  (4)传输速率慢。

  常见的串口速率如4800 , 9600 , 115200bps,代表每秒钟发送多少bit数据,例如9600bps就代表1秒内发送9600bit数据。 

  串口协议 : 协议比较简单,一般都是10位数据,1个起始位 低电平 ,然后八个数据位,低位在前,一个奇偶校验位,平时

一般不用,最后是一位停止位高电平,这样一帧数据发送结束。

  下面介绍一下我的程序框架:

    整体框架分为两个部分:一个是串口驱动部分 另一个是串口数据控制部分。串口驱动部分负责串口驱动和波特率的选择,串口数据控制模块

  负责控制数据内容的控制和发送速度的控制。

从上面时序图可以看出,每10ms发送一帧数据,这里data_en负责波特率驱动使能,uart_tx_end有两个功能,一个是关闭data_en使能,另一个是给10ms计数器

清零。

/*-----------------------------------------------------------------------

Date                :        2017-09-03
Description : Design for uart_driver. -----------------------------------------------------------------------*/ module uart_tx_driver
(
//global clock
input clk , //system clock
input rst_n , //sync reset //uart interface
output reg uart_tx , //user interface
input [:] bps_select , //波特率选择
input [:] uart_data ,
input data_en , //发送数据使能
output reg uart_tx_end
); //--------------------------------
//Funtion : 参数定义 parameter BPS_4800 = 'd10417 ,
BPS_9600 = 'd5208 ,
BPS_115200 = 'd434 ; reg [:] cnt_bps_clk ;
reg [:] bps ;
reg bps_clk_en ; //bps使能时钟
reg [:] bps_cnt ;
wire [:] BPS_CLK_V = bps >> ;
//--------------------------------
//Funtion : 波特率选择 always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
bps <= 'd0;
else if(bps_select == 'd0)
bps <= BPS_115200;
else if(bps_select == 'd1)
bps <= BPS_9600;
else
bps <= BPS_4800;
end //--------------------------------
//Funtion : 波特率计数 always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_bps_clk <= 'd0;
else if(cnt_bps_clk >= bps - && data_en == 'b0)
cnt_bps_clk <= 'd0;
else
cnt_bps_clk <= cnt_bps_clk + 'd1;
end //--------------------------------
//Funtion : 波特率使能时钟 always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
bps_clk_en <= 'd0;
else if(cnt_bps_clk == BPS_CLK_V - )
bps_clk_en <= 'd1;
else
bps_clk_en <= 'd0;
end //--------------------------------
//Funtion : 波特率帧计数 always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
bps_cnt <= 'd0;
else if(bps_cnt == )
bps_cnt <= 'd0;
else if(bps_clk_en)
bps_cnt <= bps_cnt + 'd1;
end //--------------------------------
//Funtion : uart_tx_end always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
uart_tx_end <= 'd0;
else if(bps_cnt == )
uart_tx_end <= 'd1;
else
uart_tx_end <= 'd0;
end //--------------------------------
//Funtion : 发送数据 always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
uart_tx <= 'd1;
else case(bps_cnt)
'd0 : uart_tx <= 1'd1; 'd1 : uart_tx <= 1'd0; //begin
'd2 : uart_tx <= uart_data[0];//data
'd3 : uart_tx <= uart_data[1];
'd4 : uart_tx <= uart_data[2];
'd5 : uart_tx <= uart_data[3];
'd6 : uart_tx <= uart_data[4];
'd7 : uart_tx <= uart_data[5];
'd8 : uart_tx <= uart_data[6];
'd9 : uart_tx <= uart_data[7]; 'd10 : uart_tx <= 1; //stop
default : uart_tx <= ;
endcase
end endmodule
/*-----------------------------------------------------------------------

Date                :        2017-XX-XX
Description : Design for . -----------------------------------------------------------------------*/ module uart_tx_control
(
//global clock
input clk , //system clock
input rst_n , //sync reset //user interface
output reg [:] uart_data ,
output reg data_en ,
input uart_tx_end ); //--------------------------------
//Funtion : 参数定义 parameter DELAY_10MS = 500_000 ;
reg [:] cnt_10ms ;
wire delay_10ms_done ; //data define
reg [:] cnt_1s; //--------------------------------
//Funtion : cnt_10ms always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_10ms <= 'd0;
else if(cnt_10ms == DELAY_10MS - && uart_tx_end == 'd1)
cnt_10ms <= 'd0;
else
cnt_10ms <= cnt_10ms + 'd1;
end assign delay_10ms_done = (cnt_10ms == DELAY_10MS - ) ? 'd1 : 1'd0; //--------------------------------
//Funtion : data_en always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
data_en <= 'd0;
else if(delay_10ms_done)
data_en <= 'd1;
else if(uart_tx_end)
data_en <= 'd0;
end ///////////////////////数据测试/////////////////////////////
//--------------------------------
//Funtion : cnt_1s always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
cnt_1s <= 'd0;
else if(cnt_1s == 49_999_999)
cnt_1s <= 'd0;
else
cnt_1s <= cnt_1s + 'd1;
end //--------------------------------
//Funtion : uart_data always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
uart_data <= 'd0;
else if(uart_data >= )
uart_data <= 'd0;
else if(cnt_1s == 49_999_999)
uart_data <= uart_data + 'd1;
end endmodule

fpga串口通信的更多相关文章

  1. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  2. PC和FPGA间的串口通信实现

    应用笔记 V1.0 2015/03/26 PC和FPGA间的串口通信实现   概述   本文将介绍PC和FPGA间的串口通信实现的基本思路和Verilog代码,对于通信而言,收发双方都要有相应的控制. ...

  3. FPGA串口波特率简析

    以前用单片机,一直都是直接用就行,设置波特率时,直接写9600就行,一直没有仔细考虑过,今天打算用FPGA写个串口程序时才知道,原来根本就是没弄明白.一下是我的一些见解.如果诸位看官觉得不对,欢迎指正 ...

  4. RS232串口通信

    RS232串口经常使用在PC机与FPGA通信中,用于两者之间的数据传输,因为UART协议简单.易实现,故经常使用. DB9接口只需要使用3根线,RXD(2).TXD(3)和GND(5),如下图所示.而 ...

  5. .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...

  6. BluetoothChat用于蓝牙串口通信的修改方法

    本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...

  7. Win10 IoT C#开发 4 - UART 串口通信

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug ...

  8. 使用Java实现简单串口通信

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...

  9. Java 串口通信

    在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...

随机推荐

  1. boost------signals2的使用2(Boost程序库完全开发指南)读书笔记

    1.应用于观察者模式 本小节将使用signals2开发一个完整的观察者模式示例程序,用来演示信号/插槽的用法.这个程序将模拟一个日常生活场景:客人按门铃,门铃响,护士开门,婴儿哭闹. Ring.h: ...

  2. CGI杂谈

    CGI是一个连接外部应用程序到信息服务器(比如HTTP或者网络服务器)的标准.一个简单的HTML文档是无交互后台程序,它是静态的,也就是说它处于一个不可变的状态,即文本文件不可以变化.相反地,CGI程 ...

  3. linux内核数据结构之链表

    linux内核数据结构之链表 1.前言 最近写代码需用到链表结构,正好公共库有关于链表的.第一眼看时,觉得有点新鲜,和我之前见到的链表结构不一样,只有前驱和后继指针,而没有数据域.后来看代码注释发现该 ...

  4. .NET里的行为驱动开发

    BDD (Given - When - then) Ruby Cucumber, Java FitNesse , Python RoboFramework, C# specflow nspec .NE ...

  5. 使用 HttpClient 进行连接

    对于System.Net.Http的学习(二)——使用 HttpClient 进行连接   对于System.Net.Http的学习(一)——System.Net.Http 简介  使用 HttpCl ...

  6. 迟到的 WPF 学习 —— 依赖项属性

    本章学习依赖项属性,英文原文 Dependency Property,它是传统 .Net Framework 属性的扩展,是 WPF 的专属,但所幸使用起来和传统属性几乎一样.WPF 元素所提供的大多 ...

  7. 企业架构研究总结(26)——TOGAF架构开发方法(ADM)之实施治理阶段

    1.9 实施治理(Implementation Governance) 企业架构开发方法各阶段——实施治理 1.9.1 目标 本阶段的目标是: 为每个实施计划给予建议. 对涵盖整个实施和部署过程的架构 ...

  8. IOS学习之路八(GCD与多线程)

    GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制.它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后者用来执行任务. GCD中的FIFO队列称为 ...

  9. RTB撕开黑盒子 Part 3: Beyond Surplus

    在本文中,我将解释如果要对整个推广计划最大化利润,决定是否应该出价的应该是期望回本率(ROI),而不是期望利润,这与我们以前介绍的有所不同.在Datacratic,我们已经在2012年底切到了基于RO ...

  10. 初探原生js根据json数据动态创建table

    初探原生js根据json数据动态创建table 小生以实习生的职位进入了一家非纯软件的公司做asp.net开发,大半个月下来发现公司里居然没有前端工程师,这令我很诧异,跟着公司做项目,发现前端后台没有 ...