一個以 HandelC 設計的 CPU

開放電腦

簡介

函式庫

處理器

主機板

輸出入

虛擬機

組譯器

連結器

編譯器

嵌入式系統

作業系統

原始碼下載

文件下載

設計想法

訊息

相關網站

參考文獻

最新修改

簡體版

English

chanin input;
chanout output;
// 定義了系統的基本參數, 一個4bit位址線的ROM以及RAM, 當然OP code也是4bit, 
// 資料型態為32bit
#define dw 32 /* Data width */
#define opcw 4 /* Op-code width */
#define oprw 4 /* Operand width */
#define rom_aw 4 /* Width of ROM address bus */
#define ram_aw 4 /* Width of RAM address bus */
 
// 定義了一些基本的OP code
#define HALT 0
#define LOAD 1
#define LOADI 2
#define STORE 3
#define ADD 4
#define SUB 5
#define JUMP 6
#define JUMPNZ 7
#define INPUT 8
#define OUTPUT 9
 
// 定義一個基本的macro, 用來合併運算數參數以及OP code
#define _asm_(opc, opr) (opc + (opr << opcw))
 
// ROM裡所存的測試用組語
rom unsigned int undefined program[] = {
_asm_(LOADI, 1), /* 0 */ /* Get a one */
_asm_(STORE, 3), /* 1 */ /* Store this */
_asm_(STORE, 1), /* 2 */
_asm_(INPUT, 0), /* 3 */ /* Read value from user */
_asm_(STORE, 2), /* 4 */ /* Store this */
_asm_(LOAD, 1), /* 5 */ /* Loop entry point */
_asm_(ADD, 0), /* 6 */ /* Make a fib number */
_asm_(STORE, 0), /* 7 */ /* Store it */
_asm_(OUTPUT, 0), /* 8 */ /* Output it */
_asm_(ADD, 1), /* 9 */ /* Make a fib number */
_asm_(STORE, 1), /* a */ /* Store it */
_asm_(OUTPUT, 0), /* b */ /* Output it */
_asm_(LOAD, 2), /* c */ /* Decrement counter */
_asm_(SUB, 3), /* d */
_asm_(JUMPNZ, 4), /* e */ /* Repeat if not zero */
_asm_(HALT, 0) /* f */
};
 
/* 定一個16 x 32深度的RAM */
ram unsigned int dw data[1 << ram_aw];
 
/* 處理器的暫存器 */
unsigned int rom_aw pc; /* 程式計數器 */
unsigned int (opcw+oprw) ir; /* 指令暫存器 */
unsigned int dw x; /* 算數運算單元 */
 
/* Macros to extract opcode and operand fields */
#define opcode (ir <- opcw) // 取得最先的4bit
#define operand (ir \\ opcw) // 取得後面的4bit
 
/* 主程式區塊 */
void main(void) {
pc = 0;
// 處理器迴圈
do {
// 擷取指令
par {
ir = program[pc];
pc = pc + 1;
}
// 解碼以及執行
switch (opcode) {
case LOAD : x = data[operand<-ram_aw]; break;
case LOADI : x = 0 @ operand; break;
case STORE : data[operand<-ram_aw] = x; break;
case ADD : x = x+data[operand<-ram_aw]; break;
case SUB : x = x-data[operand<-ram_aw]; break;
case JUMP : pc = operand<-rom_aw; break;
case JUMPNZ : if (x!=0) pc=operand<-rom_aw; break;
case INPUT : input ? x; break;
case OUTPUT : output ! x; break;
default : while(1) delay; // unknown opcode
}
} while (opcode != HALT);
}

參考文獻

  1. August 19, 2008, Handel-C, 一全新面貎的HDL語法, poorcat0919 - 軟體設計 | 2008-08-19 17:52:19
  2. 百度百科:handel-c — http://baike.baidu.com/view/1917675.html?fromTaglist

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License