Computer Architecture Lab/Winter2006/HoeftPirkWeirHuang/InstructionSetII/More
VHDL-Source for NORISK-Chip (hardware-programmer, CPU)
Features
edit- 32-bit Harvard processor architecture
- Dual-ported Instruction Memory
- Word addresses
- Memory Mapped IO
- On Chip-Memory programmer
- 16 general purpose registers
- 16-bit instructions
- Instruction preprocessing
- 3-stage piplining
- 1 cycle relative conditional branches
- 1 cycle absolute jumps
Block Diagram of the NORISK Processor |
Instruction Set
editThree Operands
editThe 8-bit immediate values are unsigned, 11-bit branch values are signed.
3 Operands | ||||
Name | OpCode | Operands | Note | Decoding |
ADD | 0000 | ddddrrrraaaa | D = R + A; | 00000 |
ADC | 0001 | ddddrrrraaaa | D = R + A + C | 00001 |
SUB | 0010 | ddddrrrraaaa | D = R - A | 00010 |
SBC | 0011 | ddddrrrraaaa | D = R - A - c | 00011 |
AND | 0100 | ddddrrrraaaa | D = R and A | 00100 |
OR | 0101 | ddddrrrraaaa | D = R or A | 00101 |
CMPI | 0110 | rrrriiiiiiii | R - I => flags | 10000 |
XOR | 0111 | ddddrrrraaaa | D = R xor A | 00110 |
LDB0 | 1000 | rrrriiiiiiii | R(31~8) = 0, R(7~0) = I | 01000 |
LDB1 | 1001 | rrrriiiiiiii | R(31~16) = 0, R(15~8) = I | 01001 |
LDB2 | 1010 | rrrriiiiiiii | R(31~24) = 0, R(23~16) = I | 01010 |
LDB3 | 1011 | rrrriiiiiiii | R(31~24) = I | 01011 |
RJMP | 11000 | iiiiiiiiiii | PC = PC + I | 100xx (not 10000) |
RCALL | 11001 | iiiiiiiiiii | R15 = PC; PC = PC + I | 100xx (not 10000) |
BRNE | 11010 | iiiiiiiiiii | if(!zero) PC = PC + I | 100xx (not 10000) |
BREQ | 11011 | iiiiiiiiiii | if(zero) PC = PC + I | 100xx (not 10000) |
BRCC | 11100 | iiiiiiiiiii | if(!carry) PC = PC + I | 100xx (not 10000) |
BRCS | 11011 | iiiiiiiiiii | if(carry) PC = PC + I | 100xx (not 10000) |
Two Operands
editAll 4-bit immediate values are unsigned.
2 Operands (2 instructions available) | ||||
Name | OpCode | Operands | Note | Decoding |
ADDI | 11110000 | rrrriiii | R = R + I | 00000 |
ADCI | 11110001 | rrrriiii | R = R + I + C | 00001 |
SUBI | 11110010 | rrrriiii | R = R - I | 00010 |
SBCI | 11110011 | rrrriiii | R = R - I - C | 00011 |
LSL | 11110100 | rrrrssss | R <<= S | 01110 |
ASL | 11110101 | rrrrssss | R >>>= S | 01111 |
CMP | 11110110 | rrrraaaa | R = A => zero flag | 10000 |
11110111 | ||||
ROL | 11111000 | rrrrssss | 01100 | |
ROR | 11111001 | rrrrssss | 01101 | |
ST | 11111010 | ddddaaaa | [A] = D | 100xx (not 10000) |
LD | 11111011 | ddddaaaa | D = [A] | 11xxx |
LSLI | 11111100 | rrrriiii | R <<= I | 01110 |
ASRI | 11111101 | rrrriiii | R >>>= I | 01111 |
MOV | 11111110 | ddddssss | D = S | 10101 |
11111111 |
One Operand
edit1 Operand (9 instructions available) | ||||
Name | OpCode | Operand | Note | Decoding |
JMP | 111111110000 | rrrr | PC = R | |
CALL | 111111110001 | rrrr | PC => [SP], SP--, PC = R | |
PUSH | 111111110010 | rrrr | R => [SP], SP-- | |
POP | 111111110011 | rrrr | SP++, [SP] => R | |
NEG | 111111110100 | rrrr | R = -R | 10101 |
COM | 111111110101 | rrrr | R = not R | 00111 |
PAR | 111111110110 | rrrr | 1s in R | |
111111110111 |
Non Operand
edit0 Operand (3 instructions available) | |||
Name | OpCode | Note | Decoding |
RET | 1111111111110000 | SP++, [SP] => PC | |
RETI | 1111111111110001 | ||
CLI | 1111111111110010 | Interrupt flag = 0 | |
SEI | 1111111111110011 | Interrupt flag = 1 | |
SKIPCC | 1111111111110100 | ||
SKIPCS | 1111111111110101 | ||
SKIPNE | 1111111111110110 | ||
SKIPEQ | 1111111111110111 | ||
SKIPNO | 1111111111111000 | ||
SKIPOV | 1111111111111001 | ||
SKIPNOTNEG | 1111111111111010 | ||
SKIPNEG | 1111111111111011 | ||
1111111111111100 | |||
1111111111111101 | |||
1111111111111110 | |||
NOP | 1111111111111111 | 100xx (not 10000) |
Pipelining
editThe NORISK Processor implements three-stage pipelining:
- Instruction fetching and simple branch logic
- Decoding
- Execution and Memory Access
Macro Assembler
editThe macro assembler was written using flex and yacc. The goal was to produce an intuitive assembler. It allows C-style usage of assembly operations.
C/C++, Flex, Yacc-Sources for assembler and instruction set simulator. Assembler-Sources for example assembly programs.
Data memory initialization
edit- Zero initialized 32bit words:
word identifier[size]
- User initialized 32bit words: (size determined by assembler)
word identifier[]=word1,word2,word3,...
- User initialized 32bit words: (size determined by programmer)
word identifier[size]=word1,word2,word3,...
- String:
word identifier[]="string"
- String: (size determined by programmer)
word identifier[size]="string"
Data transfer
edit- Register-Register:
rXX = rYY
- Register-Memory and Memory-Register
rXX = rYY[disp]
rXX[disp] = rYY
Displacement values above zero are not possible with the current NORISK instruction-set.
- Register-Immediate
rXX = immediate
Immediate values can be numeric (0x for hexadecimal), labels or storage variables.
Arithmetic Operations
edit- Possible operations are &,|,^,<<,>>, <R< (rotate left), >R> (rotate right), >A> (arithmetic shift right)
- Syntax 1: rXX = rYY op rZZ
- Syntax 2: rXX op=rZZ
rXX is source and destination
- For some operations (depending on the instruction set) immediate values instead of rZZ are possible.
Control flow
edit- Labels: identifier followed by :
- Branch: goto label
- Conditional branch: goto label if condition
- Flag conditions: carry, !carry, zero, !zero
- Compare conditions: rXX {< or <= or > or >= or == or !=} {rYY or immediate}
This type of conditions produce a CMP operation before the branch.
- Relative call: rcall label. Saves next PC in register 15 and performs a relative jump.
- Return: return
Example program: bubble-sort
editword test[]={20,20,21,19,15,1,10,12,6,7,3,100, 99,98,97} r5 = sizeof(test) r5 = r5+r0 ; calculate end outer_loop: r1 = test ; memory address of 1st operand r2 = test ; memory address of 2nd operand r2 += 1 r6 = 0 ; flag if sort is completed inner_loop: r3 = r1[0] ; load operands r4 = r2[0] goto next if r3 <= r4 ; decide whether it is necessary to swap them r2[0] = r3 ; swap elements r1[0] = r4 r6 += 1 ; set not-done flag next: r1 += 1 r2 += 1 ; next index goto inner_loop if r2 < r5 ; repeat if end not reached goto outer_loop if r6 != 0 ; repeat if sort not finished r0 = 0x80000000 ; IO-address for leds r1 = 0xF r0[0] = r1 ; illuminate four leds infinite: goto infinite ; loop forever
Call Parameters
editass prgm_file bin_out [bin_data_out]
- prgm_file is the source code file
- bin_out is the binary code output
- bin_data_out is the binary data output. If this parameter is omitted, a default value (based on the bin_out parameter) is used.
Instruction Set Simulator
editCall Parameters
editiss prgmmem datamem [datamem_out]
- prgmmem is the filename of assembly program code output
- datamem is the filename of assembly data output
- datamem_out is optional. If specified the contents of the data memory after quit are written to that file.
During Operation
edit- Enter executes next instruction
- Sometimes IO input is requested (prompt: [IO@ address]:) the value specified is returned for this load operation. 0x for hexadecimal is allowed.
- q stops execution and writes data file
On chip-memory programmer
editVisual C++ Source for Programmer using a serial com port.
Console operation
edit- programmer com_port_number con
Sends input from keys to the serial interface and displays received data.
Read memory
edit- programmer com_port_number read {prgm|data} file number_of_words
Reads first number_of_words words of program or data memory and writes file.
Write specific memory
edit- programmer com_port_number write {prgm|data} file [max_number_of_words]
Writes a maximum of max_number_of_words words of program or data memory from file. If max_number_of_words is omitted it writes the whole file.
Write whole program
edit- programmer com_port_number writeall basename
Writes basename.mif to program memory and basename_data.mif to data memory.