3

説明:
レディセットを作っています!NIOS 2 アセンブリのプログラム。フローは次のようになります。

start  
  |  
One LED  
delay 1 Sec  
  |  
Four LED  
delay 3 Sec  
  |  
Eight LED  
Go!

質問:
Nios 2 アセンブリで遅延をプログラムする方法がわかりません。良い例が見つからず、途方に暮れています。

My Work:
以下のコードは、Altera Monitor Program でコンパイル可能です。タイマーの実験を始めましたが、役に立つものは何も作成できませんでした。コード内のブロックされたセクションを参照してください。

私のコード:

.data
.equ TIMER_BASE, 0x10002000
.equ PERIOD, 0x1111ffff
.equ DELAY, 20
.equ LED, 0x10000010

.text
.global _start
_start:


movia r4, TIMER_BASE
movi r5, 6
movia r2, PERIOD #load initial timer values
stwio r2, 8(r4)
srli r2, r2, 16
stwio r2, 12(r4)
stwio r5, 4(r4) #start the timer
movi r6, DELAY #delay


oneLED:
movi r14, 0b10000000    #turn on One LED
movia r15, LED
stw r14, 0(r15)
br fourLED

##############

DELAY:
    subi r6,r6,1       #subtract 1 from delay
    bne r6,r0, DELAY #continue subtracting if delay not elapsed
    br DELAY        #delay elapsed, redo the LOOP

##############

fourLED:
movi r14, 0b11110000    #turn on Four LEDs
movia r15, LED
stw r14, 0(r15)
br eightLED

eightLED:
movi r14, 0b11111111    #turn on Eight LEDs
movia r15, LED
stw r14, 0(r15)
br oneLED

遅延コードの例を教えてください。または私のコードを修正することによって。また、あなたの論理を理解できるように、建設的なコメントを提供してください。ありがとう

4

1 に答える 1

4

以下は例です

delay:      movia r2, 25000000
wasteTime:  subi  r2,r2, 1
            bne   r2, r0, wasteTime
            ret

次に、上記のサブルーチンの遅延を計算します。

CPU クロック = 50MHz で、各命令には約 1 CPU クロックが必要です。

各命令の時間= 1/f= 1/50MHz = 20 ns

上記のサブルーチンでは、movia がコンパイラによって 2 つの命令に分割され、ループ WasteTime には 2 つの命令 (subi、bne) があります。

それで:

遅延 = (2 + 2X25000000 + 1)X 20ns = 1 秒

これが役立つことを願っています..

于 2015-01-06T06:32:27.957 に答える