让我们说我希望内循环长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 。有人能证明这是正确的吗?
答案 0 :(得分:1)
使用the data sheet中的信息,尤其是表9:
分支(正确预测,采取)2
分支(正确预测,未采取)1
和代码的逻辑,我得出结论,当内循环运行时,它是一个4循环循环,而不是3循环循环。
delaycount变量的12000值然后产生:12000 * 4 * 20ns = 960000ns~1ms。
因此我确认12000是正确的,给予或接受。
由于它是FPGA设计,因此应通过使用延迟切换测试程序中的端口引脚并将示波器/逻辑分析仪连接到引脚来轻松进行测试。