Last update $Id$
(c) 2007 BakaOyaji

デザインの下準備

まず、デザインで共通に使われるヘッダーファイルを作ります。 PIC16アークテクチャに共通なデータを、yap16_def.hに定義しておきます。こんな感じ。

`ifdef __YAP16_DEF_H
`else

`define __YAP16_DEF_H
//
// Various definitions depend on PIC architecture
// and its imprementation
//
// Instruction related
// Length of Instruction
`define YAP16_INST_WIDTH (14)
`define YAP16_PC_WIDTH (13)
`define YAP16_STACK_DEPTH (8)
`define YAP16_FA_WIDTH (9)

`endif // __YAP16_DEF_H
// EOF yap16_def.h


まったくツマリマセンネ。
次に命令セットの定義(yap16_instruction.h)。ポイントとしては、命令の一語(14ビット)の 中の一部が、オペランドになる場合があるため、その部分をxとしています。Verilogにおける「x」は、UnKnownの意で普通「不定」と翻訳されることが多いのですが、実は、Don't careの意味もあって、この場合は「不定」は訳語としてそぐわな いというか、誤解をあたえると思います。すこし、脱線しましたが、ここでのxは、Don't care(でもそんなの関係ねぇ)の意味です。

`ifdef __YAP16_INSTRUCTIONS_H
`else
`define __YAP16_INSTRUCTIONS_H
//
// Based on Table 15-2 PIC16F627A/628A/648A INSTRUCTION SET
//  (c) 2007 BAKAOyaji
//  $Id
//

// Byte oriented File Register Operations
`define YAP16_INST_ADDWF  14'b00_0111_xxxx_xxxx
`define YAP16_INST_ANDWF  14'b00_0101_xxxx_xxxx
`define YAP16_INST_CLRF   14'b00_0001_1xxx_xxxx
`define YAP16_INST_CLRW   14'b00_0001_0xxx_xxxx
`define YAP16_INST_COMF   14'b00_1001_xxxx_xxxx
`define YAP16_INST_DECF   14'b00_0011_xxxx_xxxx
`define YAP16_INST_DECFSZ 14'b00_1011_xxxx_xxxx
`define YAP16_INST_INCF   14'b00_1010_xxxx_xxxx
`define YAP16_INST_INCFSZ 14'b00_1111_xxxx_xxxx
`define YAP16_INST_IORWF  14'b00_0100_xxxx_xxxx
`define YAP16_INST_MOVF   14'b00_1000_xxxx_xxxx
`define YAP16_INST_MOVWF  14'b00_0000_1xxx_xxxx
`define YAP16_INST_NOP    14'b00_0000_0xx0_0000
`define YAP16_INST_RLF    14'b00_1101_xxxx_xxxx
`define YAP16_INST_RRF    14'b00_1100_xxxx_xxxx
`define YAP16_INST_SUBWF  14'b00_0010_xxxx_xxxx
`define YAP16_INST_SWAPF  14'b00_1110_xxxx_xxxx
`define YAP16_INST_XORWF  14'b00_0110_xxxx_xxxx
// BIT-Oriented File Register Operations
`define YAP16_INST_BCF    14'b01_00xx_xxxx_xxxx
`define YAP16_INST_BSF    14'b01_01xx_xxxx_xxxx
`define YAP16_INST_BTFSC  14'b01_10xx_xxxx_xxxx
`define YAP16_INST_BTFSS  14'b01_11xx_xxxx_xxxx
// Literal and control Operations
`define YAP16_INST_ADDLW  14'b11_111x_xxxx_xxxx
`define YAP16_INST_ANDLW  14'b11_1001_xxxx_xxxx
`define YAP16_INST_CALL   14'b10_0xxx_xxxx_xxxx
`define YAP16_INST_CLRWDT 14'b00_0000_0110_0100
`define YAP16_INST_GOTO   14'b10_1xxx_xxxx_xxxx
`define YAP16_INST_IORLW  14'b11_1000_xxxx_xxxx
`define YAP16_INST_MOVLW  14'b11_00xx_xxxx_xxxx
`define YAP16_INST_RETFIE 14'b00_0000_0000_1001
`define YAP16_INST_RETLW  14'b11_01xx_xxxx_xxxx
`define YAP16_INST_RETURN 14'b00_0000_0000_1000
`define YAP16_INST_SLEEP  14'b00_0000_0110_0011
`define YAP16_INST_SUBLW  14'b11_110x_xxxx_xxxx
`define YAP16_INST_XORLW  14'b11_1010_xxxx_xxxx

`endif // __YAP16_INSTRUCTIONS_H
// EOF yap16_instructions.h


手動で最適化したデコーダを書くのはうんざりしそう(カルノーマップとか、忘れてしまってます。苦笑)ですがVerilog+論理合成なら楽チンです。




<<前に戻る   Index へ  次へ>>