摘要: 数字存储示波器采用ARM 与FPGA 双处理器结合的嵌入式系统设计方案,重点介绍在FPGA 中如何实现对外围芯片的通信与驱动,采用VHDL 语言,以逐层描述的设计模式,分成ARM 接口通信控制模块和外围芯片驱动功能模块,整个设计主要负责接收ARM 的控制指令,根据其指令要求,发送控制命令到其它芯片驱动功能模块,协调整个数据采样过程,确保数据按照如采样率、采样方式、触发方式等参数设置要求进行采样,确保采样数据的可靠性。
数字存储示波器作为测试技术的重要工具,被广泛应用于各个领域,并逐步取代传统模拟示波器。其采样数据是波形运算和分析的基础,直接影响到整个数字存储示波器的准确性[1]。从这点出来,提出采用现场可编程逻辑器件( FPGA) 作为数字存储示波器采样控制系统的核心,从芯片间有效协助的角度,基于FPGA 设计ARM 接口通信控制模块和外围芯片驱动功能模块,以FPGA 为核心有效地组织其它芯片,共同完成数字存储示波器数据采样过程,确保数据按需求采样,有效地提高数字存储示波器的采样效率和数据的可靠性。
1 数字存储示波器的总体设计方案数字存储示波采用双处理器( ARM + FPGA) 的嵌入式系统设计方案[2],ARM 内嵌WINCE *** 作系统,整个采样系统主要在FPGA 里完成,从功能的角度分成采样信息处理子系统与采样控制子系统,本文着重介绍采样控制子系统的驱动部分,由ARM 接口控制模块与芯片驱动模块组成。如图1 所示:
2 系统驱动模块设计
2. 1 ARM 接口通信控制模块设计
ARM 接口通信控制模块为主要的控制模块,如图2 所示。
加入这个模块而不直接链接两个芯片有以下两点原因:
1) ARM 作为主控芯片的控制模块,引脚数量有限。如果ARM 接口直接与FPGA 接口相连,会占用ARM 过多的接口。
2) ARM 和FPGA 相连的信号线由于存在各种干扰,有时会出现毛刺现象[3],影响测量效果。
所以为了测量的稳定准确,需要加入FPGA 和ARM 的接口模块。此模块是本设计的重点也是难点。其原理以下结合图2 来说明。
ARM 接口通信控制模块左边为跟ARM 链接的接口,分别为1 路时钟cmd_clk,3 路的命令线cmd_sel[2. . 0],8 路数据线cmd_data[7. . 0]。右边为FPGA 响应的相关接口,在此不作一一讲述,下面主要讲术FPGA 与ARM 之间的通信协议。
cmd_clk 为1 位输出接口,是ARM 与FPGA 的同步时钟,用作同步通信。
cmd_sel[2. . 0]为3 位输出接口,用作设置cmd_data[7. . 0]的模式选择。
cmd_data[7. . 0]为8 位输出接口,是ARM 发送到FPGA 的命令或数据。
功能实现方面采用了VHDL 语言[4],以文本输入作为设计输入,主要运用CASE 与PROCESS 语句,部分程序如下所示。
PROCESS( cmd_clk, cmd_sel) / /进程,对cmd_clk 与cmd_sel 进行变化捕捉。
BEGIN / /进程开始。
IF cmd_clk'EVENT AND cmd_clk = '1' THEN / /捕捉时钟信号上升沿触发。
IF cmd_sel( 2) = '1' THEN / / cmd_sel( 2) = '1'时, cmd_data[7. . 0]的输出为数据模式
r_add_add < = cmd_data; / /数据赋值
ELSE / / cmd_sel( 2) = '0'时, cmd_data[7. . 0]的输出为命令模式
CASE r_add_add IS / /命令查询
WHEN X"00" = > IF cmd_sel = "000" THEN r_DAT_DATA_A( 7 DOWNTO 0) < = cmd_data; - -
ELSIF cmd_sel = "001" THEN r_DAT_DATA_A( 11 DOWNTO 8) < = cmd_data( 3 DOWNTO 0) ;
END IF;
WHEN X"01" = > IF cmd_sel = "000" THEN r_DAT_DATA_B( 7 DOWNTO 0) < = cmd_data;
ELSIF cmd_sel = "001" THEN r_DAT_DATA_B( 11 DOWNTO 8) < = cmd_data( 3 DOWNTO 0) ; END IF;
WHEN X"02" = > IF cmd_sel = "000" THEN r_DAT_DATA_C( 7 DOWNTO 0) < = cmd_data;
ELSIF cmd_sel = "001" THEN r_DAT_DATA_C( 11 DOWNTO 8) < = cmd_data( 3 DOWNTO 0) ; END IF;
WHEN X"03" = > IF cmd_sel = "000" THEN r_DAT_DATA_D( 7 DOWNTO 0) < = cmd_data;
ELSIF cmd_sel = "001" THEN r_DAT_DATA_D( 11 DOWNTO 8) < = cmd_data( 3 DOWNTO 0) ; END IF;
……/ /省略
WHEN X"08" = > IF cmd_sel = "000" THEN r_HC74_DAT_DATA( 7 DOWNTO 0) < = cmd_data; - -
ELSIF cmd_sel = "001" THEN r_HC74_DAT_DATA( 15 DOWNTO 8) < = cmd_data; - -
ELSIF cmd_sel = "010" THEN r_HC74_DAT_DATA( 23 DOWNTO 16) < = cmd_data; END IF;
/ / cmd_sel[2. . 0]的后两位作为数据位数的选择,这里可选为8 位、16 位、24 位。
……/ /省略
WHEN OTHERS = > r_X9313_DATA < = cmd_data( 4 DOWNTO 0) ;
END CASE;
END IF;
END IF;
END PROCESS;P
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)