Опубликован: 12.07.2010 | Уровень: специалист | Доступ: платный | ВУЗ: Алтайский государственный университет
Лекция 4:
Многоядерные процессоры с низким энергопотреблением
Файл coef0.vf
Код:
: 2pi_k/N ( N k -- ; f: -- 2pi_k/N ) s>f s>f f/ pi 2.e f* f* ; : icos ( N k -- icos ) 2pi_k/N cos ; IMMEDIATE
Файл math.vf
Код:
: d*-shift ( x y -- pl ) \ учитываем только младшую часть * drop drop a@ $20000 # xor \ -- ph pl 2/ 2/ 2/ 2/ 2/ 2/ 2/ 2/ ; : negate not 1 # . +
Файл Hartley_test_.vf
Код:
{
считаем, что обрабатываем данные с ацп
28-0 27-2......21-14
18-1 27-3......21-15
}
v.VF +include" c7Gr01/romconfig.f"
0 VALUE in_
0 VALUE in_1
0 VALUE in_2
0 VALUE out_
0 VALUE out_1
0 VALUE out_2
$b5 VALUE rr
16 VALUE num \ количество отсчетов
0 VALUE v \ текущий отсчет Хартли спектра
include Fpmath.f
include coef0.vf
num 0 icos VALUE c0
num 1 icos VALUE c1
num 2 icos VALUE c2
num 3 icos VALUE c3
num 4 icos VALUE c4
38 {node \ ядро - "генератор" сигнала
0 org here =p
'-d-- # b!
$100 # !b
$100 # !b
$0 # !b
$0 # !b
$0 # !b
$0 # !b
$0 # !b
$0 # !b
$0 # !b
$0 # !b
$0 # !b
$0 # !b
$0 # !b
$0 # !b
$100 # !b
$100 # !b
node}
28 {node 0 org
\ входной порт в регистре -b ; выходной -a;
: 8transit @b !a : 7transit @b !a @b !a
@b !a
@b !a @b !a
@b !a @b !a ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: negate not 1 # . + ;
here =p
\ ----перестановка----------------
'--l- # '-d-- # a!b!
@b \ -- f0
7transit
'---u # a!
8transit
\ ----перый этап------------------
'---u # b! +bat
\ ----второй этап-----------------
'--l- # dup a!b! +bat
\ ----третий этап-----------------
+bat \ --f0
\ ----четвертый этап--------------
\ работаем с числами одинарной точности
\ т.е. просто отбрасываем старшую часть
\ --f0 a=l; b=l;
@b \ -- f0 f8
include bat.vf
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
27 {node
: 3transit @b !a
: 2transit @b !a : transit> @b !a ;
: transit< @a !b ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт в регистре -b ; выходной -a;
here =p
\ ----перестановка----------------
'r--- # '--l- # a!b!
3transit
@b \ -- f2
3transit
\ ----перый этап------------------
'---u # dup a!b! +bat
\ ----второй этап-----------------
'--l- # dup a!b! -bat
\ ----третий этап-----------------
'r--- # b! \ a=l ; b=r
transit>
transit<
'r--- # a! +bat \ a=r b=r
\ ----четвертый этап--------------
\ -- f2 ; a=r b=r
'--l- # a! \ -- f2 ; a=l b=r
transit> \ -- f2 ; a=l b=r
@b @b \ -- f2 f10 f14
. + \ -- f2 f10+f14
c2 # d*-shift \ -- f2 [f10+f14]*c2
include bat.vf
\ -- H2 H10
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
26 {node
: 4transit @b !a @b !a
: 2transit @b !a : transit> @b !a ;
: transit< @a !b ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт в регистре -b ; выходной -a;
here =p
\ ----перестановка----------------
'--l- # 'r--- # a!b!
transit>
@b \ -- f4
4transit
\ ----перый этап------------------
'---u # dup a!b! +bat
\ ----второй этап-----------------
'--l- # dup a!b! +bat
\ ----третий этап-----------------
'r--- # dup a!b! -bat \ a=r b=r
'--l- # b! transit> \ a=r b=l ; transit @b>>!a ;
transit<
\ ----четвертый этап--------------
\ -- f4 ; a=r b=l ;
transit>
@b \ -- f4 f12 ; a=r b=l ;
2transit \ -- f4 f12 ; a=r b=l ;
include bat.vf
\ -- H4 H12
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
25 {node
: 3transit @b !a
: 2transit @b !a : transit> @b !a ;
: transit< @a !b ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт в регистре -b ; выходной -a;
here =p
\ ----перестановка----------------
'r--- # '--l- # a!b!
3transit
@b \ -- f6
transit>
\ ----перый этап------------------
'---u # dup a!b! +bat
\ ----второй этап-----------------
'--l- # dup a!b! -bat
\ ----третий этап-----------------
-bat
\ ----четвертый этап--------------
\ -- f6 ; a=l ; b=l
'r--- # b! \ -- f6 ; a=l ; b=r
2transit
@b dup !a @b dup !a \ -- f6 f10 f14; a=l ; b=r
negate + c2 # d*-shift \ -- f6 [f10-f14]*c2; a=l ; b=r
include bat.vf \ -- H6 H14
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
24 {node
: 3transit @b !a @b !a @b !a ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
\ входной порт в регистре -b ; выходной -a;
here =p
\ ----перестановка----------------
'--l- # 'r--- # a!b!
@b \ -- f8
3transit
\ ----перый этап------------------
'---u # dup a!b! +bat
\ ----второй этап-----------------
'--l- # dup a!b! +bat
\ ----третий этап-----------------
+bat
\ ----четвертый этап--------------
\ -- f8; a=l; b=l
'r--- # a! \ -- f8; a=r; b=l;
dup !a \ -- f8; a=r; b=l;
3transit
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
23 {node
: 2transit @b !a : transit> @b !a ;
: transit< @a !b ;
\ : a!b! ( a# b# -- ; a= b= ) b! a! ;
: negate not 1 # . + ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт в регистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'r--- # '--l- # b! a!
transit>
@b \ -- f10
transit>
\ ----перый этап------------------
'---u # dup a! b! +bat
\ ----второй этап-----------------
'--l- # dup a! b! -bat
\ ----третий этап-----------------
'r--- # b! \ a=l ; b=r
transit>
transit<
'r--- # a! +bat \ a=r b=r
\ ----четвертый этап--------------
\ -- f10 ; a=r; b=r;
'--l- # a! \ -- f10 ; a=l; b=r;
transit>
dup !a \ -- f10 ; a=l; b=r;
transit>
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
22 {node
: transit> @b !a ;
: transit< @a !b ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт врегистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'--l- # 'r--- # a!b!
@b \ -- f10
transit>
\ ----перый этап------------------
'---u # dup a!b! +bat
\ ----второй этап-----------------
'--l- # dup a!b! +bat
\ ----третий этап-----------------
'r--- # dup a!b! -bat \ a=r b=r
'--l- # b! transit> \ a=r b=l ; transit @b>>!a ;
transit<
\ ----четвертый этап--------------
\ -- f12 ; a=r ; b=l
dup !a
transit>
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
21 {node
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт врегистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'r--- # '--l- # a!b!
@b \ -- f10
\ ----перый этап------------------
'---u # dup a!b! +bat
\ ----второй этап-----------------
'--l- # dup a!b! -bat
\ ----третий этап-----------------
-bat
\ ----четвертый этап--------------
\ -- f14; a=l; b=l;
dup !a
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
\ --------------------------------------------------------------------------
\ ---- нечетные номера------------------------------------------------------
18 {node 0 org
: 7transit
@b !a @b !a
@b !a @b !a @b !a
@b !a @b !a ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт в регистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'--l- # '---u # a!b!
@b \ -- f1
7transit
\ ----первый этап------------------
'---u # dup a!b! -bat
\ ----второй этап-----------------
'--l- # dup a!b! +bat \ -- f(2,1)
\ ----третий этап-----------------
\ -- f; a=l;b=l;
dup push \ -- f ; r: -- f
@b @b . + rr # d*-shift \ -- f [5+7]*r ; r: -- f
dup dup xor dup . + drop .
+ \ f3
pop \ f3 f
dup !b !b
\ . '-d-- # b! @b
\ ----червертый этап------------
\ -- f1 ; a=** ; b=l
@b c1 # d*-shift \ -- f1 f9*c1 ; a=** ; b=l\
@b c3 # d*-shift \ -- f1 f9*c1 f15*c3 ; a=** ; b=l
+ \ -- f1 f9*c1+f15*c3 ; a=** ; b=l
include bat.vf
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
17 {node
: 3transit @b !a : 2transit @b !a : transit> @b !a ;
include math.vf
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт в регистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'r--- # '--l- # b! a!
3transit
@b \ -- f2
3transit
\ ----первый этап------------------
'---u # dup a! b! -bat
\ ----второй этап-----------------
'--l- # dup a! b! -bat
\ ----третий этап-----------------
'r--- # b! 2transit \ -- f(2,3)
@b @b . + rr # d*-shift \ -- f [5+7]d*r ; r: -- f
dup dup xor dup . + drop . \ очищаем бит переноса
+ \ f3
'r--- # '--l- # b! a! 2transit \ a=r; b=l;
\ . '-d-- # b! @b
\ ---четвертый этап--------------
'--l- # 'r--- # b! a!
\ -- f3 ; a=l ; b=r
2transit
@b c3 # d*-shift \ -- f1 f11*c1 ; a=** ; b=l\
@b c1 # d*-shift \ -- f1 f11*c1 f13*c3 ; a=** ; b=l
+ \ -- f1 f11*c1+f13*c3 ; a=** ; b=l
include bat.vf
\ -- H3 H11
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
16 {node
include math.vf
: negate not 1 # . + ;
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт в регистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'--l- # 'r--- # b! a!
@b !a \ transit>
@b \ -- f4
@b !a @b !a @b !a @b !a \ 4transit
\ ----первый этап------------------
'---u # dup a! b! -bat
\ ----второй этап-----------------
'--l- # dup a! b! +bat \ --f(2,5)
\ ----третий этап-----------------
dup \ -- f f ; a=l ; b=l
'r--- # a! !a \ -- f a=r; b=l
@b !a \ transit>
dup !a
@b !a \ transit> \ -- f a=r; b=l
dup @b \ -- f5 f5 f7
a@ push
. + rr # d*-shift negate \ -- f5 -r*[f5+f7]
dup dup xor dup . + drop . \ очищаем бит переноса
pop a!
@a . + \ -- f5 -r*[f5+f7]+f3 ; a=r;b=l
over !b
@a !b \ transit<
\ . '-d-- # b! @b
\ ---четвертый этап--------------
'r--- # '--l- # b! a!
\ -- f5 ; a=r; b=l
@b !a @b !a \ 2transit
a@ push
@b dup !a c1 # d*-shift
pop a!
@b dup !a c3 # d*-shift
negate + \ -- f5 c1*f11-c3*f13 ; a=**; b=l
include bat.vf
\ -- H5 H13
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
15 {node
: 3transit @b !a @b !a @b !a ;
include math.vf
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт врегистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'r--- # '--l- # b! a!
3transit
@b \ -- f6
@b !a \ transit>
\ ----первый этап------------------
'---u # dup a! b! -bat
\ ----второй этап-----------------
'--l- # dup a! b! -bat
\ ----третий этап-----------------
dup negate over \ -- f -f f a=l; b=l
!b !b \ -- f
dup !b
@b negate + rr # d*-shift
@b . + \
\ . '-d-- # b! @b
\ ---четвертый этап--------------
'--l- # 'r--- # b! a!
\ -- f7; a=l; b=r
a@ dup push push
@b dup !a c3 # d*-shift \ -- f7 f9*c3; a=**; b=r
pop a!
@b dup !a c1 # d*-shift \ -- f7 f9*c3 f15*c1; a=**; b=r
negate + \ -- f7 f9*c3-f15*c1; a=**; b=r
pop a!
@b !a @b !a \ 2transit
include bat.vf
\ -- H7 H15
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
14 {node
: 3transit @b !a
@b !a @b !a ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт врегистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'--l- # 'r--- # a!b!
@b \ -- f8
3transit
\ ----первый этап------------------
'---u # dup a!b! -bat
\ ----второй этап-----------------
'--l- # dup a!b! +bat
\ ----третий этап-----------------
\ -- f; a=l;b=l;
dup push \ -- f ; r: -- f
@b @b . + rr # d*-shift \ -- f [5+7]*r ; r: -- f
dup dup xor dup . + drop .
+ \ f3
pop \ f3 f
dup !b !b
\ . '-d-- # b! @b
\ ---четвертый этап--------------
'r--- # '--l- # a!b!
\ -- f9 ; a=r; b=l;
dup !a
3transit
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
13 {node
: 2transit @b !a : transit> @b !a ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт врегистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'r--- # '--l- # a!b!
transit>
@b \ -- f10
transit>
\ ----первый этап------------------
'---u # dup a!b! -bat
\ ----второй этап-----------------
'--l- # dup a!b! -bat
\ ----третий этап-----------------
'r--- # b! 2transit \ -- f(2,3)
@b @b . + rr # d*-shift \ -- f [5+7]d*r ; r: -- f
dup dup xor dup . + drop . \ очищаем бит переноса
+ \ f3
'r--- # '--l- # a!b! 2transit
\ . '-d-- # b! @b
\ ---четвертый этап--------------
'--l- # 'r--- # a!b!
\ -- f11 ; a=l; b=r
transit>
dup !a
transit>
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
12 {node
: transit> @b !a ;
: transit< @a !b ;
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: +bat ( f1 -- f1+f2; @b=f2 -- ; -- !a=f1 ) @b over !a . + ;
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт врегистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'--l- # 'r--- # a!b!
@b \ -- f10
transit>
\ ----первый этап------------------
'---u # dup a!b! -bat
\ ----второй этап-----------------
'--l- # dup a!b! +bat
\ ----третий этап-----------------
dup \ -- f f ; a=l ; b=l
'r--- # a! !a \ -- f13 a=r; b=l
transit> dup !a transit> \ -- f13 a=r; b=l
dup negate @b \ -- f13 -f13 f15
a@ push
. + rr # d*-shift \ -- f13 r*[-f13+f15]
dup dup xor dup . + drop . \ очищаем бит переноса
pop a!
@a . + \ -- f13 r*[-f13+f15]+f9 ; a=r;b=l
over !b
transit<
\ . '-d-- # b! @b
\ ---четвертый этап--------------
\ -- f12 ; a=r; b=l;
transit>
dup !a
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
11 {node
: a!b! ( a# b# -- ; a= b= ) b! a! ;
include math.vf
: -bat ( f1 -- f1-f2; @b=f2 -- ; -- !a=f1 ) dup !a negate @b . + ;
\ входной порт врегистре -b ; выходной -a;
here *cy =p
\ ----перестановка----------------
'r--- # '--l- # a!b!
@b \ -- f10
\ ----первый этап------------------
'---u # dup a!b! -bat
\ ----второй этап-----------------
'--l- # dup a!b! -bat
\ ----третий этап-----------------
dup negate over \ -- f -f f a=l; b=l
!b !b \ -- f
dup !b
@b negate + rr # d*-shift
@b . + \
\ . '-d-- # b! @b
\ ---четвертый этап--------------
'--l- # dup a!b!
dup !a
\ -- f15
. '-d-- # b! @b \ останов ядра - только для режима симуляции
node}
reset \ reset prepares the system to run the code in the Simulator
\ enter simulate or sim to start the simulator
cr
\ 14 13 12 11 watch4 1 setstep
28 27 26 25 watch4 1 setstep
simРезультаты
Временные параметры вычислений следующие:
- вычисление коэффициента Хартли спектра ~ 1150 тактов или около 620000 преобразований в секунду.