zoukankan      html  css  js  c++  java
  • NEXYS 3开发板练手--USB UART(二)

      上一篇文章中提到实际上我们操作的只是一个“伪”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 [7:0] data;
    32 output reg tx,busy;
    33 output [7:0] led;
    34 
    35 assign led = data;
    36 //状态机状态定义
    37 parameter Idel = 2'b00,//空闲状态
    38              Rdy = 2'b01,//数据准备完成
    39              LoadByte = 2'b10,//数据传入
    40              SendBit = 2'b11;//数据发送
    41 
    42 reg [13:0] BspClkReg;//波特率分频计数
    43 reg BspClk;//波特率时钟
    44 
    45 reg [9:0] tx_data;//发送的数据,加上起始位和停止位
    46 reg [3:0] tx_byte_count;//发送位数计数
    47 
    48 reg [1:0] state;//,next_state;//状态寄存器
    49 
    50 //波特率分频模块,100M/10416
    51 always@(posedge clk)
    52 begin
    53     BspClkReg <= BspClkReg + 1;
    54     if(BspClkReg == 5208)
    55     begin
    56         BspClkReg <= 0;
    57         BspClk <= ~BspClk;
    58     end
    59 end
    60 
    61 always@(posedge BspClk)
    62 begin
    63     case(state)
    64         Idel         : begin
    65                         tx <= 1;
    66                         busy <= 0;
    67                         tx_byte_count <= 0;
    68                         if(~send) state <= Rdy;
    69                         end
    70         Rdy          : begin
    71                         tx_byte_count <= 0;
    72                         tx <= 1;
    73                         busy <= 1;
    74                         state <= LoadByte; 
    75                         end
    76         LoadByte    : begin
    77                         tx_data <= {1'b1,data,1'b0};
    78                         tx <= 1;
    79                         busy <= 1;
    80                         state <= SendBit;
    81                         end
    82         SendBit    : begin
    83                         tx <= tx_data[0];
    84                         busy <= 1;
    85                         tx_data <= tx_data >> 1;
    86                         tx_byte_count <= tx_byte_count + 1;
    87                         if(tx_byte_count == 9)
    88                             state <= Idel;
    89                         else
    90                             state <= SendBit;
    91                         end
    92     endcase
    93 end
    94 
    95 endmodule
    View Code

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

                    

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

  • 相关阅读:
    java 求两个数最大值
    java 加法运算
    javs switch 语句
    git合并分支成功,但是push失败(remote: GitLab: You are not allowed to push code to protected branches on this project.)
    python 获取日期以及时间
    1713
    linux shell脚本中的延时
    java 类的继承
    Python3 使用企业微信 API 发送消息
    java if 条件语句
  • 原文地址:https://www.cnblogs.com/lwybky/p/3509463.html
Copyright © 2011-2022 走看看