NEXYS 3开发板练手--USB UART(二)
上一篇文章中提到实际上我们操作的只是一个“伪”USB协议,我们真正需要完成的收发机遵循的协议应该是异步串行通信协议。这个协议对于大家来说应该是再熟悉不过了,在这里我就不多废话了。需要说明的是,我在这个DEMO里采用的数据帧格式是:8bits数据位,1bits停止位,无奇偶校验,波特率为9600。
首先我们要实现一个单纯的发送机,要求它能接收输入口上的7位ASCII编码,然后将它不停的发送出去。它可以由下面这个状态机完成:
状态1----空闲状态,等待并复位,当发送标志置位时转到状态2;
状态2----准备,并转到状态3;
状态3----一帧数据导入,将输入口的数据读入,并前后加上起始位和停止位,转入状态4;
状态4----数据发送,将一帧10bits的数据按9600波特率串行发送出去,当完成10bits数据发送后,回到状态1。
按照这个状态机,我设计出下面这个模块:
- `timescale 1ns / 1ps
- //////////////////////////////////////////////////////////////////////////////////
- // Company:
- // Engineer:
- //
- // Create Date: 23:24:03 11/11/2013
- // Design Name:
- // Module Name: USB_UART
- // Project Name:
- // Target Devices:
- // Tool versions:
- // Description:
- //
- // Dependencies:
- //
- // Revision:
- // Revision 0.01 - File Created
- // Additional Comments:
- //
- //////////////////////////////////////////////////////////////////////////////////
- module USB_UART(
- clk,
- data,
- send,
- tx,
- busy,
- led
- );
- input clk,send;
- input [:] data;
- output reg tx,busy;
- output [:] led;
- assign led = data;
- //状态机状态定义
- parameter Idel = 'b00,//空闲状态
- Rdy = 'b01,//数据准备完成
- LoadByte = 'b10,//数据传入
- SendBit = 'b11;//数据发送
- reg [:] BspClkReg;//波特率分频计数
- reg BspClk;//波特率时钟
- reg [:] tx_data;//发送的数据,加上起始位和停止位
- reg [:] tx_byte_count;//发送位数计数
- reg [:] state;//,next_state;//状态寄存器
- //波特率分频模块,100M/10416
- always@(posedge clk)
- begin
- BspClkReg <= BspClkReg + ;
- if(BspClkReg == )
- begin
- BspClkReg <= ;
- BspClk <= ~BspClk;
- end
- end
- always@(posedge BspClk)
- begin
- case(state)
- Idel : begin
- tx <= ;
- busy <= ;
- tx_byte_count <= ;
- if(~send) state <= Rdy;
- end
- Rdy : begin
- tx_byte_count <= ;
- tx <= ;
- busy <= ;
- state <= LoadByte;
- end
- LoadByte : begin
- tx_data <= {'b1,data,1'b0};
- tx <= ;
- busy <= ;
- state <= SendBit;
- end
- SendBit : begin
- tx <= tx_data[];
- busy <= ;
- tx_data <= tx_data >> ;
- tx_byte_count <= tx_byte_count + ;
- if(tx_byte_count == )
- state <= Idel;
- else
- state <= SendBit;
- end
- endcase
- end
- endmodule
然后我将输入数据口接到板子上的8个拨码开关上,即当要发送字符“A”的时候,拨码开关拨为01000001(65),这个时候电脑上的超级终端能接收到板子上连续发来的字符“A”(注意要设置好超级终端上的数据格式和波特率,端口应该为自己电脑上虚拟出来的那个端口号,也可以用串口调试助手接收):
如果只是想简单的了解USB UART的工作原理,我们的工作到这就可以结束了。但是如果从实际应用的角度出发,我们这个DEMO是失败的,因为在实际应用中,我们不可能每发送一个字符就手动设置一次,也不可能让一个字符如此无止尽的发送下去,我们需要的是一个可控的发送机,就像Digilent官网上的DEMO,可以可控的发送特定的字符串。对于这个问题,我将在下一篇文章中继续完成。
NEXYS 3开发板练手--USB UART(二)的更多相关文章
- NEXYS 3开发板练手--USB UART(三)
接着上一篇,今天我们来建立一个能用于实际工程中的DEMO. 首先,为了使我们的发送机不像上一个DEMO一样无节制的循环发送,我们需要修改代码,增加使发送机停止发送的控制部分,修改后的代码如下: `ti ...
- NEXYS 3开发板练手--USB UART(一)
接上一篇文章,今天来讲讲这个USB UART串口发送机. 我们知道,当我们的微处理器(单片机.FPGA.DSP等)要和电脑进行通信的时候一般会采用串行通信方式,而最常用的串行通信协议的物理层接口是RS ...
- NEXYS 3开发板练手--LED与数码管时钟
做科研的时候从学校拿到一块基于Xilinx公司Spartan-6主芯片的FPGA开发板,因为之前一直在用Altera公司的FPGA,一开始接触它还真有点不太习惯.但毕竟核心的东西还是不会变的,于是按照 ...
- 基于uFUN开发板的心率计(二)动态阈值算法获取心率值
前言 上一篇文章:基于uFUN开发板的心率计(一)DMA方式获取传感器数据,介绍了如何获取PulseSensor心率传感器的电压值,并对硬件电路进行了计算分析.心率计,重要的是要获取到心率值,本篇文章 ...
- 练手WPF(二)——2048游戏的简易实现(上)
1.创建游戏界面编辑MainWindow.xaml,修改代码如下: <Window.Resources> <Style TargetType="Label"> ...
- canvas练手项目(二)——各种操作基础
想想应该在canvas上面作画了,那么就不得不提到事件了. (打着canvas的旗号,写着mouse事件.挂羊头卖狗肉!哈哈哈哈哈~) 先来看一看HTML事件属性,我们要用的就是Mouse事件,就先研 ...
- 练手WPF(二)——2048游戏的简易实现(下)
接着上一篇继续~~~ 6.动画显示增加分数 /// <summary> /// 动画显示增加得分 /// </summary> /// <param name=" ...
- 基于STM32L476开发板的USB音频设备
现代音频设备中有很多知识产权. 我想研究创建一个与手机交互的算法设备(运行non-trivial算法的嵌入式设备). 我发现创建一个Lightning设备比创建一个连接到Android手机的的USB设 ...
- CC2540开发板学习笔记(五)——串口通信
(一)串口发送 一.实验现象: 开发板实现功能发送 二.实验过程 1.PL2303 USB转串口电路图 2.串口发送 (1)查看用户手册有: UART0 对应的外部设备 IO 引脚关系为: P0_2 ...
随机推荐
- Java 类型, Hibernate 映射类型及 SQL 类型之间的相应关系
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- python——实例方法、静态方法、类方法、类变量和实例变量浅析
概述: 实例方法就是类的实例能够使用的方法. 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使用装饰器@staticmethod定义静态方法.类对象和实例都可调用静态 ...
- taro alias 的使用
用来配置目录别名,从而方便书写代码引用路径.例如,使用相对路径书写文件引用如下: import A from '../../componnets/A' import Utils from '../.. ...
- osx下查看jar文件
jar是java class的打包文件,我们能够将自己的项目打包为jar文件执行,也能够打包后当做第三方包查看,有时候我们须要查看一下一个jar文件里是否还有某个类以及对应的包,我们能够採用下面两种方 ...
- JAR,WAR,EAR区别
JAR WAR EAR 英文 Java Archive file Web Archive file Enterprise Archive file 包含内容 class.properties文件,是文 ...
- OpenERP Client Error
SyntaxError: JSON.parse: unexpected end of data http/mydomain:8069/web/webclient/js:23114 Solutions: ...
- google kaptcha 验证码组件使用简介
kaptcha 是一个非常实用的验证码生成工具.有了它,你可以生成各种样式的验证码,因为它是可配置的.kaptcha工作的原理是调用 com.google.code.kaptcha.servlet.K ...
- webservice系统学习笔记2-使用jdk的命令生成本地代码
使用jdk自带的命令wsimport生成远程服务的本地代码 C:\Documents and Settings\Administrator>wsimport -d E:\mhWorkspace\ ...
- iOS-按钮单选与多选逻辑处理
概述 循环创建按钮, 进行按钮单选或者多选的操作. 详细 代码下载:http://www.demodashi.com/demo/10712.html 我们经常会有多行多列按钮的页面, 这个时候我们通常 ...
- iOS-高仿支付宝手势解锁(九宫格)
概述 高仿支付宝手势解锁, 通过手势枚举去实现手势密码相对应操作. 详细 代码下载:http://www.demodashi.com/demo/10706.html 基上篇[TouchID 指纹解锁] ...