福建志佳建设工程发展有限公司网站,vi品牌包装,网站的总体架构,如何进行网站的seo摘要 FPGA适合于大量数据处理的应用#xff0c;广泛应用于嵌入式系统。本文设计的FPGA模块需要对GPS、便携打印机和串口数据进行处理#xff0c;将详细介绍如何设计FPGA和不同外设之间的数据传输。同时#xff0c;在RTL编码中#xff0c;编写使综合与布局布线效果更佳的代码…摘要 FPGA适合于大量数据处理的应用广泛应用于嵌入式系统。本文设计的FPGA模块需要对GPS、便携打印机和串口数据进行处理将详细介绍如何设计FPGA和不同外设之间的数据传输。同时在RTL编码中编写使综合与布局布线效果更佳的代码。
关键词 FPGA 综合
引言 FPGAFieldProgrammable Gate Array即现场可编程门阵列包括可配置逻辑模块CLBConfigurable Logic Block、输出输入模块IOBInput Output Block和内部连线Interconnect三个主要部分。FPGA最大的优点就是可编程性不投片也能开发自己的芯片或者作为ASIC芯片的样片。FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一在嵌入式系统中广泛应用特别是大批量的数据传输的应用。本设计采用FPGA实现一个系统中的数据传输模块的控制、采集功能包括的外设有GPS接收设备、便携打印机和串口。设计中考虑复用问题本设计的策略还强调RTL编码和综合使设计出来的数据传输模块逻辑能使综合与布局布线效果更佳。
1 模块硬件设计 FPGA数据传输模块硬件是独立出来的一块PCB板包括的器件有Xilinx Spartan FPGA 两片XCF01s为FPGA做配置一片RAM芯片ISC61C1024电源芯片、串口插座和GPS接收装置等FPGA中没有和上述芯片连接的引脚引出到PCB板两侧部分和嵌入式处理器连接剩余引脚提供给系统扩展。FPGA有多种配置模式本文采用可以采用串行PROM编程FPGA两片XCF01s以菊花链方式连接。图1为硬件模块框图。 2 FPGA总体设计 本模块中的FPGA具体功能为
1采集GPS传输来的串行数据。因为本系统采集的GPS数据较多所以通过解码后存储到外部RAM中。如果使用的FPGA资源丰富可以考虑把数据存储到FPGA内部。 2采集串口传输来的串行数据。根据需求该串口数据频率不高采用一个FPGA内部寄存器就能满足要求。
3输出数据到便携打印机。在FPGA中建立一块64个8位数据的寄存器组保存将要打印的数据通过串行编码把并行数据转化为串行数据输出到便携打印机。
FPGA设计分为如下几个部分主控逻辑、串行数据解码、串行数据编码、RAM读写逻辑、打印机写逻辑和串口接收逻辑FPGA设计框图如图2所示 3 详细设计
3.1主控逻辑
FPGA中的主控逻辑控制模块负责数据切换把CPU需要接收或传送的数据送到处理器数据总线上。在本模块中处理器需要接收的数据是GPS和串口的数据需要发送的数据是打印机的数据。微处理器每隔一定时间现设定为1s读取一次RAM中的GPS数据根据设计1s内数据不会超过RAM的容量此时控制逻辑切换GPS数据到总线串口的数据到来时间不确定也不频繁采用中断的方式通过中断处理程序来读取此时切换到串口数据需要给打印机数据的时候切换到打印机数据。这三种数据根据不同的总线地址来判断。
3.2 串行数据编码解码 本模块的串行数据帧格式定义为1位起始位、8位数据位和1位停止位波特率为9600。
解码模块中采样时钟是波特率的16倍为了防止毛刺采用二次采样方式VerilogHDL代码如下rxd1和rxd2是两个串接寄存器因为串行数据在不传送字符时保持为1所以初始化为1。rxd直接与输入的串行信号相连不断地检测一旦有检测到0则应该准备接收数据了。
always (posedge clk16x or negedge rst)
if (!rst) begin rxd1 1b1 ; rxd2 1b1 ;
end
else begin rxd1 rxd ; rxd2 rxd1 ;
end
解码中最主要的逻辑是串并转换这通过移位寄存器实现移位寄存器表示为rsr[0] rxd2rsr[7:1] rsr[6:0]。同时通过计数器来判断收到了多少位数据如果需求中不是8位数据位那么可以通过更改计数器来接收不同的数据。
编码逻辑将并行数据转换为所定义的串行帧格式编码也是通过移位寄存器将串行数据一位一位发送到便携打印上。
3.3 RAM读写 RAM读写部分实际上是一个异步FIFO控制逻辑FIFO是一种先进先出的电路使用在数据接口部分用来存储、缓冲在两个异步时钟之间的数据传输。RAM写的时钟是处理器时钟读的时钟是编码器提供的时钟这两个时钟域是不同的。
FIFO控制逻辑利用状态机来编写分为空闲态、准备读状态、读状态、读完成状态、准备写状态、写状态和写完成状态。逻辑中设置两个读写地址寄存器如图3所示通过地址判断设置存储器的空、满状态。如果存储器空则不能读存储器满不能写。判断的条件是若rp1wp且进入读状态则存储器为空停止读wp1rp且进入写状态则存储器为满停止写。 对于硬件描述语言不同的书写风格导致综合出的网表在面积、速度和效率上的差别都很大。这里的逻辑采用三段式状态机描述方法虽然代码结构复杂了一些但是消除了组合逻辑输出的不稳定与毛刺的隐患而且更利于时序路径分组一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。三段式状态机的格式如下,三段式并不指三个always模块实际上更复杂的设计always块大于三个。
always (posedge clk or negedge rst_n) if(!rst_n) current_state IDLE; else current_state next_state; always (current_state) begin next_state x; case(current_state) S1: if(...) next_state S2; ... endcase
end always (posedge clk or negedge rst_n)
…/*初始化*/ case(next_state)
S1:out1 1b1;
S2:out2 1b1;
default:...
endcase
end
3.4 打印机写逻辑 打印机写逻辑中定义了一块FPGA内部的寄存器组也采用FIFO方式。在该模块中读写时钟不同所以也是异步FIFO亚稳态必定会发生在异步FIFO中所以对写地址/读地址采用格雷码。同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率对多个触发器的输出所组成的写地址/读地址可以采用格雷码。由于格雷码每次只变化一位采用格雷码可以有效地减少亚稳态的产生。本逻辑通过总线地址译码转换出寄存器地址的格雷码地址数据的n与n1n1,2,……n; n1位取0位异或即可得出对应的格雷码。因为SRAM中地址总数远远大于64所以没有使用格雷码因为译码部分会占FPGA面积。如果采用资源较多的FPGA可以加入这部分。格雷码的Verilog编码如下
module GARY (EN ,ADDR_IN ,ADDR_OUT );
parameter SIZE 5;
input EN ;
input [SIZE:0] ADDR_IN ;
output [SIZE:0] ADDR_OUT ; assign ADDR_OUT [0] (ADDR_IN [0] ^ ADDR_IN [1] ) EN ;
assign ADDR_OUT [1] (ADDR_IN [1] ^ ADDR_IN [2] ) EN ;
assign ADDR_OUT [2] (ADDR_IN [2] ^ ADDR_IN [3] ) EN ;
…
assign ADDR_OUT [5] (ADDR_IN[5] ^0) EN ;
endmodule
3.5 串口接收逻辑 串口接收逻辑相对简单串行解码后的值存储到定义的寄存器中然后向处理器发中断信号通过中断处理程序来读取该数据。一般中断信号是边沿触发那么Verilog逻辑产生一个0-1跳变。不同处理器的边沿触发不同0-1或者1-0要根据实际情况设置。
4 小结
FPGA是一种有效的ASIC开发手段在嵌入式应用中使用广泛。本文采用Xilinx FPGA实现了多个外设之间的数据通信这种方式将数据采集独立开来能减轻处理器的负担。同时使用FPGA也能增强功能的灵活性和可扩展性。
参考文献
[1] 夏宇闻Verilog数字系统设计教程北京航空航天大学出版社2003年7月第一版
[2] Westor Wang,How to design FSMLatticInc.2006
[3] www.xilinx.com