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 へ 次へ>>