对于 TI Tiva Launchpad,我编写了一个 C 代码,它从 GPIO 获取两个数字作为输入,然后将这两个数字相加并输出结果。然后,我将 FPGA 板连接到 Tiva 启动板并给出两个数字,以便将它们相乘并输出结果。我以 4ns 的精度计算输出和输入之间的时间差(传播延迟)。延迟以微秒为单位,因此 4ns 精度很好。然而,虽然我在每次测试中给出相同的输入模式,但每次测试的结果延迟都不同。代码就是这样,并且肯定可以准确地找到所有输入的结果。
int main(void) {
unsigned int z = 0;
unsigned char flag = 66, temp, select, num1, num2, res;
unsigned char num1Mem, num2Mem, num1MemOld, num2MemOld;
unsigned char resOld = 0;
unsigned int numOfOps = 0;
//Setup Clock, PORTC and RGB LEDs
SysCtlClockSet(SYSCTL_SYSDIV_8|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4); //Select input
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); //Inp 1 (num1)
GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); //Inp 2 (num2)
GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); //LEDs
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);//Out LS 4 bit
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7);//Out MS 4 bit
GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_4); //Push Buttons
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_4, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU);
select = 0;
while(1){
num1 = (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7) & 0xF0) >> 4;
num2 = (GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3) & 0x0F);
num1Mem = num1;
num2Mem = num2;
res = num1 * num2;
break;
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, res);
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, res);
if(res == 0)
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x02);
else if(res < 16)
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x04);
else if(res > 15)
GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, 0x08);
}
return 0; }
例如,我将输入从 (0,0) 更改为 (3,5),结果输出从 0 更改为 15。我这样做了好几次,每次延迟都略有不同。我认为在不同实例执行的所有指令必须完全相同,因此延迟(即周期数)必须相同但实际情况不同。为什么?是否有可能或者我可以肯定地得出结论,我的延迟结果不可能是真的?