NEXYS 3开发板练手--USB UART(二)
2014-01-07 19:58
169 查看
上一篇文章中提到实际上我们操作的只是一个“伪”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 [7:0] data; output reg tx,busy; output [7:0] led; assign led = data; //状态机状态定义 parameter Idel = 2'b00,//空闲状态 Rdy = 2'b01,//数据准备完成 LoadByte = 2'b10,//数据传入 SendBit = 2'b11;//数据发送 reg [13:0] BspClkReg;//波特率分频计数 reg BspClk;//波特率时钟 reg [9:0] tx_data;//发送的数据,加上起始位和停止位 reg [3:0] tx_byte_count;//发送位数计数 reg [1:0] state;//,next_state;//状态寄存器 //波特率分频模块,100M/10416 always@(posedge clk) begin BspClkReg <= BspClkReg + 1; if(BspClkReg == 5208) begin BspClkReg <= 0; BspClk <= ~BspClk; end end always@(posedge BspClk) begin case(state) Idel : begin tx <= 1; busy <= 0; tx_byte_count <= 0; if(~send) state <= Rdy; end Rdy : begin tx_byte_count <= 0; tx <= 1; busy <= 1; state <= LoadByte; end LoadByte : begin tx_data <= {1'b1,data,1'b0}; tx <= 1; busy <= 1; state <= SendBit; end SendBit : begin tx <= tx_data[0]; busy <= 1; tx_data <= tx_data >> 1; tx_byte_count <= tx_byte_count + 1; if(tx_byte_count == 9) state <= Idel; else state <= SendBit; end endcase end endmoduleView Code
然后我将输入数据口接到板子上的8个拨码开关上,即当要发送字符“A”的时候,拨码开关拨为01000001(65),这个时候电脑上的超级终端能接收到板子上连续发来的字符“A”(注意要设置好超级终端上的数据格式和波特率,端口应该为自己电脑上虚拟出来的那个端口号,也可以用串口调试助手接收):
如果只是想简单的了解USB UART的工作原理,我们的工作到这就可以结束了。但是如果从实际应用的角度出发,我们这个DEMO是失败的,因为在实际应用中,我们不可能每发送一个字符就手动设置一次,也不可能让一个字符如此无止尽的发送下去,我们需要的是一个可控的发送机,就像Digilent官网上的DEMO,可以可控的发送特定的字符串。对于这个问题,我将在下一篇文章中继续完成。
相关文章推荐
- NEXYS 3开发板练手--USB UART(三)
- NEXYS 3开发板练手--USB UART(一)
- nexys3练手——USB—UART初探秘
- NEXYS 3开发板练手--LED与数码管时钟
- [usb/uart]内核添加USB转串口驱动支持
- [教程]PX2开发板上的串口UART3使用入门
- linux 开发板(Linux USB Gadget) 模拟u盘
- 降龙十八掌搞定rt3070 USB WIFI模块在android2.3平台上上网[基于x210开发板]
- K7i ARM开发板源码之UART通信(中断方式)
- FT232RL为接口转换芯片,可以实现USB到串行UART接口的转换
- STM32开发板入门教程 - 串口通讯 UART
- ARM 开发板insmod安装内核模块时,Unknown symbol usb_register_driver (err 0)
- 【连载】【FPGA黑金开发板】NIOSII那些事儿--USB设备模式(十九)
- Arduino与Air800开发板使用UART通信:传输DHT22传感器数据
- linux-2.6.32在mini2440开发板上移植(11)之配置USB外设
- 关于Windows8.1下TQ210开发板USB下载驱动安装问题的解决办法
- 降龙十八掌搞定rt3070 USB WIFI模块在android2.3平台上上网[基于x210开发板]
- 将ARM4412开发板配置成USB网卡,并且使用USB通过Ubuntu上网
- 飞凌6410开发板通过USB Reader读卡器读取IC卡ID(Linux源代码)
- GPIO、UART、USB、IrDA、I2C、SPI、CAN总线、蓝牙接口、以太网