上一篇文章中提到实际上我们操作的只是一个“伪”USB协议,我们真正需要完成的收发机遵循的协议应该是异步串行通信协议。这个协议对于大家来说应该是再熟悉不过了,在这里我就不多废话了。需要说明的是,我在这个DEMO里采用的数据帧格式是:8bits数据位,1bits停止位,无奇偶校验,波特率为9600。

  首先我们要实现一个单纯的发送机,要求它能接收输入口上的7位ASCII编码,然后将它不停的发送出去。它可以由下面这个状态机完成:

  状态1----空闲状态,等待并复位,当发送标志置位时转到状态2;

  状态2----准备,并转到状态3;

  状态3----一帧数据导入,将输入口的数据读入,并前后加上起始位和停止位,转入状态4;

  状态4----数据发送,将一帧10bits的数据按9600波特率串行发送出去,当完成10bits数据发送后,回到状态1。

  按照这个状态机,我设计出下面这个模块:

  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 23:24:03 11/11/2013
  7. // Design Name:
  8. // Module Name: USB_UART
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module USB_UART(
  22. clk,
  23. data,
  24. send,
  25. tx,
  26. busy,
  27. led
  28. );
  29.  
  30. input clk,send;
  31. input [:] data;
  32. output reg tx,busy;
  33. output [:] led;
  34.  
  35. assign led = data;
  36. //状态机状态定义
  37. parameter Idel = 'b00,//空闲状态
  38. Rdy = 'b01,//数据准备完成
  39. LoadByte = 'b10,//数据传入
  40. SendBit = 'b11;//数据发送
  41.  
  42. reg [:] BspClkReg;//波特率分频计数
  43. reg BspClk;//波特率时钟
  44.  
  45. reg [:] tx_data;//发送的数据,加上起始位和停止位
  46. reg [:] tx_byte_count;//发送位数计数
  47.  
  48. reg [:] state;//,next_state;//状态寄存器
  49.  
  50. //波特率分频模块,100M/10416
  51. always@(posedge clk)
  52. begin
  53. BspClkReg <= BspClkReg + ;
  54. if(BspClkReg == )
  55. begin
  56. BspClkReg <= ;
  57. BspClk <= ~BspClk;
  58. end
  59. end
  60.  
  61. always@(posedge BspClk)
  62. begin
  63. case(state)
  64. Idel : begin
  65. tx <= ;
  66. busy <= ;
  67. tx_byte_count <= ;
  68. if(~send) state <= Rdy;
  69. end
  70. Rdy : begin
  71. tx_byte_count <= ;
  72. tx <= ;
  73. busy <= ;
  74. state <= LoadByte;
  75. end
  76. LoadByte : begin
  77. tx_data <= {'b1,data,1'b0};
  78. tx <= ;
  79. busy <= ;
  80. state <= SendBit;
  81. end
  82. SendBit : begin
  83. tx <= tx_data[];
  84. busy <= ;
  85. tx_data <= tx_data >> ;
  86. tx_byte_count <= tx_byte_count + ;
  87. if(tx_byte_count == )
  88. state <= Idel;
  89. else
  90. state <= SendBit;
  91. end
  92. endcase
  93. end
  94.  
  95. endmodule

  然后我将输入数据口接到板子上的8个拨码开关上,即当要发送字符“A”的时候,拨码开关拨为01000001(65),这个时候电脑上的超级终端能接收到板子上连续发来的字符“A”(注意要设置好超级终端上的数据格式和波特率,端口应该为自己电脑上虚拟出来的那个端口号,也可以用串口调试助手接收):

                

  如果只是想简单的了解USB UART的工作原理,我们的工作到这就可以结束了。但是如果从实际应用的角度出发,我们这个DEMO是失败的,因为在实际应用中,我们不可能每发送一个字符就手动设置一次,也不可能让一个字符如此无止尽的发送下去,我们需要的是一个可控的发送机,就像Digilent官网上的DEMO,可以可控的发送特定的字符串。对于这个问题,我将在下一篇文章中继续完成。

NEXYS 3开发板练手--USB UART(二)的更多相关文章

  1. NEXYS 3开发板练手--USB UART(三)

    接着上一篇,今天我们来建立一个能用于实际工程中的DEMO. 首先,为了使我们的发送机不像上一个DEMO一样无节制的循环发送,我们需要修改代码,增加使发送机停止发送的控制部分,修改后的代码如下: `ti ...

  2. NEXYS 3开发板练手--USB UART(一)

    接上一篇文章,今天来讲讲这个USB UART串口发送机. 我们知道,当我们的微处理器(单片机.FPGA.DSP等)要和电脑进行通信的时候一般会采用串行通信方式,而最常用的串行通信协议的物理层接口是RS ...

  3. NEXYS 3开发板练手--LED与数码管时钟

    做科研的时候从学校拿到一块基于Xilinx公司Spartan-6主芯片的FPGA开发板,因为之前一直在用Altera公司的FPGA,一开始接触它还真有点不太习惯.但毕竟核心的东西还是不会变的,于是按照 ...

  4. 基于uFUN开发板的心率计(二)动态阈值算法获取心率值

    前言 上一篇文章:基于uFUN开发板的心率计(一)DMA方式获取传感器数据,介绍了如何获取PulseSensor心率传感器的电压值,并对硬件电路进行了计算分析.心率计,重要的是要获取到心率值,本篇文章 ...

  5. 练手WPF(二)——2048游戏的简易实现(上)

    1.创建游戏界面编辑MainWindow.xaml,修改代码如下: <Window.Resources> <Style TargetType="Label"> ...

  6. canvas练手项目(二)——各种操作基础

    想想应该在canvas上面作画了,那么就不得不提到事件了. (打着canvas的旗号,写着mouse事件.挂羊头卖狗肉!哈哈哈哈哈~) 先来看一看HTML事件属性,我们要用的就是Mouse事件,就先研 ...

  7. 练手WPF(二)——2048游戏的简易实现(下)

    接着上一篇继续~~~ 6.动画显示增加分数 /// <summary> /// 动画显示增加得分 /// </summary> /// <param name=" ...

  8. 基于STM32L476开发板的USB音频设备

    现代音频设备中有很多知识产权. 我想研究创建一个与手机交互的算法设备(运行non-trivial算法的嵌入式设备). 我发现创建一个Lightning设备比创建一个连接到Android手机的的USB设 ...

  9. CC2540开发板学习笔记(五)——串口通信

    (一)串口发送 一.实验现象: 开发板实现功能发送 二.实验过程 1.PL2303 USB转串口电路图 2.串口发送 (1)查看用户手册有: UART0 对应的外部设备 IO 引脚关系为: P0_2 ...

随机推荐

  1. Java 类型, Hibernate 映射类型及 SQL 类型之间的相应关系

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  2. python——实例方法、静态方法、类方法、类变量和实例变量浅析

    概述: 实例方法就是类的实例能够使用的方法. 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使用装饰器@staticmethod定义静态方法.类对象和实例都可调用静态 ...

  3. taro alias 的使用

    用来配置目录别名,从而方便书写代码引用路径.例如,使用相对路径书写文件引用如下: import A from '../../componnets/A' import Utils from '../.. ...

  4. osx下查看jar文件

    jar是java class的打包文件,我们能够将自己的项目打包为jar文件执行,也能够打包后当做第三方包查看,有时候我们须要查看一下一个jar文件里是否还有某个类以及对应的包,我们能够採用下面两种方 ...

  5. JAR,WAR,EAR区别

    JAR WAR EAR 英文 Java Archive file Web Archive file Enterprise Archive file 包含内容 class.properties文件,是文 ...

  6. OpenERP Client Error

    SyntaxError: JSON.parse: unexpected end of data http/mydomain:8069/web/webclient/js:23114 Solutions: ...

  7. google kaptcha 验证码组件使用简介

    kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.K ...

  8. webservice系统学习笔记2-使用jdk的命令生成本地代码

    使用jdk自带的命令wsimport生成远程服务的本地代码 C:\Documents and Settings\Administrator>wsimport -d E:\mhWorkspace\ ...

  9. iOS-按钮单选与多选逻辑处理

    概述 循环创建按钮, 进行按钮单选或者多选的操作. 详细 代码下载:http://www.demodashi.com/demo/10712.html 我们经常会有多行多列按钮的页面, 这个时候我们通常 ...

  10. iOS-高仿支付宝手势解锁(九宫格)

    概述 高仿支付宝手势解锁, 通过手势枚举去实现手势密码相对应操作. 详细 代码下载:http://www.demodashi.com/demo/10706.html 基上篇[TouchID 指纹解锁] ...