0:起始位,低电平;1~8:数据位;9:校验位,高电平;10:停止位,高电平。

波特率 “9600bps”表示每秒可以传输9600位。

波特率定时计数器由时钟频率除以波特率。

采集1~8位,忽略0、9、10位。

发送“0、8位数据、1、1”

串口传输数据,从最低位开始,到最高位结束。

串口发送:

  1. module tx_bps_module
  2. (
  3. CLK, RSTn,
  4. Count_Sig,
  5. BPS_CLK
  6. );
  7.  
  8. input CLK;
  9. input RSTn;
  10. input Count_Sig;
  11. output BPS_CLK;
  12.  
  13. /***************************/
  14.  
  15. reg [:]Count_BPS;
  16.  
  17. always @ ( posedge CLK or negedge RSTn )
  18. if( !RSTn )
  19. Count_BPS <= 'd0;
  20. else if( Count_BPS == 'd5207 )
  21. Count_BPS <= 'd0;
  22. else if( Count_Sig )
  23. Count_BPS <= Count_BPS + 'b1;
  24. else
  25. Count_BPS <= 'd0;
  26.  
  27. /********************************/
  28.  
  29. assign BPS_CLK = ( Count_BPS == 'd2604 ) ? 1'b1 : 'b0;
  30.  
  31. /*********************************/
  32.  
  33. endmodule
  1. module tx_control_module
  2. (
  3. CLK, RSTn,
  4. TX_En_Sig, TX_Data, BPS_CLK,
  5. TX_Done_Sig, TX_Pin_Out
  6.  
  7. );
  8.  
  9. input CLK;
  10. input RSTn;
  11.  
  12. input TX_En_Sig;
  13. input [:]TX_Data;
  14. input BPS_CLK;
  15.  
  16. output TX_Done_Sig;
  17. output TX_Pin_Out;
  18.  
  19. /********************************************************/
  20.  
  21. reg [:]i;
  22. reg rTX;
  23. reg isDone;
  24.  
  25. always @ ( posedge CLK or negedge RSTn )
  26. if( !RSTn )
  27. begin
  28. i <= 'd0;
  29. rTX <= 'b1;
  30. isDone <= 'b0;
  31. end
  32. else if( TX_En_Sig )
  33. case ( i )
  34.  
  35. 'd0 :
  36. if( BPS_CLK ) begin i <= i + 'b1; rTX <= 1'b0; end
  37.  
  38. 'd1, 4'd2, 'd3, 4'd4, 'd5, 4'd6, 'd7, 4'd8 :
  39. if( BPS_CLK ) begin i <= i + 'b1; rTX <= TX_Data[ i - 1 ]; end
  40.  
  41. 'd9 :
  42. if( BPS_CLK ) begin i <= i + 'b1; rTX <= 1'b1; end
  43.  
  44. 'd10 :
  45. if( BPS_CLK ) begin i <= i + 'b1; rTX <= 1'b1; end
  46.  
  47. 'd11 :
  48. if( BPS_CLK ) begin i <= i + 'b1; isDone <= 1'b1; end
  49.  
  50. 'd12 :
  51. begin i <= 'd0; isDone <= 1'b0; end
  52.  
  53. endcase
  54.  
  55. /********************************************************/
  56.  
  57. assign TX_Pin_Out = rTX;
  58. assign TX_Done_Sig = isDone;
  59.  
  60. /*********************************************************/
  61.  
  62. endmodule
  1. module tx_module
  2. (
  3. CLK, RSTn,
  4. TX_Data, TX_En_Sig,
  5. TX_Done_Sig, TX_Pin_Out
  6. );
  7.  
  8. input CLK;
  9. input RSTn;
  10. input [:]TX_Data;
  11. input TX_En_Sig;
  12. output TX_Done_Sig;
  13. output TX_Pin_Out;
  14.  
  15. /********************************/
  16.  
  17. wire BPS_CLK;
  18.  
  19. tx_bps_module U1
  20. (
  21. .CLK( CLK ),
  22. .RSTn( RSTn ),
  23. .Count_Sig( TX_En_Sig ), // input - from U2
  24. .BPS_CLK( BPS_CLK ) // output - to U2
  25. );
  26.  
  27. /*********************************/
  28.  
  29. tx_control_module U2
  30. (
  31. .CLK( CLK ),
  32. .RSTn( RSTn ),
  33. .TX_En_Sig( TX_En_Sig ), // input - from top
  34. .TX_Data( TX_Data ), // input - from top
  35. .BPS_CLK( BPS_CLK ), // input - from U2
  36. .TX_Done_Sig( TX_Done_Sig ), // output - to top
  37. .TX_Pin_Out( TX_Pin_Out ) // output - to top
  38. );
  39.  
  40. /***********************************/
  41.  
  42. endmodule

串口接受

  1. module detect_module
  2. (
  3. CLK, RSTn,
  4. RX_Pin_In,
  5. H2L_Sig
  6. );
  7. input CLK;
  8. input RSTn;
  9. input RX_Pin_In;
  10. output H2L_Sig;
  11.  
  12. /******************************/
  13.  
  14. reg H2L_F1;
  15. reg H2L_F2;
  16.  
  17. always @ ( posedge CLK or negedge RSTn )
  18. if( !RSTn )
  19. begin
  20. H2L_F1 <= 'b1;
  21. H2L_F2 <= 'b1;
  22. end
  23. else
  24. begin
  25. H2L_F1 <= RX_Pin_In;
  26. H2L_F2 <= H2L_F1;
  27. end
  28.  
  29. /***************************************/
  30.  
  31. assign H2L_Sig = H2L_F2 & !H2L_F1;
  32.  
  33. /***************************************/
  34.  
  35. endmodule
  1. module rx_control_module
  2. (
  3. CLK, RSTn,
  4. H2L_Sig, RX_Pin_In, BPS_CLK, RX_En_Sig,
  5. Count_Sig, RX_Data, RX_Done_Sig
  6.  
  7. );
  8.  
  9. input CLK;
  10. input RSTn;
  11.  
  12. input H2L_Sig;
  13. input RX_En_Sig;
  14. input RX_Pin_In;
  15. input BPS_CLK;
  16.  
  17. output Count_Sig;
  18. output [:]RX_Data;
  19. output RX_Done_Sig;
  20.  
  21. /********************************************************/
  22.  
  23. reg [:]i;
  24. reg [:]rData;
  25. reg isCount;
  26. reg isDone;
  27.  
  28. always @ ( posedge CLK or negedge RSTn )
  29. if( !RSTn )
  30. begin
  31. i <= 'd0;
  32. rData <= 'd0;
  33. isCount <= 'b0;
  34. isDone <= 'b0;
  35. end
  36. else if( RX_En_Sig )
  37. case ( i )
  38.  
  39. 'd0 :
  40. if( H2L_Sig ) begin i <= i + 'b1; isCount <= 1'b1; end /*进入第0位,同时驱动bps_module开始计数。又以bps_module驱动状态1~11*/
  41.  
  42. 'd1 :
  43. if( BPS_CLK ) begin i <= i + 'b1; end /*第0位中部,BPS_CLK发出第一个脉冲,忽略第0位*/
  44.  
  45. 'd2, 4'd3, 'd4, 4'd5, 'd6, 4'd7, 'd8, 4'd9 :
  46. if( BPS_CLK ) begin i <= i + 'b1; rData[ i - 2 ] <= RX_Pin_In; end
  47.  
  48. 'd10 :
  49. if( BPS_CLK ) begin i <= i + 'b1; end
  50.  
  51. 'd11 :
  52. if( BPS_CLK ) begin i <= i + 'b1; end
  53.  
  54. 'd12 :
  55. begin i <= i + 'b1; isDone <= 1'b1; isCount <= 'b0; end
  56.  
  57. 'd13 :
  58. begin i <= 'd0; isDone <= 1'b0; end
  59.  
  60. endcase
  61.  
  62. /********************************************************/
  63.  
  64. assign Count_Sig = isCount;
  65. assign RX_Data = rData;
  66. assign RX_Done_Sig = isDone;
  67.  
  68. /*********************************************************/
  69.  
  70. endmodule
  1. module rx_bps_module
  2. (
  3. CLK, RSTn,
  4. Count_Sig,
  5. BPS_CLK
  6. );
  7.  
  8. input CLK;
  9. input RSTn;
  10. input Count_Sig;
  11. output BPS_CLK;
  12.  
  13. /***************************/
  14.  
  15. reg [:]Count_BPS;
  16.  
  17. always @ ( posedge CLK or negedge RSTn )
  18. if( !RSTn )
  19. Count_BPS <= 'd0;
  20. else if( Count_BPS == 'd5207 )
  21. Count_BPS <= 'd0;
  22. else if( Count_Sig )
  23. Count_BPS <= Count_BPS + 'b1;
  24. else
  25. Count_BPS <= 'd0;
  26.  
  27. /********************************/
  28.  
  29. assign BPS_CLK = ( Count_BPS == 'd2604 ) ? 1'b1 : 'b0; /*周期中间开始采集数据*/
  30.  
  31. /*********************************/
  32.  
  33. endmodule
  1. module rx_module
  2. (
  3. CLK, RSTn,
  4. RX_Pin_In, RX_En_Sig,
  5. RX_Done_Sig, RX_Data
  6. );
  7.  
  8. input CLK;
  9. input RSTn;
  10.  
  11. input RX_Pin_In;
  12. input RX_En_Sig;
  13.  
  14. output [:]RX_Data;
  15. output RX_Done_Sig;
  16.  
  17. /**********************************/
  18.  
  19. wire H2L_Sig;
  20.  
  21. detect_module U1
  22. (
  23. .CLK( CLK ),
  24. .RSTn( RSTn ),
  25. .RX_Pin_In( RX_Pin_In ), // input - from top
  26. .H2L_Sig( H2L_Sig ) // output - to U3
  27. );
  28.  
  29. /**********************************/
  30.  
  31. wire BPS_CLK;
  32.  
  33. rx_bps_module U2
  34. (
  35. .CLK( CLK ),
  36. .RSTn( RSTn ),
  37. .Count_Sig( Count_Sig ), // input - from U3
  38. .BPS_CLK( BPS_CLK ) // output - to U3
  39. );
  40.  
  41. /**********************************/
  42.  
  43. wire Count_Sig;
  44.  
  45. rx_control_module U3
  46. (
  47. .CLK( CLK ),
  48. .RSTn( RSTn ),
  49.  
  50. .H2L_Sig( H2L_Sig ), // input - from U1
  51. .RX_En_Sig( RX_En_Sig ), // input - from top
  52. .RX_Pin_In( RX_Pin_In ), // input - from top
  53. .BPS_CLK( BPS_CLK ), // input - from U2
  54.  
  55. .Count_Sig( Count_Sig ), // output - to U2
  56. .RX_Data( RX_Data ), // output - to top
  57. .RX_Done_Sig( RX_Done_Sig ) // output - to top
  58.  
  59. );
  60.  
  61. /************************************/
  62.  
  63. endmodule

Verilog之串口(UART)通信的更多相关文章

  1. mini2440裸机试炼之——DMA直接存取 实现Uart(串口)通信

    这个仅仅能作为自己初步了解MDA的开门篇 实现功能: 将字符串数据通过DMA0通道传递给UTXH0,然后在终端 显示.传输数据完后.DMA0产生中断,beep声, LED亮. DMA基本知识 计算机系 ...

  2. [转]UART通信简介

    1.前言 UART通信,即通用异步收发传输器(Universal Asynchronous Receiver/Transmitter). 串行通信是指利用一条传输线将资料一位位地顺序传送.特点是通信线 ...

  3. Arduino与Air800开发板使用UART通信:传输DHT22传感器数据

    硬件介绍 Arduino Leonardo在数字引脚0(RX)和1(TX)进行串口通信时是使用“Serial1”,USB的串口通信使用的是“Serial”.在数字引脚0(RX)和1(TX)与USB是相 ...

  4. 串口UART学习笔记(一)

    买了一个开发板学习FPGA,找到的各种东西就记录在这个博客里了,同时也方便把自己不会的问题找到的结果记录一下,都是自己手打,所以可能说的话不那么严谨,不那么精准,看到的人要带着自己的思考去看,记住尽信 ...

  5. ZigBee学习四 无线+UART通信

    ZigBee学习四 无线+UART通信 1) 协调器编程 修改coordinator.c文件 byte GenericApp_TransID; // This is the unique messag ...

  6. ZigBee学习三 UART通信

    ZigBee学习三 UART通信 在使用串口时,只需掌握ZigBee协议栈提供的串口操作相关的三个函数即可. uint8 HalUARTOpen(uint8 port,halUARTCfg_t *co ...

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

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

  8. 如何在User版本开启串口(Uart),抓取上层Log,开启输入控制台

    [原][FAQ03891] 如何在User版本开启串口(Uart),抓取上层Log,开启输入控制台 2014-11-26阅读1369 评论0 FAQ Content [Description]如何在U ...

  9. 第011课_串口(UART)的使用

    from: 第011课_串口(UART)的使用 第001节_辅线1_硬件知识_UART硬件介绍 1. 串口的硬件介绍 UART的全称是 Universal Asynchronous Receiver ...

随机推荐

  1. python学习-day03:整形、字符串常用方法:

    一.数字,int 1.1: a.int(object)转化数字类型: a=' b=int(a) b=b+1000 print(b) 223 <class 'int'> 答案 b.转化二进制 ...

  2. Android Gradle 多Module单独编译一个Module

    假如项目中有两个Module,app1和app2.假如我只想对app1 module进行build,则可以: gradle :App1:build build命令可以换成任意gradle命令.

  3. codeforces 689 E. Mike and Geometry Problem 组合数学 优先队列

    给定一个函数: f([l,r]) = r - l + 1; f(空集) = 0; 即f函数表示闭区间[l,r]的整点的个数 现在给出n个闭区间,和一个数k 从n个区间里面拿出k个区间,然后对这k个区间 ...

  4. 【php】assert函数的用法

    [php]assert函数的用法 http://www.douban.com/note/217557007/ 2012-06-01 10:32:37   assert这个函数在php语言中是用来判断一 ...

  5. JDK源码包结构分类

    最近查看JDK源码时,无意间发现几个类在陌生包里:com.sun.*.sun.*.org.*,google了一把总结了下以备他人搜索,如内容有误欢迎指正!   Jre库包含的jar文件(jdk1.6) ...

  6. 微信订阅号里实现oauth授权登录,并获取用户信息 (完整篇)

    摘要 这段时间一直有人问我,订阅号实现的oauth授权登录的问题,之前写的比较简单,很多人不明白.众所周知,微信公众号分订阅号.服务号.企业号:每个号的用途不一样,接口开放程度也不一样.微信还有个扯淡 ...

  7. 抽象类和抽象方法(关键字abstract)

     1.抽象类不能被实例化,可以没有,一个或多个抽象方法  2.抽象方法只有方法的声明但没有方法的实现,有抽象方法的类必须声明为抽象类,子类必须重写父类所有的抽象方法才能被实例化,否则子类也是个抽象类, ...

  8. 异步SRAM控制器的Verilog建模

    前言:sram顾名思义静态随机存储器,分为asram异步型和ssram同步型.这里驱动DE2上一块ISSI公司的512KB的asram. 设计思路:因为实际应用中单字节读写效率不高,所以本设计中仿照s ...

  9. JAVA 多线程和并发学习笔记(二)

    一.Java中创建线程方法 1. 继承Thread类创建线程类 定义Thread类的子类,重写该类的run()方法.该方法为线程执行体. 创建Thread子类的实例.即线程对象. 调用线程对象的sta ...

  10. No.015 3Sum

    15. 3Sum Total Accepted: 131800 Total Submissions: 675028 Difficulty: Medium Given an array S of n i ...