当前位置:文档之家› 串口接收模块的verilog设计

串口接收模块的verilog设计

串口接收模块的verilog设计
串口接收模块的verilog设计

目录

串口接收模块的verilog设计 (1)

1现场可编程门阵列FPGA (2)

2 Verilog HDL简介 (3)

3串行通信系统 (3)

3.1串行通信概念 (4)

3.3 RS-232总线 (5)

3.3.1 RS-232接口特性 (5)

3.3串行通信接口组成 (6)

3.4 通信协议 (7)

3.5系统整体结构 (8)

4 UART简介 (9)

4.1 接收模块功能设计描述 (11)

4.2波特率模块 (16)

4.3验证 (17)

5总结体会 (18)

参考文献 (19)

串口接收模块的verilog设计

摘要:UART(即Universal Asynchronous Receiver Transmitter)是数据通信及控制中广泛使用的一种全双工串行数据传输协议。本设计基于 FPGA器件实现对UART的波特率产生器、UART发送器和接收器及其整合电路的模块化设计,采用Verilog HDL语言对三个功能模块进行硬件描述。通过串口调试助手进行验证,其结果完全符合UART协议的要求和预期的结果。

关键词:UART FPGA Verilog HDL 验证

1现场可编程门阵列FPGA

20世纪80年代中期,FPGA刚出现时,大部分用来实现粘合逻辑、中等复杂度的状态机和相对有限的数据处理任务。在20世纪90年代早期,FPGA的规模和复杂度开始增加,那时它们的主要场所在通信和网络领域。到了20世纪90年代末,FPGA在消费、汽车和工业领域的应用经历了爆炸式增长。21世纪早期,已经可以买到数百万容量的高性能FPGA。今天FPGA几乎可以用来实现任何东西,包括通信设备和软件定义无线电,雷达、影像和其它数字信号处理的应用,直至包含硬件和软件的片上系统。

FPGA(field-Programmable Gate Array),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路出现的,既解决了制定电路的不足,又克服了原有可编程器件门电路数有限的缺点。

目前以硬件描述语言(Verilog 或 VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至 FPGA 上进行测试,是现代 IC 设计验证的技术主流。这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。

系统设计师可以根据需要通过可编辑的连接把FPGA内部的逻辑块连接起来,就好像一个电路试验板被放在了一个芯片里。一个出厂后的成品FPGA的逻辑块和连接可以按照设计者而改变,所以FPGA可以完成所需要的逻辑功能。

FPGA一般来说比ASIC(专用集成芯片)的速度要慢,无法完成复杂的设计,而且消耗更多的电能。但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。厂商也可能会提供便宜的但是编辑能力差的FPGA。因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。

FPGA采用了逻辑单元阵列LCA(Logic Cell Array)这样一个概念,内部包括可配置逻辑模块CLB(Configurable Logic Block)、输出输入模块IOB(Input Output Block)和内部连线(Interconnect)三个部分。FPGA的基本特点主要有:

1、采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。

2、FPGA可做其它全定制或半定制ASIC电路的中试样片。

3、FPGA内部有丰富的触发器和I/O引脚。

4、FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。

5、FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容

可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式当加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA 能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM 编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片

FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。当然FPGA存在于在某些场合选它而不是单片机的优势:

⑴FPGA运行速度快:FPGA内部集成锁项环,可以把外部时钟倍频,核心频率可以到几百M,而单片机运行速度低的多。在高速场合,单片机无法代替FPGA。

⑵FPGA管脚多,容易实现大规模系统:单片机IO口有限,而FPGA动辄有数百个IO口,可以方便连接外设。比如一个系统有多路AD、DA,单片机要进行仔细的资源分配,总线隔离,而FPGA由于丰富的IO资源,可以很容易用不同IO 连接各外设。

⑶FPGA内部程序并行运行,有处理更复杂功能的能力:单片机程序是串行执行的,执行完一条才能执行下一条,在处理突发事件时只能调用有限的中断资源;而FPGA不同,逻辑可以并行执行,可以同时处理不同任务,这就导致了FPGA工作更有效率。

⑷FPGA有大量软核,可以方便进行二次开发:FPGA甚至包含单片机和DSP 软核,并且IO数仅受FPGA自身IO限制,所以FPGA又是单片机和DSP的超集,也就是说,单片机和DSP能实现的功能,FPGA一般都能实现。

2 Verilog HDL简介

Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

Verilog HDL是目前世界上最流行的两种硬件描述语言之一,是在20世纪80年代中期开发出来的。Verilog HDL这种硬件描述语言被用于从算法级、门级到开关级的多种抽象设计层次的数字系统建模。被建模的数字系统对象的复杂性可以介于简单的门和完整的电子数字系统之间。数字系统能够按层次描述,并可在相同描述中显式地进行时序建模。

Verilog HDL 语言具有下述描述能力:设计的行为特性、设计的数据流特性、设计的结构组成以及包含响应监控和设计验证方面的时延和波形产生机制。所有这些都使用同一种建模语言。此外,Verilog HDL语言提供了编程语言接口,通过该接口可以在模拟、验证期间从设计外部访问设计,包括模拟的具体控制和运行。

Verilog HDL语言不仅定义了语法,而且对每个语法结构都定义了清晰的模拟、仿真语义。因此,用这种语言编写的模型能够使用Verilog仿真器进行验证。语言从C编程语言中继承了多种操作符和结构。Verilog HDL提供了扩展的建模能力,其中许多扩展最初很难理解。但是,Verilog HDL语言的核心子集非常易于学习和使用,这对大多数建模应用来说已经足够。当然,完整的硬件描述语言足以对从最复杂的芯片到完整的电子系统进行描述。

3串行通信系统

在计算机系统和微机网络的快速发展领域里,串行通信在数据通信及控制系统中得到广泛的应用。UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议,在实际工业生产中有时并不使用UART的全部功能。只需将其核心功能集成即可。波特率发生器、接收器和发送器是UART的三个核心功能模块,利

用Verilog-HDL语言对这三个功能模块进行描述并加以整合UART是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL或Veriolog -HDL将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术,基于FPGA/CPLD器件设计与实现UART。

3.1串行通信概念

计算机与计算机,计算机与外部设备进行数据交换也称为通信,一般有两种方式:并行通信和串行通信。信息的各位数据被同时传送的通信方法是并行通信,并行通信依靠I/O接口来实现。并行通信中,数据有多少位就需要多少条信号传输线,这种通信方式快,但由于传输线较多,所以成本较高,仅适合近距离通信,通常传送距离小于30米,常用的并行通信协议有SPP、EPP、ECP等。当距离大于30米时则多采用串行通信方式,串行通信是指外部设备和计算机间使用一根数据线(另外需要地线,可能还需要控制线)进行数据传输的方式。数据在一根数据线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。与并行通信方式相比,有以下优点:

(1)传输距离长,可达数千公里。

(2)长距离内串行数据传送速率会比并行数据传送速率快,串行通信的通信时钟频率比并行通信更容易提高。

(3)抗干扰力强,串行通信信号间的相互干扰完全可以忽略。

(4)通信成本低。

(5)传输线既传输数据,又传输联络信息。

因此串行通信得到广泛的应用。

在串行通信中,数据通常在发送器和接收器间进行双向传送,而这种传送又根据需要可分为单工通信、半双工通信和全双工通信。

通常情况下,根据信息传送格式,串行通信又分为两类:异步串行通信和同步串行通信。同步串行通信是按软件识别同步字符来实现数据传送的;异步串行通信是一种利用字符再同步技术通信方式。

同步通信是以数据块的方式传送的,数据传输率高,适合高速率、大容量的数据通信。同步通信在数据开始处用一个同步字符来指示。同步通信是指在约定的通信速率下,发送端和接收端的时钟信号频率和相信始终保持一致(同步),这就保证了通信双方在发送和接收数据时具有完全一致的定时关系。在发送时要插入同步字符,接收端在检测到同步字符后,就开始接收任意位的串行数据,同步通信具有较高的传输率,但对硬件要求较高。

异步通信是以字符为单位传送数据的,数据传送可靠性高,适合低速通信的场合。异步通信是指通信中两个字符之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的。

然而本设计目的是在FPGA的基础上设计串口通信系统,而且本文采用的是RS-232C总线接口标准作为串行通信的交通工具,所以是采用按位传送的异步串行通信协议。

3.3 RS-232总线

通信,当然就是接收信息/发送信息,在现实生活中人与人对话是通信,而传送他们信息的是空气这个媒介。写信,电话,QQ都是通信工具,然而互相通信之间一定会有一个媒介,只是不同的通信方式,媒介不同而已。计算机与计算机,计算机与外部设备之间的通信,一般有两种方式:并行通信和串行通信。并行通信依靠I/O接口来实现,而串行通信就需要串行通信接口标准:RS-232C、RS-499、RS-422、RS-423、RS-485等总线来实现。当然本设计采用一般的微型计算机、计算机终端和一些外部设备都配有RS-232C串行接口作为本通信接口的标准。

RS232接口,就是普通电脑后面那个串口.一般为9针的,也有25针的.是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”(RS-232C,其中C表示此标准修改了三次)。标准中包括了电气和机械方面的规定.该标准规定采用一个25个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来随着设备的不断改进,成了目前大家普遍见到的9脚。

在不使用传输控制信号的情况下,用3根线就可以传输了9芯的是2收3发5地25芯的是2发3收7地。两设备用RS232相连的时候为收——发,发——收,地——地。

3.3.1 RS-232接口特性

(1)接口的电气特性:在RS-232C中任何一条信号线的电压均为负逻辑关系。即:逻辑“1”,-5— -15V;逻辑“0” +5— +15V 。噪声容限为2V。即要求接收器能识别低至+3V的信号作为逻辑“0”,高到-3V的信号作为逻辑“1”。

(2)接口的物理结构: RS-232-C接口连接器一般使用型号为DB25的25芯插头座,通常插头在DCE端,插座在DTE端。一些设备与PC机连接的RS-232C接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据”、“接收数据”和“信号地”。所以采用DB-9的9芯插头座,传输线采用屏蔽双绞线。

(3)传输电缆长度由RS-232C标准规定在码元畸变小于4%的情况下,传输电缆长度应.50英尺.其实在一般应用中,传输距离小于50m,最大传输速率为20kbps。

由于RS-232-C接口标准出现较早,难免有不足之处,主要有以下四点:

(1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL电路连接。

(2)传输速率较低,在异步传输时,波特率为20Kbps。

(3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。

(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。

由于RS-232C是用负电压来表示逻辑状态,与TTL以高低电平表示的逻辑状态的规定不同,所以在实际应用时,需要将TTL电平转换成RS-232电平,如图3-1所示。RS232的接口芯片很多,因此使用时须加上适当的电平转换电路,最

著名的当然是MAX公司的芯片MAX232。

图3-1 MAX232结构图

3.3串行通信接口组成

由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此串行通信接口的基本功能是:在发送时,把CPU送来的并行数据转换成串行数据,逐位地依次发送出去。在接收时,把外部设备发送过来的串行数据逐位地接收,组装成并行数据,并行地送给CPU去处理。实现这一功能的硬件电路叫做串行通信接口。串行接口的组成图如图3-2所示。

图3-2 串口接口的组成

在数据输入过程中,数据一位一位地从外部设备进入UART接口的“接收移位寄存器”,当“接受移位寄存器”中已接收完一个UART包的各位后,数据就从“接收移位寄存器”进入“数据输入寄存器”。CPU从“数据输入寄存器”中读取接收到的数据(并行读取,即同时被读至累加器中)。“接收移位寄存器”的移位速度由“接收时钟”确定。

在数据输出过程中,CPU把要输出的数据(并行地)送入“数据输出寄存器”,“数据输出寄存器”的内容被传输到“发送移位寄存器”,然后由“发送移位寄存器”通过移位操作,把数据一位一位地送到外设。“发送移位寄存器”的移位速度有“发送时钟”确定。

“控制寄存器”用来保存与此接口有关的控制信息,这些控制信息决定接口的工作方式。CPU可以通过修改“控制寄存器”的内容来控制串行通信接口的工作方式。

“状态寄存器”的各位称为“状态位”,每一个状态位都可以用来指示数据传输过程中的状态或某种错误。例如,用状态寄存器D5位为“1”表示“数据输出寄存器空用D0位表示“数据输入寄存器满”,用D2位表示“奇偶检验错”等。

3.4 通信协议

在异步通信中,是以字符为单位传送数据,是从低位到高位逐位传送,一个字符表示一帧信息。串行异步通信协议中字符代码传输格式如图2.3所示,通常UART的一帧数据由四部分组成:一个起始位S(一般逻辑为“0”),后面是数据长度可变的数据位D0~D7(一般为6位到8位之间可变,数据的低位在前),一个可选的校验位PB(可选奇校验、偶检验或不需要检验),随后是一定长度的停止位P(可选1位、1.5位、或2位),停止位必须为逻辑“1”。在没有数据被传输时,数据线会一直处于逻辑“1”状态。一桢数据的组成图如图3-3所示。

图3-3 一桢数据标准格式

a.起始位:它是数据采样的第一个点,当接收模块检测串行输入数据管脚上的电平从“1”到“0”的跳变来确定一个UART包的起始位。起始位检测8个连续脉冲的另一个更重要的原因是,采用16倍频采样的时钟,第8个采样脉冲所对应的数据波形正好是该位数据位波形的正中点(以时钟上升沿采样),在该处读写数据应该是最安全点。

b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

c,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶数个或者奇数个逻

辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不为真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

d,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

在UART协议中,数据的发送者与接收者不共享时钟信号,也就是说,在一次UART通信过程中,并没有一个时钟信号从发送端传输到接收端,因此,这个协议被称为异步方式。

由于没有共享时钟信号,因此在进行数据传输之前,收发双方必须协商好一个数据传输的波特率,也就是说,UART接收端应该知道发送端发送数据的波特率(相应的发送端也需要知道接收端的波特率)。在大多数情况下,发送数据和接受数据的波特率是相同的。UART发送端按照低位在前,高位在后的顺序移位输出数据。一旦在初始化过程中,双方协商好了通信的波特率,收发双方的内部时钟都设定在同一波特率(但时钟的相位不同)。在一个UART包传输开始,接收端将它的内部时钟调整到与发送端同步。这样接收端就可以在每一位的中心位置对数据位进行采样,保证数据传输的正确性。

3.5系统整体结构

本设计以FPGA为基础来实现异步通信,而UART模块就为本设计关键所在,如图3-4所示,该模块主要有串行发送器、接收器以及波特率发生器三个模块组成。

波特率发生器模块:在异步通信中,发送方和接受方必须保持相同的波特率才能实现正确的数据传送。在本设计中,由于RS-232C传输必定是工作在某种波特率下,为了便于和RS-232C总线进行同步,需要产生符合RS-232C传输波特率的时钟。

图3-4 系统整体结构图

串口通讯系统的完整的工作流程可以简单的分为数据接收和发送两个部分。

接收过程:当UART模块检测到有新数据(RS-232C总线传输线的起始位)就会触发接收流程。首先UART模块内部会重置波特率发生器和移位寄存器,控制逻辑使移位寄存器的工作模式为波特率模式,以准备数据接收,其次移位寄存器在波特率时钟的驱动下工作,不断的读取RS-232C串行总线上的输入数据,一位一位的接收,并且将数据保存到内部的数据寄存器内。然后在进行串并转换,在通过CPU内部数据总线传送到数据I/O缓存器,最后被CPU内部采用。

发送过程:当要发送数据出去时,先把要发送的CPU内部数据存储到数据I/O 缓存器,传送到数据寄存器,然后进行串并转换。UART模块内部会重置波特率发生器控制逻辑控制移位寄存器进入RS-232C串行发送的协议模式,并且使移位寄存器工作在波特率模式下,于是移位寄存器便在波特率时钟的驱动下依次将数据寄存器的数据一位一位发送到RS-232C的发送端TXD,这样就产生了RS-232C 的数据发送时序。

4 UART简介

UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件。因为计算机内部采用并行数据,不能直接直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备点的数据放到UART寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出列队)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。

它是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流

中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。可以处理计算机与外部串行设备的同步管理问题。

一般而言UART和外界通信只需要两条信号线RXD和TXD,其中RXD是UART 的接收端,TXD是UART的发送端,接收与发送是全双工形式。由于可编程逻辑器件技术的快速发展,FPGA的功能日益强大,其开发周期短、可重复编程的优点也越来越明显,本设计就是在FPGA芯片上集成UART功能模块并和其他模块组合来实现一个能与其他设备进行串行通信的片上系统。本系统设计硬件电路图如图4-1所示。

图4-1 系统硬件原理图

模块名称:uart_test

功能描述:uart的测试顶层模块

module uart_test(

sys_clk, //系统时钟

uart_dataH,

uart_xmitH //uart接收与发送引脚

);

input sys_clk; //系统时钟(48MHz)

input uart_dataH; //uart接收引脚RXD

output uart_xmitH; //uart发送引脚TXD

reg[7:0] senddata; //发送一个字节的数据缓存区

reg WR_R1,WR_R2,WR_R3; //控制产生一个发送的写信号

wire [7:0]recdata; //接收缓存区

wire RI,TI,WR; //接收、发送中断以及写控制信号

wire clksend,clkrec; //发送和接收的时钟频率

always@(posedge clksend) //通过RI接收中断产生一个写信号,维持时间为1个Clk begin

WR_R1 <= RI;

WR_R2 <= WR_R1;

WR_R3 <= WR_R2

end

assign WR = (~WR_R3)&(WR_R2)&(WR_R1); //控制写信号

always@(posedge RI) //当接收了一个数据后,把数据加1后发

回PC机,注意串口一个一个数据发begin

senddata <= recdata+8'd1;

end

rec uart_rec( //调用一个uart接收模块

sys_rst_1(sys_rst_1),

sys_clk(uart_clk),

uart_dataH(uart_REC_dataH),

rec_dataH(rec_dataH),

rec_readyH(rec_readyH),

);

send uart_xmit( //调用一个uart的发送模块

sys_rst_1(sys_rst_1),

sys_clk(uart_clk),

uart_xmitH(uart_XMIT_dataH),

ximtH(xmit_start_pulseH),

xmit_dataH(reg_xmit_data),

xmit_doneH(xmit_doneH)

);

Baud( //调用波特率变换器sys_clk(uart_clk),

sys_rst_1(sys_rst_1), baud_clk(uart_clk),

baud_rate_div(baud_rate_div)

);

endmodule

4.1 接收模块功能设计描述

接受模块的主要功能是检测起始位S,对随后的位流解串行化,检测停止位PB,并将数据准备好CPU读取。

图4--2显示了接受模块的功能框图,包括控制状态机、解串行化器和相关逻辑。本设计仅包括最基本的功能,没有错误检测逻辑。

图4-2接收模块功能图

Uart_clk的频率为波特率的16倍,它是由波特率变换模块产生的。这个时钟信号用来驱动接收模块中的所有时钟。Uart_dataH是一个输入信号(就是RXD),它在送入解串行化器之前要经过两级同步器。注意:由于Uart_dataH上传输的数据是与发送端的时钟信号是同步的,而不是与接收端的时钟信号同步的,因此这个两级同步器是必不可少的。

解串行化器是一个简单的串并转换移位寄存器。它有一个来自状态机的输入shiftH。当这个信号为有效(高电平)时解串行化器进行一次移位。移位寄存器的默认宽度为8位,需要主要的数据的低位先被移入。已接收位计数器用来跟踪记录累计接收到的数据位的数目。当计数器计数到预先设定的值(word_len)时,状态机停止接收数据。计数器有两个控制输入端:countH和rstcountH。当countH 有效(高电平)时,计数器加1;当rstcountH有效(高电平)时,计数器清零。它是一个同步计数器,计数器的默认宽度为4位。位元计数器的作用是在uart_clk中产生一个延时(波特率周期/16),这是一个由cntr_resetH信号控制的加计数器。当该信号有效(高电平)时,计数器处于复位状态;当该信号为低电平时,计数器进行加1计数。

图4-3显示了状态机的状态跳转流程,他是一个有5个状态的mealy型状态机。

图4-3 UART接收模块状态图

状态机把前面描述的解串行化器、两级同步器、已接收位计数器和位元计数

器联系在一起。当系统复位时,状态机的默认状态为r_START。在这个状态,状态机等待起始位S。输入数据在空闲状态时为“1”,当输入数据从“1”跳变到“0”,即检测到起始位S时,状态机跳转到r_CENTER状态。在r_CENTER状态,状态机等待1/2个位元长度,以找到位元的中间位置。一个位元就是一个波特,包括16个uart_clk脉冲。因此1/2个位元就是8个uart_clk脉冲。这个延时由位元计数器产生。等待4个uart_clk脉冲而不是8个的原因是同步器有时会增加两个uart_clk脉冲,计数器一般也会增加两个uart_clk脉冲。

因为在前一状态r_CENTER时,输入数据已经以起始位S位元的中心对齐,因此,在r_WAIT状态,如果WORD_LEN个位元已经被采样,则状态机跳转到r_STOP 状态,否则状态机等待一个波特时间(16个uart_clk脉冲)后,跳转到r_SAMPLE 状态。

在r_SAMPLE状态,rec_dataH的状态被采样送入解串行化器,然后跳转到r_WAIT状态。

在r_STOP状态,rec_dataH的状态被检测以确定其是否为“1”,这一位将不被送入解串行化器。检测不到停止位PB(为“1”)并不会导致一个错误。在状态机跳转到r_START状态前,状态变量rec_readyH将被声明为有效(高电平)以通知CPU有一个有效数据等待被读取。Rec_readyH在被置为有效(高电平)前,是一个触发信号或缓冲信号。

接收模块程序:

module uart_rec(sys_rst_1,sys_clk,uart_dataH,rec_dataH,rec_readyH);

input sys_rst_1; //异步复位信号

input sys_clk; //主时钟,为16波特率

input uart_dataH; //连接到uart管脚

output [7:0] rec_dataH; //已接收到的数据(并行传送)

output rec_readyH; //高电平有效,指示新数据等待被读取//存储单元定义

reg [2:0] next_state,state;

reg rec_dataH,rec_datSyncH;

reg [3:0] bitcell_cntrH;

reg cntr_resetH;

reg [7:0] part_dataH;

reg shiftH;

reg [3:0] recd_ bitcntrH;

reg countH;

reg rstCountH;

reg rec_readyH;

reg rec_readyInH;

wire [7:0] rec_dataH;

assign rec_dataH=par_dataH;

always @(posedge sys_clk or negedge sys_rst_1)

if (~sys_rst_1)

begin

rec_datSyncH<=1;rec_datH<=1;

rec_datH<=1;

end

else begin

rec_datSyncH<=uart_dataH;

rec_datH<=rec_datSyncH;

end

//位元计数器

always@(posedge sys_clk or negedge sys_rst_1)

if (~sys_rst_1)tbitcell_cntrH<=0;

else if (cntr_resetH)bitcell_cntrH<=0;

else bitcell_cntrH<=bitcell_cntrH+1;

//串行输入移位寄存器,低位先被移入

always@(posedge sys_clk or negedge sys_rst_1)

if(~sys_rst_1)par_dataH<=0;

else if (shiftH)begin

par_dataH[6:0]<=par_dataH[7:1]

par_dataH [7]<=rec_datH;

end

//已接收位计数器

always@(posedge sys_clk or negedge sys_rst_1)

if(~sys_rst_1) recd_bitCntrH<=0;

else if (countH) recd_bitCntrH<= recd_bitCntrH+1;

else if (rstCountH) recd_bitCntrH<=0;

//状态变量传递

always@(posedge sys_clk or negedge sys_rst_1) if(~sys_rst_1)state<=r_START; else state<=next_state

; //接收状态机

always@(state or rec_datH or bitcell_cntrH or recd_bitCntrH)

begin

next_state=state;

cntr_resetH=HI;

shiftH =LO;

countH =LO;

rstCountH =LO;

rec_readyInH=LO;

case(state)

r_START:

begin //START状态,等待起始位S if(~rec_datH)next_state=r_CENTER;

else begin

next_state=r_START;

rstCountH=HI; //位计数器复位

rec_readyInH=HI; //接收模块准备好,等待接收数据end

end

rCENTER:

begin //定位位元中心位置,一个位元包含16个系统时钟周期if(bitcell_cntrH==4’h4)

begin //如果等待1/2个位元后输入仍为低电平,则表示接收到一个有效的起始位S

if(~rec_datH)

next_state=r_WAIT; //否则,则认为是信道干扰

else

next_state=r_START;

end

else begin

next_state=r_CENTER;

cntr_resetH=LO; //允许计数器的计数操作

end

end

r_WAIT:

begin //WAIT状态,在对数据管脚进行采样前等待一个位元的时间if(bitcell_cntrH==4’hE)

begin

if(recd_bitCntrH==WORD_LEN)

next_state=r_STOP; //已完成8次采样

else

next_state=r_SAMPLE;

end

else begin next_state=r_WAIT;

cntr_resetH=LO; //允许计数器的计数操作

end

end

r_SAMPLE:

begin //SAMPLE状态,对接收数据管脚的状态进行采样shiftH = HI; //将串行数据移入寄存器

countH =HI; //接收到一个新的比特

next_state=r_WAIT;

end

r_STOP: begin //STOP状态,检测停止位PB

next_state =r_START;

rec_readyInH =HI;

end

default:begin

next_state =3’bXXX;

cntr_resetH=X;

shiftH=X;

countH=X;

rstcountH=X;

rec_readyH=X;

end

endcase

end

//寄存状态机的输出以消除危险路径

always @( posedge sys_clk or negedge sys_rst_1)

if(~sys_rst_1) rec_readyH<=0;

else rec_readyH<=rec_readyInH;

endmodule

4.2波特率模块

波特率是串行通信的重要指标,表示数据传输的速度,即每秒钟传送的二进制数据的位数,也是单位时间内传送的信息量。在串行异步传送中,常用到的波特率为1200b/s、2400b/s、4800b/s、9600b/s、19200b/s等。波特率发生器实际上是一个分频器,主要是产生和RS-232通信所采用的波特率同步的时钟。由于串行数据帧与接收数据时钟是异步的,所以存UART的接收端在什么时刻将数据移入寄存器,怎样选择可靠的采样点是非常关键的。一般采用高速时钟对串行数据采样是非常有效的方法。在实际设计中,一般最大选择16倍于波特率的时钟频率。实现波特率时钟的基本思路就是设计一个计数器,该计数器工作在速度很高的系统时钟下,通过总线写入不同的数值到波特率发生器保持寄存器中,然后用计数器的方式生成所需要的各种波特率就能得到所需的波特率时钟,波特率变换模块的功能是利用外部时钟信号sys_clk产生uart_clk信号。与前面的描述一致,uart_clk的频率为波特率的16倍。

module baud @ (sys_clk,sys_rst_1,baud_clk,baud_rate_div)

input sys_clk; input sys_rst_1;

output baud_clk;

input [15:0] baud_rate_div;

//存储单元定义

reg [15:0]clk_div;

reg baud_clk;

always @ (posedge sys_clk or negedge sys_rst_1)

if (~sys_rst_1) begin

clk_div<=0;

baud_clk<=0;

end

else if (clk_div==baud_rate_div) begin

clk_div<=0;

baud_clk<=~baud_clk;

end

else begin

clk_div<=clk_div+1;

baud_clk<=baud_clk;

end

end endmodule

4.3验证

把实验板上电,下载完成后在PC上打开串口调试助手,实现的功能如图所示,这就是FPGA里实现从PC接收数据,然后把接收到的数据发回去。使用的是串口UART协议进行收发数据。用串口调试助手,如图4-4所示。

图4-4 验证图

在上方接收区的串口选择COM1,波特率选择9600,但发送数据的波特率可选9600bps,19200bps,38400bps,57600bps,115200bps等,是可调的。发送格式为:1bit起始位,8bit数据,1bit停止位,无校验位。经过下载验证,其结果完全符合UART协议的要求和预期的结果。

5总结体会

通过本学期实验课的学习,我们获得了不少的知识,为我们后续的研究生学习生活指引了方向。回顾这学期,我从对QuartusII不了解到进一步掌握QuartusII的使用全过程,并进一步懂得了多层次的设计方法,掌握了基本的Verilog语言的设计方法。在这次串口通信实验中,从开始选题到最后完成,期间遇到了好多问题。首先,在选题的过程中,由于对试验箱上芯片所能实现的功能的不了解,以及对实验难度的要求,所以一直没办法定下来。最后通过组员们的商量,以及向学长学姐们的咨询,最终把题目定为了:串口通信。然后是在定题后的资料收集过程中,由于我们对串口通信也不是很熟悉,所以需要对串口通信进行全新的学习。虽然网上资料很多,不过还是都必须要自己能够看得熟悉,理解了之后才能自己拿来用。最后就是在程序的调试阶段,由于对软件的不熟悉,这个也花了很长的时间来弄。不过最终还是得出了满意的结果。由于自身实力的问题,没能实现实验箱到PC机这个方向上的通信,只能简单的通过PC机上的串口调试助手对LCD上的显示做出修改。这个就是本实验需要改进的地方。通过这次实验设计,让我进一步熟悉和掌握了Verilog语言。最后感谢同学们及老师的帮助。

参考文献

[1].程耀林.FPGA的系统设计方法解析[J].现代电子技术,2005,(19):90-93

[2].张忠.自顶向下的FPGA设计[J].电子产品世界,1998,(11):33-34,72

[3].王晓勇.FPGA的基本原理及运用[J].舰船电子工程,2005,(02):82-85

[4].吴继华,王诚.设计与验证Verilog HDL[M].北京:人民邮电出版社,2006.

[5].夏宇闻,Verilog数字系统设计教程(第2版)[M] ,北京航空航天大学出版社,2008

[6]. [美]Bhasker J. Verilog HDL 硬件描述语言[M]. 徐振林。北京:北京机械工业出版社,2000

XFP模块电路设计

XFP模块电路设计 一、应用要求 1、多速率应用:TELECOM(SONET OC-192 and G.709 “OTU-2”) DATACOM(10 Gb/s Ethernet and 10 Gb/s Fibre Channel) 2、XFI(9.95Gb/s~11.7Gb/s)高速信号可以在改良的FR4电路板上传输 300mm或普通的FR4电路板上传输200mm。 3、热插拔智能化,能够提供模块的实时工作状态的监视值 二、指标要求 3、封装结构:按照XFP-MSA的要求 三、方案选择 1、发射器件的选择:采用公司成熟的TO封装工艺开发的发射器件。 2、接收组件的选择:采用公司成熟的TO封装工艺开发的接收组件。

四、电路设计 1、原理框图 LOS Data In TxDis SCL SDA TxFault

2、原理图设计 3、PCB设计 (1)传输线设计: 在PCB设计中采用微带线来进行信号传输,保证高深信号在PCB上传输不发生波形畸变,我们通过AppCAD模拟可得到微带线的宽度和各微带线之间的间距。在10Gb/s的工作速率下,信号波长已经可以与器件尺寸相比拟,基于电路性能、器件选择和电磁兼容等因素的考虑,必须以网络散射分析(S参数)、信号完整性分析、电磁仿真分析、电路仿真分析等手段,来综合考量实际电路系统的工作性能。对电路板、元器件进行结构性电磁仿真并精确提取相应的SPICE电路模型参数,作为电路设计的依据,以此有效减小电感器件在高频设计应用中的误差影响。而且现在国外的产品技术参数大多包含有S参数,通常可用于精确的高频应用分析。信号传输微带线的等效分析见下图。

rs串口verilog代码

UART是通用异步收发器的简称,其中有一种电平规范较RS232规范,它用-3~-15V表示正逻辑,3~15V表示负逻辑,通过FPGA芯片实现RS232通信首先要解决的就是FPGA电平和RS232电平之间的矛盾,通常采用MAX3232作为物理层的电平接口,根据MAX3232提供的标准配制方式把物理电路设计好后,接下来的通信就是要实现逻辑的接收和发送…… 设计最简单的RS232通信逻辑,FPGA实现将接收到的数据会发出去,总共两个数据传输引脚,一收一发。将此通信模块分为三个部分:接收模块,波特率控制模块,发送模块。 工作原理:此模块接收MAX3232传过来的串行数据,对齐进行判断采样,校验,最后将数据流中的串行数据转换为八位并行数据,将此八位数据储存,或送给发送模块发送出去。根据RS232通信标准器串行数据分为起始位、数据位、校验位、停止位,空闲时为高电平,起始位通常为低电平,数据位通常为8位,校验位分为奇校验、偶校验等,停止位一位或两位且为高电平。FPGA接收模块对此数据进行异步接收,首先就要检测其数据传输开始标识,当然就是检测开始位,于是要有下降沿检测电路,检测到下降沿是输出一高脉冲,此电路可以用两个D触发器加上基本门电路实现,脉冲触发开始进入接收状态,输出接收状态标志位,使其为1,此标志位使能波特率控制模块输出采样脉冲,此计数脉冲触发接收模块中的计数器计数,加到相应的位就把当前的串行总线上的值赋给缓冲器,或对其判断,当计数完成11次计数后,已将8位串行数据转成并行数据到缓冲器中,且进行了校验的判断和停止位的判别,这是接收状态结束,接收状态位置0,计数器清零。对于波特率产生模块用于控制采样数据脉冲的周期,其周期就为串行数据传送一个bit所用的时间,根据此时间和时钟周期设置计数值。当接收模块完成工作时,接收状态位为0时可以触发发送模块,发送模块检测接收状态的下降沿,由此产生一高脉冲,与发送模块类似,根据波特率控制模块产生的计数脉冲将并行数据转成串行数据,并加上开始位、校验位、停止位。由此完成整个串行通信模块。 要熟悉:下降沿检测程序设计,并转串设计等。 顶层模块图如下所示: 各模块的程序如下: //本程序实现rs232通信中的串行数据接收模块 module rs232_rx( //input clk,//50M的时钟输入 rst_n,//低电平复位信号输入 rx_cnt_pluse,//采样脉冲输入,总共11个采样脉冲,一个时钟宽度的高电平 rs232_in_s,//串行数据输入,空闲时为高电平,1bit低电平作为起始位,接着8bit数据位LSB传输模式,接着偶数校验位,接着1bit低电平作为停止位

m序列Simulink仿真实现

m序列Simulink仿真Verilog实现1. 4阶m序列生成器

Simulink模型如下: 其中,可以在Unit Delay属性中设置初始值为1000,由于Unit Delay输出为double,所以要将其转为Boolean以便进行模二加运算,使用XOR实现。

下面分别是最后一级和所有级的输出波形,可以看出,与上面的是一致的。

Verilog实现 `timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 11:02:17 05/01/2012 // Design Name: // Module Name: PNcode // Project Name: ////////////////////////////////////////////////////////////////////////////////// module PNcode( clk, rst, PNstate, PNout

); input clk; input rst; output PNstate; output PNout; // PN code n = 4, f(x) = 1 + x + x^4 parameter order = 4; reg PNout = 0; reg [order-1 : 0] PNstate = 0; always @ (posedge clk) if(rst == 1) begin PNout <= 0; PNstate <= 4'b1000; // PN seed = b1000 end else begin PNout <= PNstate[0]; PNstate <= {PNstate[3]+PNstate[0], PNstate[3:1]}; end endmodule 测试文件: `timescale 1ns / 1ps //////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 14:37:43 05/01/2012 // Design Name: PNcode // Module Name: E:/me/CAST/Project/FPGAcomm/PNcode/PNcode_tb.v

无线模块电路设计

基于MRF24J40的IEEE802.15.4无线收发电 路设计 时间:2010-11-30 19:05:33 来源:作者:黄智伟何娜 IEEE802.15.4无线收发器MRF24J40芯片内部包含有SPI接口、控制寄存器、MAC 模块、PHY驱动器四个主要的功能模块,支持IEEE802.15.4,MiWiTM,ZigBee等协议,工作在2.405~2.48 GHz ISM频段,接收灵敏度为-91 dBm,最大输入电平为+5 dBm,输出功率为+0 dBm,功率控制范围为38.75 dB,集成有20 MHz和32.768 kHz主控振荡器,MAC/基带部分采用硬件CSMA-CA结构,自动ACK6和FCS检测,CTR、CCM和CBC-MAC 模式采用硬件加密(AES-128),电源电压范围为2.4~3.6 V,接收模式电流消耗为18 mA,发射模式电流消耗为22 mA,睡眠模式电流消耗为2μA。 MRF24J40采用6 mm×6 mm QFN-40封装,引脚端封装形式如图1所示。图中:引脚端RFP和RFN分别为芯片的RF差分输入/输出正端和负端,两者都是模拟输入/输出端口,与系统天线相连接;VDD为电源电压输入引脚端,每个电源电压输入引脚端都必须连接一个电源去耦电容;GND为接地引脚端,必须低阻抗的连接到电路的接地板;GPIOO~GPIO5是通用数字I/O口,其中GPIO0也被用来作为外部功率放大器使能控制,GPIO1和GPIO2也被用来作为外部TX/RX开关控制;RESET为复位引脚端,低电平有效;WAKE为外部唤醒触发输入端;INT为到微控制器的中断引脚端;SDO,SDI,SCK和CS是MRF24J40的SPI接口输入输出引脚端,其中SDO是MRF24J40的串行数据输出,SDI是MRF24J40的串行接口数据输入,SCK是串行接口的时钟,CS是串行接口使能控制引脚端;LPOSC1和LPOSC2为32 kHz晶振输入正端和负端;OSC1和OSC2为20 MHz晶振输入正端和负端;CLKOUT为20/10/5/2.5 MHz时钟输出端;LCAP引脚端用来连接一个180 pF的PLL环路滤波器电容;XIP和RXQP为接收I通道和Q通道输出正端。 2 MRF24J40构成的IEEE802.15.4无线收发电路 MRF24J40构成的IEEE802.15.4无线收发电路如图2所示,各电源电压引脚端根据需要分

verilog串口程序

串口通信是目前比较重要的一种通信方式,主要是用于计算机和外部的通信。首先简单的介绍一下串口通信的原理: 串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据

verilog m序列发生器

module m_sequen( clk, rst, m_out ); input clk; input rst; output m_out; reg m_out; reg [7:0] reg_buffer; //-------------feedback--------------// wire feedback = reg_buffer[7] ^ reg_buffer[6] ^ reg_buffer[2] ^ reg_buffer[1] ; //----------initial,linear shifting---------// always @ (posedge clk,negedge rst) begin if(!rst) begin reg_buffer <= 8'b11111111; end else begin reg_buffer[7:0] <= {reg_buffer[6:0],feedback}; end end //-------------check all zero-------------// always @ (posedge clk,negedge rst) begin if(reg_buffer==8'b00000000) begin reg_buffer <= 8'b11111111; end end //----------------output----------------// always @ (posedge clk,negedge rst) begin if(!rst) begin

m_out <= 1'b0; end else begin m_out <= reg_buffer[7]; end end endmodule

如何用VC++实现串口通信

用VC 6.0实现串行通信的三种方法 中国科学院王颖 ---- 摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。 ---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。依据不同的条件实现对串口的灵活编程控制是我们所需要的。 ---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。串行通信程序开发环境为VC++ 6.0。 ---- Windows下串行通信 ---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows 操作系统提供的设备驱动程序来进行数据传递。串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。以下将结合实例,给出实现串行通信的三种方法。 ---- 实现串行通信的三种方法 ---- 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control 工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对Windows 通讯驱动程序的API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。 ---- 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性: ---- CommPort 设置并返回通讯端口号,缺省为COM1。 ---- Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 ---- PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。 ---- Input 从接收缓冲区返回和删除字符。 ---- Output 向发送缓冲区写一个字符串。 ---- InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内

Verilog串口通讯设计

1 串口通信基本特点随着多微机系统的应用和微机网络的发展,通信功能越来越显得重要。串行通信是在一根传输线上一位一位地传送信息.这根线既作数据线又作联络线。串行通信作为一种主要的通信方式,由于所用的传输线少,并且可以借助现存的电话网进行信息传送,因此特别适合于远距离传送。在串行传输中,通信双方都按通信协议进行,所谓通信协议是指通信双方的一种约定。约定对数据格式、同步方式、传送速度、传送步骤、纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。异步起止式的祯信息格式为:每祯信息由四部分组成:a.1位起始位。b.5~8位数据位。传送顺序是低位在前,高位在后.依次传送。c.一位校验位,也可以没有。d.最后是1位或是2位停止位。FPGA(Field Pmgrammable Gate Array)现场可编程门阵列在数字电路的设计中已经被广泛使用。这种设计方式可以将以前需要多块集成芯片的电路设计到一块大模块可编程逻辑器件中,大大减少了电路板的尺寸,增强了系统的可靠性和设计的灵活性。本文详细介绍了已在实际项目中应用的基于FPGA的串口通讯设计。本设计分为硬件电路设计和软件设计两部分,最后用仿真验证了程序设计的正确性。 2 系统的硬件设计本方案的异步串行通信的硬件接口电路图如图1所示,主要由四部分组成:RS-485数据发送模块、FPGA串口模块、MAX3223和DB9。各部分功能简述如下:RS-485数据发送模块是将前续电路的数据发送到FPGA,供本电路处理,亦即本电路的输入。RS485是符合RS-485和RS-4225串口标准的低功耗半双工收发器件,有3.3V和5V两种,在本设计中选用了3.3V的器件SP3485。SP3485的内部结构示意图如图2所示在本设计中。485的7脚和8脚与前端信号相连接,用于接收输入的数据。数据格式是这样的:一帧数据有25位,报头是16个高电平和1个低电平,接下来是 8位有效的数据。传输速率为700k波特率。2脚是使能端,与FPGA的I/O口相连,由FPGA提供逻辑控制信号。1脚和4脚也与FPGA相连,由 FPGA对输入数据进行处理。 图1异步串行通信硬件接口功能框图 图2 SP3485的内部结构示意图FPGA串口模块是将由RS-485发送过来的数据进行处理,提取出8位有效数据,并按异步串口通讯的格式要求输出到MAX3223的12脚。FPGA选用Xilinx 公司的Spartan II系列xc2s50。此部分为该设计的主体。如上所述,输入数据的传输速率为700k波特率。为了使FPGA能够正确地对输入数据进行采样,提高分辨率能力和抗干扰能力,采样时钟必须选用比波特率更高的时钟,理论上至少是波特率时钟的2倍。在本设计中选用4倍于波特率的时钟,利用这种4倍于波特率的接收时钟对串行数据流进行检测和定位采样,接收器能在一个位周期内采样4次。如果没有这种倍频关系,定位采样频率和传送波特率相同,则在一个位周期中,只能采样一次,分辨率会差。比如,为了检测起始位下降沿的出现,在起始位的前夕采样一次之后,下次采样要到起始位结束前夕才进行。而假若在这个周期期间,因某种原因恰恰使接收时钟往后偏移了一点点,就会错过起始位。造成整个后面位的检测和识别错误。针对本设计,FPGA的软件共分了三个模块: 1.时钟分频模块。模块的功能是用来产生所需要的数据采集时钟和数据传输时钟。系统主频是40M的。数据采集时钟是2.8M的,发送时钟是11.2k。 2. 提取数据模块。由RS485发送过来的数据共有25位,其中只有8位是有效数据。为了发送这8位有效数据。必须先将其提取出来。提取的办法是这样的:通过连续检测到的16个高电平和一个低电平。判断8位有效数据的到来。然后按照串行数据传输的格式,在加上起始位和停止位后,将其存储于输出缓冲寄存器中。在这里,我们的串行数据输出格式是这样规定的,一位起始位,八位数据位,一位停止位,无校验位。 3.串行数据输出模块。这一模块相对比较简单,波特率选为11.2k,模块的

4级m序列发生器设计参考

3级m序列发生器设计方案 图2.2 七位反馈移位移存器 方案一: 根据图2.2的结构模型,对于级数为n=3的m序列,可设置四个寄存器,将寄存器0和寄存器1进行异或运算,把结果赋给寄存器3。然后将寄存器2,1,0右移一位。再将寄存器3赋给寄存器2。这样就不会产生数据覆盖。最后把寄存器0输出。同理可得15位m序列,级数n=4的verilog建模思路。 方案二: 由于7位m序列1110010可用三位二进制7种状态表示,因此可用Moore有限状态机的行为进行建模方法。Moore有限状态机,其输出值只取决于当前状态,与输入值无关。可以通过在always语句块内使用case语句来实现,在每个case分支都应当有输出值及状态转换。设状态A=3'b111,B=3'b011,C=3'b001,D=3'b100,E=3'b010,F=3'b101,G=3'b110;它们的转换关系图如图2.3: 图 2.3 m序列发生器的状态转移图 方案一的程序比方案二简洁,方案二的思路比方案一更明白。二者的各有千秋。

4级m序列及其Manchester编码 module manchester_encodingnew(enc_data,m_test,clk); parameter BYTE_WIDTH=8; input clk; output enc_data; output m_test; reg phase; reg busy; wire clkr; wire enc_data; reg [2:0] bit_count; reg reg_data; reg Data_CLKT,Buff; reg [3:0]m_Buff; assign clkr=clk; initial begin Data_CLKT=0; busy=0; phase=0; bit_count=0; end always@(posedge clkr) begin Data_CLKT=~Data_CLKT; end always@ (posedge clkr) begin phase=~phase; end always@ (posedge clkr) begin if((bit_count==BYTE_WIDTH-1)&&phase) busy=0;

PC机之间串口通信的实现-Read

PC机之间串口通信的实现 一、实验目的 1.熟悉微机接口实验装置的结构和使用方法。 2.掌握通信接口芯片8251和8250的功能和使用方法。 3.学会串行通信程序的编制方法。 二、实验内容与要求 1.基本要求 主机接收开关量输入的数据(二进制或十六进制),从键盘上按“传输”键(可自行定义),就将该数据通过8251A传输出去。终端接收后在显示器上显示数据。具体操作说明如下: (1)出现提示信息“start with R in the board!”,通过调整乒乓开关的状态,设置8位数据; (2)在小键盘上按“R”键,系统将此时乒乓开关的状态读入计算机I中,并显示出来,同时显示经串行通讯后,计算机II接收到的数据; (3)完成后,系统提示“do you want to send another data? Y/N”,根据用户需要,在键盘按下“Y”键,则重复步骤(1),进行另一数据的通讯;在键盘按除“Y”键外的任意键,将退出本程序。 2.提高要求 能够进行出错处理,例如采用奇偶校验,出错重传或者采用接收方回传和发送方确认来保证发送和接收正确。 三、设计报告要求 1.设计目的和内容 2.总体设计 3.硬件设计:原理图(接线图)及简要说明 4.软件设计框图及程序清单 5.设计结果和体会(包括遇到的问题及解决的方法) 四、8251A通用串行输入/输出接口芯片 由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须要有“接收移位寄存器”(串→并)和“发送移位寄存器”(并→串)。能够完成上述“串←→并”转换功能的电路,通常称为“通用异步收发器”(UART:Universal

FPGA模拟串口自收发-Verilog

实现功能,FPGA里实现从PC串口接收数据,接着把接收到的数据发回去。波特率可选9600bps,可调1bit起始位,8bit数据,1bit停止位,无校验位。 参考《VHDL硬件描述语言与和数字逻辑电路设计》 模块介绍如下 一、串口数据接收模块:特别注意一个数据位占4个clk_bps_4时钟周期。 串口数据接收控制 当数据接收端rxd出现起始位低电平,启动接收控制计数器rx_cnt,置位为8’b0111_00(28), 即rx_cnt[5:2]== 4’b0111(7),rx_cnt*1:0+ == 2'b00(0);一个计数周期开始,伴随clk_bps_4, rx_cnt加1(每一个数据位加4) 串口接收数据移位控制(关键采样点的选取) 每当rx_cnt[1:0] == 2'b01,为了保证在rxd一位数据靠近中间位置采样;每4个clk_bps_4, rx_cnt[5:2]加1当rx_cnt[5:2] == 8,9,10….15,完成8位的数据采样,串并变换 置位标志位rxdF数据接收标志 rxd出现起始位低电平, rxdF置1,表示数据接收开始;当rx_cnt计数到8’b1111_11(63),数据接收完成,rxdF置0 置位标志位rdFULL;//接收锁存器满标志 空闲时rdFULL置0,当数据接收完成,数据锁存到do_latch,同时rdFULL置1,向上层模块表示数据以准备OK,可以来读取;rd置0,表示上层模块开始读取数据,rdFULL置0,表示数据已读走 二、串口数据发送模块:数据发送依赖于wr(低电平有效) 空闲时wr置1,数据发送时wr产生低电平脉冲,wr上升沿将数据锁存到din_latch; 串口数据发送控制: wr由0跳变为1后,启动发送控制计数器tx_cnt,置位为8’b0111_00(28), 即tx_cnt[5:2]== 4’b0111(7),tx_cnt[1:0] == 2'b00(0);一个计数周期开始,伴随clk_bps_4, tx_cnt加1(每一个数据位加4)

基于FPGA的VHDL语言m序列生成详解+源码

说明 可控m序列产生器我分成四个小模块来做,M,M1,M2,M3分别对应为:m序列产生器、控制器、码长选择器、码速率选择器。 一、M: m序列产生器 这是该设计的核心部分,原理就是设计一个通用m序列产生子单元,然后由外部选择器来写入码型,码长等参数,加以循环可连接成任意长度的m序列产生器,其子单元结构如下: 如上图,若N=15,就有15个这样的子单元首尾相接。注意:开头和结尾的两个子单元会有所不同,因为首单元需要输入初值,尾单元要进行直通反馈,在程序里请多留意。 图中,主要部件是一个D触发器,Q(N+1)为上一级输出;Q(N)既是本级输出;CP为选择后的时钟脉冲;B(N)为本级参数选择控制;A(N)受控于B(N),决定本级输出Q(N)是否反馈(B(N)为1时反馈);C(N)为本级反馈;C(N-1)为下一级反馈。具体原理参看m序列组成结构。 此外,本程序还加入了EN(发送控制)、RN(首单元置数)、SEL1(码长选择,即N的选择,N=2-15)、SEL2(码型选择,即正逆码选择)四个控制端,可满足设计要求。OP为码输出端。 二、M1:控制器

控制器主要是将外部的序列发送控制信号STA转换为EN和RN 两个控制信号。其中,EN与STA的波形基本一致,只是它与CP进行了同步处理;RN在EN为‘1’的头一个脉冲周期里置高电平,以达到为序列发生器的首端置数的目的。如果不清楚的话可以看一下它的模拟波形。(注意:STA要采用自锁定开关,高电平有效) 三、M2:码长选择 序列的码长选择既是N值的选择,码长=2**N-1。核心就是一个计数器,可从2计到15。按一次PUSH就可以自动加一(注意:按键建议采用自弹跳按键,如过需要软件清除按键震颤的话,我再做发给你),没有0,1两个状态。如果需要的话还可以扩展7段数码管的接口,以显示N值。 四、M3:码速率选择器 码的传输速率是靠CP来控制的,CP的频率就等于码元速率。这段程序包含一个倍频器,一个5分频的分频器,可把5MHZ的脉冲源CLK扩展成1MHZ和10MHZ。FSEL1、FSLE2、FSEL3分别在选择1、5、10MHZ时为高电平,其余两个为低,建议采用3选1单刀单掷开关。

51单片机和计算机之间实现串口通信的电路图

51单片机和计算机之间实现串口通信的电路图 串口通讯参考程序如下: 来源:深入浅出AVR单片机 #include unsigned char UART_RX; //定义串口接收数据变量 unsigned char RX_flag; //定义穿行接收标记 /**************************************************************************************** ***** 函数名:UART串口初始化函数 调用:UART_init(); 参数:无 返回值:无 结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用) 备注:振荡晶体为12MHz,PC串口端设置[ 4800,8,无,1,无] /**************************************************************************************** ******/ void UART_init (void){ EA = 1; //允许总中断(如不使用中断,可用//屏蔽) ES = 1; //允许UART串口的中断 TMOD = 0x20; //定时器T/C1工作方式2 SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) TH1 = 0xF3; //定时器初值高8位设置 TL1 = 0xF3; //定时器初值低8位设置 PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) TR1 = 1; //定时器启动 } /**************************************************************************************** ******/ /**************************************************************************************** ***** 函数名:UART串口接收中断处理函数 调用:[SBUF收到数据后中断处理] 参数:无 返回值:无 结果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)备注:过长的处理程序会影响后面数据的接收

基于verilog的串口通信实验指导和源程序

自己看了很多材料以后,精心整理的串口通信实验原理和指导,在网上找了很多代码,大部分因为没有很好的注释,看起来很头疼,于是自己写了一份,附带详细的注释,在modelsim仿真器上已经得到验证,现在传上来,仅供参考。 PS1:最后部分给出了一个测试文件,写的非常简单,只是验证了功能,不是很好的测试; PS2:代码部分看上去有点乱,因为在word中代码的层次结构无法清晰显示,如有需要,下载后把代码copy到notepad++这种类似的专用变成工具里面,就很清晰的显示代码和注释了。 第一部分:实验原理串行通信要求的传输线少,可靠性高,传输距离远,被广泛应用于计算机和外设的数据交换。通常都由通用异步收发器(UART)来实现串口通信的功能。在实际应用中,往往只需要UART的几个主要功能,专用的接口芯片会造成资源浪费和成本提高。随着FPGA/CPLD的飞速发展与其在现代电子设计中的广泛应用,FPGA/CPLD功能强大、开发过程投资小、周期短、可反复编程、保密性好等特点也越来越明显。因此可以充分利用其资源,在芯片上集成UART功能模块,从而简化了电路、缩小了体积、提高了可靠性,而且设计时的灵活性更大,周期更短。

UART简介 UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。常常用于短距离、低速、低成本的通讯中。8250、8251、NS16450等芯片都是常见的UART器件。 基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是全双工形式。TXD是UART发送端,为输出;RXD是UART接收端,为输入。 UART的基本特点是: (1)在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。 (2)起始位(Start Bit):发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。 (3)数据位(Data Bits):起始位之后就是传送数据位。数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。 (4)校验位(parity Bit):可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。在使用中,该位常常取消。 (5)停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。 (6)位时间:即每个位的时间宽度。起始位、数据位、校验位的位宽度是一致的,停止位有0.5位、1位、1.5位格式,一般为1位。 (7)帧:从起始位开始到停止位结束的时间间隔称之为一帧。

verilog_m序列代码

// 可综合模块 // 此模块将signal.v 中产生的indata信号进行编码: // 1 编码成为31位的+M序列;0 编码为-M 序列。 // 其中包括了一个5级的移位寄存器用于产生M序列。 `timescale 1ns/1ns module coder( c lk_1, //数据输入时钟 clk_31, //数据输出时钟 indata, //输入数据 outdata, //输出数据 rst, //启动信号 en); //使能信号 input clk_1,clk_31; input rst,en; input indata; output [1:0] outdata; //输出信号:+1表示代码1 ;-1表示代码0 wire [1:0] outdata; reg indata_buf; //输入积存器 reg [4:0] shift_buf; //M序列产生的5位移位积存器 assign outdata =(en)?(((indata_buf^shift_buf[0])==1)?2'b11:2'b01):2'b00; //当en信号高电

平时, //输入信号为1时产生+M序列 //输入信号为-1时产生-M序列 always@(posedge clk_1) //clk_1信号来临则将输入信号indata积存到indata_buf中 indata_buf <=indata; always@(posedge clk_31) begin if(!rst) shift_buf <=5'b10000; //五位初始为10000 if(en) begin shift_buf[4] <=shift_buf[0]^shift_buf[3]; //5级M序列编码规则 shift_buf[0] <= shift_buf[1]; shift_buf[1] <= shift_buf[2]; shift_buf[2] <= shift_buf[3]; shift_buf[3] <= shift_buf[4]; end end

MFC实现对串口通信的编写

在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。计算机和单片机(如MCS-51)都具有串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。 实际工作中利用串口完成通信任务的时候非常之多。已有一些文章介绍串口编程的文章在计算机杂志上发表。但总的感觉说来不太全面,特别是介绍32位下编程的更少,且很不详细。笔者在实际工作中积累了较多经验,结合硬件、软件,重点提及比较新的技术,及需要注意的要点作一番探讨。希望对各位需要编写串口通信程序的朋友有一些帮助 一.串行通信的基本原理 串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。 在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。 应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。 串口通信程序的流程如下图: 二.串口信号线的接法 一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。25芯和9芯的主要信号线相同。以下的介绍是以25芯的RS-232C为例。 ①主要信号线定义: 2脚:发送数据TXD; 3脚:接收数据RXD; 4脚:请求发送RTS; 5脚:清除发送CTS; 6脚:数据设备就绪DSR;20脚:数据终端就绪DTR;8脚:数据载波检测DCD; 1脚:保护地; 7脚:信号地。 ②电气特性: 数据传输速率最大可到20K bps,最大距离仅15m. 注:看了微软的MSDN 6.0,其Windows API中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到RS_256000,即256K bps! 也不知道到底是什么串

Verilog实现串口接收多帧数据

`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 19:50:45 04/19/2015 // Design Name: // Module Name: Serial_Decoder // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// module Serial_Decoder( input wire clk_seri, //串口时钟,用于从串口发送命令给FPGA input wire rst, input wire RxD, output reg[1:0] modu_sel, //BPSK,QPSK,8PSK选择 output reg[13:0] ser_asf, //由串口发过来的asf output reg[31:0] ser_ftw, //由串口发过来的ftw output reg cmd_done, //上位机给FPGA发送指令结束 output reg[31:0] dina, //ROM存储器,用于存储外部PN码 output reg wea, output reg[1:0] addra ); reg cmd_rdy;//指令接收完成 reg [3:0] instr_code;//用于分辨命令,是asf还是ftw还是外部PN码 reg [31:0] cmd_data; //接收从上层发过来的命令 wire RxD_data_ready;

实验四串口接收模块电路设计

实验四串口接收模块电路设计 一、实验目的: 1、熟练使用ISE设计工具。 2、理解串口传输协议。理解采用“自顶向下”设计思路,分解模块的方法。 3、在ISE使用Verilog HDL设计串口接收模块,完成仿真、下载。 二、原理分析 (一)串口传输协议概述 设计完成异步串口通信通用异步收发是一种典型的异步串口通信,简称UART。串口通信时序如图1所示。 图1 通用异步收发时序图 由图1可以看出,在没有数据传送时,通信线会一直处于高电平,即逻辑1状态;当有数据传送时,数据帧以起始位开始,以停止位结束。起始位为低电平,即逻辑0状态;停止位为高电平,即逻辑1状态,其持续时间可选为1位、1.5位或2位(本次设计选择持续时间1位)。接收端在接收到停止位后,知道一帧数据已经传完,转为等待数据接收状态;只要再接收到0状态,即为新一帧数据的起始状态。 数据帧的数据位低位(LSB)在前,高位(MSB)在后,根据不同的编码规则,数据位可能为5位、6位、7位或者8位(本次设计数据位定位8位)。校验位也可根据需要选择奇校验、偶校验或者不要校验(本次设计不要校验位)。 (二)串口时序分析 串口通讯常用“波特率”表述串口传输速率,常用的参数有9600 bps 和115200 bps等。在硬件传输角度看,波特率表征了传输一位数据所需要的时间。例如:波特率是9600 bps,传输一位数据的时间是1/9600= 0.000104166666666667秒。如果FPGA系统时钟是20MHZ,则一位数据传输时间相当于(1/9600)/(1/20M)=2083个20MHZ时钟周期。 设一帧数据位数=1(开始位)+8(数据位)+1(校验位)+1(结束位)=11位,所以传输一帧数据的时间是11*1/9600=0.00114583333333333333333333333333秒。 为了稳定采集串口数据帧的数据,需要在每位数据的“中间时刻”采样,由此,需要在每位数据开始时刻对时钟进行计数,若系统时钟是20MHZ,则在计数至2083/2=1042时采样此时刻的数值。 三、系统分析: 为实现串口接收电路,FPGA应该完成: 1、及时发现数据传输的开始,并判断每一位的开始。 2、按照“在数据位中间采样”的要求,确认采样时刻。 3、将采样得到串行数据转换为并行数据。

串口通讯设计之Verilog实现

串口通讯设计之 V e r i l o g实现 Revised as of 23 November 2020

串口通讯设计之V e r i l o g实现 FPGA串口模块是将由RS-485发送过来的数据进行处理,提取出8位有效数据,并按异步串口通讯的格式要求输出到MAX3223的12脚。FPGA选用Xilinx公司的SpartanII系列xc2s50。此部分为该设计的主体。如上所述,输入数据的传输速率为700k波特率。为了使FPGA能够正确地对输入数据进行采样,提高分辨率能力和抗干扰能力,采样时钟必须选用比波特率更高的时钟,理论上至少是波特率时钟的2倍。 1 串口通信基本特点随着多微机系统的应用和微机网络的发展,通信功能越来越显得重要。串行通信是在一根传输线上一位一位地传送信息.这根线既作数据线又作联络线。串行通信作为一种主要的通信方式,由于所用的传输线少,并且可以借助现存的电话网进行信息传送,因此特别适合于远距离传送。在串行传输中,通信双方都按通信协议进行,所谓通信协议是指通信双方的一种约定。约定对数据格式、同步方式、传送速度、传送步骤、纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。异步起止式的祯信息格式为:每祯信息由四部分组成: 位起始位。 ~8位数据位。传送顺序是低位在前,高位在后.依次传送。c.一位校验位,也可以没有。d.最后是1位或是2位停止位。 FPGA(Field Pmgrammable Gate Array)现场可编程门阵列在数字电路的设计中已经被广泛使用。这种设计方式可以将以前需要多块集成芯片的电路设计到一块大模块可编程逻辑器件中,大大减少了电路板的尺寸,增强了系统的可靠性和设计的灵活性。本文详细介绍了已在实际项目中应用的基于FPGA的串口通讯设计。 本设计分为硬件电路设计和软件设计两部分,最后用仿真验证了程序设计的正确性。 2 系统的硬件设计 本方案的异步串行通信的硬件接口电路图如图1所示,主要由四部分组成:RS-485数据发送模块、FPGA 串口模块、MAX3223和DB9。各部分功能简述如下: RS-485数据发送模块是将前续电路的数据发送到FPGA,供本电路处理,亦即本电路的输入。RS485是符合RS-485和RS-4225串口标准的低功耗半双工收发器件,有和5V两种,在本设计中选用了的器件SP3485。 在本设计中。485的7脚和8脚与前端信号相连接,用于接收输入的数据。数据格式是这样的:一帧数据有25位,报头是16个高电平和1个低电平,接下来是 8位有效的数据。传输速率为700k波特率。2脚是使能端,与FPGA的I/O口相连,由FPGA提供逻辑控制信号。1脚和4脚也与FPGA相连,由 FPGA对输入数据进行处理。 FPGA串口模块是将由RS-485发送过来的数据进行处理,提取出8位有效数据,并按异步串口通讯的格式要求输出到MAX3223的12脚。FPGA选用Xilinx公司的Spartan II系列xc2s50。此部分为该设计的主体。如上所述,输入数据的传输速率为700k波特率。为了使FPGA能够正确地对输入数据进行采样,提高分辨率能力和抗干扰能力,采样时钟必须选用比波特率更高的时钟,理论上至少是波特率时钟的2倍。在本设计中选用4倍于波特率的时钟,利用这种4倍于波特率的接收时钟对串行数据流进行检测和定位采样,接收器能在一个位周期内采样4次。如果没有这种倍频关系,定位采样频率和传送波特率相同,则在一个位周期中,只能采样一次,分辨率会差。比如,为了检测起始位下降沿的出现,在起始位的前夕采样一次之后,下次采样要到起始位结束前夕才进行。而假若在

相关主题
文本预览
相关文档 最新文档