上一篇文章中提到实际上我们操作的只是一个“伪”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(二)的更多相关文章

  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. C# Lambda表达式 基础

    什么是Lambda 表达式? "Lambda表达式"实际上是一个方法,只不过该方法是一个匿名方法(就是没有名字的方法(函数),就是说只有在定义的时候能调用,在其他地方就不能调用了) ...

  2. 查找树ADT——二叉查找树

    二叉查找树:对于树中的每个节点X,它的左子数种所有关键字值小于X的关键字,而它的右子树种所有关键字值大于X的关键字值. /* 二叉查找树声明 */ #ifndef _TREE_H struct Tre ...

  3. 笔试题之xml

    XML部分 1.xml有哪些解析技术?区别是什么? 答:有DOM,SAX,STAX等 DOM:处理大型文件时其性能下降的非常厉害.这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM ...

  4. ubuntu 下安装摄像头驱动

    sudo apt-get install cheese sudo apt-get install camorama 然后可以打开应用cheese,观察可以得到图像. 也可以通过代码获取图像.pytho ...

  5. Divisibility by Eight

    把当前数删除几位然后能够整除与8 那么可得知大于3位数的推断能否整除于八的条件是(n%1000)%8==0 能够得出我们的结论:仅仅须要枚举后三位后两位后一位就可以知道是否可整除于8 #include ...

  6. python之函数用法round()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法round() #http://www.cnblogs.com/hongfei/p/3 ...

  7. 为什么需要设置pythonpath环境变量?

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #为什么需要设置pythonpath环境变量? #只需设置pythonpath,从而可以从正在用的目录(也就是 ...

  8. eval、exec、execfile

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #http://blog.csdn.net/azhao_dn/article/details/6921654 ...

  9. vsftp限制FTP用户只能访问自己的目录

    修改配置文件/etc/vsftpd/vsftpd.conf chroot_local_user=YESallow_writeable_chroot=YESchroot_list_enable=YESc ...

  10. 升级openssh基于openssl

    OpenSSH is the premier connectivity tool for remote login with the SSH protocol. It encrypts all tra ...