一、前言
使用FPGA测试IO速率,用于后续驱动高速AD/DA等高速芯片做铺垫,很多芯片的驱动都是使用并行接口,不是使用专用接口的,这样采样速率的快慢就有CPU的时许周期决定了。
本文测试FPGA和STM32,后续如果用到更快的芯片也会补充此文,如果是带linux系统的,可以参照此贴
二、环境
编译软件QuartusII13.1、Keil5
语法Verilog、C
芯片EP4CE6F17C、STM32F407、STM32H750
三、正文
1.FPGA的EP4CE6F17C芯片测试
测试程序
module top_fpga(
//global signal
input clk, //50MHz
//led
output testF7, //high active
output testD6 //high active
);
//寄存器定义kbq,测试IO翻转速率
reg [31:0] timer1=0;
reg led_1=0;
reg led_2=0;
assign testF7 = led_1;
assign testD6 = led_2;
always @(posedge clk)
if (timer1 == 32'd49) //1 秒计数(50M-1=49_999_999) (1ms d49_999)(1us d49)(100ns d4)()()
timer1 <= 0; //计数器清零
else
timer1 <= timer1 + 1'b1; //计数器加 1
//LED 控制
always @(posedge clk)
begin //最快的时钟翻转速率,50M晶振20ns周期,实测io翻转20ns,一周期40ns
led_1 <= !led_1; //LED 点亮
led_2 <= !led_1; //LED 点亮
end
// if (timer1 == 32'd29)//计数器计到 0.5 us
// begin
// led_1 <= 1'b1; //LED 点亮
// led_2 <= 1'b1; //LED 点亮
// end
// else if (timer1 == 32'd49) //计数器计到 1 us
// begin
// led_1 <= 1'b0; //LED 灯灭
// led_2 <= 1'b0; //LED 灯灭
// end
// else
// begin
// led_1 <= led_1;
// led_2 <= led_2;
// end
endmodule
采用的是50M外部晶振给到时钟引脚,然后定时器判断时钟来翻转io高低电平,最终测试直接判断时钟上升沿,就翻转io状态,测试结果就是时钟的速率,50MHz的时钟周期是20ns,测试也是20ns电平保持,40ns周期。多个引脚同时控制,也不会有等待延迟,周期与单个引脚一样
使用逻辑分析仪测试结果如下图
使用示波器测试结果如下图
感觉这个还没有达到FPGA的极限,只是时钟晶振的极限,详细更快速的测试需要在多摸索摸索找找方法。也欢迎各位大佬指点提示。
2.STM32F407芯片测试
使用标准库
GPIO_SetBits(GPIOB,GPIO_Pin_14); //LED0对应引脚GPIOB.6拉高,亮 等同LED=1;
GPIO_SetBits(GPIOB,GPIO_Pin_15); //LED0对应引脚GPIOB.6拉高,亮 等同LED=1;
GPIO_ResetBits(GPIOB,GPIO_Pin_14); //LED1对应引脚GPIOB.6拉低,灭 等同LED=0;
GPIO_ResetBits(GPIOB,GPIO_Pin_15); //LED1对应引脚GPIOB.6拉低,灭 等同LED=0;
无延时控制高低电平翻转,使用单个引脚周期最快在120ns左右,双个引脚周期就变成了220ns左右,所有引脚控制是串行控制的,一个一个去控制,引脚配置如下,100M速度,理论应该是10ns翻转,20ns周期,但是函数执行消耗了50ns,所以这点就不如FPGA时许控制的严格 ,当系统更加复杂有多个进程芯片驱动时,更无法保障高速采集速率
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
3.STM32H750芯片测试
使用HAL库,被包装多一层,速度也无法达到预设引脚速率极致,使用very-fast引脚速度模式
无延时控制高低电平翻转,使用单个引脚周期最快在150ns左右,双个引脚周期就变成了300ns左右,3个引脚周期变成了400ns左右,说明stm32的引脚控制逻辑是串行的,一个一个去控制,当有多个引脚同时驱动某芯片时,时许周期就不是特别容易控制的了,下图是单个引脚测试图
四、结语
STM32适用低速ADC及其他芯片采集控制,不同系列32芯片采样率sps测试效果也不相同,追求采样率更高需使用FPGA