串口的全程为串行接口,也称为串行通信接口,是采用串行通信方式的扩展接口。与串口对应的并行接口,例如高速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. 一个小团队TDD游戏及实践

    介绍的这个游戏是自己根据目前带的团队的实际情况来制定的, 在游戏实践过程中,收到了较好的效果,故打算把这个游戏分享出来,一是分享一下实践,而是集思广益,不断完善,更好的利用游戏来锻炼队伍.下面就将游戏 ...

  2. IOS UI 第一篇:基本UI

    1. UI 书写 最基本创建一个label 标签 写一个first rate :      UILabel *label = [[UILabel alloc] initWithFrame:CGRect ...

  3. Oracle 补丁及opatch 工具介绍

    一. CPU(Critical Patch Update) 一个CPU内包含了对多个安全漏洞的修复,并且也包括相应必需的非安全漏洞的补丁.CPU是累积型的,只要安装最新发布的CPU即可,其中包括之前发 ...

  4. c#多选下拉框(ComboBox)

    代码如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawi ...

  5. 查看TOMCAT内存使用情况 以及修改方法

    查看TOMCAT内存使用情况 <% double total = (Runtime.getRuntime().totalMemory()) / (1024.0 * 1024); double m ...

  6. 自定义html标签

    自定义html标签 (觉得页面全是div 的解决办法 来个个性化) 办法一(来源于 让ie支持html5标签的方法): 在ie9以前如果要自定义要使用document.createElement的方法 ...

  7. SQL Server中的高可用性1

    SQL Server中的高可用性(1)----高可用性概览   自从SQL Server 2005以来,微软已经提供了多种高可用性技术来减少宕机时间和增加对业务数据的保护,而随着SQL Server ...

  8. c# winform 在一个窗体中使用另一个窗体中TextBox控件的值——解决办法

    [前提]一个winform应用程序项目中,窗体B,需要使用 窗体A 中一个TextBox控件的值,进行计算等操作. [解决方案] 1.在窗体A中定义:public static double a;// ...

  9. 用maven来创建web工程

    大约已经一个月没有写博客了,一个是最近太忙,另外啊还是人慢慢的变懒,最近在拆pool,用到了maven,因此呢把自己的一些心得记下来了,供大家参考,欢迎指正. 1.配置maven环境: 首先下载mav ...

  10. TFS体系结构和概念

    TFS体系结构和概念 TFS是Team Fundation Server的简称,是微软VSTS的一部分,它是Microsoft应用程序生命周期管理(ALM)工具的核心协作平台,简单的说它是管理和开发软 ...