文档库 最新最全的文档下载
当前位置:文档库 › 基于FPGA的串口实验

基于FPGA的串口实验

基于FPGA的串口实验
基于FPGA的串口实验

基于Verilog的串口实验报告

一、前言

随着计系统和网络的快速发展,通信发挥的作用越来越重要。在电路设计和制作上越来越多的采用数字化指令, 在一个系统内对外和内部通信越来越多。串行通信作为一种主要的通信方式, 由于所用的传输线少, 因此特别适合于远距离传送, 应用非常广泛。FPGA(现场可编程门阵列)在数字电路的设计中已经被广泛使用。这种设计方式可以增强系统的可靠性和设计的灵活性。

二、实验内容

本实验使用Verilog编写rs232串口通信程序,利用波形仿真工具进行前仿真,下载到开发板,利用串口调试助手进行验证。本串口实现的功能是可以设置八种波特率,实现多字节的收发。实验芯片选择xilinx的spartan6系列,编译软件使用xilinx专用的ise14.1,仿真工具使用ise自带工具isim。

三、实验过程

(1)、分模块编写代码,本次设计共有四个模块,分别是串口接收波特率产生模块,串口接收模块,串口发送波特率产生模块,串口发送模块。以下是各模块之间的联系图:

由图所示,顶层各端口功能如下

顶层文件主要用于连接以下各个模块

本模块的作用主要用于产生所需的波特率,共有八种选择,本模块的内部又有以下几个部分:

1、波特率选择部分:这一部分主要通过按键输入控制波特率,由case语句完成

2、波特率时钟计数部分:这一部分主要是通过计数器对输入时钟进行分频来达到所需的波特率。

3、波特率时钟产生部分:这一部分用来产生连接下一模块的波特率时钟。

串口接收模块

本模块的作用主要是根据波特率时钟产生模块所产生的波特率,进行数据的接收,包含如下几个部分

1、检测数据开始位:这一部分主要依据数据帧的起始位为0这一设置,通过检测下降沿来检测数据的开始位,当检测到下降沿后,发出一系列开始接收数据的信号。

2、数据接收部分:这一部分主要通过波特率来采样数据,每一个数据采样九次,选取其中的三次经过加和来判断本位是0还是1。

3、数据存储部分:这一部分主要把接收到的数据存储到设定的寄存器中,以便发送。

串口发送波特率产生模块

本模块的作用主要用于产生所需的波特率,共有八种选择,本模块的内部又有以下几个部分:1、波特率选择部分:这一部分主要通过按键输入控制波特率,由case语句完成

2、波特率时钟计数部分:这一部分主要是通过计数器对输入时钟进行分频来达到所需的波特率。

3、波特率时钟产生部分:这一部分用来产生连接下一模块的波特率时钟。

串口发送模块

这一模块分为以下几个部分:

1,、检测发送使能信号部分:这一部分通过检测下降沿来识别发送使能信号,并产生一系列的发送开始信号。

2、发送帧部分:这一部分主要将之前存储在寄存器中的数据逐位发送出去,并加入开始位0,与结束位1,构成一帧十位数据。

通过对各个模块的了解,分别编写各个模块的代码

(2)、修改程序,编写仿真程序。

由于本次实验代码量较小,仿真时采用ise自带的波形仿真工具即可完成仿真,仿真图如下

波形为任意两帧数据的接收与发送,可以看出连续两帧数据接收与发送并没有发生错误。(3)、将程序下载到芯片,结合串口助手进行验证。

四、实验代码

顶层代码:

module uart_top(clk,rst_n,rs232_rx,rs232_tx,key_in);

input clk; //时钟信号50M

input rst_n; //复位信号,低有效

input rs232_rx; //数据输入信号

input [2:0]key_in;

output rs232_tx; //数据输出信号

//

wire [2:0]key_in;

wire sample_clk1;

wire bps_start1,bps_start2;//

wire clk_bps1,clk_bps2;

wire [7:0]rx_data;//接收数据存储器,用来存储接收到的数据,直到下一个数据接收

wire rx_int; //接收数据中断信号,接收过程中一直为高,

///////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////子模块端口申明///////////////////////////////////

speed_select_rx speed_rx( //数据接收波特率选择模块

.clk(clk),

.rst_n(rst_n),

.bps_start(bps_start1),

.sample_clk(sample_clk1),//这一个时钟是九分之一波特率时钟

.key_in(key_in)//用来选择波特率

);

uart_rx uart_rx( //数据接收模块

.clk(clk),

.rst_n(rst_n),

.bps_start(bps_start1),//这一个信号用来控制波特率发生器的开启,当检测到输入数据中的下降沿后,开始波特率计数

.sample_clk(sample_clk1),

.rs232_rx(rs232_rx),//数据输入端口

.rx_data(rx_data),//数据输入后存储寄存器

.rx_int(rx_int)//这一信号用来表示数据接收完成,接受过程是高,接收完成后变为低,发送模块用此信号来判断是否可以发送

);

speed_select_tx speed_tx( //数据发送波特率控制模块

.clk(clk),

.rst_n(rst_n),

.bps_start(bps_start2),//

.clk_bps(clk_bps2),//发送数据波特率生成端口

.key_in(key_in)

);

uart_tx uart_tx(

.clk(clk),

.rst_n(rst_n),

.bps_start(bps_start2),//当检测到int下降沿以后开始启动

.clk_bps(clk_bps2),

.rs232_tx(rs232_tx),//接收数据存储寄存器

.rx_data(rx_data),

.rx_int(rx_int)//这个是波特率开始发送的标志,由串口接收模块产生

);

endmodule

接收模块波特率发生器:

module speed_select_rx(clk,rst_n,bps_start,key_in,sample_clk);//波特率设定

input clk; //50M时钟

input rst_n; //复位信号

input bps_start;

input [2:0]key_in;

//接收到信号以后,波特率时钟信号置位,当接收到uart_rx传来的信号以后,模块开始运行// output clk_bps; //接收数据中间采样点,

output sample_clk;

// `define BPS_PARA 5207;//9600波特率分频计数值

// `define BPS_PARA_2 2603;//计数一半时采样

reg sample_clk;

reg[13:0] cnt;//分频计数器

reg clk_bps_r;//波特率时钟寄存器

reg[13:0]cntt;

parameter system_clk = 50_000_000; /*输入时钟频率设定,默认50M*/

localparam bps9600 = system_clk/9600/9 - 1;

localparam bps19200 = system_clk/19200/9 - 1;

localparam bps38400 = system_clk/38400/9 - 1;

localparam bps57600 = system_clk/57600/9 - 1;

localparam bps115200 = system_clk/115200/9 - 1;

localparam bps230400 = system_clk/230400/9 - 1;

localparam bps460800 = system_clk/460800/9 - 1;

localparam bps921600 = system_clk/921600/9 - 1;

/**************选择波特率部分程序*************************/

always@(posedge clk or negedge rst_n)

if(!rst_n)begin

cntt <= bps9600;/*复位时波特率默认为9600bps*/

end

else begin

case(key_in)/*根据波特率控制信号选择不同的波特率计数器计数最大值*/

3'd0: cntt <= bps9600;

3'd1: cntt <= bps19200;

3'd2: cntt <= bps38400;

3'd3: cntt <= bps57600;

3'd4: cntt <= bps115200;

3'd5: cntt <= bps230400;

3'd6: cntt <= bps460800;

3'd7: cntt <= bps921600;

default: cntt<= bps9600;

endcase

end

/***********波特率时钟计数器工作***************************/

always @(posedge clk or negedge rst_n)

begin

if(!rst_n)

cnt<=13'd0;

else if((cnt==cntt)|| !bps_start)//判断计数是否达到1个脉宽

cnt<=13'd0;

else

cnt<=cnt+1'b1;//波特率时钟启动

end

/****************产生波特率时钟************************************/ always@(posedge clk or negedge rst_n)

begin

if(!rst_n)

sample_clk<=0;

else if(cnt==1)

sample_clk<=1;

else

sample_clk<=0;

end

endmodule

接收模块:

module uart_rx(

clk,

rst_n,

bps_start,

sample_clk,

rs232_rx,

rx_data,

rx_int

);

input clk; //时钟

input rst_n; //复位

input rs232_rx; //接收数据信号

input sample_clk; //九倍波特率采样点

output bps_start; //接收信号时,波特率时钟信号置位

output [7:0] rx_data;//接收数据寄存器

output rx_int; //接收数据中断信号,接收过程中为高

reg rs232_rx0,rs232_rx1,rs232_rx2,rs232_rx3;//接收数据寄存器

reg [7:0]rx_data;

reg [1:0] Data_Tmp[7:0];

reg rx_int;

wire neg_rs232_rx;//表示数据线接收到下沿

/*****************检测下降沿******************************/

always @(posedge clk or negedge rst_n) begin

if(!rst_n) begin

rs232_rx0 <= 1'b0;

rs232_rx1 <= 1'b0;

rs232_rx2 <= 1'b0;

rs232_rx3 <= 1'b0;

end

else begin

rs232_rx0 <= rs232_rx;

rs232_rx1 <= rs232_rx0;

rs232_rx2 <= rs232_rx1;

rs232_rx3 <= rs232_rx2;

end

end

assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0;//串口传输线的下沿标志

reg bps_start;//波特率发生器的使能信号

reg clk_en;

/************产生一些控制信号***********/

reg[6:0]sample_clk_cnt;

always @(posedge clk or negedge rst_n)

if(!rst_n) begin

bps_start <=1'b0;

rx_int <= 1'b0;

clk_en<=0;

end

else if(neg_rs232_rx) begin//

bps_start <= 1'b1; //启动串口,准备接收数据

rx_int <= 1'b1; //接收数据中断使能

clk_en<=1;

end

else if(sample_clk_cnt == 7'd89)

begin

rx_int<=1'b0;

bps_start<=1'b0;

end

/***********这一部分是*/

integer i;

always @ (posedge clk or negedge rst_n)

if(!rst_n)begin

sample_clk_cnt <= 7'd0;

end

/***********************这里在一帧十位数据发送完以后不能使接收终端使能置零,是个问题,但是每次数据发送都是要检测下降沿的,可能并不影响数据正常发送****************************************/

else if(clk_en)begin

for(i=0;i<=7;i=i+1)

if(Data_Tmp[i]>1)

rx_data[i]<=1;

else

rx_data[i]<=0;

if(sample_clk_cnt == 7'd89)

sample_clk_cnt <= 7'd0;

else if(sample_clk)

sample_clk_cnt <= sample_clk_cnt + 1'b1;

end

reg [1:0]Start_Bit; /*起始位,这里虽然定义,但并未使用该位来判断接收数据的正确性,即默认接收都是成功的*/

reg [1:0]Stop_Bit; /*停止位,这里虽然定义,但并未使用该位来判断接收数据的正确性,即默认接收都是成功的*/

always @ (posedge clk or negedge rst_n)

//begin

if(!rst_n)begin

Data_Tmp[0] <= 2'd0;

Data_Tmp[1] <= 2'd0;

Data_Tmp[2] <= 2'd0;

Data_Tmp[3] <= 2'd0;

Data_Tmp[4] <= 2'd0;

Data_Tmp[5] <= 2'd0;

Data_Tmp[6] <= 2'd0;

Data_Tmp[7] <= 2'd0;

Start_Bit <= 2'd0;

Stop_Bit <= 2'd0;

end

else if(sample_clk)begin

case(sample_clk_cnt)

7'd0:

begin

Data_Tmp[0] <= 2'd0;

Data_Tmp[1] <= 2'd0;

Data_Tmp[2] <= 2'd0;

Data_Tmp[3] <= 2'd0;

Data_Tmp[4] <= 2'd0;

Data_Tmp[5] <= 2'd0;

Data_Tmp[6] <= 2'd0;

Data_Tmp[7] <= 2'd0;

Start_Bit <= 2'd0;

Stop_Bit <= 2'd0;

end

7'd3,7'd4,7'd5: Start_Bit <= Start_Bit + rs232_rx;

7'd12,7'd13,7'd14:Data_Tmp[0] <= Data_Tmp[0] + rs232_rx;

7'd21,7'd22,7'd23:Data_Tmp[1] <= Data_Tmp[1] + rs232_rx;

7'd30,7'd31,7'd32:Data_Tmp[2] <= Data_Tmp[2] + rs232_rx;

7'd39,7'd40,7'd41:Data_Tmp[3] <= Data_Tmp[3] + rs232_rx;

7'd48,7'd49,7'd50:Data_Tmp[4] <= Data_Tmp[4] + rs232_rx;

7'd57,7'd58,7'd59:Data_Tmp[5] <= Data_Tmp[5] + rs232_rx;

7'd66,7'd67,7'd68:Data_Tmp[6] <= Data_Tmp[6] + rs232_rx;

7'd75,7'd76,7'd77:Data_Tmp[7] <= Data_Tmp[7] + rs232_rx;

7'd84,7'd85,7'd86:Stop_Bit <= Stop_Bit + rs232_rx;

default:;

endcase

end

else;

//end

endmodule

发送模块波特率产生器:

module speed_select_tx(clk,rst_n,bps_start,clk_bps,key_in);//波特率设定

input clk; //50M时钟

input rst_n; //复位信号

input bps_start; //接收到信号以后,波特率时钟信号置位,当接收到uart_rx传来的信号以后,模块开始运行

input [2:0]key_in;

output clk_bps; //接收数据中间采样点,

reg[13:0]cntt;

reg[13:0] cnt;//分频计数器

reg clk_bps_r;//波特率时钟寄存器

reg clk_out;

parameter system_clk = 50_000_000; /*输入时钟频率设定,默认50M*/

localparam bps9600 = system_clk/9600 - 1;/*频率除以频率,可以得出每接受一个数据需要多少个时钟周期*/

localparam bps19200 = system_clk/19200 - 1;

localparam bps38400 = system_clk/38400 - 1;

localparam bps57600 = system_clk/57600 - 1;

localparam bps115200 = system_clk/115200 - 1;

localparam bps230400 = system_clk/230400 - 1;

localparam bps460800 = system_clk/460800 - 1;

localparam bps921600 = system_clk/921600 - 1;

always@(posedge clk or negedge rst_n)

if(!rst_n)begin

cntt <= bps9600;/*复位时波特率默认为9600bps*/

end

else begin

case(key_in)/*根据波特率控制信号选择不同的波特率计数器计数最大值*/

3'd0: cntt <= bps9600;

3'd1: cntt <= bps19200;

3'd2: cntt <= bps38400;

3'd3: cntt <= bps57600;

3'd4: cntt <= bps115200;

3'd5: cntt <= bps230400;

3'd6: cntt <= bps460800;

3'd7: cntt <= bps921600;

default: cntt<= bps9600;

endcase

end

always @(posedge clk or negedge rst_n)

if(!rst_n)

cnt<=13'd0;

else if((cnt==cntt)|| !bps_start)//判断计数是否达到1个脉宽

cnt<=13'd0;

else

cnt<=cnt+1'b1;//波特率时钟启动

//这里有问题

always @(posedge clk or negedge rst_n) begin

if(!rst_n)

clk_bps_r<=1'b0;

else if(cnt== cntt/2)//当波特率计数到一半时,进行采样存储clk_bps_r<=1'b1;

else begin

clk_bps_r<=1'b0;

end

end

assign clk_bps = clk_bps_r;//将采样数据输出给uart_rx模块endmodule

发送模块:

module uart_tx(

clk,

rst_n,

bps_start,

clk_bps,

rs232_tx,

rx_data,

rx_int

);

input clk;

input rst_n;

input clk_bps;//中间采样点

input [7:0] rx_data;//接收数据寄存器

input rx_int;//数据接收中断信号

output rs232_tx;//发送数据信号

output bps_start;//发送信号置位

reg rx_int0,rx_int1,rx_int2;//信号寄存器,捕捉下降沿

wire neg_rx_int; //下降沿标志

always @(posedge clk or negedge rst_n) begin

if(!rst_n) begin

rx_int0 <= 1'b0;

rx_int1 <= 1'b0;

rx_int2 <= 1'b0;

end

else begin

rx_int0 <= rx_int;

rx_int1 <= rx_int0;

rx_int2 <= rx_int1;

end

end

assign neg_rx_int = ~rx_int1 & rx_int2;//捕捉下沿

reg [7:0] tx_data;//待发送数据

reg bps_start_r;

reg tx_en;//发送信号使能,高有效

reg [3:0] num;

always @(posedge clk or negedge rst_n) begin

if(!rst_n) begin

bps_start_r <= 1'b0;

tx_en <= 1'b0;

tx_data <= 8'd0;

end

else if(neg_rx_int) begin//当检测到下沿的时候,数据开始传送bps_start_r <= 1'b1;

tx_data <= rx_data;

tx_en <= 1'b1;

end

else if(num==4'd9) begin

bps_start_r <= 1'b0;

tx_en <= 1'b0;

end

end

assign bps_start = bps_start_r;

reg rs232_tx_r;

always @(posedge clk or negedge rst_n) begin

if(!rst_n||num==4'd9) begin

num<=4'd0;

rs232_tx_r <= 1'b1;

end

else if(tx_en && clk_bps==1) begin

num<=num+1'b1;

case(num)

4'd0: rs232_tx_r <= 1'b0;//起始位

4'd1: rs232_tx_r <= tx_data[0];//数据位开始

4'd2: rs232_tx_r <= tx_data[1];

4'd3: rs232_tx_r <= tx_data[2];

4'd4: rs232_tx_r <= tx_data[3];

4'd5: rs232_tx_r <= tx_data[4];

4'd6: rs232_tx_r <= tx_data[5];

4'd7: rs232_tx_r <= tx_data[6];

4'd8: rs232_tx_r <= tx_data[7];

4'd9: rs232_tx_r <= 1'b1;//数据结束位,1位

default: rs232_tx_r <= 1'b1;

endcase

end

end

assign rs232_tx =rs232_tx_r;

endmodule

基于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)输出。 第三部分是供电。15脚GND、16脚VCC(+5v)。 RS232 (DB9)引脚定义 1 :DCD :载波检测。主要用于Modem通知计算机其处于在线状态,即Modem检测到拨号音,处于在线状态。 2 :RXD:此引脚用于接收外部设备送来的数据;在你使用Modem时,你会发现RXD 指示灯在闪烁,说明RXD引脚上有数据进入。 3 :TXD:此引脚将计算机的数据发送给外部设备;在你使用Modem时,你会发现TXD 指示灯在闪烁,说明计算机正在通过TXD引脚发送数据。 4 :DTR:数据终端就绪;当此引脚高电平时,通知Modem可以进行数据传输,计算机已经准备好。 5 :GND:信号地;此位不做过多解释。 6 :DSR:数据设备就绪;此引脚高电平时,通知计算机Modem已经准备好,可以进行数据通讯了。 7 :RTS:请求发送;此脚由计算机来控制,用以通知Modem马上传送数据至计算机;否则,Modem将收到的数据暂时放入缓冲区中。 8 :CTS: 清除发送;此脚由Modem控制,用以通知计算机将欲传的数据送至Modem。 9 :RI : Modem通知计算机有呼叫进来,是否接听呼叫由计算机决定。

串口通信实验报告全版.doc

实验三双机通信实验 一、实验目的 UART 串行通信接口技术应用 二、实验实现的功能 用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。 三、系统硬件设计 (1)单片机的最小系统部分 (2)电源部分 (3)人机界面部分

数码管部分按键部分 (4)串口通信部分 四、系统软件设计 #include #define uchar unsigned char #define uint unsigned int void send(); uchar code0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9的数码管显示 sbit H1=P3^6; sbit H2=P3^7;

sbit L1=P0^5; sbit L2=P0^6; sbit L3=P0^7; uint m=0,i=0,j; uchar temp,prt; /***y延时函数***/ void delay(uint k) { uint i,j; //定义局部变量ij for(i=0;i

{ m=1; //KEY1键按下 return(m); } if(H2==0) { m=4; //KEY4键按下 return(m); } } } if(L2==0) { delay(5); if (L2==0) { L2=0;H1=1;H2=1; if(H1==0) { m=2; //KEY2键按下 return(m); } if(H2==0) { m=5; //KEY5键按下 return(m); } } } if(L3==0) { delay(5); if (L3==0) { L3=0;H1=1;H2=1; if(H1==0) { m=3; //KEY3键按下

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低电平作为停止位

基于FPGA的通用异步收发器设计(串口通信)

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(位/秒)。 FPGA UART系统组成:如下图所示,FPGA UART由三个子模块组成:波特率发生器;接收模块;发送模块; 2、模块设计:

基于fpga的串口通信

基于FPGA的串口通信设计 学号: 姓名: 班级: 指导教师: 电子与控制工程学院

一、串行通信系统 1.1概述 在计算机系统和微机网络的快速发展领域里串行通信在数据通信及控制系统中得到广泛的应用。UART 即Universal AsynchronousReceiver 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。 通信指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递从广义上指需要信息的双方或多方在不违背各自意愿的情况下无论采用何种方法使用何种媒质 将信息从某方准确安全传送到另方。通信在不同的环境下有不同的解释在出现电波传递通信后通信(Communication)被单一解释为信息的传递是指由一地向另一地进行信息的传输与交换其目的是传输消息。然而通信是在人类实践过程中随着社会生产力的发展对传递消息的要求不断提升使得人类文明不断进步。在各种各样的通信方式中利用“电”来传递消息的通信方法称为电信(Telecommunication) 这种通信具有迅速、准确、可靠等特点且几乎不受时间、地点、空间、距离的限制 因而得到了飞速发展和广泛应用。 1.2串行通信简介 计算机与计算机,计算机与外部设备进行数据交换也称为通信,一般有两种方式并行通信和串行通信。信息的各位数据被同时传送的通信方法是并行通信并行通信依靠I/O接口来实现。并行通信中数据有多少位就需要多少条信号传输线。这种通信方式快,但由于传输线较多,所以成本较高,仅适合近距离通信通常传送距离小于30米。当距离大于30米时则多采用串行通信方式串行通信是指外部设备和计算机间使用一根数据线另外需要地线可能还需要控制线进行数据

UART串口通信实验报告

实验四 UART 串口通信 学院:研究生院 学号:1400030034 姓名:张秋明 一、 实验目的及要求 设计一个UART 串口通信协议,实现“串 <-->并”转换功能的电路,也就是 “通用异步收发器”。 二、 实验原理 UART 是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实 现全双工传输和接收。在嵌入式设计中,UART 用来主机与辅助设备通信,如汽 车音响与外接AP 之间的通信,与PC 机通信包括与监控调试器和其它器件,如 EEPROM 通信。 UART 作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一 位接一位地传输。 其中各位的意义如下: 起始位:先发出一个逻辑” 0的信号,表示传输字符的开始。 资料位:紧接着起始位之后。资料位的个数可以是 4、5、6、7、8等,构成 一个字符。通常采用ASCII 码。从最低位开始传送,靠时钟定位。 奇偶校验位:资料位加上这一位后,使得“ 1的位数应为偶数(偶校验)或奇数 (奇校验),以此来校验资料传送的正确性。 停止位:它是一个字符数据的结束标志。可以是 1位、1.5位、2位的高电 平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能 在通信中两台设备间出现了小小的不同步。 因此停止位不仅仅是表示传输的结束, 并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步 的容忍程度越大,但是数据传输率同时也越慢。 空闲位:处于逻辑“ 1状态,表示当前线路上没有资料传送。 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol )。 一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为 120 字符/秒,传输使用256阶符号,每个符号代表8bit ,则波特率就是120baud,比 特率是120*8=960bit/s 。这两者的概念很容易搞错。 三、 实现程序 library ieee; use ieee.std 」o gic_1164.all; end uart; architecture behav of uart is en tity uart is port(clk : in std_logic; rst_n: in std 」o gic --系统时钟 --复位信号 rs232_rx: in std 」o gic rs232_tx: out std 」o gic --RS232接收数据信号; --RS232发送数据信号;); use ieee.std_logic_ un sig ned.all;

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串口通讯设计

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,模块的

串口通信FPGA实现

FPGA设计与应用 串口通信实验报告 班级:1105103 姓名:苏林效 学号:1110510321 日期:2014年10月29日

实验性质:验证性实验类型:必做 开课单位:电信院学时:2学时 一、实验目的 1、了解串口通信的基本原理; 2、掌握锁相环的基本原理和使用方法; 3、掌握起始位和停止位的含义及实现方法; 4、掌握VHDL状态机的基本使用方法; 5、掌握基本的接口设计和调试技巧; 二、实验准备 2.1 串口通信原理(1分) 串口通信是以字节为单位,按位传输数据和接收数据的。 先看一下发送数据:串行线缆的两端事先约定好串行传输的参数(传输速度、传输格式等),之后进行传输,①当没有数据传输的时候,发送端向数据线上发送“1”;②当要传输数据时,发送端先发送一个“0”来表示要传输数据了,这样当接收端检测到“0”便可以知道有数据到来了;③开始传输后,数据以约定的速度和格式传输;④每次传输完成一个字节之后,都在其后发送一个停止位“1”。这样,发送数据就结束了。 再来看接收数据,初始状态是等待状态,接收的一直是“1”,当检测到0时进入检验状态,在检验状态下如果再检测到0(一般采用过采样)则进入接收数据状态,当接收完8位比特数后判断是否有停止位,如果有则此字节接收结束,重新进入等待状态准备接受下一字节。 2.2 锁相环的基本原理(1分) 锁相环是以锁定输入载波信号的相位为目标的一种载波环实现形式。它由三部分组成:鉴相器(PD)、环路滤波器(LPF)和压控振荡器(VCO)。如上图。 锁相环的工作原理:压控振荡器的输出经过采集并分频,后与基准信号同时

输入鉴相器。鉴相器通过比较上述两个信号的相位差,输出结果通过环路滤波器,滤除噪声和高频分量,然后输出一个直流脉冲电压,用它来控制VCO ,使它的频率改变,使()lim 0c p t θ=。经过较短时间后,VCO 的输出稳定于某一值。环路一旦进入锁定状态后,压控振荡器的输出信号与环路的输入信号(参考信号)相位时刻保持一致。 三、代码及测试 3.1程序及分析(2分) 顶层原理图如上所示,主要包括三个模块,锁相环(输出57.69MHz )、分频(输出接受时的10倍采样速率和数码管显示速率)、接受(按57.6kbps 接受从串口发来的数据)。 分频模块代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DIV IS PORT(CLK : IN STD_LOGIC; --锁相环输出时钟57.69M COUT1 : OUT STD_LOGIC; --分频器输出采样时钟576k COUT2 : OUT STD_LOGIC);

FPGA串口通信汇总

FPGA实验报告 目录 FPGA实验报告 (1) 目录 (1)

基于VHDL的串口通信实现设计 (3) 摘要 (3) 正文 (3) 1.研究背景知识 (3) 1.1串口简介 (3) 1.2串口通信参数 (3) 2.系统整体设计 (5) 2.1 系统框图 (5) 2.2原理图 (5) 2.3管脚介绍: (6) 3. 系统模块设计 (6) 3.1分频模块 (6) 3.11流程图 (6) 3.12程序 (7) 3.2接收模块 (8) 3.21流程图 (8) 3.22程序 (9) 3.3发送模块 (10) 3.31流程图 (10) 3.32程序 (11) 4. 系统调试 (12) 4.1 时序调试 (12) 4.2硬件调试 (13) 5.总结 (14)

基于VHDL的串口通信实现设计 摘要 串口是计算机上一种非常通用设备通信的协议,其特点是通信线路简单,成本低,特别适用于远距离通信,因此有较为广泛的应用。为了深入了解串口,本课程设计基于VHDL语言,利用FPGA开发板实现了板间串口通信。在程序设计中,考虑到串口波特率、数据格式等参数,共采用了四个模块:分频模块(即波特率产生模块),接受模块,发送模块,显示模块。通过软件和开发板调试,实现了板和串口调试助手收发数据,软件改变波特率等参数,并在数码管显示的功能。 关键词:串口VHDL FPGA 分频接收发送显示 正文 1.研究背景知识 1.1串口简介 串行接口Serial Interface是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。 串口通信的两种最基本的方式:同步串行通信方式和异步串行通信方式。 1.2串口通信参数 双方为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的初始化。通信端口的初始化有以下几项必须设置: 1.数据的传输速率 传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,RS-232通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。由于没有一个参考时钟,双方所发送的高低电位

串行通信实验报告材料

串行通信实验报告 班级姓名学号日期 一、实验目的: 1、掌握单片机串行口工作方式的程序设计,及简易三线式通讯的方法。 2、了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。 3、学习串口通讯的程序编写方法。 二、实验要求 1.单机自发自收实验:实现自发自收。编写相应程序,通过发光二极管观察收发状态。 2.利用单片机串行口,实现两个实验台之间的串行通讯。其中一个实验台作为发送方,另一侧为接收方。 三、实验说明 通讯双方的RXD、TXD信号本应经过电平转换后再行交叉连接,本实验中为减少连线可将电平转换电路略去,而将双方的RXD、TXD直接交叉连接。也可以将本机的TXD接到RXD上。 连线方法:在第一个实验中将一台实验箱的RXD和TXD相连,用P1.0连接发光二极管。波特率定为600,SMOD=0。 在第二个实验中,将两台实验箱的RXD和TXD交叉相连。编写收发程序,一台实验箱作为发送方,另一台作为接收方,编写程序,从内部数据存储器20H~3FH单元中共32个数据,采用方式1串行发送出去,波特率设为600。通过运行程序观察存储单元内数值的变化。 四、程序 甲方发送程序如下: ORG 0000H LJMP MAIN ORG 0023H LJMP COM_INT ORG 1000H MAIN: MOV SP,#53H MOV 78H,#20H

MOV 77H,00H MOV 76H,20H MOV 75H,40H ACALL TRANS HERE: SJMP HERE TRANS: MOV TMOD,#20H MOV TH1,#0F3H MOV TL1,#0F3H MOV PCON,#80H SETB TR1 MOV SCON,#40H MOV IE,#00H CLR F0 MOV SBUF,78H WAIT1: JNB TI,WAIT1 CLR TI MOV SBUF,77H WAIT2: JNB TI,WAIT2 CLR TI MOV SBUF,76H WAIT3: JNB TI,WAIT3 CLR TI

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与单片机实现数据RS232串口通信的设计

FPGA与单片机实现数据RS232串口通信 的设计 发布时间:2010-9-2 发布人:21世纪电子网 摘要:本文针对由FPGA构成的高速数据采集系统数据处理能力弱的问题,提出FPGA与单片机实现数据串行通信的解决方案。在通信过程中完全遵守RS232协议,具有较强的通用性和推广价值。 1 前言 现场可编程逻辑器件(FPGA)在高速采集系统中的应用越来越广,由于FPGA对采集到的数据的处理能力比较差,故需要将其采集到的数据送到其他CPU系统来实现数据的处理功能,这就使FPGA系统与其他CPU系统之间的数据通信提到日程上,得到人们的急切关注。本文介绍利用VHDL语言实现 FPGA与单片机的串口异步通信电路。 整个设计采用模块化的设计思想,可分为四个模块:FPGA数据发送模块,FPGA 波特率发生控制模块,FPGA总体接口模块以及单片机数据接收模块。本文着重对FPGA数据发送模块实现进行说明。 2 FPGA数据发送模块的设计 根据RS232 异步串行通信来的帧格式,在FPGA发送模块中采用的每一帧格式为:1位开始位 8位数据位 1位奇校验位 1位停止位,波特率为2400。本系统设计的是将一个16位的数据封装成高位帧和低位帧两个帧进行发送,先发送低位帧,再发送高位帧,在传输数据时,加上文件头和数据长度,文件头用555555来表示,只有单片机收到555555时,才将下面传输的数据长度和数据位进行接收,并进行奇校验位的检验,正确就对收到的数据进行存储处理功能,数据长度可以根据需要任意改变。由设置的波特率可以算出分频系数,具体算法为分频系数X=CLK/(BOUND*2)。可由此式算出所需的任意波特率。下面是实现上述功能的VHDL源程序。 Library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity atel2_bin is port( txclk: in std_logic; --2400Hz的波特率时钟 reset: in std_logic; --复位信号 din: in std_logic_vector(15 downto 0); --发送的数据 start: in std_logic; --允许传输信号 sout: out std_logic --串行输出端口 ); end atel2_bin; architecture behav of atel2_bin is signal thr,len: std_logic_vector(15 downto 0); signal txcnt_r: std_logic_vector(2 downto 0); signal sout1: std_logic;

基于FPGA的串口控制器设计

基于FPGA的串口控制器设计 简介 使用硬件描述语言 (HDL) 设计和开发验证FPGA的成为当前的主流因素。使用行为级描述不只增加了产品的设计效率,也在设计中有独特的验证方式。目前最流行的HDL语言为Verilog 和 VHDL。这篇文章将会举例说明用 Verilog语言的设计和验证数字异步串行收发器UART。 UART介绍 通用异步串行收发器UART中有二个独立的VHDL模块。一个模块实现发射功能, 当另一个实现接收功能,发射和接收功能模块在顶端设计时组合到一起使用,接收和发射的组合是通信通道所必需的。数据写入发射器,从接收器读出,所有的数据是以二进制8字节的信号通过CPU接口。在顶端设计时,地址有发射器映射,而且接收器通道能容易地建立从儿进入接口,两者工用一个称为mclkx 16主控时钟,在每个模块中 mclkx 16 被分成独立的波特率时钟。 UART的功能概况 UART的基本功能概况见下表. 在左边显示传输保持记录,移位记录,传输控制时钟,全部集中在发射机的txmit端。在右边的是显示接收移位寄存器, 接收记录和控制逻辑时钟,所有都包含在接收模块的rxcver端,这两个模组都单独的投入与产出,大部分的控制线,只有双向数据总线, 主时钟和复位线共享的模块。

顶层UART系统的I/O功能描述 UART的标准数据格式 图3显示了UART的串行数据格式,串行数据包含在帧8个数据字节,以及编码信息比特,在连续传输线路高通,在传输初始化时开始低一点.,接下来的低一点开始到8比特的数据信息, 低位对于后边高位有重要的作用。然后后边的8 bits数据进行奇偶校验 ,反馈8位数据的结果。 UART时序图 下面显示怎么将从寄存器里出来的数据写给移位寄存器,并在上升沿速率时钟时,转向tx输出。 发送时间如下表,如何得到数据从rx传输到接收移位寄存器然后存储。

实验四 UART串口通信实验报告

实验四UART串口通信 一、实验目的及要求 设计一个UART串口通信协议,实现“串<-->并”转换功能的电路,也就是“通用异步收发器”。 二、实验原理 UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。 UART作为异步串口通信协议的一种,工作原理是将传输数据的每个字符一位接一位地传输。 其中各位的意义如下: 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。 资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通常采用ASCII码。从最低位开始传送,靠时钟定位。 奇偶校验位:资料位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。 停止位:它是一个字符数据的结束标志。可以是1位、1.5

位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。 波特率:是衡量资料传送速率的指标。表示每秒钟传送的符号数(symbol)。一个符号代表的信息量(比特数)与符号的阶数有关。例如资料传送速率为120字符/秒,传输使用256阶符号,每个符号代表8bit,则波特率就是120baud,比特率是120*8=960bit/s。这两者的概念很容易搞错。 三、实现程序 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity uart is port(clk : in std_logic; --系统时钟rst_n: in std_logic; --复位信号 rs232_rx: in std_logic; --RS232接收

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

基于FPGA的串口通信电路设计与实现

基于FPGA的串口通信电路设计与实现 发表时间:2018-11-07T09:39:41.587Z 来源:《防护工程》2018年第17期作者:马龙[导读] 由于现代工业企业中在线监测的日益增长。需要PC机与更多设备进行通信,串口通信具有实现简单,使用灵活。数据传输准确等优点。 陕西烽火电子股份有限公司陕西宝鸡 721000 摘要:由于现代工业企业中在线监测的日益增长。需要PC机与更多设备进行通信,串口通信具有实现简单,使用灵活。数据传输准确等优点。在工业监控和实时监控系统中得到了广泛应用。由于监测设备的增加。PC机原有的串口不能再满足通信的需求,传统的设计方法是使用硬件扩展八个串口,但是额外增加了硬件设计成本和实际编程的难度。然而FPGA的UARTIP可灵活定制的优点使得基于黜的设计方法无需额外的硬件串口扩展,减少了硬件开发调试的难度,同时满足串行传输的要求。基于此,本文主要对基于FPGA的串口通信电路设计与实现进行分析探讨。 关键词:基于FPGA;串口通信;电路设计;实现 1、前言 FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是作为专用集成电路领域中一种半定制电路出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA中具有丰富的触发器和I/O口,采用描述语言(VHDL和VerilogHDL)进行设计,用户可以根据需要,描述出具有各种功能的电路。基于以上原因,我们可以利用FPGA实现多串口通信中的数据转换和中断控制功能,从而简化电路、缩小PCB面积,也可以很方便的进行升级改动和模块移植。 2、设计要求 整个设计的硬件电路以DSP和FPGA为主构架,DSP和FPGA之间通过DSP的EMIF接口连接。其中,DSP是主处理器,用于实现串口数据的处理,FPGA作为DSP的外围电路,实现UART模块的串行数据的接收和发送、数据的串并/并串转换及接收中断的产生,同时,实现多串口的中断控制功能。当有接收数据时,FPGA通过中断方式通知DSP。 UART模块的数据格式:波特率可以按标准波特率设置;按字节接收,每个字节前包含一个起始位(低电平,逻辑值0),无校验位,最后是一位停止位和不定长度的空闲位(高电平,逻辑值1);接收到一个完整字节后产生一个中断(高电平,逻辑值1),当数据被读取后,中断信号复位(低电平,逻辑值0)。中断控制器应能实现8路UART模块的中断接收和处理,最后给DSP输出一个中断信号,输入的各中断信号之间无优先级设定。 3、设计方案 完整的设计由时钟管理模块、接口模块、UART模块和中断控制器组成。时钟管理模块产生设计中所需各种时钟,包括主处理时钟和接收与发送的波特率时钟;接口模块实现DSP和FPGA之间的中断、读写功能;UART模块由接收和发送子模块组成,实现数据的串行接收和串行发送功能;中断控制器由中断采样子模块和中断处理子模块组成,实现8路UART中断接收和处理功能。下面分别对这些模块的设计给予描述。 3.1 时钟管理模块 设输入FPGA的时钟为50MHz,则主处理时钟设计为50MHz。U A R T 的接收和发送采用相同的波特率进行,本设计中采用115200b/s进行收发,这就需要对50MHz时钟进行分频以产生所需的波特率。 3.2 接口模块 接口模块连接时钟管理模块、UART模块和中断处理器,并与DSP采用EMIF总线相连接。与DSP相关的信号有:wr_n、rd_n、cs_n、addrs、data_bus和dsp_int,在cs_n和wr_n有效时,DSP通过addrs选通不同的UART模块,将需要发送的并行数据发送给发送寄存器,执行发送功能。DSP响应外部中断时,在cs_n和rd_n有效时,通过addrs读取中断控制器的中断矢量和UART模块接收的数据。 3.3 UART模块 3.3.1 发送模块 根据UART模块的数据格式,发送状态机如图1所示。

相关文档
相关文档 最新文档