汇编代码中的延迟循环计算

时间:2015-09-04 21:51:07

标签: assembly nios

让我们说我希望内循环长1ms并想要计算delaycount参数。我们知道F = 50 Mhz。

我们可以清楚地看到内循环中有3条指令。让我们假设指令每个需要1个周期。结果是:

        .equ    delaycount,     0 #set right delay value here!
        .text                   # 
        .global delay           # 

delay11:  beq     r4,r0,fin       # exit outer loop

        movi    r8,delaycount   # delay estimation for 1ms

in:  beq     r8,r0,out     # exit from inner loop

        subi    r8,r8,1         # decrement inner counter

        br      in

out:  subi    r4,r4,1         # decrement outer counter
        br      delay11


fin:    ret

解决方案:

F = 50 Mhz T = 20 ns

1ms = 20ns * 3 * delaycount

延迟次数= 1ms / 3 * 20ns = 16666

然而,该解决方案规定delaycount等于 12000 。有人能证明这是正确的吗?

1 个答案:

答案 0 :(得分:1)

使用the data sheet中的信息,尤其是表9:

  

分支(正确预测,采取)2

     

分支(正确预测,未采取)1

和代码的逻辑,我得出结论,当内循环运行时,它是一个4循环循环,而不是3循环循环。

delaycount变量的12000值然后产生:12000 * 4 * 20ns = 960000ns~1ms。

因此我确认12000是正确的,给予或接受。

由于它是FPGA设计,因此应通过使用延迟切换测试程序中的端口引脚并将示波器/逻辑分析仪连接到引脚来轻松进行测试。