C-相同的输入和说明,但延迟方式不同



对于ti tiva aunchpad,我编写了一个C代码,该C代码从GPIO中获取两个数字作为输入,然后添加了两个数字并输出结果。然后,我将FPGA板连接到TIVA LaunchPad,并给出了两个数字,以使它们成倍增加并输出结果。我以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;  }

例如,i将输入从(0,0(更改为(3,5(,结果输出从0更改为0。我这样做几次,每次延迟都会有所不同。我认为在不同情况下执行的所有指令都必须完全相同,因此延迟(即周期数(必须相同,但实际情况是不同的。为什么?是否有可能,或者我肯定可以得出结论,我的延迟结果不可能是真的?

,似乎您没有做任何事情来同步输入的那一刻,而while循环正在执行。如果在while循环读取输入之前更改输入,则输出将相对较快地变化。但是,如果您在while循环读取输入后才更改输入,则while循环必须完成当前的迭代并循环回到开始,然后再次读取输入,然后才能看到输出更改。因此,您测量的延迟可能会因执行WALE循环所需的时间而异。

最新更新