基于VerilogHDL的RS-232串口通信在CPLD上的实现综述

合集下载

verilog 逻辑函数 串口发送

verilog 逻辑函数 串口发送

verilog 逻辑函数串口发送摘要:1.Verilog 逻辑函数概述2.串口发送原理3.Verilog 实现串口发送的逻辑函数4.应用实例正文:【1.Verilog 逻辑函数概述】Verilog 是一种硬件描述语言,主要用于数字电路和模拟混合信号电路的描述。

它的语法简洁,易于理解和使用。

在数字电路设计中,逻辑函数是基本的构建模块,通过组合这些模块可以实现复杂的数字电路。

【2.串口发送原理】串口(Serial Port)是一种计算机硬件接口,可以通过串行通信传输数据。

发送数据时,数据被逐个比特按顺序传送,这样可以减少线路的传输次数,提高通信效率。

在电子设备中,如单片机、FPGA 等,通常会使用串口进行数据通信。

【3.Verilog 实现串口发送的逻辑函数】要实现串口发送功能,首先需要设计一个状态机,控制数据的发送过程。

下面是一个简单的Verilog 代码示例,实现一个8 位串口发送器:```verilogmodule serial_port_sender(input wire clk, // 时钟信号input wire rst_n, // 低电平复位信号input wire start, // 开始发送信号input wire [7:0] data, // 发送数据output wire busy // 忙碌信号);// 定义状态机typedef enum logic [1:0] {IDLE, SENDING} state_t; state_t current_state, next_state;always_ff @(posedge clk or negedge rst_n) begin if (!rst_n) begincurrent_state <= IDLE;end else begincurrent_state <= next_state;endendalways_comb begincase (current_state)IDLE: beginif (start &&!busy) beginnext_state = SENDING;endendSENDING: beginif (data == 8"b0000_0001) begin // 发送结束标志next_state = IDLE;end else begin// 发送数据busy = 1;next_state = SENDING;endendendcaseendendmodule```【4.应用实例】上述代码实现了一个简单的8 位串口发送器。

基于FPGA Verilog RS232串口回环测试例程,附源程序仿真源码及测试图片

基于FPGA Verilog RS232串口回环测试例程,附源程序仿真源码及测试图片

FPGA Verilog RS232串口回环测试基于FPGA Verilog RS232串口回环测试例程,支持多byte数据传输,附源程序仿真源码及测试图片。

测试基于SSCOM/友善之臂上位机软件测试,测试结果如下图一图二所示。

图一SSCOM图二图三连续发送仿真截图图四连续接收仿真截图后附verilog源程序代码及testbech仿真例程,注释欠。

重点:多byte回环测试要点,上位机串口多位数据连续发送停止位和起始位之间无间隔,回环程序在接收和发送都需要具备在停止位后能立马跳转到下一个起始位的能力。

重点关注cnt_bit的处理方式。

附录1 顶层例化uart_txd uart_txd(.clk_50m(sys_clk_50m),.reset_n(sys_rst_n),.tx_data(rx_data),.baud_set(3'd4),.send_en(rx_done),.send_done(),.send_busy(send_busy),.uart_tx(uart_tx));uart_rxd uart_rxd(.clk_50m(sys_clk_50m),.reset_n(sys_rst_n),.rx_data(rx_data),.baud_set(3'd4),.rx_done(rx_done),.rx_busy(rx_busy),.uart_rx(uart_rx));附录2 串口发送源程序`timescale1ns/1ps///////////////////////////////////////////////////////////////////// /////////////// Company:// Engineer://// Create Date: 2020/06/21 09:45:23// Design Name:// Module Name: uart_txd// Project Name:// Target Devices:// Tool Versions:// Description://// Dependencies:// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////////////// /////////////module uart_txd(clk_50m,reset_n,tx_data,baud_set,send_en,send_done,send_busy,uart_tx);input clk_50m;input reset_n;input[7:0] tx_data;input[2:0] baud_set;input send_en;output reg send_done;output reg send_busy;output reg uart_tx;reg[12:0] cnt;reg[12:0] baud_rate_cnt_max;reg[3:0] cnt_bit;reg[7:0] tx_data_r;localparam baud_rate_9600 =13'd5207;localparam baud_rate_19200 =13'd2603;localparam baud_rate_38400 =13'd1301;localparam baud_rate_57600 =13'd867;localparam baud_rate_115200 =13'd433;always@(posedge clk_50m or negedge reset_n)if(!reset_n)baud_rate_cnt_max <= baud_rate_115200;elsecase(baud_set)3'd0:baud_rate_cnt_max = baud_rate_9600;3'd1:baud_rate_cnt_max = baud_rate_19200;3'd2:baud_rate_cnt_max = baud_rate_38400;3'd3:baud_rate_cnt_max = baud_rate_57600;3'd4:baud_rate_cnt_max = baud_rate_115200;default:baud_rate_cnt_max = baud_rate_115200;endcasealways@(posedge clk_50m or negedge reset_n)if(!reset_n)tx_data_r <=8'd0;else if(send_en)tx_data_r <= tx_data;elsetx_data_r <= tx_data_r;always@(posedge clk_50m or negedge reset_n)if(!reset_n)send_busy <=1'b0;else if(send_en)send_busy <=1'b1;else if(cnt == baud_rate_cnt_max)beginif(cnt_bit ==4'd10)send_busy <=1'b0;elsesend_busy <= send_busy;endelsesend_busy <= send_busy;always@(posedge clk_50m or negedge reset_n)if(!reset_n)send_done <=1'b0;else if(cnt == baud_rate_cnt_max)beginif(cnt_bit ==4'd10)send_done <=1'b1;elsesend_done <=1'b0;endelsesend_done <=1'b0;always@(posedge clk_50m or negedge reset_n)if(!reset_n)cnt <=13'd0;else if(send_busy)beginif(cnt == baud_rate_cnt_max)cnt <=13'd0;elsecnt <= cnt +1'b1;endelsecnt <= cnt;/****************************************always@(posedge clk_50m or negedge reset_n)if(!reset_n)cnt_bit <= 4'd0;else if(send_en) //send_en needs to be 1 clock high pulse cnt_bit <= 4'd1;else if(cnt == baud_rate_cnt_max)beginif(cnt_bit == 4'd10)cnt_bit <= 4'd0;elsecnt_bit <= cnt_bit + 1'b1;endelsecnt_bit <= cnt_bit;******************************************/always@(posedge clk_50m or negedge reset_n)if(!reset_n)cnt_bit <=4'd0;else if(send_busy &&(cnt_bit ==4'd11))cnt_bit <=4'd1;else if(cnt ==1)cnt_bit <= cnt_bit +1'b1;elsecnt_bit <= cnt_bit;always@(posedge clk_50m or negedge reset_n)if(!reset_n)beginuart_tx <=1'b1;endelsecase(cnt_bit)4'd0:;4'd1: uart_tx <=1'b0;//start4'd2: uart_tx <= tx_data_r[0];//bit 04'd3: uart_tx <= tx_data_r[1];4'd4: uart_tx <= tx_data_r[2];4'd5: uart_tx <= tx_data_r[3];4'd6: uart_tx <= tx_data_r[4];4'd7: uart_tx <= tx_data_r[5];4'd8: uart_tx <= tx_data_r[6];4'd9: uart_tx <= tx_data_r[7];//bit 84'd10: uart_tx <=1'b1;//stopdefault:;endcaseendmodule附录3 串口发送testbench`timescale1ns/1ps///////////////////////////////////////////////////////////////////// /////////////// Company:// Engineer://// Create Date: 2020/06/21 11:38:04// Design Name:// Module Name: uart_txd_tb// Project Name:// Target Devices:// Tool Versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////////////// /////////////module uart_txd_tb();reg clk_50m;reg reset_n;reg[7:0] tx_data;reg[2:0] baud_set;reg send_en;wire send_done;wire send_busy;wire uart_tx;parameter CLK_PERIOD =20;initial clk_50m =0;always#(CLK_PERIOD /2) clk_50m =~clk_50m;initial begintx_data =8'h55;baud_set =4;reset_n =0;send_en =0;#(CLK_PERIOD *100);reset_n =1;# CLK_PERIOD;send_en =1;#(CLK_PERIOD );send_en =0;#(CLK_PERIOD *4340);send_en =1;#(CLK_PERIOD );send_en =0;#(CLK_PERIOD *4340);#(CLK_PERIOD *100);$stop;enduart_txd uart_txd(.clk_50m(clk_50m),.reset_n(reset_n),.tx_data(tx_data),.baud_set(baud_set),.send_en(send_en),.send_done(send_done),.send_busy(send_busy),.uart_tx(uart_tx));endmodule附录4 串口接收源程序`timescale1ns/1ps///////////////////////////////////////////////////////////////////// /////////////// Company:// Engineer://// Create Date: 2020/06/21 15:30:30// Design Name:// Module Name: uart_rxd// Project Name:// Target Devices:// Tool Versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////////////// /////////////module uart_rxd(clk_50m,reset_n,rx_data,baud_set,rx_done,rx_busy,uart_rx);input clk_50m;input reset_n;output reg[7:0] rx_data;input[2:0] baud_set;output reg rx_done;output reg rx_busy;input uart_rx;reg[12:0] cnt;reg[12:0] baud_rate_cnt_max;reg[3:0] cnt_bit;reg uart_rx_r1;reg uart_rx_r2;wire nedge;localparam baud_rate_9600 =13'd5207;localparam baud_rate_19200 =13'd2603;localparam baud_rate_38400 =13'd1301;localparam baud_rate_57600 =13'd867;localparam baud_rate_115200 =13'd433;always@(posedge clk_50m or negedge reset_n)if(!reset_n)baud_rate_cnt_max <= baud_rate_115200;elsecase(baud_set)3'd0:baud_rate_cnt_max = baud_rate_9600;3'd1:baud_rate_cnt_max = baud_rate_19200;3'd2:baud_rate_cnt_max = baud_rate_38400;3'd3:baud_rate_cnt_max = baud_rate_57600;3'd4:baud_rate_cnt_max = baud_rate_115200;default:baud_rate_cnt_max = baud_rate_115200;endcasealways@(posedge clk_50m or negedge reset_n)if(!reset_n)beginuart_rx_r1 <=8'd0;uart_rx_r2 <=8'd0;endelse beginuart_rx_r1 <= uart_rx;uart_rx_r2 <= uart_rx_r1;endassign nedge = uart_rx_r2 &(!uart_rx_r1);always@(posedge clk_50m or negedge reset_n) if(!reset_n)rx_busy <=1'b0;else if(nedge)rx_busy <=1'b1;else if(cnt == baud_rate_cnt_max)begin if(cnt_bit ==4'd10)rx_busy <=1'b0;elserx_busy <= rx_busy;endelserx_busy <= rx_busy;always@(posedge clk_50m or negedge reset_n) if(!reset_n)rx_done <=1'b0;else if(cnt == baud_rate_cnt_max)begin if(cnt_bit ==4'd10)rx_done <=1'b1;elserx_done <=1'b0;endelserx_done <=1'b0;always@(posedge clk_50m or negedge reset_n) if(!reset_n)cnt <=13'd0;else if(rx_busy)beginif(cnt == baud_rate_cnt_max)cnt <=13'd0;elsecnt <= cnt +1'b1;endelsecnt <= cnt;always@(posedge clk_50m or negedge reset_n) if(!reset_n)cnt_bit <=4'd1;else if(cnt == baud_rate_cnt_max )begin if(cnt_bit ==4'd10)cnt_bit <=4'd1;elsecnt_bit <= cnt_bit +1'b1;endelsecnt_bit <= cnt_bit;always@(posedge clk_50m or negedge reset_n)if(!reset_n)beginrx_data <=8'd0;endelse if(cnt == baud_rate_cnt_max /2)case(cnt_bit)4'd1:;//start4'd2: rx_data[0]<= uart_rx_r2;//bit 04'd3: rx_data[1]<= uart_rx_r2;4'd4: rx_data[2]<= uart_rx_r2;4'd5: rx_data[3]<= uart_rx_r2;4'd6: rx_data[4]<= uart_rx_r2;4'd7: rx_data[5]<= uart_rx_r2;4'd8: rx_data[6]<= uart_rx_r2;4'd9: rx_data[7]<= uart_rx_r2;//bit 74'd10:;//stopdefault:;endcaseelserx_data <= rx_data;endmodule附录5串口接收testbench`timescale1ns/1ps///////////////////////////////////////////////////////////////////// /////////////// Company:// Engineer://// Create Date: 2020/06/21 19:44:29// Design Name:// Module Name: uart_rxd_tb// Project Name:// Target Devices:// Tool Versions:// Description://// Dependencies://// Revision:// Revision 0.01 - File Created// Additional Comments://///////////////////////////////////////////////////////////////////// /////////////module uart_rxd_tb();reg clk_50m;reg reset_n;wire[7:0] rx_data;wire rx_done;wire rx_busy;reg uart_rx;parameter CLK_PERIOD =20;initial clk_50m =0;always#(CLK_PERIOD /2) clk_50m =~clk_50m;initial beginreset_n =0;uart_rx =1;//idle#(CLK_PERIOD *100);reset_n =1;# CLK_PERIOD;uart_rx =0;//start#(CLK_PERIOD *434);uart_rx =1;//bit0#(CLK_PERIOD *434);uart_rx =0;//bit1#(CLK_PERIOD *434);uart_rx =1;//bit2#(CLK_PERIOD *434);uart_rx =0;//bit3#(CLK_PERIOD *434);uart_rx =1;//bit4#(CLK_PERIOD *434);uart_rx =0;//bit5#(CLK_PERIOD *434);uart_rx =1;//bit6#(CLK_PERIOD *434);uart_rx =0;//bit7#(CLK_PERIOD *434);uart_rx =1;//stop#(CLK_PERIOD *434);uart_rx =1;//idle#(CLK_PERIOD *434);#(CLK_PERIOD *434);#(CLK_PERIOD *434);uart_rx =0;//start #(CLK_PERIOD *434);uart_rx =0;//bit0#(CLK_PERIOD *434);uart_rx =1;//bit1#(CLK_PERIOD *434);uart_rx =0;//bit2#(CLK_PERIOD *434);uart_rx =1;//bit3#(CLK_PERIOD *434);uart_rx =0;//bit4#(CLK_PERIOD *434);uart_rx =1;//bit5#(CLK_PERIOD *434);uart_rx =0;//bit6#(CLK_PERIOD *434);uart_rx =1;//bit7#(CLK_PERIOD *434);uart_rx =1;//stop#(CLK_PERIOD *434);uart_rx =1;//idle#(CLK_PERIOD *434);#(CLK_PERIOD *434);#(CLK_PERIOD *434);$stop;enduart_rxd uart_rxd(.clk_50m(clk_50m),.reset_n(reset_n),.rx_data(rx_data),.baud_set(3'd4),.rx_done(rx_done),.rx_busy(rx_busy),.uart_rx(uart_rx));endmodule。

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

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

置和输人数据计算出响应
的奇偶校验位,它是通过
纯组合逻辑来实现的。
2.6总线选择模块
总线选择模块用于
选择奇偶校验器的输入是
数据发送总线还是数据接
收总线。
2.7计数器模块
计数器模块的功能
是记录串行数据发送或者
接收的数日,在计数到某
数值时通知UART内核模
块。 3 UART程序设计 UART完整的工作流程可以分为接收过程
关键词:FPGA:UART:RS232
引言 串行接口的应用非常广泛,为实现串口通 信功能一般使用专用串行接口芯片,但是这种 接口芯片存在体积较大、接口复杂以及成本较 高的缺点,使得硬件设计更加复杂,并且结构与 功能相对固定,无法根据设计的需要对其逻辑 控制进行灵活的修改。介绍了一种采用FPGA 实现串口通信的方法。 1串口通信协议 对一个设备的处理器来说,要接收和发送 串行通信的数据,需要一个器件将串行的数据 转换为并行的数据以便于处理器进行处理,这 种器件就是UART(Universal Asynchronous Re— ceiver/Transmitter)通用异步收发器。作为接iSl的 一部分,UART提供以下功能: 1.1将由计算机内部传送过来的并行数据 转换为输出的串行数据流; 1.2将计算机外部来的串行数据转换为字 节,供计算机内部使用并行数据的器件使用; 1.3在输出的串行数据流中加入奇偶校验 位,并对从外部接收的数据流进行奇偶校验: 1.4在输出数据流中加入启停标记,并从 接收数据流中删除启停标记。 2 UART模块设计 UART主要由UART内核、信号检测器、移 位寄存器、波特率发生器、计数器、总线选择器 和奇偶校验器7个模块组成。(见图1) 2.1 UART内核模块 UART内核模块是整个设计的核心。在数 据接收时,UART内核模块负责控制波特率发 生器和移位寄存器同步的接收并且保存 RS一232接收端口上的串行数据。在数据发送 时,UART内核模块首先产生完整的发送序列, 之后控制移位寄存器将序列加载到移位寄存器 的内部寄存器里,最后再控制波特率发生器驱 动移位寄存器将数据串行输出。 2_2信号检测模块 信号检测器用于对RS一232的输入信号进 行实时检测,一旦发现新的数据则立即通知 UART内核。需要注意的是,这里所说的 RS一232输入输出信号都指经过电平转换后的 逻辑信号,而不是RS一232总线上的电平信号。 2_3移位寄存器模块 移位寄存器的作用是存储输入或者输出 的数据。 2.4波特率发生器模块 由于RS一232传输必定是工作在某种波特 率下,比如9600,为了便于和RS一232总线进行 同步,需要产生符合RS一232传输波特率的时 钟。 2.5奇偶校验器模块 奇偶校验器的功能是根据奇偶校验的设

基于Verilog HDL设计的UART模块

基于Verilog HDL设计的UART模块

1 UART原理串行通信是指外部设备和计算机间使用一根数据线(另外需要地线,可能还需要控制线)进行数据传输的方式。

数据在一根数据线上一位一位传输,每一位数据都占据一个固定的时间长度。

与并行通信方式相比,串行通信方式的传输速度较慢,但这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,因此得到了广泛的应用。

基本的UART只需要发送和接收两条数据线就可以完成数据的全双工通信,其基本功能是在发送端将控制器通过总线传过来的并行数据,以设定的格式,设定的频率串行地传输出去,并同时在接收端将串行接收到的数据,转换成相应的并行数据发送出去。

UART的基本帧格式如图1所示。

其中,起始位总是逻辑O状态,停止位总是逻辑l状态,其持续时间可选为1位、1.5位或2位,其数据位可为5、6、7、8位,校验位可根据需要选择奇校验位,偶校验位或无校验位。

2 UART的设计现今复杂的数字系统的设计往往采用自顶向下的设计方案,利用层次化结构化的方法,将一个设计方案划分为若干模块,在不同层次的模块都可以进行仿真,可以很方便地查看某一层次的代码以改正仿真时发现错误。

在本设计中UART主要由波特率发生器、接收模块、发送模块3部分组成,并具有l位停止位和无校验位。

波特率发生器实现波特率的变换,利用外部时钟信号产生一个所需波特率16倍的波特率时钟,用来控制UART的接收与发送。

接收模块是用于接收串行信号,并将其转化为并行数据;而发送模块则将准备输出的并行数据按照UART的帧格式转化为串行数据输出。

图2为UART结构图。

2.1 波特率发生器波特率表示的是每秒钟传送的二进制数据的位数,即单位时间内传送的信息量。

在串行异步传送中,常用到的波特率为1 200、2 400、4 800、9 600、19 200等。

波特率发生器实际上是一个分频器,主要是产生和。

RS-232通信所采用的波特率同步的时钟。

由于串行数据帧与接收数据时钟是异步的,所以存UA RT的接收端在什么时刻将数据移入寄存器,怎样选择可靠的采样点是非常关键的。

用vhdl语言在cpld上实现串行通信

用vhdl语言在cpld上实现串行通信

用vhdl语言在cpld上实现串行通信一、概述串行通信是现代通信领域中最为常见的一种通信方式。

通过串行通信,现代社会中的各种设备可以以最高效的方式进行数据传输,实现快速、准确的信息交换。

而vhdl语言则是数字电路设计领域中最为常用的一种描述语言,因为vhdl 语言可以描述数字电路的不同行为,对于数字电路的模拟和仿真非常方便。

在本文中,我们将介绍如何使用vhdl语言在cpld 上实现串行通信。

二、串行通信的基本原理串行通信是指在数据传输过程中,数据位是按照顺序一个一个相继传输的。

串行通信的传输速率相对较慢,但是传输距离远,主要是通过数据信号占用两个或者三个核心线来完成的。

串行通信的数据信号一般由三个部分构成:开始位、数据位和停止位。

开始位一般用于启动数据传输,而停止位则用于结束数据传输。

三、vhdl语言概述VHDL(VHSIC Hardware Description Language)是美国国防工业联合会(VHSIC)在80年代末期为了解决数字电路设计中的复杂性而开发的一种硬件描述语言,是一种基于文本的语言。

VHDL语言主要用来描述数字逻辑和数字电路。

VHDL语言本身就是一种结构化的、层次化的语言,可以很好地体现出数字电路的层次关系。

四、使用vhdl语言在cpld上实现串行通信的步骤1、确定串行通信的传输速率和数据格式。

在确定串行通信的传输速率和数据格式之前,需要确定串行通信的基本参数,包括其传输速率、在接收端进行判定数据是否有效的时间程度、以及在发送端和接收端之间互相传输数据的位数。

这些参数对于后续的设计极为重要。

2、编写串行通信的vhdl模块。

在vhdl模块中,需要包括发送和接收两个部分,分别对应于硬件接口中的发送和接收部分。

发送部分主要是将数据按照规定的格式进行串行传输,而接收部分则主要是将串行传输的数据再转换为并行数据。

3、完成vhdl模块的仿真测试。

在完成vhdl模块的设计之后,需要进行仿真测试,以验证vhdl模块的正确性和稳定性。

基于FPGA技术的HDLC帧收发器的设计与实现的开题报告

基于FPGA技术的HDLC帧收发器的设计与实现的开题报告

基于FPGA技术的HDLC帧收发器的设计与实现的开题报告一、研究背景与意义在现代通信系统中, HDLC(High Level Data Link Control)协议是一种广泛应用的数据链路层协议,在数据传输领域具有重要的意义。

HDLC协议能够实现可靠的数据传输、错误检测和纠错等功能,被广泛应用于各种通信系统中,如计算机网络、通信卫星、传感器网络等。

而在HDLC协议中,帧的生成和解析是其最基本的部分,因此设计一种高效、可靠的HDLC帧收发器技术,对实现基于HDLC协议的数据通信具有重要的意义。

而FPGA(Field-Programmable Gate Array)技术是一种高性能、高灵活性的可编程逻辑器件,具有并行处理能力强、延迟低、功耗小、可扩展性高等特点,被广泛应用于数字电路设计领域。

基于FPGA技术设计和实现HDLC帧收发器,能够实现高速、高效的帧传输和处理,提高通信系统的可靠性和稳定性。

二、研究内容与目标本次研究的主要内容是基于FPGA技术设计和实现一种高效、可靠的HDLC帧收发器,实现对于HDLC帧的收发和解析。

具体包括以下内容:1. HDLC协议的理论分析和研究,了解HDLC帧格式和协议流程,确定设计方案和实现策略;2. FPGA器件的选型和系统设计,包括硬件电路设计和信号处理等方面的内容;3. 基于Verilog HDL进行设计和实现,包括模块化设计、状态机设计、时序控制等;4. 通过仿真和实际硬件测试验证设计的正确性和可行性;本研究的目标是实现一种高效、可靠、具有扩展性的HDLC帧收发器,满足各种通信系统对于数据传输和处理的需求,并且与现有通信系统的兼容性良好。

三、研究方法1. 理论分析法:对HDLC协议进行深入研究和理论分析,确定设计方案和实现策略,为后续的FPGA设计提供理论基础和指导;2. 硬件电路设计法:选用适合的FPGA器件进行系统设计,包括电路设计和信号处理等方面的内容,确定硬件电路结构和信号流程;3. Verilog HDL设计法:基于Verilog HDL进行设计和实现,包括模块化设计、状态机设计、时序控制等,实现HDLC协议的帧收发和解析功能;4. 仿真和测试法:采用Modelsim等仿真工具进行软件仿真,通过实际硬件测试验证设计的正确性和可行性。

ST-BUS总线接口模块的Verilog HDL设计

ST-BUS总线接口模块的Verilog HDL设计

ST-BUS总线接口模块的Verilog HDL设计关键字:总线转换卡驱动控制电路输入输出模块印刷电路板滤波电路整流电路引言随着数字技术的迅速发展,现代通信系统已成为一个庞大的综合化数字网络。

电信核心网络除了提供传统电话服务外,还为其它专用通信(比如警用集群通信等)提供中继服务。

电信系统一般从交换机引出E1信号线路以供其它专用通信系统接入。

为了满足电信网的接入规范,E1终端设备内部常采用一种被称为ST-BUS的总线来对需要接入通信网的各路用户数据进行排队,以便统一与E1信号进行转换,充分利用E1线路资源。

由于批量生产的接口芯片都是针对某些特定标准接口而设计,无法满足E1通信的特殊需要。

为满足多种特殊接口与电信线路间进行数据交换的需要,增加系统可重配置的灵活性,本文在所涉及项目中的E1接口转换板的设计中采用了可编程器件实现了多种特殊接口的混合接入。

为了简化问题,文中主要介绍ST-BUS总线接口收发模块的Verilog HDL设计。

ST-BUS基本原理ST-BUS(Serial Telecom BUS,串行通信总线)是卓联半导体公司根据电信应用的需要而定义的一种重要的通信设备内部总线通信协议,它可以将多路信息(包括音频、视频、控制信息以及其它数据等)进行复接或解复接,以便统一进行信号转换,实现本地设备与电信E1线路间的数据交换。

随着通信系统越来越复杂,电信设备常有局部部件的淘汰或者更新换代。

为了提高设备兼容性也便于系统升级,电信设备广泛采取了模块化设计方法,而ST -BUS就是将各功能模块连接起来协同工作的一种总线标准。

所以,不论模块的功能和外部接口怎样,只要具备ST-BUS总线接口,都可以方便地嵌入到特定的通信系统中。

根据卓联对ST-BUS的信号及时序规范所作的定义,ST-BUS是一种传输数字信息的高速同步串行通信总线,总线接口所需信号有帧同步信号、位时钟信号和串行数据信号。

帧同步信号主要有类型0和类型1两种:类型0的同步脉冲仅出现在帧的开头,如图1所示,总线上各部件将之作为重要参考信号并由此决定何时开始接收或发送数据流;类型1的同步脉冲需要维持一个完整的时隙周期(即8个位时钟周期),在此期间部件也要接收或发送信息数据,这种同步方式较少应用。

基于FPGA的高速串行数据收发接口设计

基于FPGA的高速串行数据收发接口设计

基于FPGA的高速串行数据收发接口设计随着信息技术的不断发展,高速串行数据收发接口已经成为许多应用领域中的关键技术。

而基于FPGA的高速串行数据收发接口设计,可以充分发挥FPGA的并行计算和可编程性优势,实现高速数据传输和处理。

本文将介绍基于FPGA的高速串行数据收发接口的设计原理、关键技术和应用。

一、设计原理在高速串行数据收发接口中,主要涉及到以下几个方面的技术:物理接口、时钟同步、帧同步、数据编码和解码、差分信号传输等。

1.物理接口物理接口是指FPGA与外部设备之间进行数据传输的接口。

常见的物理接口包括LVDS、USB、PCIe等。

在设计中,需要选择合适的物理接口,并实现与FPGA之间的连接。

2.时钟同步时钟同步是指接收端与发送端的时钟信号保持同步,以确保数据的准确传输。

常见的时钟同步技术包括PLL锁相环、FIFO缓存等。

在设计中,需要使用适当的时钟同步技术,保证数据的稳定传输。

3.帧同步帧同步是指接收端能够正确识别数据帧的起始和结束标志,以及数据帧中的各个字段。

在设计中,通过使用标志位或者特定的编码格式,可以实现帧同步,保证数据的正确接收和解析。

4.数据编码和解码数据编码和解码是指将要传输的数据进行编码,以提高传输速率和抗干扰能力。

常见的数据编码和解码算法包括差分编码、曼彻斯特编码、8b/10b编码等。

在设计中,需要根据具体的应用需求,选择合适的数据编码和解码算法。

5.差分信号传输差分信号传输是指将发送端的信号分为正负两路进行传输,以提高传输速率和抗干扰能力。

差分信号传输可以有效抑制共模干扰和噪声,提高信号的可靠传输。

二、关键技术在基于FPGA的高速串行数据收发接口设计中,需要关注以下几个关键技术。

1.时钟和数据恢复由于传输中的时钟和数据可能存在相位偏移和抖动等问题,因此需要使用时钟和数据恢复技术来保持时钟的稳定,并将数据恢复到正确的状态。

2.信号完整性由于传输线上会存在反射、串扰等问题,需要采取合适的电路设计和布线策略,以提高信号的抗干扰能力和抗噪声能力,保证数据的可靠传输。

verilog RS232 串口通信 verilog

verilog RS232 串口通信 verilog
//=============================顶层模块=====================================
module uart_top(clk,rs232_rx,rs232_tx);
input clk; //时钟信号50M
input rs232_rx; //数据输入信号
bps_start,
clk_bps,
rs232_rx,
rx_data,
rx_int
);
input clk; //50MHz时钟
input rst_n; //低电平复位信号
input rs232_rx; //接收数据信号
);
uart_rx uart_rx(//数据接收模块
.clk(clk),
.rst_n(rst_n),
.bps_start(bps_start1),
.clk_bps(clk_bps1),
.rs232_rx(rs232_rx),
.rx_data(rx_data),
else
begin
if(int_cnt<250) int_cnt<=int_cnt+1'b1;
end
end
assign data_flg=(int_cnt==10)?1'b1:1'b0;
always @(posedge data_flg or negedge rst_n)
output rs232_tx; //数据输出信号
wire clk_bps1,clk_bps2;
wire bps_start1,bps_start2;
wire [7:0] rx_data;

【CPLD+Verilog】CPLD实现SPI接口

【CPLD+Verilog】CPLD实现SPI接口

CPLD 实现SPI 接口1 实现原理CPLD 实现SPI 接口模块,通过对寄存器的操作,实现SPI 接口功能,对外部SPI 设备进行访问。

CPLD 内部SPI 模块逻辑框图如下所示。

CLK_DIVRX_SHIFT_REGSTATUS LOGICspi_clkspi_cs spi_dospi_tx_data_we_pulsereset_n spi_tx_data spi_rx_data spi_clk_div spi_rx_data_rd_pulsespi_dispi_tx_data_we_busy spi_rx_data_rd_ready spi_data_tx_we_overflow spi_data_rx_rd_nop spi_data_rx_rd_overtime cpld_clkCONTROL LOGICCOUNT LOGIC通过对主时钟分频,得到的SPI 接口时钟,其分频值可通过spi_clk_div 值设定,最小为6分频,当设置分频值低于6分频时,默认6分频。

SPI 接口的片选信号spi_cs 在写数据传输寄存器spi_tx_data 时,通过自动产生写脉冲spi_tx_data_we_pulse ,逻辑综合生成。

spi_rx_data_rd_pulse 在读取接收数据spi_rx_data 的数据时自动产生。

spi_di 和spi_do 分别由数据移位寄存器通过数据移位产生和接收。

spi_clk 由内部分频时钟和传输状态逻辑综合输出,在有数据时输出,无数据时保持高电平。

状态逻辑spi_tx_data_we_busy 信号分别表示数据正在传输,无法写入spi_tx_data 寄存器; spi_rx_data_rd_ready 信号表示数据接收完成,可读取spi_rx_data 寄存器的值。

错误状态逻辑spi_data_tx_we_overflow 信号表示在spi_tx_data 寄存器中写入了待传输值后,还未传输就又写入新的传输数据,表示写数据溢出。

rs232 ttl 原理

rs232 ttl 原理

rs232 ttl 原理
RS232 TTL(也称为RS232 to TTL)是一种串行通信协议转换器,用于将RS232标准电平转换为TTL(逻辑电平)。

RS232是一种标准通信接口,通常用于连接计算机和外部设备,如调制解调器、打印机和传感器等。

它使用负电平表示逻辑“1”,正电平表示逻辑“0”。

而TTL是一种逻辑电平,逻辑“1”
用高电平(通常为5V),逻辑“0”用低电平(通常为0V)表示。

RS232 TTL转换器的工作原理如下:首先,将RS232端口的
电平转换为TTL电平。

这可以通过芯片内部的电平转换电路
来实现,该芯片包含电平转换晶振、逻辑门电路和电容电路等元件。

通过这些元件,可以将RS232的负电平转换为TTL的
高电平,并将RS232的正电平转换为TTL的低电平。

然后,转换器将转换后的TTL信号通过输出接口输出给外部
设备。

这个输出接口通常是一组引脚,其中一个引脚用于传输数据,另一个引脚用于接收数据。

通过这些引脚,外部设备可以接收和发送TTL信号,并与计算机进行通信。

总的来说,RS232 TTL转换器通过电平转换电路将RS232标
准电平转换为TTL电平,实现了不同电平之间的通信转换。

这样,计算机就可以与使用TTL电平的外部设备进行通信,
而不需要进行额外的电平转换或接口转换。

cpld原理

cpld原理

cpld原理CPLD原理CPLD全称是Complex Programmable Logic Device,中文名称为复杂可编程逻辑器件。

它是一种集成电路芯片,可以通过编程来实现逻辑功能。

CPLD由可编程逻辑器件(PLD)和可编程器件(PROM)组成,其中可编程逻辑器件包括可编程逻辑阵列(PLA)、可编程的中间级逻辑和可编程输入/输出(I/O)等组件。

CPLD的原理是通过编程来配置其逻辑功能。

首先,需要使用HDL (Hardware Description Language)来描述所需的逻辑功能。

常用的HDL语言包括VHDL和Verilog。

接着,使用逻辑综合工具将HDL代码转换成相应的逻辑门电路。

然后,将逻辑门电路映射到CPLD的可编程逻辑阵列中,通过PLA和中间级逻辑来实现复杂的逻辑功能。

最后,将输入/输出引脚与CPLD的可编程输入/输出连接,完成CPLD的配置。

CPLD的核心是可编程逻辑阵列(PLA),它由一系列可编程逻辑单元(PLU)组成。

每个PLU包含逻辑门电路和触发器,可以实现基本的逻辑功能和存储功能。

PLA中的PLU可以通过编程控制来连接或断开,从而实现不同的逻辑功能。

CPLD的可编程输入/输出可以用于与外部设备进行通信,如与其他芯片进行数据交换或与外部电路连接。

CPLD的优点之一是灵活性。

由于其可编程性,CPLD可以根据实际需求进行定制化设计。

它可以适应不同的应用场景,并实现不同的逻辑功能。

此外,CPLD还具有较高的集成度和可靠性,可以在小尺寸的芯片上实现复杂的逻辑功能。

CPLD在数字电路设计和嵌入式系统中起着重要的作用。

它可以用于实现各种逻辑功能,如控制逻辑、数据处理和通信接口等。

在数字电路设计中,CPLD可以替代离散逻辑电路,简化电路设计和布局。

在嵌入式系统中,CPLD可以与微处理器或微控制器配合使用,实现系统级的控制和接口功能。

除了CPLD,还有一种类似的器件称为FPGA(Field Programmable Gate Array),它与CPLD有一些相似之处,但也存在一些差异。

基于CPLD的PLC背板总线协议接口芯片设计

基于CPLD的PLC背板总线协议接口芯片设计

基于CPLD的PLC背板总线协议接口芯片设计摘要:设计了一组基于CPLD的PLC背板总线协议接口芯片,协议芯片可以区分PLC的背板总线的周期性数据和非周期性数据。

详细介绍了通过Verilog HDL语言设计状态机、协议帧控制器、FIFO控制器的过程,25MHz下背板总线工作稳定的试验结果验证了协议芯片设计的可行性。

可编程逻辑控制器(PLC)主机是通过背板总线支持扩展模块的连接,背板总线是PLC 主机同I/O扩展模块之间的高速数据通路,支持主机和扩展模块之间的I/O 数据刷新。

背板总线的技术水平决定了PLC 产品的I/O 扩展能力,是PLC 设计制造的核心技术。

目前,PLC 大多采用串行通信技术实现背板总线,串行总线引线少、硬件成本低,跟并行总线相比不容易受干扰,串行总线可以提高在恶劣的工厂和工业环境下自动化设备的可靠性。

用于串行通信技术的可选类型包括I2C、UART、SPI、USB 和以太网等,一般来说,很多作为PLC 主芯片的单片机自身都集成了这些外设部件。

但是单片机内部集成的I2C、UART、SPI 外设通信速率太慢,根本不能满足底板总线的通信速度要求。

USB 和以太网的通信速度虽然很快但由于它们都是通用的接口,在通信协议处理时需要单片机的干预,单片机处理数据速度较慢,因此整体通信速度仍然很慢。

一台大型的PLC 采集上千点I/O 数据的时间一般不到1ms,要满足如此高速的通信要求必须设计专门的背板总线。

1 背板总线工作原理如图1 所示,基于背板总线的数据通信流程如下:(1)PLC 主机的命令通过主机协议芯片发送到背板总线;(2)从机协议芯片把接收到的命令给扩展模块的单片机,某一个扩展模块的单片机做出应答,通过从机协议芯片把应答数据送往背板总线;(3)主机协议芯片收到应答数据,并送往PLC主机的单片机。

图1 背板总线通信框图PLC 主机发往背板总线的数据可以分成两类:一类是I/O 刷新数据,具有周期性,数据交换非常频繁;另一类是诊断性数据,具有非周期性,出现机会较少。

fpga利用io口实现rs422通信的代码

fpga利用io口实现rs422通信的代码

fpga利用io口实现rs422通信的代码RS422通信是一种全双工、差分信号传输的串行通信协议。

相较于RS232通信协议,RS422通信协议传输距离更远、传输速度更快、噪声干扰更小,并且能够支持多个设备同时通信。

在本文中,我们将介绍如何利用FPGA的IO口实现RS422通信。

首先,我们需要为FPGA选择一个支持RS422协议的IO口。

以下是常用的几种IO口:1. 差分输出:FPGA通过两个相反的信号线向外输出差分信号。

3. 孤立输入:FPGA通过单一信号线接收差分信号,并通过内部电路将差分信号转换为单压缩信号。

在本文中,我们将选择差分输入的方式进行RS422通信。

接下来,我们需要配置FPGA的IO口。

一般来说,FPGA会提供相应的IP核用于配置IO口,我们可以通过IP核配置管理器进行配置。

以下是常见的IO口配置:1. 设置IO口的功能:将IO口设置为输入、输出或双向模式。

2. 设置IO口的电平:确定IO口的高电平和低电平的电压值。

3. 设置IO口的上下拉电阻:控制IO口的输入输出电阻。

4. 设置IO口的保护电路:为了保护IO口不受过电压或过电流的损坏,通常需要为IO 口配置保护电路。

接下来,我们可以开始编写FPGA的代码。

以下是实现RS422通信的代码:```verilogmodule RS422 (input clk, //时钟信号input rst, //复位信号input [7:0] rx, //接收端口output [7:0] tx, //发送端口output de, //差分输出使能output re, //差分输入使能output [1:0] ie //输入使能);//定义常量localparam BIT_CNT = 8; //一帧数据位数 localparam CNT_MAX = 16'h3FFF; //计数器最大值 localparam BAUD_RATE = 9600; //波特率//计数器reg [15:0] cnt;always @(posedge clk or posedge rst) beginif (rst) begincnt <= 0;end else beginif (cnt >= CNT_MAX) begincnt <= 0;end else begincnt <= cnt + 1;endendend//接收数据wire [BIT_CNT-1:0] rx_data;reg rx_flag;reg rx_err;reg rx_done;uart_rx #(BIT_CNT) uart_rx_inst (.rx(rx),.clk(clk),.rst(rst),.data(rx_data),.flag(rx_flag),.err(rx_err),.done(rx_done));assign tx = tx_data;//差分接收器使能信号assign re = 1;//输入使能assign ie[0] = tx_done;assign ie[1] = rx_done;endmodule```以上代码中,我们使用了一个基于计数器的时序生成器来产生波特率同步信号,用于控制发送和接收的时序。

RS-232串口通信

RS-232串口通信

目录1. RS-232串口通信简介 (1)2. 设计目的和要求 (2)3. 单元模块简介 (2)3.1单片机主芯片 (2)3.2 RS 232接口电路 (3)4. 软件设计原理 (4)4.1软件工具 (4)4.2 程序实现 (4)5.结论 (6)参考文献 (7)1.RS-232串口通信简介串口通信的概念非常简单,串口按位(bit)发送和接收字节。

尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另外一根线接收数据。

它很简单并且能够实现远距离通信。

比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。

大多数计算机包含两个基于RS232的串口。

串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。

同时,串口通信协议也可以用于获取远程采集设备的数据。

PC机具有强大的监控和管理功能,而单片机则具有快速及灵活的控制特点,通过PC 机的RS 232串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。

随着PC机技术和单片机技术的日益成熟,单片机与PC机通信技术的应用也越来越广泛,从家用电器、工业控制到医疗仪器、军事应用都涉及到单片机与PC机的通信。

单片机采集到的数据和现场状态通过串行通讯传送到PC机进行分析、存储或显示,PC机的命令和控制通过串行口传送到单片机以监控其他设备的运转,因此串行通讯成为了现场监控系统与上位机联系的桥梁。

串口是计算机上一种非常通用的设备通信协议,串口通信协议也可以用于获取远程采集设备的数据,串行通信是计算机和外部设备进行数据交换的重要渠道,由于其成本低,性能稳定并遵循统一的标准,因而在工程中被广泛应用。

本课题运用的就是单片机来与电脑进行串口通信,主要是以单片机为核心,将温度传感器DS18b20采集的信息通过串口传给电脑显示,并在1602上扩展显示,此外还通过串口给单片机下发命令控制扬声器发出声音。

CPLD作业

CPLD作业

《CPLD/FPGA原理及应用》作业——正弦信号的发生及传输班级:电信10-2班姓名:晁远征学号:311008001107目录《CPLD/FPGA原理及应用》作业 0——正弦信号的发生及传输 0目录 (1)摘要 (2)硬件原理 (2)一.全局原理 (2)二.FPGA-EP2C5T144C8 (2)三.地址发生器 (4)四.串口通讯 (4)软件部分 (6)一..mif文件的产生 (6)二.ROM的配置 (8)三.FIFO的配置 (11)四.RTL视图 (13)软件部分 (14)一.地址发生器: (14)二.串口发送 (14)参考文献 (21)心得体会 (21)摘要20世纪60年代中期,TI公司大量生产了通用IC,如分别面向商用的军用的74系列和52系列。

这些通用的IC甚至沿用至今,仍是电子工程师们电路板上不可或缺的一部分。

20世纪80年代,出现了可编程逻辑器件,如CPLD和SPLD,它们与ASIC相比,具有可重配置性和较短的开发调试时间,但实现的功能和电路都相对简单。

为了弥补这一需要,Xilinx公司推出了第一块现场可编程逻辑器件,并且在其后的几十年间,FPGA得到了巨大发展。

目前FPGA主流厂商是Altera公司和Xilinx公司,它们的东西大都是类似的,不论从器件上还是开发软件上基本都这样。

FPGA的开发主要用到硬件描述语言,常见的是verilog和VHDL,当然用SOPC Bulider的话,可以用C。

但是片上系统不是FPGA的强项。

FPGA初诞生时,逻辑资源相对匮乏,当时的FPGA主要就用于实现粘合逻辑、中等复杂度的状态机或者是一些复杂度不高的数据处理。

实时控制也是FPGA的一个重要应用。

我比较熟悉verilog HDL,所以代码都用verilog。

Verilog代码主要分可综合的和不可综合的代码。

可综合代码主要用在RTL级,不可综合的主要用来仿真。

(个人是这么认为的)。

FPGA很强大,用它来做一个正弦信号发生器并进行传输实在是大材小用。

基于CPLD的LVDS数据传输系统的设计与研究

基于CPLD的LVDS数据传输系统的设计与研究

基于CPLD的LVDS数据传输系统的设计与研究郭鹏翔;祖静;尤文斌【摘要】In order to solve the high-speed signal processing and transmission bottlenecks in data transfer speed distance problems, a CPLD-based high-speed LVDS bus data transfer system is designed, constructed a kind of LVDS chips, drives and high-speed adaptive equalizer for the based transmission system, the introduction of chip FIFO (FIFO) as a data buffer, the system using XILINX CPLD real-time control and monitoring, and fully taking into account that there is no synchronization of data transmission should take effective measures. Internal control procedures designed and implemented using VHDL language, reducing system complexity and cost, improved system integration and stability. Modelsim software application designed system was timing simulation, the simulation results obtained verify the design requirements.%为解决目前高速信号处理中的数据传输速度瓶颈以及传输距离的问题,设计并实现了一种基于CPLD的LVDS总线高速数据传输系统,构建了一种以LVDS芯片、高速驱动器,以及自适应均衡器为基础的传输系统,引入先进先出芯片(FIFO)作为数据缓冲,利用XILINX CPLD对系统进行实时控制与监测,并且充分考虑到数据传输过程出现不同步时应该采取的有效措施。

基于CPLD技术和VerilogHDL实现CCD驱动电路设计

基于CPLD技术和VerilogHDL实现CCD驱动电路设计
少 与 光 的 强 度 和 C D 单 元 光 积 分 时 间 成 正 比 J C 。 T D73 C 10 C型 C D 结 构 如 图 1 示 。 它 由760 P C 所 5 个 n结 光 电二 极 管 构 成 光 敏 元 阵 列 , 中有 10个 哑 元 和 75 0 有 其 5 0 个 效元 , 每个 光 敏 单 元 的尺 寸为 6 m 长 , m 高 , 6 中心 距 为
升沿 、 下降沿 时 这 2个 脉 冲必 须分 别 保 持在 高 、 电平。 低
R 、 P是复位脉冲 , 位一次 向外 输 出一 个信号 , 中 C SC 复 其 P
的相 位 较 R S稍 落 后 , 且 在 S 在 高 电 位 时 复位 脉 冲 要 保 并 H 持在低位 。 C D 的光 积 分 时 间是 2个 S 的脉 冲 间隔 , 储 电荷 转 C H 存 移 时 间 是 S 的脉 宽 时 间 。模 拟 移位 寄 存 器 在 1 、 E脉 H E蛇
第3 1卷
第 6期
四 川 兵 工 学 报
21 0 0年 6月
【 自动化技术】
基于 CL P D技 术 和 V roH L实 现 ei g D l C D驱 动 电路 设 计 来 C
刘新峰 , 李忠科 , 浩 刘
( 第二炮兵工程学 院 , 西安 7 02 ) 10 5
摘要 : 针对电荷耦合器件 C D在进行图像扫描时需要稳定 的外部驱 动电路支持才 能工作 , C 而以往设计 的驱动 电 路 存在体积 大 、 易受干扰等缺点 , T D10 C为例 , 以 C 73 设计出一种基于复杂可编程逻辑器件( P D) C L 的时序驱动 电 路 。本驱动 电路各模块采用 V roH L语 言编写 , eig D l 减少 了驱动 电路体积 , 同时具有较好 的稳定性和保密性 。 关键词 : P D; eig D ; c L V roH L 图像 扫描 ;C 时序驱动 电路 l C D;

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

基于FPGA的多串口通信设计与实现
a p p l i e d i n he t a s y nc h r o no u s c o mm un i c a io t n wi d 1 l o w ba u d r a t e . ‘
Ke y Wo  ̄S : s e r i a l p o r t ; AS I C; F P GA; UAl k T; i n t e =u p t c o n t r o l l e r ; VHDL
串行通信 因为具有传输线少、 成本低、 配置灵活等特 点, 得到了 广泛应用 , 通用异步收发传 输器 ( Un i v e r s a l As y n c h r o n o u s Re — c e i v e r / Tr a n s mi t t e r ) , 是一种 比较常用的接 口电路 , 主要用于 串行数 据和并行数据的转换。 一般该接 口由专用的UAR T 芯片完成 , 例如 S Cl 6 C 5 5 4 B I B 6 4 , 该接 口芯片具有4 路独立 的通道 , 同时提供多种控 制功能 , 但在实际使用 中往往只使用一种特定控制方式 , 这 不仅造 成 电路复杂和浪费 , 而且会使P C B 面积增 大, 布线复杂 。 [ 1 1 F P G A( F i e l d - P r o g r a mma b l e G a t e Ar r a y ) , 即现场可编程 门 阵列 , 它是作为专用集成电路领域中一种 半定制电路出现 的 , 既解 决了定制 电路的不足, 又克服了原有可编程器件 门电路数有 限的缺 点。 F P G A中具有 丰富的触发器和I / O口, 采用描述语言(ቤተ መጻሕፍቲ ባይዱVHD L 和 V e r i l o g HD L )  ̄行设计 , 用户可以根据需要, 描述 出具有各种功 能的

用CPLD实现同步串口转异步串口

用CPLD实现同步串口转异步串口

用CPLD实现同步串口转异步串口
王绍翾;赵焕军;张林;罗军辉
【期刊名称】《电子元器件应用》
【年(卷),期】2002(4)12
【摘要】针对同步设备与异步设备之间进行串行通信时经常存在的转换问题,提出一种采用复杂可编程逻辑器件(CPLD)实现的解决方法,并详细介绍了具体实现过程,通过实践证明,该方法灵活方便,可靠性高,可以满足一般工程应用的要求.
【总页数】2页(P13-14)
【作者】王绍翾;赵焕军;张林;罗军辉
【作者单位】北京大学电子学系,北京,100871;西安电子科技大学电子工程学院,陕西,西安,710071;西安电子科技大学电子工程学院,陕西,西安,710071;西安电子科技大学电子工程学院,陕西,西安,710071
【正文语种】中文
【中图分类】TN409
【相关文献】
1.用CPLD实现同步串口与异步串口的转换 [J], 简思平;周学才;张基宏
2.基于DSP同步串口的异步串行通信接口的设计与实现 [J], 杨剑;贾冲;杨吉斌
3.基于CPLD实现ISA总线异步串口扩展 [J], 刘思慧;陈华明;欧钢
4.基于CPLD的同步/异步串口转换的实现 [J], 商丹;高永清
5.用FPGA实现异步串口与同步串口的转换 [J], 李文亮;姚冬苹
因版权原因,仅展示原文概要,查看原文内容请购买。

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

基于Verilog的RS-232串口通信在CPLD上的实现
CPLD(Complex Programable Logic Device)是一种复杂的用户可编程逻辑器件。

采用连续连接结构,延时可预测,从而使电路仿真更加准确。

CPLD 是标准的大规模集成电路产品,可用于各种数字逻辑系统的设计。

开发工具Quartus II、ISE等功能强大,编程语言灵活多样,使设计开发缩短了周期。

随着嵌入式的发展,对数据的传输和人机交互通信的要求越来越高。

而串口通信因其资源消耗少、技术成熟而被广泛应用。

系统中上位机与嵌入式芯片之间的交互通信可以通过专用集成芯片作为外设RS-232异步串行接口,如TI、EXAR、EPIC公司的550、452等系列UAWT集成电路,或在拥有Nios系统的FPGA上可以方便地嵌入UART模块。

但是在设计中用户会提出自己的要求,如:数据加密或只使用UART部分功能等,即要求更灵活的UART。

而且有时CPLD资源剩余,出于成本考虑也会要求设计一种模拟的UART。

对于上述的两种情况,就可以在CPLD其丰富的资源上制作一款UART,实现PC机与嵌入式系统之间的数据交换。

1 串口通信协议
1.1 UART简介
通用异步收发器(Universal Asynchronous Receiver Transmitter,UART)。

异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小。

具有相关工业标准提供的标准的接口电平规范等优点,在工业控制领域被广泛采用。

异步通信一帧字符信息由4部分组成:起始位、数据位、奇偶校验位和停止位。

本设计基于RS-232的数据帧结构,设置数据帧结构如图1所示:1 bit起始位,8 bit数据位,1 bit停止位,无校验位。

每帧实质上传送1 Byte数据。

1.2 自定义数据包格式
多个上文所描述的帧就可以组成一个数据包。

串口通信是在RS-232数据帧结构的基础上定义的,传输以数据包为单位进行。

包结构如图2所示。

本文采用和校验的结构,一个数据包包含15 Byte。

其中第1个字节是数据包头即握手字符。

第2字节为控制字符,EE代表写命令,DD代表读命
令。

第3至第14为可利用数据。

第15字节作为校验字符,理论上应等于这个数据包中数据字符串之和的后8bit。

2 设计方案
2.1 UART的设计结构
笔者设计采用模块化设计,方案的UART主要由逻辑控制模块、波特率发生模块、发送模块和接收模块等组成。

波特率发生模块可以建立精确的时钟,确保数据采样准确、工作时序顺畅。

逻辑控制模块、波特率发生模块、发送模块和接收模块完成工作有:确定数据起始位、数据收发,串并转换、建立握手连接、判断命令、数据校验等功能。

2.2 状态图
利用串口通信在数据交互过程中涉及到了多种工作状态,情况比较多样,而利用程序设计中的有限状态机(FSM)理论进行编程设计,这个问题可以迎刃而解。

有限状态机是由寄存器组和组合逻辑构成的硬件时序电路,有限状态机的状态(即由寄存器组各位的1和0的组合状态所构成的有限个状态)只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态。

本设计的有限个状态编码使用独热码形式,即寄存器组每一个bit位代表一种状态(如“0100”,“1000”为四态机中的两种状态),这种状态码的好处是避免了状态混乱。

状态机采用Mealy型有限状态机,这种状态机的下一个状态不但取决于各个输入值,还取决于当前所在状态,符合UART的工作原理。

逻辑控制模块、数据接收模块和发送模块的设计都使用到了状态机,其中以逻辑状态机为主状态机,其余两个为从状态机。

确定各种工作状态和工作流程后便可构建出状态图,方便直观地进行后续设计。

通过状态图可以方便、准确地得到程序设计框图如图4所示。

3 各模块设计
3.1 波特率发生器
串口通信必须要设定波特率,本设计采用的波特率为9 600 bit/s。

产生波特率的时钟频率是越高越好,这样才可产生较高且精确的波特率。

设计选用50M主频率要产生9600bit/s波特率,每传送一位数据需要5 208.33个时钟周期。

取一个最接近的数是5 208,则波特率为9 600.61,其误差约为0.006%,误码率很低可以确保通信正常。

波特率发生器要解决的另一个关键性问题是确保准确地捕获起始位“0”。

即时准确地捕获起始位不仅决定通信是否顺畅开始,而且还影响后续的数据采样过程可靠地进行。

方案采取了16分频的波特率发生器,即通过对50 M 总时钟源分频,得到一个9 600x16 Hz的时钟进行数据传输,这样每16个时钟信号采样1 bit数据。

在Rxd数据接收端口接收到从空闲高电平“1”跳变为起始位低电平“0”信号后,连续8个分频周期确认是否是起始位。

若是连续的低电平则捕获起始位,自此之后每16个时钟周期读取1 bit数据。

这种方法不仅确保了起始位的准确捕获,而且使数据采样点处于了数据的正中央保证了数据的准确。

3.2 接收器
在波特率发生器捕获起始位并启动后,接收器将开始工作。

其主要工作是
接收每一位数据,将串行数据移位存入缓冲寄存器,并在接收完一字节数据后将数据存入锁存器完成串并转换,同时发出char_ok信号通知逻辑控制模块一个字节的数据已经接收完毕。

接收器的部分程序如下所示:
3.3 逻辑处理模块
逻辑处理模块是模拟UART的决策模块。

它主要完成PC机与CPLD的握手、数据处理和数据校验、状态分析与给收发模块提供决策。

PC机要向CPLD发数据时,先向串口发送FF,FF表示PC机要与CPLD建立联系。

CPLD收到这个信息后,由逻辑模块的talk信号通知发射模块握手情况,发送器通过串口给PC机反馈信息,DD表示CPLD收到了PC机的要求并同意建立联系,CC表示握手不成功PC机可以再次发出请求。

握手成功后,PC机要向CPLD发出命令字符,E1表示写,E2表示读。

随后进入数据接收或发送状态,每个数据包接收完毕后逻辑处理模块进入下一状态——数据校验状态。

根据上文提到的本设计的数据校验采用和校验,数据校验完后逻辑处理模块会根据校验结果给出信号check,通知发
送模块Txd发送反馈信息给PC机。

逻辑控制模块的部分程序如下所示:
在逻辑接收模块中的重点是握手环节,它体现了PC机与CPLD相互对话的关键,后面两者的互相通信都是基于此而建立的。

应用上述思路设计的握手环节时序仿真如图5所示。

如图所示当char接收寄存器通过Rxd接收到一个字符信息后发出char_ok 信号,经逻辑控制模块得知是握手信息FF后,触发握手成功talk信号,并在下一时钟上升沿Txd从空闲状态的高电平“1”变为起始位“0”准备发送反馈信息给PC机。

3.4 发送器
发送器在接收逻辑处理模块给出的命令后发送相应的数据给PC机。

发送内容主要包括:数据正确或握手成功信息DD,示意PC机继续下一步操作;数据重发或握手失败CC,示意PC机重新发送数据;以及PC机欲从嵌入式系统中读出的数据。

4 实验验证
工程设计的某嵌入式系统要求PC机向CPLD发送数据。

CPLD选用ATREL 公司的MAX7000系列芯片EPM7128SLC84-15。

芯片拥有2 500个可使用门阵列、128个宏单元、8个逻辑阵列块、84个用户I/O接口。

CPLD的IO操作电平是TTL电平,通过MAX232电平转换芯片将PC机串口电平转换为TTL电平,就建立起了串口通信的电气基础。

PC机上拥有VC++编写的数据下载程序,波特率为9600 bit/s,每个数据帧含1位起始位,8位数据位,无校验位,1位停止位。

通信数据格式用上文提到的和校验数据格式,以数据包为单位发送,如图6所示。

从实验结果可看到PC机每发送一个完整的15 Byte数据包,CPLD回复握手成功和数据校验正确,表明设计可行。

5 结束语
本文从工程设计实际出发,没有选取通用的UART芯片,通过分析异步通信中UART的结构特点,运用CPLD的丰富资源和一些工程技术制作了自定义通信数据包格式的串口通信模块。

通过与PC机上数据传输程序联试,实现了信息的传输和人机互动,证明设计方案的正确。

如今嵌入式技术应用十分广泛而且市场需求很广阔,PC机与嵌入式系统的通信实现了人机互动使系统功能更加强大。

研究对增强嵌入式系统操作性有重要意义。

相关文档
最新文档