linux怎么查看本机内存大小
339
2022-11-14
使用CPLD器件和VHDL语言实现USB收发模块的硬件功能设计
引 言
1、USB收发模块的数据规范和通信协议
1.1 USB的数据编码方式
USB系统在进行串行数据传输时,使用一种NRZI(None Return Zero Invert ,即不归零反向码)的编码方案。在该编码方案中,“1”表示电平不变,“0”表示电平改变。图1
给出了一个数据流和它的NRZI编码。
如果直接使用这样的编码方式会遇到一个很严重的问题:若重复相同的“1”信号持续进入时,就会使电平长时间无法转换,逐渐积累从而导致读取数据产生严重的脱节。为了确保信号发送的准确性,当在USB总线上发送一个数据包时,传输设备就要进行位插入操作。所谓位插入操作是指在数据被编码前,在数据流中每6个连续的“1”后面插入一个“0”,从而强迫NRZI码发生变化。
位插入操作如图2所示。USB数据的传送是由低位到高位。每包数据的开始是一个同步格式,同步格式固定为80H。从同步格式开始,位插入操作贯穿于整个数据传输过程,在同步格式后的数据“1”作为真正数据流的第一位。位插入操作是由传输端强制执行的。
1.2 USB收发模块工作过程
USB收发模块的发送单元由串行化﹑位插入﹑NRZI编码等几部分组成;接收单元由NRZI解码﹑反位插入﹑并行化等组成。整个收发单元的工作过程如下:发送端在数据发送前,首先要将并行数据串行化,然后进行位插入,最后进行NRZI编码;接收端在接收数据前就必须先执行NRZI解码,然后进行反位插入,最后进行串行数据并行化。
2、USB收发模块的设计流程
使用VHDL语言进行USB收发模块的设计采用自下而上的设计方法,即先设计其各部分功能单元,再编写顶层文件调用各功能单元以实现其总体功能。根据USB收发模块的工作过程可以确定其设计流程。下面以发送模块为例,介绍各模块的具体实现。
2.1 串行化部分的设计
USB收发模块传输的数据都是串行数据,一个串行数据由10位组成:1位启动位,8位数据位,1位停止位。由于系统内部处理的都是并行数据,所以在发送之前应该进行并行数据串行化处理。串行化的过程是将输入的并行数据按由低位到高位的顺序存入一个有序数组中,并按串行数据格式进行编码。根据这一原理可以编写VHDL程序实现串行化功能。
2.2 位插入部分的设计
在位插入部分的设计中,最关键的步骤是计数器的设置和使用。位插入的进行与否由计数器的值决定,而计数器的值则由输入串行数据的状态直接决定。由于只有在连续输入6个“1”之后,即计数器的值为6时才进行一次位插入,而在计满6个数之前,只要有一位输入的串行数据为“0”,则计数器立即清零。因此,在每读入一位数据之后,就要判断其是否为“1”,以决定计数器加一还是清零。正是由于计数器状态极易发生改变,所以增加了编程的复杂性。
2.3 NRZI编码部分的设计
NRZI编码的原理如前所述。
2.4 数据传输控制方式
最后,在完成各功能单元设计的情况下,编写顶层文件调用各个功能单元,以实现USB收发模块的整体功能。在顶层文件中设置了外部输入和输出端口,作为信号和数据进出发送模块的端口;同时还定义了许多不同的中间变量和信号,用以将各个功能单元连接起来,从而实现数据和信号从输入到输出的连续工作过程。
3、USB收发模块的部分VHDL源代码
下面针对串行数据的NRZI编码,给出USB收发模块的部分VHDL程序源代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
PORT (EN : IN STD_LOGIC;
IND1 : IN STD_LOGIC_VECTOR(7 DOWNTO 0);
OUT1 : OUT STD_LOGIC_VECTOR(8DOWNTO 0));
END NRZI;
BEGIN
PROCESS(EN)
BEGIN
IF IND1(0)=‘1’ THEN OUT1(1) 《=OUT1(0);
ELSIF IND1(0)=‘0’ THEN OUT1(1) 《= NOT(OUT1(0));
END IF;
END IF;
IF IND1(1)=‘1’ THEN OUT1(2) 《=OUT1(1);
ELSIF IND1(1)=‘0’ THEN OUT1(2) 《= NOT(OUT1(1));
END IF;
END IF;
… … …
IF IND1(7)=‘1’ THEN OUT1(8) 《=OUT1(7);
ELSIF IND1(7)=‘0’ THEN OUT1(8) 《= NOT(OUT1(7));
END IF;
END IF;
END IF;
END PROCESS;
END behav;
在能够体现模块功能的前提下,该程序中的输入与输出均设置为八位串行数据,但输出起始位设置为
“1”,实际输出为九位。在实际使用中输入与输出数据均有可能超出八位,但也只是增加了编程的复杂性,其设计方法并不发生改变。
4、仿真结果
5、收发模块的硬件实现
6、结束语
USB收发模块是USB接口的重要组成部分,传统的设计方法是使用现有的芯片组合为硬件电路。这种开发方法要受到现有芯片可实现功能的制约,开发时间长,电路调试复杂,设计修改困难,易产生资源浪费。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~