RPCA: Rich Page, Consulting & Associates

uCoded ALU

Micro Programmed ALU example

ucode alu

ALU Block Diagram

alu block

ROM Code for Loop Control

//

// Loop Control Code, Rich Page, March 7, 2009

//

// T=Target voltage

// J=VINT

// K=Delayed VINT

// X5=J*coefficient

// E=Error voltage

//

// 1=timer

// 2=adc

// 4=pwm

//

// R0 Zero

// R1 ...

// R2 Coefficient

// R3 Upper J

// R4 Lower J

// R5 Upper K

// R6 Lower K

// R7 Upper X5

// R8 Lower X5

// R9 Upper E

// RA Lower E

// RB T

// RC IO Status Control

// RD IO Data

// RE IO Address

// RF Multiplier

//

// ............................RRG FCN SKP WRG COMMENTS

// ............................--- --- --- --- --------

@0000

0000_1010_0000_0000 // 00 ____ R0 CLR

0110_0001_0000_0111 // 01 ____ 0x6 ADI 0x7 Immediate = 0x76 or 118

0000_0000_0000_1011 // 02 ____ R0 ADD RB Set target voltage 5.0V

0000_1010_0000_0011 // 03 ____ R0 CLR R3 Upper J = 0

0000_0000_0000_0100 // 04 ____ R0 ADD R4 Lower J = 0

0000_0000_0000_0101 // 05 ____ R0 ADD R5 Upper K = 0

0000_0000_0000_0110 // 06 ____ R0 ADD R6 Lower K = 0

0000_0000_0000_0111 // 07 ____ R0 ADD R7 Upper X5 = 0

0000_0000_0000_1000 // 08 ____ R0 ADD R8 Lower X5 = 0

0000_0000_0000_0000 // 09 ____ R0 ADD

0000_0000_0000_0000 // 0A ____ R0 ADD

0000_0000_0000_0000 // 0B ____ R0 ADD

0000_1010_0000_0000 // 0C ____ R0 CLR

0111_0001_0000_0000 // 0D ____ 0x7 ADI 0x0 Immediate = 0x07

0000_0000_0000_0010 // 0E ____ R0 ADD R2 Set coefficient

1101_0000_1111_0110 // 0F ____ 0xD ADD BRU 0x6 Goto LPEN

0000_1010_0000_0000 // 10 LPS1 R0 CLR

0000_0010_0000_1110 // 11 ____ R0 ADC RE Set IO address to 1 (timer)

0000_1010_0000_0000 // 12 LPS2 R0 CLR

1101_0000_0000_0000 // 13 ____ RD ADD Read timer

0000_0111_0001_1101 // 14 ____ 0x0 SCI CRY 0xD Subtract 47 = 0x2F (~11010000)

0010_0000_1111_0001 // 15 ____ 0x2 ADD BRU 0x1 If timer < 47 then Goto LPS2

0000_1010_0000_0000 // 16 ____ R0 CLR

0010_0001_0000_0000 // 17 ____ 0x2 ADI 0x0

0000_0000_0000_1110 // 18 ____ R0 ADD RE Set IO address to 2 (adc)

0000_1010_0000_0000 // 19 ____ R0 CLR

1011_0000_0000_0000 // 1A ____ RB ADD Get target

1101_0110_0000_0000 // 1B ____ RD SBC Subtract measured (adc) from target

0000_0000_0000_1010 // 1C ____ R0 ADD RA Save Lower E

0000_1011_0000_1001 // 1D ____ R0 SWP R9 Save Upper E

0000_1010_0000_0000 // 1E ____ R0 CLR

0110_0000_0000_0000 // 1F ____ R6 ADD Get Lower K

1010_0000_0001_0100 // 20 ____ RA ADD CRY R4 Add Lower E, save sum as Lower J

0110_0000_1111_0010 // 21 ____ 0x6 ADD BRU 0x2 Goto LPS3

0000_1010_0000_0000 // 22 ____ R0 CLR

0101_0010_0000_0000 // 23 ____ R5 ADC Get Upper K

1001_0000_0000_0011 // 24 ____ R9 ADD R3 Add Upper E, save sum as Upper J

1001_0000_1111_0010 // 25 ____ 0x9 ADD BRU 0x2 Goto LPS4

0000_1010_0000_0000 // 26 LPS3 R0 CLR

0101_0000_0000_0000 // 27 ____ R5 ADD Get Upper K

1001_0000_0000_0011 // 28 ____ R9 ADD R3 Add Upper E, save sum as Upper J

0000_0000_0100_0000 // 29 LPS4 R0 ADD PLS

0101_0000_1111_0011 // 2A ____ 0x5 ADD BRU 0x3 Goto ZROJ

0000_0000_0110_0000 // 2B ____ R0 ADD NZR

1000_0000_1111_0011 // 2C ____ 0x8 ADD BRU 0x3 Goto XMUL

1000_0001_0001_1111 // 2D ____ 0x8 ADI CRY 0xF

1000_0000_1111_0011 // 2E ____ 0x8 ADD BRU 0x3 Goto XMUL

0000_1010_0000_0000 // 2F ____ R0 CLR

0111_0001_0000_0000 // 30 ____ 0x7 ADI 0x0 Upper J = 0x07

0000_1010_0000_0000 // 31 ____ R0 CLR

1111_0001_0000_1111 // 32 ____ 0xF ADI 0xF

0000_0000_0000_0100 // 33 ____ R0 ADD R4 Lower J = 0xFF

1000_0000_1111_0011 // 34 ____ 0x8 ADD BRU 0x3 Goto XMUL

0000_1010_0000_0000 // 35 ZROJ R0 CLR

0000_0000_0000_0011 // 36 ____ R0 ADD R3 Upper J = 0x00

0000_0000_0000_0100 // 37 ____ R0 ADD R4 Lower J = 0x00

0000_1010_0000_0000 // 38 XMUL R0 CLR

0010_0000_0000_1111 // 39 ____ R2 ADD RF Copy coefficient to multiplier

0000_1010_0000_0000 // 3A ____ R0 CLR

0011_0000_0110_0000 // 3B ____ R3 ADD NZR If Upper J != 0

0000_0000_1111_0100 // 3C ____ 0x0 ADD BRU 0x4 Then goto XML2

0000_1010_0000_0000 // 3D ____ R0 CLR Else

0011_1000_0000_0000 // 3E ____ R3 MUL

0000_0000_0000_0000 // 3F ____ R0 ADD

0100_1000_0000_0000 // 40 XML2 R4 MUL

0000_0000_0000_0000 // 41 ____ R0 ADD

0000_0000_0000_0000 // 42 ____ R0 ADD

0000_0000_0000_1000 // 43 ____ R0 ADD R8 Save as Lower X5

0000_1011_0000_0000 // 44 ____ R0 SWP

0000_0000_0000_0111 // 45 ____ R0 ADD R7 Save as Upper X5

0000_1010_0000_0000 // 46 ____ R0 CLR

0011_0001_0000_0000 // 47 ____ 0x3 ADI 0x0 Immediate = 3

0000_0000_0000_1111 // 48 ____ R0 ADD RF Set RF = 3

0000_1010_0000_0000 // 49 LAB0 R0 CLR

1000_0000_0000_0000 // 4A ____ R8 ADD Double

1000_0000_0001_1000 // 4B ____ R8 ADD CRY R8

0001_0000_1111_0101 // 4C ____ 0x1 ADD BRU 0x5 Goto LAB1

0000_1010_0000_0000 // 4D ____ R0 CLR

0111_0010_0000_0000 // 4E ____ R7 ADC Double+1

0111_0000_0000_0111 // 4F ____ R7 ADD R7 Save as Upper X5

0100_0000_1111_0101 // 50 ____ 0x4 ADD BRU 0x5 Goto LAB2

0000_1010_0000_0000 // 51 LAB1 R0 CLR

0111_0000_0000_0000 // 52 ____ R7 ADD Double

0111_0000_0000_0111 // 53 ____ R7 ADD R7 Save as Upper X5

0000_1010_0000_0000 // 54 LAB2 R0 CLR

1111_0000_0000_0000 // 55 ____ RF ADD

0000_0100_0101_1111 // 56 ____ R0 SUB ZRO RF

1001_0000_1111_0100 // 57 ____ 0x9 ADD BRU 0x4 Goto LAB0

0000_1010_0000_0000 // 58 ____ R0 CLR

1000_0000_0100_0000 // 59 ____ R8 ADD PLS

1111_0000_1111_0101 // 5A ____ 0xF ADD BRU 0x5 Goto LAB3

0000_1010_0000_0000 // 5B ____ R0 CLR

0111_0000_0000_0000 // 5C ____ R7 ADD Double

0111_0000_0000_1000 // 5D ____ R7 ADD R8 Save as Lower X5

0010_0000_1111_0110 // 5E ____ 0x2 ADD BRU 0x6 Goto LAB4

0000_1010_0000_0000 // 5F LAB3 R0 CLR

0111_0010_0000_0000 // 60 ____ R7 ADC Double+1

0111_0000_0000_1000 // 61 ____ R7 ADD R8 Save as Lower X5

0000_1011_0000_0111 // 62 LAB4 R0 SWP R7 Save as Upper X5

1001_0000_1111_0110 // 63 ____ 0x9 ADD BRU 0x6 Goto LAB5

0000_1010_0000_0000 // 64 X5A1 R0 CLR

0000_0010_0000_0111 // 65 ____ R0 ADC R7 Save as Upper X5

0000_1010_0000_0000 // 66 ____ R0 CLR

1111_0001_0000_1111 // 67 ____ 0xF ADI 0xF

0000_0000_0000_1000 // 68 ____ R0 ADD R8 Save as Lower X5

0000_1010_0000_0000 // 69 LAB5 R0 CLR

0100_0000_0000_0110 // 6A ____ R4 ADD R6 Copy Lower J to Lower K

0000_1010_0000_0000 // 6B ____ R0 CLR

0011_0000_0000_0101 // 6C ____ R3 ADD R5 Copy Upper J to Upper K

0000_1010_0000_0000 // 6D LPEN R0 CLR

0100_0001_0000_0000 // 6E ____ 0x4 ADI 0x0 Immediate = 4

0000_0000_0000_1110 // 6F ____ R0 ADD RE Set IO address to 4 (pwm)

0000_1010_0000_0000 // 70 ____ R0 CLR

0111_0000_0000_0000 // 71 ____ R7 ADD Get Upper X5

0000_1011_0000_0000 // 72 ____ R0 SWP

1000_0000_0000_1101 // 73 ____ R8 ADD RD Get Lower X5, send to pwm

0000_1010_0000_0000 // 74 ____ R0 CLR

0000_0010_0000_1110 // 75 ____ R0 ADC RE Set IO address to 1 (timer)

0000_1010_0000_0000 // 76 WAIT R0 CLR

1101_0000_0000_0000 // 77 ____ RD ADD Read timer

0011_0111_0001_0110 // 78 ____ 0x3 SCI CRY 0x6 Subtract 156 = 0x9C (~01100011)

0110_0000_1111_0111 // 79 ____ 0x6 ADD BRU 0x7 If timer < 156 then Goto WAIT

0000_1010_0000_0000 // 7A ____ R0 CLR

0000_0010_0000_1110 // 7B ____ R0 ADC RE Set IO address to 1 (timer)

0000_1010_0000_0000 // 7C ____ R0 CLR

0000_0000_0000_1101 // 7D ____ R0 ADD RD Set IO data to zero (reset)

0000_0000_1111_0001 // 7E ____ 0x0 ADD BRU 0x1 Goto loop start LPS1

0000_0000_0000_0000 // 7F ____ R0 ADD

//