经测试的FPGA串口通信VHDL程序

合集下载

基于fpga的串口设计及实现

基于fpga的串口设计及实现

基于fpga的串口设计及实现
基于FPGA的串口设计及实现是一个涉及数字电路设计和通信协
议的复杂课题。

首先,让我们从串口通信的基本原理开始。

串口通信是一种通过串行传输数据的通信方式,它使用一个或
多个数据线(通常是一对)来逐位地传输数据。

常见的串口通信标
准包括RS-232、RS-485、UART等。

在FPGA中实现串口通信,需要
考虑以下几个方面:
1. 串口通信协议选择,根据具体的应用场景和需求,选择合适
的串口通信协议。

例如,UART是一种常见的串口通信协议,它使用
起始位、数据位、校验位和停止位来传输数据。

2. 串口通信接口设计,在FPGA中设计串口通信接口,需要考
虑数据的发送和接收,时钟信号的同步等问题。

通常需要使用FPGA
的IO资源来实现串口通信接口。

3. 串口通信协议的实现,在FPGA中实现选择的串口通信协议,包括数据的发送和接收、时序控制、校验等功能。

这通常需要使用Verilog或VHDL等硬件描述语言进行开发。

4. 硬件调试和验证,设计完成后,需要进行硬件调试和验证,包括时序分析、波形仿真等工作,确保串口通信的稳定和可靠。

在实际的FPGA串口设计中,还需要考虑时钟频率、数据传输速率、数据格式、数据校验、中断处理等问题。

此外,还需要考虑FPGA与外部设备的接口,如与传感器、显示器、存储器等设备的接口设计。

总之,基于FPGA的串口设计及实现涉及到硬件设计、数字电路设计、通信协议等多个方面的知识,需要综合考虑各种因素,进行全面的设计和实现。

基于FPGA的串口通信设计

基于FPGA的串口通信设计

基于FPGA的串口通信设计引言:串口通信是现代计算机通信系统中的常见通信方式。

它可以在计算机和外部设备之间传输数据,具有低成本、简单易懂、可靠性高等特点。

然而,在一些应用场景下,传统的软件串口通信无法满足需求,因此使用FPGA来实现硬件串口通信变得愈发重要。

本文将重点介绍基于FPGA的串口通信设计,包括串口通信原理、FPGA硬件实现以及设计注意事项。

一、串口通信原理:串口通信的原理很简单,将数据通过一根导线(或多根导线)依次发送和接收。

它使用一个起始位、数据位(常为8位)、奇偶校验位(可选)和一个或多个停止位来组成一个数据帧。

发送数据时,串口将数据帧从最低位开始逐位发送,并在每位发送完毕后根据波特率发送下一位。

接收数据时,串口根据波特率和起始位检测到数据的到来,并从起始位开始逐位接收。

二、FPGA硬件实现:FPGA可以通过其可编程逻辑单元(FPGA的核心组件)实现硬件串口通信。

下面是基于FPGA的串口通信设计主要步骤:1.FPGA引脚分配:首先,选择合适的FPGA芯片,并确定通信所需的引脚数量。

然后,根据引脚分配表将引脚与FPGA的可编程逻辑单元相连接。

2.接口电平转换:在FPGA和外设之间可能存在电平不匹配的情况。

为了实现正确的数据传输,需要使用电平转换电路进行适配。

3.帧同步信号生成:FPGA需要生成适当的时钟信号和帧同步信号,以使数据能够正确地按位传输和接收。

帧同步信号指示数据的起始和终止。

4.数据传输实现:FPGA需要根据串口通信原理,按照波特率逐位地发送和接收数据。

在发送数据时,FPGA将数据从最低位开始逐位输出到引脚,并根据起始位、数据位、奇偶校验位和停止位生成完整的数据帧。

在接收数据时,FPGA根据时钟信号和帧同步信号,逐位地接收到达的数据,以获得完整的数据帧。

5.数据校验和处理:FPGA可以实现奇偶校验的功能,以检测接收到的数据是否正确。

此外,还可以在FPGA内部对接收到的数据进行处理,例如数据解码、错误检测等。

基于FPGA串口通信的电路和程序设计

基于FPGA串口通信的电路和程序设计

中北大学毕业设计中期总结学生姓名:袁财源学号:1206044145学院:仪器科学与技术专业:电子科学与技术设计题目:基于FPGA串口通信的电路和程序设计指导教师:郭涛2015 年1月5日毕业设计中期总结1.开题以来所做的具体工作和取得的进展或成果(方案、图纸、代码等支撑,任务书要求与已完成工作对照表)1.设计方案RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道,在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。

使用RS232串口通信接口模块的目的是用于电平转换。

由于FPGA输出的TTL电平与串口发送的电平不一致,因此,采用电平转换器MAX232。

MAX232是一种双组驱动器/接收器,片内含有一个电容性电压发生器,以便在单5V电源供电时提供EIA/TIA-232-E电平,来实现RS232信号和单片机串口信号之间的电平转换。

其工作电压3.0-5.5V,可将TTL电平转换成RS-232标准电平。

从而实现了FPGA与上位机之间的串口通信。

FPGA上位机MAX232电路主要框图2.相关知识MAX232芯片结构第一部分是电荷泵电路。

由1、2、3、4、5、6脚和4只电容构成。

功能是产生+12v 和-12v两个电源,提供给RS-232串口电平的需要。

第二部分是数据转换通道。

由7、8、9、10、11、12、13、14脚构成两个数据通道。

其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。

8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。

TTL/CMOS数据从11引脚(T1IN)、10引脚(T2IN)输入转换成RS-232数据从14脚(T1OUT)、7脚(T2OUT)送到电脑DB9插头;DB9插头的RS-232数据从13引脚(R1IN)、8引脚(R2IN)输入转换成TTL/CMOS数据后从12引脚(R1OUT)、9引脚(R2OUT)输出。

fpga设计中vhdl语言简介

fpga设计中vhdl语言简介

fpga设计中vhdl语言简介
VHDL是一种硬件描述语言(HDL),旨在帮助工程师和设计师进行复杂电路和系统的设计和仿真。

VHDL语言是由美国国防部发起的,现在已经成为全球应用最广泛的HDL之一。

VHDL语言的基础包括三个部分:实体(entity)、体(architecture)和过程(process)。

实体定义组件的接口,在其内部,architecture结构体提供了具体的实现。

过程是编写复杂操作的基本方式,类似于C语言中的函数。

VHDL语言的数据类型包括标准逻辑类型,如布尔、位和字符类型,以及更复杂的数据类型,如数组和记录类型。

此外,VHDL也支持自定义数据类型。

在FPGA设计中,VHDL语言的主要作用是设计和实现可编程逻辑电路。

VHDL语言描述的电路可以在硬件上运行,也可以使用仿真器进行验证和测试。

总体而言,VHDL语言是一种强大的硬件描述语言,对于设计和实现复杂的电路和系统非常有用。

在FPGA设计中,VHDL语言是必不可少的一部分。

FPGA和单片机串行通信接口的实现

FPGA和单片机串行通信接口的实现

FPGA和单片机串行通信接口的实现FPGA(Field-Programmable Gate Array)和单片机(Microcontroller)是两种常用的数字电子设备,它们在串行通信接口方面有不同的实现方式。

首先,我们需要了解串行通信是一种将数据以位的形式逐个传输的通信方式。

常见的串行通信协议包括UART(Universal Asynchronous Receiver/Transmitter)、SPI(Serial Peripheral Interface)和I2C (Inter-Integrated Circuit)等。

对于FPGA和单片机之间的串行通信,我们可以基于以下几种方式进行实现:1. UART:UART是一种常见的串行通信协议,可以实现全双工的通信。

在FPGA和单片机之间建立UART通信,需要在FPGA中实现UART模块,并将其与单片机的UART接口连接。

在FPGA中,我们可以使用硬件语言(如Verilog或VHDL)来实现UART模块,该模块负责将FPGA内部的数据通过UART协议进行封装和解封装。

单片机与FPGA之间通过TX(发送)和RX (接收)引脚建立连接。

单片机可以通过串口发送数据给FPGA,FPGA接收到数据后进行处理,然后再通过串口将处理后的数据发送给单片机。

2.SPI:SPI是一种用于片上外设之间通信的串行通信协议,常用于FPGA与外部设备(例如传感器、显示器等)之间的通信。

在FPGA和单片机之间建立SPI通信,需要在FPGA中实现SPI控制器,并将其与单片机的SPI接口连接。

FPGA通过把数据写入SPI发送缓冲区或从SPI接收缓冲区读取数据来实现与单片机的通信。

单片机通过控制SPI接口的时钟、数据和使能信号来与FPGA进行数据传输。

3.I2C:I2C是一种双线制串行总线,常用于连接多个设备的系统,例如FPGA、单片机和其他外部设备之间的通信。

在FPGA和单片机之间建立I2C通信,需要在FPGA中实现I2C控制器,并将其与单片机的I2C接口连接。

FPGA VHDL

FPGA  VHDL

12:29
点评:等待时钟边沿,可以为clk说明一个表示周期的常量,wait语句使 说明一个表示周期的常量, 点评:等待时钟边沿,可以为 说明一个表示周期的常量 语句使 用该常量表示等待一个周期。 用该常量表示等待一个周期。 例如: 例如: constant period : time :=100ns; wait for period;
测试基准
检查模型的输出信号 例2也可以使用输出信号: 也可以使用输出信号: 也可以使用输出信号 Process(out_model, in_model) Begin if out_model=‘1’ and in_model=‘1’ then test_ok<=‘0’; end if; End process;
12:29
点评:如果输出信号和输入信号相同,模拟器停下来并打印错误信息。 点评:如果输出信号和输入信号相同,模拟器停下来并打印错误信息。 上面的例子包含一个if语句,决定assert语句是否执行。断言条件 上面的例子包含一个 语句,决定 语句是否执行。 语句 语句是否执行 永远为假。 永远为假。
14

但是, VHDL中有两类延时模型能用于行为仿真建模: 但是,在VHDL中有两类延时模型能用于行为仿真建模:固有延时和 中有两类延时模型能用于行为仿真建模 传输延时。(仅用于仿真,不被综合)。 传输延时。(仅用于仿真,不被综合)。 。(仅用于仿真
5
延时模型

12:29
固有延时 固有延时(惯性延时),是任何电子器件都存在的一种延时特性。 固有延时(惯性延时),是任何电子器件都存在的一种延时特性。物 ),是任何电子器件都存在的一种延时特性 理机制是器件的电容分布效应。 理机制是器件的电容分布效应。 当信号的脉宽小于器件的固有延时时, 当信号的脉宽小于器件的固有延时时,器件对输入的信号不作任何反 应。为了使器件对输入信号的变化产生响应,就必须使信号的脉宽大于 为了使器件对输入信号的变化产生响应, 固有延时。 固有延时。 VHDL中将固有延时默认为一个无穷小量 VHDL中将固有延时默认为一个无穷小量 。但由于不同物理特性的 器件的固有延时是不同的, 器件的固有延时是不同的,为了在行为仿真中更加逼真地模仿电路的这 种延时特性,VHDL提供了有关的语句: 种延时特性,VHDL提供了有关的语句: 提供了有关的语句 Z<=X and Y after 5 ns ; Z<=X and Y ;

FPGA设计与应用 串口通信实验

FPGA设计与应用 串口通信实验

H a r b i n I n s t i t u t e o f T e c h n o l o g y实验报告课程名称: FPGA设计与应用实验题目:串口通信实验院系:电子与信息工程学院班级: 1005104 姓名:原亚欣学号: 1100500235 实验时间: 2013年11月哈尔滨工业大学串口通信实验一、实验目的1、了解串口通信的基本原理;2、掌握锁相环的基本原理和使用方法;3、掌握起始位和停止位的含义及实现方法;4、掌握VHDL状态机的基本使用方法;5、掌握基本的接口设计和调试技巧;二、实验准备2.1 串口通信原理串口通信指口按位发送和接收字节。

通信使用3根线完成,分别是地线、发送、接收。

由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。

其他线用于握手,但不是必须的。

串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。

对于两个进行通信的端口,这些参数必须匹配。

波特率表示每秒传输的位数,接受发送双方必须匹配。

不发送数据时,连线上为高电平。

发送数据时,要首先发送一个起始位,为低电平,然后按照协议发送需要的数据,八位或者九位(带有校验位),然后发送一个停止位,为高电平。

接收时,要首先确定起始位,然后按照协议接受八位或者九位数据。

接受完成后继续判断起始位,开始下一个接受周期。

2.2 锁相环的基本原理参考频率源压控振荡器环路滤波器鉴相器程序分频器频率输出锁相环的框图如上所示,主要包括:相器、环路滤波器、压控振荡器、分频器构成。

鉴相器用来鉴别输入信号与输出信号之间的相位差,并输出误差电压Ud。

Ud 中的噪声和干扰成分被低通性质的环路滤波器滤除,形成压控振荡器的控制电压Uc。

Uc作用于压控振荡器的结果是把它的输出振荡频率fo拉向环路输入信号频率fi,当二者相等时,环路被锁定,称为入锁。

维持锁定的直流控制电压由鉴相器提供,因此鉴相器的两个输入信号间留有一定的相位差。

三、源代码及测试结果3.1 串口发送程序及分析library IEEE;use IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity yyx_shiyan2_tx isPort ( yyx_clkin : in STD_LOGIC;yyx_txd : out STD_LOGIC;yyx_datain : in STD_LOGIC_VECTOR (3 downto 0));end yyx_shiyan2_tx;architecture Behavioral of yyx_shiyan2_tx isTYPE uart_state_type IS (state_idle,state_start,state_shift,state_stop);SIGNAL yyx_clk_buf:STD_LOGIC:='0';SIGNAL yyx_cnt: STD_LOGIC_VECTOR (26 DOWNTO 0);SIGNAL state:uart_state_type:=state_idle;SIGNAL yyx_data_tx:STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL yyx_stop_cnt:std_logic_vector(7 downto 0);beginPROCESS(yyx_clkin)BEGINIF yyx_clkin'event and yyx_clkin='1' THENIF yyx_cnt<217 THENyyx_cnt<=yyx_cnt+1;yyx_clk_buf<='0';ELSIF yyx_cnt<434 THENyyx_cnt<=yyx_cnt+1;yyx_clk_buf<='1';elseyyx_cnt<=(OTHERS=>'0');yyx_clk_buf<='0';END IF;end if;END PROCESS;PROCESS(yyx_clk_buf)V ARIABLE number:INTEGER RANGE 7 DOWNTO 0;BEGINIF rising_edge(yyx_clk_buf) THENCASE state ISWHEN state_idle=>yyx_txd<='1';yyx_data_tx (7 DOWNTO 4)<=yyx_datain;yyx_data_tx (3 DOWNTO 0)<=NOT yyx_datain;state<=state_start;WHEN state_start=>yyx_txd<='0';number:=0;state<=state_shift;WHEN state_shift=>yyx_txd<=yyx_data_tx(number);IF number<7 THENnumber:=number+1;state<=state_shift;ELSEyyx_stop_cnt<=X"00";state<=state_stop;END IF;WHEN state_stop=>yyx_txd<='1';IF yyx_stop_cnt>=X"AA" THENyyx_stop_cnt<=X"00";state<=state_idle;ELSEyyx_stop_cnt<=yyx_stop_cnt+1;state<=state_stop;END IF;WHEN OTHERS=>state<=state_idle;END CASE;END IF;END PROCESS;end Behavioral;发送部分有两个输入和一个输出。

fpga串口通信的verilog驱动

fpga串口通信的verilog驱动

fpga串⼝通信的verilog驱动 串⼝的全程为串⾏接⼝,也称为串⾏通信接⼝,是采⽤串⾏通信⽅式的扩展接⼝。

与串⼝对应的并⾏接⼝,例如⾼速AD和DA,这些都是⽤的并⾏接⼝,⽽且在编程也简单⼀些。

串⼝有⼀下特点: (1)通信线路简单,只要⼀对传输线就可以实现双向通信。

(2)布线简单,成本低。

(3)通信距离长,可以实现数⽶到数千⽶的通信距离。

(4)传输速率慢。

常见的串⼝速率如4800 , 9600 , 115200bps,代表每秒钟发送多少bit数据,例如9600bps就代表1秒内发送9600bit数据。

  串⼝协议:协议⽐较简单,⼀般都是10位数据,1个起始位低电平,然后⼋个数据位,低位在前,⼀个奇偶校验位,平时⼀般不⽤,最后是⼀位停⽌位⾼电平,这样⼀帧数据发送结束。

下⾯介绍⼀下我的程序框架: 整体框架分为两个部分:⼀个是串⼝驱动部分另⼀个是串⼝数据控制部分。

串⼝驱动部分负责串⼝驱动和波特率的选择,串⼝数据控制模块 负责控制数据内容的控制和发送速度的控制。

从上⾯时序图可以看出,每10ms发送⼀帧数据,这⾥data_en负责波特率驱动使能,uart_tx_end有两个功能,⼀个是关闭data_en使能,另⼀个是给10ms计数器清零。

/*-----------------------------------------------------------------------Date : 2017-09-03Description : Design for uart_driver.-----------------------------------------------------------------------*/ module uart_tx_driver(//global clockinput clk , //system clock input rst_n , //sync reset//uart interfaceoutput reg uart_tx ,//user interfaceinput [1:0] bps_select , //波特率选择input [7:0] uart_data ,input data_en , //发送数据使能output reg uart_tx_end);//--------------------------------//Funtion : 参数定义parameter BPS_4800 = 14'd10417 ,BPS_9600 = 14'd5208 ,BPS_115200 = 14'd434 ;reg [13:0] cnt_bps_clk ;reg [13:0] bps ;reg bps_clk_en ; //bps使能时钟reg [3:0] bps_cnt ;wire [13:0] BPS_CLK_V = bps >> 1 ;//--------------------------------//Funtion : 波特率选择always @(posedge clk or negedge rst_n)beginif(!rst_n)bps <= 1'd0;else if(bps_select == 2'd0)bps <= BPS_115200;else if(bps_select == 2'd1)bps <= BPS_9600;elsebps <= BPS_4800;end//--------------------------------//Funtion : 波特率计数always @(posedge clk or negedge rst_n)beginif(!rst_n)cnt_bps_clk <= 1'd0;else if(cnt_bps_clk >= bps - 1 && data_en == 1'b0)cnt_bps_clk <= 1'd0;elsecnt_bps_clk <= cnt_bps_clk + 1'd1;end//--------------------------------//Funtion : 波特率使能时钟always @(posedge clk or negedge rst_n)beginif(!rst_n)bps_clk_en <= 1'd0;else if(cnt_bps_clk == BPS_CLK_V - 1)bps_clk_en <= 1'd1;elsebps_clk_en <= 1'd0;end//--------------------------------//Funtion : 波特率帧计数always @(posedge clk or negedge rst_n)beginif(!rst_n)bps_cnt <= 1'd0;else if(bps_cnt == 11)bps_cnt <= 1'd0;else if(bps_clk_en)bps_cnt <= bps_cnt + 1'd1;end//--------------------------------//Funtion : uart_tx_endalways @(posedge clk or negedge rst_n)beginif(!rst_n)uart_tx_end <= 1'd0;else if(bps_cnt == 11)uart_tx_end <= 1'd1;elseuart_tx_end <= 1'd0;end//--------------------------------//Funtion : 发送数据always @(posedge clk or negedge rst_n)beginif(!rst_n)uart_tx <= 1'd1;else case(bps_cnt)4'd0 : uart_tx <= 1'd1;4'd1 : uart_tx <= 1'd0; //begin4'd2 : uart_tx <= uart_data[0];//data4'd3 : uart_tx <= uart_data[1];4'd4 : uart_tx <= uart_data[2];4'd5 : uart_tx <= uart_data[3];4'd6 : uart_tx <= uart_data[4];4'd7 : uart_tx <= uart_data[5];4'd8 : uart_tx <= uart_data[6];4'd9 : uart_tx <= uart_data[7];4'd10 : uart_tx <= 1; //stopdefault : uart_tx <= 1;endcaseendendmodule/*-----------------------------------------------------------------------Date : 2017-XX-XXDescription : Design for .-----------------------------------------------------------------------*/module uart_tx_control(//global clockinput clk , //system clockinput rst_n , //sync reset//user interfaceoutput reg [7:0] uart_data ,output reg data_en ,input uart_tx_end);//--------------------------------//Funtion : 参数定义parameter DELAY_10MS = 500_000 ;reg [31:0] cnt_10ms ;wire delay_10ms_done ;//data definereg [31:0] cnt_1s;//--------------------------------//Funtion : cnt_10msalways @(posedge clk or negedge rst_n)beginif(!rst_n)cnt_10ms <= 1'd0;else if(cnt_10ms == DELAY_10MS - 1 && uart_tx_end == 1'd1)cnt_10ms <= 1'd0;elsecnt_10ms <= cnt_10ms + 1'd1;endassign delay_10ms_done = (cnt_10ms == DELAY_10MS - 1) ? 1'd1 : 1'd0; //--------------------------------//Funtion : data_enalways @(posedge clk or negedge rst_n)beginif(!rst_n)data_en <= 1'd0;else if(delay_10ms_done)data_en <= 1'd1;else if(uart_tx_end)data_en <= 1'd0;end///////////////////////数据测试///////////////////////////////--------------------------------//Funtion : cnt_1salways @(posedge clk or negedge rst_n) beginif(!rst_n)cnt_1s <= 1'd0;else if(cnt_1s == 49_999_999)cnt_1s <= 1'd0;elsecnt_1s <= cnt_1s + 1'd1;end//--------------------------------//Funtion : uart_dataalways @(posedge clk or negedge rst_n) beginif(!rst_n)uart_data <= 1'd0;else if(uart_data >= 10)uart_data <= 1'd0;else if(cnt_1s == 49_999_999)uart_data <= uart_data + 1'd1; endendmodule。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三、FPGA串行通用异步收发器设计实验目的:1、掌握QuartusII6.0等EDA工具软件的基本使用;2、熟悉VHDL硬件描述语言编程及其调试方法;3、学习用FPGA实现接口电路设计。

实验内容:本实验目标是利用FPGA逻辑资源,编程设计实现一个串行通用异步收发器。

实验环境为EDA实验箱。

电路设计采用VHDL硬件描述语言编程实现,开发软件为QuartusII6.0。

1、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)帧:从起始位开始到停止位结束的时间间隔称之为一帧。

(8)波特率:UART的传送速率,用于说明数据传送的快慢。

在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。

如波特率9600=9600bps(位/秒)。

UART的数据帧格式为:FPGA UART系统组成:如下图所示,FPGA UART由三个子模块组成:波特率发生器;接收模块;发送模块;2、模块设计:系统由四部部分组成:顶层模块;波特率发生器;UART接收器;UART发送器1)顶层模块异步收发器的顶层模块由波特率发生器、UART接收器和UART发送器构成。

UART发送器的用途是将准备输出的并行数据按照基本UART帧格式转为TXD信号串行输出。

UART接收器接收RXD串行信号,并将其转化为并行数据。

波特率发生器就是专门产生一个远远高于波特率的本地时钟信号对输入RXD不断采样,使接收器与发送器保持同步。

2)波特率发生器波特率发生器实际上就是一个分频器。

可以根据给定的系统时钟频率(晶振时钟)和要求的波特率算出波特率分频因子,算出的波特率分频因子作为分频器的分频数。

波特率分频因子可以根据不同的应用需要更改。

3)UART接收器由于串行数据帧和接收时钟是异步的,由逻辑1转为逻辑0可以被视为一个数据帧的起始位。

然而,为了避免毛刺影响,能够得到正确的起始位信号,必须要求接收到的起始位在波特率时钟采样的过程中至少有一半都是属于逻辑0才可认定接收到的是起始位。

由于内部采样时钟bclk周期(由波特率发生器产生)是发送或接收波特率时钟频率的16倍,所以起始位需要至少8个连续bclk周期的逻辑0被接收到,才认为起始位接收到,接着数据位和奇偶校验位将每隔16个bclk周期被采样一次(即每一个波特率时钟被采样一次)。

如果起始位的确是16个bclk周期长,那么接下来的数据将在每个位的中点处被采样。

UART接收器的接收状态机接收状态机一共有5个状态:R_START(等待起始位);R_CENTER(求中点);R_W AIT(等待采样);R_SAMPLE(采样);R_STOP(停止位接收)。

R_ST ART状态当UART接收器复位后,接收状态机将处于这一个状态。

在此状态,状态机一直在等待RXD的电平跳转,从逻辑1变为逻辑0,即起始位,这意味着新的一帧UART数据帧的开始,一旦起始位被确定,状态机将转入R_CENTER状态。

状态图中的RXD_SYNC信号是RXD的同步信号,因为在进行逻辑1或逻辑0判断时,不希望检测的信号是不稳定的,所以不直接检测RXD信号,而是检测经过同步后的RXD_SYNC信号。

R_CENTER状态对于异步串行信号,为了使每一次都检测到正确的位信号,而且在较后的数据位检测时累计误差较小,显然在每位的中点检测是最为理想的。

在本状态,就是由起始位求出每位的中点,通过对bclk的个数进行计数(RCNT16),但计数值不是想当然的“1000”,要考虑经过一个状态,也即经过了一个bclk周期,所希望得到的是在采样时1/2位。

另外,可能在R_START状态检测到的起始位不是真正的起始位,可能是一个偶然出现的干扰尖脉冲(负脉冲)。

这种干扰脉冲的周期是很短的,所以可以认为保持逻辑0超过1/4个位时间的信号一定是起始位。

R_W AIT状态当状态机处于这一状态,等待计满15个bclk,在第16个bclk是进入R_SAMPLE状态进行数据位的采样检测,同时也判断是否采集的数据位长度已达到数据帧的长度(FRAMELEN),如果到来,就说明停止位来临了。

FRAMELEN在设计时是可更改的(使用了Generic),在本设计中默认为8,即对应的UART工作在8位数据位、无校验位格式。

R_SAMPLE状态即数据位采样检测,完成后无条件状态机转入R_WAIT状态,等待下次数据位的到来。

R_STOP状态无论停止位是1还是1.5位,或是2位,状态机在R_STOP不具体检测RXD,只是输出帧接收完毕信号(REC_DONE<=‘1’),停止位后状态机转回到R_START状态,等待下一个帧的起始位。

4)UART发送器发送器只要每隔16个bclk周期输出1个数据即可,次序遵循第1位是起始位,第8位是停止位。

在本设计中没有校验位,但只要改变Generic参数FrameLen,也可以加入校验位,停止位是固定的1位格式。

发送状态机的状态图发送状态机一共有5个状态:X_IDLE(空闲);X_START(起始位);X_WAIT(移位等待);X_SHIFT(移位);X_STOP(停止位)。

X_IDLE状态:当UART被复位信号复位后,状态机将立刻进入这一状态。

在这个状态下,UART的发送器一直在等待一个数据帧发送命令XMIT_CMD。

XMIT_CMD_P信号是对XMIT_CMD的处理,XMIT_CMD_P是一个短脉冲信号。

这时由于XMIT_CMD是一个外加信号,在FPGA之外,不可能对XMIT_CMD的脉冲宽度进行限制,如果XMIT_CMD有效在UART发完一个数据帧后仍然有效,那么就会错误地被认为,一个新的数据发送命令又到来了,UART发送器就会再次启动UART帧的发送,显然该帧的发送是错误的。

在此对XMIT_CMD进行了脉冲宽度的限定,XMIT_CMD_P就是一个处理后的信号。

当XMIT_CMD_P=‘1’,状态机转入X_START,准备发送起始位。

X_ST ART状态:在这个状态下,UART的发送器一个位时间宽度的逻辑0信号至TXD,即起始位。

紧接着状态机转入X_W AIT状态。

XCNT16是bclk的计数器X_W AIT状态同UART接收状态机中的R_W AIT状态类似。

X_SHIFT状态当状态机处于这一状态时,实现待发数据的并串转换。

转换完成立即回到X_WAIT状态。

X_STOP停止位发送状态,当数据帧发送完毕,状态机转入该状态,并发送16个bclk周期的逻辑1信号,即1位停止位。

状态机送完停止位后回到X_IDLE状态,并等待另一个数据帧的发送命令。

实验步骤:1、创建工程文件按照Quartus软件新建工程向导建立工程,工程名设为:uart_test(可自行命名)。

2、子模块电路设计(包括各个模块的功能仿真)1)波特率发生器程序编写:在“文件”菜单下选择“New”,在弹出的窗口点击“VHDL File”点击“OK”打开vhdl编辑窗口。

编辑输入波特率发生器程序,编辑完毕后保存,文件名保存为“baud”(注:文件名必须与程序中实体名一致)选中“Add file to current project”选项,添加当前文件到项目。

--文件名:baud.vhd.--功能:本实验想要实现的波特率为:9600,EDA实验箱上晶振频率为:4MHZ,--波特率发生器的分频数计算如下式:--4000000/(16*9600)=26library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity baud isgeneric(framlenr:integer:=26);Port (clk,resetb:in std_logic;bclk :out std_logic);end baud;architecture Behavioral of baud isbeginprocess(clk,resetb)variable cnt:integer;beginif resetb='1' then cnt:=0; bclk<='0'; --复位elsif rising_edge(clk) thenif cnt>=framlenr then cnt:=0; bclk<='1';--设置分频系数else cnt:=cnt+1; bclk<='0';end if;end if;end process;end Behavioral;文件编译:保存文件后,选择“Project”菜单,点击“Set as Top-Level Entity”项,把当前文件设置为顶层实体。

(注:Quartus环境下所有操作(综合、编译、仿真、下载等)都只对顶层实体进行,所以编译任何程序前,必须先设置该选项,把当前要编译的文件设置为顶层实体后,才能对该文件进行编译等操作)打开“Processing”菜单,点击“Start Compilation”执行完全编译状态窗口显示编译过程进度信息编译结束,系统会弹出编译结束窗口,报告错误与警告数,点击“确定”。

编译报告给出所有编译结果信息,包括硬件信息、资源占用率等。

相关文档
最新文档