基于FPGA的串行通信控制系统的设计
基于现场可编程门阵列FPGA的系统开发可以广泛应用于各行各业,ASIC设计、通信、控制、电力电子等。其主要优点有:设计周期短、功耗低,可实现更高集成度的数字系统和嵌入式系统等。用户可对FPGA内部的逻辑模块和I/O模块重新进行配置,以实现数字逻辑电路以及基于FPGA的SRAM、查找表(LUT)等。FPGA还具有静态可重复编程和动态在系统重构的特性,使得硬件的功能可以像软件一样通过编程来修改,从而提高设计的可靠性、稳定性和灵活性。传统的设计中,FPGA的功能仅局限于集成电路的应用和验证,然而随着电子技术的迅猛发展,集成度更高,功耗更低,基于FPGA的电路设计将发挥出更大的优势,使得在一片FPGA中实现一个完备的数字处理系统成为可能[1-3]。本文提出的基于FPGA的串行通信控制系统的设计与实现,是在Altera公司的FPGA Cyclone II芯片EP2C5的基础上实现的,运用VHDL语言编程,在Quartus II软件上进行编译、仿真,最终在FPGA开发板上成功实现下载和调试验证。
1 串行通信控制系统的基本原理
基本的通信方式可分为并行通信和串行通信两种。并行通信就是数据以成组的方式在多个并行信道上同时传输;而串行通信则是在传输过程中,二进制数据一位一位的通过一条通信信道,并且按照规定的规程依次传输,实现计算机与计算机或计算机与外部设备之间的通信(数据交换)。由于串行通信的收发方都只需要一条数据线,比较容易实现,而且长距离传输时也更加可靠,因此其应用十分广泛[4]。
串行通信控制系统的模型如图1所示,其基本原理是:信息源将待传输的消息转换成原始电信号(如电话系统中的电话机就可看成是信息源);发送设备对原始电信号进行某种变换或处理,使电信号符合信道的传输特性要求;信道是信息传输的通道,在串行通信时,代表信息的数字信号序列按时间顺序一个接一个地在信道中传输;接收端从收到的信号中恢复出相应的原始信号;受信者则将复原的原始信号转变成相应的消息(如电话机将对方传来的电信号还原成了声音);噪声源是信道中的所有噪声及通信系统中噪声的集合[5]。
2 系统整体设计方案
2.1 系统功能
(1)通过4×4键盘输入0~F数据,并将此输入数据发送给上位机,上位机可以准确接收所发送的数据。
(2)通过LED准确接收上位机串口调试助手发送的数据。
(3)波特率可分为2 400 b/s、4 800 b/s、9 600 b/s、19 200 b/s、38 400 b/s,并且可以随意修改。
2.2 设计方案
整个设计在Altera Cyclone II平台上采用了“自顶向下”的模块化设计思想,并使用硬件描述语言VHDL对电路进行描述。
根据功能要求,系统可分为4×4键盘扫描输入模块、LED显示模块、接收模块、发送模块和波特率产生模块5个功能模块,系统原理框图如图2所示。
设计原理为:4×4键盘扫描输入模块将所输入的数据转换为二进制代码传输给发送模块,发送模块再将此数据通过串口TXD发送到PC机;接收模块通过串口RXD接收由上位机或串口调试助手发送的数据,并且显示在数码管上;数据传输速率由波特率产生模块的输出频率决定,可以根据需要进行设置,如可设置为2 400 b/s、4 800 b/s等。
3 功能子模块的设计与实现
3.1 接收模块的设计
接收模块的主要功能为接收PC机发送8 bit二进制数。根据功能要求,采用VHDL硬件描述语言对其功能进行描述,模块顶层设计文件如图3所示,各端口分别为:bclkr(传输速率控制端,输入波特率产生模块的输出频率)、resetr(复位端)、rxd(接收端口,串行输入)、r_ready(接收就绪)、rbuf(接收寄存器)。该模块采用有限状态机设计。
3.2 发送模块的设计
发送模块的主要功能是将键盘按键值以给定的波特率发送给PC机。本文的设计思想是:当不发送数据时,数据信号线表现为高电平,即空闲位;当开始发送数据后,数据信号为低电平,也就是起始位,为了保证能够在发送数据时准确采样,采用频率为波特率16倍的输入时钟。输入时钟信号由波特率产生模块的输出提供。该模块采用VHDL硬件描述语言进行描述,顶层设计文件如图4所示,各端口分别为:bclkt(输入时钟)、resett(复位)、xmit_cmd_p(发送命令端)、txdbuf[7...0](发送缓冲器输入端)、txd(发送数据端)、txd_done(发送完毕)。该模块采用有限状态机设计,根据功能要求,电路包括空闲、起始、等待、移位、停止5个状态。
3.3 波特率产生模块的设计
波特率产生模块的主要功能:当输入不同数据时,将对输入的时钟信号有不同的分频比,从而产生不同的波特率。波特率发生器采用加法计数器来实现多种分频。产生38 400 b/s的VHDL程序如下:
process(clk,bo)
begin
case bo is
when 100=>clkout=clk38400;
when others=>clkout=null;
end case;
end process;
process(clk,res)
variable cnt5:integer range 39 downto 0;
begin
if res=′1′ then cnt5:=0; clk38400=′0′; //复位
elsif rising_edge(clk) then
if cnt5>=39 then cnt5:=0;clk38400=not clk38400;
//设置分频系数38 400波特率
else cnt5:=cnt5+1;
end if;
end if;
end process;
波特率为38 400 b/s的仿真波形如图5所示。其中,bo为波特率选择设置端口,将其分配给FPGA开发板的3个拨动开关,通过拨动开关输入相应的数据实现波特率设置;clk为系统时钟信号,频率为24 MHz;res为复位端;clkout为输出时钟,提供给接收和发送模块,实现不同波特率传输。
3.4 键盘模块设计
键盘模块的主要功能是将按键转换为8 bit二进制数,该功能的实现过程为:对于4×4键盘,通常连接为4行、4列,因此,要识别按键,只需要知道是哪一行和哪一列即可。为了完成这一按键识别过程,本设计首先确定行值,如果读入的4行均为高电平,则肯定没有键按下,如果读入的4行有一位为低电平,则对应的该行肯定有一个键被按下,这样便可以获得按键的行值;然后通过加法计数器进行列扫描,获得列值。将获取到的行值和列值组合成一个8 bit的数据,根据实现不同的编码对每个按键进行匹配。键盘模块仿真波形如图6所示。
3.5 数码管显示模块设计
数码管显示模块的主要功能是将所接收到的数据在8 bit七段数码管上进行显示。本设计中使用的是两个4 bit一体、共阴极型的七段数码管。因此,数码管中被输入高电平的这一段将会被点亮,反之则不亮。应用数码管的这一特点,给数码管相应的段输入高电平,从而实现相应数据的显示。通过位选端口来控制,被选通的数码管显示数据,其余关闭。实现数码管显示的VHDL代码如下[6]:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY led_display IS
PORT
(
ledclk: IN STD_LOGIC;
res: IN STD_LOGIC;
data: IN STD_LOGIC_VECTOR(7 downto 0);
ledout: OUT STD_LOGIC_VECTOR(7 downto 0);
sel: OUT STD_LOGIC_VECTOR(2 downto 0)
);
END led_display;
ARCHITECTURE led_architecture OF led_display IS
BEGIN
process(ledclk,res,data)
begin
if ledclk′event and ledclk=′1′ then
if res=′1′ then ledout=00000000;
end if;
case data is
when 00000000 =>ledout=00111111;
//显示数据0
when 00000001 =>ledout=00000110;
//显示数据1
when 00000010 =>ledout=01011011;
//显示数据2
: :
: :
when 00001111 =>ledout=01110001;
//显示数据F
when others =>null;
end case;
end if;
sel=000; end process;
END led_architecture;
- 基于Linux系统的软PLC设计(07-19)
- FPGA动态部分重构功能设计中的模块化设计方法(06-05)
- 基于51内核μPSD32xx单片机在税控器中的应用(12-30)
- 模块化设计在车载控制器程序设计中的应用 16(11-25)
- DSP HPI口与PC104总线接口的FPGA设计(04-14)
- 基于FPGA的AD7862接口电路设计(01-01)