![]() |
![]() |
![]() |
![]() |
![]() |
Hy-Star ☆ Tech Support |
八核心平行處理單晶片 (FPPA) 介紹
Frank Chen
HY-STAR TECHNOLOGY CO.,LTD
引用或複製請註明出處
八核心平行處理單晶片 (FPPA) 介紹
相信許多研發人員都有選擇 MCU 的痛苦經驗, 選這顆 MCU 少個 UART,選那顆 Timer 又不夠,就算選好了 MCU,寫多功 (Muti-Task)的軟體才是真正痛苦的開始.
應廣科技 (Padauk )八核心平行處理單晶片 Field Programmable Processor Array,
以下簡稱 “FPPA”,利用八核心平行處理可一次解決軟體“Muti-Task” ,“Timer” 和 MCU 所需的各種周邊的困擾.有八顆
MCU 平行處理,不用再煩惱多工軟體,有八顆 MCU 平行處理等於有八個 Timer,不用再煩惱 Timer 不夠,有八顆 MCU
平行處理,拿幾顆來寫 UART,I2C,SPI,PWM 等周邊就不用再煩惱介面不夠.
如上圖所示
FPPA 最多可有 8 顆 MCU 同時平行處理, FPPA 有一“pmode”指令可調整每一 MCU 的速度,FPPA 根據“pmode”由硬體強制去分配的每一 MCU 的 bandwidth 來完成類似軟體 RTOS 的功能
(如下表),完全不用寫軟體的 RTOS.
pmode | FPP0 | FPP1 | FPP2 | FPP3 | FPP4 | FPP5 | FPP6 | FPP7 |
0 | 1/2 | 1/8 | 1/16 | 1/16 | 1/16 | 1/16 | 1/16 | 1/16 |
1 | 1/4 | 1/4 | 1/8 | 1/8 | 1/16 | 1/16 | 1/16 | 1/16 |
2 | 1/8 | 1/8 | 1/8 | 1/8 | 1/8 | 1/8 | 1/8 | 1/8 |
3 | 1/2 | 1/8 | 1/8 | 1/8 | ||||
4 | 1/4 | 1/4 | 1/4 | 1/8 | 1/8 | |||
5 | 1/16 | 1/4 | 1/4 | 1/4 | 1/16 | 1/16 | 1/16 | |
6 | 1/16 | 1/2 | 1/8 | 1/16 | 1/16 | 1/16 | 1/16 | 1/16 |
7 | 1/8 | 1/2 | 1/8 | 1/8 | 1/8 |
如下圖為 pmode =2 , 平均每一 MCU 分配 1/8 system clock
<pmode =2>
下圖為 pmode=0 ,FPP#0 = 1/2 system clock, FPP#1 = 1/4 system clock, FPP#2-FPP#7 = 1/16 system clock ,每個 FPP 的 cycle 如下
<pmode=0>
|
PPA 共有 33 個暫存器(不同系列暫存器略有不同),其中 address 0x10 – 0x32 各為 I/O Port A – Port E 的控制暫存器,故真正要注意的 register 只有 13 個,不像其他 MCU,周邊控制 (如PWM,I2C,UART 等)的 register 就好幾拾個,故 FPPA 很容易學習U. 13個 register 中比較容易引起誤解,或 datasheet 描述不易理解的地方特別提出說明.
如上圖所示,和大多數的 MCU 一樣,FPPA 也有所謂 “中斷向量表”的概念,只是一般 MCU 的中斷向量是“中斷副程式” 的進入位置,FPPA 的中斷向量是各 FPP 的進入位置.如上圖中 address 0h-7h 分別為 FPP#0-7 的進入位置,address 0x10 才是“中斷副程式” 的進入位置,故其程式寫法如下
FPPA Instructions Set | |
Data Transfer Instructions (16) | |
Instruction | Function |
mov a,I | Move immediate data to ACC。 |
mov M,a | Move data from ACC to memory |
mov a,M | Move data from memory to ACC |
mov a,IO | Move data from IO to ACC |
mov IO,a | Move data from ACC to IO |
pushw index | Move the content of index to be the content of stack pointer |
pushw pcN | Move the content of program counter of Nth FPP unit to be the content of stack pointer |
popw index | Restore the content of stack pointer to be the content of index |
popw pcN | Restore the content of stack pointer to be the content of program counter of the Nth FPP unit |
ldtabh index | Load high byte data in OPT to ACC by using index as OPT address |
ldtabl index | Load low byte data in OTP to ACC by using index as OTP address |
ldt16 index | Move 16-bit counting values in Timer16 to memory which is addressed by index |
stt16 index | Store 16-bit data from memory addressed by index to Timer16 |
idxm a,index | Move data from specified memory to ACC by indirect method |
idxm index,a | Move data form ACC to specified memory by indirect method |
xch M | Exchange data between ACC and memory |
Arithmetic Operation Instructin (20) | |
add a,I | Add immediate data with ACC, then put result in ACC |
add a,M | Add data in memory with ACC, then put result in ACC |
add M,a | Add data in memory with ACC, then put result in ACC |
addc a,M | Add data in memory with ACC and carry bit, then put result in ACC |
addc M,a | Add data in memory with ACC and carry bit, then put result in memory |
addc a | Add carry with ACC, then put result in ACC |
addc M | Add carry with memory, then put result in memory |
nadd a,M | Add negative logic (2's complement) of ACC with memory |
nadd M,a | Add negative logic (2's complement) of memory with ACC |
sub A,I | Subtraction immediate data from ACC, then put result in ACC. |
sub a,M | Subtraction data in memory from ACC, then put result in ACC. |
sub M,a | Subtraction data in ACC from memory, then put result in memory |
subc a,M | Subtraction data in memory and carry from ACC, then put result in ACC |
subc M,a | Subtraction ACC and carry bit from memory, then put result in memory |
subc a | Subtraction carry from ACC, then put result in ACC |
subc M | Subtraction carry from the content of memory, then put result in memory |
inc M | increment the content of memory |
dec M | Decrement the content of memory |
clear M | Clear the content of memory |
mul | Multiplication operation. An 8x8 unsigned multiplication will be executed. |
Shift Operation Instructions (11) | |
sr a | Shift right of ACC |
src a | Shift right of ACC with carry |
sr M | Shift right the content of memory |
src M | Shift right of memory with carry |
sl a | Shift left of ACC |
slc a | shift left of ACC with carry |
sl M | Shift left of memory |
slc M | Shift left of memory with carry |
swap a | Swap the high nibble and low nibble of ACC |
swap M | Swap th high nibble and low nibble of memory |
Logic Operation Instructions (16) | |
and a,I | Perform logic AND on ACC and immediate data, then put result in ACC |
and A,M | Perform logic AND on ACC and memory, then put result in ACC |
and M,a | Perform logic AND on ACC and memory, then put result in memory |
or a,I | Perform logic OR on ACC and immediate data, then put result in ACC |
or a,M | Perform logic OR on ACC and memory, then put result in ACC |
or M,a | Perform logic OR on ACC and memory, then put result in memory |
xor a,I | Perform logic XOR on ACC and immediate data, then put result in ACC |
xor a,M | Perform logic XOR on ACC and memory, then put result in ACC |
xor M,a | Perform logic XOR on ACC and memory, then put result in memory |
not a | Perform 1's complement (logical complement) of ACC |
not Mry | Perform 1's complement (logical complement) of memo |
neg a | Perform 2's complement of ACC |
neg M | Perform 2's complement of memory |
comp a,I | Compare ACC with immediate data |
comp a,M | Compare ACC with the content of memory |
comp M,a | Compare ACC with the content of memory |
Operation Instructions (6) | |
set0 IO.n | Set bit n of IO port to low |
set1 IO.n | Set bit n of IO port to high |
tog IO.n | Toggle bit state of bit n of IO port |
set0 M.n | Set bit n of memory to low |
set1 M.n | Set bit n of memory to high |
swapc IO.n | Swap the n-th bit of IO port with carry bit |
Conditonal Operation Instructions (13) | |
ceqsn a,I | Compare ACC with immediate data and skip next instruction if both are equal |
ceqsn a,M | Compare ACC with memory and skip next instruction if both are equal |
cesn M,a | Compare ACC with memory and skip next instruction if both are equal |
t0sn IO.n | Check IO bit and skip next instruction if it's low |
t1sn IO.n | Check IO bit and skip next instruction if it's high |
t0sn M,n | Check memory bit and skip next instruction if it's low |
t1sn M,n | Check memory bit and skip next instruction if it's high |
izsn a | increment ACC and skip next instruction if ACC is zero |
dzsn a | Decrement ACC and skip next instruction if ACC is zero |
izsn M | Increment memory and skip next instruction if memory is zero |
dzsn M | Decrement memory and skip next instruction if memory is zero |
wait0 IO.n | Go next instruction until bit n of IO power is low; otherwise, wait here |
wait1 IO.n | Go next instruction until bit n of IO power is high; otherwise, wait here |
FPPA 共有97 個 (不同系列,指令略有增減)1T RISC type 功能強大的指令.大部分的指令看 datasheet 就知道其用法,不再多敘,這裡只介紹比較容易引起誤解,或 datasheet 敘述不容易理解的地方特別提出說明
由 於 PFPA 是一顆 8 核心的 MCU,不同 MCU 間可更改彼此的程式指標 “pc”, 來達到強迫其他 MCU 去執行某段程式的路徑之目的,但要小心運用,否則容易破壞程式的結構.下例中的 FPP#0 原本只會在 LOOP_A無窮的回圈中打轉, FPP#1 經由“pushw” 和 “popw” 改變 了FPP#0 的程式指標, 讓 FPP#0 變在 LOOP_B無窮回圈中打轉.