实验十二:串口模块① — 发送

串口固然是典型的实验,想必许多同学已经作烂,不过笔者还要循例介绍一下。我们知道串口有发送与接收之分,实验十二的实验目的就是实现串口发送,然而不同的是 ... 笔者会用另一种思路去实现串口发送。

图12.1 PS/2发送时序与串口发送时序。

如图12.1所示,串口发送时序相较PS/2发送时序,串口发送时序就像断了翅膀的小鸟般,没有时钟信号控制整个传输协议。除此之外,串口发送时序与PS/2发送时序近似的地方也非常惊人 ... 默认下,一帧PS/2数据有11位,对此一帧串口数据也有11位,其中位分配如表12.1所示:

表12.1 一帧串口数据的位分配。

位分配

位定义

[0]

起始位

[8:1]

数据位

[9]

校验位

[10]

停止位

如表12.1所示,[0]为拉低的起始位,[8:1]为任意填充的数据位,[9]为任意填充的校验位,[10]为拉高的停止位。

图12.2 FPGA发送一帧串口数据(无视波特率)。

假设我们无视波特率,并且利用FPGA发送一帧串口数据的话 ... 如图12.2所示,一帧有11位的串口数据,一共使用了11个上升沿发送出去,为此Verilog则可以这样表示,结果如代码12.1所示:

      reg [10:0]D1;
     always @(posedge CLOCK)
         case(i)
            0,1,2,3,4,5,6,7,8,9,10:      
            begin TXD <= D1[i]; i <= i + 1'b1; end
            ......
         endcase

代码12.1

如代码12.1所示,寄存器D为11位宽的寄存器,并且驱动TXD输出口,期间步骤0~11公按照i的位寻址,将D1的内容逐个发送出去。

虽然串口传输协议极为类似PS/2传输协议,但是串口传输协议也有区别的地方。其一串口传输协议有波特率的概念,而且串口协议有各种各样的波特率,常用的波特率有9600 bps或者115200 bps,波特率最低为 110 bps,最高为 256000 bps(目前暂定)。所谓波特率就是一秒内,串口可以发送多少位数据,此外波特率也是一位数据的周期,或者说是一位数据的保持时间,就拿115200 bps为例:

1/115200 = 8.68E-6

115200波特率的一位数据周期为 8.68us,如果用50Mhz 的时钟频率去量化的话:

( 1/115200 ) / (1/50E+6) = 8.68E-6 / 20E-9

= 434

图12.3 FPGA发送一帧串口数据(考虑波特率)。

如果图12.3考虑115200的波特率,结果如图12.3所示,每一位数据都保持434个时钟

,为此Verilog可以这样表示,如代码12.2所示:

      reg [10:0]D1;
      reg [8:0]C1;
     always @(posedge CLOCK)
         case(i)
            0,1,2,3,4,5,6,7,8,9,10:    
             if( C1 == 9’d434 -1 ) begin C1 <= 9’d0; i <= i + 1’b1; end  
            else begin TXD <= D1[i]; C1 <= C1 + 1'b1; end
            ......
         endcase

代码12.1

如代码12.1所示,步骤0~10不再保持一个时钟,换之每个步骤都保持434个时钟,因此每位TXD的发送数据也保持 8.68us。

除此此外,串口传输协议不仅可以自定义波特率,串口传输协议也可以自定义一帧数据的位宽,自定义内容如表12.2所示:

表12.2 自定义一帧数据。

自定义数据位

自定义内容

数据位

5~9

校验位

有/无

停止位

1~2

如表12.2所示,可以自定义的数据其中便包含数据位,默认下为1字节,自定义内容则是5~9位,校验位也可以设置为有或者无(默认下是有),停止位也可以增至2位(默认下是1位)。不管怎么样,表12.2是比较官方的自定义内容 ... 只要读者欢喜,任何畸形的自定义内容也有可能实现。

理解完毕以后,我们便可以开始建模了。

图12.4 实验十二的建模图。

图12.4是实验十二的建模图,不过内容较为寒酸 ... 组合模块 tx_demo 内容包括一段核心操作,还有一只TX功能模块。核心操作负责TX功能模块的调用,亦即控制沟通信号还有Data的输入。TX功能模块被使能以后,便将iData经由TXD输出端发送出去

,完后便反馈完成信号以示一次性的操作已经完毕。

tx_funcmod.v

图12.5 TX功能模块的建模图。

如图12.5所示,该模块的左方有问答信号,还有8位的iData,至于右方则是 TXD 顶层信号。此外,一帧数据的波特率为 115200 bps。

1.    module tx_funcmod
2.    (
3.         input CLOCK, RESET,
4.         output TXD,
5.         input iCall,
6.         output oDone,
7.         input [7:0]iData
8.    );
9.         parameter B115K2 = 9'd434; // formula : ( 1/115200 )/( 1/50E+6 )     

以上内容为相关的出入端声明,第9行则是波特率为115200的常量声明。

11.         reg [3:0]i;
12.         reg [8:0]C1;
13.         reg [10:0]D1;
14.         reg rTXD;
15.         reg isDone;
16.         
17.         always @( posedge CLOCK or negedge RESET )
18.             if( !RESET )
19.                  begin
20.                         i <= 4'd0;
21.                         C1 <= 9'd0;
22.                         D1 <= 11'd0;
23.                         rTXD <= 1'b1; 
24.                         isDone <= 1'b0;
25.                  end

以上内容为相关的寄存器声明以及复位操作。

26.              else if( iCall )
27.                  case( i )
28.                    
29.                         0:
30.                         begin D1 <= { 2'b11 , iData , 1'b0 }; i <= i + 1'b1; end
31.                         
32.                         1,2,3,4,5,6,7,8,9,10,11:      
33.                         if( C1 == B115K2 -1 ) begin C1 <= 8'd0; i <= i + 1'b1; end
34.                         else begin rTXD <= D1[i - 1]; C1 <= C1 + 1'b1; end
35.    
36.                         12:
37.                         begin isDone <= 1'b1; i <= i + 1'b1; end
38.                         
39.                         13:
40.                         begin isDone <= 1'b0; i <= 4'd0; end
41.                    
42.                    endcase
43.                        

以上内容为部分核心操作。第26行的if( iCall ) 表示该模块不使能就不工作。步骤0用来准备发送数据,其中 2’b11 是停止位与校验位(随便填),1’b0则是起始位。步骤1~11用来发送一帧数据。步骤12~13用来反馈完成信号并返回步骤。

44.        assign TXD = rTXD;
45.        assign oDone = isDone;           
46.    
47.    endmodule

以上内容为驱动输出的声明。

tx_demo.v

连线部署直接看代码比较具体一点。

1.    module tx_demo
2.    (
3.         input CLOCK, RESET,
4.         output TXD
5.    );
6.        wire DoneU1;

以上内容是相关的出入端声明。

8.        tx_funcmod U1
9.         (
10.              .CLOCK( CLOCK ),
11.              .RESET( RESET ),
12.              .TXD( TXD ),
13.              .iCall( isTX ),
14.              .oDone( DoneU1 ),
15.             .iData( D1 )
16.         );

以上内容是TX功能模块的实例化,其中isCall由isTX驱动,iData由D驱动。

18.         reg [3:0]i;
19.         reg [7:0]D1;
20.         reg isTX;
21.         
22.         always @ ( posedge CLOCK or negedge RESET )
23.             if( !RESET )
24.                  begin
25.                         i <= 4'd0;
26.                         D1 <= 8'd0;
27.                         isTX <= 1'b0;
28.                    end

以上内容是相关的寄存器声明,第23~28行则是这些寄存器的复位操作。

29.              else
30.                  case( i )
31.                    
32.                        0:
33.                         if( DoneU1 ) begin isTX <= 1'b0; i <= i + 1'b1; end
34.                         else begin isTX <= 1'b1; D1 <= 8'hA1; end
35.                         
36.                         1:
37.                         if( DoneU1 ) begin isTX <= 1'b0; i <= i + 1'b1; end
38.                         else begin isTX <= 1'b1; D1 <= 8'hA2; end
39.                         
40.                         2:
41.                         if( DoneU1 ) begin isTX <= 1'b0; i <= i + 1'b1; end
42.                         else begin isTX <= 1'b1; D1 <= 8'hA3; end
43.                         
44.                         3: // Stop
45.                         i <= i;
46.                    
47.                    endcase
48.    
49.    endmodule

以上内容是核心操作的内容,步骤0发送数据 8’hA1,步骤1发送数据8’hA2,步骤2发送数据 8’hA3。

编译完毕便下载程序,并且将串口线连接至电脑与开发板。打开串口调试助手,波特率设为115200,数据位为8,校验位随便,停止位为1位 ... 事后,显示方式设置为HEX(十六进制)。当程序下载完毕以后,串口调试助手便会出现 A1,A2与A3。

细节一: 完整的个体模块

实验十二的TX功能模块已经是完整的个体,可以直接拿来调用。

转载于:https://www.cnblogs.com/alinx/p/3985960.html

【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十二:串口模块① — 发送相关推荐

  1. [黑金原创教程] FPGA那些事儿《数学篇》- CORDIC 算法

    简介 一本为完善<设计篇>的书,教你CORDIC算法以及定点数等,内容请看目录. 贴士 这本教程难度略高,请先用<时序篇>垫底. 目录 Experiment 01:认识CORD ...

  2. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十七:TFT模块 - 显示

    实验二十七:TFT模块 - 显示 所谓TFT(Thin Film Transistor)就是众多LCD当中,其中一种支持颜色的LCD,相较古老的点阵LCD(12864笑),它可谓高级了.黑金的TFT ...

  3. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写...

    实验十八:SDRAM模块① - 单字读写 笔者与SDRAM有段不短的孽缘,它作为冤魂日夜不断纠缠笔者.笔者尝试过许多方法将其退散,不过屡试屡败的笔者,最终心情像橘子一样橙.<整合篇>之际, ...

  4. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十九:LCD模块

    实验二十九:LCD模块 据说Alinx 301支持 7"TFT,好奇的朋友一定疑惑道,它们3.2"TFT以及7"TFT等两者之间究竟有何区别呢?答案很简单,前者自带控制器 ...

  5. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十:SDRAM模块③ — 页读写 α...

    实验二十:SDRAM模块③ - 页读写 α 完成单字读写与多字读写以后,接下来我们要实验页读写.丑话当前,实验二十的页读写只是实验性质的东西,其中不存在任何实用价值,笔者希望读者可以把它当成页读写的热 ...

  6. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】【实验一】流水灯模块

    实验一:流水灯模块 对于发展商而言,动土仪式无疑是最重要的任务.为此,流水灯实验作为低级建模II的动土仪式再适合不过了.废话少说,我们还是开始实验吧. 图1.1 实验一建模图. 如图1.1 所示,实验 ...

  7. 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验二十五:SDHC模块

    实验二十五:SDHC模块 笔者曾经说过,SD卡发展至今已经衍生许多版本,实验二十四就是针对版本SDV1.×的SD卡.实验二十四也说过,CMD24还有CMD17会故意偏移地址29,让原本范围指向从原本的 ...

  8. 【Linux开发】linux设备驱动归纳总结(十二):简单的数码相框

    linux设备驱动归纳总结(十二):简单的数码相框 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

  9. 【黑金原创教程】【Modelsim】【第四章】激励文本就是仿真环境

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

最新文章

  1. HDU-2732 Leapin' Lizards 最大流
  2. 下了Bandit,看了一个礼拜
  3. 【PAT乙级】1053 住房空置率 (20 分)
  4. 联通突然从4g变成3g了_中国联通最快明年底2G全面退网 并推进3G逐步退网
  5. android intent action 介绍大全
  6. 学习开发语言 python 资料
  7. 一个立即关闭显示器的小软件(Masm开发,只有3KB大小)
  8. mysql查一个表3到5行的数据类型_MySQL入门(三) 数据库表的查询操作【重要】
  9. 针对unicode对象---检测字符串是否只由数字组成
  10. 疑犯追踪第一季/全集Person Of Interest迅雷下载
  11. 单端测序与双末端测序问题
  12. 圆周率在java中的标识符_java 圆周率。
  13. 使用Python合并Excel文件
  14. 解决软件安装的2203报错
  15. 许鞍华新片《七里地》催泪 网友:看完想回家过年
  16. 三星4418核心板 世界上最小的A9核心模块 性能强大
  17. 华为鸿蒙应用名称,国产自主系统名字定了 华为鸿蒙商标已注册公告
  18. 中国宠物用品品牌“Touchdog它它”完成数千万元Pre-A 轮融资...
  19. xshell 与 putty
  20. 微信小程序入门到实战(一)

热门文章

  1. python itchat 无法登录_利用python实现在微信群刷屏的方法
  2. 电脑无线网络显示红叉_不能播放视频怎么办?小编教你电脑不能播放视频如何解决...
  3. python wxpy_wxpy
  4. ubuntu18 python_ubuntu18.0.4 python 开发环境
  5. keil git 编译文件_keil下的STM32程序开发部署(一)
  6. 6.没有Release文件。N:无法安全地用该源进行更新,所以默认禁用该源解决
  7. linux中python如何调用matlab的数据_?如何在Python中加入多个数据帧?
  8. Linux如何实现断点续传文件功能?
  9. conda环境里安装pydot
  10. php生成sitemap