diff --git a/lib/CPUs/JCpu/asm/dctest.jsm b/lib/CPUs/JCpu/asm/dctest.jsm new file mode 100644 index 0000000..38d5947 --- /dev/null +++ b/lib/CPUs/JCpu/asm/dctest.jsm @@ -0,0 +1,56 @@ +; ------------------------------------------------- +; PROJECT "dctest" +; ------------------------------------------------- + +include "../../../jasm/cregs.inc.jsm" + +; ------------------------------------------------- + xmem + org 4 +konst: dc 0x01, 0x12,"A" +gap1: db 16 +mesg: dc "Hallo", 13,0x0A, 0 +name: dc "Jens",0 +msg1: dc "Welcome to JASM CPU",0 +msg2: dc "Ready",0 +msg3: dc "Testing",0 +msg4: dc "Passed",0 +msg5: dc "Error",0 +crlf: dc 0x0D, 0x0A + + org 0x00 +shit: db 4 + + cmem 0 + org 8 +cram1: db 16 +cram2: db 6 +cram3: db 4 + + cmem 1 +cram4: db 8 +cram5: db 8 + org 0x20 +cram6: db 8 +cram7: db 4 + +reg_revision: equ 0x00 +reg_testid: equ 0x01 + +; ------------------------------------------------- + code + org 0x000 +reset: jmp start + +; ------------------------------------------------- + org 0x001 +int_vec: jmp isr + +; ------------------------------------------------- + org 0x010 + +start: jmp start + +; ------------------------------------------------- +isr: reti + diff --git a/lib/CPUs/JCpu/asm/dctest.tcl b/lib/CPUs/JCpu/asm/dctest.tcl new file mode 100644 index 0000000..ca88834 --- /dev/null +++ b/lib/CPUs/JCpu/asm/dctest.tcl @@ -0,0 +1,212 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from dctest.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x010 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00030010" + +# 0x001: JMP 0x011 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00130011" + +# 0x002: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00200000" + +# 0x003: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00300000" + +# 0x004: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00400000" + +# 0x005: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00500000" + +# 0x006: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00600000" + +# 0x007: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00700000" + +# 0x008: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00800000" + +# 0x009: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00900000" + +# 0x00A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A00000" + +# 0x00B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B00000" + +# 0x00C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C00000" + +# 0x00D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D00000" + +# 0x00E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E00000" + +# 0x00F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F00000" + +# 0x010: JMP 0x010 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01030010" + +# 0x011: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0113F000" + +# Assembled from dctest.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0401" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0512" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0641" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1748" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1861" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "196C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1A6C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1B6F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1C0D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1D0A" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1F4A" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2065" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "216E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2273" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2457" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2565" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "266C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2763" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "286F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "296D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2B20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2C74" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2D6F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2E20" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2F4A" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3041" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3153" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "324D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3320" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3443" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3550" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3655" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3852" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3965" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3A61" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3B64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3C79" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3E54" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3F65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4073" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4174" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4269" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "436E" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4467" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4650" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4761" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4873" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4973" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4A65" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4B64" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4D45" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4E72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4F72" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "506F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5172" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "530D" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "540A" + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/lib/CPUs/JCpu/asm/itest.jsm b/lib/CPUs/JCpu/asm/itest.jsm new file mode 100644 index 0000000..9666253 --- /dev/null +++ b/lib/CPUs/JCpu/asm/itest.jsm @@ -0,0 +1,858 @@ +; ------------------------------------------------- +; PROJECT "itest" +; ------------------------------------------------- + +include "../../../jasm/cregs.inc.jsm" + +; ------------------------------------------------- + xmem +msg: dc "Hallo", 0 +xram: db 256 + + cmem 0 +cram: db 256 + +reg_revision: equ 0x00 +reg_testid: equ 0x01 + +; ------------------------------------------------- + code + org 0x000 +reset: jmp start + +; ------------------------------------------------- + org 0x001 +int_vec: jmp isr + +; ------------------------------------------------- + org 0x010 + +start: call init + cin R0, (cpu_revision) + xout (reg_revision), R0 + + ; Test 0 + call test0 + + ; Test 1 + mov R0, 1 + xout (reg_testid), R0 + call test1 + + ; Test 2 + mov R0, 2 + xout (reg_testid), R0 + call test2 + + ; Test 3 + mov R0, 3 + xout (reg_testid), R0 + call test3 + + ; Test 4 + mov R0, 4 + xout (reg_testid), R0 + call test4 + + ; Test 5 + mov R0, 5 + xout (reg_testid), R0 + call test5 + + ; Test 6 + mov R0, 6 + xout (reg_testid), R0 + call test6 + + ; Test 7 + mov R0, 7 + xout (reg_testid), R0 + call test7 + + ; Test 8 + mov R0, 8 + xout (reg_testid), R0 + call test8 + + ; Test 9 + mov R0, 9 + xout (reg_testid), R0 + call test9 + + ; Test 10 + mov R0, 10 + xout (reg_testid), R0 + call test10 + + ; Test 11 + mov R0, 11 + xout (reg_testid), R0 + call test11 + + ; Test 12 + mov R0, 12 + xout (reg_testid), R0 + call test12 + + ; End of test + mov R0, 0xFF + xout (reg_testid), R0 + + jmp ok + +; ------------------------------------------------- +init: mov R0, 0 + mov R1, 0 + mov R2, 0 + mov R3, 0 + mov R4, 0 + mov R5, 0 + mov R6, 0 + mov R7, 0 + mov R8, 0 + mov R9, 0 + mov R10, 0 + mov R11, 0 + mov R12, 0 + mov R13, 0 + mov R14, 0 + mov R15, 0 + ret + +; ------------------------------------------------- +; MOV|R|K +; MOV|R|R +test0: mov R0, 0x10 + cmp R0, 0x10 + jne error + add R0, 1 + + mov R1, R0 + cmp R1, 0x11 + jne error + add R1, 1 + + mov R2, R1 + cmp R2, 0x12 + jne error + add R2, 1 + + mov R3, R2 + cmp R3, 0x13 + jne error + add R3, 1 + + mov R4, R3 + cmp R4, 0x14 + jne error + add R4, 1 + + mov R5, R4 + cmp R5, 0x15 + jne error + add R5, 1 + + mov R6, R5 + cmp R6, 0x16 + jne error + add R6, 1 + + mov R7, R6 + cmp R7, 0x17 + jne error + add R7, 1 + + mov R8, R7 + cmp R8, 0x18 + jne error + add R8, 1 + + mov R9, R8 + cmp R9, 0x19 + jne error + add R9, 1 + + mov R10, R9 + cmp R10, 0x1A + jne error + add R10, 1 + + mov R11, R10 + cmp R11, 0x1B + jne error + add R11, 1 + + mov R12, R11 + cmp R12, 0x1C + jne error + add R12, 1 + + mov R13, R12 + cmp R13, 0x1D + jne error + add R13, 1 + + mov R14, R13 + cmp R14, 0x1E + jne error + add R14, 1 + + mov R15, R14 + cmp R15, 0x1F + jne error + add R15, 1 + + ret + +; ------------------------------------------------- +; Instruction test +; TST|R +; CMP|R|K +; JNZ|K +; JC|K +; JNE|K +; JLT|K +; JGT|K +; JLE|K +; JGE|K +; JMP|K +test1: mov R0, 0 ; R0 <= 0 + tst R0 + jnz error + jc error + cmp R0, 0 + jne error + jlt error + jgt error + jle t1_ok10 + jmp error + +t1_ok10: jeq t1_ok20 + jmp error + +t1_ok20: jge t1_ok30 + jmp error + +t1_ok30: cmp R0, 0x55 + jeq error + jlt t1_ok40 + jmp error + +t1_ok40: jle t1_ok50 + jmp error + +t1_ok50: jge error + jgt error + + mov R0, 0x55 ; R0 <= 0xAA + tst R0 + jz error + jc error + + cmp R0, 0xAA + jeq error + jne t1_ok60 + jmp error + +t1_ok60: jlt t1_ok70 + jmp error + +t1_ok70: jle t1_ok80 + jmp error + +t1_ok80: jgt error + + cmp R0, 0x55 + jeq t1_ok90 + jmp error + +t1_ok90: jne error + jlt error + + jle t1_ok100 + jmp error + +t1_ok100: jgt error + jge t1_ok110 + jmp error + +t1_ok110: mov R0, 0xAA ; R0 <= 0x55 + tst R0 + jz error + jc error + + cmp R0, 0x55 + jeq error + jne t1_ok120 + jmp error + +t1_ok120: jgt t1_ok130 + jmp error + +t1_ok130: jge t1_ok140 + jmp error + +t1_ok140: jlt error + jle error + + ret + +; ------------------------------------------------- +; ADD|R|K +; ADDC|R|K +; ToDo: ADD|R|R +; ToDo: ADDC|R|R +; CMP|R|R +test2: mov R0, 0 + mov R1, 0 + mov R2, R0 + mov R3, R1 + +t2_loop: add R0, 0x01 + addc R1, 0x00 + add R2, 1 + cmp R2, 0 + jne t2_L1 + add R3, 1 + cmp R3, 0x02 +t2_L1: jne t2_loop + cmp R0, R2 + jne error + cmp R1, R3 + jne error + mov R0, 0 + + ret + +; ------------------------------------------------- +; SUB|R|K +; SUBC|R|K +; ToDo: SUB|R|R +; ToDo: SUBC|R|R +; CMP|R|R +test3: mov R0, 0x00 + mov R1, 0x03 + mov R2, R0 + mov R3, R1 + +t3_loop: sub R0, 0x01 + subc R1, 0x00 + sub R2, 1 + cmp R2, 0xFF + jne t3_L1 + sub R3, 1 + cmp R3, 0x00 +t3_L1: jne t3_loop + cmp R0, R2 + jne error + cmp R1, R3 + jne error + mov R0, 0 + + ret +; ------------------------------------------------- +; SUB|K|R +; SUB|R|R +; SUBC|R|R +; SUBC|K|R +; CMP|R|R +test4: mov R0, 0x03 + mov R1, 0x05 + sub 0x05, R0 + sub R1, 0x03 + cmp R0, R1 + jne error + mov R0, 0x03 + mov R1, 0x05 + sub R0, R1 + subc 0, R0 + cmp R0, 0x01 + jne error + add R0, 0 + subc R1, R0 + cmp R1, 0x04 + jne error + mov R0, 0 + + ret + +; ------------------------------------------------- +; MOVC|R|Ri +; MOVC|R|Ki +; MOVC|Ri|R +; MOVC|Ri|K +; MOVC|Ki|R +test5: mov R0, 1 + movc (cram+0x5A), R0 + dec R0 + movc (cram+0), R0 + movc R1, (cram+0x5A) + movc (R1), 0xA5 + movc R0, (R1) + movc R1, (R1) + add R1, 0xFF-0xA5 + movc R0, (R1) +t5_loop1: movc (R0), R0 + movc R2, (R0) + cmp R2, R0 + jne error + movc (R2), R1 + movc R2, (R2) + cmp R2, R1 + jne error + dec R1 + inc R0 + jnz t5_loop1 + + ret + +; ------------------------------------------------- +; MOVX|R|Ri +; MOVX|R|Ki +; MOVX|Ri|R +; MOVX|Ri|K +; MOVX|Ki|R +test6: mov R0, 1 + movx (xram+0x5A), R0 + dec R0 + movx (xram+0), R0 + movx R1, (xram+0x5A) + movx (R1), 0xA5 + movx R0, (R1) + movx R1, (R1) + add R1, 0xFF-0xA5 + movx R0, (R1) +t6_loop1: movx (R0), R0 + movx R2, (R0) + cmp R2, R0 + jne error + movx (R2), R1 + movx R2, (R2) + cmp R2, R1 + jne error + dec R1 + inc R0 + jnz t6_loop1 + + ret + +; ------------------------------------------------- +; PUSH|R +; POP|R +test7: mov R0, 0xAA + mov R1, 0 +t7_loop1: push R0 + inc R0 + dec R1 + jnz t7_loop1 +t7_loop2: pop R0 + dec R1 + jnz t7_loop2 + cmp R0, 0xAA + jne error + + ret + +; ------------------------------------------------- +; JMP|K +; CALL|K +; RET +test8: mov R0, 0x55 + push R0 + mov R0, 0 + mov R1, 0xFF + call t8_rec + pop R0 + cmp R0, 0x55 + jne error + + ; Stack manipulations 1 + mov R0, return1'high + mov R1, return1'low + cout (cpu_stack_high), R0 + push R1 + + mov R0, init'high + mov R1, init'low + cout (cpu_stack_high), R0 + push R1 + ret + + ; Stack manipulations 2 +return1: mov R0, return2'high + mov R1, return2'low + cout (cpu_stack_high), R0 + push R1 + + mov R0, init'high + mov R1, init'low + cout (cpu_stack_high), R0 + push R1 +return2: ret + +t8_rec: cmp R0, R1 + jeq ex_t8_rec + inc R0 + jmp t8_rstub +ex_t8_rec: dec R0 + dec R1 + ret + +t8_rstub: call t8_rec + jmp ex_t8_rec + +; ------------------------------------------------- +; SWAP|R +; SHL|R +; SHR|R +; ROL|R +; ROR|R +; ROLC|R +; RORC|R +test9: mov R0, 0xA5 ; SWAP test + mov R1, 0x5A + swap R0 + cmp R0, 0x5A + jne error + swap R0 + cmp R0, 0xA5 + jne error + mov R0, 0xD2 + swap R0 + cmp R0, 0x2D + jne error + swap R1 + cmp R0, 0x2D + jne error + cmp R1, 0xA5 + jne error + + mov R0, 0x2D + shl R0 ; SHL test + cmp R0, 0x5A + jne error + shl R0 + cmp R0, 0xB4 + jne error + shl R0 + cmp R0, 0x68 + jne error + shl R0 + cmp R0, 0xD0 + jne error + shl R0 + cmp R0, 0xA0 + jne error + shl R0 + cmp R0, 0x40 + jne error + shl R0 + cmp R0, 0x80 + jne error + shl R0 + cmp R0, 0x00 + jne error + + mov R1, 0x84 + shr R1 ; SHR test + cmp R1, 0x42 + jne error + shr R1 + cmp R1, 0x21 + jne error + shr R1 + cmp R1, 0x10 + jne error + shr R1 + cmp R1, 0x08 + jne error + shr R1 + cmp R1, 0x04 + jne error + shr R1 + cmp R1, 0x02 + jne error + shr R1 + cmp R1, 0x01 + jne error + shr R1 + cmp R1, 0x00 + jne error + + mov R0, 0xC5 ; ROL test + rol R0 + cmp R0, 0x8B + jne error + rol R0 + cmp R0, 0x17 + jne error + rol R0 + cmp R0, 0x2E + jne error + rol R0 + cmp R0, 0x5C + jne error + rol R0 + cmp R0, 0xB8 + jne error + rol R0 + cmp R0, 0x71 + jne error + rol R0 + cmp R0, 0xE2 + jne error + rol R0 + cmp R0, 0xC5 + jne error + + mov R1, 0x63 ; ROR test + ror R1 + cmp R1, 0xB1 + jne error + ror R1 + cmp R1, 0xD8 + jne error + ror R1 + cmp R1, 0x6C + jne error + ror R1 + cmp R1, 0x36 + jne error + ror R1 + cmp R1, 0x1B + jne error + ror R1 + cmp R1, 0x8D + jne error + ror R1 + cmp R1, 0xC6 + jne error + ror R1 + cmp R1, 0x63 + jne error + + + xor R0, R0 ; ROLC generate + mov R0, 0xC5 + rolc R0 + push R0 + rolc R0 + push R0 + rolc R0 + push R0 + rolc R0 + push R0 + rolc R0 + push R0 + rolc R0 + push R0 + rolc R0 + push R0 + rolc R0 + push R0 + rolc R0 + + cmp R0, 0xC5 ; ROLC verify + jne error + pop R0 + cmp R0, 0x62 + jne error + pop R0 + cmp R0, 0xB1 + jne error + pop R0 + cmp R0, 0x58 + jne error + pop R0 + cmp R0, 0xAC + jne error + pop R0 + cmp R0, 0x56 + jne error + pop R0 + cmp R0, 0x2B + jne error + pop R0 + cmp R0, 0x15 + jne error + pop R0 + cmp R0, 0x8A + jne error + + xor R1, R1 ; RORC generate + mov R1, 0x63 + rorc R1 + push R1 + rorc R1 + push R1 + rorc R1 + push R1 + rorc R1 + push R1 + rorc R1 + push R1 + rorc R1 + push R1 + rorc R1 + push R1 + rorc R1 + push R1 + rorc R1 + + cmp R1, 0x63 ; RORC verify + jne error + pop R1 + cmp R1, 0xC6 + jne error + pop R1 + cmp R1, 0x8C + jne error + pop R1 + cmp R1, 0x19 + jne error + pop R1 + cmp R1, 0x33 + jne error + pop R1 + cmp R1, 0x66 + jne error + pop R1 + cmp R1, 0xCC + jne error + pop R1 + cmp R1, 0x98 + jne error + pop R1 + cmp R1, 0x31 + jne error + + ret + +; ------------------------------------------------- +; AND|R|R +; AND|R|K +; OR|R|R +; OR|R|K +; XOR|R|R +; XOR|R|K +test10: mov R0, 0xA5 ; AND + swap R0 + push R0 + and R0, 0x0F + cmp R0, 0x0A + jne error + pop R0 + push R0 + and R0, 0x0F + cmp R0, 0x0A + pop R1 + jne error + swap R1 + mov R2, 0x0F + and R1, R2 + cmp R1, 0x05 + jne error + + mov R0, 0x05 ; OR + mov R2, 0xA0 + swap R0 + or R2, R0 + cmp R2, 0xF0 + jne error + swap R0 + or R0, 0x50 + cmp R0, 0x55 + jne error + + mov R1, 0x01 + mov R0, 0x01 + xor R0, 0x01 + jnz error + xor R0, R1 + cmp R0, 0x01 + jne error + + ret + +; ------------------------------------------------- +test11: + mov R0, 0x03 + cout (cpu_int_ctrl), R0 + + xin R0, (2) + or R0, 1 + xout (2), R0 + nop + nop + nop + nop + nop + nop + xin R0, (2) + and R0, 0xFE + xout (2), R0 + nop + nop + nop + nop + + cin R0, (cpu_int_ctrl) + or R0, 0x80 + cout (cpu_int_ctrl), R0 + nop + cin R0, (cpu_int_ctrl) + or R0, 0x80 + cout (cpu_int_ctrl), R0 + nop + cin R0, (cpu_int_ctrl) + or R0, 0x80 + cout (cpu_int_ctrl), R0 + nop + cin R0, (cpu_int_ctrl) + or R0, 0x80 + cout (cpu_int_ctrl), R0 + nop + nop + nop + nop + nop + nop + nop + nop + nop + ret + +; ------------------------------------------------- +; Tests clrc, setc +test12: sub R0, 0 + jc error + setc + jnc error + nop + sub R0, 0 + jc error + + mov R0, 0 + clrc + jc error + setc + jnc error + nop + clrc + jc error + ret + +; ------------------------------------------------- +isr: inc R14 + reti + +; ------------------------------------------------- + org 0x3FF +error: jmp error + +; ------------------------------------------------- + org 0x2FF +ok: jmp ok + +; ------------------------------------------------- + \ No newline at end of file diff --git a/lib/CPUs/JCpu/asm/itest.tcl b/lib/CPUs/JCpu/asm/itest.tcl new file mode 100644 index 0000000..3724ca6 --- /dev/null +++ b/lib/CPUs/JCpu/asm/itest.tcl @@ -0,0 +1,3407 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from itest.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x010 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00030010" + +# 0x001: JMP 0x288 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00130288" + +# 0x002: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00200000" + +# 0x003: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00300000" + +# 0x004: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00400000" + +# 0x005: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00500000" + +# 0x006: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00600000" + +# 0x007: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00700000" + +# 0x008: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00800000" + +# 0x009: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00900000" + +# 0x00A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A00000" + +# 0x00B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B00000" + +# 0x00C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C00000" + +# 0x00D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D00000" + +# 0x00E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E00000" + +# 0x00F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F00000" + +# 0x010: CALL 0x03B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0103B03B" + +# 0x011: CIN R00, (0x00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01129000" + +# 0x012: XOUT (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01224000" + +# 0x013: CALL 0x04C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0133B04C" + +# 0x014: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01403010" + +# 0x015: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01524010" + +# 0x016: CALL 0x08D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0163B08D" + +# 0x017: MOV R00, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01703020" + +# 0x018: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01824010" + +# 0x019: CALL 0x0C9 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0193B0C9" + +# 0x01A: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A03030" + +# 0x01B: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01B24010" + +# 0x01C: CALL 0x0DB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01C3B0DB" + +# 0x01D: MOV R00, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01D03040" + +# 0x01E: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01E24010" + +# 0x01F: CALL 0x0ED +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01F3B0ED" + +# 0x020: MOV R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02003050" + +# 0x021: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02124010" + +# 0x022: CALL 0x0FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0223B0FF" + +# 0x023: MOV R00, 0x06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02303060" + +# 0x024: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02424010" + +# 0x025: CALL 0x115 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0253B115" + +# 0x026: MOV R00, 0x07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02603070" + +# 0x027: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02724010" + +# 0x028: CALL 0x12B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0283B12B" + +# 0x029: MOV R00, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02903080" + +# 0x02A: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02A24010" + +# 0x02B: CALL 0x137 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02B3B137" + +# 0x02C: MOV R00, 0x09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02C03090" + +# 0x02D: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02D24010" + +# 0x02E: CALL 0x15A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02E3B15A" + +# 0x02F: MOV R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "02F030A0" + +# 0x030: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03024010" + +# 0x031: CALL 0x22A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0313B22A" + +# 0x032: MOV R00, 0x0B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "032030B0" + +# 0x033: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03324010" + +# 0x034: CALL 0x24D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0343B24D" + +# 0x035: MOV R00, 0x0C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "035030C0" + +# 0x036: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03624010" + +# 0x037: CALL 0x278 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0373B278" + +# 0x038: MOV R00, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03803FF0" + +# 0x039: XOUT (0x01), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03924010" + +# 0x03A: JMP 0x2FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03A302FF" + +# 0x03B: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03B03000" + +# 0x03C: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03C03001" + +# 0x03D: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03D03002" + +# 0x03E: MOV R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03E03003" + +# 0x03F: MOV R04, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "03F03004" + +# 0x040: MOV R05, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04003005" + +# 0x041: MOV R06, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04103006" + +# 0x042: MOV R07, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04203007" + +# 0x043: MOV R08, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04303008" + +# 0x044: MOV R09, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04403009" + +# 0x045: MOV R10, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0450300A" + +# 0x046: MOV R11, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0460300B" + +# 0x047: MOV R12, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0470300C" + +# 0x048: MOV R13, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0480300D" + +# 0x049: MOV R14, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0490300E" + +# 0x04A: MOV R15, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04A0300F" + +# 0x04B: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04B3E000" + +# 0x04C: MOV R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04C03100" + +# 0x04D: CMP R00, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04D0F100" + +# 0x04E: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04E3A3FF" + +# 0x04F: ADD R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "04F11010" + +# 0x050: MOV R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05002001" + +# 0x051: CMP R01, 0x11 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0510F111" + +# 0x052: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0523A3FF" + +# 0x053: ADD R01, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05311011" + +# 0x054: MOV R02, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05402012" + +# 0x055: CMP R02, 0x12 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0550F122" + +# 0x056: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0563A3FF" + +# 0x057: ADD R02, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05711012" + +# 0x058: MOV R03, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05802023" + +# 0x059: CMP R03, 0x13 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0590F133" + +# 0x05A: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05A3A3FF" + +# 0x05B: ADD R03, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05B11013" + +# 0x05C: MOV R04, R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05C02034" + +# 0x05D: CMP R04, 0x14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05D0F144" + +# 0x05E: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05E3A3FF" + +# 0x05F: ADD R04, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "05F11014" + +# 0x060: MOV R05, R04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06002045" + +# 0x061: CMP R05, 0x15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0610F155" + +# 0x062: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0623A3FF" + +# 0x063: ADD R05, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06311015" + +# 0x064: MOV R06, R05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06402056" + +# 0x065: CMP R06, 0x16 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0650F166" + +# 0x066: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0663A3FF" + +# 0x067: ADD R06, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06711016" + +# 0x068: MOV R07, R06 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06802067" + +# 0x069: CMP R07, 0x17 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0690F177" + +# 0x06A: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06A3A3FF" + +# 0x06B: ADD R07, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06B11017" + +# 0x06C: MOV R08, R07 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06C02078" + +# 0x06D: CMP R08, 0x18 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06D0F188" + +# 0x06E: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06E3A3FF" + +# 0x06F: ADD R08, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "06F11018" + +# 0x070: MOV R09, R08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07002089" + +# 0x071: CMP R09, 0x19 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0710F199" + +# 0x072: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0723A3FF" + +# 0x073: ADD R09, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07311019" + +# 0x074: MOV R10, R09 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0740209A" + +# 0x075: CMP R10, 0x1A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0750F1AA" + +# 0x076: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0763A3FF" + +# 0x077: ADD R10, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0771101A" + +# 0x078: MOV R11, R10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "078020AB" + +# 0x079: CMP R11, 0x1B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0790F1BB" + +# 0x07A: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07A3A3FF" + +# 0x07B: ADD R11, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07B1101B" + +# 0x07C: MOV R12, R11 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07C020BC" + +# 0x07D: CMP R12, 0x1C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07D0F1CC" + +# 0x07E: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07E3A3FF" + +# 0x07F: ADD R12, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "07F1101C" + +# 0x080: MOV R13, R12 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "080020CD" + +# 0x081: CMP R13, 0x1D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0810F1DD" + +# 0x082: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0823A3FF" + +# 0x083: ADD R13, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0831101D" + +# 0x084: MOV R14, R13 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "084020DE" + +# 0x085: CMP R14, 0x1E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0850F1EE" + +# 0x086: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0863A3FF" + +# 0x087: ADD R14, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0871101E" + +# 0x088: MOV R15, R14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "088020EF" + +# 0x089: CMP R15, 0x1F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0890F1FF" + +# 0x08A: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08A3A3FF" + +# 0x08B: ADD R15, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08B1101F" + +# 0x08C: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08C3E000" + +# 0x08D: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08D03000" + +# 0x08E: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08E0F000" + +# 0x08F: JNZ 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "08F323FF" + +# 0x090: JC 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "090333FF" + +# 0x091: CMP R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0910F000" + +# 0x092: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0923A3FF" + +# 0x093: JLT 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "093353FF" + +# 0x094: JGT 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "094363FF" + +# 0x095: JLE 0x097 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09537097" + +# 0x096: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "096303FF" + +# 0x097: JEQ 0x099 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09739099" + +# 0x098: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "098303FF" + +# 0x099: JGE 0x09B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0993809B" + +# 0x09A: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09A303FF" + +# 0x09B: CMP R00, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09B0F550" + +# 0x09C: JEQ 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09C393FF" + +# 0x09D: JLT 0x09F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09D3509F" + +# 0x09E: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09E303FF" + +# 0x09F: JLE 0x0A1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "09F370A1" + +# 0x0A0: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A0303FF" + +# 0x0A1: JGE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A1383FF" + +# 0x0A2: JGT 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A2363FF" + +# 0x0A3: MOV R00, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A303550" + +# 0x0A4: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A40F000" + +# 0x0A5: JZ 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A5313FF" + +# 0x0A6: JC 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A6333FF" + +# 0x0A7: CMP R00, 0xAA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A70FAA0" + +# 0x0A8: JEQ 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A8393FF" + +# 0x0A9: JNE 0x0AB +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0A93A0AB" + +# 0x0AA: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AA303FF" + +# 0x0AB: JLT 0x0AD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AB350AD" + +# 0x0AC: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AC303FF" + +# 0x0AD: JLE 0x0AF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AD370AF" + +# 0x0AE: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AE303FF" + +# 0x0AF: JGT 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0AF363FF" + +# 0x0B0: CMP R00, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B00F550" + +# 0x0B1: JEQ 0x0B3 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B1390B3" + +# 0x0B2: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B2303FF" + +# 0x0B3: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B33A3FF" + +# 0x0B4: JLT 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B4353FF" + +# 0x0B5: JLE 0x0B7 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B5370B7" + +# 0x0B6: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B6303FF" + +# 0x0B7: JGT 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B7363FF" + +# 0x0B8: JGE 0x0BA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B8380BA" + +# 0x0B9: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0B9303FF" + +# 0x0BA: MOV R00, 0xAA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BA03AA0" + +# 0x0BB: TST R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BB0F000" + +# 0x0BC: JZ 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BC313FF" + +# 0x0BD: JC 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BD333FF" + +# 0x0BE: CMP R00, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BE0F550" + +# 0x0BF: JEQ 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0BF393FF" + +# 0x0C0: JNE 0x0C2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C03A0C2" + +# 0x0C1: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C1303FF" + +# 0x0C2: JGT 0x0C4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C2360C4" + +# 0x0C3: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C3303FF" + +# 0x0C4: JGE 0x0C6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C4380C6" + +# 0x0C5: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C5303FF" + +# 0x0C6: JLT 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C6353FF" + +# 0x0C7: JLE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C7373FF" + +# 0x0C8: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C83E000" + +# 0x0C9: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0C903000" + +# 0x0CA: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CA03001" + +# 0x0CB: MOV R02, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CB02002" + +# 0x0CC: MOV R03, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CC02013" + +# 0x0CD: ADD R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CD11010" + +# 0x0CE: ADDC R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CE13001" + +# 0x0CF: ADD R02, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0CF11012" + +# 0x0D0: CMP R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D00F002" + +# 0x0D1: JNE 0x0D4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D13A0D4" + +# 0x0D2: ADD R03, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D211013" + +# 0x0D3: CMP R03, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D30F023" + +# 0x0D4: JNE 0x0CD +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D43A0CD" + +# 0x0D5: CMP R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D50E020" + +# 0x0D6: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D63A3FF" + +# 0x0D7: CMP R01, R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D70E031" + +# 0x0D8: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D83A3FF" + +# 0x0D9: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0D903000" + +# 0x0DA: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DA3E000" + +# 0x0DB: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DB03000" + +# 0x0DC: MOV R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DC03031" + +# 0x0DD: MOV R02, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DD02002" + +# 0x0DE: MOV R03, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DE02013" + +# 0x0DF: SUB R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0DF15010" + +# 0x0E0: SUBC R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E017001" + +# 0x0E1: SUB R02, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E115012" + +# 0x0E2: CMP R02, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E20FFF2" + +# 0x0E3: JNE 0x0E6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E33A0E6" + +# 0x0E4: SUB R03, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E415013" + +# 0x0E5: CMP R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E50F003" + +# 0x0E6: JNE 0x0DF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E63A0DF" + +# 0x0E7: CMP R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E70E020" + +# 0x0E8: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E83A3FF" + +# 0x0E9: CMP R01, R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0E90E031" + +# 0x0EA: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EA3A3FF" + +# 0x0EB: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EB03000" + +# 0x0EC: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EC3E000" + +# 0x0ED: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0ED03030" + +# 0x0EE: MOV R01, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EE03051" + +# 0x0EF: SUB 0x05, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0EF2E050" + +# 0x0F0: SUB R01, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F015031" + +# 0x0F1: CMP R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F10E010" + +# 0x0F2: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F23A3FF" + +# 0x0F3: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F303030" + +# 0x0F4: MOV R01, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F403051" + +# 0x0F5: SUB R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F514010" + +# 0x0F6: SUBC 0x00, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F62F000" + +# 0x0F7: CMP R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F70F010" + +# 0x0F8: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F83A3FF" + +# 0x0F9: ADD R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0F911000" + +# 0x0FA: SUBC R01, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FA16001" + +# 0x0FB: CMP R01, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FB0F041" + +# 0x0FC: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FC3A3FF" + +# 0x0FD: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FD03000" + +# 0x0FE: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FE3E000" + +# 0x0FF: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0FF03010" + +# 0x100: MOVC (0x5A), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1000D5A0" + +# 0x101: DEC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10115010" + +# 0x102: MOVC (0x00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1020D000" + +# 0x103: MOVC R01, (0x5A) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1030A5A1" + +# 0x104: MOVC (R01), 0xA5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1040CA51" + +# 0x105: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10509010" + +# 0x106: MOVC R01, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10609011" + +# 0x107: ADD R01, 0x5A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "107115A1" + +# 0x108: MOVC R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10809010" + +# 0x109: MOVC (R00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1090B000" + +# 0x10A: MOVC R02, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10A09002" + +# 0x10B: CMP R02, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10B0E002" + +# 0x10C: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10C3A3FF" + +# 0x10D: MOVC (R01), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10D0B021" + +# 0x10E: MOVC R02, (R02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10E09022" + +# 0x10F: CMP R02, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "10F0E012" + +# 0x110: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1103A3FF" + +# 0x111: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11115011" + +# 0x112: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11211010" + +# 0x113: JNZ 0x109 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11332109" + +# 0x114: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1143E000" + +# 0x115: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11503010" + +# 0x116: MOVX (0x60), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11608600" + +# 0x117: DEC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11715010" + +# 0x118: MOVX (0x06), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11808060" + +# 0x119: MOVX R01, (0x60) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11905601" + +# 0x11A: MOVX (R01), 0xA5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11A07A51" + +# 0x11B: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11B04010" + +# 0x11C: MOVX R01, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11C04011" + +# 0x11D: ADD R01, 0x5A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11D115A1" + +# 0x11E: MOVX R00, (R01) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11E04010" + +# 0x11F: MOVX (R00), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "11F06000" + +# 0x120: MOVX R02, (R00) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12004002" + +# 0x121: CMP R02, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1210E002" + +# 0x122: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1223A3FF" + +# 0x123: MOVX (R01), R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12306021" + +# 0x124: MOVX R02, (R02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12404022" + +# 0x125: CMP R02, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1250E012" + +# 0x126: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1263A3FF" + +# 0x127: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12715011" + +# 0x128: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12811010" + +# 0x129: JNZ 0x11F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1293211F" + +# 0x12A: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12A3E000" + +# 0x12B: MOV R00, 0xAA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12B03AA0" + +# 0x12C: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12C03001" + +# 0x12D: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12D3C000" + +# 0x12E: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12E11010" + +# 0x12F: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "12F15011" + +# 0x130: JNZ 0x12D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1303212D" + +# 0x131: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1313D000" + +# 0x132: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13215011" + +# 0x133: JNZ 0x131 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13332131" + +# 0x134: CMP R00, 0xAA +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1340FAA0" + +# 0x135: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1353A3FF" + +# 0x136: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1363E000" + +# 0x137: MOV R00, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13703550" + +# 0x138: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1383C000" + +# 0x139: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13903000" + +# 0x13A: MOV R01, 0xFF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13A03FF1" + +# 0x13B: CALL 0x151 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13B3B151" + +# 0x13C: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13C3D000" + +# 0x13D: CMP R00, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13D0F550" + +# 0x13E: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13E3A3FF" + +# 0x13F: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "13F03010" + +# 0x140: MOV R01, 0x48 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14003481" + +# 0x141: COUT (0x05), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14126050" + +# 0x142: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1423C001" + +# 0x143: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14303000" + +# 0x144: MOV R01, 0x3B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "144033B1" + +# 0x145: COUT (0x05), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14526050" + +# 0x146: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1463C001" + +# 0x147: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1473E000" + +# 0x148: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14803010" + +# 0x149: MOV R01, 0x50 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14903501" + +# 0x14A: COUT (0x05), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14A26050" + +# 0x14B: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14B3C001" + +# 0x14C: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14C03000" + +# 0x14D: MOV R01, 0x3B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14D033B1" + +# 0x14E: COUT (0x05), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14E26050" + +# 0x14F: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "14F3C001" + +# 0x150: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1503E000" + +# 0x151: CMP R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1510E010" + +# 0x152: JEQ 0x155 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15239155" + +# 0x153: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15311010" + +# 0x154: JMP 0x158 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15430158" + +# 0x155: DEC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15515010" + +# 0x156: DEC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15615011" + +# 0x157: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1573E000" + +# 0x158: CALL 0x151 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1583B151" + +# 0x159: JMP 0x155 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15930155" + +# 0x15A: MOV R00, 0xA5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15A03A50" + +# 0x15B: MOV R01, 0x5A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15B035A1" + +# 0x15C: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15C2A000" + +# 0x15D: CMP R00, 0x5A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15D0F5A0" + +# 0x15E: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15E3A3FF" + +# 0x15F: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "15F2A000" + +# 0x160: CMP R00, 0xA5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1600FA50" + +# 0x161: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1613A3FF" + +# 0x162: MOV R00, 0xD2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16203D20" + +# 0x163: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1632A000" + +# 0x164: CMP R00, 0x2D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1640F2D0" + +# 0x165: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1653A3FF" + +# 0x166: SWAP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1662A001" + +# 0x167: CMP R00, 0x2D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1670F2D0" + +# 0x168: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1683A3FF" + +# 0x169: CMP R01, 0xA5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1690FA51" + +# 0x16A: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16A3A3FF" + +# 0x16B: MOV R00, 0x2D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16B032D0" + +# 0x16C: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16C1E000" + +# 0x16D: CMP R00, 0x5A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16D0F5A0" + +# 0x16E: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16E3A3FF" + +# 0x16F: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "16F1E000" + +# 0x170: CMP R00, 0xB4 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1700FB40" + +# 0x171: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1713A3FF" + +# 0x172: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1721E000" + +# 0x173: CMP R00, 0x68 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1730F680" + +# 0x174: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1743A3FF" + +# 0x175: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1751E000" + +# 0x176: CMP R00, 0xD0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1760FD00" + +# 0x177: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1773A3FF" + +# 0x178: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1781E000" + +# 0x179: CMP R00, 0xA0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1790FA00" + +# 0x17A: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17A3A3FF" + +# 0x17B: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17B1E000" + +# 0x17C: CMP R00, 0x40 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17C0F400" + +# 0x17D: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17D3A3FF" + +# 0x17E: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17E1E000" + +# 0x17F: CMP R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "17F0F800" + +# 0x180: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1803A3FF" + +# 0x181: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1811E000" + +# 0x182: CMP R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1820F000" + +# 0x183: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1833A3FF" + +# 0x184: MOV R01, 0x84 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18403841" + +# 0x185: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1851F001" + +# 0x186: CMP R01, 0x42 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1860F421" + +# 0x187: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1873A3FF" + +# 0x188: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1881F001" + +# 0x189: CMP R01, 0x21 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1890F211" + +# 0x18A: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18A3A3FF" + +# 0x18B: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18B1F001" + +# 0x18C: CMP R01, 0x10 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18C0F101" + +# 0x18D: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18D3A3FF" + +# 0x18E: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18E1F001" + +# 0x18F: CMP R01, 0x08 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "18F0F081" + +# 0x190: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1903A3FF" + +# 0x191: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1911F001" + +# 0x192: CMP R01, 0x04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1920F041" + +# 0x193: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1933A3FF" + +# 0x194: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1941F001" + +# 0x195: CMP R01, 0x02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1950F021" + +# 0x196: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1963A3FF" + +# 0x197: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1971F001" + +# 0x198: CMP R01, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1980F011" + +# 0x199: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1993A3FF" + +# 0x19A: SHR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19A1F001" + +# 0x19B: CMP R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19B0F001" + +# 0x19C: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19C3A3FF" + +# 0x19D: MOV R00, 0xC5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19D03C50" + +# 0x19E: ROL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19E20000" + +# 0x19F: CMP R00, 0x8B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "19F0F8B0" + +# 0x1A0: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A03A3FF" + +# 0x1A1: ROL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A120000" + +# 0x1A2: CMP R00, 0x17 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A20F170" + +# 0x1A3: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A33A3FF" + +# 0x1A4: ROL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A420000" + +# 0x1A5: CMP R00, 0x2E +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A50F2E0" + +# 0x1A6: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A63A3FF" + +# 0x1A7: ROL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A720000" + +# 0x1A8: CMP R00, 0x5C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A80F5C0" + +# 0x1A9: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1A93A3FF" + +# 0x1AA: ROL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AA20000" + +# 0x1AB: CMP R00, 0xB8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AB0FB80" + +# 0x1AC: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AC3A3FF" + +# 0x1AD: ROL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AD20000" + +# 0x1AE: CMP R00, 0x71 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AE0F710" + +# 0x1AF: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1AF3A3FF" + +# 0x1B0: ROL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B020000" + +# 0x1B1: CMP R00, 0xE2 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B10FE20" + +# 0x1B2: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B23A3FF" + +# 0x1B3: ROL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B320000" + +# 0x1B4: CMP R00, 0xC5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B40FC50" + +# 0x1B5: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B53A3FF" + +# 0x1B6: MOV R01, 0x63 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B603631" + +# 0x1B7: ROR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B721001" + +# 0x1B8: CMP R01, 0xB1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B80FB11" + +# 0x1B9: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1B93A3FF" + +# 0x1BA: ROR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BA21001" + +# 0x1BB: CMP R01, 0xD8 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BB0FD81" + +# 0x1BC: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BC3A3FF" + +# 0x1BD: ROR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BD21001" + +# 0x1BE: CMP R01, 0x6C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BE0F6C1" + +# 0x1BF: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1BF3A3FF" + +# 0x1C0: ROR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C021001" + +# 0x1C1: CMP R01, 0x36 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C10F361" + +# 0x1C2: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C23A3FF" + +# 0x1C3: ROR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C321001" + +# 0x1C4: CMP R01, 0x1B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C40F1B1" + +# 0x1C5: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C53A3FF" + +# 0x1C6: ROR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C621001" + +# 0x1C7: CMP R01, 0x8D +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C70F8D1" + +# 0x1C8: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C83A3FF" + +# 0x1C9: ROR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1C921001" + +# 0x1CA: CMP R01, 0xC6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CA0FC61" + +# 0x1CB: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CB3A3FF" + +# 0x1CC: ROR R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CC21001" + +# 0x1CD: CMP R01, 0x63 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CD0F631" + +# 0x1CE: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CE3A3FF" + +# 0x1CF: XOR R00, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1CF1C000" + +# 0x1D0: MOV R00, 0xC5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D003C50" + +# 0x1D1: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D122000" + +# 0x1D2: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D23C000" + +# 0x1D3: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D322000" + +# 0x1D4: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D43C000" + +# 0x1D5: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D522000" + +# 0x1D6: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D63C000" + +# 0x1D7: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D722000" + +# 0x1D8: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D83C000" + +# 0x1D9: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1D922000" + +# 0x1DA: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DA3C000" + +# 0x1DB: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DB22000" + +# 0x1DC: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DC3C000" + +# 0x1DD: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DD22000" + +# 0x1DE: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DE3C000" + +# 0x1DF: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1DF22000" + +# 0x1E0: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E03C000" + +# 0x1E1: ROLC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E122000" + +# 0x1E2: CMP R00, 0xC5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E20FC50" + +# 0x1E3: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E33A3FF" + +# 0x1E4: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E43D000" + +# 0x1E5: CMP R00, 0x62 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E50F620" + +# 0x1E6: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E63A3FF" + +# 0x1E7: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E73D000" + +# 0x1E8: CMP R00, 0xB1 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E80FB10" + +# 0x1E9: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1E93A3FF" + +# 0x1EA: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EA3D000" + +# 0x1EB: CMP R00, 0x58 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EB0F580" + +# 0x1EC: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EC3A3FF" + +# 0x1ED: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1ED3D000" + +# 0x1EE: CMP R00, 0xAC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EE0FAC0" + +# 0x1EF: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1EF3A3FF" + +# 0x1F0: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F03D000" + +# 0x1F1: CMP R00, 0x56 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F10F560" + +# 0x1F2: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F23A3FF" + +# 0x1F3: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F33D000" + +# 0x1F4: CMP R00, 0x2B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F40F2B0" + +# 0x1F5: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F53A3FF" + +# 0x1F6: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F63D000" + +# 0x1F7: CMP R00, 0x15 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F70F150" + +# 0x1F8: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F83A3FF" + +# 0x1F9: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1F93D000" + +# 0x1FA: CMP R00, 0x8A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FA0F8A0" + +# 0x1FB: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FB3A3FF" + +# 0x1FC: XOR R01, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FC1C011" + +# 0x1FD: MOV R01, 0x63 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FD03631" + +# 0x1FE: RORC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FE23001" + +# 0x1FF: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "1FF3C001" + +# 0x200: RORC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20023001" + +# 0x201: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2013C001" + +# 0x202: RORC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20223001" + +# 0x203: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2033C001" + +# 0x204: RORC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20423001" + +# 0x205: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2053C001" + +# 0x206: RORC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20623001" + +# 0x207: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2073C001" + +# 0x208: RORC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20823001" + +# 0x209: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2093C001" + +# 0x20A: RORC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20A23001" + +# 0x20B: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20B3C001" + +# 0x20C: RORC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20C23001" + +# 0x20D: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20D3C001" + +# 0x20E: RORC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20E23001" + +# 0x20F: CMP R01, 0x63 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "20F0F631" + +# 0x210: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2103A3FF" + +# 0x211: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2113D001" + +# 0x212: CMP R01, 0xC6 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2120FC61" + +# 0x213: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2133A3FF" + +# 0x214: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2143D001" + +# 0x215: CMP R01, 0x8C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2150F8C1" + +# 0x216: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2163A3FF" + +# 0x217: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2173D001" + +# 0x218: CMP R01, 0x19 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2180F191" + +# 0x219: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2193A3FF" + +# 0x21A: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21A3D001" + +# 0x21B: CMP R01, 0x33 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21B0F331" + +# 0x21C: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21C3A3FF" + +# 0x21D: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21D3D001" + +# 0x21E: CMP R01, 0x66 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21E0F661" + +# 0x21F: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "21F3A3FF" + +# 0x220: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2203D001" + +# 0x221: CMP R01, 0xCC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2210FCC1" + +# 0x222: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2223A3FF" + +# 0x223: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2233D001" + +# 0x224: CMP R01, 0x98 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2240F981" + +# 0x225: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2253A3FF" + +# 0x226: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2263D001" + +# 0x227: CMP R01, 0x31 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2270F311" + +# 0x228: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2283A3FF" + +# 0x229: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2293E000" + +# 0x22A: MOV R00, 0xA5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22A03A50" + +# 0x22B: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22B2A000" + +# 0x22C: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22C3C000" + +# 0x22D: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22D190F0" + +# 0x22E: CMP R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22E0F0A0" + +# 0x22F: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "22F3A3FF" + +# 0x230: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2303D000" + +# 0x231: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2313C000" + +# 0x232: AND R00, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "232190F0" + +# 0x233: CMP R00, 0x0A +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2330F0A0" + +# 0x234: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2343D001" + +# 0x235: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2353A3FF" + +# 0x236: SWAP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2362A001" + +# 0x237: MOV R02, 0x0F +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "237030F2" + +# 0x238: AND R01, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23818021" + +# 0x239: CMP R01, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2390F051" + +# 0x23A: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23A3A3FF" + +# 0x23B: MOV R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23B03050" + +# 0x23C: MOV R02, 0xA0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23C03A02" + +# 0x23D: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23D2A000" + +# 0x23E: OR R02, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23E1A002" + +# 0x23F: CMP R02, 0xF0 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "23F0FF02" + +# 0x240: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2403A3FF" + +# 0x241: SWAP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2412A000" + +# 0x242: OR R00, 0x50 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2421B500" + +# 0x243: CMP R00, 0x55 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2430F550" + +# 0x244: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2443A3FF" + +# 0x245: MOV R01, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24503011" + +# 0x246: MOV R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24603010" + +# 0x247: XOR R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2471D010" + +# 0x248: JNZ 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "248323FF" + +# 0x249: XOR R00, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2491C010" + +# 0x24A: CMP R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24A0F010" + +# 0x24B: JNE 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24B3A3FF" + +# 0x24C: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24C3E000" + +# 0x24D: MOV R00, 0x03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24D03030" + +# 0x24E: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24E26030" + +# 0x24F: XIN R00, (0x02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "24F28020" + +# 0x250: OR R00, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2501B010" + +# 0x251: XOUT (0x02), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25124020" + +# 0x252: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25200000" + +# 0x253: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25300000" + +# 0x254: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25400000" + +# 0x255: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25500000" + +# 0x256: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25600000" + +# 0x257: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25700000" + +# 0x258: XIN R00, (0x02) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25828020" + +# 0x259: AND R00, 0xFE +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25919FE0" + +# 0x25A: XOUT (0x02), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25A24020" + +# 0x25B: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25B00000" + +# 0x25C: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25C00000" + +# 0x25D: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25D00000" + +# 0x25E: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25E00000" + +# 0x25F: CIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "25F29030" + +# 0x260: OR R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2601B800" + +# 0x261: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26126030" + +# 0x262: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26200000" + +# 0x263: CIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26329030" + +# 0x264: OR R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2641B800" + +# 0x265: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26526030" + +# 0x266: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26600000" + +# 0x267: CIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26729030" + +# 0x268: OR R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2681B800" + +# 0x269: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26926030" + +# 0x26A: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26A00000" + +# 0x26B: CIN R00, (0x03) +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26B29030" + +# 0x26C: OR R00, 0x80 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26C1B800" + +# 0x26D: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26D26030" + +# 0x26E: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26E00000" + +# 0x26F: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "26F00000" + +# 0x270: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27000000" + +# 0x271: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27100000" + +# 0x272: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27200000" + +# 0x273: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27300000" + +# 0x274: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27400000" + +# 0x275: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27500000" + +# 0x276: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27600000" + +# 0x277: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2773E000" + +# 0x278: SUB R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27815000" + +# 0x279: JC 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "279333FF" + +# 0x27A: SETC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27A2B000" + +# 0x27B: JNC 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27B343FF" + +# 0x27C: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27C00000" + +# 0x27D: SUB R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27D15000" + +# 0x27E: JC 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27E333FF" + +# 0x27F: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "27F03000" + +# 0x280: CLRC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28015000" + +# 0x281: JC 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "281333FF" + +# 0x282: SETC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2822B000" + +# 0x283: JNC 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "283343FF" + +# 0x284: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28400000" + +# 0x285: CLRC +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28515000" + +# 0x286: JC 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "286333FF" + +# 0x287: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2873E000" + +# 0x288: INC R14 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2881101E" + +# 0x289: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2893F000" + +# 0x28A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28A00000" + +# 0x28B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28B00000" + +# 0x28C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28C00000" + +# 0x28D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28D00000" + +# 0x28E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28E00000" + +# 0x28F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "28F00000" + +# 0x290: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29000000" + +# 0x291: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29100000" + +# 0x292: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29200000" + +# 0x293: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29300000" + +# 0x294: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29400000" + +# 0x295: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29500000" + +# 0x296: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29600000" + +# 0x297: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29700000" + +# 0x298: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29800000" + +# 0x299: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29900000" + +# 0x29A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29A00000" + +# 0x29B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29B00000" + +# 0x29C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29C00000" + +# 0x29D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29D00000" + +# 0x29E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29E00000" + +# 0x29F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "29F00000" + +# 0x2A0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A000000" + +# 0x2A1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A100000" + +# 0x2A2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A200000" + +# 0x2A3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A300000" + +# 0x2A4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A400000" + +# 0x2A5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A500000" + +# 0x2A6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A600000" + +# 0x2A7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A700000" + +# 0x2A8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A800000" + +# 0x2A9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2A900000" + +# 0x2AA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AA00000" + +# 0x2AB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AB00000" + +# 0x2AC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AC00000" + +# 0x2AD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AD00000" + +# 0x2AE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AE00000" + +# 0x2AF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2AF00000" + +# 0x2B0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B000000" + +# 0x2B1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B100000" + +# 0x2B2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B200000" + +# 0x2B3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B300000" + +# 0x2B4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B400000" + +# 0x2B5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B500000" + +# 0x2B6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B600000" + +# 0x2B7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B700000" + +# 0x2B8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B800000" + +# 0x2B9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2B900000" + +# 0x2BA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BA00000" + +# 0x2BB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BB00000" + +# 0x2BC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BC00000" + +# 0x2BD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BD00000" + +# 0x2BE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BE00000" + +# 0x2BF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2BF00000" + +# 0x2C0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C000000" + +# 0x2C1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C100000" + +# 0x2C2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C200000" + +# 0x2C3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C300000" + +# 0x2C4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C400000" + +# 0x2C5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C500000" + +# 0x2C6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C600000" + +# 0x2C7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C700000" + +# 0x2C8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C800000" + +# 0x2C9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2C900000" + +# 0x2CA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CA00000" + +# 0x2CB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CB00000" + +# 0x2CC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CC00000" + +# 0x2CD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CD00000" + +# 0x2CE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CE00000" + +# 0x2CF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2CF00000" + +# 0x2D0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D000000" + +# 0x2D1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D100000" + +# 0x2D2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D200000" + +# 0x2D3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D300000" + +# 0x2D4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D400000" + +# 0x2D5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D500000" + +# 0x2D6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D600000" + +# 0x2D7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D700000" + +# 0x2D8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D800000" + +# 0x2D9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2D900000" + +# 0x2DA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DA00000" + +# 0x2DB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DB00000" + +# 0x2DC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DC00000" + +# 0x2DD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DD00000" + +# 0x2DE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DE00000" + +# 0x2DF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2DF00000" + +# 0x2E0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E000000" + +# 0x2E1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E100000" + +# 0x2E2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E200000" + +# 0x2E3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E300000" + +# 0x2E4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E400000" + +# 0x2E5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E500000" + +# 0x2E6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E600000" + +# 0x2E7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E700000" + +# 0x2E8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E800000" + +# 0x2E9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2E900000" + +# 0x2EA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EA00000" + +# 0x2EB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EB00000" + +# 0x2EC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EC00000" + +# 0x2ED: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2ED00000" + +# 0x2EE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EE00000" + +# 0x2EF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2EF00000" + +# 0x2F0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F000000" + +# 0x2F1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F100000" + +# 0x2F2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F200000" + +# 0x2F3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F300000" + +# 0x2F4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F400000" + +# 0x2F5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F500000" + +# 0x2F6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F600000" + +# 0x2F7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F700000" + +# 0x2F8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F800000" + +# 0x2F9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2F900000" + +# 0x2FA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FA00000" + +# 0x2FB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FB00000" + +# 0x2FC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FC00000" + +# 0x2FD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FD00000" + +# 0x2FE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FE00000" + +# 0x2FF: JMP 0x2FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "2FF302FF" + +# 0x300: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30000000" + +# 0x301: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30100000" + +# 0x302: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30200000" + +# 0x303: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30300000" + +# 0x304: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30400000" + +# 0x305: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30500000" + +# 0x306: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30600000" + +# 0x307: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30700000" + +# 0x308: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30800000" + +# 0x309: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30900000" + +# 0x30A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30A00000" + +# 0x30B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30B00000" + +# 0x30C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30C00000" + +# 0x30D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30D00000" + +# 0x30E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30E00000" + +# 0x30F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "30F00000" + +# 0x310: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31000000" + +# 0x311: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31100000" + +# 0x312: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31200000" + +# 0x313: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31300000" + +# 0x314: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31400000" + +# 0x315: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31500000" + +# 0x316: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31600000" + +# 0x317: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31700000" + +# 0x318: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31800000" + +# 0x319: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31900000" + +# 0x31A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31A00000" + +# 0x31B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31B00000" + +# 0x31C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31C00000" + +# 0x31D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31D00000" + +# 0x31E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31E00000" + +# 0x31F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "31F00000" + +# 0x320: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32000000" + +# 0x321: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32100000" + +# 0x322: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32200000" + +# 0x323: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32300000" + +# 0x324: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32400000" + +# 0x325: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32500000" + +# 0x326: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32600000" + +# 0x327: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32700000" + +# 0x328: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32800000" + +# 0x329: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32900000" + +# 0x32A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32A00000" + +# 0x32B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32B00000" + +# 0x32C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32C00000" + +# 0x32D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32D00000" + +# 0x32E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32E00000" + +# 0x32F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "32F00000" + +# 0x330: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33000000" + +# 0x331: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33100000" + +# 0x332: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33200000" + +# 0x333: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33300000" + +# 0x334: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33400000" + +# 0x335: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33500000" + +# 0x336: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33600000" + +# 0x337: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33700000" + +# 0x338: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33800000" + +# 0x339: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33900000" + +# 0x33A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33A00000" + +# 0x33B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33B00000" + +# 0x33C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33C00000" + +# 0x33D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33D00000" + +# 0x33E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33E00000" + +# 0x33F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "33F00000" + +# 0x340: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34000000" + +# 0x341: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34100000" + +# 0x342: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34200000" + +# 0x343: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34300000" + +# 0x344: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34400000" + +# 0x345: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34500000" + +# 0x346: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34600000" + +# 0x347: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34700000" + +# 0x348: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34800000" + +# 0x349: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34900000" + +# 0x34A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34A00000" + +# 0x34B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34B00000" + +# 0x34C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34C00000" + +# 0x34D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34D00000" + +# 0x34E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34E00000" + +# 0x34F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "34F00000" + +# 0x350: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35000000" + +# 0x351: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35100000" + +# 0x352: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35200000" + +# 0x353: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35300000" + +# 0x354: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35400000" + +# 0x355: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35500000" + +# 0x356: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35600000" + +# 0x357: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35700000" + +# 0x358: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35800000" + +# 0x359: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35900000" + +# 0x35A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35A00000" + +# 0x35B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35B00000" + +# 0x35C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35C00000" + +# 0x35D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35D00000" + +# 0x35E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35E00000" + +# 0x35F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "35F00000" + +# 0x360: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36000000" + +# 0x361: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36100000" + +# 0x362: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36200000" + +# 0x363: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36300000" + +# 0x364: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36400000" + +# 0x365: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36500000" + +# 0x366: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36600000" + +# 0x367: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36700000" + +# 0x368: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36800000" + +# 0x369: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36900000" + +# 0x36A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36A00000" + +# 0x36B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36B00000" + +# 0x36C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36C00000" + +# 0x36D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36D00000" + +# 0x36E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36E00000" + +# 0x36F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "36F00000" + +# 0x370: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37000000" + +# 0x371: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37100000" + +# 0x372: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37200000" + +# 0x373: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37300000" + +# 0x374: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37400000" + +# 0x375: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37500000" + +# 0x376: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37600000" + +# 0x377: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37700000" + +# 0x378: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37800000" + +# 0x379: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37900000" + +# 0x37A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37A00000" + +# 0x37B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37B00000" + +# 0x37C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37C00000" + +# 0x37D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37D00000" + +# 0x37E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37E00000" + +# 0x37F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "37F00000" + +# 0x380: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38000000" + +# 0x381: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38100000" + +# 0x382: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38200000" + +# 0x383: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38300000" + +# 0x384: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38400000" + +# 0x385: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38500000" + +# 0x386: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38600000" + +# 0x387: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38700000" + +# 0x388: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38800000" + +# 0x389: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38900000" + +# 0x38A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38A00000" + +# 0x38B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38B00000" + +# 0x38C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38C00000" + +# 0x38D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38D00000" + +# 0x38E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38E00000" + +# 0x38F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "38F00000" + +# 0x390: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39000000" + +# 0x391: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39100000" + +# 0x392: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39200000" + +# 0x393: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39300000" + +# 0x394: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39400000" + +# 0x395: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39500000" + +# 0x396: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39600000" + +# 0x397: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39700000" + +# 0x398: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39800000" + +# 0x399: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39900000" + +# 0x39A: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39A00000" + +# 0x39B: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39B00000" + +# 0x39C: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39C00000" + +# 0x39D: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39D00000" + +# 0x39E: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39E00000" + +# 0x39F: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "39F00000" + +# 0x3A0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A000000" + +# 0x3A1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A100000" + +# 0x3A2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A200000" + +# 0x3A3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A300000" + +# 0x3A4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A400000" + +# 0x3A5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A500000" + +# 0x3A6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A600000" + +# 0x3A7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A700000" + +# 0x3A8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A800000" + +# 0x3A9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3A900000" + +# 0x3AA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AA00000" + +# 0x3AB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AB00000" + +# 0x3AC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AC00000" + +# 0x3AD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AD00000" + +# 0x3AE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AE00000" + +# 0x3AF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3AF00000" + +# 0x3B0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B000000" + +# 0x3B1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B100000" + +# 0x3B2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B200000" + +# 0x3B3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B300000" + +# 0x3B4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B400000" + +# 0x3B5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B500000" + +# 0x3B6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B600000" + +# 0x3B7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B700000" + +# 0x3B8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B800000" + +# 0x3B9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3B900000" + +# 0x3BA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BA00000" + +# 0x3BB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BB00000" + +# 0x3BC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BC00000" + +# 0x3BD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BD00000" + +# 0x3BE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BE00000" + +# 0x3BF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3BF00000" + +# 0x3C0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C000000" + +# 0x3C1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C100000" + +# 0x3C2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C200000" + +# 0x3C3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C300000" + +# 0x3C4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C400000" + +# 0x3C5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C500000" + +# 0x3C6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C600000" + +# 0x3C7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C700000" + +# 0x3C8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C800000" + +# 0x3C9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3C900000" + +# 0x3CA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CA00000" + +# 0x3CB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CB00000" + +# 0x3CC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CC00000" + +# 0x3CD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CD00000" + +# 0x3CE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CE00000" + +# 0x3CF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3CF00000" + +# 0x3D0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D000000" + +# 0x3D1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D100000" + +# 0x3D2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D200000" + +# 0x3D3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D300000" + +# 0x3D4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D400000" + +# 0x3D5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D500000" + +# 0x3D6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D600000" + +# 0x3D7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D700000" + +# 0x3D8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D800000" + +# 0x3D9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3D900000" + +# 0x3DA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DA00000" + +# 0x3DB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DB00000" + +# 0x3DC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DC00000" + +# 0x3DD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DD00000" + +# 0x3DE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DE00000" + +# 0x3DF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3DF00000" + +# 0x3E0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E000000" + +# 0x3E1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E100000" + +# 0x3E2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E200000" + +# 0x3E3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E300000" + +# 0x3E4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E400000" + +# 0x3E5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E500000" + +# 0x3E6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E600000" + +# 0x3E7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E700000" + +# 0x3E8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E800000" + +# 0x3E9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3E900000" + +# 0x3EA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EA00000" + +# 0x3EB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EB00000" + +# 0x3EC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EC00000" + +# 0x3ED: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3ED00000" + +# 0x3EE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EE00000" + +# 0x3EF: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3EF00000" + +# 0x3F0: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F000000" + +# 0x3F1: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F100000" + +# 0x3F2: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F200000" + +# 0x3F3: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F300000" + +# 0x3F4: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F400000" + +# 0x3F5: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F500000" + +# 0x3F6: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F600000" + +# 0x3F7: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F700000" + +# 0x3F8: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F800000" + +# 0x3F9: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3F900000" + +# 0x3FA: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FA00000" + +# 0x3FB: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FB00000" + +# 0x3FC: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FC00000" + +# 0x3FD: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FD00000" + +# 0x3FE: +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FE00000" + +# 0x3FF: JMP 0x3FF +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "3FF303FF" + +# Assembled from itest.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0048" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0161" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "026C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "036C" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "046F" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "0F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "1F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "2F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "3F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "4F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "5F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "6F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "7F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "8F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9A00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9B00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9C00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9D00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9E00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "9F00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "A900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "AA00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "AB00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "AC00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "AD00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "AE00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "AF00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "B900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "BA00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "BB00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "BC00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "BD00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "BE00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "BF00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "C900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "CA00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "CB00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "CC00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "CD00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "CE00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "CF00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "D900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "DA00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "DB00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "DC00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "DD00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "DE00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "DF00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "E900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "EA00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "EB00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "EC00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "ED00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "EE00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "EF00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F500" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F600" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F700" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F800" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "F900" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "FA00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "FB00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "FC00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "FD00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "FE00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "FF00" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "10000" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "10100" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "10200" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "10300" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "10400" +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 16 "10500" + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/lib/CPUs/JCpu/asm/make b/lib/CPUs/JCpu/asm/make new file mode 100644 index 0000000..e7f598f --- /dev/null +++ b/lib/CPUs/JCpu/asm/make @@ -0,0 +1,50 @@ +#!/bin/sh + +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: rom-file generation for cpu_core +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +TARGET=$2 +DSTDIR=$1 + +JASM_HOME=/cygdrive/w/vhdl/lib/CPUs/JCpu/tools + +$JASM_HOME/jasm.rb $TARGET.jsm + +irom_tcl_snippet="$TARGET.irom.tcl.snip" +irom_vhdl_snippet="$TARGET.irom.vhdl.snip" +irom_ld_vhdl_snippet="$TARGET.irom_ld.vhdl.snip" +xrom_tcl_snippet="$TARGET.xrom.tcl.snip" +xrom_vhdl_snippet="$TARGET.xrom.vhdl.snip" +xrom_ld_vhdl_snippet="$TARGET.xrom_ld.vhdl.snip" + +$JASM_HOME/insrom.rb $irom_vhdl_snippet $JASM_HOME/irom.vhd.tpl >$DSTDIR/$TARGET\_irom.vhdl +$JASM_HOME/insrom.rb $irom_ld_vhdl_snippet $JASM_HOME/irom_ld.vhd.tpl >$DSTDIR/$TARGET\_irom_ld.vhdl + +$JASM_HOME/insrom.rb $xrom_vhdl_snippet $JASM_HOME/xrom.vhd.tpl >$DSTDIR/$TARGET\_xrom.vhdl +$JASM_HOME/insrom.rb $xrom_ld_vhdl_snippet $JASM_HOME/xrom_ld.vhd.tpl >$DSTDIR/$TARGET\_xrom_ld.vhdl + +cat $irom_tcl_snippet > $TARGET.tcl.snip.snip +cat $xrom_tcl_snippet >> $TARGET.tcl.snip.snip +$JASM_HOME/insrom.rb $TARGET.tcl.snip.snip $JASM_HOME/rom.tcl.tpl >$TARGET.tcl + +rm -f *.snip diff --git a/lib/CPUs/JCpu/asm/mul8x8.jsm b/lib/CPUs/JCpu/asm/mul8x8.jsm new file mode 100644 index 0000000..c9b6c3b --- /dev/null +++ b/lib/CPUs/JCpu/asm/mul8x8.jsm @@ -0,0 +1,29 @@ +; ------------------------------------------------- +; Constants +; ------------------------------------------------- + +; Chip register +include "../../../jasm/cregs.inc.jsm" + +; ------------------------------------------------- +; Program +; ------------------------------------------------- + code + org 0x000 +reset: jmp init + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +init: mov R0, 0x45 + mov R1, 0xF5 + + call mul8x8 +stop: jmp stop + + +; ------------------------------------------------- +include "../../../jasm/mul8x8.inc.jsm" + + + \ No newline at end of file diff --git a/lib/CPUs/JCpu/asm/mul8x8.tcl b/lib/CPUs/JCpu/asm/mul8x8.tcl new file mode 100644 index 0000000..6bec87e --- /dev/null +++ b/lib/CPUs/JCpu/asm/mul8x8.tcl @@ -0,0 +1,154 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from mul8x8.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x001 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00030001" + +# 0x001: MOV R00, 0x45 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00103450" + +# 0x002: MOV R01, 0xF5 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00203F51" + +# 0x003: CALL 0x005 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0033B005" + +# 0x004: JMP 0x004 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00430004" + +# 0x005: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0053C002" + +# 0x006: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0063C003" + +# 0x007: PUSH R04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0073C004" + +# 0x008: MOV R04, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00802014" + +# 0x009: MOV R01, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00903001" + +# 0x00A: MOV R02, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A03002" + +# 0x00B: MOV R03, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B03003" + +# 0x00C: CMP R04, 0x01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C0F014" + +# 0x00D: JEQ 0x015 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D39015" + +# 0x00E: SHR R04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E1F004" + +# 0x00F: JNC 0x012 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F34012" + +# 0x010: ADD R02, R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01010002" + +# 0x011: ADDC R03, R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01112013" + +# 0x012: SHL R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0121E000" + +# 0x013: ROLC R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01322001" + +# 0x014: JMP 0x00C +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0143000C" + +# 0x015: ADD R00, R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01510020" + +# 0x016: ADDC R01, R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01612031" + +# 0x017: POP R04 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0173D004" + +# 0x018: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0183D003" + +# 0x019: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0193D002" + +# 0x01A: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A3E000" + +# Assembled from mul8x8.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/lib/CPUs/JCpu/asm/reti_issue.jsm b/lib/CPUs/JCpu/asm/reti_issue.jsm new file mode 100644 index 0000000..78edc49 --- /dev/null +++ b/lib/CPUs/JCpu/asm/reti_issue.jsm @@ -0,0 +1,50 @@ +; ------------------------------------------------- +; Constants +; ------------------------------------------------- + +; Chip register +cpu_revision: equ 0x00 ; RO +cpu_control: equ 0x01 ; R/W +cpu_status: equ 0x02 ; RO +cpu_int_ctrl: equ 0x03 ; R/W + +; ------------------------------------------------- +; Program +; ------------------------------------------------- + code +reset: jmp init + + org 0x001 +; nop + reti + +; ------------------------------------------------- +; Main +; ------------------------------------------------- +init: mov R0, 0x05 + cout (cpu_int_ctrl), R0 + mov R0, 0x00 +loop: nop + inc R0 + nop + call subr + nop + push R3 + nop + push R2 + nop + push R1 + nop + push R0 + nop + pop R0 + nop + pop R1 + nop + pop R2 + nop + pop R3 + nop + jmp loop + +subr: ret diff --git a/lib/CPUs/JCpu/asm/reti_issue.tcl b/lib/CPUs/JCpu/asm/reti_issue.tcl new file mode 100644 index 0000000..5da9c56 --- /dev/null +++ b/lib/CPUs/JCpu/asm/reti_issue.tcl @@ -0,0 +1,157 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE +# Assembled from reti_issue.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000010) into the Instruction Register of FPGA +# User 1 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C2"] + +# 0x000: JMP 0x002 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00030002" + +# 0x001: RETI +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0013F000" + +# 0x002: MOV R00, 0x05 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00203050" + +# 0x003: COUT (0x03), R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00326030" + +# 0x004: MOV R00, 0x00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00403000" + +# 0x005: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00500000" + +# 0x006: INC R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00611010" + +# 0x007: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00700000" + +# 0x008: CALL 0x01B +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0083B01B" + +# 0x009: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00900000" + +# 0x00A: PUSH R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00A3C003" + +# 0x00B: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00B00000" + +# 0x00C: PUSH R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00C3C002" + +# 0x00D: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00D00000" + +# 0x00E: PUSH R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00E3C001" + +# 0x00F: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "00F00000" + +# 0x010: PUSH R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0103C000" + +# 0x011: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01100000" + +# 0x012: POP R00 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0123D000" + +# 0x013: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01300000" + +# 0x014: POP R01 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0143D001" + +# 0x015: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01500000" + +# 0x016: POP R02 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0163D002" + +# 0x017: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01700000" + +# 0x018: POP R03 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "0183D003" + +# 0x019: NOP +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01900000" + +# 0x01A: JMP 0x005 +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01A30005" + +# 0x01B: RET +::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 32 "01B3E000" + +# Assembled from reti_issue.jsm +# --------------------------------------------------------------- +# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA +# User 2 +set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength "3C3"] + + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/lib/CPUs/JCpu/doc/block_diagram.png b/lib/CPUs/JCpu/doc/block_diagram.png new file mode 100644 index 0000000..14bbb54 Binary files /dev/null and b/lib/CPUs/JCpu/doc/block_diagram.png differ diff --git a/lib/CPUs/JCpu/doc/memory_map.png b/lib/CPUs/JCpu/doc/memory_map.png new file mode 100644 index 0000000..30a22a0 Binary files /dev/null and b/lib/CPUs/JCpu/doc/memory_map.png differ diff --git a/lib/CPUs/JCpu/gpl-3.0.txt b/lib/CPUs/JCpu/gpl-3.0.txt new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/lib/CPUs/JCpu/gpl-3.0.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/lib/CPUs/JCpu/sim/tb_cpu.fdo b/lib/CPUs/JCpu/sim/tb_cpu.fdo new file mode 100644 index 0000000..36b8dc0 --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_cpu.fdo @@ -0,0 +1,22 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../../../PCK_FIO-1.16/PCK_FIO.vhd" +vcom -explicit -93 "../src/core/cpu_pkg.vhd" +vcom -explicit -93 "../src/core/stack_ctrl.vhd" +vcom -explicit -93 "../src/core/reg_dual.vhd" +vcom -explicit -93 "../src/core/chipram.vhd" +vcom -explicit -93 "../src/core/chipreg.vhd" +vcom -explicit -93 "../src/core/pc.vhd" +vcom -explicit -93 "../src/core/dpath_ctrl.vhd" +vcom -explicit -93 "../src/core/int_ctrl.vhd" +vcom -explicit -93 "../src/core/alu.vhd" +vcom -explicit -93 "../src/core/cpu.vhd" +vcom -explicit -93 "../src/test_irom.vhdl" +vcom -explicit -93 "../src/core/tb_cpu.vhd" +vsim -t 1ps -lib work tb_cpu +do {tb_cpu.wdo} +view wave +view structure +view signals +run 50us diff --git a/lib/CPUs/JCpu/sim/tb_cpu.wdo b/lib/CPUs/JCpu/sim/tb_cpu.wdo new file mode 100644 index 0000000..2ef036e --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_cpu.wdo @@ -0,0 +1,107 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_cpu/rst +add wave -noupdate -format Logic /tb_cpu/clk +add wave -noupdate -format Logic /tb_cpu/ce +add wave -noupdate -format Logic /tb_cpu/uut/cpu_active +add wave -noupdate -format Logic /tb_cpu/int_in +add wave -noupdate -format Logic /tb_cpu/int_ack +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/irom_data +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/irom_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/xmem_din +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/xmem_dout +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/xmem_addr +add wave -noupdate -format Logic /tb_cpu/xmem_we +add wave -noupdate -format Logic /tb_cpu/xmem_re +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/sram +add wave -noupdate -format Logic /tb_cpu/uut/io_sel +add wave -noupdate -format Literal /tb_cpu/uut/iphase +add wave -noupdate -divider CPU +add wave -noupdate -format Literal /tb_cpu/reg +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Literal /tb_cpu/uut/cpu_status +add wave -noupdate -format Literal /tb_cpu/uut/status_reg +add wave -noupdate -format Literal /tb_cpu/uut/ctrl +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/stk_out +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/stk_in +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/stk_reg +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/pc_in +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/pc_next +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/idata +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/int_pc_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/iphase +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/const_data +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/reg_a_dout +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/reg_b_dout +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/reg_din +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/alu_op1 +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/alu_op2 +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/alu_result +add wave -noupdate -format Literal /tb_cpu/uut/alu_status +add wave -noupdate -format Logic /tb_cpu/uut/pc_inc +add wave -noupdate -format Logic /tb_cpu/uut/pc_load +add wave -noupdate -format Logic /tb_cpu/uut/stk_we +add wave -noupdate -format Logic /tb_cpu/uut/cmem_we +add wave -noupdate -format Literal /tb_cpu/uut/ctrl_iphase +add wave -noupdate -format Logic /tb_cpu/uut/was_pcld +add wave -noupdate -format Logic /tb_cpu/uut/was_pop2pc +add wave -noupdate -format Logic /tb_cpu/uut/int_pc_load +add wave -noupdate -format Logic /tb_cpu/uut/int_stk_push +add wave -noupdate -format Logic /tb_cpu/uut/stk_push +add wave -noupdate -format Logic /tb_cpu/uut/stk_pop +add wave -noupdate -format Logic /tb_cpu/uut/status_save +add wave -noupdate -format Logic /tb_cpu/uut/status_restore +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/stk_ptr +add wave -noupdate -divider Stack +add wave -noupdate -format Logic /tb_cpu/clk +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/push +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/pop +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_stack_ctrl/din +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_stack_ctrl/dout +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/mem_we +add wave -noupdate -divider Chipram +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/we_a +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/din_a +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/addr_a +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/dout_a +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/we_b +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/din_b +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/addr_b +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/dout_b +add wave -noupdate -divider Sequencer +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_dpath_ctrl/inst_in +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/iphase_in +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/status_in +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/ctrl_out +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_dpath_ctrl/idout +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_dpath_ctrl/ddout +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/opcode +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/ctrl_lines +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_cpu/uut/inst_reg_ab/mem +add wave -noupdate -divider {Chip register} +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/creg_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/creg_din +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/creg_dout +add wave -noupdate -format Literal /tb_cpu/uut/creg_ctrl_out +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Logic /tb_cpu/clk +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_exit +add wave -noupdate -format Literal /tb_cpu/uut/inst_int_ctrl/int_state +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {136355 ps} 0} +configure wave -namecolwidth 166 +configure wave -valuecolwidth 101 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +update +WaveRestoreZoom {93532 ps} {206468 ps} diff --git a/lib/CPUs/JCpu/sim/tb_cpu_embedded.fdo b/lib/CPUs/JCpu/sim/tb_cpu_embedded.fdo new file mode 100644 index 0000000..dd965ec --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_cpu_embedded.fdo @@ -0,0 +1,21 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../src/core/cpu_pkg.vhd" +vcom -explicit -93 "../src/core/stack_ctrl.vhd" +vcom -explicit -93 "../src/core/reg_dual.vhd" +vcom -explicit -93 "../src/core/chipram.vhd" +vcom -explicit -93 "../src/core/pc.vhd" +vcom -explicit -93 "../src/core/dpath_ctrl.vhd" +vcom -explicit -93 "../src/core/int_ctrl.vhd" +vcom -explicit -93 "../src/core/alu.vhd" +vcom -explicit -93 "../src/core/cpu.vhd" +vcom -explicit -93 "../src/cpu_embedded.vhd" +vcom -explicit -93 "../src/tb_cpu_embedded.vhd" +vcom -explicit -93 "../src/test_irom.vhdl" +vsim -t 1ps -lib work tb_cpu_embedded +do {tb_cpu_embedded.wdo} +view wave +view structure +view signals +run 10us diff --git a/lib/CPUs/JCpu/sim/tb_cpu_embedded.wdo b/lib/CPUs/JCpu/sim/tb_cpu_embedded.wdo new file mode 100644 index 0000000..caec2d7 --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_cpu_embedded.wdo @@ -0,0 +1,26 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_cpu_embedded/rst +add wave -noupdate -format Logic /tb_cpu_embedded/clk +add wave -noupdate -format Logic /tb_cpu_embedded/ce +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu_embedded/sram +add wave -noupdate -format Logic /tb_cpu_embedded/int_in +add wave -noupdate -format Logic /tb_cpu_embedded/int_ack +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu_embedded/uut/rom_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu_embedded/uut/rom_data +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {2168142 ps} 0} +configure wave -namecolwidth 143 +configure wave -valuecolwidth 101 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +update +WaveRestoreZoom {0 ps} {10500 ns} diff --git a/lib/CPUs/JCpu/sim/tb_cpu_itest.fdo b/lib/CPUs/JCpu/sim/tb_cpu_itest.fdo new file mode 100644 index 0000000..77ca67d --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_cpu_itest.fdo @@ -0,0 +1,22 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../../../PCK_FIO-1.16/PCK_FIO.vhd" +vcom -explicit -93 "../src/core/cpu_pkg.vhd" +vcom -explicit -93 "../src/core/stack_ctrl.vhd" +vcom -explicit -93 "../src/core/reg_dual.vhd" +vcom -explicit -93 "../src/core/chipram.vhd" +vcom -explicit -93 "../src/core/chipreg.vhd" +vcom -explicit -93 "../src/core/pc.vhd" +vcom -explicit -93 "../src/core/dpath_ctrl.vhd" +vcom -explicit -93 "../src/core/int_ctrl.vhd" +vcom -explicit -93 "../src/core/alu.vhd" +vcom -explicit -93 "../src/core/cpu.vhd" +vcom -explicit -93 "../src/itest_irom.vhdl" +vcom -explicit -93 "../src/tb_cpu_itest.vhd" +vsim -t 1ps -lib work tb_cpu +do {tb_cpu_itest.wdo} +view wave +view structure +view signals +run 400us diff --git a/lib/CPUs/JCpu/sim/tb_cpu_itest.wdo b/lib/CPUs/JCpu/sim/tb_cpu_itest.wdo new file mode 100644 index 0000000..747f9d3 --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_cpu_itest.wdo @@ -0,0 +1,123 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_cpu/rst +add wave -noupdate -format Logic /tb_cpu/clk +add wave -noupdate -format Logic /tb_cpu/ce +add wave -noupdate -format Logic /tb_cpu/int_in +add wave -noupdate -format Logic /tb_cpu/int_ack +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/irom_data +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/irom_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/xmem_din +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/xmem_dout +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/xmem_addr +add wave -noupdate -format Logic /tb_cpu/xmem_we +add wave -noupdate -format Logic /tb_cpu/xmem_re +add wave -noupdate -format Logic /tb_cpu/xmem_wait +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/sram +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_cpu/reg +add wave -noupdate -format Logic /tb_cpu/uut/io_sel +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/mem_data +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/mem_addr +add wave -noupdate -divider CPU +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Literal /tb_cpu/uut/cpu_status +add wave -noupdate -format Literal /tb_cpu/uut/status_reg +add wave -noupdate -format Literal /tb_cpu/uut/ctrl +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/stk_out +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/stk_in +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/stk_reg +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/pc_in +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/pc_next +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/idata +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/int_pc_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/iphase +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/const_data +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/reg_a_dout +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/reg_b_dout +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/reg_din +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/alu_op1 +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/alu_op2 +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/alu_result +add wave -noupdate -format Literal /tb_cpu/uut/alu_status +add wave -noupdate -format Logic /tb_cpu/uut/pc_inc +add wave -noupdate -format Logic /tb_cpu/uut/pc_load +add wave -noupdate -format Logic /tb_cpu/uut/cpu_active +add wave -noupdate -format Logic /tb_cpu/uut/stk_we +add wave -noupdate -format Logic /tb_cpu/uut/cmem_we +add wave -noupdate -format Literal /tb_cpu/uut/ctrl_iphase +add wave -noupdate -format Logic /tb_cpu/uut/was_pcld +add wave -noupdate -format Logic /tb_cpu/uut/was_pop2pc +add wave -noupdate -format Logic /tb_cpu/uut/int_pc_load +add wave -noupdate -format Logic /tb_cpu/uut/int_stk_push +add wave -noupdate -format Logic /tb_cpu/uut/stk_push +add wave -noupdate -format Logic /tb_cpu/uut/stk_pop +add wave -noupdate -format Logic /tb_cpu/uut/status_save +add wave -noupdate -format Logic /tb_cpu/uut/status_restore +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/stk_ptr +add wave -noupdate -divider Stack +add wave -noupdate -format Logic /tb_cpu/clk +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/push +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/pop +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_stack_ctrl/din +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_stack_ctrl/dout +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/mem_we +add wave -noupdate -divider Chipram +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/we_a +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/din_a +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/addr_a +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/dout_a +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/we_b +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/din_b +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/addr_b +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/dout_b +add wave -noupdate -divider Sequencer +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/reg +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_dpath_ctrl/inst_in +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/iphase_in +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/status_in +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/ctrl_out +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_dpath_ctrl/idout +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_dpath_ctrl/ddout +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/opcode +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/ctrl_lines +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_cpu/uut/inst_reg_ab/mem +add wave -noupdate -divider {Chip register} +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/creg_dout +add wave -noupdate -format Literal /tb_cpu/uut/creg_ctrl_out +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Logic /tb_cpu/clk +add wave -noupdate -divider {Interrup Ctrl.} +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_in +add wave -noupdate -format Literal -expand /tb_cpu/uut/inst_int_ctrl/ctrl_in +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_sampled +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_request +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_ack +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_exit +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_ack_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stat_save_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stat_rest_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/pc_load_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stk_push_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stk_pop_out +add wave -noupdate -format Literal /tb_cpu/uut/inst_int_ctrl/int_state +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/pc_load +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stk_push +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stk_pop +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {53866171 ps} 0} +configure wave -namecolwidth 166 +configure wave -valuecolwidth 101 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +update +WaveRestoreZoom {0 ps} {420 us} diff --git a/lib/CPUs/JCpu/sim/tb_cpu_reti_issue.fdo b/lib/CPUs/JCpu/sim/tb_cpu_reti_issue.fdo new file mode 100644 index 0000000..f83b9b4 --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_cpu_reti_issue.fdo @@ -0,0 +1,22 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../../../PCK_FIO-1.16/PCK_FIO.vhd" +vcom -explicit -93 "../src/core/cpu_pkg.vhd" +vcom -explicit -93 "../src/core/stack_ctrl.vhd" +vcom -explicit -93 "../src/core/reg_dual.vhd" +vcom -explicit -93 "../src/core/chipram.vhd" +vcom -explicit -93 "../src/core/chipreg.vhd" +vcom -explicit -93 "../src/core/pc.vhd" +vcom -explicit -93 "../src/core/dpath_ctrl.vhd" +vcom -explicit -93 "../src/core/int_ctrl.vhd" +vcom -explicit -93 "../src/core/alu.vhd" +vcom -explicit -93 "../src/core/cpu.vhd" +vcom -explicit -93 "../src/irom_reti_issue.vhdl" +vcom -explicit -93 "../src/core/tb_cpu.vhd" +vsim -t 1ps -lib work tb_cpu +do {tb_cpu_reti_issue.wdo} +view wave +view structure +view signals +run 50us diff --git a/lib/CPUs/JCpu/sim/tb_cpu_reti_issue.wdo b/lib/CPUs/JCpu/sim/tb_cpu_reti_issue.wdo new file mode 100644 index 0000000..1e67acb --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_cpu_reti_issue.wdo @@ -0,0 +1,82 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Literal /tb_cpu/uut/iphase +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/ctrl_lines +add wave -noupdate -divider {Chip RAM} +add wave -noupdate -format Literal /tb_cpu/uut/iphase +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/clka +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/clkb +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/en_a +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/en_b +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/we_a +add wave -noupdate -format Logic /tb_cpu/uut/inst_chipram/we_b +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/addr_a +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/addr_b +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/din_a +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/din_b +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/dout_a +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_chipram/dout_b +add wave -noupdate -divider {Interrupt controller} +add wave -noupdate -format Literal /tb_cpu/uut/iphase +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/rst +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/clk +add wave -noupdate -format Literal /tb_cpu/uut/inst_int_ctrl/ctrl_in +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_in +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_reg +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_request +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_request_clr +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_exit +add wave -noupdate -format Literal /tb_cpu/uut/inst_int_ctrl/iphase_in +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_int_ctrl/pc_addr_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/int_ack +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stat_save_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stat_rest_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/pc_load_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stk_push_out +add wave -noupdate -format Literal /tb_cpu/uut/inst_int_ctrl/int_state +add wave -noupdate -format Literal /tb_cpu/uut/inst_int_ctrl/int_state_next +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/pc_load +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stk_push +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stk_pop +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stk_pop_out +add wave -noupdate -format Logic /tb_cpu/uut/inst_int_ctrl/stk_push_out +add wave -noupdate -divider PC +add wave -noupdate -format Literal /tb_cpu/uut/iphase +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Logic /tb_cpu/uut/inst_pc/rst +add wave -noupdate -format Logic /tb_cpu/uut/inst_pc/clk +add wave -noupdate -format Logic /tb_cpu/uut/inst_pc/inc +add wave -noupdate -format Logic /tb_cpu/uut/inst_pc/load +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_pc/pc_in +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_pc/pc_out +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_pc/pc_next +add wave -noupdate -divider {Stack controller} +add wave -noupdate -format Literal /tb_cpu/uut/iphase +add wave -noupdate -format Literal /tb_cpu/uut/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/rst +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/clk +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/push +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/pop +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_stack_ctrl/ptr_out +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_stack_ctrl/din +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_stack_ctrl/dout +add wave -noupdate -format Logic /tb_cpu/uut/inst_stack_ctrl/mem_we +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu/uut/inst_stack_ctrl/ptr +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {8115990 ps} 0} +configure wave -namecolwidth 150 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +update +WaveRestoreZoom {8048536 ps} {8340629 ps} diff --git a/lib/CPUs/JCpu/sim/tb_mul8x8.fdo b/lib/CPUs/JCpu/sim/tb_mul8x8.fdo new file mode 100644 index 0000000..f727dff --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_mul8x8.fdo @@ -0,0 +1,21 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../src/core/cpu_pkg.vhd" +vcom -explicit -93 "../src/core/stack_ctrl.vhd" +vcom -explicit -93 "../src/core/reg_dual.vhd" +vcom -explicit -93 "../src/core/chipram.vhd" +vcom -explicit -93 "../src/core/pc.vhd" +vcom -explicit -93 "../src/core/dpath_ctrl.vhd" +vcom -explicit -93 "../src/core/int_ctrl.vhd" +vcom -explicit -93 "../src/core/alu.vhd" +vcom -explicit -93 "../src/core/cpu.vhd" +vcom -explicit -93 "../src/cpu_embedded.vhd" +vcom -explicit -93 "../src/tb_cpu_embedded.vhd" +vcom -explicit -93 "../src/mul8x8_irom.vhdl" +vsim -t 1ps -lib work tb_cpu_embedded +do {tb_mul8x8.wdo} +view wave +view structure +view signals +run 10us diff --git a/lib/CPUs/JCpu/sim/tb_mul8x8.wdo b/lib/CPUs/JCpu/sim/tb_mul8x8.wdo new file mode 100644 index 0000000..355e0a4 --- /dev/null +++ b/lib/CPUs/JCpu/sim/tb_mul8x8.wdo @@ -0,0 +1,31 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_cpu_embedded/uut/inst_cpu/rst +add wave -noupdate -format Logic /tb_cpu_embedded/uut/inst_cpu/clk +add wave -noupdate -format Logic /tb_cpu_embedded/uut/inst_cpu/ce +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu_embedded/uut/inst_cpu/instr_din +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu_embedded/uut/inst_cpu/instr_addr +add wave -noupdate -format Literal /tb_cpu_embedded/uut/inst_cpu/cpu_status +add wave -noupdate -format Literal /tb_cpu_embedded/uut/inst_cpu/status_reg +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu_embedded/uut/inst_cpu/alu_op1 +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu_embedded/uut/inst_cpu/alu_op2 +add wave -noupdate -format Literal -radix hexadecimal /tb_cpu_embedded/uut/inst_cpu/alu_result +add wave -noupdate -format Literal /tb_cpu_embedded/uut/inst_cpu/alu_status +add wave -noupdate -format Literal /tb_cpu_embedded/uut/inst_cpu/inst_dpath_ctrl/dbg_iname +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_cpu_embedded/uut/inst_cpu/inst_reg_ab/mem +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {529679 ps} 0} +configure wave -namecolwidth 143 +configure wave -valuecolwidth 101 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 1 +configure wave -griddelta 40 +configure wave -timeline 0 +update +WaveRestoreZoom {9002500 ps} {10052500 ps} diff --git a/lib/CPUs/JCpu/src/core/alu.vhd b/lib/CPUs/JCpu/src/core/alu.vhd new file mode 100644 index 0000000..19b3478 --- /dev/null +++ b/lib/CPUs/JCpu/src/core/alu.vhd @@ -0,0 +1,236 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The arithmetic logic unit +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity alu is + Generic ( + data_width : integer := 8 + ); + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + op_en : in STD_LOGIC; + cy_in : in STD_LOGIC; + op1_in : in unsigned (data_width-1 downto 0); + op2_in : in unsigned (data_width-1 downto 0); + opsel : in alu_op_t; + res_out : out unsigned (data_width-1 downto 0); + stat_load : in STD_LOGIC; + stat_in : in alu_status_t; + stat_out : out alu_status_t + ); +end alu; + +architecture Behavioral of alu is + + signal sum_cy, sh_cy, sum_cy_in, sh_cy_in, left_shift, add_subn : STD_LOGIC; + signal result, sum_res, lf_res, sh_res, res_reg : unsigned (data_width-1 downto 0); + signal status, stat_reg : alu_status_t; + + -------------------------------------------------------------------------- + function test_zero(arg : unsigned) return STD_LOGIC is + variable result : STD_LOGIC; + begin + result := '0'; + for i in arg'range loop + result := result or To_X01(arg(i)); + end loop; + + return not result; + end test_zero; + +-------------------------------------------------------------------------- +begin + +-------------------------------------------------------------------------- +proc_logic_func: + process (op1_in, op2_in, opsel) + begin + + case opsel is + when op1_and_op2 => + lf_res <= op1_in and op2_in; + when op1_or_op2 => + lf_res <= op1_in or op2_in; + when op1_xor_op2 => + lf_res <= op1_in xor op2_in; + when others => + lf_res <= (others => '-'); + end case; + + end process; + +-------------------------------------------------------------------------- +proc_shift_func: + process (op1_in, left_shift, sh_cy_in) + begin + if left_shift = '1' then + sh_res <= op1_in(op1_in'left-1 downto op1_in'right) & sh_cy_in; + sh_cy <= op1_in(op1_in'left); + else + sh_res <= sh_cy_in & op1_in(op1_in'left downto op1_in'right+1); + sh_cy <= op1_in(op1_in'right); + end if; + + end process; + +-------------------------------------------------------------------------- +proc_alu_out: + process(opsel, op1_in, op2_in, res_reg, stat_reg, lf_res, sum_res, sh_res, sum_cy, sh_cy, cy_in) + + begin + + case opsel is + + when op1_add_op2 | op1_sub_op2 | op1_addc_op2 | op1_subc_op2 => + status.zero <= test_zero(res_reg); + status.carry <= sum_cy; + result <= sum_res; + when op1_and_op2 | op1_or_op2 | op1_xor_op2 => + status.zero <= test_zero(res_reg); + status.carry <= stat_reg.carry; + result <= lf_res; + when shl_op | shr_op | rol_op | ror_op | rolc_op | rorc_op => + status.zero <= test_zero(res_reg); + status.carry <= sh_cy; + result <= sh_res; + when swap_op => + result <= op1_in(op1_in'left-op1_in'length/2 downto op1_in'right) & op1_in(op1_in'left downto op1_in'right+op1_in'length/2); + status <= stat_reg; + when others => + result <= op2_in; + status.zero <= stat_reg.zero; + status.carry <= stat_reg.carry or cy_in; + end case; + + end process; + +-------------------------------------------------------------------------- +proc_alu_in: + process(opsel, op1_in, stat_reg) + + begin + + add_subn <= '-'; + sum_cy_in <= '-'; + sh_cy_in <= '-'; + left_shift <= '-'; + + case opsel is + + when op1_add_op2 => + sum_cy_in <= '0'; + add_subn <= '1'; + + when op1_sub_op2 => + sum_cy_in <= '0'; + add_subn <= '0'; + + when op1_addc_op2 => + sum_cy_in <= stat_reg.carry; + add_subn <= '1'; + + when op1_subc_op2 => + sum_cy_in <= stat_reg.carry; + add_subn <= '0'; + + when shl_op => + sh_cy_in <= '0'; + left_shift <= '1'; + + when shr_op => + sh_cy_in <= '0'; + left_shift <= '0'; + + when rol_op => + sh_cy_in <= op1_in(op1_in'left); + left_shift <= '1'; + + when ror_op => + sh_cy_in <= op1_in(op1_in'right); + left_shift <= '0'; + + when rolc_op => + sh_cy_in <= stat_reg.carry; + left_shift <= '1'; + + when rorc_op => + sh_cy_in <= stat_reg.carry; + left_shift <= '0'; + + when others => null; + + end case; + + end process; + +-------------------------------------------------------------------------- +proc_res_reg: + process(clk, rst, op_en, stat_load, res_reg, stat_reg) + begin + if rst = '1' then + res_reg <= (others => '0'); + stat_reg <= (others => '0'); + elsif rising_edge(clk) then + if op_en = '1' then + res_reg <= result; + stat_reg <= status; + elsif stat_load = '1' then + stat_reg <= stat_in; + end if; + end if; + res_out <= res_reg; + stat_out <= stat_reg; + + end process; + +-------------------------------------------------------------------------- +alu_addsub: + process(op1_in, op2_in, sum_cy_in, add_subn) + variable sum : unsigned(data_width+1 downto 0); + variable op1, op2 : unsigned(data_width+1 downto 0); + begin + if add_subn = '1' then + op1 := '0' & op1_in & '1'; + op2 := '0' & op2_in & sum_cy_in; + sum := op1 + op2; + else + op1 := '0' & op1_in & not sum_cy_in; + op2 := '0' & op2_in & '1'; + sum := op1 - op2; + end if; + + -- Form sum + carry + sum_res <= sum(data_width downto 1); + sum_cy <= sum(sum'left); + + end process; + +-------------------------------------------------------------------------- +end Behavioral; + diff --git a/lib/CPUs/JCpu/src/core/chipram.vhd b/lib/CPUs/JCpu/src/core/chipram.vhd new file mode 100644 index 0000000..a954a77 --- /dev/null +++ b/lib/CPUs/JCpu/src/core/chipram.vhd @@ -0,0 +1,85 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: On-chip RAM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity chipram is + Generic ( + addr_width : integer := 3; + data_width : integer := 8 + ); + Port ( + clka : in STD_LOGIC; + clkb : in STD_LOGIC; + en_a : in STD_LOGIC; + en_b : in STD_LOGIC; + we_a : in STD_LOGIC; + we_b : in STD_LOGIC; + addr_a : in unsigned (addr_width-1 downto 0); + addr_b : in unsigned (addr_width-1 downto 0); + din_a : in unsigned (data_width-1 downto 0); + din_b : in unsigned (data_width-1 downto 0); + dout_a : out unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); +end chipram; + +architecture Behavioral of chipram is + + constant depth : integer := 2**addr_width; + type RAMtype is array (0 to depth-1) of unsigned (data_width-1 downto 0); + shared variable RAM : RAMtype; + +begin + +process (clka) +begin +if clka'event and clka = '1' then + if en_a = '1' then + if we_a = '1' then + RAM(to_integer(addr_a)) := din_a; + end if; + dout_a <= RAM(to_integer(addr_a)); + end if; +end if; +end process; + +process (clkb) +begin +if clkb'event and clkb = '1' then + if en_b = '1' then + if we_b = '1' then + RAM(to_integer(addr_b)) := din_b; + end if; + dout_b <= RAM(to_integer(addr_b)); + end if; +end if; +end process; + + +end Behavioral; + diff --git a/lib/CPUs/JCpu/src/core/chipreg.vhd b/lib/CPUs/JCpu/src/core/chipreg.vhd new file mode 100644 index 0000000..483c627 --- /dev/null +++ b/lib/CPUs/JCpu/src/core/chipreg.vhd @@ -0,0 +1,123 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: On-Chip registers +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity chipreg is + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + we : in STD_LOGIC; + addr : in dmem_addr_t; + din : in dmem_data_t; + dout : out dmem_data_t; + ctrl_in : in creg_ctrl_in_t; + ctrl_out : out creg_ctrl_out_t + ); +end chipreg; + +architecture Behavioral of chipreg is + + signal reg_page_sel : page_sel_t; + signal reg_int_ctrl : int_ctrl_in_t; + signal reg_stk_high : unsigned(IMEM_ADDR_WIDTH-DMEM_ADDR_WIDTH-1 downto 0); + signal reg_cmem_high : unsigned(IMEM_ADDR_WIDTH-DMEM_ADDR_WIDTH-1 downto 0); + +begin + +proc_assign_ctrl_lines: + process (clk) + begin + if rising_edge(clk) then + ctrl_out.page_sel <= reg_page_sel; + ctrl_out.int_ctrl <= reg_int_ctrl; + ctrl_out.stk_high <= reg_stk_high; + ctrl_out.cmem_high <= reg_cmem_high; + end if; + end process; + +proc_reg_write: + process (rst, clk) + begin + if rst = '1' then + reg_stk_high <= (others => '0'); + reg_cmem_high <= (others => '0'); + reg_page_sel <= (others => '0'); + reg_int_ctrl.enable <= '0'; + reg_int_ctrl.polarity <= '1'; + reg_int_ctrl.edge_sens <= '1'; + elsif rising_edge(clk) then + reg_int_ctrl.request <= '0'; + if we = '1' then + case addr is + when X"01" => + reg_page_sel(page_sel_t'range) <= din(page_sel_t'range); + when X"03" => + reg_int_ctrl.enable <= din(0); + reg_int_ctrl.polarity <= din(1); + reg_int_ctrl.edge_sens <= din(2); + reg_int_ctrl.request <= din(7); + when X"04" => + reg_cmem_high <= din(IMEM_ADDR_WIDTH-DMEM_ADDR_WIDTH-1 downto 0); + when X"05" => + reg_stk_high <= din(IMEM_ADDR_WIDTH-DMEM_ADDR_WIDTH-1 downto 0); + when others => null; + end case; + end if; + end if; + end process; + +proc_reg_read: + process (clk) + begin + if rising_edge(clk) then + case addr is + when X"00" => -- Revison + dout <= to_unsigned(REVISION, dmem_data_t'length); + when X"01" => -- Control 0 + dout <= (7 downto page_sel_t'length => '0') & reg_page_sel; + when X"02" => -- CPU status + dout <= "000000" & ctrl_in.alu.carry & ctrl_in.alu.zero; + when X"03" => -- Interrupt control + dout <= "00000" & reg_int_ctrl.edge_sens & reg_int_ctrl.polarity & reg_int_ctrl.enable; + when X"04" => -- Upper stack bits out + dout <= "0000" & reg_cmem_high; + when X"05" => -- Upper cmem bits out + dout <= "0000" & reg_stk_high; + when others => + if addr(0) = '0' then + dout <= X"DE"; + else + dout <= X"AD"; + end if; + end case; + + end if; + end process; + +end Behavioral; + diff --git a/lib/CPUs/JCpu/src/core/cpu.vhd b/lib/CPUs/JCpu/src/core/cpu.vhd new file mode 100644 index 0000000..1184806 --- /dev/null +++ b/lib/CPUs/JCpu/src/core/cpu.vhd @@ -0,0 +1,566 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: JCPU top file +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity cpu is + Generic ( + use_instr_register : boolean := false; + use_ctrl_rom : boolean := true + + ); + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_wait : in STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + instr_din : in unsigned (IMEM_DATA_WIDTH-1 downto 0); + instr_addr : out unsigned (IMEM_ADDR_WIDTH-1 downto 0); + xmem_din : in unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_ADDR_WIDTH-1 downto 0); + io_sel : out std_logic + ); +end cpu; + +architecture rtl of cpu is + + COMPONENT stack_ctrl + GENERIC ( + addr_width : integer + ); + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + push : in STD_LOGIC; + pop : in STD_LOGIC; + din : in inst_addr_t; + dout : out inst_addr_t; + mem_we : out STD_LOGIC; + ptr_out : out unsigned (addr_width-1 downto 0) + ); + END COMPONENT; + + COMPONENT pc + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + inc : in STD_LOGIC; + load : in STD_LOGIC; + pc_in : in inst_addr_t; + pc_out : out inst_addr_t; + pc_next : out inst_addr_t + ); + END COMPONENT; + + COMPONENT dpath_ctrl + GENERIC ( + use_rom : boolean + ); + Port ( + inst_in : in inst_t; + iphase_in : in iphase_t; + status_in : in cpu_status_t; + ctrl_out : out dpath_ctrl_out_t; + idout : out inst_addr_t; + ddout : out dmem_data_t + ); + END COMPONENT; + + COMPONENT int_ctrl + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ctrl_in : in int_ctrl_in_t; + int_in : in STD_LOGIC; + int_exit : in STD_LOGIC; + iphase_in : in iphase_t; + int_ack_out : out STD_LOGIC; + stat_save_out : out STD_LOGIC; + stat_rest_out : out STD_LOGIC; + pc_addr_out : out inst_addr_t; + pc_load_out : out STD_LOGIC; + stk_push_out : out STD_LOGIC; + stk_pop_out : out STD_LOGIC + ); + END COMPONENT; + + COMPONENT reg_dual + GENERIC ( + addr_width : integer; + data_width : integer + ); + Port ( + clk : in STD_LOGIC; + we_a : in STD_LOGIC; + ptr_a : in reg_ptr_t; + ptr_b : in reg_ptr_t; + din_a : in unsigned (data_width-1 downto 0); + dout_a : out unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); + END COMPONENT; + + COMPONENT chipram + GENERIC ( + addr_width : integer; + data_width : integer + ); + Port ( + clka : in STD_LOGIC; + clkb : in STD_LOGIC; + en_a : in STD_LOGIC; + en_b : in STD_LOGIC; + we_a : in STD_LOGIC; + we_b : in STD_LOGIC; + addr_a : in unsigned (addr_width-1 downto 0); + addr_b : in unsigned (addr_width-1 downto 0); + din_a : in unsigned (data_width-1 downto 0); + din_b : in unsigned (data_width-1 downto 0); + dout_a : out unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); + END COMPONENT; + + COMPONENT chipreg + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + we : in STD_LOGIC; + addr : in dmem_addr_t; + din : in dmem_data_t; + dout : out dmem_data_t; + ctrl_in : in creg_ctrl_in_t; + ctrl_out : out creg_ctrl_out_t + ); + END COMPONENT; + + COMPONENT alu + GENERIC ( + data_width : integer := 8 + ); + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + op_en : in STD_LOGIC; + cy_in : in STD_LOGIC; + op1_in : in unsigned (data_width-1 downto 0); + op2_in : in unsigned (data_width-1 downto 0); + opsel : in alu_op_t; + res_out : out unsigned (data_width-1 downto 0); + stat_load : in STD_LOGIC; + stat_in : in alu_status_t; + stat_out : out alu_status_t + ); + END COMPONENT; + + signal cpu_status, status_reg : cpu_status_t; -- := cpu_status_t(others => '0'); + signal ctrl : dpath_ctrl_out_t; + signal stk_out : inst_addr_t; + signal stk_in : inst_addr_t; + signal stk_reg : inst_addr_t; + signal pc_in, pc_out, pc_next, idata, int_pc_addr : inst_addr_t; + signal iphase : iphase_t; + signal const_data, reg_a_dout, reg_b_dout : dmem_data_t; + signal reg_din : dmem_data_t; + signal alu_op1, alu_op2, alu_result : dmem_data_t; + signal alu_status : alu_status_t; + signal pc_inc, pc_load, cpu_active, stk_we, cmem_we, creg_we : STD_LOGIC; + signal ctrl_inst : inst_t; + signal ctrl_iphase : iphase_t; + signal was_pcld, was_pop2pc, int_pc_load, int_stk_push, int_stk_pop, stk_push, stk_pop : STD_LOGIC; + signal status_save, status_restore : STD_LOGIC; + signal creg_dout : dmem_data_t; + signal cmem_din, cmem_dout : inst_addr_t; + signal stk_addr, cmem_addr : unsigned(CHIPRAM_SIZE_BITS-1 downto 0); + signal stk_ptr : unsigned(STACK_SIZE_BITS-1 downto 0); + signal creg_ctrl_out : creg_ctrl_out_t; + signal creg_ctrl_in : creg_ctrl_in_t; + signal irq_out : std_logic; + signal xio_sel, cio_sel : std_logic; + signal mem_data : dmem_data_t; + signal mem_addr : dmem_data_t; + +begin + io_sel <= xio_sel; + instr_addr <= pc_out; + pc_inc <= cpu_active and ctrl.lines.pc_inc; + stk_addr <= '0' & stk_ptr; + cpu_status.alu <= alu_status; + cpu_status.xmem_wait <= xmem_wait; + creg_ctrl_in.alu <= alu_status; + + xmem_dout <= mem_data; + xmem_addr <= mem_addr; + cmem_din <= creg_ctrl_out.cmem_high & mem_data; + cmem_addr <= '1' & creg_ctrl_out.page_sel & mem_addr(MIN(cmem_addr'length-creg_ctrl_out.page_sel'length-1, mem_addr'length)-1 downto 0); + +-------------------------------------------------------------------- +mem_ctrl_lines: + process(ctrl.lines) + begin + xio_sel <= '0'; + xmem_re <= '0'; + xmem_we <= '0'; + cio_sel <= '0'; + cmem_we <= '0'; + creg_we <= '0'; + + case ctrl.lines.mem_access is + when xmem_access => + xmem_re <= ctrl.lines.mem_read; + xmem_we <= ctrl.lines.mem_write; + when xio_access => + xio_sel <= '1'; + xmem_re <= ctrl.lines.mem_read; + xmem_we <= ctrl.lines.mem_write; + when cmem_access => + cmem_we <= ctrl.lines.mem_write; + when cio_access => + cio_sel <= '1'; + creg_we <= ctrl.lines.mem_write; + when others => null; + end case; + end process; + +iphase_counter: + process(rst, clk, ce) + variable pos : integer; + begin + if rst = '1' then + iphase <= iphase_t'low; + cpu_active <= '0'; + elsif rising_edge(clk) then + cpu_active <= '0'; + if ce = '1' then + cpu_active <= '1'; + if iphase = iphase_t'high then + iphase <= iphase_t'low; + else + iphase <= iphase + 1; + end if; + end if; + end if; + end process; + +gen_instr_reg: +if use_instr_register = true generate + +instr_reg: + process (rst, clk, ce) + begin + if rst = '1' then + ctrl_inst <= (others => '0'); + ctrl_iphase <= 0; + elsif rising_edge(clk) and ce = '1' then + ctrl_inst <= instr_din; + ctrl_iphase <= iphase; + end if; + end process; + +end generate; + +gen_instr_direct: +if use_instr_register = false generate + + ctrl_inst <= instr_din; + ctrl_iphase <= iphase; + +end generate; + +status_register: + process(clk, status_save) + begin + if rising_edge(clk) and status_save = '1' then + status_reg.alu <= alu_status; + end if; + end process; + +pc_pushpop: + process(ctrl.lines, int_pc_load, int_stk_push, int_stk_pop, was_pop2pc) + begin + pc_load <= ctrl.lines.pc_load or int_pc_load; + stk_push <= (ctrl.lines.stk_pushd or ctrl.lines.stk_push) or (int_stk_push and not was_pop2pc); + stk_pop <= ctrl.lines.stk_popd or int_stk_pop or (ctrl.lines.stk_pop and not int_pc_load); + end process; + +lines_delay: + process(clk) + begin + if rising_edge(clk) then + was_pcld <= ctrl.lines.pc_load; + was_pop2pc <= ctrl.lines.stk_pop and ctrl.lines.pc_load; + end if; + end process; + +stk_mux: + process(ctrl.lines, was_pcld, int_stk_push, pc_next, idata, reg_a_dout, creg_ctrl_out) + begin + if was_pcld = '1' and int_stk_push = '1' then + stk_in <= idata; + elsif ctrl.lines.stk_pushd = '1' then + stk_in <= creg_ctrl_out.stk_high & reg_a_dout; + else + stk_in <= pc_next; + end if; + + end process; + +pc_mux: + process(ctrl.lines, int_pc_load, int_stk_pop, idata, int_pc_addr, stk_out) + begin + + pc_in <= stk_out; + if int_pc_load = '1' then + if int_stk_pop = '0' then + pc_in <= int_pc_addr; + end if; + elsif ctrl.lines.pc_load = '1' then + if ctrl.lines.stk_pop = '0' then + pc_in <= idata; + end if; + end if; + + end process; + +mem_data_mux: + process(ctrl.lines.ddata_src_sel, reg_a_dout, reg_b_dout, const_data, creg_ctrl_out) + begin + case ctrl.lines.ddata_src_sel is + when reg_a => + mem_data <= reg_a_dout; + when reg_b => + mem_data <= reg_b_dout; + when const => + mem_data <= const_data; + when others => + mem_data <= const_data; + end case; + + end process; + +mem_addr_mux: + process(ctrl.lines.daddr_src_sel, reg_a_dout, reg_b_dout, const_data, creg_ctrl_out.page_sel) + begin + case ctrl.lines.daddr_src_sel is + when reg_a => + mem_addr <= reg_a_dout; + when reg_b => + mem_addr <= reg_b_dout; + when const => + mem_addr <= const_data; + when others => + mem_addr <= const_data; + end case; + + end process; + +reg_in_mux: + process(ctrl.lines.reg_src_sel, cio_sel, xmem_din, alu_result, stk_out, cmem_dout, creg_dout) + variable data : dmem_data_t; + begin + case ctrl.lines.reg_src_sel is + when xmem_src => + data := xmem_din; + when cmem_src => + if cio_sel = '0' then + data := cmem_dout(dmem_data_t'range); + else + data := creg_dout(dmem_data_t'range); + end if; + when stk_src => + data := stk_out(dmem_data_t'range); + when others => + data := alu_result; + end case; + + reg_din <= data; + + end process; + +alu_op1_mux: + process(ctrl.lines.alu_op1_src_sel, reg_a_dout, reg_b_dout, const_data) + variable data : dmem_data_t; + begin + case ctrl.lines.alu_op1_src_sel is + when reg_a => + data := reg_a_dout; + when reg_b => + data := reg_b_dout; + when others => + data := const_data; + end case; + + alu_op1 <= data; + + end process; + +alu_op2_mux: + process(ctrl.lines.alu_op2_src_sel, reg_a_dout, reg_b_dout, const_data) + variable data : dmem_data_t; + begin + case ctrl.lines.alu_op2_src_sel is + when reg_a => + data := reg_a_dout; + when reg_b => + data := reg_b_dout; + when others => + data := const_data; + end case; + + alu_op2 <= data; + + end process; + +-------------------------------------------------------------------- + inst_stack_ctrl: stack_ctrl + GENERIC MAP ( + addr_width => STACK_SIZE_BITS + ) + PORT MAP( + rst => rst, + clk => clk, + push => stk_push, + pop => stk_pop, + dout => stk_reg, + din => stk_in, + ptr_out => stk_ptr, + mem_we => stk_we + ); + + inst_pc: pc + PORT MAP( + rst => rst, + clk => clk, + inc => pc_inc, + load => pc_load, + pc_in => pc_in, + pc_out => pc_out, + pc_next => pc_next + ); + + inst_dpath_ctrl: dpath_ctrl + GENERIC MAP ( + use_rom => use_ctrl_rom + ) + PORT MAP( + inst_in => ctrl_inst, + iphase_in => ctrl_iphase, + status_in => cpu_status, + ctrl_out => ctrl, + ddout => const_data, + idout => idata + ); + + inst_int_ctrl: int_ctrl + PORT MAP( + rst => rst, + clk => clk, + ctrl_in => creg_ctrl_out.int_ctrl, + int_in => int_in, + int_ack_out => int_ack, + int_exit => ctrl.lines.int_exit, + iphase_in => ctrl_iphase, + stat_save_out => status_save, + stat_rest_out => status_restore, + pc_addr_out => int_pc_addr, + pc_load_out => int_pc_load, + stk_push_out => int_stk_push, + stk_pop_out => int_stk_pop + + ); + + inst_reg_ab: reg_dual + GENERIC MAP ( + addr_width => REG_SIZE_BITS, + data_width => DMEM_DATA_WIDTH + ) + PORT MAP( + clk => clk, + we_a => ctrl.lines.reg_we, + ptr_a => ctrl.reg_a_ptr, + ptr_b => ctrl.reg_b_ptr, + din_a => reg_din, + dout_a => reg_a_dout, + dout_b => reg_b_dout + ); + + inst_chipram: chipram + GENERIC MAP ( + addr_width => CHIPRAM_SIZE_BITS, + data_width => IMEM_ADDR_WIDTH + ) + PORT MAP( + clka => clk, + clkb => clk, + en_a => cpu_active, + en_b => cpu_active, + we_a => stk_we, + we_b => cmem_we, + addr_a => stk_addr, + addr_b => cmem_addr, + din_a => stk_reg, + din_b => cmem_din, + dout_a => stk_out, + dout_b => cmem_dout + ); + + inst_chipreg: chipreg + PORT MAP( + rst => rst, + clk => clk, + we => creg_we, + addr => mem_addr, + din => mem_data, + dout => creg_dout, + ctrl_in => creg_ctrl_in, + ctrl_out => creg_ctrl_out + ); + + inst_alu: alu + GENERIC MAP ( + data_width => DMEM_DATA_WIDTH + ) + PORT MAP( + rst => rst, + clk => clk, + op_en => ctrl.lines.alu_load, + cy_in => ctrl.lines.alu_cy_in, + op1_in => alu_op1, + op2_in => alu_op2, + opsel => ctrl.lines.alu_opsel, + res_out => alu_result, + stat_load => status_restore, + stat_in => status_reg.alu, + stat_out => alu_status + ); + +end rtl; diff --git a/lib/CPUs/JCpu/src/core/cpu_pkg.vhd b/lib/CPUs/JCpu/src/core/cpu_pkg.vhd new file mode 100644 index 0000000..4c4d56c --- /dev/null +++ b/lib/CPUs/JCpu/src/core/cpu_pkg.vhd @@ -0,0 +1,904 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: Types, constants and functions for JCPU +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + + +package cpu_pkg is + + -- Revision of the CPU + constant REVISION : integer := 4; + + -- Chipram depth (valid values 9..floor(log2(BlockRamBytes))) + constant CHIPRAM_SIZE_BITS : integer := 10; + + -- Chipregister file depth + constant CHIPREG_SIZE_BITS : integer := 8; + + -- Number of registers (16 registers fixed) + constant REG_SIZE_BITS : integer := 4; + + -- Instruction memory + constant IMEM_ADDR_WIDTH : integer := 12; + + -- Data memory + constant DMEM_DATA_WIDTH : integer := 8; + constant DMEM_ADDR_WIDTH : integer := 8; + + -- Instruction format + constant INST_OPCODE_WIDTH : integer := 6; + constant IMEM_DATA_WIDTH : integer := INST_OPCODE_WIDTH + DMEM_DATA_WIDTH + REG_SIZE_BITS; + + -- Microcode ROM + constant MUCODE_ADDR_WIDTH : integer := 10; + + -- Stack depth (uses lower half of CHIPRAM) + constant STACK_SIZE_BITS : integer := CHIPRAM_SIZE_BITS-1; + + --Types + subtype iphase_t is integer range 0 to 1; + type mem_access_t is (cmem_access, xmem_access, cio_access, xio_access); + type reg_src_t is (alu_src, stk_src, cmem_src, xmem_src); + type alu_src_t is (reg_a, reg_b, const); + type ddata_src_t is (reg_a, reg_b, const); + type daddr_src_t is (reg_a, reg_b, const); + subtype instr_name_t is string(1 to 12); + type instr_name_array_t is array (0 to 63) of instr_name_t; + subtype opcode_t is unsigned (INST_OPCODE_WIDTH-1 downto 0); + subtype inst_data_t is unsigned (IMEM_ADDR_WIDTH-1 downto 0); + subtype inst_addr_t is unsigned (IMEM_ADDR_WIDTH-1 downto 0); + subtype inst_t is unsigned (IMEM_DATA_WIDTH-1 downto 0); + subtype dmem_data_t is unsigned (DMEM_DATA_WIDTH-1 downto 0); + subtype dmem_addr_t is unsigned (DMEM_DATA_WIDTH-1 downto 0); + subtype reg_ptr_t is unsigned (3 downto 0); + type dmem_array_t is array (natural range <>) of dmem_data_t; + type instr_addr_array is array (integer range <>) of inst_addr_t; + subtype page_sel_t is unsigned (CHIPRAM_SIZE_BITS-DMEM_DATA_WIDTH-2 downto 0); + + type alu_op_t is + ( + pass_op2, + op1_add_op2, + op1_sub_op2, + op1_addc_op2, + op1_subc_op2, + op1_and_op2, + op1_or_op2, + op1_xor_op2, + swap_op, + shl_op, + shr_op, + rol_op, + ror_op, + rolc_op, + rorc_op + ); + + type alu_status_t is record + zero : STD_LOGIC; + carry : STD_LOGIC; + end record; + + type cpu_status_t is record + alu : alu_status_t; + xmem_wait : STD_LOGIC; + end record; + + type ctrl_lines_t is record + reg_we : STD_LOGIC; + reg_src_sel : reg_src_t; + alu_op1_src_sel : alu_src_t; + alu_op2_src_sel : alu_src_t; + alu_opsel : alu_op_t; + alu_load : STD_LOGIC; + alu_cy_in : STD_LOGIC; + ddata_src_sel : ddata_src_t; + daddr_src_sel : daddr_src_t; + pc_load : STD_LOGIC; + pc_inc : STD_LOGIC; + stk_push : STD_LOGIC; + stk_pop : STD_LOGIC; + stk_pushd : STD_LOGIC; + stk_popd : STD_LOGIC; + mem_access : mem_access_t; + mem_read : STD_LOGIC; + mem_write : STD_LOGIC; + int_exit : STD_LOGIC; + end record; + + type dpath_ctrl_out_t is record + lines : ctrl_lines_t; + reg_a_ptr : reg_ptr_t; + reg_b_ptr : reg_ptr_t; + end record; + + type int_ctrl_in_t is record + enable : std_logic; + polarity : std_logic; + edge_sens : std_logic; + request : std_logic; + end record; + + type creg_ctrl_out_t is record + page_sel : page_sel_t; + int_ctrl : int_ctrl_in_t; + stk_high : unsigned(IMEM_ADDR_WIDTH-DMEM_ADDR_WIDTH-1 downto 0); + cmem_high : unsigned(IMEM_ADDR_WIDTH-DMEM_ADDR_WIDTH-1 downto 0); + end record; + + type creg_ctrl_in_t is record + alu : alu_status_t; + end record; + + + type murom_t is array (0 to integer(2**MUCODE_ADDR_WIDTH)-1) of ctrl_lines_t; + + constant instr_name_array : instr_name_array_t := + ( + "NOP ", -- 00 + "HALT ", -- 01 + "MOV|R|R ", -- 02 + "MOV|R|K ", -- 03 + "MOVX|R|Ri ", -- 04 + "MOVX|R|Ki ", -- 05 + "MOVX|Ri|R ", -- 06 + "MOVX|Ri|K ", -- 07 + "MOVX|Ki|R ", -- 08 + "MOVC|R|Ri ", -- 09 + "MOVC|R|Ki ", -- 0A + "MOVC|Ri|R ", -- 0B + "MOVC|Ri|K ", -- 0C + "MOVC|Ki|R ", -- 0D + "CMP|R|R ", -- 0E + "CMP|R|K ", -- 0F + "ADD|R|R ", -- 10 + "ADD|R|K ", -- 11 + "ADDC|R|R ", -- 12 + "ADDC|R|K ", -- 13 + "SUB|R|R ", -- 14 + "SUB|R|K ", -- 15 + "SUBC|R|R ", -- 16 + "SUBC|R|K ", -- 17 + "AND|R|R ", -- 18 + "AND|R|K ", -- 19 + "OR|R|R ", -- 1A + "OR|R|K ", -- 1B + "XOR|R|R ", -- 1C + "XOR|R|K ", -- 1D + "SHL|R ", -- 1E + "SHR|R ", -- 1F + "ROL|R ", -- 20 + "ROR|R ", -- 21 + "ROLC|R ", -- 22 + "RORC|R ", -- 23 + "XOUT|Ki|R ", -- 24 + "XOUT|Ri|K ", -- 25 + "COUT|Ki|R ", -- 26 + "COUT|Ri|K ", -- 27 + "XIN|R|Ki ", -- 28 + "CIN|R|Ki ", -- 29 + "SWAP|R ", -- 2A + "SETC ", -- 2B + "UNDEF ", -- 2C + "UNDEF ", -- 2D + "SUB|K|R ", -- 2E + "SUBC|K|R ", -- 2F + "JMP|K ", -- 30 + "JZ|K ", -- 31 + "JNZ|K ", -- 32 + "JC|K ", -- 33 + "JNC|K ", -- 34 + "JLT|K ", -- 35 + "JGT|K ", -- 36 + "JLE|K ", -- 37 + "JGE|K ", -- 38 + "JEQ|K ", -- 39 + "JNE|K ", -- 3A + "CALL|K ", -- 3B + "PUSH|R ", -- 3C + "POP|R ", -- 3D + "RET ", -- 3E + "RETI " -- 3F + ); + -- Functions + function Instr(opcode : opcode_t) return inst_t; + function Instr(opcode : opcode_t; data : inst_data_t) return inst_t; + function Instr(opcode : opcode_t; data : inst_data_t; reg : integer) return inst_t; + function Instr(opcode : opcode_t; reg_a : integer) return inst_t; + function Instr(opcode : opcode_t; reg_a, reg_b : integer) return inst_t; + function Instr(opcode : opcode_t; reg_a, reg_b, reg_c : integer) return inst_t; + function ctrl_lines_default return ctrl_lines_t; + function idecoder(instr_name : instr_name_t; iphase : iphase_t; status : cpu_status_t) return ctrl_lines_t; + function idecoder(opcode : opcode_t; iphase : iphase_t; status : cpu_status_t) return ctrl_lines_t; + function gen_murom return murom_t; + function get_muromaddr (opcode : opcode_t; iphase : iphase_t; status : cpu_status_t) return unsigned; + function MIN (X, Y: INTEGER) return INTEGER; + function MAX (X, Y: INTEGER) return INTEGER; + +end cpu_pkg; + +package body cpu_pkg is + + function Instr(opcode : opcode_t) return inst_t is + variable inst : inst_t := (others => '0'); + begin + inst(inst_t'length-1 downto inst_t'length-opcode_t'length) := opcode; + return inst; + + end Instr; + + function Instr(opcode : opcode_t; data : inst_data_t) return inst_t is + variable inst : inst_t := (others => '0'); + begin + inst(inst_t'length-1 downto inst_t'length-opcode_t'length) := opcode; + inst(inst_t'length-opcode_t'length-1 downto inst_t'length-opcode_t'length-inst_addr_t'length) := data; + return inst; + + end Instr; + + function Instr(opcode : opcode_t; data : inst_data_t; reg : integer) return inst_t is + variable inst : inst_t := (others => '0'); + begin + inst(inst_t'length-1 downto inst_t'length-opcode_t'length) := opcode; + inst(inst_t'length-opcode_t'length-1 downto inst_t'length-opcode_t'length-inst_data_t'length) := data; + inst(reg_ptr_t'length-1 downto 0) := reg_ptr_t(to_unsigned(reg, reg_ptr_t'length)); + + return inst; + + end Instr; + + function Instr(opcode : opcode_t; reg_a : integer) return inst_t is + variable inst : inst_t := (others => '0'); + begin + inst(inst_t'length-1 downto inst_t'length-opcode_t'length) := opcode; + inst(reg_ptr_t'length-1 downto 0) := reg_ptr_t(to_unsigned(reg_a, reg_ptr_t'length)); + + return inst; + + end Instr; + + function Instr(opcode : opcode_t; reg_a, reg_b : integer) return inst_t is + variable inst : inst_t := (others => '0'); + begin + inst(inst_t'length-1 downto inst_t'length-opcode_t'length) := opcode; + inst(2*(reg_ptr_t'length)-1 downto reg_ptr_t'length) := reg_ptr_t(to_unsigned(reg_b, reg_ptr_t'length)); + inst(reg_ptr_t'length-1 downto 0) := reg_ptr_t(to_unsigned(reg_a, reg_ptr_t'length)); + + return inst; + + end Instr; + + function Instr(opcode : opcode_t; reg_a, reg_b, reg_c : integer) return inst_t is + variable inst : inst_t := (others => '0'); + begin + inst(inst_t'length-1 downto inst_t'length-opcode_t'length) := opcode; + inst(3*(reg_ptr_t'length)-1 downto 2*reg_ptr_t'length) := reg_ptr_t(to_unsigned(reg_c, reg_ptr_t'length)); + inst(2*(reg_ptr_t'length)-1 downto reg_ptr_t'length) := reg_ptr_t(to_unsigned(reg_b, reg_ptr_t'length)); + inst(reg_ptr_t'length-1 downto 0) := reg_ptr_t(to_unsigned(reg_a, reg_ptr_t'length)); + + return inst; + + end Instr; + + function ctrl_lines_default return ctrl_lines_t is + variable result : ctrl_lines_t; + begin + result.pc_load := '0'; + result.pc_inc := '0'; + result.stk_push := '0'; + result.stk_pop := '0'; + result.stk_pushd := '0'; + result.stk_popd := '0'; + result.reg_we := '0'; + result.reg_src_sel := alu_src; + result.ddata_src_sel := reg_a; + result.daddr_src_sel := reg_b; + result.alu_opsel := pass_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := reg_b; + result.alu_load := '0'; + result.alu_cy_in := '0'; + result.mem_access := cmem_access; + result.mem_read := '0'; + result.mem_write := '0'; + result.int_exit := '0'; + return result; + + end ctrl_lines_default; + + function idecoder(opcode : opcode_t; iphase : iphase_t; status : cpu_status_t) return ctrl_lines_t is + variable instr_name : instr_name_t; + begin + instr_name := instr_name_array(to_integer(opcode)); + return idecoder(instr_name, iphase, status); + end idecoder; + + function idecoder(instr_name : instr_name_t; iphase : iphase_t; status : cpu_status_t) return ctrl_lines_t is + variable result : ctrl_lines_t; + variable ze, cy, xmem_wait : STD_LOGIC; + + begin + ze := status.alu.zero; + cy := status.alu.carry; + xmem_wait := status.xmem_wait; + + result := ctrl_lines_default; + if iphase = 0 then + result.pc_inc := '1'; + end if; + + case instr_name is + + when "HALT " => + result.pc_inc := '0'; + when "SETC " => -- carry <= 1 + result.reg_src_sel := alu_src; + result.alu_opsel := pass_op2; + result.alu_op2_src_sel := reg_b; + result.alu_load := '1'; + result.alu_cy_in := '1'; + when "MOV|R|R " => -- R(a) <= R(b) + result.reg_src_sel := alu_src; + result.alu_opsel := pass_op2; + result.alu_op2_src_sel := reg_b; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "MOV|R|K " => -- R(a) <= #kk + result.reg_src_sel := alu_src; + result.alu_opsel := pass_op2; + result.alu_op2_src_sel := const; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "MOVC|Ri|R " => -- [R(b)] <= R(a) + result.mem_access := cmem_access; + result.daddr_src_sel := reg_b; + result.ddata_src_sel := reg_a; + if iphase = 0 then + result.mem_write := '1'; + end if; + when "MOVC|Ri|K " => -- [R(a)] <= kk + result.mem_access := cmem_access; + result.daddr_src_sel := reg_a; + result.ddata_src_sel := const; + if iphase = 0 then + result.mem_write := '1'; + end if; + when "COUT|Ri|K " => -- [R(a)] <= kk + result.mem_access := cio_access; + result.daddr_src_sel := reg_a; + result.ddata_src_sel := const; + if iphase = 0 then + result.mem_write := '1'; + end if; + when "MOVC|R|Ri " => -- R(a) <= [R(b)] + result.mem_access := cmem_access; + result.reg_src_sel := cmem_src; + result.daddr_src_sel := reg_b; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "MOVC|R|Ki " => -- R(a) <= [#addr] + result.mem_access := cmem_access; + result.reg_src_sel := cmem_src; + result.daddr_src_sel := const; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "CIN|R|Ki " => -- R(a) <= [#addr] + result.mem_access := cio_access; + result.reg_src_sel := cmem_src; + result.daddr_src_sel := const; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "MOVC|Ki|R " => -- [#addr] <= R(a) + result.mem_access := cmem_access; + result.daddr_src_sel := const; + result.ddata_src_sel := reg_a; + if iphase = 0 then + result.mem_write := '1'; + end if; + when "COUT|Ki|R " => -- [#addr] <= R(a) + result.mem_access := cio_access; + result.daddr_src_sel := const; + result.ddata_src_sel := reg_a; + if iphase = 0 then + result.mem_write := '1'; + end if; + when "MOVX|Ri|R " => -- [R(b)] <= R(a) + result.mem_access := xmem_access; + result.daddr_src_sel := reg_b; + result.ddata_src_sel := reg_a; + if iphase = 0 then + result.mem_write := '1'; + end if; + if xmem_wait = '1' then + result.mem_write := '1'; + result.pc_inc := '0'; + end if; + when "MOVX|Ri|K " => -- [R(a)] <= kk + result.mem_access := xmem_access; + result.daddr_src_sel := reg_a; + result.ddata_src_sel := const; + if iphase = 0 then + result.mem_write := '1'; + end if; + if xmem_wait = '1' then + result.mem_write := '1'; + result.pc_inc := '0'; + end if; + when "XOUT|Ri|K " => -- [R(a)] <= kk + result.mem_access := xio_access; + result.daddr_src_sel := reg_a; + result.ddata_src_sel := const; + if iphase = 0 then + result.mem_write := '1'; + end if; + if xmem_wait = '1' then + result.pc_inc := '0'; + result.mem_write := '1'; + end if; + when "MOVX|R|Ri " => -- R(a) <= [R(b)] + result.mem_access := xmem_access; + result.reg_src_sel := xmem_src; + result.daddr_src_sel := reg_b; + if iphase = 0 then + result.mem_read := '1'; + end if; + if xmem_wait = '0' then + if iphase = 1 then + result.reg_we := '1'; + end if; + else + result.pc_inc := '0'; + result.mem_read := '1'; + end if; + when "MOVX|R|Ki " => -- R(a) <= [#addr] + result.mem_access := xmem_access; + result.reg_src_sel := xmem_src; + result.daddr_src_sel := const; + if iphase = 0 then + result.mem_read := '1'; + end if; + if xmem_wait = '0' then + if iphase = 1 then + result.reg_we := '1'; + end if; + else + result.pc_inc := '0'; + result.mem_read := '1'; + end if; + when "XIN|R|Ki " => -- R(a) <= [#addr] + result.mem_access := xio_access; + result.reg_src_sel := xmem_src; + result.daddr_src_sel := const; + if iphase = 0 then + result.mem_read := '1'; + end if; + if xmem_wait = '0' then + if iphase = 1 then + result.reg_we := '1'; + end if; + else + result.pc_inc := '0'; + result.mem_read := '1'; + end if; + when "MOVX|Ki|R " => -- [#addr] <= R(a) + result.mem_access := xmem_access; + result.daddr_src_sel := const; + result.ddata_src_sel := reg_a; + if iphase = 0 then + result.mem_write := '1'; + end if; + if xmem_wait = '1' then + result.pc_inc := '0'; + result.mem_write := '1'; + end if; + when "XOUT|Ki|R " => -- [#addr] <= R(a) + result.mem_access := xio_access; + result.daddr_src_sel := const; + result.ddata_src_sel := reg_a; + if iphase = 0 then + result.mem_write := '1'; + end if; + if xmem_wait = '1' then + result.pc_inc := '0'; + result.mem_write := '1'; + end if; + when "ADD|R|R " => -- R(a) <= R(a) + R(b) + result.alu_opsel := op1_add_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := reg_b; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "ADD|R|K " => -- R(a) <= R(a) + k + result.alu_opsel := op1_add_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := const; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "ADDC|R|R " => -- R(a) <= R(a) + R(b) + result.alu_opsel := op1_addc_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := reg_b; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "ADDC|R|K " => -- R(a) <= R(a) + k + result.alu_opsel := op1_addc_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := const; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "SUB|R|R " => -- R(a) <= R(a) + R(b) + result.alu_opsel := op1_sub_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := reg_b; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "SUB|R|K " => -- R(a) <= R(a) + k + result.alu_opsel := op1_sub_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := const; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "SUB|K|R " => -- R(a) <= k - R(a) + result.alu_opsel := op1_sub_op2; + result.alu_op1_src_sel := const; + result.alu_op2_src_sel := reg_a; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "SUBC|R|R " => -- R(a) <= R(a) + R(b) + result.alu_opsel := op1_subc_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := reg_b; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "SUBC|R|K " => -- R(a) <= R(a) + k + result.alu_opsel := op1_subc_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := const; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "SUBC|K|R " => -- R(a) <= K - R(a) + result.alu_opsel := op1_subc_op2; + result.alu_op1_src_sel := const; + result.alu_op2_src_sel := reg_a; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "AND|R|R " => -- R(a) <= R(a) and R(b) + result.alu_opsel := op1_and_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := reg_b; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "AND|R|K " => -- R(a) <= R(a) and k + result.alu_opsel := op1_and_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := const; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "OR|R|R " => -- R(a) <= R(a) or R(b) + result.alu_opsel := op1_or_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := reg_b; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "OR|R|K " => -- R(a) <= R(a) or R(b) + result.alu_opsel := op1_or_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := const; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "XOR|R|R " => -- R(a) <= R(a) xor R(b) + result.alu_opsel := op1_xor_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := reg_b; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "XOR|R|K " => -- R(a) <= R(a) xor R(b) + result.alu_opsel := op1_xor_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := const; + result.reg_src_sel := alu_src; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "SWAP|R " => -- R(a) <= R(b) + result.reg_src_sel := alu_src; + result.alu_opsel := swap_op; + result.alu_op1_src_sel := reg_a; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "SHL|R " => -- R(a) <= R(a) xor R(b) + result.reg_src_sel := alu_src; + result.alu_opsel := shl_op; + result.alu_op1_src_sel := reg_a; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "SHR|R " => -- R(a) <= R(a) xor R(b) + result.reg_src_sel := alu_src; + result.alu_opsel := shr_op; + result.alu_op1_src_sel := reg_a; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "ROL|R " => -- R(a) <= R(a) xor R(b) + result.reg_src_sel := alu_src; + result.alu_opsel := rol_op; + result.alu_op1_src_sel := reg_a; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "ROR|R " => -- R(a) <= R(a) xor R(b) + result.reg_src_sel := alu_src; + result.alu_opsel := ror_op; + result.alu_op1_src_sel := reg_a; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "ROLC|R " => -- R(a) <= R(a) xor R(b) + result.reg_src_sel := alu_src; + result.alu_opsel := rolc_op; + result.alu_op1_src_sel := reg_a; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "RORC|R " => -- R(a) <= R(a) xor R(b) + result.reg_src_sel := alu_src; + result.alu_opsel := rorc_op; + result.alu_op1_src_sel := reg_a; + result.alu_load := '1'; + if iphase = 1 then + result.reg_we := '1'; + end if; + when "CMP|R|R " => -- + result.alu_opsel := op1_sub_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := reg_b; + result.alu_load := '1'; + when "CMP|R|K " => -- + result.alu_opsel := op1_sub_op2; + result.alu_op1_src_sel := reg_a; + result.alu_op2_src_sel := const; + result.alu_load := '1'; + when "JMP|K " => -- PC <= #addr + if iphase = 0 then + result.pc_load := '1'; + end if; + when "JZ|K " => -- PC <= #addr, zero + if iphase = 0 then + if ze = '1' then + result.pc_load := '1'; + end if; + end if; + when "JNZ|K " => -- PC <= #addr, !zero + if iphase = 0 then + if ze = '0' then + result.pc_load := '1'; + end if; + end if; + when "JC|K " => -- PC <= #addr, carry + if iphase = 0 then + if cy = '1' then + result.pc_load := '1'; + end if; + end if; + when "JNC|K " => -- PC <= #addr, !carry + if iphase = 0 then + if cy = '0' then + result.pc_load := '1'; + end if; + end if; + when "JLT|K " => -- PC <= #addr, !carry + if iphase = 0 then + if cy = '1' then + result.pc_load := '1'; + end if; + end if; + when "JGT|K " => -- + if iphase = 0 then + if (cy or ze) = '0' then + result.pc_load := '1'; + end if; + end if; + when "JLE|K " => -- + if iphase = 0 then + if (cy xor ze) = '1' then + result.pc_load := '1'; + end if; + end if; + when "JGE|K " => -- + if iphase = 0 then + if (not cy or ze) = '1' then + result.pc_load := '1'; + end if; + end if; + when "JEQ|K " => -- + if iphase = 0 then + if ze = '1' then + result.pc_load := '1'; + end if; + end if; + when "JNE|K " => -- + if iphase = 0 then + if ze = '0' then + result.pc_load := '1'; + end if; + end if; + when "PUSH|R " => -- push + if iphase = 0 then + result.stk_pushd := '1'; + end if; + when "POP|R " => -- pop + result.reg_src_sel := stk_src; + if iphase = 0 then + result.stk_popd := '1'; + elsif iphase = 1 then + result.reg_we := '1'; + end if; + when "CALL|K " => -- call + if iphase = 0 then + result.pc_load := '1'; + result.stk_push := '1'; + end if; + when "RET " => -- return + if iphase = 0 then + result.pc_load := '1'; + result.stk_pop := '1'; + end if; + when "RETI " => -- return + result.pc_inc := '0'; + result.int_exit := '1'; + + when others => null; -- nop + end case; + + return result; + + end idecoder; + + function gen_murom return murom_t is + variable result : murom_t; + variable opcode : opcode_t; + variable iphase : iphase_t; + variable addr : unsigned(MUCODE_ADDR_WIDTH-1 downto 0); + variable status : cpu_status_t; + variable pos : integer := 0; + + begin + for i in 0 to 2**addr'length-1 loop + addr := to_unsigned(i, addr'length); + opcode := addr(opcode'length-1 downto 0); + pos := opcode'length; + iphase := 0; + if addr(pos) = '1' then + iphase := 1; + end if; + pos := pos + 1; + status.alu.zero := addr(pos); + pos := pos + 1; + status.alu.carry := addr(pos); + pos := pos + 1; + status.xmem_wait := addr(pos); + + result(i) := idecoder(opcode, iphase, status); + end loop; + + return result; + end gen_murom; + + function get_muromaddr (opcode : opcode_t; iphase : iphase_t; status : cpu_status_t) return unsigned is + variable addr : unsigned(MUCODE_ADDR_WIDTH-1 downto 0); + begin + addr := status.xmem_wait & status.alu.carry & status.alu.zero & to_unsigned(iphase, 1) & opcode; + return addr; + + end get_muromaddr; + + ------------------------------------------------------------- + function MIN (X, Y: INTEGER) return INTEGER is + variable res : integer := X; + begin + if Y < X then + res := Y; + end if; + + return res; + + end MIN; + + ------------------------------------------------------------- + function MAX (X, Y: INTEGER) return INTEGER is + variable res : integer := X; + begin + if Y > X then + res := Y; + end if; + + return res; + + end MAX; + + +end cpu_pkg; + diff --git a/lib/CPUs/JCpu/src/core/dpath_ctrl.vhd b/lib/CPUs/JCpu/src/core/dpath_ctrl.vhd new file mode 100644 index 0000000..1610d00 --- /dev/null +++ b/lib/CPUs/JCpu/src/core/dpath_ctrl.vhd @@ -0,0 +1,87 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The datapath controller +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity dpath_ctrl is + Generic ( + use_rom : boolean := true + ); + Port ( + inst_in : in inst_t; + iphase_in : in iphase_t; + status_in : in cpu_status_t; + ctrl_out : out dpath_ctrl_out_t; + idout : out inst_addr_t; + ddout : out dmem_data_t + ); +end dpath_ctrl; + +architecture Behavioral of dpath_ctrl is + + signal opcode : opcode_t; + signal ctrl_lines : ctrl_lines_t; + signal dbg_iname : instr_name_t; + +begin + + idout <= inst_in(IMEM_ADDR_WIDTH-1 downto 0); + ddout <= inst_in(REG_SIZE_BITS+DMEM_DATA_WIDTH-1 downto REG_SIZE_BITS); + opcode <= inst_in(IMEM_DATA_WIDTH-1 downto IMEM_DATA_WIDTH-INST_OPCODE_WIDTH); + + ctrl_out.reg_a_ptr <= inst_in(reg_ptr_t'length-1 downto 0); + ctrl_out.reg_b_ptr <= inst_in(2*(reg_ptr_t'length)-1 downto reg_ptr_t'length); + ctrl_out.lines <= ctrl_lines; + + -- pragma translate_off + dbg_iname <= instr_name_array(to_integer(opcode)); + -- pragma translate_on + +gen_ctrl_rom: +if use_rom = true generate + + i_dec: + process(opcode, iphase_in, status_in) + constant rom_data : murom_t := gen_murom; + variable addr : unsigned(MUCODE_ADDR_WIDTH-1 downto 0); + begin + addr := get_muromaddr(opcode, iphase_in, status_in); + ctrl_lines <= rom_data(to_integer(addr)); + end process; +end generate; + +gen_ctrl: +if use_rom = false generate + i_dec: + process (opcode, iphase_in, status_in) + begin + ctrl_lines <= idecoder(opcode, iphase_in, status_in); + end process; +end generate; + +end Behavioral; + diff --git a/lib/CPUs/JCpu/src/core/int_ctrl.vhd b/lib/CPUs/JCpu/src/core/int_ctrl.vhd new file mode 100644 index 0000000..2e54d67 --- /dev/null +++ b/lib/CPUs/JCpu/src/core/int_ctrl.vhd @@ -0,0 +1,177 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: Interrupt controller +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity int_ctrl is + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ctrl_in : in int_ctrl_in_t; + int_in : in STD_LOGIC; + int_exit : in STD_LOGIC; + iphase_in : in iphase_t; + pc_addr_out : out inst_addr_t; + int_ack_out : out STD_LOGIC; + stat_save_out : out STD_LOGIC; + stat_rest_out : out STD_LOGIC; + pc_load_out : out STD_LOGIC; + stk_push_out : out STD_LOGIC; + stk_pop_out : out STD_LOGIC + ); +end int_ctrl; + +architecture Behavioral of int_ctrl is + + type int_state_t is (int_idle, int_inject, int_active, int_release); + type pin_state_t is (pin_s0, pin_s1, pin_s2); + + signal int_state, int_state_next : int_state_t; + signal pin_state, pin_state_next : pin_state_t; + signal pc_load, int_ack, stk_push, stk_pop : STD_LOGIC; + signal int_request : std_logic; + signal int_sampled : std_logic; + +begin + + int_ack_out <= int_ack; + pc_load_out <= pc_load; + stk_push_out <= stk_push; + stk_pop_out <= stk_pop; + +----------------------------------------------------------------------- +irg_ctrl_fsm: + process (int_state, iphase_in, int_request, int_exit) + begin + + pc_addr_out <= to_unsigned(1, inst_addr_t'length); + int_state_next <= int_state; + int_ack <= '0'; + pc_load <= '0'; + stk_push <= '0'; + stk_pop <= '0'; + + case int_state is + + when int_idle => + if int_request = '1' and iphase_in = 1 then + int_state_next <= int_inject; + end if; + when int_inject => + if iphase_in = 0 then + int_ack <= '1'; + pc_load <= '1'; + elsif iphase_in = 1 then + stk_push <= '1'; + int_state_next <= int_active; + end if; + when int_active => + if int_exit = '1' and iphase_in = 1 then + int_state_next <= int_release; + end if; + when int_release => + if iphase_in = 0 then + stk_pop <= '1'; + pc_load <= '1'; + elsif iphase_in = 1 then + int_state_next <= int_idle; + end if; + when others => + int_state_next <= int_idle; + end case; + + end process; + +irq_ctrl_states: + process (rst, clk, int_state_next) + begin + if rst = '1' then + int_state <= int_idle; + elsif rising_edge(clk) then + int_state <= int_state_next; + end if; + end process; + +----------------------------------------------------------------------- +pin_sample: + process (clk) + begin + if rising_edge(clk) then + int_sampled <= int_in xor (not ctrl_in.polarity); + end if; + end process; + +----------------------------------------------------------------------- +pin_fsm: + process (pin_state, int_sampled, int_ack, ctrl_in) + begin + int_request <= '0'; + pin_state_next <= pin_state; + case pin_state is + when pin_s0 => + if int_sampled = '1' or ctrl_in.request = '1' then + if ctrl_in.enable = '1' then + pin_state_next <= pin_s1; + end if; + end if; + when pin_s1 => + int_request <= '1'; + if int_ack = '1' then + pin_state_next <= pin_s2; + end if; + when pin_s2 => + if ctrl_in.edge_sens = '0' then + pin_state_next <= pin_s0; + elsif int_sampled = '0' then + pin_state_next <= pin_s0; + end if; + when others => + pin_state_next <= pin_s0; + end case; + end process; + +pin_states: + process (rst, clk, pin_state_next) + begin + if rst = '1' then + pin_state <= pin_s0; + elsif rising_edge(clk) then + pin_state <= pin_state_next; + end if; + end process; + +----------------------------------------------------------------------- +stat_save_restore: + process (clk, stk_push, stk_pop) + begin + if rising_edge(clk) then + stat_save_out <= stk_push; + stat_rest_out <= stk_pop; + end if; + end process; + +end Behavioral; diff --git a/lib/CPUs/JCpu/src/core/pc.vhd b/lib/CPUs/JCpu/src/core/pc.vhd new file mode 100644 index 0000000..6b1d575 --- /dev/null +++ b/lib/CPUs/JCpu/src/core/pc.vhd @@ -0,0 +1,70 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: Programm counter +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity pc is + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + inc : in STD_LOGIC; + load : in STD_LOGIC; + pc_in : in inst_addr_t; + pc_out : out inst_addr_t; + pc_next : out inst_addr_t + ); +end pc; + +architecture Behavioral of pc is + +begin + +proc_pc: + process(rst, clk, inc, load, pc_in) + variable vpc, vpc_reg: inst_addr_t; + begin + if rst = '1' then + vpc_reg := (others => '0'); + elsif rising_edge(clk) then + if inc = '1' or load = '1' then + vpc_reg := vpc; + elsif inc = '0' then + pc_next <= vpc; + end if; + end if; + + if load = '1' then + vpc := pc_in; + else + vpc := vpc_reg + 1; + end if; + pc_out <= vpc_reg; + + end process; + +end Behavioral; + diff --git a/lib/CPUs/JCpu/src/core/reg_dual.vhd b/lib/CPUs/JCpu/src/core/reg_dual.vhd new file mode 100644 index 0000000..6b7e4d8 --- /dev/null +++ b/lib/CPUs/JCpu/src/core/reg_dual.vhd @@ -0,0 +1,81 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: On-Chip work registers +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity reg_dual is + Generic ( + addr_width : integer := 3; + data_width : integer := 8 + ); + Port ( + clk : in STD_LOGIC; + we_a : in STD_LOGIC; + ptr_a : in reg_ptr_t; + ptr_b : in reg_ptr_t; + din_a : in unsigned (data_width-1 downto 0); + dout_a : out unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); +end reg_dual; + +architecture Behavioral of reg_dual is + + constant depth : integer := 2**addr_width; + type mem_t is array (0 to depth-1) of unsigned (data_width-1 downto 0); + signal addr_a, addr_b : unsigned (addr_width-1 downto 0) := (others => '0'); + + signal mem : mem_t; +begin + + addr_a <= TO_01(ptr_a(addr_width-1 downto 0)); + addr_b <= TO_01(ptr_b(addr_width-1 downto 0)); + +reg_in_ab: + process(clk) + begin + if rising_edge(clk) then + if we_a = '1' then + mem(to_integer(addr_a)) <= din_a; + end if; + end if; + end process; + +reg_out_a: + process(mem, addr_a) + begin + dout_a <= TO_01(mem(to_integer(addr_a))); + end process; + +reg_out_b: + process(mem, addr_b) + begin + dout_b <= TO_01(mem(to_integer(addr_b))); + end process; + +end Behavioral; + diff --git a/lib/CPUs/JCpu/src/core/stack_ctrl.vhd b/lib/CPUs/JCpu/src/core/stack_ctrl.vhd new file mode 100644 index 0000000..7eccae3 --- /dev/null +++ b/lib/CPUs/JCpu/src/core/stack_ctrl.vhd @@ -0,0 +1,73 @@ +-------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The call/return/data stack +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity stack_ctrl is +Generic ( + addr_width : integer := 3 +); +Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + push : in STD_LOGIC; + pop : in STD_LOGIC; + ptr_out : out unsigned (addr_width-1 downto 0); + din : in inst_addr_t; + dout : out inst_addr_t; + mem_we : out STD_LOGIC + ); +end stack_ctrl; + +architecture Behavioral of stack_ctrl is + + signal ptr : unsigned (addr_width-1 downto 0); + +begin + + ptr_out <= ptr; + +stk_ptr: + process(rst, clk, ptr, push, pop) + begin + if rst = '1' then + ptr <= (others => '0'); + dout <= (others => '0'); + mem_we <= '0'; + elsif rising_edge(clk) then + mem_we <= push; + if push = '1' then + ptr <= ptr + 1; + dout <= din; + elsif pop = '1' then + ptr <= ptr - 1; + end if; + end if; + end process; + +end Behavioral; + diff --git a/lib/CPUs/JCpu/src/cpu_embedded.vhd b/lib/CPUs/JCpu/src/cpu_embedded.vhd new file mode 100644 index 0000000..1990170 --- /dev/null +++ b/lib/CPUs/JCpu/src/cpu_embedded.vhd @@ -0,0 +1,109 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: cpu_embedded using cpu_core and rom +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.cpu_pkg.all; + +entity cpu_embedded is + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_wait : in STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + xmem_din : in unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_ADDR_WIDTH-1 downto 0); + io_sel : out STD_LOGIC + ); +end cpu_embedded; + +architecture rtl of cpu_embedded is + + signal irom_data : unsigned (IMEM_DATA_WIDTH-1 downto 0); + signal irom_addr : unsigned (IMEM_ADDR_WIDTH-1 downto 0); + + COMPONENT cpu + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_wait : in STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + instr_din : in unsigned (IMEM_DATA_WIDTH-1 downto 0); + instr_addr : out unsigned (IMEM_ADDR_WIDTH-1 downto 0); + xmem_din : in unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + io_sel : out STD_LOGIC + ); + END COMPONENT; + + + COMPONENT irom + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + END COMPONENT; + +begin + +inst_cpu: cpu + PORT MAP( + rst => rst, + clk => clk, + ce => ce, + int_in => int_in, + int_ack => int_ack, + xmem_wait => xmem_wait, + xmem_we => xmem_we, + xmem_re => xmem_re, + instr_din => irom_data, + instr_addr => irom_addr, + xmem_din => xmem_din, + xmem_dout => xmem_dout, + xmem_addr => xmem_addr, + io_sel => io_sel + ); + +inst_irom: irom + PORT MAP( + clk => clk, + ce => ce, + addr => irom_addr, + dout => irom_data + ); + +end rtl; diff --git a/lib/CPUs/JCpu/src/dctest_irom.vhdl b/lib/CPUs/JCpu/src/dctest_irom.vhdl new file mode 100644 index 0000000..7987a15 --- /dev/null +++ b/lib/CPUs/JCpu/src/dctest_irom.vhdl @@ -0,0 +1,79 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.cpu_pkg.all; + +-- JASM_ROM_INSERT_HERE +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); +END irom; + +ARCHITECTURE dctest OF irom IS + + type imem_rom_t is array (0 to 17) of inst_t; + + -- Assembled from dctest.jsm + constant imem_rom : imem_rom_t := + ( + "110000" & X"010", -- 0x000: JMP 0x010 + "110000" & X"011", -- 0x001: JMP 0x011 + "000000" & X"000", -- 0x002: + "000000" & X"000", -- 0x003: + "000000" & X"000", -- 0x004: + "000000" & X"000", -- 0x005: + "000000" & X"000", -- 0x006: + "000000" & X"000", -- 0x007: + "000000" & X"000", -- 0x008: + "000000" & X"000", -- 0x009: + "000000" & X"000", -- 0x00A: + "000000" & X"000", -- 0x00B: + "000000" & X"000", -- 0x00C: + "000000" & X"000", -- 0x00D: + "000000" & X"000", -- 0x00E: + "000000" & X"000", -- 0x00F: + "110000" & X"010", -- 0x010: JMP 0x010 + "111111" & X"000" -- 0x011: RETI + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +end dctest; + diff --git a/lib/CPUs/JCpu/src/dctest_irom_ld.vhdl b/lib/CPUs/JCpu/src/dctest_irom_ld.vhdl new file mode 100644 index 0000000..223dd46 --- /dev/null +++ b/lib/CPUs/JCpu/src/dctest_irom_ld.vhdl @@ -0,0 +1,1181 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from dctest.jsm + type imem_rom_t is array (0 to 1023) of inst_t; + signal imem_rom : imem_rom_t := + ( + "110000" & X"010", -- 0x000: JMP 0x010 + "110000" & X"011", -- 0x001: JMP 0x011 + "000000" & X"000", -- 0x002: + "000000" & X"000", -- 0x003: + "000000" & X"000", -- 0x004: + "000000" & X"000", -- 0x005: + "000000" & X"000", -- 0x006: + "000000" & X"000", -- 0x007: + "000000" & X"000", -- 0x008: + "000000" & X"000", -- 0x009: + "000000" & X"000", -- 0x00A: + "000000" & X"000", -- 0x00B: + "000000" & X"000", -- 0x00C: + "000000" & X"000", -- 0x00D: + "000000" & X"000", -- 0x00E: + "000000" & X"000", -- 0x00F: + "110000" & X"010", -- 0x010: JMP 0x010 + "111111" & X"000", -- 0x011: RETI + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000" + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/JCpu/src/dctest_xrom.vhdl b/lib/CPUs/JCpu/src/dctest_xrom.vhdl new file mode 100644 index 0000000..24fe36c --- /dev/null +++ b/lib/CPUs/JCpu/src/dctest_xrom.vhdl @@ -0,0 +1,317 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.cpu_pkg.all; + +-- JASM_ROM_INSERT_HERE +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE dctest OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from dctest.jsm + constant xmem_rom : xmem_rom_t := + ( + X"00", -- 0x00 + X"00", -- 0x01 + X"00", -- 0x02 + X"00", -- 0x03 + X"01", -- 0x04 + X"12", -- 0x05 + X"41", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"48", -- 0x17 + X"61", -- 0x18 + X"6C", -- 0x19 + X"6C", -- 0x1A + X"6F", -- 0x1B + X"0D", -- 0x1C + X"0A", -- 0x1D + X"00", -- 0x1E + X"4A", -- 0x1F + X"65", -- 0x20 + X"6E", -- 0x21 + X"73", -- 0x22 + X"00", -- 0x23 + X"57", -- 0x24 + X"65", -- 0x25 + X"6C", -- 0x26 + X"63", -- 0x27 + X"6F", -- 0x28 + X"6D", -- 0x29 + X"65", -- 0x2A + X"20", -- 0x2B + X"74", -- 0x2C + X"6F", -- 0x2D + X"20", -- 0x2E + X"4A", -- 0x2F + X"41", -- 0x30 + X"53", -- 0x31 + X"4D", -- 0x32 + X"20", -- 0x33 + X"43", -- 0x34 + X"50", -- 0x35 + X"55", -- 0x36 + X"00", -- 0x37 + X"52", -- 0x38 + X"65", -- 0x39 + X"61", -- 0x3A + X"64", -- 0x3B + X"79", -- 0x3C + X"00", -- 0x3D + X"54", -- 0x3E + X"65", -- 0x3F + X"73", -- 0x40 + X"74", -- 0x41 + X"69", -- 0x42 + X"6E", -- 0x43 + X"67", -- 0x44 + X"00", -- 0x45 + X"50", -- 0x46 + X"61", -- 0x47 + X"73", -- 0x48 + X"73", -- 0x49 + X"65", -- 0x4A + X"64", -- 0x4B + X"00", -- 0x4C + X"45", -- 0x4D + X"72", -- 0x4E + X"72", -- 0x4F + X"6F", -- 0x50 + X"72", -- 0x51 + X"00", -- 0x52 + X"0D", -- 0x53 + X"0A", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end dctest; + diff --git a/lib/CPUs/JCpu/src/dctest_xrom_ld.vhdl b/lib/CPUs/JCpu/src/dctest_xrom_ld.vhdl new file mode 100644 index 0000000..802ba50 --- /dev/null +++ b/lib/CPUs/JCpu/src/dctest_xrom_ld.vhdl @@ -0,0 +1,413 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from dctest.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"00", -- 0x00 + X"00", -- 0x01 + X"00", -- 0x02 + X"00", -- 0x03 + X"01", -- 0x04 + X"12", -- 0x05 + X"41", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"48", -- 0x17 + X"61", -- 0x18 + X"6C", -- 0x19 + X"6C", -- 0x1A + X"6F", -- 0x1B + X"0D", -- 0x1C + X"0A", -- 0x1D + X"00", -- 0x1E + X"4A", -- 0x1F + X"65", -- 0x20 + X"6E", -- 0x21 + X"73", -- 0x22 + X"00", -- 0x23 + X"57", -- 0x24 + X"65", -- 0x25 + X"6C", -- 0x26 + X"63", -- 0x27 + X"6F", -- 0x28 + X"6D", -- 0x29 + X"65", -- 0x2A + X"20", -- 0x2B + X"74", -- 0x2C + X"6F", -- 0x2D + X"20", -- 0x2E + X"4A", -- 0x2F + X"41", -- 0x30 + X"53", -- 0x31 + X"4D", -- 0x32 + X"20", -- 0x33 + X"43", -- 0x34 + X"50", -- 0x35 + X"55", -- 0x36 + X"00", -- 0x37 + X"52", -- 0x38 + X"65", -- 0x39 + X"61", -- 0x3A + X"64", -- 0x3B + X"79", -- 0x3C + X"00", -- 0x3D + X"54", -- 0x3E + X"65", -- 0x3F + X"73", -- 0x40 + X"74", -- 0x41 + X"69", -- 0x42 + X"6E", -- 0x43 + X"67", -- 0x44 + X"00", -- 0x45 + X"50", -- 0x46 + X"61", -- 0x47 + X"73", -- 0x48 + X"73", -- 0x49 + X"65", -- 0x4A + X"64", -- 0x4B + X"00", -- 0x4C + X"45", -- 0x4D + X"72", -- 0x4E + X"72", -- 0x4F + X"6F", -- 0x50 + X"72", -- 0x51 + X"00", -- 0x52 + X"0D", -- 0x53 + X"0A", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/JCpu/src/itest_irom.vhdl b/lib/CPUs/JCpu/src/itest_irom.vhdl new file mode 100644 index 0000000..94609a3 --- /dev/null +++ b/lib/CPUs/JCpu/src/itest_irom.vhdl @@ -0,0 +1,1089 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.types_pkg.all; + +-- JASM_ROM_INSERT_HERE +ENTITY irom IS + Generic + ( + depth : integer := 4 + ); + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in addr_t; + dout : out word_t + ); +END irom; + +ARCHITECTURE itest OF irom IS + + type imem_rom_t is array (0 to depth-1) of word_t; + + -- Assembled from itest.jsm + constant imem_rom : imem_rom_t := + ( + "110000" & X"010", -- 0x000: JMP 0x010 + "110000" & X"288", -- 0x001: JMP 0x288 + "000000" & X"000", -- 0x002: + "000000" & X"000", -- 0x003: + "000000" & X"000", -- 0x004: + "000000" & X"000", -- 0x005: + "000000" & X"000", -- 0x006: + "000000" & X"000", -- 0x007: + "000000" & X"000", -- 0x008: + "000000" & X"000", -- 0x009: + "000000" & X"000", -- 0x00A: + "000000" & X"000", -- 0x00B: + "000000" & X"000", -- 0x00C: + "000000" & X"000", -- 0x00D: + "000000" & X"000", -- 0x00E: + "000000" & X"000", -- 0x00F: + "111011" & X"03B", -- 0x010: CALL 0x03B + "101001" & X"000", -- 0x011: CIN R00, (0x00) + "100100" & X"000", -- 0x012: XOUT (0x00), R00 + "111011" & X"04C", -- 0x013: CALL 0x04C + "000011" & X"010", -- 0x014: MOV R00, 0x01 + "100100" & X"010", -- 0x015: XOUT (0x01), R00 + "111011" & X"08D", -- 0x016: CALL 0x08D + "000011" & X"020", -- 0x017: MOV R00, 0x02 + "100100" & X"010", -- 0x018: XOUT (0x01), R00 + "111011" & X"0C9", -- 0x019: CALL 0x0C9 + "000011" & X"030", -- 0x01A: MOV R00, 0x03 + "100100" & X"010", -- 0x01B: XOUT (0x01), R00 + "111011" & X"0DB", -- 0x01C: CALL 0x0DB + "000011" & X"040", -- 0x01D: MOV R00, 0x04 + "100100" & X"010", -- 0x01E: XOUT (0x01), R00 + "111011" & X"0ED", -- 0x01F: CALL 0x0ED + "000011" & X"050", -- 0x020: MOV R00, 0x05 + "100100" & X"010", -- 0x021: XOUT (0x01), R00 + "111011" & X"0FF", -- 0x022: CALL 0x0FF + "000011" & X"060", -- 0x023: MOV R00, 0x06 + "100100" & X"010", -- 0x024: XOUT (0x01), R00 + "111011" & X"115", -- 0x025: CALL 0x115 + "000011" & X"070", -- 0x026: MOV R00, 0x07 + "100100" & X"010", -- 0x027: XOUT (0x01), R00 + "111011" & X"12B", -- 0x028: CALL 0x12B + "000011" & X"080", -- 0x029: MOV R00, 0x08 + "100100" & X"010", -- 0x02A: XOUT (0x01), R00 + "111011" & X"137", -- 0x02B: CALL 0x137 + "000011" & X"090", -- 0x02C: MOV R00, 0x09 + "100100" & X"010", -- 0x02D: XOUT (0x01), R00 + "111011" & X"15A", -- 0x02E: CALL 0x15A + "000011" & X"0A0", -- 0x02F: MOV R00, 0x0A + "100100" & X"010", -- 0x030: XOUT (0x01), R00 + "111011" & X"22A", -- 0x031: CALL 0x22A + "000011" & X"0B0", -- 0x032: MOV R00, 0x0B + "100100" & X"010", -- 0x033: XOUT (0x01), R00 + "111011" & X"24D", -- 0x034: CALL 0x24D + "000011" & X"0C0", -- 0x035: MOV R00, 0x0C + "100100" & X"010", -- 0x036: XOUT (0x01), R00 + "111011" & X"278", -- 0x037: CALL 0x278 + "000011" & X"FF0", -- 0x038: MOV R00, 0xFF + "100100" & X"010", -- 0x039: XOUT (0x01), R00 + "110000" & X"2FF", -- 0x03A: JMP 0x2FF + "000011" & X"000", -- 0x03B: MOV R00, 0x00 + "000011" & X"001", -- 0x03C: MOV R01, 0x00 + "000011" & X"002", -- 0x03D: MOV R02, 0x00 + "000011" & X"003", -- 0x03E: MOV R03, 0x00 + "000011" & X"004", -- 0x03F: MOV R04, 0x00 + "000011" & X"005", -- 0x040: MOV R05, 0x00 + "000011" & X"006", -- 0x041: MOV R06, 0x00 + "000011" & X"007", -- 0x042: MOV R07, 0x00 + "000011" & X"008", -- 0x043: MOV R08, 0x00 + "000011" & X"009", -- 0x044: MOV R09, 0x00 + "000011" & X"00A", -- 0x045: MOV R10, 0x00 + "000011" & X"00B", -- 0x046: MOV R11, 0x00 + "000011" & X"00C", -- 0x047: MOV R12, 0x00 + "000011" & X"00D", -- 0x048: MOV R13, 0x00 + "000011" & X"00E", -- 0x049: MOV R14, 0x00 + "000011" & X"00F", -- 0x04A: MOV R15, 0x00 + "111110" & X"000", -- 0x04B: RET + "000011" & X"100", -- 0x04C: MOV R00, 0x10 + "001111" & X"100", -- 0x04D: CMP R00, 0x10 + "111010" & X"3FF", -- 0x04E: JNE 0x3FF + "010001" & X"010", -- 0x04F: ADD R00, 0x01 + "000010" & X"001", -- 0x050: MOV R01, R00 + "001111" & X"111", -- 0x051: CMP R01, 0x11 + "111010" & X"3FF", -- 0x052: JNE 0x3FF + "010001" & X"011", -- 0x053: ADD R01, 0x01 + "000010" & X"012", -- 0x054: MOV R02, R01 + "001111" & X"122", -- 0x055: CMP R02, 0x12 + "111010" & X"3FF", -- 0x056: JNE 0x3FF + "010001" & X"012", -- 0x057: ADD R02, 0x01 + "000010" & X"023", -- 0x058: MOV R03, R02 + "001111" & X"133", -- 0x059: CMP R03, 0x13 + "111010" & X"3FF", -- 0x05A: JNE 0x3FF + "010001" & X"013", -- 0x05B: ADD R03, 0x01 + "000010" & X"034", -- 0x05C: MOV R04, R03 + "001111" & X"144", -- 0x05D: CMP R04, 0x14 + "111010" & X"3FF", -- 0x05E: JNE 0x3FF + "010001" & X"014", -- 0x05F: ADD R04, 0x01 + "000010" & X"045", -- 0x060: MOV R05, R04 + "001111" & X"155", -- 0x061: CMP R05, 0x15 + "111010" & X"3FF", -- 0x062: JNE 0x3FF + "010001" & X"015", -- 0x063: ADD R05, 0x01 + "000010" & X"056", -- 0x064: MOV R06, R05 + "001111" & X"166", -- 0x065: CMP R06, 0x16 + "111010" & X"3FF", -- 0x066: JNE 0x3FF + "010001" & X"016", -- 0x067: ADD R06, 0x01 + "000010" & X"067", -- 0x068: MOV R07, R06 + "001111" & X"177", -- 0x069: CMP R07, 0x17 + "111010" & X"3FF", -- 0x06A: JNE 0x3FF + "010001" & X"017", -- 0x06B: ADD R07, 0x01 + "000010" & X"078", -- 0x06C: MOV R08, R07 + "001111" & X"188", -- 0x06D: CMP R08, 0x18 + "111010" & X"3FF", -- 0x06E: JNE 0x3FF + "010001" & X"018", -- 0x06F: ADD R08, 0x01 + "000010" & X"089", -- 0x070: MOV R09, R08 + "001111" & X"199", -- 0x071: CMP R09, 0x19 + "111010" & X"3FF", -- 0x072: JNE 0x3FF + "010001" & X"019", -- 0x073: ADD R09, 0x01 + "000010" & X"09A", -- 0x074: MOV R10, R09 + "001111" & X"1AA", -- 0x075: CMP R10, 0x1A + "111010" & X"3FF", -- 0x076: JNE 0x3FF + "010001" & X"01A", -- 0x077: ADD R10, 0x01 + "000010" & X"0AB", -- 0x078: MOV R11, R10 + "001111" & X"1BB", -- 0x079: CMP R11, 0x1B + "111010" & X"3FF", -- 0x07A: JNE 0x3FF + "010001" & X"01B", -- 0x07B: ADD R11, 0x01 + "000010" & X"0BC", -- 0x07C: MOV R12, R11 + "001111" & X"1CC", -- 0x07D: CMP R12, 0x1C + "111010" & X"3FF", -- 0x07E: JNE 0x3FF + "010001" & X"01C", -- 0x07F: ADD R12, 0x01 + "000010" & X"0CD", -- 0x080: MOV R13, R12 + "001111" & X"1DD", -- 0x081: CMP R13, 0x1D + "111010" & X"3FF", -- 0x082: JNE 0x3FF + "010001" & X"01D", -- 0x083: ADD R13, 0x01 + "000010" & X"0DE", -- 0x084: MOV R14, R13 + "001111" & X"1EE", -- 0x085: CMP R14, 0x1E + "111010" & X"3FF", -- 0x086: JNE 0x3FF + "010001" & X"01E", -- 0x087: ADD R14, 0x01 + "000010" & X"0EF", -- 0x088: MOV R15, R14 + "001111" & X"1FF", -- 0x089: CMP R15, 0x1F + "111010" & X"3FF", -- 0x08A: JNE 0x3FF + "010001" & X"01F", -- 0x08B: ADD R15, 0x01 + "111110" & X"000", -- 0x08C: RET + "000011" & X"000", -- 0x08D: MOV R00, 0x00 + "001111" & X"000", -- 0x08E: TST R00 + "110010" & X"3FF", -- 0x08F: JNZ 0x3FF + "110011" & X"3FF", -- 0x090: JC 0x3FF + "001111" & X"000", -- 0x091: CMP R00, 0x00 + "111010" & X"3FF", -- 0x092: JNE 0x3FF + "110101" & X"3FF", -- 0x093: JLT 0x3FF + "110110" & X"3FF", -- 0x094: JGT 0x3FF + "110111" & X"097", -- 0x095: JLE 0x097 + "110000" & X"3FF", -- 0x096: JMP 0x3FF + "111001" & X"099", -- 0x097: JEQ 0x099 + "110000" & X"3FF", -- 0x098: JMP 0x3FF + "111000" & X"09B", -- 0x099: JGE 0x09B + "110000" & X"3FF", -- 0x09A: JMP 0x3FF + "001111" & X"550", -- 0x09B: CMP R00, 0x55 + "111001" & X"3FF", -- 0x09C: JEQ 0x3FF + "110101" & X"09F", -- 0x09D: JLT 0x09F + "110000" & X"3FF", -- 0x09E: JMP 0x3FF + "110111" & X"0A1", -- 0x09F: JLE 0x0A1 + "110000" & X"3FF", -- 0x0A0: JMP 0x3FF + "111000" & X"3FF", -- 0x0A1: JGE 0x3FF + "110110" & X"3FF", -- 0x0A2: JGT 0x3FF + "000011" & X"550", -- 0x0A3: MOV R00, 0x55 + "001111" & X"000", -- 0x0A4: TST R00 + "110001" & X"3FF", -- 0x0A5: JZ 0x3FF + "110011" & X"3FF", -- 0x0A6: JC 0x3FF + "001111" & X"AA0", -- 0x0A7: CMP R00, 0xAA + "111001" & X"3FF", -- 0x0A8: JEQ 0x3FF + "111010" & X"0AB", -- 0x0A9: JNE 0x0AB + "110000" & X"3FF", -- 0x0AA: JMP 0x3FF + "110101" & X"0AD", -- 0x0AB: JLT 0x0AD + "110000" & X"3FF", -- 0x0AC: JMP 0x3FF + "110111" & X"0AF", -- 0x0AD: JLE 0x0AF + "110000" & X"3FF", -- 0x0AE: JMP 0x3FF + "110110" & X"3FF", -- 0x0AF: JGT 0x3FF + "001111" & X"550", -- 0x0B0: CMP R00, 0x55 + "111001" & X"0B3", -- 0x0B1: JEQ 0x0B3 + "110000" & X"3FF", -- 0x0B2: JMP 0x3FF + "111010" & X"3FF", -- 0x0B3: JNE 0x3FF + "110101" & X"3FF", -- 0x0B4: JLT 0x3FF + "110111" & X"0B7", -- 0x0B5: JLE 0x0B7 + "110000" & X"3FF", -- 0x0B6: JMP 0x3FF + "110110" & X"3FF", -- 0x0B7: JGT 0x3FF + "111000" & X"0BA", -- 0x0B8: JGE 0x0BA + "110000" & X"3FF", -- 0x0B9: JMP 0x3FF + "000011" & X"AA0", -- 0x0BA: MOV R00, 0xAA + "001111" & X"000", -- 0x0BB: TST R00 + "110001" & X"3FF", -- 0x0BC: JZ 0x3FF + "110011" & X"3FF", -- 0x0BD: JC 0x3FF + "001111" & X"550", -- 0x0BE: CMP R00, 0x55 + "111001" & X"3FF", -- 0x0BF: JEQ 0x3FF + "111010" & X"0C2", -- 0x0C0: JNE 0x0C2 + "110000" & X"3FF", -- 0x0C1: JMP 0x3FF + "110110" & X"0C4", -- 0x0C2: JGT 0x0C4 + "110000" & X"3FF", -- 0x0C3: JMP 0x3FF + "111000" & X"0C6", -- 0x0C4: JGE 0x0C6 + "110000" & X"3FF", -- 0x0C5: JMP 0x3FF + "110101" & X"3FF", -- 0x0C6: JLT 0x3FF + "110111" & X"3FF", -- 0x0C7: JLE 0x3FF + "111110" & X"000", -- 0x0C8: RET + "000011" & X"000", -- 0x0C9: MOV R00, 0x00 + "000011" & X"001", -- 0x0CA: MOV R01, 0x00 + "000010" & X"002", -- 0x0CB: MOV R02, R00 + "000010" & X"013", -- 0x0CC: MOV R03, R01 + "010001" & X"010", -- 0x0CD: ADD R00, 0x01 + "010011" & X"001", -- 0x0CE: ADDC R01, 0x00 + "010001" & X"012", -- 0x0CF: ADD R02, 0x01 + "001111" & X"002", -- 0x0D0: CMP R02, 0x00 + "111010" & X"0D4", -- 0x0D1: JNE 0x0D4 + "010001" & X"013", -- 0x0D2: ADD R03, 0x01 + "001111" & X"023", -- 0x0D3: CMP R03, 0x02 + "111010" & X"0CD", -- 0x0D4: JNE 0x0CD + "001110" & X"020", -- 0x0D5: CMP R00, R02 + "111010" & X"3FF", -- 0x0D6: JNE 0x3FF + "001110" & X"031", -- 0x0D7: CMP R01, R03 + "111010" & X"3FF", -- 0x0D8: JNE 0x3FF + "000011" & X"000", -- 0x0D9: MOV R00, 0x00 + "111110" & X"000", -- 0x0DA: RET + "000011" & X"000", -- 0x0DB: MOV R00, 0x00 + "000011" & X"031", -- 0x0DC: MOV R01, 0x03 + "000010" & X"002", -- 0x0DD: MOV R02, R00 + "000010" & X"013", -- 0x0DE: MOV R03, R01 + "010101" & X"010", -- 0x0DF: SUB R00, 0x01 + "010111" & X"001", -- 0x0E0: SUBC R01, 0x00 + "010101" & X"012", -- 0x0E1: SUB R02, 0x01 + "001111" & X"FF2", -- 0x0E2: CMP R02, 0xFF + "111010" & X"0E6", -- 0x0E3: JNE 0x0E6 + "010101" & X"013", -- 0x0E4: SUB R03, 0x01 + "001111" & X"003", -- 0x0E5: CMP R03, 0x00 + "111010" & X"0DF", -- 0x0E6: JNE 0x0DF + "001110" & X"020", -- 0x0E7: CMP R00, R02 + "111010" & X"3FF", -- 0x0E8: JNE 0x3FF + "001110" & X"031", -- 0x0E9: CMP R01, R03 + "111010" & X"3FF", -- 0x0EA: JNE 0x3FF + "000011" & X"000", -- 0x0EB: MOV R00, 0x00 + "111110" & X"000", -- 0x0EC: RET + "000011" & X"030", -- 0x0ED: MOV R00, 0x03 + "000011" & X"051", -- 0x0EE: MOV R01, 0x05 + "101110" & X"050", -- 0x0EF: SUB 0x05, R00 + "010101" & X"031", -- 0x0F0: SUB R01, 0x03 + "001110" & X"010", -- 0x0F1: CMP R00, R01 + "111010" & X"3FF", -- 0x0F2: JNE 0x3FF + "000011" & X"030", -- 0x0F3: MOV R00, 0x03 + "000011" & X"051", -- 0x0F4: MOV R01, 0x05 + "010100" & X"010", -- 0x0F5: SUB R00, R01 + "101111" & X"000", -- 0x0F6: SUBC 0x00, R00 + "001111" & X"010", -- 0x0F7: CMP R00, 0x01 + "111010" & X"3FF", -- 0x0F8: JNE 0x3FF + "010001" & X"000", -- 0x0F9: ADD R00, 0x00 + "010110" & X"001", -- 0x0FA: SUBC R01, R00 + "001111" & X"041", -- 0x0FB: CMP R01, 0x04 + "111010" & X"3FF", -- 0x0FC: JNE 0x3FF + "000011" & X"000", -- 0x0FD: MOV R00, 0x00 + "111110" & X"000", -- 0x0FE: RET + "000011" & X"010", -- 0x0FF: MOV R00, 0x01 + "001101" & X"5A0", -- 0x100: MOVC (0x5A), R00 + "010101" & X"010", -- 0x101: DEC R00 + "001101" & X"000", -- 0x102: MOVC (0x00), R00 + "001010" & X"5A1", -- 0x103: MOVC R01, (0x5A) + "001100" & X"A51", -- 0x104: MOVC (R01), 0xA5 + "001001" & X"010", -- 0x105: MOVC R00, (R01) + "001001" & X"011", -- 0x106: MOVC R01, (R01) + "010001" & X"5A1", -- 0x107: ADD R01, 0x5A + "001001" & X"010", -- 0x108: MOVC R00, (R01) + "001011" & X"000", -- 0x109: MOVC (R00), R00 + "001001" & X"002", -- 0x10A: MOVC R02, (R00) + "001110" & X"002", -- 0x10B: CMP R02, R00 + "111010" & X"3FF", -- 0x10C: JNE 0x3FF + "001011" & X"021", -- 0x10D: MOVC (R01), R02 + "001001" & X"022", -- 0x10E: MOVC R02, (R02) + "001110" & X"012", -- 0x10F: CMP R02, R01 + "111010" & X"3FF", -- 0x110: JNE 0x3FF + "010101" & X"011", -- 0x111: DEC R01 + "010001" & X"010", -- 0x112: INC R00 + "110010" & X"109", -- 0x113: JNZ 0x109 + "111110" & X"000", -- 0x114: RET + "000011" & X"010", -- 0x115: MOV R00, 0x01 + "001000" & X"600", -- 0x116: MOVX (0x60), R00 + "010101" & X"010", -- 0x117: DEC R00 + "001000" & X"060", -- 0x118: MOVX (0x06), R00 + "000101" & X"601", -- 0x119: MOVX R01, (0x60) + "000111" & X"A51", -- 0x11A: MOVX (R01), 0xA5 + "000100" & X"010", -- 0x11B: MOVX R00, (R01) + "000100" & X"011", -- 0x11C: MOVX R01, (R01) + "010001" & X"5A1", -- 0x11D: ADD R01, 0x5A + "000100" & X"010", -- 0x11E: MOVX R00, (R01) + "000110" & X"000", -- 0x11F: MOVX (R00), R00 + "000100" & X"002", -- 0x120: MOVX R02, (R00) + "001110" & X"002", -- 0x121: CMP R02, R00 + "111010" & X"3FF", -- 0x122: JNE 0x3FF + "000110" & X"021", -- 0x123: MOVX (R01), R02 + "000100" & X"022", -- 0x124: MOVX R02, (R02) + "001110" & X"012", -- 0x125: CMP R02, R01 + "111010" & X"3FF", -- 0x126: JNE 0x3FF + "010101" & X"011", -- 0x127: DEC R01 + "010001" & X"010", -- 0x128: INC R00 + "110010" & X"11F", -- 0x129: JNZ 0x11F + "111110" & X"000", -- 0x12A: RET + "000011" & X"AA0", -- 0x12B: MOV R00, 0xAA + "000011" & X"001", -- 0x12C: MOV R01, 0x00 + "111100" & X"000", -- 0x12D: PUSH R00 + "010001" & X"010", -- 0x12E: INC R00 + "010101" & X"011", -- 0x12F: DEC R01 + "110010" & X"12D", -- 0x130: JNZ 0x12D + "111101" & X"000", -- 0x131: POP R00 + "010101" & X"011", -- 0x132: DEC R01 + "110010" & X"131", -- 0x133: JNZ 0x131 + "001111" & X"AA0", -- 0x134: CMP R00, 0xAA + "111010" & X"3FF", -- 0x135: JNE 0x3FF + "111110" & X"000", -- 0x136: RET + "000011" & X"550", -- 0x137: MOV R00, 0x55 + "111100" & X"000", -- 0x138: PUSH R00 + "000011" & X"000", -- 0x139: MOV R00, 0x00 + "000011" & X"FF1", -- 0x13A: MOV R01, 0xFF + "111011" & X"151", -- 0x13B: CALL 0x151 + "111101" & X"000", -- 0x13C: POP R00 + "001111" & X"550", -- 0x13D: CMP R00, 0x55 + "111010" & X"3FF", -- 0x13E: JNE 0x3FF + "000011" & X"010", -- 0x13F: MOV R00, 0x01 + "000011" & X"481", -- 0x140: MOV R01, 0x48 + "100110" & X"050", -- 0x141: COUT (0x05), R00 + "111100" & X"001", -- 0x142: PUSH R01 + "000011" & X"000", -- 0x143: MOV R00, 0x00 + "000011" & X"3B1", -- 0x144: MOV R01, 0x3B + "100110" & X"050", -- 0x145: COUT (0x05), R00 + "111100" & X"001", -- 0x146: PUSH R01 + "111110" & X"000", -- 0x147: RET + "000011" & X"010", -- 0x148: MOV R00, 0x01 + "000011" & X"501", -- 0x149: MOV R01, 0x50 + "100110" & X"050", -- 0x14A: COUT (0x05), R00 + "111100" & X"001", -- 0x14B: PUSH R01 + "000011" & X"000", -- 0x14C: MOV R00, 0x00 + "000011" & X"3B1", -- 0x14D: MOV R01, 0x3B + "100110" & X"050", -- 0x14E: COUT (0x05), R00 + "111100" & X"001", -- 0x14F: PUSH R01 + "111110" & X"000", -- 0x150: RET + "001110" & X"010", -- 0x151: CMP R00, R01 + "111001" & X"155", -- 0x152: JEQ 0x155 + "010001" & X"010", -- 0x153: INC R00 + "110000" & X"158", -- 0x154: JMP 0x158 + "010101" & X"010", -- 0x155: DEC R00 + "010101" & X"011", -- 0x156: DEC R01 + "111110" & X"000", -- 0x157: RET + "111011" & X"151", -- 0x158: CALL 0x151 + "110000" & X"155", -- 0x159: JMP 0x155 + "000011" & X"A50", -- 0x15A: MOV R00, 0xA5 + "000011" & X"5A1", -- 0x15B: MOV R01, 0x5A + "101010" & X"000", -- 0x15C: SWAP R00 + "001111" & X"5A0", -- 0x15D: CMP R00, 0x5A + "111010" & X"3FF", -- 0x15E: JNE 0x3FF + "101010" & X"000", -- 0x15F: SWAP R00 + "001111" & X"A50", -- 0x160: CMP R00, 0xA5 + "111010" & X"3FF", -- 0x161: JNE 0x3FF + "000011" & X"D20", -- 0x162: MOV R00, 0xD2 + "101010" & X"000", -- 0x163: SWAP R00 + "001111" & X"2D0", -- 0x164: CMP R00, 0x2D + "111010" & X"3FF", -- 0x165: JNE 0x3FF + "101010" & X"001", -- 0x166: SWAP R01 + "001111" & X"2D0", -- 0x167: CMP R00, 0x2D + "111010" & X"3FF", -- 0x168: JNE 0x3FF + "001111" & X"A51", -- 0x169: CMP R01, 0xA5 + "111010" & X"3FF", -- 0x16A: JNE 0x3FF + "000011" & X"2D0", -- 0x16B: MOV R00, 0x2D + "011110" & X"000", -- 0x16C: SHL R00 + "001111" & X"5A0", -- 0x16D: CMP R00, 0x5A + "111010" & X"3FF", -- 0x16E: JNE 0x3FF + "011110" & X"000", -- 0x16F: SHL R00 + "001111" & X"B40", -- 0x170: CMP R00, 0xB4 + "111010" & X"3FF", -- 0x171: JNE 0x3FF + "011110" & X"000", -- 0x172: SHL R00 + "001111" & X"680", -- 0x173: CMP R00, 0x68 + "111010" & X"3FF", -- 0x174: JNE 0x3FF + "011110" & X"000", -- 0x175: SHL R00 + "001111" & X"D00", -- 0x176: CMP R00, 0xD0 + "111010" & X"3FF", -- 0x177: JNE 0x3FF + "011110" & X"000", -- 0x178: SHL R00 + "001111" & X"A00", -- 0x179: CMP R00, 0xA0 + "111010" & X"3FF", -- 0x17A: JNE 0x3FF + "011110" & X"000", -- 0x17B: SHL R00 + "001111" & X"400", -- 0x17C: CMP R00, 0x40 + "111010" & X"3FF", -- 0x17D: JNE 0x3FF + "011110" & X"000", -- 0x17E: SHL R00 + "001111" & X"800", -- 0x17F: CMP R00, 0x80 + "111010" & X"3FF", -- 0x180: JNE 0x3FF + "011110" & X"000", -- 0x181: SHL R00 + "001111" & X"000", -- 0x182: CMP R00, 0x00 + "111010" & X"3FF", -- 0x183: JNE 0x3FF + "000011" & X"841", -- 0x184: MOV R01, 0x84 + "011111" & X"001", -- 0x185: SHR R01 + "001111" & X"421", -- 0x186: CMP R01, 0x42 + "111010" & X"3FF", -- 0x187: JNE 0x3FF + "011111" & X"001", -- 0x188: SHR R01 + "001111" & X"211", -- 0x189: CMP R01, 0x21 + "111010" & X"3FF", -- 0x18A: JNE 0x3FF + "011111" & X"001", -- 0x18B: SHR R01 + "001111" & X"101", -- 0x18C: CMP R01, 0x10 + "111010" & X"3FF", -- 0x18D: JNE 0x3FF + "011111" & X"001", -- 0x18E: SHR R01 + "001111" & X"081", -- 0x18F: CMP R01, 0x08 + "111010" & X"3FF", -- 0x190: JNE 0x3FF + "011111" & X"001", -- 0x191: SHR R01 + "001111" & X"041", -- 0x192: CMP R01, 0x04 + "111010" & X"3FF", -- 0x193: JNE 0x3FF + "011111" & X"001", -- 0x194: SHR R01 + "001111" & X"021", -- 0x195: CMP R01, 0x02 + "111010" & X"3FF", -- 0x196: JNE 0x3FF + "011111" & X"001", -- 0x197: SHR R01 + "001111" & X"011", -- 0x198: CMP R01, 0x01 + "111010" & X"3FF", -- 0x199: JNE 0x3FF + "011111" & X"001", -- 0x19A: SHR R01 + "001111" & X"001", -- 0x19B: CMP R01, 0x00 + "111010" & X"3FF", -- 0x19C: JNE 0x3FF + "000011" & X"C50", -- 0x19D: MOV R00, 0xC5 + "100000" & X"000", -- 0x19E: ROL R00 + "001111" & X"8B0", -- 0x19F: CMP R00, 0x8B + "111010" & X"3FF", -- 0x1A0: JNE 0x3FF + "100000" & X"000", -- 0x1A1: ROL R00 + "001111" & X"170", -- 0x1A2: CMP R00, 0x17 + "111010" & X"3FF", -- 0x1A3: JNE 0x3FF + "100000" & X"000", -- 0x1A4: ROL R00 + "001111" & X"2E0", -- 0x1A5: CMP R00, 0x2E + "111010" & X"3FF", -- 0x1A6: JNE 0x3FF + "100000" & X"000", -- 0x1A7: ROL R00 + "001111" & X"5C0", -- 0x1A8: CMP R00, 0x5C + "111010" & X"3FF", -- 0x1A9: JNE 0x3FF + "100000" & X"000", -- 0x1AA: ROL R00 + "001111" & X"B80", -- 0x1AB: CMP R00, 0xB8 + "111010" & X"3FF", -- 0x1AC: JNE 0x3FF + "100000" & X"000", -- 0x1AD: ROL R00 + "001111" & X"710", -- 0x1AE: CMP R00, 0x71 + "111010" & X"3FF", -- 0x1AF: JNE 0x3FF + "100000" & X"000", -- 0x1B0: ROL R00 + "001111" & X"E20", -- 0x1B1: CMP R00, 0xE2 + "111010" & X"3FF", -- 0x1B2: JNE 0x3FF + "100000" & X"000", -- 0x1B3: ROL R00 + "001111" & X"C50", -- 0x1B4: CMP R00, 0xC5 + "111010" & X"3FF", -- 0x1B5: JNE 0x3FF + "000011" & X"631", -- 0x1B6: MOV R01, 0x63 + "100001" & X"001", -- 0x1B7: ROR R01 + "001111" & X"B11", -- 0x1B8: CMP R01, 0xB1 + "111010" & X"3FF", -- 0x1B9: JNE 0x3FF + "100001" & X"001", -- 0x1BA: ROR R01 + "001111" & X"D81", -- 0x1BB: CMP R01, 0xD8 + "111010" & X"3FF", -- 0x1BC: JNE 0x3FF + "100001" & X"001", -- 0x1BD: ROR R01 + "001111" & X"6C1", -- 0x1BE: CMP R01, 0x6C + "111010" & X"3FF", -- 0x1BF: JNE 0x3FF + "100001" & X"001", -- 0x1C0: ROR R01 + "001111" & X"361", -- 0x1C1: CMP R01, 0x36 + "111010" & X"3FF", -- 0x1C2: JNE 0x3FF + "100001" & X"001", -- 0x1C3: ROR R01 + "001111" & X"1B1", -- 0x1C4: CMP R01, 0x1B + "111010" & X"3FF", -- 0x1C5: JNE 0x3FF + "100001" & X"001", -- 0x1C6: ROR R01 + "001111" & X"8D1", -- 0x1C7: CMP R01, 0x8D + "111010" & X"3FF", -- 0x1C8: JNE 0x3FF + "100001" & X"001", -- 0x1C9: ROR R01 + "001111" & X"C61", -- 0x1CA: CMP R01, 0xC6 + "111010" & X"3FF", -- 0x1CB: JNE 0x3FF + "100001" & X"001", -- 0x1CC: ROR R01 + "001111" & X"631", -- 0x1CD: CMP R01, 0x63 + "111010" & X"3FF", -- 0x1CE: JNE 0x3FF + "011100" & X"000", -- 0x1CF: XOR R00, R00 + "000011" & X"C50", -- 0x1D0: MOV R00, 0xC5 + "100010" & X"000", -- 0x1D1: ROLC R00 + "111100" & X"000", -- 0x1D2: PUSH R00 + "100010" & X"000", -- 0x1D3: ROLC R00 + "111100" & X"000", -- 0x1D4: PUSH R00 + "100010" & X"000", -- 0x1D5: ROLC R00 + "111100" & X"000", -- 0x1D6: PUSH R00 + "100010" & X"000", -- 0x1D7: ROLC R00 + "111100" & X"000", -- 0x1D8: PUSH R00 + "100010" & X"000", -- 0x1D9: ROLC R00 + "111100" & X"000", -- 0x1DA: PUSH R00 + "100010" & X"000", -- 0x1DB: ROLC R00 + "111100" & X"000", -- 0x1DC: PUSH R00 + "100010" & X"000", -- 0x1DD: ROLC R00 + "111100" & X"000", -- 0x1DE: PUSH R00 + "100010" & X"000", -- 0x1DF: ROLC R00 + "111100" & X"000", -- 0x1E0: PUSH R00 + "100010" & X"000", -- 0x1E1: ROLC R00 + "001111" & X"C50", -- 0x1E2: CMP R00, 0xC5 + "111010" & X"3FF", -- 0x1E3: JNE 0x3FF + "111101" & X"000", -- 0x1E4: POP R00 + "001111" & X"620", -- 0x1E5: CMP R00, 0x62 + "111010" & X"3FF", -- 0x1E6: JNE 0x3FF + "111101" & X"000", -- 0x1E7: POP R00 + "001111" & X"B10", -- 0x1E8: CMP R00, 0xB1 + "111010" & X"3FF", -- 0x1E9: JNE 0x3FF + "111101" & X"000", -- 0x1EA: POP R00 + "001111" & X"580", -- 0x1EB: CMP R00, 0x58 + "111010" & X"3FF", -- 0x1EC: JNE 0x3FF + "111101" & X"000", -- 0x1ED: POP R00 + "001111" & X"AC0", -- 0x1EE: CMP R00, 0xAC + "111010" & X"3FF", -- 0x1EF: JNE 0x3FF + "111101" & X"000", -- 0x1F0: POP R00 + "001111" & X"560", -- 0x1F1: CMP R00, 0x56 + "111010" & X"3FF", -- 0x1F2: JNE 0x3FF + "111101" & X"000", -- 0x1F3: POP R00 + "001111" & X"2B0", -- 0x1F4: CMP R00, 0x2B + "111010" & X"3FF", -- 0x1F5: JNE 0x3FF + "111101" & X"000", -- 0x1F6: POP R00 + "001111" & X"150", -- 0x1F7: CMP R00, 0x15 + "111010" & X"3FF", -- 0x1F8: JNE 0x3FF + "111101" & X"000", -- 0x1F9: POP R00 + "001111" & X"8A0", -- 0x1FA: CMP R00, 0x8A + "111010" & X"3FF", -- 0x1FB: JNE 0x3FF + "011100" & X"011", -- 0x1FC: XOR R01, R01 + "000011" & X"631", -- 0x1FD: MOV R01, 0x63 + "100011" & X"001", -- 0x1FE: RORC R01 + "111100" & X"001", -- 0x1FF: PUSH R01 + "100011" & X"001", -- 0x200: RORC R01 + "111100" & X"001", -- 0x201: PUSH R01 + "100011" & X"001", -- 0x202: RORC R01 + "111100" & X"001", -- 0x203: PUSH R01 + "100011" & X"001", -- 0x204: RORC R01 + "111100" & X"001", -- 0x205: PUSH R01 + "100011" & X"001", -- 0x206: RORC R01 + "111100" & X"001", -- 0x207: PUSH R01 + "100011" & X"001", -- 0x208: RORC R01 + "111100" & X"001", -- 0x209: PUSH R01 + "100011" & X"001", -- 0x20A: RORC R01 + "111100" & X"001", -- 0x20B: PUSH R01 + "100011" & X"001", -- 0x20C: RORC R01 + "111100" & X"001", -- 0x20D: PUSH R01 + "100011" & X"001", -- 0x20E: RORC R01 + "001111" & X"631", -- 0x20F: CMP R01, 0x63 + "111010" & X"3FF", -- 0x210: JNE 0x3FF + "111101" & X"001", -- 0x211: POP R01 + "001111" & X"C61", -- 0x212: CMP R01, 0xC6 + "111010" & X"3FF", -- 0x213: JNE 0x3FF + "111101" & X"001", -- 0x214: POP R01 + "001111" & X"8C1", -- 0x215: CMP R01, 0x8C + "111010" & X"3FF", -- 0x216: JNE 0x3FF + "111101" & X"001", -- 0x217: POP R01 + "001111" & X"191", -- 0x218: CMP R01, 0x19 + "111010" & X"3FF", -- 0x219: JNE 0x3FF + "111101" & X"001", -- 0x21A: POP R01 + "001111" & X"331", -- 0x21B: CMP R01, 0x33 + "111010" & X"3FF", -- 0x21C: JNE 0x3FF + "111101" & X"001", -- 0x21D: POP R01 + "001111" & X"661", -- 0x21E: CMP R01, 0x66 + "111010" & X"3FF", -- 0x21F: JNE 0x3FF + "111101" & X"001", -- 0x220: POP R01 + "001111" & X"CC1", -- 0x221: CMP R01, 0xCC + "111010" & X"3FF", -- 0x222: JNE 0x3FF + "111101" & X"001", -- 0x223: POP R01 + "001111" & X"981", -- 0x224: CMP R01, 0x98 + "111010" & X"3FF", -- 0x225: JNE 0x3FF + "111101" & X"001", -- 0x226: POP R01 + "001111" & X"311", -- 0x227: CMP R01, 0x31 + "111010" & X"3FF", -- 0x228: JNE 0x3FF + "111110" & X"000", -- 0x229: RET + "000011" & X"A50", -- 0x22A: MOV R00, 0xA5 + "101010" & X"000", -- 0x22B: SWAP R00 + "111100" & X"000", -- 0x22C: PUSH R00 + "011001" & X"0F0", -- 0x22D: AND R00, 0x0F + "001111" & X"0A0", -- 0x22E: CMP R00, 0x0A + "111010" & X"3FF", -- 0x22F: JNE 0x3FF + "111101" & X"000", -- 0x230: POP R00 + "111100" & X"000", -- 0x231: PUSH R00 + "011001" & X"0F0", -- 0x232: AND R00, 0x0F + "001111" & X"0A0", -- 0x233: CMP R00, 0x0A + "111101" & X"001", -- 0x234: POP R01 + "111010" & X"3FF", -- 0x235: JNE 0x3FF + "101010" & X"001", -- 0x236: SWAP R01 + "000011" & X"0F2", -- 0x237: MOV R02, 0x0F + "011000" & X"021", -- 0x238: AND R01, R02 + "001111" & X"051", -- 0x239: CMP R01, 0x05 + "111010" & X"3FF", -- 0x23A: JNE 0x3FF + "000011" & X"050", -- 0x23B: MOV R00, 0x05 + "000011" & X"A02", -- 0x23C: MOV R02, 0xA0 + "101010" & X"000", -- 0x23D: SWAP R00 + "011010" & X"002", -- 0x23E: OR R02, R00 + "001111" & X"F02", -- 0x23F: CMP R02, 0xF0 + "111010" & X"3FF", -- 0x240: JNE 0x3FF + "101010" & X"000", -- 0x241: SWAP R00 + "011011" & X"500", -- 0x242: OR R00, 0x50 + "001111" & X"550", -- 0x243: CMP R00, 0x55 + "111010" & X"3FF", -- 0x244: JNE 0x3FF + "000011" & X"011", -- 0x245: MOV R01, 0x01 + "000011" & X"010", -- 0x246: MOV R00, 0x01 + "011101" & X"010", -- 0x247: XOR R00, 0x01 + "110010" & X"3FF", -- 0x248: JNZ 0x3FF + "011100" & X"010", -- 0x249: XOR R00, R01 + "001111" & X"010", -- 0x24A: CMP R00, 0x01 + "111010" & X"3FF", -- 0x24B: JNE 0x3FF + "111110" & X"000", -- 0x24C: RET + "000011" & X"030", -- 0x24D: MOV R00, 0x03 + "100110" & X"030", -- 0x24E: COUT (0x03), R00 + "101000" & X"020", -- 0x24F: XIN R00, (0x02) + "011011" & X"010", -- 0x250: OR R00, 0x01 + "100100" & X"020", -- 0x251: XOUT (0x02), R00 + "000000" & X"000", -- 0x252: NOP + "000000" & X"000", -- 0x253: NOP + "000000" & X"000", -- 0x254: NOP + "000000" & X"000", -- 0x255: NOP + "000000" & X"000", -- 0x256: NOP + "000000" & X"000", -- 0x257: NOP + "101000" & X"020", -- 0x258: XIN R00, (0x02) + "011001" & X"FE0", -- 0x259: AND R00, 0xFE + "100100" & X"020", -- 0x25A: XOUT (0x02), R00 + "000000" & X"000", -- 0x25B: NOP + "000000" & X"000", -- 0x25C: NOP + "000000" & X"000", -- 0x25D: NOP + "000000" & X"000", -- 0x25E: NOP + "101001" & X"030", -- 0x25F: CIN R00, (0x03) + "011011" & X"800", -- 0x260: OR R00, 0x80 + "100110" & X"030", -- 0x261: COUT (0x03), R00 + "000000" & X"000", -- 0x262: NOP + "101001" & X"030", -- 0x263: CIN R00, (0x03) + "011011" & X"800", -- 0x264: OR R00, 0x80 + "100110" & X"030", -- 0x265: COUT (0x03), R00 + "000000" & X"000", -- 0x266: NOP + "101001" & X"030", -- 0x267: CIN R00, (0x03) + "011011" & X"800", -- 0x268: OR R00, 0x80 + "100110" & X"030", -- 0x269: COUT (0x03), R00 + "000000" & X"000", -- 0x26A: NOP + "101001" & X"030", -- 0x26B: CIN R00, (0x03) + "011011" & X"800", -- 0x26C: OR R00, 0x80 + "100110" & X"030", -- 0x26D: COUT (0x03), R00 + "000000" & X"000", -- 0x26E: NOP + "000000" & X"000", -- 0x26F: NOP + "000000" & X"000", -- 0x270: NOP + "000000" & X"000", -- 0x271: NOP + "000000" & X"000", -- 0x272: NOP + "000000" & X"000", -- 0x273: NOP + "000000" & X"000", -- 0x274: NOP + "000000" & X"000", -- 0x275: NOP + "000000" & X"000", -- 0x276: NOP + "111110" & X"000", -- 0x277: RET + "010101" & X"000", -- 0x278: SUB R00, 0x00 + "110011" & X"3FF", -- 0x279: JC 0x3FF + "101011" & X"000", -- 0x27A: SETC + "110100" & X"3FF", -- 0x27B: JNC 0x3FF + "000000" & X"000", -- 0x27C: NOP + "010101" & X"000", -- 0x27D: SUB R00, 0x00 + "110011" & X"3FF", -- 0x27E: JC 0x3FF + "000011" & X"000", -- 0x27F: MOV R00, 0x00 + "010101" & X"000", -- 0x280: CLRC + "110011" & X"3FF", -- 0x281: JC 0x3FF + "101011" & X"000", -- 0x282: SETC + "110100" & X"3FF", -- 0x283: JNC 0x3FF + "000000" & X"000", -- 0x284: NOP + "010101" & X"000", -- 0x285: CLRC + "110011" & X"3FF", -- 0x286: JC 0x3FF + "111110" & X"000", -- 0x287: RET + "010001" & X"01E", -- 0x288: INC R14 + "111111" & X"000", -- 0x289: RETI + "000000" & X"000", -- 0x28A: + "000000" & X"000", -- 0x28B: + "000000" & X"000", -- 0x28C: + "000000" & X"000", -- 0x28D: + "000000" & X"000", -- 0x28E: + "000000" & X"000", -- 0x28F: + "000000" & X"000", -- 0x290: + "000000" & X"000", -- 0x291: + "000000" & X"000", -- 0x292: + "000000" & X"000", -- 0x293: + "000000" & X"000", -- 0x294: + "000000" & X"000", -- 0x295: + "000000" & X"000", -- 0x296: + "000000" & X"000", -- 0x297: + "000000" & X"000", -- 0x298: + "000000" & X"000", -- 0x299: + "000000" & X"000", -- 0x29A: + "000000" & X"000", -- 0x29B: + "000000" & X"000", -- 0x29C: + "000000" & X"000", -- 0x29D: + "000000" & X"000", -- 0x29E: + "000000" & X"000", -- 0x29F: + "000000" & X"000", -- 0x2A0: + "000000" & X"000", -- 0x2A1: + "000000" & X"000", -- 0x2A2: + "000000" & X"000", -- 0x2A3: + "000000" & X"000", -- 0x2A4: + "000000" & X"000", -- 0x2A5: + "000000" & X"000", -- 0x2A6: + "000000" & X"000", -- 0x2A7: + "000000" & X"000", -- 0x2A8: + "000000" & X"000", -- 0x2A9: + "000000" & X"000", -- 0x2AA: + "000000" & X"000", -- 0x2AB: + "000000" & X"000", -- 0x2AC: + "000000" & X"000", -- 0x2AD: + "000000" & X"000", -- 0x2AE: + "000000" & X"000", -- 0x2AF: + "000000" & X"000", -- 0x2B0: + "000000" & X"000", -- 0x2B1: + "000000" & X"000", -- 0x2B2: + "000000" & X"000", -- 0x2B3: + "000000" & X"000", -- 0x2B4: + "000000" & X"000", -- 0x2B5: + "000000" & X"000", -- 0x2B6: + "000000" & X"000", -- 0x2B7: + "000000" & X"000", -- 0x2B8: + "000000" & X"000", -- 0x2B9: + "000000" & X"000", -- 0x2BA: + "000000" & X"000", -- 0x2BB: + "000000" & X"000", -- 0x2BC: + "000000" & X"000", -- 0x2BD: + "000000" & X"000", -- 0x2BE: + "000000" & X"000", -- 0x2BF: + "000000" & X"000", -- 0x2C0: + "000000" & X"000", -- 0x2C1: + "000000" & X"000", -- 0x2C2: + "000000" & X"000", -- 0x2C3: + "000000" & X"000", -- 0x2C4: + "000000" & X"000", -- 0x2C5: + "000000" & X"000", -- 0x2C6: + "000000" & X"000", -- 0x2C7: + "000000" & X"000", -- 0x2C8: + "000000" & X"000", -- 0x2C9: + "000000" & X"000", -- 0x2CA: + "000000" & X"000", -- 0x2CB: + "000000" & X"000", -- 0x2CC: + "000000" & X"000", -- 0x2CD: + "000000" & X"000", -- 0x2CE: + "000000" & X"000", -- 0x2CF: + "000000" & X"000", -- 0x2D0: + "000000" & X"000", -- 0x2D1: + "000000" & X"000", -- 0x2D2: + "000000" & X"000", -- 0x2D3: + "000000" & X"000", -- 0x2D4: + "000000" & X"000", -- 0x2D5: + "000000" & X"000", -- 0x2D6: + "000000" & X"000", -- 0x2D7: + "000000" & X"000", -- 0x2D8: + "000000" & X"000", -- 0x2D9: + "000000" & X"000", -- 0x2DA: + "000000" & X"000", -- 0x2DB: + "000000" & X"000", -- 0x2DC: + "000000" & X"000", -- 0x2DD: + "000000" & X"000", -- 0x2DE: + "000000" & X"000", -- 0x2DF: + "000000" & X"000", -- 0x2E0: + "000000" & X"000", -- 0x2E1: + "000000" & X"000", -- 0x2E2: + "000000" & X"000", -- 0x2E3: + "000000" & X"000", -- 0x2E4: + "000000" & X"000", -- 0x2E5: + "000000" & X"000", -- 0x2E6: + "000000" & X"000", -- 0x2E7: + "000000" & X"000", -- 0x2E8: + "000000" & X"000", -- 0x2E9: + "000000" & X"000", -- 0x2EA: + "000000" & X"000", -- 0x2EB: + "000000" & X"000", -- 0x2EC: + "000000" & X"000", -- 0x2ED: + "000000" & X"000", -- 0x2EE: + "000000" & X"000", -- 0x2EF: + "000000" & X"000", -- 0x2F0: + "000000" & X"000", -- 0x2F1: + "000000" & X"000", -- 0x2F2: + "000000" & X"000", -- 0x2F3: + "000000" & X"000", -- 0x2F4: + "000000" & X"000", -- 0x2F5: + "000000" & X"000", -- 0x2F6: + "000000" & X"000", -- 0x2F7: + "000000" & X"000", -- 0x2F8: + "000000" & X"000", -- 0x2F9: + "000000" & X"000", -- 0x2FA: + "000000" & X"000", -- 0x2FB: + "000000" & X"000", -- 0x2FC: + "000000" & X"000", -- 0x2FD: + "000000" & X"000", -- 0x2FE: + "110000" & X"2FF", -- 0x2FF: JMP 0x2FF + "000000" & X"000", -- 0x300: + "000000" & X"000", -- 0x301: + "000000" & X"000", -- 0x302: + "000000" & X"000", -- 0x303: + "000000" & X"000", -- 0x304: + "000000" & X"000", -- 0x305: + "000000" & X"000", -- 0x306: + "000000" & X"000", -- 0x307: + "000000" & X"000", -- 0x308: + "000000" & X"000", -- 0x309: + "000000" & X"000", -- 0x30A: + "000000" & X"000", -- 0x30B: + "000000" & X"000", -- 0x30C: + "000000" & X"000", -- 0x30D: + "000000" & X"000", -- 0x30E: + "000000" & X"000", -- 0x30F: + "000000" & X"000", -- 0x310: + "000000" & X"000", -- 0x311: + "000000" & X"000", -- 0x312: + "000000" & X"000", -- 0x313: + "000000" & X"000", -- 0x314: + "000000" & X"000", -- 0x315: + "000000" & X"000", -- 0x316: + "000000" & X"000", -- 0x317: + "000000" & X"000", -- 0x318: + "000000" & X"000", -- 0x319: + "000000" & X"000", -- 0x31A: + "000000" & X"000", -- 0x31B: + "000000" & X"000", -- 0x31C: + "000000" & X"000", -- 0x31D: + "000000" & X"000", -- 0x31E: + "000000" & X"000", -- 0x31F: + "000000" & X"000", -- 0x320: + "000000" & X"000", -- 0x321: + "000000" & X"000", -- 0x322: + "000000" & X"000", -- 0x323: + "000000" & X"000", -- 0x324: + "000000" & X"000", -- 0x325: + "000000" & X"000", -- 0x326: + "000000" & X"000", -- 0x327: + "000000" & X"000", -- 0x328: + "000000" & X"000", -- 0x329: + "000000" & X"000", -- 0x32A: + "000000" & X"000", -- 0x32B: + "000000" & X"000", -- 0x32C: + "000000" & X"000", -- 0x32D: + "000000" & X"000", -- 0x32E: + "000000" & X"000", -- 0x32F: + "000000" & X"000", -- 0x330: + "000000" & X"000", -- 0x331: + "000000" & X"000", -- 0x332: + "000000" & X"000", -- 0x333: + "000000" & X"000", -- 0x334: + "000000" & X"000", -- 0x335: + "000000" & X"000", -- 0x336: + "000000" & X"000", -- 0x337: + "000000" & X"000", -- 0x338: + "000000" & X"000", -- 0x339: + "000000" & X"000", -- 0x33A: + "000000" & X"000", -- 0x33B: + "000000" & X"000", -- 0x33C: + "000000" & X"000", -- 0x33D: + "000000" & X"000", -- 0x33E: + "000000" & X"000", -- 0x33F: + "000000" & X"000", -- 0x340: + "000000" & X"000", -- 0x341: + "000000" & X"000", -- 0x342: + "000000" & X"000", -- 0x343: + "000000" & X"000", -- 0x344: + "000000" & X"000", -- 0x345: + "000000" & X"000", -- 0x346: + "000000" & X"000", -- 0x347: + "000000" & X"000", -- 0x348: + "000000" & X"000", -- 0x349: + "000000" & X"000", -- 0x34A: + "000000" & X"000", -- 0x34B: + "000000" & X"000", -- 0x34C: + "000000" & X"000", -- 0x34D: + "000000" & X"000", -- 0x34E: + "000000" & X"000", -- 0x34F: + "000000" & X"000", -- 0x350: + "000000" & X"000", -- 0x351: + "000000" & X"000", -- 0x352: + "000000" & X"000", -- 0x353: + "000000" & X"000", -- 0x354: + "000000" & X"000", -- 0x355: + "000000" & X"000", -- 0x356: + "000000" & X"000", -- 0x357: + "000000" & X"000", -- 0x358: + "000000" & X"000", -- 0x359: + "000000" & X"000", -- 0x35A: + "000000" & X"000", -- 0x35B: + "000000" & X"000", -- 0x35C: + "000000" & X"000", -- 0x35D: + "000000" & X"000", -- 0x35E: + "000000" & X"000", -- 0x35F: + "000000" & X"000", -- 0x360: + "000000" & X"000", -- 0x361: + "000000" & X"000", -- 0x362: + "000000" & X"000", -- 0x363: + "000000" & X"000", -- 0x364: + "000000" & X"000", -- 0x365: + "000000" & X"000", -- 0x366: + "000000" & X"000", -- 0x367: + "000000" & X"000", -- 0x368: + "000000" & X"000", -- 0x369: + "000000" & X"000", -- 0x36A: + "000000" & X"000", -- 0x36B: + "000000" & X"000", -- 0x36C: + "000000" & X"000", -- 0x36D: + "000000" & X"000", -- 0x36E: + "000000" & X"000", -- 0x36F: + "000000" & X"000", -- 0x370: + "000000" & X"000", -- 0x371: + "000000" & X"000", -- 0x372: + "000000" & X"000", -- 0x373: + "000000" & X"000", -- 0x374: + "000000" & X"000", -- 0x375: + "000000" & X"000", -- 0x376: + "000000" & X"000", -- 0x377: + "000000" & X"000", -- 0x378: + "000000" & X"000", -- 0x379: + "000000" & X"000", -- 0x37A: + "000000" & X"000", -- 0x37B: + "000000" & X"000", -- 0x37C: + "000000" & X"000", -- 0x37D: + "000000" & X"000", -- 0x37E: + "000000" & X"000", -- 0x37F: + "000000" & X"000", -- 0x380: + "000000" & X"000", -- 0x381: + "000000" & X"000", -- 0x382: + "000000" & X"000", -- 0x383: + "000000" & X"000", -- 0x384: + "000000" & X"000", -- 0x385: + "000000" & X"000", -- 0x386: + "000000" & X"000", -- 0x387: + "000000" & X"000", -- 0x388: + "000000" & X"000", -- 0x389: + "000000" & X"000", -- 0x38A: + "000000" & X"000", -- 0x38B: + "000000" & X"000", -- 0x38C: + "000000" & X"000", -- 0x38D: + "000000" & X"000", -- 0x38E: + "000000" & X"000", -- 0x38F: + "000000" & X"000", -- 0x390: + "000000" & X"000", -- 0x391: + "000000" & X"000", -- 0x392: + "000000" & X"000", -- 0x393: + "000000" & X"000", -- 0x394: + "000000" & X"000", -- 0x395: + "000000" & X"000", -- 0x396: + "000000" & X"000", -- 0x397: + "000000" & X"000", -- 0x398: + "000000" & X"000", -- 0x399: + "000000" & X"000", -- 0x39A: + "000000" & X"000", -- 0x39B: + "000000" & X"000", -- 0x39C: + "000000" & X"000", -- 0x39D: + "000000" & X"000", -- 0x39E: + "000000" & X"000", -- 0x39F: + "000000" & X"000", -- 0x3A0: + "000000" & X"000", -- 0x3A1: + "000000" & X"000", -- 0x3A2: + "000000" & X"000", -- 0x3A3: + "000000" & X"000", -- 0x3A4: + "000000" & X"000", -- 0x3A5: + "000000" & X"000", -- 0x3A6: + "000000" & X"000", -- 0x3A7: + "000000" & X"000", -- 0x3A8: + "000000" & X"000", -- 0x3A9: + "000000" & X"000", -- 0x3AA: + "000000" & X"000", -- 0x3AB: + "000000" & X"000", -- 0x3AC: + "000000" & X"000", -- 0x3AD: + "000000" & X"000", -- 0x3AE: + "000000" & X"000", -- 0x3AF: + "000000" & X"000", -- 0x3B0: + "000000" & X"000", -- 0x3B1: + "000000" & X"000", -- 0x3B2: + "000000" & X"000", -- 0x3B3: + "000000" & X"000", -- 0x3B4: + "000000" & X"000", -- 0x3B5: + "000000" & X"000", -- 0x3B6: + "000000" & X"000", -- 0x3B7: + "000000" & X"000", -- 0x3B8: + "000000" & X"000", -- 0x3B9: + "000000" & X"000", -- 0x3BA: + "000000" & X"000", -- 0x3BB: + "000000" & X"000", -- 0x3BC: + "000000" & X"000", -- 0x3BD: + "000000" & X"000", -- 0x3BE: + "000000" & X"000", -- 0x3BF: + "000000" & X"000", -- 0x3C0: + "000000" & X"000", -- 0x3C1: + "000000" & X"000", -- 0x3C2: + "000000" & X"000", -- 0x3C3: + "000000" & X"000", -- 0x3C4: + "000000" & X"000", -- 0x3C5: + "000000" & X"000", -- 0x3C6: + "000000" & X"000", -- 0x3C7: + "000000" & X"000", -- 0x3C8: + "000000" & X"000", -- 0x3C9: + "000000" & X"000", -- 0x3CA: + "000000" & X"000", -- 0x3CB: + "000000" & X"000", -- 0x3CC: + "000000" & X"000", -- 0x3CD: + "000000" & X"000", -- 0x3CE: + "000000" & X"000", -- 0x3CF: + "000000" & X"000", -- 0x3D0: + "000000" & X"000", -- 0x3D1: + "000000" & X"000", -- 0x3D2: + "000000" & X"000", -- 0x3D3: + "000000" & X"000", -- 0x3D4: + "000000" & X"000", -- 0x3D5: + "000000" & X"000", -- 0x3D6: + "000000" & X"000", -- 0x3D7: + "000000" & X"000", -- 0x3D8: + "000000" & X"000", -- 0x3D9: + "000000" & X"000", -- 0x3DA: + "000000" & X"000", -- 0x3DB: + "000000" & X"000", -- 0x3DC: + "000000" & X"000", -- 0x3DD: + "000000" & X"000", -- 0x3DE: + "000000" & X"000", -- 0x3DF: + "000000" & X"000", -- 0x3E0: + "000000" & X"000", -- 0x3E1: + "000000" & X"000", -- 0x3E2: + "000000" & X"000", -- 0x3E3: + "000000" & X"000", -- 0x3E4: + "000000" & X"000", -- 0x3E5: + "000000" & X"000", -- 0x3E6: + "000000" & X"000", -- 0x3E7: + "000000" & X"000", -- 0x3E8: + "000000" & X"000", -- 0x3E9: + "000000" & X"000", -- 0x3EA: + "000000" & X"000", -- 0x3EB: + "000000" & X"000", -- 0x3EC: + "000000" & X"000", -- 0x3ED: + "000000" & X"000", -- 0x3EE: + "000000" & X"000", -- 0x3EF: + "000000" & X"000", -- 0x3F0: + "000000" & X"000", -- 0x3F1: + "000000" & X"000", -- 0x3F2: + "000000" & X"000", -- 0x3F3: + "000000" & X"000", -- 0x3F4: + "000000" & X"000", -- 0x3F5: + "000000" & X"000", -- 0x3F6: + "000000" & X"000", -- 0x3F7: + "000000" & X"000", -- 0x3F8: + "000000" & X"000", -- 0x3F9: + "000000" & X"000", -- 0x3FA: + "000000" & X"000", -- 0x3FB: + "000000" & X"000", -- 0x3FC: + "000000" & X"000", -- 0x3FD: + "000000" & X"000", -- 0x3FE: + "110000" & X"3FF" -- 0x3FF: JMP 0x3FF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +end itest; + diff --git a/lib/CPUs/JCpu/src/itest_irom_ld.vhdl b/lib/CPUs/JCpu/src/itest_irom_ld.vhdl new file mode 100644 index 0000000..d4371a1 --- /dev/null +++ b/lib/CPUs/JCpu/src/itest_irom_ld.vhdl @@ -0,0 +1,1181 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from itest.jsm + type imem_rom_t is array (0 to 1023) of inst_t; + signal imem_rom : imem_rom_t := + ( + "110000" & X"010", -- 0x000: JMP 0x010 + "110000" & X"288", -- 0x001: JMP 0x288 + "000000" & X"000", -- 0x002: + "000000" & X"000", -- 0x003: + "000000" & X"000", -- 0x004: + "000000" & X"000", -- 0x005: + "000000" & X"000", -- 0x006: + "000000" & X"000", -- 0x007: + "000000" & X"000", -- 0x008: + "000000" & X"000", -- 0x009: + "000000" & X"000", -- 0x00A: + "000000" & X"000", -- 0x00B: + "000000" & X"000", -- 0x00C: + "000000" & X"000", -- 0x00D: + "000000" & X"000", -- 0x00E: + "000000" & X"000", -- 0x00F: + "111011" & X"03B", -- 0x010: CALL 0x03B + "101001" & X"000", -- 0x011: CIN R00, (0x00) + "100100" & X"000", -- 0x012: XOUT (0x00), R00 + "111011" & X"04C", -- 0x013: CALL 0x04C + "000011" & X"010", -- 0x014: MOV R00, 0x01 + "100100" & X"010", -- 0x015: XOUT (0x01), R00 + "111011" & X"08D", -- 0x016: CALL 0x08D + "000011" & X"020", -- 0x017: MOV R00, 0x02 + "100100" & X"010", -- 0x018: XOUT (0x01), R00 + "111011" & X"0C9", -- 0x019: CALL 0x0C9 + "000011" & X"030", -- 0x01A: MOV R00, 0x03 + "100100" & X"010", -- 0x01B: XOUT (0x01), R00 + "111011" & X"0DB", -- 0x01C: CALL 0x0DB + "000011" & X"040", -- 0x01D: MOV R00, 0x04 + "100100" & X"010", -- 0x01E: XOUT (0x01), R00 + "111011" & X"0ED", -- 0x01F: CALL 0x0ED + "000011" & X"050", -- 0x020: MOV R00, 0x05 + "100100" & X"010", -- 0x021: XOUT (0x01), R00 + "111011" & X"0FF", -- 0x022: CALL 0x0FF + "000011" & X"060", -- 0x023: MOV R00, 0x06 + "100100" & X"010", -- 0x024: XOUT (0x01), R00 + "111011" & X"115", -- 0x025: CALL 0x115 + "000011" & X"070", -- 0x026: MOV R00, 0x07 + "100100" & X"010", -- 0x027: XOUT (0x01), R00 + "111011" & X"12B", -- 0x028: CALL 0x12B + "000011" & X"080", -- 0x029: MOV R00, 0x08 + "100100" & X"010", -- 0x02A: XOUT (0x01), R00 + "111011" & X"137", -- 0x02B: CALL 0x137 + "000011" & X"090", -- 0x02C: MOV R00, 0x09 + "100100" & X"010", -- 0x02D: XOUT (0x01), R00 + "111011" & X"15A", -- 0x02E: CALL 0x15A + "000011" & X"0A0", -- 0x02F: MOV R00, 0x0A + "100100" & X"010", -- 0x030: XOUT (0x01), R00 + "111011" & X"22A", -- 0x031: CALL 0x22A + "000011" & X"0B0", -- 0x032: MOV R00, 0x0B + "100100" & X"010", -- 0x033: XOUT (0x01), R00 + "111011" & X"24D", -- 0x034: CALL 0x24D + "000011" & X"0C0", -- 0x035: MOV R00, 0x0C + "100100" & X"010", -- 0x036: XOUT (0x01), R00 + "111011" & X"278", -- 0x037: CALL 0x278 + "000011" & X"FF0", -- 0x038: MOV R00, 0xFF + "100100" & X"010", -- 0x039: XOUT (0x01), R00 + "110000" & X"2FF", -- 0x03A: JMP 0x2FF + "000011" & X"000", -- 0x03B: MOV R00, 0x00 + "000011" & X"001", -- 0x03C: MOV R01, 0x00 + "000011" & X"002", -- 0x03D: MOV R02, 0x00 + "000011" & X"003", -- 0x03E: MOV R03, 0x00 + "000011" & X"004", -- 0x03F: MOV R04, 0x00 + "000011" & X"005", -- 0x040: MOV R05, 0x00 + "000011" & X"006", -- 0x041: MOV R06, 0x00 + "000011" & X"007", -- 0x042: MOV R07, 0x00 + "000011" & X"008", -- 0x043: MOV R08, 0x00 + "000011" & X"009", -- 0x044: MOV R09, 0x00 + "000011" & X"00A", -- 0x045: MOV R10, 0x00 + "000011" & X"00B", -- 0x046: MOV R11, 0x00 + "000011" & X"00C", -- 0x047: MOV R12, 0x00 + "000011" & X"00D", -- 0x048: MOV R13, 0x00 + "000011" & X"00E", -- 0x049: MOV R14, 0x00 + "000011" & X"00F", -- 0x04A: MOV R15, 0x00 + "111110" & X"000", -- 0x04B: RET + "000011" & X"100", -- 0x04C: MOV R00, 0x10 + "001111" & X"100", -- 0x04D: CMP R00, 0x10 + "111010" & X"3FF", -- 0x04E: JNE 0x3FF + "010001" & X"010", -- 0x04F: ADD R00, 0x01 + "000010" & X"001", -- 0x050: MOV R01, R00 + "001111" & X"111", -- 0x051: CMP R01, 0x11 + "111010" & X"3FF", -- 0x052: JNE 0x3FF + "010001" & X"011", -- 0x053: ADD R01, 0x01 + "000010" & X"012", -- 0x054: MOV R02, R01 + "001111" & X"122", -- 0x055: CMP R02, 0x12 + "111010" & X"3FF", -- 0x056: JNE 0x3FF + "010001" & X"012", -- 0x057: ADD R02, 0x01 + "000010" & X"023", -- 0x058: MOV R03, R02 + "001111" & X"133", -- 0x059: CMP R03, 0x13 + "111010" & X"3FF", -- 0x05A: JNE 0x3FF + "010001" & X"013", -- 0x05B: ADD R03, 0x01 + "000010" & X"034", -- 0x05C: MOV R04, R03 + "001111" & X"144", -- 0x05D: CMP R04, 0x14 + "111010" & X"3FF", -- 0x05E: JNE 0x3FF + "010001" & X"014", -- 0x05F: ADD R04, 0x01 + "000010" & X"045", -- 0x060: MOV R05, R04 + "001111" & X"155", -- 0x061: CMP R05, 0x15 + "111010" & X"3FF", -- 0x062: JNE 0x3FF + "010001" & X"015", -- 0x063: ADD R05, 0x01 + "000010" & X"056", -- 0x064: MOV R06, R05 + "001111" & X"166", -- 0x065: CMP R06, 0x16 + "111010" & X"3FF", -- 0x066: JNE 0x3FF + "010001" & X"016", -- 0x067: ADD R06, 0x01 + "000010" & X"067", -- 0x068: MOV R07, R06 + "001111" & X"177", -- 0x069: CMP R07, 0x17 + "111010" & X"3FF", -- 0x06A: JNE 0x3FF + "010001" & X"017", -- 0x06B: ADD R07, 0x01 + "000010" & X"078", -- 0x06C: MOV R08, R07 + "001111" & X"188", -- 0x06D: CMP R08, 0x18 + "111010" & X"3FF", -- 0x06E: JNE 0x3FF + "010001" & X"018", -- 0x06F: ADD R08, 0x01 + "000010" & X"089", -- 0x070: MOV R09, R08 + "001111" & X"199", -- 0x071: CMP R09, 0x19 + "111010" & X"3FF", -- 0x072: JNE 0x3FF + "010001" & X"019", -- 0x073: ADD R09, 0x01 + "000010" & X"09A", -- 0x074: MOV R10, R09 + "001111" & X"1AA", -- 0x075: CMP R10, 0x1A + "111010" & X"3FF", -- 0x076: JNE 0x3FF + "010001" & X"01A", -- 0x077: ADD R10, 0x01 + "000010" & X"0AB", -- 0x078: MOV R11, R10 + "001111" & X"1BB", -- 0x079: CMP R11, 0x1B + "111010" & X"3FF", -- 0x07A: JNE 0x3FF + "010001" & X"01B", -- 0x07B: ADD R11, 0x01 + "000010" & X"0BC", -- 0x07C: MOV R12, R11 + "001111" & X"1CC", -- 0x07D: CMP R12, 0x1C + "111010" & X"3FF", -- 0x07E: JNE 0x3FF + "010001" & X"01C", -- 0x07F: ADD R12, 0x01 + "000010" & X"0CD", -- 0x080: MOV R13, R12 + "001111" & X"1DD", -- 0x081: CMP R13, 0x1D + "111010" & X"3FF", -- 0x082: JNE 0x3FF + "010001" & X"01D", -- 0x083: ADD R13, 0x01 + "000010" & X"0DE", -- 0x084: MOV R14, R13 + "001111" & X"1EE", -- 0x085: CMP R14, 0x1E + "111010" & X"3FF", -- 0x086: JNE 0x3FF + "010001" & X"01E", -- 0x087: ADD R14, 0x01 + "000010" & X"0EF", -- 0x088: MOV R15, R14 + "001111" & X"1FF", -- 0x089: CMP R15, 0x1F + "111010" & X"3FF", -- 0x08A: JNE 0x3FF + "010001" & X"01F", -- 0x08B: ADD R15, 0x01 + "111110" & X"000", -- 0x08C: RET + "000011" & X"000", -- 0x08D: MOV R00, 0x00 + "001111" & X"000", -- 0x08E: TST R00 + "110010" & X"3FF", -- 0x08F: JNZ 0x3FF + "110011" & X"3FF", -- 0x090: JC 0x3FF + "001111" & X"000", -- 0x091: CMP R00, 0x00 + "111010" & X"3FF", -- 0x092: JNE 0x3FF + "110101" & X"3FF", -- 0x093: JLT 0x3FF + "110110" & X"3FF", -- 0x094: JGT 0x3FF + "110111" & X"097", -- 0x095: JLE 0x097 + "110000" & X"3FF", -- 0x096: JMP 0x3FF + "111001" & X"099", -- 0x097: JEQ 0x099 + "110000" & X"3FF", -- 0x098: JMP 0x3FF + "111000" & X"09B", -- 0x099: JGE 0x09B + "110000" & X"3FF", -- 0x09A: JMP 0x3FF + "001111" & X"550", -- 0x09B: CMP R00, 0x55 + "111001" & X"3FF", -- 0x09C: JEQ 0x3FF + "110101" & X"09F", -- 0x09D: JLT 0x09F + "110000" & X"3FF", -- 0x09E: JMP 0x3FF + "110111" & X"0A1", -- 0x09F: JLE 0x0A1 + "110000" & X"3FF", -- 0x0A0: JMP 0x3FF + "111000" & X"3FF", -- 0x0A1: JGE 0x3FF + "110110" & X"3FF", -- 0x0A2: JGT 0x3FF + "000011" & X"550", -- 0x0A3: MOV R00, 0x55 + "001111" & X"000", -- 0x0A4: TST R00 + "110001" & X"3FF", -- 0x0A5: JZ 0x3FF + "110011" & X"3FF", -- 0x0A6: JC 0x3FF + "001111" & X"AA0", -- 0x0A7: CMP R00, 0xAA + "111001" & X"3FF", -- 0x0A8: JEQ 0x3FF + "111010" & X"0AB", -- 0x0A9: JNE 0x0AB + "110000" & X"3FF", -- 0x0AA: JMP 0x3FF + "110101" & X"0AD", -- 0x0AB: JLT 0x0AD + "110000" & X"3FF", -- 0x0AC: JMP 0x3FF + "110111" & X"0AF", -- 0x0AD: JLE 0x0AF + "110000" & X"3FF", -- 0x0AE: JMP 0x3FF + "110110" & X"3FF", -- 0x0AF: JGT 0x3FF + "001111" & X"550", -- 0x0B0: CMP R00, 0x55 + "111001" & X"0B3", -- 0x0B1: JEQ 0x0B3 + "110000" & X"3FF", -- 0x0B2: JMP 0x3FF + "111010" & X"3FF", -- 0x0B3: JNE 0x3FF + "110101" & X"3FF", -- 0x0B4: JLT 0x3FF + "110111" & X"0B7", -- 0x0B5: JLE 0x0B7 + "110000" & X"3FF", -- 0x0B6: JMP 0x3FF + "110110" & X"3FF", -- 0x0B7: JGT 0x3FF + "111000" & X"0BA", -- 0x0B8: JGE 0x0BA + "110000" & X"3FF", -- 0x0B9: JMP 0x3FF + "000011" & X"AA0", -- 0x0BA: MOV R00, 0xAA + "001111" & X"000", -- 0x0BB: TST R00 + "110001" & X"3FF", -- 0x0BC: JZ 0x3FF + "110011" & X"3FF", -- 0x0BD: JC 0x3FF + "001111" & X"550", -- 0x0BE: CMP R00, 0x55 + "111001" & X"3FF", -- 0x0BF: JEQ 0x3FF + "111010" & X"0C2", -- 0x0C0: JNE 0x0C2 + "110000" & X"3FF", -- 0x0C1: JMP 0x3FF + "110110" & X"0C4", -- 0x0C2: JGT 0x0C4 + "110000" & X"3FF", -- 0x0C3: JMP 0x3FF + "111000" & X"0C6", -- 0x0C4: JGE 0x0C6 + "110000" & X"3FF", -- 0x0C5: JMP 0x3FF + "110101" & X"3FF", -- 0x0C6: JLT 0x3FF + "110111" & X"3FF", -- 0x0C7: JLE 0x3FF + "111110" & X"000", -- 0x0C8: RET + "000011" & X"000", -- 0x0C9: MOV R00, 0x00 + "000011" & X"001", -- 0x0CA: MOV R01, 0x00 + "000010" & X"002", -- 0x0CB: MOV R02, R00 + "000010" & X"013", -- 0x0CC: MOV R03, R01 + "010001" & X"010", -- 0x0CD: ADD R00, 0x01 + "010011" & X"001", -- 0x0CE: ADDC R01, 0x00 + "010001" & X"012", -- 0x0CF: ADD R02, 0x01 + "001111" & X"002", -- 0x0D0: CMP R02, 0x00 + "111010" & X"0D4", -- 0x0D1: JNE 0x0D4 + "010001" & X"013", -- 0x0D2: ADD R03, 0x01 + "001111" & X"023", -- 0x0D3: CMP R03, 0x02 + "111010" & X"0CD", -- 0x0D4: JNE 0x0CD + "001110" & X"020", -- 0x0D5: CMP R00, R02 + "111010" & X"3FF", -- 0x0D6: JNE 0x3FF + "001110" & X"031", -- 0x0D7: CMP R01, R03 + "111010" & X"3FF", -- 0x0D8: JNE 0x3FF + "000011" & X"000", -- 0x0D9: MOV R00, 0x00 + "111110" & X"000", -- 0x0DA: RET + "000011" & X"000", -- 0x0DB: MOV R00, 0x00 + "000011" & X"031", -- 0x0DC: MOV R01, 0x03 + "000010" & X"002", -- 0x0DD: MOV R02, R00 + "000010" & X"013", -- 0x0DE: MOV R03, R01 + "010101" & X"010", -- 0x0DF: SUB R00, 0x01 + "010111" & X"001", -- 0x0E0: SUBC R01, 0x00 + "010101" & X"012", -- 0x0E1: SUB R02, 0x01 + "001111" & X"FF2", -- 0x0E2: CMP R02, 0xFF + "111010" & X"0E6", -- 0x0E3: JNE 0x0E6 + "010101" & X"013", -- 0x0E4: SUB R03, 0x01 + "001111" & X"003", -- 0x0E5: CMP R03, 0x00 + "111010" & X"0DF", -- 0x0E6: JNE 0x0DF + "001110" & X"020", -- 0x0E7: CMP R00, R02 + "111010" & X"3FF", -- 0x0E8: JNE 0x3FF + "001110" & X"031", -- 0x0E9: CMP R01, R03 + "111010" & X"3FF", -- 0x0EA: JNE 0x3FF + "000011" & X"000", -- 0x0EB: MOV R00, 0x00 + "111110" & X"000", -- 0x0EC: RET + "000011" & X"030", -- 0x0ED: MOV R00, 0x03 + "000011" & X"051", -- 0x0EE: MOV R01, 0x05 + "101110" & X"050", -- 0x0EF: SUB 0x05, R00 + "010101" & X"031", -- 0x0F0: SUB R01, 0x03 + "001110" & X"010", -- 0x0F1: CMP R00, R01 + "111010" & X"3FF", -- 0x0F2: JNE 0x3FF + "000011" & X"030", -- 0x0F3: MOV R00, 0x03 + "000011" & X"051", -- 0x0F4: MOV R01, 0x05 + "010100" & X"010", -- 0x0F5: SUB R00, R01 + "101111" & X"000", -- 0x0F6: SUBC 0x00, R00 + "001111" & X"010", -- 0x0F7: CMP R00, 0x01 + "111010" & X"3FF", -- 0x0F8: JNE 0x3FF + "010001" & X"000", -- 0x0F9: ADD R00, 0x00 + "010110" & X"001", -- 0x0FA: SUBC R01, R00 + "001111" & X"041", -- 0x0FB: CMP R01, 0x04 + "111010" & X"3FF", -- 0x0FC: JNE 0x3FF + "000011" & X"000", -- 0x0FD: MOV R00, 0x00 + "111110" & X"000", -- 0x0FE: RET + "000011" & X"010", -- 0x0FF: MOV R00, 0x01 + "001101" & X"5A0", -- 0x100: MOVC (0x5A), R00 + "010101" & X"010", -- 0x101: DEC R00 + "001101" & X"000", -- 0x102: MOVC (0x00), R00 + "001010" & X"5A1", -- 0x103: MOVC R01, (0x5A) + "001100" & X"A51", -- 0x104: MOVC (R01), 0xA5 + "001001" & X"010", -- 0x105: MOVC R00, (R01) + "001001" & X"011", -- 0x106: MOVC R01, (R01) + "010001" & X"5A1", -- 0x107: ADD R01, 0x5A + "001001" & X"010", -- 0x108: MOVC R00, (R01) + "001011" & X"000", -- 0x109: MOVC (R00), R00 + "001001" & X"002", -- 0x10A: MOVC R02, (R00) + "001110" & X"002", -- 0x10B: CMP R02, R00 + "111010" & X"3FF", -- 0x10C: JNE 0x3FF + "001011" & X"021", -- 0x10D: MOVC (R01), R02 + "001001" & X"022", -- 0x10E: MOVC R02, (R02) + "001110" & X"012", -- 0x10F: CMP R02, R01 + "111010" & X"3FF", -- 0x110: JNE 0x3FF + "010101" & X"011", -- 0x111: DEC R01 + "010001" & X"010", -- 0x112: INC R00 + "110010" & X"109", -- 0x113: JNZ 0x109 + "111110" & X"000", -- 0x114: RET + "000011" & X"010", -- 0x115: MOV R00, 0x01 + "001000" & X"600", -- 0x116: MOVX (0x60), R00 + "010101" & X"010", -- 0x117: DEC R00 + "001000" & X"060", -- 0x118: MOVX (0x06), R00 + "000101" & X"601", -- 0x119: MOVX R01, (0x60) + "000111" & X"A51", -- 0x11A: MOVX (R01), 0xA5 + "000100" & X"010", -- 0x11B: MOVX R00, (R01) + "000100" & X"011", -- 0x11C: MOVX R01, (R01) + "010001" & X"5A1", -- 0x11D: ADD R01, 0x5A + "000100" & X"010", -- 0x11E: MOVX R00, (R01) + "000110" & X"000", -- 0x11F: MOVX (R00), R00 + "000100" & X"002", -- 0x120: MOVX R02, (R00) + "001110" & X"002", -- 0x121: CMP R02, R00 + "111010" & X"3FF", -- 0x122: JNE 0x3FF + "000110" & X"021", -- 0x123: MOVX (R01), R02 + "000100" & X"022", -- 0x124: MOVX R02, (R02) + "001110" & X"012", -- 0x125: CMP R02, R01 + "111010" & X"3FF", -- 0x126: JNE 0x3FF + "010101" & X"011", -- 0x127: DEC R01 + "010001" & X"010", -- 0x128: INC R00 + "110010" & X"11F", -- 0x129: JNZ 0x11F + "111110" & X"000", -- 0x12A: RET + "000011" & X"AA0", -- 0x12B: MOV R00, 0xAA + "000011" & X"001", -- 0x12C: MOV R01, 0x00 + "111100" & X"000", -- 0x12D: PUSH R00 + "010001" & X"010", -- 0x12E: INC R00 + "010101" & X"011", -- 0x12F: DEC R01 + "110010" & X"12D", -- 0x130: JNZ 0x12D + "111101" & X"000", -- 0x131: POP R00 + "010101" & X"011", -- 0x132: DEC R01 + "110010" & X"131", -- 0x133: JNZ 0x131 + "001111" & X"AA0", -- 0x134: CMP R00, 0xAA + "111010" & X"3FF", -- 0x135: JNE 0x3FF + "111110" & X"000", -- 0x136: RET + "000011" & X"550", -- 0x137: MOV R00, 0x55 + "111100" & X"000", -- 0x138: PUSH R00 + "000011" & X"000", -- 0x139: MOV R00, 0x00 + "000011" & X"FF1", -- 0x13A: MOV R01, 0xFF + "111011" & X"151", -- 0x13B: CALL 0x151 + "111101" & X"000", -- 0x13C: POP R00 + "001111" & X"550", -- 0x13D: CMP R00, 0x55 + "111010" & X"3FF", -- 0x13E: JNE 0x3FF + "000011" & X"010", -- 0x13F: MOV R00, 0x01 + "000011" & X"481", -- 0x140: MOV R01, 0x48 + "100110" & X"050", -- 0x141: COUT (0x05), R00 + "111100" & X"001", -- 0x142: PUSH R01 + "000011" & X"000", -- 0x143: MOV R00, 0x00 + "000011" & X"3B1", -- 0x144: MOV R01, 0x3B + "100110" & X"050", -- 0x145: COUT (0x05), R00 + "111100" & X"001", -- 0x146: PUSH R01 + "111110" & X"000", -- 0x147: RET + "000011" & X"010", -- 0x148: MOV R00, 0x01 + "000011" & X"501", -- 0x149: MOV R01, 0x50 + "100110" & X"050", -- 0x14A: COUT (0x05), R00 + "111100" & X"001", -- 0x14B: PUSH R01 + "000011" & X"000", -- 0x14C: MOV R00, 0x00 + "000011" & X"3B1", -- 0x14D: MOV R01, 0x3B + "100110" & X"050", -- 0x14E: COUT (0x05), R00 + "111100" & X"001", -- 0x14F: PUSH R01 + "111110" & X"000", -- 0x150: RET + "001110" & X"010", -- 0x151: CMP R00, R01 + "111001" & X"155", -- 0x152: JEQ 0x155 + "010001" & X"010", -- 0x153: INC R00 + "110000" & X"158", -- 0x154: JMP 0x158 + "010101" & X"010", -- 0x155: DEC R00 + "010101" & X"011", -- 0x156: DEC R01 + "111110" & X"000", -- 0x157: RET + "111011" & X"151", -- 0x158: CALL 0x151 + "110000" & X"155", -- 0x159: JMP 0x155 + "000011" & X"A50", -- 0x15A: MOV R00, 0xA5 + "000011" & X"5A1", -- 0x15B: MOV R01, 0x5A + "101010" & X"000", -- 0x15C: SWAP R00 + "001111" & X"5A0", -- 0x15D: CMP R00, 0x5A + "111010" & X"3FF", -- 0x15E: JNE 0x3FF + "101010" & X"000", -- 0x15F: SWAP R00 + "001111" & X"A50", -- 0x160: CMP R00, 0xA5 + "111010" & X"3FF", -- 0x161: JNE 0x3FF + "000011" & X"D20", -- 0x162: MOV R00, 0xD2 + "101010" & X"000", -- 0x163: SWAP R00 + "001111" & X"2D0", -- 0x164: CMP R00, 0x2D + "111010" & X"3FF", -- 0x165: JNE 0x3FF + "101010" & X"001", -- 0x166: SWAP R01 + "001111" & X"2D0", -- 0x167: CMP R00, 0x2D + "111010" & X"3FF", -- 0x168: JNE 0x3FF + "001111" & X"A51", -- 0x169: CMP R01, 0xA5 + "111010" & X"3FF", -- 0x16A: JNE 0x3FF + "000011" & X"2D0", -- 0x16B: MOV R00, 0x2D + "011110" & X"000", -- 0x16C: SHL R00 + "001111" & X"5A0", -- 0x16D: CMP R00, 0x5A + "111010" & X"3FF", -- 0x16E: JNE 0x3FF + "011110" & X"000", -- 0x16F: SHL R00 + "001111" & X"B40", -- 0x170: CMP R00, 0xB4 + "111010" & X"3FF", -- 0x171: JNE 0x3FF + "011110" & X"000", -- 0x172: SHL R00 + "001111" & X"680", -- 0x173: CMP R00, 0x68 + "111010" & X"3FF", -- 0x174: JNE 0x3FF + "011110" & X"000", -- 0x175: SHL R00 + "001111" & X"D00", -- 0x176: CMP R00, 0xD0 + "111010" & X"3FF", -- 0x177: JNE 0x3FF + "011110" & X"000", -- 0x178: SHL R00 + "001111" & X"A00", -- 0x179: CMP R00, 0xA0 + "111010" & X"3FF", -- 0x17A: JNE 0x3FF + "011110" & X"000", -- 0x17B: SHL R00 + "001111" & X"400", -- 0x17C: CMP R00, 0x40 + "111010" & X"3FF", -- 0x17D: JNE 0x3FF + "011110" & X"000", -- 0x17E: SHL R00 + "001111" & X"800", -- 0x17F: CMP R00, 0x80 + "111010" & X"3FF", -- 0x180: JNE 0x3FF + "011110" & X"000", -- 0x181: SHL R00 + "001111" & X"000", -- 0x182: CMP R00, 0x00 + "111010" & X"3FF", -- 0x183: JNE 0x3FF + "000011" & X"841", -- 0x184: MOV R01, 0x84 + "011111" & X"001", -- 0x185: SHR R01 + "001111" & X"421", -- 0x186: CMP R01, 0x42 + "111010" & X"3FF", -- 0x187: JNE 0x3FF + "011111" & X"001", -- 0x188: SHR R01 + "001111" & X"211", -- 0x189: CMP R01, 0x21 + "111010" & X"3FF", -- 0x18A: JNE 0x3FF + "011111" & X"001", -- 0x18B: SHR R01 + "001111" & X"101", -- 0x18C: CMP R01, 0x10 + "111010" & X"3FF", -- 0x18D: JNE 0x3FF + "011111" & X"001", -- 0x18E: SHR R01 + "001111" & X"081", -- 0x18F: CMP R01, 0x08 + "111010" & X"3FF", -- 0x190: JNE 0x3FF + "011111" & X"001", -- 0x191: SHR R01 + "001111" & X"041", -- 0x192: CMP R01, 0x04 + "111010" & X"3FF", -- 0x193: JNE 0x3FF + "011111" & X"001", -- 0x194: SHR R01 + "001111" & X"021", -- 0x195: CMP R01, 0x02 + "111010" & X"3FF", -- 0x196: JNE 0x3FF + "011111" & X"001", -- 0x197: SHR R01 + "001111" & X"011", -- 0x198: CMP R01, 0x01 + "111010" & X"3FF", -- 0x199: JNE 0x3FF + "011111" & X"001", -- 0x19A: SHR R01 + "001111" & X"001", -- 0x19B: CMP R01, 0x00 + "111010" & X"3FF", -- 0x19C: JNE 0x3FF + "000011" & X"C50", -- 0x19D: MOV R00, 0xC5 + "100000" & X"000", -- 0x19E: ROL R00 + "001111" & X"8B0", -- 0x19F: CMP R00, 0x8B + "111010" & X"3FF", -- 0x1A0: JNE 0x3FF + "100000" & X"000", -- 0x1A1: ROL R00 + "001111" & X"170", -- 0x1A2: CMP R00, 0x17 + "111010" & X"3FF", -- 0x1A3: JNE 0x3FF + "100000" & X"000", -- 0x1A4: ROL R00 + "001111" & X"2E0", -- 0x1A5: CMP R00, 0x2E + "111010" & X"3FF", -- 0x1A6: JNE 0x3FF + "100000" & X"000", -- 0x1A7: ROL R00 + "001111" & X"5C0", -- 0x1A8: CMP R00, 0x5C + "111010" & X"3FF", -- 0x1A9: JNE 0x3FF + "100000" & X"000", -- 0x1AA: ROL R00 + "001111" & X"B80", -- 0x1AB: CMP R00, 0xB8 + "111010" & X"3FF", -- 0x1AC: JNE 0x3FF + "100000" & X"000", -- 0x1AD: ROL R00 + "001111" & X"710", -- 0x1AE: CMP R00, 0x71 + "111010" & X"3FF", -- 0x1AF: JNE 0x3FF + "100000" & X"000", -- 0x1B0: ROL R00 + "001111" & X"E20", -- 0x1B1: CMP R00, 0xE2 + "111010" & X"3FF", -- 0x1B2: JNE 0x3FF + "100000" & X"000", -- 0x1B3: ROL R00 + "001111" & X"C50", -- 0x1B4: CMP R00, 0xC5 + "111010" & X"3FF", -- 0x1B5: JNE 0x3FF + "000011" & X"631", -- 0x1B6: MOV R01, 0x63 + "100001" & X"001", -- 0x1B7: ROR R01 + "001111" & X"B11", -- 0x1B8: CMP R01, 0xB1 + "111010" & X"3FF", -- 0x1B9: JNE 0x3FF + "100001" & X"001", -- 0x1BA: ROR R01 + "001111" & X"D81", -- 0x1BB: CMP R01, 0xD8 + "111010" & X"3FF", -- 0x1BC: JNE 0x3FF + "100001" & X"001", -- 0x1BD: ROR R01 + "001111" & X"6C1", -- 0x1BE: CMP R01, 0x6C + "111010" & X"3FF", -- 0x1BF: JNE 0x3FF + "100001" & X"001", -- 0x1C0: ROR R01 + "001111" & X"361", -- 0x1C1: CMP R01, 0x36 + "111010" & X"3FF", -- 0x1C2: JNE 0x3FF + "100001" & X"001", -- 0x1C3: ROR R01 + "001111" & X"1B1", -- 0x1C4: CMP R01, 0x1B + "111010" & X"3FF", -- 0x1C5: JNE 0x3FF + "100001" & X"001", -- 0x1C6: ROR R01 + "001111" & X"8D1", -- 0x1C7: CMP R01, 0x8D + "111010" & X"3FF", -- 0x1C8: JNE 0x3FF + "100001" & X"001", -- 0x1C9: ROR R01 + "001111" & X"C61", -- 0x1CA: CMP R01, 0xC6 + "111010" & X"3FF", -- 0x1CB: JNE 0x3FF + "100001" & X"001", -- 0x1CC: ROR R01 + "001111" & X"631", -- 0x1CD: CMP R01, 0x63 + "111010" & X"3FF", -- 0x1CE: JNE 0x3FF + "011100" & X"000", -- 0x1CF: XOR R00, R00 + "000011" & X"C50", -- 0x1D0: MOV R00, 0xC5 + "100010" & X"000", -- 0x1D1: ROLC R00 + "111100" & X"000", -- 0x1D2: PUSH R00 + "100010" & X"000", -- 0x1D3: ROLC R00 + "111100" & X"000", -- 0x1D4: PUSH R00 + "100010" & X"000", -- 0x1D5: ROLC R00 + "111100" & X"000", -- 0x1D6: PUSH R00 + "100010" & X"000", -- 0x1D7: ROLC R00 + "111100" & X"000", -- 0x1D8: PUSH R00 + "100010" & X"000", -- 0x1D9: ROLC R00 + "111100" & X"000", -- 0x1DA: PUSH R00 + "100010" & X"000", -- 0x1DB: ROLC R00 + "111100" & X"000", -- 0x1DC: PUSH R00 + "100010" & X"000", -- 0x1DD: ROLC R00 + "111100" & X"000", -- 0x1DE: PUSH R00 + "100010" & X"000", -- 0x1DF: ROLC R00 + "111100" & X"000", -- 0x1E0: PUSH R00 + "100010" & X"000", -- 0x1E1: ROLC R00 + "001111" & X"C50", -- 0x1E2: CMP R00, 0xC5 + "111010" & X"3FF", -- 0x1E3: JNE 0x3FF + "111101" & X"000", -- 0x1E4: POP R00 + "001111" & X"620", -- 0x1E5: CMP R00, 0x62 + "111010" & X"3FF", -- 0x1E6: JNE 0x3FF + "111101" & X"000", -- 0x1E7: POP R00 + "001111" & X"B10", -- 0x1E8: CMP R00, 0xB1 + "111010" & X"3FF", -- 0x1E9: JNE 0x3FF + "111101" & X"000", -- 0x1EA: POP R00 + "001111" & X"580", -- 0x1EB: CMP R00, 0x58 + "111010" & X"3FF", -- 0x1EC: JNE 0x3FF + "111101" & X"000", -- 0x1ED: POP R00 + "001111" & X"AC0", -- 0x1EE: CMP R00, 0xAC + "111010" & X"3FF", -- 0x1EF: JNE 0x3FF + "111101" & X"000", -- 0x1F0: POP R00 + "001111" & X"560", -- 0x1F1: CMP R00, 0x56 + "111010" & X"3FF", -- 0x1F2: JNE 0x3FF + "111101" & X"000", -- 0x1F3: POP R00 + "001111" & X"2B0", -- 0x1F4: CMP R00, 0x2B + "111010" & X"3FF", -- 0x1F5: JNE 0x3FF + "111101" & X"000", -- 0x1F6: POP R00 + "001111" & X"150", -- 0x1F7: CMP R00, 0x15 + "111010" & X"3FF", -- 0x1F8: JNE 0x3FF + "111101" & X"000", -- 0x1F9: POP R00 + "001111" & X"8A0", -- 0x1FA: CMP R00, 0x8A + "111010" & X"3FF", -- 0x1FB: JNE 0x3FF + "011100" & X"011", -- 0x1FC: XOR R01, R01 + "000011" & X"631", -- 0x1FD: MOV R01, 0x63 + "100011" & X"001", -- 0x1FE: RORC R01 + "111100" & X"001", -- 0x1FF: PUSH R01 + "100011" & X"001", -- 0x200: RORC R01 + "111100" & X"001", -- 0x201: PUSH R01 + "100011" & X"001", -- 0x202: RORC R01 + "111100" & X"001", -- 0x203: PUSH R01 + "100011" & X"001", -- 0x204: RORC R01 + "111100" & X"001", -- 0x205: PUSH R01 + "100011" & X"001", -- 0x206: RORC R01 + "111100" & X"001", -- 0x207: PUSH R01 + "100011" & X"001", -- 0x208: RORC R01 + "111100" & X"001", -- 0x209: PUSH R01 + "100011" & X"001", -- 0x20A: RORC R01 + "111100" & X"001", -- 0x20B: PUSH R01 + "100011" & X"001", -- 0x20C: RORC R01 + "111100" & X"001", -- 0x20D: PUSH R01 + "100011" & X"001", -- 0x20E: RORC R01 + "001111" & X"631", -- 0x20F: CMP R01, 0x63 + "111010" & X"3FF", -- 0x210: JNE 0x3FF + "111101" & X"001", -- 0x211: POP R01 + "001111" & X"C61", -- 0x212: CMP R01, 0xC6 + "111010" & X"3FF", -- 0x213: JNE 0x3FF + "111101" & X"001", -- 0x214: POP R01 + "001111" & X"8C1", -- 0x215: CMP R01, 0x8C + "111010" & X"3FF", -- 0x216: JNE 0x3FF + "111101" & X"001", -- 0x217: POP R01 + "001111" & X"191", -- 0x218: CMP R01, 0x19 + "111010" & X"3FF", -- 0x219: JNE 0x3FF + "111101" & X"001", -- 0x21A: POP R01 + "001111" & X"331", -- 0x21B: CMP R01, 0x33 + "111010" & X"3FF", -- 0x21C: JNE 0x3FF + "111101" & X"001", -- 0x21D: POP R01 + "001111" & X"661", -- 0x21E: CMP R01, 0x66 + "111010" & X"3FF", -- 0x21F: JNE 0x3FF + "111101" & X"001", -- 0x220: POP R01 + "001111" & X"CC1", -- 0x221: CMP R01, 0xCC + "111010" & X"3FF", -- 0x222: JNE 0x3FF + "111101" & X"001", -- 0x223: POP R01 + "001111" & X"981", -- 0x224: CMP R01, 0x98 + "111010" & X"3FF", -- 0x225: JNE 0x3FF + "111101" & X"001", -- 0x226: POP R01 + "001111" & X"311", -- 0x227: CMP R01, 0x31 + "111010" & X"3FF", -- 0x228: JNE 0x3FF + "111110" & X"000", -- 0x229: RET + "000011" & X"A50", -- 0x22A: MOV R00, 0xA5 + "101010" & X"000", -- 0x22B: SWAP R00 + "111100" & X"000", -- 0x22C: PUSH R00 + "011001" & X"0F0", -- 0x22D: AND R00, 0x0F + "001111" & X"0A0", -- 0x22E: CMP R00, 0x0A + "111010" & X"3FF", -- 0x22F: JNE 0x3FF + "111101" & X"000", -- 0x230: POP R00 + "111100" & X"000", -- 0x231: PUSH R00 + "011001" & X"0F0", -- 0x232: AND R00, 0x0F + "001111" & X"0A0", -- 0x233: CMP R00, 0x0A + "111101" & X"001", -- 0x234: POP R01 + "111010" & X"3FF", -- 0x235: JNE 0x3FF + "101010" & X"001", -- 0x236: SWAP R01 + "000011" & X"0F2", -- 0x237: MOV R02, 0x0F + "011000" & X"021", -- 0x238: AND R01, R02 + "001111" & X"051", -- 0x239: CMP R01, 0x05 + "111010" & X"3FF", -- 0x23A: JNE 0x3FF + "000011" & X"050", -- 0x23B: MOV R00, 0x05 + "000011" & X"A02", -- 0x23C: MOV R02, 0xA0 + "101010" & X"000", -- 0x23D: SWAP R00 + "011010" & X"002", -- 0x23E: OR R02, R00 + "001111" & X"F02", -- 0x23F: CMP R02, 0xF0 + "111010" & X"3FF", -- 0x240: JNE 0x3FF + "101010" & X"000", -- 0x241: SWAP R00 + "011011" & X"500", -- 0x242: OR R00, 0x50 + "001111" & X"550", -- 0x243: CMP R00, 0x55 + "111010" & X"3FF", -- 0x244: JNE 0x3FF + "000011" & X"011", -- 0x245: MOV R01, 0x01 + "000011" & X"010", -- 0x246: MOV R00, 0x01 + "011101" & X"010", -- 0x247: XOR R00, 0x01 + "110010" & X"3FF", -- 0x248: JNZ 0x3FF + "011100" & X"010", -- 0x249: XOR R00, R01 + "001111" & X"010", -- 0x24A: CMP R00, 0x01 + "111010" & X"3FF", -- 0x24B: JNE 0x3FF + "111110" & X"000", -- 0x24C: RET + "000011" & X"030", -- 0x24D: MOV R00, 0x03 + "100110" & X"030", -- 0x24E: COUT (0x03), R00 + "101000" & X"020", -- 0x24F: XIN R00, (0x02) + "011011" & X"010", -- 0x250: OR R00, 0x01 + "100100" & X"020", -- 0x251: XOUT (0x02), R00 + "000000" & X"000", -- 0x252: NOP + "000000" & X"000", -- 0x253: NOP + "000000" & X"000", -- 0x254: NOP + "000000" & X"000", -- 0x255: NOP + "000000" & X"000", -- 0x256: NOP + "000000" & X"000", -- 0x257: NOP + "101000" & X"020", -- 0x258: XIN R00, (0x02) + "011001" & X"FE0", -- 0x259: AND R00, 0xFE + "100100" & X"020", -- 0x25A: XOUT (0x02), R00 + "000000" & X"000", -- 0x25B: NOP + "000000" & X"000", -- 0x25C: NOP + "000000" & X"000", -- 0x25D: NOP + "000000" & X"000", -- 0x25E: NOP + "101001" & X"030", -- 0x25F: CIN R00, (0x03) + "011011" & X"800", -- 0x260: OR R00, 0x80 + "100110" & X"030", -- 0x261: COUT (0x03), R00 + "000000" & X"000", -- 0x262: NOP + "101001" & X"030", -- 0x263: CIN R00, (0x03) + "011011" & X"800", -- 0x264: OR R00, 0x80 + "100110" & X"030", -- 0x265: COUT (0x03), R00 + "000000" & X"000", -- 0x266: NOP + "101001" & X"030", -- 0x267: CIN R00, (0x03) + "011011" & X"800", -- 0x268: OR R00, 0x80 + "100110" & X"030", -- 0x269: COUT (0x03), R00 + "000000" & X"000", -- 0x26A: NOP + "101001" & X"030", -- 0x26B: CIN R00, (0x03) + "011011" & X"800", -- 0x26C: OR R00, 0x80 + "100110" & X"030", -- 0x26D: COUT (0x03), R00 + "000000" & X"000", -- 0x26E: NOP + "000000" & X"000", -- 0x26F: NOP + "000000" & X"000", -- 0x270: NOP + "000000" & X"000", -- 0x271: NOP + "000000" & X"000", -- 0x272: NOP + "000000" & X"000", -- 0x273: NOP + "000000" & X"000", -- 0x274: NOP + "000000" & X"000", -- 0x275: NOP + "000000" & X"000", -- 0x276: NOP + "111110" & X"000", -- 0x277: RET + "010101" & X"000", -- 0x278: SUB R00, 0x00 + "110011" & X"3FF", -- 0x279: JC 0x3FF + "101011" & X"000", -- 0x27A: SETC + "110100" & X"3FF", -- 0x27B: JNC 0x3FF + "000000" & X"000", -- 0x27C: NOP + "010101" & X"000", -- 0x27D: SUB R00, 0x00 + "110011" & X"3FF", -- 0x27E: JC 0x3FF + "000011" & X"000", -- 0x27F: MOV R00, 0x00 + "010101" & X"000", -- 0x280: CLRC + "110011" & X"3FF", -- 0x281: JC 0x3FF + "101011" & X"000", -- 0x282: SETC + "110100" & X"3FF", -- 0x283: JNC 0x3FF + "000000" & X"000", -- 0x284: NOP + "010101" & X"000", -- 0x285: CLRC + "110011" & X"3FF", -- 0x286: JC 0x3FF + "111110" & X"000", -- 0x287: RET + "010001" & X"01E", -- 0x288: INC R14 + "111111" & X"000", -- 0x289: RETI + "000000" & X"000", -- 0x28A: + "000000" & X"000", -- 0x28B: + "000000" & X"000", -- 0x28C: + "000000" & X"000", -- 0x28D: + "000000" & X"000", -- 0x28E: + "000000" & X"000", -- 0x28F: + "000000" & X"000", -- 0x290: + "000000" & X"000", -- 0x291: + "000000" & X"000", -- 0x292: + "000000" & X"000", -- 0x293: + "000000" & X"000", -- 0x294: + "000000" & X"000", -- 0x295: + "000000" & X"000", -- 0x296: + "000000" & X"000", -- 0x297: + "000000" & X"000", -- 0x298: + "000000" & X"000", -- 0x299: + "000000" & X"000", -- 0x29A: + "000000" & X"000", -- 0x29B: + "000000" & X"000", -- 0x29C: + "000000" & X"000", -- 0x29D: + "000000" & X"000", -- 0x29E: + "000000" & X"000", -- 0x29F: + "000000" & X"000", -- 0x2A0: + "000000" & X"000", -- 0x2A1: + "000000" & X"000", -- 0x2A2: + "000000" & X"000", -- 0x2A3: + "000000" & X"000", -- 0x2A4: + "000000" & X"000", -- 0x2A5: + "000000" & X"000", -- 0x2A6: + "000000" & X"000", -- 0x2A7: + "000000" & X"000", -- 0x2A8: + "000000" & X"000", -- 0x2A9: + "000000" & X"000", -- 0x2AA: + "000000" & X"000", -- 0x2AB: + "000000" & X"000", -- 0x2AC: + "000000" & X"000", -- 0x2AD: + "000000" & X"000", -- 0x2AE: + "000000" & X"000", -- 0x2AF: + "000000" & X"000", -- 0x2B0: + "000000" & X"000", -- 0x2B1: + "000000" & X"000", -- 0x2B2: + "000000" & X"000", -- 0x2B3: + "000000" & X"000", -- 0x2B4: + "000000" & X"000", -- 0x2B5: + "000000" & X"000", -- 0x2B6: + "000000" & X"000", -- 0x2B7: + "000000" & X"000", -- 0x2B8: + "000000" & X"000", -- 0x2B9: + "000000" & X"000", -- 0x2BA: + "000000" & X"000", -- 0x2BB: + "000000" & X"000", -- 0x2BC: + "000000" & X"000", -- 0x2BD: + "000000" & X"000", -- 0x2BE: + "000000" & X"000", -- 0x2BF: + "000000" & X"000", -- 0x2C0: + "000000" & X"000", -- 0x2C1: + "000000" & X"000", -- 0x2C2: + "000000" & X"000", -- 0x2C3: + "000000" & X"000", -- 0x2C4: + "000000" & X"000", -- 0x2C5: + "000000" & X"000", -- 0x2C6: + "000000" & X"000", -- 0x2C7: + "000000" & X"000", -- 0x2C8: + "000000" & X"000", -- 0x2C9: + "000000" & X"000", -- 0x2CA: + "000000" & X"000", -- 0x2CB: + "000000" & X"000", -- 0x2CC: + "000000" & X"000", -- 0x2CD: + "000000" & X"000", -- 0x2CE: + "000000" & X"000", -- 0x2CF: + "000000" & X"000", -- 0x2D0: + "000000" & X"000", -- 0x2D1: + "000000" & X"000", -- 0x2D2: + "000000" & X"000", -- 0x2D3: + "000000" & X"000", -- 0x2D4: + "000000" & X"000", -- 0x2D5: + "000000" & X"000", -- 0x2D6: + "000000" & X"000", -- 0x2D7: + "000000" & X"000", -- 0x2D8: + "000000" & X"000", -- 0x2D9: + "000000" & X"000", -- 0x2DA: + "000000" & X"000", -- 0x2DB: + "000000" & X"000", -- 0x2DC: + "000000" & X"000", -- 0x2DD: + "000000" & X"000", -- 0x2DE: + "000000" & X"000", -- 0x2DF: + "000000" & X"000", -- 0x2E0: + "000000" & X"000", -- 0x2E1: + "000000" & X"000", -- 0x2E2: + "000000" & X"000", -- 0x2E3: + "000000" & X"000", -- 0x2E4: + "000000" & X"000", -- 0x2E5: + "000000" & X"000", -- 0x2E6: + "000000" & X"000", -- 0x2E7: + "000000" & X"000", -- 0x2E8: + "000000" & X"000", -- 0x2E9: + "000000" & X"000", -- 0x2EA: + "000000" & X"000", -- 0x2EB: + "000000" & X"000", -- 0x2EC: + "000000" & X"000", -- 0x2ED: + "000000" & X"000", -- 0x2EE: + "000000" & X"000", -- 0x2EF: + "000000" & X"000", -- 0x2F0: + "000000" & X"000", -- 0x2F1: + "000000" & X"000", -- 0x2F2: + "000000" & X"000", -- 0x2F3: + "000000" & X"000", -- 0x2F4: + "000000" & X"000", -- 0x2F5: + "000000" & X"000", -- 0x2F6: + "000000" & X"000", -- 0x2F7: + "000000" & X"000", -- 0x2F8: + "000000" & X"000", -- 0x2F9: + "000000" & X"000", -- 0x2FA: + "000000" & X"000", -- 0x2FB: + "000000" & X"000", -- 0x2FC: + "000000" & X"000", -- 0x2FD: + "000000" & X"000", -- 0x2FE: + "110000" & X"2FF", -- 0x2FF: JMP 0x2FF + "000000" & X"000", -- 0x300: + "000000" & X"000", -- 0x301: + "000000" & X"000", -- 0x302: + "000000" & X"000", -- 0x303: + "000000" & X"000", -- 0x304: + "000000" & X"000", -- 0x305: + "000000" & X"000", -- 0x306: + "000000" & X"000", -- 0x307: + "000000" & X"000", -- 0x308: + "000000" & X"000", -- 0x309: + "000000" & X"000", -- 0x30A: + "000000" & X"000", -- 0x30B: + "000000" & X"000", -- 0x30C: + "000000" & X"000", -- 0x30D: + "000000" & X"000", -- 0x30E: + "000000" & X"000", -- 0x30F: + "000000" & X"000", -- 0x310: + "000000" & X"000", -- 0x311: + "000000" & X"000", -- 0x312: + "000000" & X"000", -- 0x313: + "000000" & X"000", -- 0x314: + "000000" & X"000", -- 0x315: + "000000" & X"000", -- 0x316: + "000000" & X"000", -- 0x317: + "000000" & X"000", -- 0x318: + "000000" & X"000", -- 0x319: + "000000" & X"000", -- 0x31A: + "000000" & X"000", -- 0x31B: + "000000" & X"000", -- 0x31C: + "000000" & X"000", -- 0x31D: + "000000" & X"000", -- 0x31E: + "000000" & X"000", -- 0x31F: + "000000" & X"000", -- 0x320: + "000000" & X"000", -- 0x321: + "000000" & X"000", -- 0x322: + "000000" & X"000", -- 0x323: + "000000" & X"000", -- 0x324: + "000000" & X"000", -- 0x325: + "000000" & X"000", -- 0x326: + "000000" & X"000", -- 0x327: + "000000" & X"000", -- 0x328: + "000000" & X"000", -- 0x329: + "000000" & X"000", -- 0x32A: + "000000" & X"000", -- 0x32B: + "000000" & X"000", -- 0x32C: + "000000" & X"000", -- 0x32D: + "000000" & X"000", -- 0x32E: + "000000" & X"000", -- 0x32F: + "000000" & X"000", -- 0x330: + "000000" & X"000", -- 0x331: + "000000" & X"000", -- 0x332: + "000000" & X"000", -- 0x333: + "000000" & X"000", -- 0x334: + "000000" & X"000", -- 0x335: + "000000" & X"000", -- 0x336: + "000000" & X"000", -- 0x337: + "000000" & X"000", -- 0x338: + "000000" & X"000", -- 0x339: + "000000" & X"000", -- 0x33A: + "000000" & X"000", -- 0x33B: + "000000" & X"000", -- 0x33C: + "000000" & X"000", -- 0x33D: + "000000" & X"000", -- 0x33E: + "000000" & X"000", -- 0x33F: + "000000" & X"000", -- 0x340: + "000000" & X"000", -- 0x341: + "000000" & X"000", -- 0x342: + "000000" & X"000", -- 0x343: + "000000" & X"000", -- 0x344: + "000000" & X"000", -- 0x345: + "000000" & X"000", -- 0x346: + "000000" & X"000", -- 0x347: + "000000" & X"000", -- 0x348: + "000000" & X"000", -- 0x349: + "000000" & X"000", -- 0x34A: + "000000" & X"000", -- 0x34B: + "000000" & X"000", -- 0x34C: + "000000" & X"000", -- 0x34D: + "000000" & X"000", -- 0x34E: + "000000" & X"000", -- 0x34F: + "000000" & X"000", -- 0x350: + "000000" & X"000", -- 0x351: + "000000" & X"000", -- 0x352: + "000000" & X"000", -- 0x353: + "000000" & X"000", -- 0x354: + "000000" & X"000", -- 0x355: + "000000" & X"000", -- 0x356: + "000000" & X"000", -- 0x357: + "000000" & X"000", -- 0x358: + "000000" & X"000", -- 0x359: + "000000" & X"000", -- 0x35A: + "000000" & X"000", -- 0x35B: + "000000" & X"000", -- 0x35C: + "000000" & X"000", -- 0x35D: + "000000" & X"000", -- 0x35E: + "000000" & X"000", -- 0x35F: + "000000" & X"000", -- 0x360: + "000000" & X"000", -- 0x361: + "000000" & X"000", -- 0x362: + "000000" & X"000", -- 0x363: + "000000" & X"000", -- 0x364: + "000000" & X"000", -- 0x365: + "000000" & X"000", -- 0x366: + "000000" & X"000", -- 0x367: + "000000" & X"000", -- 0x368: + "000000" & X"000", -- 0x369: + "000000" & X"000", -- 0x36A: + "000000" & X"000", -- 0x36B: + "000000" & X"000", -- 0x36C: + "000000" & X"000", -- 0x36D: + "000000" & X"000", -- 0x36E: + "000000" & X"000", -- 0x36F: + "000000" & X"000", -- 0x370: + "000000" & X"000", -- 0x371: + "000000" & X"000", -- 0x372: + "000000" & X"000", -- 0x373: + "000000" & X"000", -- 0x374: + "000000" & X"000", -- 0x375: + "000000" & X"000", -- 0x376: + "000000" & X"000", -- 0x377: + "000000" & X"000", -- 0x378: + "000000" & X"000", -- 0x379: + "000000" & X"000", -- 0x37A: + "000000" & X"000", -- 0x37B: + "000000" & X"000", -- 0x37C: + "000000" & X"000", -- 0x37D: + "000000" & X"000", -- 0x37E: + "000000" & X"000", -- 0x37F: + "000000" & X"000", -- 0x380: + "000000" & X"000", -- 0x381: + "000000" & X"000", -- 0x382: + "000000" & X"000", -- 0x383: + "000000" & X"000", -- 0x384: + "000000" & X"000", -- 0x385: + "000000" & X"000", -- 0x386: + "000000" & X"000", -- 0x387: + "000000" & X"000", -- 0x388: + "000000" & X"000", -- 0x389: + "000000" & X"000", -- 0x38A: + "000000" & X"000", -- 0x38B: + "000000" & X"000", -- 0x38C: + "000000" & X"000", -- 0x38D: + "000000" & X"000", -- 0x38E: + "000000" & X"000", -- 0x38F: + "000000" & X"000", -- 0x390: + "000000" & X"000", -- 0x391: + "000000" & X"000", -- 0x392: + "000000" & X"000", -- 0x393: + "000000" & X"000", -- 0x394: + "000000" & X"000", -- 0x395: + "000000" & X"000", -- 0x396: + "000000" & X"000", -- 0x397: + "000000" & X"000", -- 0x398: + "000000" & X"000", -- 0x399: + "000000" & X"000", -- 0x39A: + "000000" & X"000", -- 0x39B: + "000000" & X"000", -- 0x39C: + "000000" & X"000", -- 0x39D: + "000000" & X"000", -- 0x39E: + "000000" & X"000", -- 0x39F: + "000000" & X"000", -- 0x3A0: + "000000" & X"000", -- 0x3A1: + "000000" & X"000", -- 0x3A2: + "000000" & X"000", -- 0x3A3: + "000000" & X"000", -- 0x3A4: + "000000" & X"000", -- 0x3A5: + "000000" & X"000", -- 0x3A6: + "000000" & X"000", -- 0x3A7: + "000000" & X"000", -- 0x3A8: + "000000" & X"000", -- 0x3A9: + "000000" & X"000", -- 0x3AA: + "000000" & X"000", -- 0x3AB: + "000000" & X"000", -- 0x3AC: + "000000" & X"000", -- 0x3AD: + "000000" & X"000", -- 0x3AE: + "000000" & X"000", -- 0x3AF: + "000000" & X"000", -- 0x3B0: + "000000" & X"000", -- 0x3B1: + "000000" & X"000", -- 0x3B2: + "000000" & X"000", -- 0x3B3: + "000000" & X"000", -- 0x3B4: + "000000" & X"000", -- 0x3B5: + "000000" & X"000", -- 0x3B6: + "000000" & X"000", -- 0x3B7: + "000000" & X"000", -- 0x3B8: + "000000" & X"000", -- 0x3B9: + "000000" & X"000", -- 0x3BA: + "000000" & X"000", -- 0x3BB: + "000000" & X"000", -- 0x3BC: + "000000" & X"000", -- 0x3BD: + "000000" & X"000", -- 0x3BE: + "000000" & X"000", -- 0x3BF: + "000000" & X"000", -- 0x3C0: + "000000" & X"000", -- 0x3C1: + "000000" & X"000", -- 0x3C2: + "000000" & X"000", -- 0x3C3: + "000000" & X"000", -- 0x3C4: + "000000" & X"000", -- 0x3C5: + "000000" & X"000", -- 0x3C6: + "000000" & X"000", -- 0x3C7: + "000000" & X"000", -- 0x3C8: + "000000" & X"000", -- 0x3C9: + "000000" & X"000", -- 0x3CA: + "000000" & X"000", -- 0x3CB: + "000000" & X"000", -- 0x3CC: + "000000" & X"000", -- 0x3CD: + "000000" & X"000", -- 0x3CE: + "000000" & X"000", -- 0x3CF: + "000000" & X"000", -- 0x3D0: + "000000" & X"000", -- 0x3D1: + "000000" & X"000", -- 0x3D2: + "000000" & X"000", -- 0x3D3: + "000000" & X"000", -- 0x3D4: + "000000" & X"000", -- 0x3D5: + "000000" & X"000", -- 0x3D6: + "000000" & X"000", -- 0x3D7: + "000000" & X"000", -- 0x3D8: + "000000" & X"000", -- 0x3D9: + "000000" & X"000", -- 0x3DA: + "000000" & X"000", -- 0x3DB: + "000000" & X"000", -- 0x3DC: + "000000" & X"000", -- 0x3DD: + "000000" & X"000", -- 0x3DE: + "000000" & X"000", -- 0x3DF: + "000000" & X"000", -- 0x3E0: + "000000" & X"000", -- 0x3E1: + "000000" & X"000", -- 0x3E2: + "000000" & X"000", -- 0x3E3: + "000000" & X"000", -- 0x3E4: + "000000" & X"000", -- 0x3E5: + "000000" & X"000", -- 0x3E6: + "000000" & X"000", -- 0x3E7: + "000000" & X"000", -- 0x3E8: + "000000" & X"000", -- 0x3E9: + "000000" & X"000", -- 0x3EA: + "000000" & X"000", -- 0x3EB: + "000000" & X"000", -- 0x3EC: + "000000" & X"000", -- 0x3ED: + "000000" & X"000", -- 0x3EE: + "000000" & X"000", -- 0x3EF: + "000000" & X"000", -- 0x3F0: + "000000" & X"000", -- 0x3F1: + "000000" & X"000", -- 0x3F2: + "000000" & X"000", -- 0x3F3: + "000000" & X"000", -- 0x3F4: + "000000" & X"000", -- 0x3F5: + "000000" & X"000", -- 0x3F6: + "000000" & X"000", -- 0x3F7: + "000000" & X"000", -- 0x3F8: + "000000" & X"000", -- 0x3F9: + "000000" & X"000", -- 0x3FA: + "000000" & X"000", -- 0x3FB: + "000000" & X"000", -- 0x3FC: + "000000" & X"000", -- 0x3FD: + "000000" & X"000", -- 0x3FE: + "110000" & X"3FF" -- 0x3FF: JMP 0x3FF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/JCpu/src/itest_xrom.vhdl b/lib/CPUs/JCpu/src/itest_xrom.vhdl new file mode 100644 index 0000000..4206abc --- /dev/null +++ b/lib/CPUs/JCpu/src/itest_xrom.vhdl @@ -0,0 +1,317 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.cpu_pkg.all; + +-- JASM_ROM_INSERT_HERE +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE itest OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from itest.jsm + constant xmem_rom : xmem_rom_t := + ( + X"48", -- 0x00 + X"61", -- 0x01 + X"6C", -- 0x02 + X"6C", -- 0x03 + X"6F", -- 0x04 + X"00", -- 0x05 + X"00", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end itest; + diff --git a/lib/CPUs/JCpu/src/itest_xrom_ld.vhdl b/lib/CPUs/JCpu/src/itest_xrom_ld.vhdl new file mode 100644 index 0000000..60a84ac --- /dev/null +++ b/lib/CPUs/JCpu/src/itest_xrom_ld.vhdl @@ -0,0 +1,413 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from itest.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"48", -- 0x00 + X"61", -- 0x01 + X"6C", -- 0x02 + X"6C", -- 0x03 + X"6F", -- 0x04 + X"00", -- 0x05 + X"00", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/JCpu/src/mul8x8_irom.vhdl b/lib/CPUs/JCpu/src/mul8x8_irom.vhdl new file mode 100644 index 0000000..3b0de3b --- /dev/null +++ b/lib/CPUs/JCpu/src/mul8x8_irom.vhdl @@ -0,0 +1,88 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.cpu_pkg.all; + +-- JASM_ROM_INSERT_HERE +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); +END irom; + +ARCHITECTURE mul8x8 OF irom IS + + type imem_rom_t is array (0 to 26) of inst_t; + + -- Assembled from mul8x8.jsm + constant imem_rom : imem_rom_t := + ( + "110000" & X"001", -- 0x000: JMP 0x001 + "000011" & X"450", -- 0x001: MOV R00, 0x45 + "000011" & X"F51", -- 0x002: MOV R01, 0xF5 + "111011" & X"005", -- 0x003: CALL 0x005 + "110000" & X"004", -- 0x004: JMP 0x004 + "111100" & X"002", -- 0x005: PUSH R02 + "111100" & X"003", -- 0x006: PUSH R03 + "111100" & X"004", -- 0x007: PUSH R04 + "000010" & X"014", -- 0x008: MOV R04, R01 + "000011" & X"001", -- 0x009: MOV R01, 0x00 + "000011" & X"002", -- 0x00A: MOV R02, 0x00 + "000011" & X"003", -- 0x00B: MOV R03, 0x00 + "001111" & X"014", -- 0x00C: CMP R04, 0x01 + "111001" & X"015", -- 0x00D: JEQ 0x015 + "011111" & X"004", -- 0x00E: SHR R04 + "110100" & X"012", -- 0x00F: JNC 0x012 + "010000" & X"002", -- 0x010: ADD R02, R00 + "010010" & X"013", -- 0x011: ADDC R03, R01 + "011110" & X"000", -- 0x012: SHL R00 + "100010" & X"001", -- 0x013: ROLC R01 + "110000" & X"00C", -- 0x014: JMP 0x00C + "010000" & X"020", -- 0x015: ADD R00, R02 + "010010" & X"031", -- 0x016: ADDC R01, R03 + "111101" & X"004", -- 0x017: POP R04 + "111101" & X"003", -- 0x018: POP R03 + "111101" & X"002", -- 0x019: POP R02 + "111110" & X"000" -- 0x01A: RET + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +end mul8x8; + diff --git a/lib/CPUs/JCpu/src/mul8x8_irom_ld.vhdl b/lib/CPUs/JCpu/src/mul8x8_irom_ld.vhdl new file mode 100644 index 0000000..4303d08 --- /dev/null +++ b/lib/CPUs/JCpu/src/mul8x8_irom_ld.vhdl @@ -0,0 +1,1181 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from mul8x8.jsm + type imem_rom_t is array (0 to 1023) of inst_t; + signal imem_rom : imem_rom_t := + ( + "110000" & X"001", -- 0x000: JMP 0x001 + "000011" & X"450", -- 0x001: MOV R00, 0x45 + "000011" & X"F51", -- 0x002: MOV R01, 0xF5 + "111011" & X"005", -- 0x003: CALL 0x005 + "110000" & X"004", -- 0x004: JMP 0x004 + "111100" & X"002", -- 0x005: PUSH R02 + "111100" & X"003", -- 0x006: PUSH R03 + "111100" & X"004", -- 0x007: PUSH R04 + "000010" & X"014", -- 0x008: MOV R04, R01 + "000011" & X"001", -- 0x009: MOV R01, 0x00 + "000011" & X"002", -- 0x00A: MOV R02, 0x00 + "000011" & X"003", -- 0x00B: MOV R03, 0x00 + "001111" & X"014", -- 0x00C: CMP R04, 0x01 + "111001" & X"015", -- 0x00D: JEQ 0x015 + "011111" & X"004", -- 0x00E: SHR R04 + "110100" & X"012", -- 0x00F: JNC 0x012 + "010000" & X"002", -- 0x010: ADD R02, R00 + "010010" & X"013", -- 0x011: ADDC R03, R01 + "011110" & X"000", -- 0x012: SHL R00 + "100010" & X"001", -- 0x013: ROLC R01 + "110000" & X"00C", -- 0x014: JMP 0x00C + "010000" & X"020", -- 0x015: ADD R00, R02 + "010010" & X"031", -- 0x016: ADDC R01, R03 + "111101" & X"004", -- 0x017: POP R04 + "111101" & X"003", -- 0x018: POP R03 + "111101" & X"002", -- 0x019: POP R02 + "111110" & X"000", -- 0x01A: RET + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000" + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/JCpu/src/mul8x8_xrom.vhdl b/lib/CPUs/JCpu/src/mul8x8_xrom.vhdl new file mode 100644 index 0000000..508e8cf --- /dev/null +++ b/lib/CPUs/JCpu/src/mul8x8_xrom.vhdl @@ -0,0 +1,317 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.cpu_pkg.all; + +-- JASM_ROM_INSERT_HERE +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE mul8x8 OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from mul8x8.jsm + constant xmem_rom : xmem_rom_t := + ( + X"00", -- 0x00 + X"00", -- 0x01 + X"00", -- 0x02 + X"00", -- 0x03 + X"00", -- 0x04 + X"00", -- 0x05 + X"00", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end mul8x8; + diff --git a/lib/CPUs/JCpu/src/mul8x8_xrom_ld.vhdl b/lib/CPUs/JCpu/src/mul8x8_xrom_ld.vhdl new file mode 100644 index 0000000..a75d090 --- /dev/null +++ b/lib/CPUs/JCpu/src/mul8x8_xrom_ld.vhdl @@ -0,0 +1,413 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from mul8x8.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"00", -- 0x00 + X"00", -- 0x01 + X"00", -- 0x02 + X"00", -- 0x03 + X"00", -- 0x04 + X"00", -- 0x05 + X"00", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/JCpu/src/reti_issue_irom.vhdl b/lib/CPUs/JCpu/src/reti_issue_irom.vhdl new file mode 100644 index 0000000..9355a7d --- /dev/null +++ b/lib/CPUs/JCpu/src/reti_issue_irom.vhdl @@ -0,0 +1,89 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.cpu_pkg.all; + +-- JASM_ROM_INSERT_HERE +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); +END irom; + +ARCHITECTURE reti_issue OF irom IS + + type imem_rom_t is array (0 to 27) of inst_t; + + -- Assembled from reti_issue.jsm + constant imem_rom : imem_rom_t := + ( + "110000" & X"002", -- 0x000: JMP 0x002 + "111111" & X"000", -- 0x001: RETI + "000011" & X"050", -- 0x002: MOV R00, 0x05 + "100110" & X"030", -- 0x003: COUT (0x03), R00 + "000011" & X"000", -- 0x004: MOV R00, 0x00 + "000000" & X"000", -- 0x005: NOP + "010001" & X"010", -- 0x006: INC R00 + "000000" & X"000", -- 0x007: NOP + "111011" & X"01B", -- 0x008: CALL 0x01B + "000000" & X"000", -- 0x009: NOP + "111100" & X"003", -- 0x00A: PUSH R03 + "000000" & X"000", -- 0x00B: NOP + "111100" & X"002", -- 0x00C: PUSH R02 + "000000" & X"000", -- 0x00D: NOP + "111100" & X"001", -- 0x00E: PUSH R01 + "000000" & X"000", -- 0x00F: NOP + "111100" & X"000", -- 0x010: PUSH R00 + "000000" & X"000", -- 0x011: NOP + "111101" & X"000", -- 0x012: POP R00 + "000000" & X"000", -- 0x013: NOP + "111101" & X"001", -- 0x014: POP R01 + "000000" & X"000", -- 0x015: NOP + "111101" & X"002", -- 0x016: POP R02 + "000000" & X"000", -- 0x017: NOP + "111101" & X"003", -- 0x018: POP R03 + "000000" & X"000", -- 0x019: NOP + "110000" & X"005", -- 0x01A: JMP 0x005 + "111110" & X"000" -- 0x01B: RET + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +end reti_issue; + diff --git a/lib/CPUs/JCpu/src/reti_issue_irom_ld.vhdl b/lib/CPUs/JCpu/src/reti_issue_irom_ld.vhdl new file mode 100644 index 0000000..d1b4bd1 --- /dev/null +++ b/lib/CPUs/JCpu/src/reti_issue_irom_ld.vhdl @@ -0,0 +1,1181 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from reti_issue.jsm + type imem_rom_t is array (0 to 1023) of inst_t; + signal imem_rom : imem_rom_t := + ( + "110000" & X"002", -- 0x000: JMP 0x002 + "111111" & X"000", -- 0x001: RETI + "000011" & X"050", -- 0x002: MOV R00, 0x05 + "100110" & X"030", -- 0x003: COUT (0x03), R00 + "000011" & X"000", -- 0x004: MOV R00, 0x00 + "000000" & X"000", -- 0x005: NOP + "010001" & X"010", -- 0x006: INC R00 + "000000" & X"000", -- 0x007: NOP + "111011" & X"01B", -- 0x008: CALL 0x01B + "000000" & X"000", -- 0x009: NOP + "111100" & X"003", -- 0x00A: PUSH R03 + "000000" & X"000", -- 0x00B: NOP + "111100" & X"002", -- 0x00C: PUSH R02 + "000000" & X"000", -- 0x00D: NOP + "111100" & X"001", -- 0x00E: PUSH R01 + "000000" & X"000", -- 0x00F: NOP + "111100" & X"000", -- 0x010: PUSH R00 + "000000" & X"000", -- 0x011: NOP + "111101" & X"000", -- 0x012: POP R00 + "000000" & X"000", -- 0x013: NOP + "111101" & X"001", -- 0x014: POP R01 + "000000" & X"000", -- 0x015: NOP + "111101" & X"002", -- 0x016: POP R02 + "000000" & X"000", -- 0x017: NOP + "111101" & X"003", -- 0x018: POP R03 + "000000" & X"000", -- 0x019: NOP + "110000" & X"005", -- 0x01A: JMP 0x005 + "111110" & X"000", -- 0x01B: RET + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000", + "000000" & X"000" + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/JCpu/src/reti_issue_xrom.vhdl b/lib/CPUs/JCpu/src/reti_issue_xrom.vhdl new file mode 100644 index 0000000..a7a33f9 --- /dev/null +++ b/lib/CPUs/JCpu/src/reti_issue_xrom.vhdl @@ -0,0 +1,317 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.cpu_pkg.all; + +-- JASM_ROM_INSERT_HERE +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); +END xrom; + +ARCHITECTURE reti_issue OF xrom IS + + type xmem_rom_t is array (0 to 255) of dmem_data_t; + + -- Assembled from reti_issue.jsm + constant xmem_rom : xmem_rom_t := + ( + X"00", -- 0x00 + X"00", -- 0x01 + X"00", -- 0x02 + X"00", -- 0x03 + X"00", -- 0x04 + X"00", -- 0x05 + X"00", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + +begin + +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +end reti_issue; + diff --git a/lib/CPUs/JCpu/src/reti_issue_xrom_ld.vhdl b/lib/CPUs/JCpu/src/reti_issue_xrom_ld.vhdl new file mode 100644 index 0000000..244c1b5 --- /dev/null +++ b/lib/CPUs/JCpu/src/reti_issue_xrom_ld.vhdl @@ -0,0 +1,413 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + -- Assembled from reti_issue.jsm + type xmem_rom_t is array (0 to 255) of dmem_data_t; + signal xmem_rom : xmem_rom_t := + ( + X"00", -- 0x00 + X"00", -- 0x01 + X"00", -- 0x02 + X"00", -- 0x03 + X"00", -- 0x04 + X"00", -- 0x05 + X"00", -- 0x06 + X"00", -- 0x07 + X"00", -- 0x08 + X"00", -- 0x09 + X"00", -- 0x0A + X"00", -- 0x0B + X"00", -- 0x0C + X"00", -- 0x0D + X"00", -- 0x0E + X"00", -- 0x0F + X"00", -- 0x10 + X"00", -- 0x11 + X"00", -- 0x12 + X"00", -- 0x13 + X"00", -- 0x14 + X"00", -- 0x15 + X"00", -- 0x16 + X"00", -- 0x17 + X"00", -- 0x18 + X"00", -- 0x19 + X"00", -- 0x1A + X"00", -- 0x1B + X"00", -- 0x1C + X"00", -- 0x1D + X"00", -- 0x1E + X"00", -- 0x1F + X"00", -- 0x20 + X"00", -- 0x21 + X"00", -- 0x22 + X"00", -- 0x23 + X"00", -- 0x24 + X"00", -- 0x25 + X"00", -- 0x26 + X"00", -- 0x27 + X"00", -- 0x28 + X"00", -- 0x29 + X"00", -- 0x2A + X"00", -- 0x2B + X"00", -- 0x2C + X"00", -- 0x2D + X"00", -- 0x2E + X"00", -- 0x2F + X"00", -- 0x30 + X"00", -- 0x31 + X"00", -- 0x32 + X"00", -- 0x33 + X"00", -- 0x34 + X"00", -- 0x35 + X"00", -- 0x36 + X"00", -- 0x37 + X"00", -- 0x38 + X"00", -- 0x39 + X"00", -- 0x3A + X"00", -- 0x3B + X"00", -- 0x3C + X"00", -- 0x3D + X"00", -- 0x3E + X"00", -- 0x3F + X"00", -- 0x40 + X"00", -- 0x41 + X"00", -- 0x42 + X"00", -- 0x43 + X"00", -- 0x44 + X"00", -- 0x45 + X"00", -- 0x46 + X"00", -- 0x47 + X"00", -- 0x48 + X"00", -- 0x49 + X"00", -- 0x4A + X"00", -- 0x4B + X"00", -- 0x4C + X"00", -- 0x4D + X"00", -- 0x4E + X"00", -- 0x4F + X"00", -- 0x50 + X"00", -- 0x51 + X"00", -- 0x52 + X"00", -- 0x53 + X"00", -- 0x54 + X"00", -- 0x55 + X"00", -- 0x56 + X"00", -- 0x57 + X"00", -- 0x58 + X"00", -- 0x59 + X"00", -- 0x5A + X"00", -- 0x5B + X"00", -- 0x5C + X"00", -- 0x5D + X"00", -- 0x5E + X"00", -- 0x5F + X"00", -- 0x60 + X"00", -- 0x61 + X"00", -- 0x62 + X"00", -- 0x63 + X"00", -- 0x64 + X"00", -- 0x65 + X"00", -- 0x66 + X"00", -- 0x67 + X"00", -- 0x68 + X"00", -- 0x69 + X"00", -- 0x6A + X"00", -- 0x6B + X"00", -- 0x6C + X"00", -- 0x6D + X"00", -- 0x6E + X"00", -- 0x6F + X"00", -- 0x70 + X"00", -- 0x71 + X"00", -- 0x72 + X"00", -- 0x73 + X"00", -- 0x74 + X"00", -- 0x75 + X"00", -- 0x76 + X"00", -- 0x77 + X"00", -- 0x78 + X"00", -- 0x79 + X"00", -- 0x7A + X"00", -- 0x7B + X"00", -- 0x7C + X"00", -- 0x7D + X"00", -- 0x7E + X"00", -- 0x7F + X"00", -- 0x80 + X"00", -- 0x81 + X"00", -- 0x82 + X"00", -- 0x83 + X"00", -- 0x84 + X"00", -- 0x85 + X"00", -- 0x86 + X"00", -- 0x87 + X"00", -- 0x88 + X"00", -- 0x89 + X"00", -- 0x8A + X"00", -- 0x8B + X"00", -- 0x8C + X"00", -- 0x8D + X"00", -- 0x8E + X"00", -- 0x8F + X"00", -- 0x90 + X"00", -- 0x91 + X"00", -- 0x92 + X"00", -- 0x93 + X"00", -- 0x94 + X"00", -- 0x95 + X"00", -- 0x96 + X"00", -- 0x97 + X"00", -- 0x98 + X"00", -- 0x99 + X"00", -- 0x9A + X"00", -- 0x9B + X"00", -- 0x9C + X"00", -- 0x9D + X"00", -- 0x9E + X"00", -- 0x9F + X"00", -- 0xA0 + X"00", -- 0xA1 + X"00", -- 0xA2 + X"00", -- 0xA3 + X"00", -- 0xA4 + X"00", -- 0xA5 + X"00", -- 0xA6 + X"00", -- 0xA7 + X"00", -- 0xA8 + X"00", -- 0xA9 + X"00", -- 0xAA + X"00", -- 0xAB + X"00", -- 0xAC + X"00", -- 0xAD + X"00", -- 0xAE + X"00", -- 0xAF + X"00", -- 0xB0 + X"00", -- 0xB1 + X"00", -- 0xB2 + X"00", -- 0xB3 + X"00", -- 0xB4 + X"00", -- 0xB5 + X"00", -- 0xB6 + X"00", -- 0xB7 + X"00", -- 0xB8 + X"00", -- 0xB9 + X"00", -- 0xBA + X"00", -- 0xBB + X"00", -- 0xBC + X"00", -- 0xBD + X"00", -- 0xBE + X"00", -- 0xBF + X"00", -- 0xC0 + X"00", -- 0xC1 + X"00", -- 0xC2 + X"00", -- 0xC3 + X"00", -- 0xC4 + X"00", -- 0xC5 + X"00", -- 0xC6 + X"00", -- 0xC7 + X"00", -- 0xC8 + X"00", -- 0xC9 + X"00", -- 0xCA + X"00", -- 0xCB + X"00", -- 0xCC + X"00", -- 0xCD + X"00", -- 0xCE + X"00", -- 0xCF + X"00", -- 0xD0 + X"00", -- 0xD1 + X"00", -- 0xD2 + X"00", -- 0xD3 + X"00", -- 0xD4 + X"00", -- 0xD5 + X"00", -- 0xD6 + X"00", -- 0xD7 + X"00", -- 0xD8 + X"00", -- 0xD9 + X"00", -- 0xDA + X"00", -- 0xDB + X"00", -- 0xDC + X"00", -- 0xDD + X"00", -- 0xDE + X"00", -- 0xDF + X"00", -- 0xE0 + X"00", -- 0xE1 + X"00", -- 0xE2 + X"00", -- 0xE3 + X"00", -- 0xE4 + X"00", -- 0xE5 + X"00", -- 0xE6 + X"00", -- 0xE7 + X"00", -- 0xE8 + X"00", -- 0xE9 + X"00", -- 0xEA + X"00", -- 0xEB + X"00", -- 0xEC + X"00", -- 0xED + X"00", -- 0xEE + X"00", -- 0xEF + X"00", -- 0xF0 + X"00", -- 0xF1 + X"00", -- 0xF2 + X"00", -- 0xF3 + X"00", -- 0xF4 + X"00", -- 0xF5 + X"00", -- 0xF6 + X"00", -- 0xF7 + X"00", -- 0xF8 + X"00", -- 0xF9 + X"00", -- 0xFA + X"00", -- 0xFB + X"00", -- 0xFC + X"00", -- 0xFD + X"00", -- 0xFE + X"00" -- 0xFF + ); + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/JCpu/src/tb_cpu_embedded.vhd b/lib/CPUs/JCpu/src/tb_cpu_embedded.vhd new file mode 100644 index 0000000..ede20d5 --- /dev/null +++ b/lib/CPUs/JCpu/src/tb_cpu_embedded.vhd @@ -0,0 +1,129 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: testbench for embedded cpu with rom +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; +use std.textio.all; -- Imports the standard textio package. + +library work; +use work.cpu_pkg.all; + +ENTITY tb_cpu_embedded IS +END tb_cpu_embedded; + +ARCHITECTURE behavior OF tb_cpu_embedded IS + + COMPONENT cpu_embedded + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_wait : in STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + xmem_din : in unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_ADDR_WIDTH-1 downto 0); + io_sel : out STD_LOGIC + ); + END COMPONENT; + + constant CLK_PERIOD : time := 10 ns; + type sram_t is array (integer range <>) of dmem_data_t; + signal rst : std_logic := '1'; + signal clk : std_logic := '1'; + signal ce : std_logic := '0'; + signal int_in : std_logic := '0'; + signal int_ack : std_logic; + signal xmem_wait : std_logic := '0'; + signal xmem_din : dmem_data_t := (others => '-'); + signal xmem_dout : dmem_data_t; + signal xmem_addr : dmem_addr_t; + signal xmem_we : std_logic; + signal xmem_re : std_logic; + signal io_sel : std_logic; + signal sram : sram_t(0 to 2**dmem_addr_t'length-1); + + +BEGIN + +uut: cpu_embedded + PORT MAP( + rst => rst, + clk => clk, + ce => ce, + int_in => int_in, + int_ack => int_ack, + xmem_wait => xmem_wait, + xmem_we => xmem_we, + xmem_re => xmem_re, + xmem_din => xmem_din, + xmem_dout => xmem_dout, + xmem_addr => xmem_addr, + io_sel => io_sel + ); + +CLK_GEN: process + begin + wait for CLK_PERIOD/2; + clk <= not clk; + end process; + +STIMULUS: process + + begin + + wait for 3*CLK_PERIOD; + rst <= '0'; + wait for 2*CLK_PERIOD; + + wait until rising_edge(clk); + ce <= '1'; + + wait for 1000*CLK_PERIOD; + + assert false report "Test finished" severity error; + wait; + + end process; + +SRAM_RW: process(rst, clk, xmem_addr, xmem_dout, xmem_we) + begin + if (rst = '1') then + xmem_din <= X"00"; + elsif rising_edge(clk) then + if io_sel = '0' then + if xmem_we = '1' then + sram(to_integer(xmem_addr)) <= xmem_dout; + end if; + xmem_din <= to_01(sram(to_integer(xmem_addr))); + else + xmem_din <= X"FF"; + end if; + end if; + end process; + +END; diff --git a/lib/CPUs/JCpu/src/tb_cpu_itest.vhd b/lib/CPUs/JCpu/src/tb_cpu_itest.vhd new file mode 100644 index 0000000..80d8c43 --- /dev/null +++ b/lib/CPUs/JCpu/src/tb_cpu_itest.vhd @@ -0,0 +1,218 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: Formal test of correct function of JCPU, +-- also writes 'opc.lst' for JASM-assembler +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; +use std.textio.all; -- Imports the standard textio package. + +library work; +use work.cpu_pkg.all; +use work.PCK_FIO.all; + +ENTITY tb_cpu IS +END tb_cpu; + +ARCHITECTURE behavior OF tb_cpu IS + + COMPONENT cpu + Generic ( + use_instr_register : boolean; + use_ctrl_rom : boolean + ); + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + int_in : in STD_LOGIC; + int_ack : out STD_LOGIC; + xmem_wait : in STD_LOGIC; + xmem_we : out STD_LOGIC; + xmem_re : out STD_LOGIC; + instr_din : in unsigned (IMEM_DATA_WIDTH-1 downto 0); + instr_addr : out unsigned (IMEM_ADDR_WIDTH-1 downto 0); + xmem_din : in unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_dout : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + xmem_addr : out unsigned (DMEM_DATA_WIDTH-1 downto 0); + io_sel : out STD_LOGIC + + ); + END COMPONENT; + + COMPONENT irom + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + END COMPONENT; + + constant CLK_PERIOD : time := 10 ns; + type prom_t is array (integer range <>) of inst_t; + type sram_t is array (integer range <>) of dmem_data_t; + signal rst : std_logic := '1'; + signal clk : std_logic := '1'; + signal ce : std_logic := '0'; + signal int_in : std_logic := '0'; + signal int_ack : std_logic; + signal xmem_wait : std_logic := '1'; + signal irom_data : unsigned (IMEM_DATA_WIDTH-1 downto 0) := (others => '-'); + signal irom_addr : unsigned (IMEM_ADDR_WIDTH-1 downto 0); + signal xmem_din : dmem_data_t := (others => '-'); + signal xmem_dout : dmem_data_t; + signal xmem_addr : unsigned (DMEM_DATA_WIDTH-1 downto 0); + signal xmem_we : std_logic; + signal xmem_re : std_logic; + signal io_sel : std_logic; + signal sram : sram_t(0 to 2**DMEM_DATA_WIDTH-1); + + type reg_t is record + revision : dmem_data_t; + testid : dmem_data_t; + interrupt : std_logic; + end record; + + signal reg : reg_t; + + +BEGIN + + int_in <= reg.interrupt; +uut: cpu + GENERIC MAP + ( + use_instr_register => false, + use_ctrl_rom => true + ) + PORT MAP( + rst => rst, + clk => clk, + ce => ce, + int_in => int_in, + int_ack => int_ack, + xmem_wait => xmem_wait, + xmem_we => xmem_we, + xmem_re => xmem_re, + instr_din => irom_data, + instr_addr => irom_addr, + xmem_din => xmem_din, + xmem_dout => xmem_dout, + xmem_addr => xmem_addr, + io_sel => io_sel + ); + +the_irom: irom + PORT MAP( + clk => clk, + ce => ce, + addr => irom_addr, + dout => irom_data + ); + +CLK_GEN: process + begin + wait for CLK_PERIOD/2; + clk <= not clk; + end process; + +XWAIT_GEN:process(rst, clk) + variable cnt : unsigned(3 downto 0); + begin + if (rst = '1') then + cnt := (others => '1'); + elsif rising_edge(clk) then + if cnt /= "0000" then + cnt := cnt - 1; + else + cnt := (others => '1'); + xmem_wait <= not xmem_wait; + end if; + end if; + end process; + +STIMULUS: process + file RESULT: text open write_mode is "../tools/opc.list"; + variable L: line; + + begin + + for i in 0 to instr_name_array'length-1 loop + fprint(RESULT, L,"%d %s\n", fo(i), instr_name_array(i)); + end loop; + + wait for 3*CLK_PERIOD; + rst <= '0'; + wait for 2*CLK_PERIOD; + + wait until rising_edge(clk); + ce <= '1'; + + assert false report "Test finished" severity error; + wait; + + end process; + +SRAM_RW: process(rst, clk) + begin + if (rst = '1') then + reg.revision <= (others => '0'); + reg.testid <= (others => '0'); + reg.interrupt <= '0'; + elsif rising_edge(clk) then + if int_ack = '1' then +-- reg.interrupt <= '0'; + end if; + if xmem_we = '1' then + if io_sel = '0' then + sram(to_integer(xmem_addr)) <= xmem_dout; + else + case xmem_addr is + when X"00" => + reg.revision <= xmem_dout; + when X"01" => + reg.testid <= xmem_dout; + when X"02" => + reg.interrupt <= xmem_dout(0); + when others => null; + end case; + end if; + else + if io_sel = '0' then + xmem_din <= to_01(sram(to_integer(xmem_addr))); + else + case xmem_addr is + when X"00" => + xmem_din <= reg.revision; + when X"01" => + xmem_din <= reg.testid; + when others => + xmem_din <= X"BC"; + end case; + end if; + end if; + end if; + end process; + +END; diff --git a/lib/CPUs/JCpu/syn/ise91/cpu_vhdl.prj b/lib/CPUs/JCpu/syn/ise91/cpu_vhdl.prj new file mode 100644 index 0000000..18718bf --- /dev/null +++ b/lib/CPUs/JCpu/syn/ise91/cpu_vhdl.prj @@ -0,0 +1,10 @@ +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\cpu_pkg.vhd" +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\stack_ctrl.vhd" +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\reg_dual.vhd" +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\pc.vhd" +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\int_ctrl.vhd" +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\dpath_ctrl.vhd" +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\chipreg.vhd" +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\chipram.vhd" +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\alu.vhd" +vhdl work "W:\vhdl\lib\CPUs\JCpu\src\core\cpu.vhd" diff --git a/lib/CPUs/JCpu/tools/eval_scan.rb b/lib/CPUs/JCpu/tools/eval_scan.rb new file mode 100644 index 0000000..0c38397 --- /dev/null +++ b/lib/CPUs/JCpu/tools/eval_scan.rb @@ -0,0 +1,42 @@ +#!/usr/bin/env ruby + +str1 = %Q!lbl: dc "Hallo", ", ", 0, 1, " der","Jens"! + +i=0; + +def get_stri_lit (str) + res = [""]; + state = "out" + + j = 0; + k = 0; + for i in (0..str.length-1) + c = str[i]; + nstate = state + case state + when "out" + if c == "\""[0] + nstate = "in" + end + when "in" + if c == "\""[0] + nstate = "out" + if j > 0 + k = k + 1; + res[k] = "" + end + else + res[k] = res[k] + format("%c", c); + j = j + 1; + end + end + state = nstate + end; + return res +end + +get_stri_lit(str1).each do |word| + puts word +end + + \ No newline at end of file diff --git a/lib/CPUs/JCpu/tools/insrom.rb b/lib/CPUs/JCpu/tools/insrom.rb new file mode 100644 index 0000000..6713f9f --- /dev/null +++ b/lib/CPUs/JCpu/tools/insrom.rb @@ -0,0 +1,46 @@ +#!/usr/bin/env ruby + +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: Insertion of code fragments into templates +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +arg = $* +rom_filename = arg[0].to_s +tpl_filename = arg[1].to_s + +subst_pattern = "JASM_ROM_INSERT_HERE" + +# -------------------------------------------------------- +# Open file +# -------------------------------------------------------- +romfile = File.open(rom_filename, "r") +tplfile = File.open(tpl_filename, "r") +re = Regexp.new(subst_pattern) + +while (line = tplfile.gets) + puts line + line.scan(re).each do |word| + romfile.each do |raw_line| + puts raw_line + end + end +end diff --git a/lib/CPUs/JCpu/tools/irom.vhd.tpl b/lib/CPUs/JCpu/tools/irom.vhd.tpl new file mode 100644 index 0000000..5f11f86 --- /dev/null +++ b/lib/CPUs/JCpu/tools/irom.vhd.tpl @@ -0,0 +1,32 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.cpu_pkg.all; + +-- JASM_ROM_INSERT_HERE + diff --git a/lib/CPUs/JCpu/tools/irom_ld.vhd.tpl b/lib/CPUs/JCpu/tools/irom_ld.vhd.tpl new file mode 100644 index 0000000..eaa41f3 --- /dev/null +++ b/lib/CPUs/JCpu/tools/irom_ld.vhd.tpl @@ -0,0 +1,151 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : inst_addr_t; + signal jtag_ld_dout : inst_t; + signal jtag_ld_din : inst_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (31 downto 0); + constant id : unsigned (31 downto 0) := X"BABE" & X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-inst_addr_t'length+1); + jtag_ld_din <= user_regi(inst_t'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto inst_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/JCpu/tools/jasm.bak.rb b/lib/CPUs/JCpu/tools/jasm.bak.rb new file mode 100644 index 0000000..4c9feb0 --- /dev/null +++ b/lib/CPUs/JCpu/tools/jasm.bak.rb @@ -0,0 +1,494 @@ +#!/usr/bin/env ruby + +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: A small assembler for the JCPU + +# Copyright (C) 2007 J. Ahrensfeld + +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +# For questions and ideas, please contact the author at jens@jayfield.org + +# --------------------------------------------------------------------- + +arg = $* +MAX_SIZE_ROM = 1024 +PROJECT_NAME = arg.to_s.gsub(/\..*/, "") +ENTITY_NAME = "rom" +ENTITY_DATA_TYPE = "inst_t" +ENTITY_ADDR_TYPE = "inst_addr_t" +OPC_LIST_NAME = "/cygdrive/w/vhdl/lib/CPUs/JCpu/tools/opc.list" + +# -------------------------------------------------------- +# Open file +# -------------------------------------------------------- +filename = arg.to_s +if !File.exists?(filename) + STDERR.puts "#{filename} does not exist" + exit 1 +end + +# -------------------------------------------------------- +# Pass 1 +# -------------------------------------------------------- +lc = 0 # Line counter +pc = 0 # Program counter +chip_dc = [0,0,0,0] # chip data counter +xmem_dc = 0 # xmem data counter +curr_segment = "UNDEF"; +page = 0 + +label_list=[[],[]] +instr_list=[nil] +file = File.open(filename, "r") +file.each do |raw_line| + lc += 1 + + # Make all upper case + iline = "#{raw_line}".strip.upcase + + # Remove comments + iline = iline.gsub(/;.*/, "") + + # Split instruction at spaces + iline_member = iline.split(" ") + + if iline_member[0] == nil + next + end + + mc = 0; + label = nil + clean_line = nil + if (iline_member[0] =~ /\w+:/) + mc += 1 + label = iline_member[0].delete(":") + if label_list.rindex(label) != nil + STDERR.puts format("Error in line %d: Duplicate label \"%s\" found", lc, label) + exit 1 + end + end + + case iline_member[mc] + when nil + value = format("0x%3.3X",pc) + when "EQU" + if 0 == (iline_member[mc+1] =~ /\d+/) + value = format("0x%2.2X",eval(iline_member[mc+1..iline_member.nitems].to_s)) + else + value = iline_member[mc+1] + end + when "ORG", "CODE" + pc = eval(iline_member[mc+1..iline_member.nitems].to_s) + value = format("0x%3.3X",pc) + when "CDATA", "CMEM" + if iline_member[mc+1] == nil + STDERR.puts format("Error in line %d: CDATA needs argument!", lc) + exit 1 + end + curr_segment = "CMEM"; + page = iline_member[mc+1].to_i(16) + when "XDATA", "XMEM" + curr_segment = "XMEM"; + when "DC" + len = 0; + iline.split("DC")[1].delete("0x").scan(/[0-9A-Fa-f]+/).each do |byte| + len += 1 + end + if curr_segment == "CMEM" + STDERR.puts format("Error in line %d: CDATA cannot be initialized!", lc) + exit 1 + else + value = format("0x%2.2X",xmem_dc) + puts format("Found DC defining %d bytes at 0x%4.4X in %s", len, xmem_dc, curr_segment); + xmem_dc += len + end + when "DB" + len = iline_member[mc+1].to_i + if curr_segment == "CMEM" + value = format("0x%2.2X",chip_dc[page]) + puts format("Found DB reserving %d bytes at 0x%4.4X in %s(%d)", len, chip_dc[page], curr_segment, page); + chip_dc[page] += len + else + value = format("0x%2.2X",xmem_dc) + puts format("Found DB reserving %d bytes at 0x%4.4X in %s", len, xmem_dc, curr_segment); + xmem_dc += len + end + else + op_line = iline_member[mc+1..iline_member.nitems].to_s + value = format("0x%3.3X",pc) + opc = iline_member[mc] + if iline_member[mc+1] != nil + op1 = op_line.gsub(/,+.*$/, "") + end + if iline_member[mc+2] != nil + op2 = op_line.scan(/,.+$/).to_s.delete(", ") + end + if instr_list[pc] == nil + instr_list[pc] = [lc, pc, opc , op1 , op2] + pc += 1 + else + STDERR.puts format("Error in line %d: Overlapping sections at %3.3X", lc, pc) + exit 1 + end + end; + + # Push labels + if label + label_list = label_list + [label, value] + end +end +file.close + +# -------------------------------------------------------- +def instr(opcode) + return format("\"%6.6B\" & X\"%3.3X\"",opcode ,0) +end + +def tcl_bits(pc, opcode) + return format("%10.10B%6.6B%12.12B",pc, opcode ,0) +end + +def instr_k(opcode, k) + return format("\"%6.6B\" & X\"%3.3X\"",opcode ,k) +end + +def tcl_bits_k(pc, opcode, k) + return format("%10.10B%6.6B%12.12B",pc, opcode ,k) +end + +def instr_r(opcode, r) + return format("\"%6.6B\" & X\"%2.2X%X\"",opcode ,0, r) +end + +def tcl_bits_r(pc, opcode, r) + return format("%10.10B%6.6B%8.8B%4.4B",pc, opcode ,0,r) +end + +def instr_kr(opcode, k, r) + return format("\"%6.6B\" & X\"%2.2X%X\"",opcode,k, r) +end + +def tcl_bits_kr(pc, opcode, k, r) + return format("%10.10B%6.6B%8.8B%4.4B",pc, opcode, k, r) +end + +def instr_rk(opcode, r, k) + return format("\"%6.6B\" & X\"%2.2X%X\"",opcode,k, r) +end + +def tcl_bits_rk(pc, opcode, r, k) + return format("%10.10B%6.6B%8.8B%4.4B",pc, opcode, k, r) +end + +def instr_rr(opcode, ra, rb) + return format("\"%6.6B\" & X\"%X%X%X\"",opcode,0, rb, ra) +end + +def tcl_bits_rr(pc, opcode, ra, rb) + return format("%10.10B%6.6B%4.4B%4.4B%4.4B",pc, opcode, 0, rb, ra) +end + +# -------------------------------------------------------- +# Read mnemonic set +# -------------------------------------------------------- +filename = OPC_LIST_NAME +if !File.exists?(filename) + STDERR.puts "#{filename} does not exist" + exit 1 +end + +mnemo_list = [] +num_opcodes = 0 +file = File.open(filename, "r") +file.each do |raw_line| + mnemo_list[num_opcodes] = raw_line.split(" ")[1] + num_opcodes += 1 +end + +# -------------------------------------------------------- +# Pass 2 +# -------------------------------------------------------- +pc = 0 +opc_start = 2 +num_errors = 0 +vhdl_trans_list = [nil] +vhdl_comment_list = [nil] +vhdl_tcl_list = [nil] +instr_list.each do |instruct| + + # puts instruct + if instruct == nil + vhdl_trans_list[pc] = format("\"%6.6B\" & X\"%3.3X\"",0 ,0) + vhdl_comment_list[pc] = format("0x%3.3X:", pc) + vhdl_tcl_list[pc] = tcl_bits(pc, 0) + pc += 1 + next + end + + # determine arglen of instruction + ilen = 0 + if instruct[opc_start+1] == nil + arglen = 0 + elsif instruct[opc_start+2] == nil + arglen = 1 + elsif instruct[opc_start+3] == nil + arglen = 2 + end + + # Symbol substitution + error = false + for i in (1..3) + subst_pos = opc_start+i + if instruct[subst_pos] == nil + next + end + expr_token = "" + expr_subst = nil + is_direct = true; + +# instruct[subst_pos] = instruct[subst_pos].delete(" ") + + # checks R0 .. R16, Mnemonics + instr_str = instruct[subst_pos] + if 0 == (instr_str =~ /\(.+\)/) + instr_str = instr_str.delete("()") + is_direct = false; + end + + expr_token = instr_str.split(/\+|\-|\*|\//)[0] + if (0 != (expr_token =~ /R[0-9]+/)) && (0 != (expr_token =~ /\d+/)) + idx = label_list.rindex(expr_token) + if idx != nil + expr_subst = label_list[idx+1] + instruct[subst_pos] = instruct[subst_pos].gsub(expr_token, expr_subst) + else + STDERR.puts format("Error in line %d: Symbol \"%s\" not found", instruct[0], expr_token) + error = true + end + end + + if expr_subst != nil + if 0 == (expr_subst =~ /\d+/) + if is_direct == true + instruct[subst_pos] = format("0x%2.2X", eval(instruct[subst_pos])) + else + instruct[subst_pos] = format("(0x%2.2X)", eval(instruct[subst_pos])) + end + else + if 0 != (expr_subst =~ /R[0-9]+/) + STDERR.puts format("Error in line %d: Invalid expression \"%s\"", instruct[0], expr_subst) + error = true + end + end + end + end + + # Parse operands + reg = [0,0] + kk = 0 + format = instruct[opc_start] + for i in (0..1) + if instruct[opc_start+i+1] =~ Regexp.new("R[0-9]+") + # Check indirect addressing + reg[i] = instruct[opc_start+i+1].delete("R()").to_i + format += "|R" + if reg[i] > 15 + STDERR.puts format("Error in line %d: Invalid register \"R%d\" specified", instruct[0], reg[i]) + error = true + end + else + if instruct[opc_start+i+1] =~ Regexp.new("[0-9A-F]+") + kk = instruct[opc_start+i+1].delete("()").to_i(16) + format += "|K" + end + end + if instruct[opc_start+i+1] =~ Regexp.new("\\(.+\\)") + format += "i"; + end + end + + # Output instruction + opcode = mnemo_list.rindex(format).to_i + mnemo = instruct[2]; + + case format + when "NOP", "HALT", "RET", "RETI" + vhdl_trans_list[pc] = instr(opcode) + vhdl_tcl_list[pc] = tcl_bits(pc, opcode) + minstr_comment = format("0x%3.3X: %s", pc, mnemo) + when "MOVC|R|Ri", "MOVX|R|Ri" + vhdl_trans_list[pc] = instr_rr(opcode, reg[0], reg[1]); + vhdl_tcl_list[pc] = tcl_bits_rr(pc, opcode, reg[0], reg[1]) + minstr_comment = format("0x%3.3X: %s R%2.2d, (R%2.2d)", pc, mnemo, reg[0], reg[1]) + when "MOV|R|R", "SUB|R|R", "ADD|R|R", "AND|R|R", "OR|R|R", "XOR|R|R", "CMP|R|R" + vhdl_trans_list[pc] = instr_rr(opcode, reg[0], reg[1]); + vhdl_tcl_list[pc] = tcl_bits_rr(pc, opcode, reg[0], reg[1]) + minstr_comment = format("0x%3.3X: %s R%2.2d, R%2.2d", pc, mnemo, reg[0], reg[1]) + when "MOVC|Ri|R", "MOVX|Ri|R" + vhdl_trans_list[pc] = instr_rr(opcode, reg[1], reg[0]); + vhdl_tcl_list[pc] = tcl_bits_rr(pc, opcode, reg[1], reg[0]) + minstr_comment = format("0x%3.3X: %s (R%2.2d), R%2.2d", pc, mnemo, reg[1], reg[0]) + when "MOVC|Ri|K", "MOVX|Ri|K", "COUT|Ri|K", "XOUT|Ri|K" + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + minstr_comment = format("0x%3.3X: %s (R%2.2d), 0x%2.2X", pc, mnemo, reg[0], kk) + when "MOVC|R|Ki", "MOVX|R|Ki", "CIN|R|Ki", "XIN|R|Ki" + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + minstr_comment = format("0x%3.3X: %s R%2.2d, (0x%2.2X)", pc, mnemo, reg[0], kk) + when "MOV|R|K", "SUB|R|K", "ADD|R|K", "AND|R|K", "OR|R|K", "XOR|R|K", "CMP|R|K" + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + minstr_comment = format("0x%3.3X: %s R%2.2d, 0x%2.2X", pc, mnemo, reg[0], kk) + when "MOVC|Ki|R", "MOVC|Ki|R", "MOVX|Ki|R", "MOVX|Ki|R", "COUT|Ki|R", "XOUT|Ki|R" + vhdl_trans_list[pc] = instr_kr(opcode, kk, reg[1]); + vhdl_tcl_list[pc] = tcl_bits_kr(pc, opcode, kk, reg[1]) + minstr_comment = format("0x%3.3X: %s (0x%2.2X), R%2.2d", pc, mnemo, kk, reg[1]) + when "CALL|K", "JMP|K", "JNZ|K", "JZ|K","JNC|K", "JC|K", "JLT|K", "JGT|K", "JLE|K", "JGE|K", "JEQ|K", "JNE|K" + vhdl_trans_list[pc] = instr_k(opcode, kk) + vhdl_tcl_list[pc] = tcl_bits_k(pc, opcode, kk) + minstr_comment = format("0x%3.3X: %s 0x%3.3X", pc, mnemo, kk) + when "PUSH|R", "POP|R", "SHR|R", "SHL|R", "ROR|R", "ROL|R", "RORC|R", "ROLC|R" + vhdl_trans_list[pc] = instr_r(opcode, reg[0]) + vhdl_tcl_list[pc] = tcl_bits_r(pc, opcode, reg[0]) + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + when "TST|R" + kk = 0 + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + opcode = mnemo_list.rindex("CMP|R|K").to_i + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + when "INC|R" + kk = 1 + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + opcode = mnemo_list.rindex("ADD|R|K").to_i + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + when "DEC|R" + kk = 1 + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + opcode = mnemo_list.rindex("SUB|R|K").to_i + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + else + STDERR.puts format("Error in line %d: Not yet implemented %s", instruct[0], format) + error = true + end + + if error + num_errors += 1 + break + end + vhdl_comment_list[pc] = minstr_comment + + puts vhdl_trans_list[pc] + " -- " + minstr_comment + + pc += 1 +end + +# -------------------------------------------------------- +# Output ROM file +# -------------------------------------------------------- +if num_errors == 0 + + filename = format("rom_%s.vhdl.snip", PROJECT_NAME) + file = File.open(filename, "w") + + file.puts format("ENTITY %s IS\n", ENTITY_NAME) + file.puts format("\tPort (\n") + file.puts format("\tclk\t\t\t: in STD_LOGIC;\n") + file.puts format("\tce\t\t\t: in STD_LOGIC;\n") + file.puts format("\taddr\t\t: in %s;\n", ENTITY_ADDR_TYPE) + file.puts format("\tdout\t\t: out %s\n", ENTITY_DATA_TYPE) + file.puts format("\t);\n") + file.puts format("END %s;\n", ENTITY_NAME) + file.puts format("\n") + file.puts format("ARCHITECTURE %s OF %s IS \n", PROJECT_NAME, ENTITY_NAME) + file.puts format("\n") + file.puts format("\ttype instruction_rom_t is array (0 to %d) of %s;\n", pc-1, ENTITY_DATA_TYPE) + file.puts format("\n") + file.puts format("\tconstant instruction_rom : instruction_rom_t :=\n") + file.puts format("\t(\n"); + for i in (0..pc-2) + file.puts "\t\t" + vhdl_trans_list[i] + ", -- " + vhdl_comment_list[i] + "\n" + end; + file.puts "\t\t" + vhdl_trans_list[pc-1] + " -- " + vhdl_comment_list[pc-1] + "\n" + file.puts format("\t);\n") + file.puts format("\n") + file.puts format("begin") + file.puts format("\n") + file.puts format("PROM_READ:") + file.puts format("\tprocess(clk, ce)\n") + file.puts format("\tbegin\n") + file.puts format("\t\tif rising_edge(clk) and ce = '1' then\n") + file.puts format("\t\t\tdout <= instruction_rom(to_integer(addr));\n") + file.puts format("\t\tend if;\n") + file.puts format("\tend process;\n") + file.puts format("\n") + file.puts format("end %s;\n", PROJECT_NAME) + puts format("ROM file written to \"%s\"\n",filename) + file.close +end +if num_errors == 0 + + filename = format("preinit_%s.vhdl.snip", PROJECT_NAME) + file = File.open(filename, "w") + + file.puts format("\tsignal instruction_rom : instruction_rom_t :=\n") + file.puts format("\t(\n"); + for i in (0..pc-2) + file.puts "\t\t" + vhdl_trans_list[i] + ", -- " + vhdl_comment_list[i] + "\n" + end; + if pc < (MAX_SIZE_ROM-1) + file.puts "\t\t" + vhdl_trans_list[pc-1] + ", -- " + vhdl_comment_list[pc-1] + "\n" + for i in (pc..(MAX_SIZE_ROM-2)) + file.puts "\t\t" + instr(0) + ",\n" + end; + file.puts "\t\t" + instr(0) + "\n" + else + file.puts "\t\t" + vhdl_trans_list[pc-1] + " -- " + vhdl_comment_list[pc-1] + "\n" + end + file.puts format("\t);\n") + puts format("PREINIT file written to \"%s\"\n",filename) + file.close +end +if num_errors == 0 + filename = format("rom_%s.tcl.snip", PROJECT_NAME) + file = File.open(filename, "w") + for i in (0..pc-1) + # Chipscope 8.1 +# file.puts format("jtag_shiftdr $handle -buffer \"%s\" -endstate RTI -device $devid", vhdl_tcl_list[i].reverse); + + # Chipscope 9.1 + file.puts format("\# %s", vhdl_comment_list[i]) + file.puts format("::chipscope::csejtag_tap shift_device_dr $handle $devid $CSEJTAG_SHIFT_READWRITE $CSEJTAG_RUN_TEST_IDLE 0 %d \"%8.8X\"\n\n", vhdl_tcl_list[i].length, vhdl_tcl_list[i].to_i(2)); + end; + puts format("TCL snippet written to \"%s\"\n",filename) + file.close +end + +# -------------------------------------------------------- +# Output final statistics +# -------------------------------------------------------- +if num_errors == 0 + puts "Program uses #{pc} instruction addresses" + puts "No errors found" + exit 0 +else + puts "#{num_errors} errors found" + exit 1 +end diff --git a/lib/CPUs/JCpu/tools/jasm.rb b/lib/CPUs/JCpu/tools/jasm.rb new file mode 100644 index 0000000..fdad0bb --- /dev/null +++ b/lib/CPUs/JCpu/tools/jasm.rb @@ -0,0 +1,814 @@ +#!/usr/bin/env ruby + +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: A small assembler for the JCPU +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +arg = $* +FILE_SUFFIX = "jsm" +IROM_MAX_SIZE = 1024 +IROM_ENTITY_NAME = "irom" +IROM_DATA_TYPE = "inst_t" +IROM_ADDR_TYPE = "inst_addr_t" +XROM_MAX_SIZE = 256 +XROM_DATA_TYPE = "dmem_data_t" +XROM_ADDR_TYPE = "dmem_addr_t" +XROM_ENTITY_NAME = "xrom" +OPC_LIST_NAME = "/cygdrive/w/vhdl/lib/CPUs/JCpu/tools/opc.list" + +# -------------------------------------------------------- +class Parser + def curr_segment + @curr_segment + end + def curr_segment=(arg) + @curr_segment=arg + end + def add_label(labelname, addr) + @label_list = @label_list + [labelname, addr] + end + def getLabelIdByName(label) + return @label_list.rindex(label) + end + def getLabelNameById(id) + return @label_list[id] + end + def put_instr(name, lc, opc , op1 , op2) + if get_instr != nil + STDERR.puts format("Error in line %d: Overlapping sections at %3.3X", lc, @pc) + exit 1 + end + @instr_list[@pc] = [lc, @pc, opc , op1 , op2, name] + end + def get_instr + return @instr_list[@pc] + end + def put_xmem(value, lc) + if get_xmem != nil + STDERR.puts format("Error in line %d: Overlapping sections at %3.3X (%s)", lc, xmem_dc, curr_segment) + exit 1 + end + @xmem[xmem_dc] = value + @xmem_dc = xmem_dc + 1 + end + def get_xmem + return @xmem[xmem_dc] + end + def xmem + return @xmem + end + def put_cmem(value, lc) + if get_cmem(page) != nil + STDERR.puts format("Error in line %d: Overlapping sections at %3.3X (%s)", lc, cmem_dc, curr_segment) + exit 1 + end + @cmem[page][cmem_dc] = value + @cmem_dc[page] = cmem_dc + 1 + end + def get_cmem(pg) + return @cmem[pg][cmem_dc] + end + def cmem(page) + return @cmem[page] + end + def cmem_dc=(addr) + @cmem_dc[page] = addr + end + def cmem_dc + @cmem_dc[page] + end + def xmem_dc=(addr) + @xmem_dc = addr + end + def xmem_dc + @xmem_dc + end + def page=(page) + @page = page; + end + def page + @page; + end + def pc=(pc) + @pc = pc; + if (pc > @pc_max) + @pc_max = pc + end + end + def pc + @pc; + end + def pc_max + @pc_max; + end + def instr_list + @instr_list + end + def label_list + @label_list + end + + def initialize() + @pc_max = 0 + @pc = 0 # Program counter + @cmem_dc = [0,0,0,0] # chip data counter + @xmem_dc = 0 # xmem data counter + @curr_segment = "UNDEF"; + @page = 0 + @label_list=[[],[]] + @instr_list=[nil] + @cmem = [[],[]]; + @xmem = []; + end + def method_missing(name, *args) + puts "I don't know the method #{name}" + end +end + +# -------------------------------------------------------- +def parse(name, obj) + +lc = 0 # Line counter +file = File.open(name, "r") + +file.each do |raw_line| + lc += 1 + + # Make all upper case + iline = "#{raw_line}".strip + + # Remove comments + iline = iline.gsub(/;.*/, "") + + # Split instruction at spaces + iline_member = iline.split(" ") + + if iline_member[0] == nil + next + end + + mc = 0; + label = nil + clean_line = nil + if (iline_member[0] =~ /\w+:/) + mc += 1 + label = iline_member[0].delete(":") + if obj.getLabelIdByName(label) != nil + STDERR.puts format("Error in line %d: Duplicate label \"%s\" found", lc, label) + exit 1 + end + end + + token = iline_member[mc] + if token + token = token.upcase + end + + case token + when nil + if obj.curr_segment == "CMEM" + curr_addr = format("0x%3.3X",obj.cmem_dc) + elsif obj.curr_segment == "XMEM" + curr_addr = format("0x%3.3X",obj.xmem_dc) + elsif obj.curr_segment == "CODE" + curr_addr = format("0x%3.3X",obj.pc) + else + STDERR.puts format("Error in line %d: Undefined segment", lc) + exit 1 + end + when "INCLUDE" + if iline_member[mc+1] == nil + STDERR.puts format("Error in line %d: %s needs argument!", lc, token) + exit 1 + end + inc_name = iline_member[mc+1].delete("\"") + puts format("Inserting \"%s\" into \"%s\" at line %d", inc_name, name, lc); + parse(inc_name, obj) + when "EQU" + if iline_member[mc+1] == nil + STDERR.puts format("Error in line %d: %s needs argument!", lc, token) + exit 1 + end + if 0 == (iline_member[mc+1] =~ /\d+/) + curr_addr = format("0x%2.2X",eval(iline_member[mc+1..iline_member.nitems].to_s)) + else + curr_addr = iline_member[mc+1] + end + when "ORG" + if iline_member[mc+1] == nil + STDERR.puts format("Error in line %d: %s needs argument!", lc, token) + exit 1 + end + offset = eval(iline_member[mc+1..iline_member.nitems].to_s) + case obj.curr_segment + when "CODE" + obj.pc = offset + curr_addr = format("0x%3.3X",obj.pc) + when "CMEM" + obj.cmem_dc = offset + when "XMEM" + obj.xmem_dc = offset + + end + when "CODE" + curr_addr = format("0x%3.3X",obj.pc) + obj.curr_segment = "CODE"; + when "CDATA", "CMEM" + if iline_member[mc+1] == nil + STDERR.puts format("Error in line %d: %s needs argument!", lc, token) + exit 1 + end + obj.curr_segment = "CMEM"; + obj.page = iline_member[mc+1].to_i(16) + when "XDATA", "XMEM" + obj.curr_segment = "XMEM"; + when "DC" + len = 0; + if iline_member[mc+1] == nil + STDERR.puts format("Error in line %d: %s needs argument!", lc, token) + exit 1 + end + if obj.curr_segment == "CMEM" + STDERR.puts format("Error in line %d: %s cannot be initialized!", lc, obj.curr_segment) + exit 1 + elsif obj.curr_segment == "XMEM" + curr_addr = format("0x%2.2X",obj.xmem_dc) + dc_old = obj.xmem_dc; + val_array = raw_line.split(/dc|DC|Dc|dC/)[1].delete("\t").gsub(/;.*/, "").split(",") + + # Parse string literals + val_array.each do |item| + if 0 == (item =~ /.*\".*\"/) + str = item.delete("\"") + puts item + for nn in (0..str.length-1) + if str[nn] > 31 + obj.put_xmem(str[nn], lc); + puts "S: " + str[nn].to_s + len += 1 + end + end; + else + argument = item + puts "B: " + argument + obj.put_xmem(eval(argument), lc); + len += 1 + end + end + puts format("Found DC defining %d bytes at 0x%4.4X in %s", len, dc_old, obj.curr_segment); + else + STDERR.puts format("Error in line %d: Invalid segment %s for \"%s\"", lc, obj.curr_segment, token) + exit 1 + end + when "DB" + if iline_member[mc+1] == nil + STDERR.puts format("Error in line %d: %s needs argument!", lc, token) + exit 1 + end + len = eval(iline_member[mc+1]).to_i + if obj.curr_segment == "CMEM" + curr_addr = format("0x%2.2X",obj.cmem_dc) + puts format("Found DB reserving %d bytes at 0x%4.4X in %s(%d)", len, obj.cmem_dc, obj.curr_segment, obj.page); + for nn in (1..len) + obj.put_cmem(0, lc) + end + elsif obj.curr_segment == "XMEM" + curr_addr = format("0x%2.2X",obj.xmem_dc) + puts format("Found DB reserving %d bytes at 0x%4.4X in %s", len, obj.xmem_dc, obj.curr_segment); + for nn in (1..len) + obj.put_xmem(0, lc) + end + else + STDERR.puts format("Error in line %d: Invalid segment %s for \"%s\"", lc, obj.curr_segment, token) + exit 1 + end + else + if obj.curr_segment != "CODE" + STDERR.puts format("Error in line %d: Invalid segment %s for \"%s\"", lc, obj.curr_segment, token) + exit 1 + end + + op_line = iline_member[mc+1..iline_member.nitems].to_s + curr_addr = format("0x%3.3X",obj.pc) + opc = token + if iline_member[mc+1] != nil + op1 = op_line.gsub(/,+.*$/, "") + end + if iline_member[mc+2] != nil + op2 = op_line.scan(/,.+$/).to_s.delete(", ") + end + obj.put_instr(name, lc, opc, op1, op2) + obj.pc = obj.pc + 1 + end; + + # Push labels + if label + obj.add_label(label, curr_addr) + end +end +file.close +return obj +end + +# -------------------------------------------------------- +# Instruction formatting +# -------------------------------------------------------- +def instr(opcode) + return format("\"%6.6B\" & X\"%3.3X\"",opcode ,0) +end + +def tcl_bits(pc, opcode) + return format("%12.12B%8.8B%12.12B",pc, opcode ,0) +end + +def instr_k(opcode, k) + return format("\"%6.6B\" & X\"%3.3X\"",opcode ,k) +end + +def tcl_bits_k(pc, opcode, k) + return format("%12.12B%8.8B%12.12B",pc, opcode ,k) +end + +def instr_r(opcode, r) + return format("\"%6.6B\" & X\"%2.2X%X\"",opcode ,0, r) +end + +def tcl_bits_r(pc, opcode, r) + return format("%12.12B%8.8B%8.8B%4.4B",pc, opcode ,0,r) +end + +def instr_kr(opcode, k, r) + return format("\"%6.6B\" & X\"%2.2X%X\"",opcode,k, r) +end + +def tcl_bits_kr(pc, opcode, k, r) + return format("%12.12B%8.8B%8.8B%4.4B",pc, opcode, k, r) +end + +def instr_rk(opcode, r, k) + return format("\"%6.6B\" & X\"%2.2X%X\"",opcode,k, r) +end + +def tcl_bits_rk(pc, opcode, r, k) + return format("%12.12B%8.8B%8.8B%4.4B",pc, opcode, k, r) +end + +def instr_rr(opcode, ra, rb) + return format("\"%6.6B\" & X\"%X%X%X\"",opcode,0, rb, ra) +end + +def tcl_bits_rr(pc, opcode, ra, rb) + return format("%12.12B%8.8B%4.4B%4.4B%4.4B",pc, opcode, 0, rb, ra) +end + +# -------------------------------------------------------- +# Open file +# -------------------------------------------------------- +filename = arg.to_s +if !File.exists?(filename) + STDERR.puts "#{filename} does not exist" + exit 1 +end +PROJECT_NAME = File.basename(filename, "." + FILE_SUFFIX) + +# -------------------------------------------------------- +# Pass 1 +# -------------------------------------------------------- +first_pass = Parser.new(); +parse(filename, first_pass) + +# -------------------------------------------------------- +# Read mnemonic set +# -------------------------------------------------------- +filename = OPC_LIST_NAME +if !File.exists?(filename) + STDERR.puts "#{filename} does not exist" + exit 1 +end + +mnemo_list = [] +num_opcodes = 0 +file = File.open(filename, "r") +file.each do |raw_line| + mnemo_list[num_opcodes] = raw_line.split(" ")[1] + num_opcodes += 1 +end + +# -------------------------------------------------------- +# Pass 2 +# -------------------------------------------------------- +pc = 0 +opc_start = 2 +num_errors = 0 +vhdl_trans_list = [nil] +vhdl_comment_list = [nil] +vhdl_tcl_list = [nil] + +# ToDo: Use class-methods +label_list = first_pass.label_list +instr_list = first_pass.instr_list + +instr_list.each do |instruct| + + # puts instruct + if instruct == nil + vhdl_trans_list[pc] = format("\"%6.6B\" & X\"%3.3X\"",0 ,0) + vhdl_comment_list[pc] = format("0x%3.3X:", pc) + vhdl_tcl_list[pc] = tcl_bits(pc, 0) + pc += 1 + next + end + + # determine arglen of instruction + ilen = 0 + if instruct[opc_start+1] == nil + arglen = 0 + elsif instruct[opc_start+2] == nil + arglen = 1 + elsif instruct[opc_start+3] == nil + arglen = 2 + end + + # Symbol substitution + error = false + for i in (1..2) + subst_pos = opc_start+i + if instruct[subst_pos] == nil + next + end + expr_token = "" + expr_subst = nil + is_direct = true; + + # checks R0 .. R16, Mnemonics + instruct[subst_pos] = instruct[subst_pos].gsub(/'low/, "") + if (nil != (instruct[subst_pos] =~ /'high/)) + instruct[subst_pos]= format("%s/256", instruct[subst_pos].gsub(/'high/, "")) + end + instr_str = instruct[subst_pos] + if 0 == (instr_str =~ /\(.+\)/) + instr_str = instr_str.delete("()") + is_direct = false; + end + + expr_token = instr_str.split(/\+|\-|\*|\/|\||\&/)[0] + if (0 != (expr_token =~ /R[0-9]+/)) && (0 != (expr_token =~ /\d+/)) + idx = label_list.rindex(expr_token) + if idx != nil + expr_subst = label_list[idx+1] + instruct[subst_pos] = instruct[subst_pos].gsub(expr_token, expr_subst) + else + STDERR.puts format("%s: Error in line %d: Symbol \"%s\" not found", instruct[5], instruct[0], expr_token) + error = true + end + end + + if expr_subst != nil + if 0 == (expr_subst =~ /\d+/) + if is_direct == true + instruct[subst_pos] = format("0x%2.2X", eval(instruct[subst_pos])) + else + instruct[subst_pos] = format("(0x%2.2X)", eval(instruct[subst_pos])) + end + else + if 0 != (expr_subst =~ /R[0-9]+/) + STDERR.puts format("%s: Error in line %d: Invalid expression \"%s\"", instruct[5], instruct[0], expr_subst) + error = true + end + end + end + end + + # Parse operands + reg = [0,0] + kk = 0 + format = instruct[opc_start] + for i in (0..1) + if instruct[opc_start+i+1] =~ Regexp.new("R[0-9]+") + # Check indirect addressing + reg[i] = instruct[opc_start+i+1].delete("R()").to_i + format += "|R" + if reg[i] > 15 + STDERR.puts format("%s: Error in line %d: Invalid register \"R%d\" specified", instruct[5], instruct[0], reg[i]) + error = true + end + else + if instruct[opc_start+i+1] =~ Regexp.new("[0-9A-F]+") + kk = eval(instruct[opc_start+i+1].delete("()")) + format += "|K" + end + end + if instruct[opc_start+i+1] =~ Regexp.new("\\(.+\\)") + format += "i"; + end + end + + if error + num_errors += 1 + break + end + + # Output instruction + opcode = mnemo_list.rindex(format).to_i + mnemo = instruct[2]; + + case format + # Native instructions + when "NOP", "HALT", "RET", "RETI", "SETC" + vhdl_trans_list[pc] = instr(opcode) + vhdl_tcl_list[pc] = tcl_bits(pc, opcode) + minstr_comment = format("0x%3.3X: %s", pc, mnemo) + when "MOVC|R|Ri", "MOVX|R|Ri" + vhdl_trans_list[pc] = instr_rr(opcode, reg[0], reg[1]); + vhdl_tcl_list[pc] = tcl_bits_rr(pc, opcode, reg[0], reg[1]) + minstr_comment = format("0x%3.3X: %s R%2.2d, (R%2.2d)", pc, mnemo, reg[0], reg[1]) + when "MOV|R|R", "SUB|R|R", "SUBC|R|R", "ADD|R|R", "ADDC|R|R", "AND|R|R", "OR|R|R", "XOR|R|R", "CMP|R|R" + vhdl_trans_list[pc] = instr_rr(opcode, reg[0], reg[1]); + vhdl_tcl_list[pc] = tcl_bits_rr(pc, opcode, reg[0], reg[1]) + minstr_comment = format("0x%3.3X: %s R%2.2d, R%2.2d", pc, mnemo, reg[0], reg[1]) + when "MOVC|Ri|R", "MOVX|Ri|R" + vhdl_trans_list[pc] = instr_rr(opcode, reg[1], reg[0]); + vhdl_tcl_list[pc] = tcl_bits_rr(pc, opcode, reg[1], reg[0]) + minstr_comment = format("0x%3.3X: %s (R%2.2d), R%2.2d", pc, mnemo, reg[1], reg[0]) + when "MOVC|Ri|K", "MOVX|Ri|K", "COUT|Ri|K", "XOUT|Ri|K" + kk = kk % 256; + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + minstr_comment = format("0x%3.3X: %s (R%2.2d), 0x%2.2X", pc, mnemo, reg[0], kk) + when "MOVC|R|Ki", "MOVX|R|Ki", "CIN|R|Ki", "XIN|R|Ki" + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + minstr_comment = format("0x%3.3X: %s R%2.2d, (0x%2.2X)", pc, mnemo, reg[0], kk) + when "MOV|R|K", "SUB|R|K", "SUBC|R|K", "ADD|R|K", "ADDC|R|K", "AND|R|K", "OR|R|K", "XOR|R|K", "CMP|R|K" + kk = kk % 256; + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + minstr_comment = format("0x%3.3X: %s R%2.2d, 0x%2.2X", pc, mnemo, reg[0], kk) + when "SUB|K|R", "SUBC|K|R" + kk = kk % 256; + vhdl_trans_list[pc] = instr_kr(opcode, kk, reg[1]); + vhdl_tcl_list[pc] = tcl_bits_kr(pc, opcode, kk, reg[1]) + minstr_comment = format("0x%3.3X: %s 0x%2.2d, R%2.2X", pc, mnemo, kk, reg[1]) + when "MOVC|Ki|R", "MOVC|Ki|R", "MOVX|Ki|R", "MOVX|Ki|R", "COUT|Ki|R", "XOUT|Ki|R" + vhdl_trans_list[pc] = instr_kr(opcode, kk, reg[1]); + vhdl_tcl_list[pc] = tcl_bits_kr(pc, opcode, kk, reg[1]) + minstr_comment = format("0x%3.3X: %s (0x%2.2X), R%2.2d", pc, mnemo, kk, reg[1]) + when "CALL|K", "JMP|K", "JNZ|K", "JZ|K","JNC|K", "JC|K", "JLT|K", "JGT|K", "JLE|K", "JGE|K", "JEQ|K", "JNE|K" + vhdl_trans_list[pc] = instr_k(opcode, kk) + vhdl_tcl_list[pc] = tcl_bits_k(pc, opcode, kk) + minstr_comment = format("0x%3.3X: %s 0x%3.3X", pc, mnemo, kk) + when "PUSH|R", "POP|R", "SHR|R", "SHL|R", "ROR|R", "ROL|R", "RORC|R", "ROLC|R", "SWAP|R" + vhdl_trans_list[pc] = instr_r(opcode, reg[0]) + vhdl_tcl_list[pc] = tcl_bits_r(pc, opcode, reg[0]) + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + # Synthetic instructions + when "CLRC" + kk = 0; + minstr_comment = format("0x%3.3X: %s", pc, mnemo) + opcode = mnemo_list.rindex("SUB|R|K").to_i + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + when "TST|R" + kk = 0 + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + opcode = mnemo_list.rindex("CMP|R|K").to_i + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + when "NEG|R" + kk = 0 + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + opcode = mnemo_list.rindex("SUB|K|R").to_i + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + when "NOT|R" + kk = 0 + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + opcode = mnemo_list.rindex("XOR|R|K").to_i + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + when "INC|R" + kk = 1 + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + opcode = mnemo_list.rindex("ADD|R|K").to_i + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + when "DEC|R" + kk = 1 + minstr_comment = format("0x%3.3X: %s R%2.2d", pc, mnemo, reg[0]) + opcode = mnemo_list.rindex("SUB|R|K").to_i + vhdl_trans_list[pc] = instr_rk(opcode, reg[0], kk); + vhdl_tcl_list[pc] = tcl_bits_rk(pc, opcode, reg[0], kk) + else + STDERR.puts format("%s: Error in line %d: Not yet implemented %s", instruct[5], instruct[0], format) + error = true + end + + if error + num_errors += 1 + break + end + + vhdl_comment_list[pc] = minstr_comment + + puts vhdl_trans_list[pc] + " -- " + minstr_comment + + pc += 1 +end + +# -------------------------------------------------------- +# Output ROM file +# -------------------------------------------------------- +if num_errors == 0 + + # I-ROM VHDL-ROM + filename = format("%s.irom.vhdl.snip", PROJECT_NAME) + file = File.open(filename, "w") + + file.puts format("ENTITY %s IS\n", IROM_ENTITY_NAME) + file.puts format("\tPort (\n") + file.puts format("\tclk\t\t\t: in STD_LOGIC;\n") + file.puts format("\tce\t\t\t: in STD_LOGIC;\n") + file.puts format("\taddr\t\t: in %s;\n", IROM_ADDR_TYPE) + file.puts format("\tdout\t\t: out %s\n", IROM_DATA_TYPE) + file.puts format("\t);\n") + file.puts format("END %s;\n", IROM_ENTITY_NAME) + file.puts format("\n") + file.puts format("ARCHITECTURE %s OF %s IS \n", PROJECT_NAME, IROM_ENTITY_NAME) + file.puts format("\n") + file.puts format("\ttype imem_rom_t is array (0 to %d) of %s;\n", [IROM_MAX_SIZE, pc].min-1 , IROM_DATA_TYPE) + file.puts format("\n") + file.puts format("\t-- Assembled from %s.%s", PROJECT_NAME, FILE_SUFFIX) + file.puts format("\tconstant imem_rom : imem_rom_t :=\n") + file.puts format("\t(\n"); + for i in (0..[IROM_MAX_SIZE, pc].min-2) + file.puts "\t\t" + vhdl_trans_list[i] + ", -- " + vhdl_comment_list[i] + "\n" + end; + file.puts "\t\t" + vhdl_trans_list[pc-1] + " -- " + vhdl_comment_list[pc-1] + "\n" + file.puts format("\t);\n") + file.puts format("\n") + file.puts format("begin") + file.puts format("\n") + file.puts format("PROM_READ:") + file.puts format("\tprocess(clk, ce)\n") + file.puts format("\tbegin\n") + file.puts format("\t\tif rising_edge(clk) and ce = '1' then\n") + file.puts format("\t\t\tdout <= imem_rom(to_integer(addr));\n") + file.puts format("\t\tend if;\n") + file.puts format("\tend process;\n") + file.puts format("\n") + file.puts format("end %s;\n", PROJECT_NAME) + puts format("I-ROM file written to \"%s\"\n",filename) + file.close + + # I-ROM VHDL-ROM (loadable) + filename = format("%s.irom_ld.vhdl.snip", PROJECT_NAME) + file = File.open(filename, "w") + + file.puts format("\n\t-- Assembled from %s.%s", PROJECT_NAME, FILE_SUFFIX) + file.puts format("\ttype imem_rom_t is array (0 to %d) of %s;\n", IROM_MAX_SIZE-1, IROM_DATA_TYPE) + file.puts format("\tsignal imem_rom : imem_rom_t :=\n") + file.puts format("\t(\n"); + for i in (0..pc-2) + file.puts "\t\t" + vhdl_trans_list[i] + ", -- " + vhdl_comment_list[i] + "\n" + end; + if pc < (IROM_MAX_SIZE-1) + file.puts "\t\t" + vhdl_trans_list[pc-1] + ", -- " + vhdl_comment_list[pc-1] + "\n" + for i in (pc..(IROM_MAX_SIZE-2)) + file.puts "\t\t" + instr(0) + ",\n" + end; + file.puts "\t\t" + instr(0) + "\n" + else + file.puts "\t\t" + vhdl_trans_list[pc-1] + " -- " + vhdl_comment_list[pc-1] + "\n" + end + file.puts format("\t);\n") + puts format("I-ROM (loadable) file written to \"%s\"\n",filename) + file.close + + # I-ROM TCL-Loader + filename = format("%s.irom.tcl.snip", PROJECT_NAME) + file = File.open(filename, "w") + file.puts format("# Assembled from %s.%s", PROJECT_NAME, FILE_SUFFIX) + file.puts format("# ---------------------------------------------------------------"); + file.puts format("# Shift the USER1 Instruction (b1111000010) into the Instruction Register of FPGA"); + file.puts format("# User 1") + file.puts format("set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength \"3C2\"]\n\n") + for i in (0..pc-1) + # Chipscope 8.1 +# file.puts format("jtag_shiftdr $handle -buffer \"%s\" -endstate RTI -device $devid", vhdl_tcl_list[i].reverse); + + # Chipscope 9.1 + file.puts format("\# %s", vhdl_comment_list[i]) + file.puts format("::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%8.8X\"\n\n", vhdl_tcl_list[i].length, vhdl_tcl_list[i].to_i(2)); + end; + puts format("I-ROM TCL-loader written to \"%s\"\n",filename) + file.close + + # X-ROM VHDL-ROM + filename = format("%s.xrom.vhdl.snip", PROJECT_NAME) + file = File.open(filename, "w") + + file.puts format("ENTITY %s IS\n", XROM_ENTITY_NAME) + file.puts format("\tPort (\n") + file.puts format("\tclk\t\t\t: in STD_LOGIC;\n") + file.puts format("\tce\t\t\t: in STD_LOGIC;\n") + file.puts format("\taddr\t\t: in %s;\n", XROM_ADDR_TYPE) + file.puts format("\tdout\t\t: out %s\n", XROM_DATA_TYPE) + file.puts format("\t);\n") + file.puts format("END %s;\n", XROM_ENTITY_NAME) + file.puts format("\n") + file.puts format("ARCHITECTURE %s OF %s IS \n", PROJECT_NAME, XROM_ENTITY_NAME) + file.puts format("\n") + file.puts format("\ttype xmem_rom_t is array (0 to %d) of %s;\n", XROM_MAX_SIZE-1, XROM_DATA_TYPE) + file.puts format("\n") + file.puts format("\t-- Assembled from %s.%s", PROJECT_NAME, FILE_SUFFIX) + file.puts format("\tconstant xmem_rom : xmem_rom_t :=\n") + file.puts format("\t(\n"); + for i in (0..XROM_MAX_SIZE-2) + file.puts format("\t\tX\"%2.2X\", -- 0x%2.2X\n", first_pass.xmem[i], i) + end; + i = XROM_MAX_SIZE-1 + file.puts format("\t\tX\"%2.2X\" -- 0x%2.2X\n", first_pass.xmem[i], i) + file.puts format("\t);\n") + file.puts format("\n") + file.puts format("begin") + file.puts format("\n") + file.puts format("PROM_READ:") + file.puts format("\tprocess(clk, ce)\n") + file.puts format("\tbegin\n") + file.puts format("\t\tif rising_edge(clk) and ce = '1' then\n") + file.puts format("\t\t\tdout <= xmem_rom(to_integer(addr));\n") + file.puts format("\t\tend if;\n") + file.puts format("\tend process;\n") + file.puts format("\n") + file.puts format("end %s;\n", PROJECT_NAME) + puts format("X-ROM file written to \"%s\"\n",filename) + file.close + + # X-ROM VHDL-ROM (loadable) + filename = format("%s.xrom_ld.vhdl.snip", PROJECT_NAME) + file = File.open(filename, "w") + + file.puts format("\n\t-- Assembled from %s.%s", PROJECT_NAME, FILE_SUFFIX) + file.puts format("\ttype xmem_rom_t is array (0 to %d) of %s;\n", XROM_MAX_SIZE-1, XROM_DATA_TYPE) + file.puts format("\tsignal xmem_rom : xmem_rom_t :=\n") + file.puts format("\t(\n"); + for i in (0..XROM_MAX_SIZE-2) + file.puts format("\t\tX\"%2.2X\", -- 0x%2.2X\n", first_pass.xmem[i], i) + end; + i = XROM_MAX_SIZE-1 + file.puts format("\t\tX\"%2.2X\" -- 0x%2.2X\n", first_pass.xmem[i], i) + file.puts format("\t);\n") + puts format("X-ROM (loadable) file written to \"%s\"\n",filename) + file.close + + # X-ROM TCL-Loader + filename = format("%s.xrom.tcl.snip", PROJECT_NAME) + file = File.open(filename, "w") + file.puts format("# Assembled from %s.%s", PROJECT_NAME, FILE_SUFFIX) + file.puts format("# ---------------------------------------------------------------"); + file.puts format("# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA"); + file.puts format("# User 2") + file.puts format("set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength \"3C3\"]\n\n") + for i in (0..first_pass.xmem.length-1) + # Chipscope 8.1 +# file.puts format("jtag_shiftdr $handle -buffer \"%s\" -endstate RTI -device $devid", vhdl_tcl_list[i].reverse); + + # Chipscope 9.1 + file.puts format("::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%2.2X%2.2X\"\n", 16, i, first_pass.xmem[i]); + end; + puts format("X-ROM TCL-loader written to \"%s\"\n",filename) + file.close + +end + +# -------------------------------------------------------- +# Output final statistics +# -------------------------------------------------------- +if num_errors == 0 + puts "Program uses #{first_pass.pc_max} instruction addresses" + puts "No errors found" + exit 0 +else + puts "#{num_errors} errors found" + exit 1 +end + diff --git a/lib/CPUs/JCpu/tools/lib/cg.inc.jsm b/lib/CPUs/JCpu/tools/lib/cg.inc.jsm new file mode 100644 index 0000000..01c36c4 --- /dev/null +++ b/lib/CPUs/JCpu/tools/lib/cg.inc.jsm @@ -0,0 +1,72 @@ +; ------------------------------------------------- +; lcd.inc.jsm +; ------------------------------------------------- +; needs xio-address equates for +; reg_cg_char_addr: equ 0xXX ; RW +; reg_cg_line_addr: equ 0xXX ; RW +; reg_cg_data: equ 0xXX ; RW +; reg_cg_ctrl: equ 0xXX ; WO + +; needs delay.inc.jsm + +; ------------------------------------------------- +cg_clr_line: push R0 + mov R0, 2 + xout (reg_cg_ctrl), R0 + pop R0 + ret + +; ------------------------------------------------- +cg_clr_screen: push R0 + mov R0, 1 + xout (reg_cg_ctrl), R0 + pop R0 + ret + +; ------------------------------------------------- +; R0 : char address +; R1 : line address +cg_set_addr: call cg_wait_rdy + xout (reg_cg_line_addr), R1 + xout (reg_cg_char_addr), R0 + ret + +; ------------------------------------------------- +; R0 : character +cg_putchar: call cg_wait_rdy + xout (reg_cg_data), R0 + ret + +; ------------------------------------------------- +; R1 : ptr to string +cg_puts: push R0 +cg_p_lp: movx R0, (R1) + inc R1 + tst R0 + jz ex_cgp + call cg_putchar + jmp cg_p_lp +ex_cgp: pop R0 + ret + +; ------------------------------------------------- +; R1 : ptr to string +cg_clr_puts: call cg_clr_line + call cg_puts + ret + +; ------------------------------------------------- +; R1 : ptr to string +cg_puts_clr: call cg_puts + call cg_clr_line + ret + +; ------------------------------------------------- +cg_wait_rdy: push R0 +cg_wr_lp: xin R0, (reg_hwstat) + and R0, 0x02 + jz cg_wr_lp + pop R0 + ret + +; ------------------------------------------------- diff --git a/lib/CPUs/JCpu/tools/lib/cregs.inc.jsm b/lib/CPUs/JCpu/tools/lib/cregs.inc.jsm new file mode 100644 index 0000000..06d39d9 --- /dev/null +++ b/lib/CPUs/JCpu/tools/lib/cregs.inc.jsm @@ -0,0 +1,7 @@ +; JCPU On-Chip register +cpu_revision: equ 0x00 ; RO +cpu_control: equ 0x01 ; R/W +cpu_status: equ 0x02 ; RO +cpu_int_ctrl: equ 0x03 ; RW +cpu_cmem_high: equ 0x04 ; RW +cpu_stack_high: equ 0x05 ; RW diff --git a/lib/CPUs/JCpu/tools/lib/delays.inc.jsm b/lib/CPUs/JCpu/tools/lib/delays.inc.jsm new file mode 100644 index 0000000..6f002ee --- /dev/null +++ b/lib/CPUs/JCpu/tools/lib/delays.inc.jsm @@ -0,0 +1,64 @@ +; ------------------------------------------------- +; Delays +; ------------------------------------------------- +delay1s: push R15 + mov R15, 10 +loop1s: call delay100ms + dec R15 + jnz loop1s + pop R15 + ret + +delay100ms: push R15 + mov R15, 10 +loop100ms: call delay10ms + dec R15 + jnz loop100ms + pop R15 + ret + +delay10ms: push R15 + mov R15, 10 +loop10ms: call delay1ms + dec R15 + jnz loop10ms + pop R15 + ret + +delay1ms: push R15 + mov R15, 10 +loop1ms: call delay100us + dec R15 + jnz loop1ms + pop R15 + ret + +delay100us: push R15 + mov R15, 10 +loop100us: call delay10us + dec R15 + jnz loop100us + pop R15 + ret + +delay10us: push R15 + mov R15, 99 +loop10us: nop + nop + nop + dec R15 + jnz loop10us + pop R15 + ret + +delay1us: push R15 + mov R15, 9 +loop1us: nop + nop + nop + dec R15 + jnz loop1us + pop R15 + ret + +; ------------------------------------------------- diff --git a/lib/CPUs/JCpu/tools/lib/lcd.inc.jsm b/lib/CPUs/JCpu/tools/lib/lcd.inc.jsm new file mode 100644 index 0000000..d2883fa --- /dev/null +++ b/lib/CPUs/JCpu/tools/lib/lcd.inc.jsm @@ -0,0 +1,208 @@ +; ------------------------------------------------- +; lcd.inc.jsm +; ------------------------------------------------- +; needs xmem-address definition for +; - lcd_port (LCD-Base) + +; needs delay.inc.jsm + +; ------------------------------------------------- +lcd_cmd: equ 0x00 +lcd_rd: equ 0x20 +lcd_data: equ 0x40 +lcd_enable: equ 0x80 + +LCD_CMD_Z1: equ 0x80 +LCD_CMD_Z2: equ 0xC0 +LCD_CMD_CLEAR: equ 0x01 + +; ------------------------------------------------- +; Init LCD +; ------------------------------------------------- +LCD_init: mov R2, 0x00 + mov R0, 0x03 + call _write_lcd + call delay10ms + mov R2, 0x00 + mov R0, 0x03 + call _write_lcd + call delay10ms + + mov R2, 0x00 + mov R0, 0x02 + call _write_lcd + call delay1ms + + ; 1. Function set: 4-Bit mode, two display lines + mov R0, 0x28 + call LCD_writecmd + + ; 2. Display on, no cursor + mov R0, 0x0C + call LCD_writecmd + + ; 3. Cursor shift during write + mov R0, 0x06 + call LCD_writecmd + + ; 4. Display clear + mov R0, 0x01 + call LCD_writecmd + + ret + +; ------------------------------------------------- +; LCD_waitbsy +; ------------------------------------------------- +LCD_waitbsy: push R0 +bsy_loop: call LCD_readstat + and R0, 0x80 + jz ex_bsy + call delay1us + jmp bsy_loop +ex_bsy: pop R0 + ret + +; ------------------------------------------------- +; LCD_writecmd +; ------------------------------------------------- +; R0 = cmd +LCD_writeaddr: +LCD_writecmd: push R2 + mov R2, lcd_cmd + call LCD_write + pop R2 + ret + +; ------------------------------------------------- +; LCD_putsx +; ------------------------------------------------- +; R1 = address of null-terminated string in XMEM +LCD_putsx: push R0 +putsx_loop: movx R0, (R1) + inc R1 + tst R0 + jz putsx_ex + call LCD_writechar + jmp putsx_loop +putsx_ex: pop R0 + ret + +; ------------------------------------------------- +; LCD_putsc +; ------------------------------------------------- +; R1 = address of null-terminated string in CMEM +LCD_putsc: push R0 +putsc_loop: movc R0, (R1) + inc R1 + tst R0 + jz putsc_ex + call LCD_writechar + jmp putsc_loop +putsc_ex: pop R0 + ret + +; ------------------------------------------------- +; LCD_writechar +; ------------------------------------------------- +; R0 = char +LCD_writedata: +LCD_writechar: push R2 + mov R2, lcd_data + call LCD_write + pop R2 + ret + +; ------------------------------------------------- +; LCD_write +; ------------------------------------------------- +; R0 = input +; R2 = register +LCD_write: call LCD_waitbsy + push R0 + swap R0 + call _write_lcd + pop R0 + call _write_lcd + ret + +; ------------------------------------------------- +; LCD_readstat +; ------------------------------------------------- +; R0 = status +LCD_readstat: push R2 + mov R2, lcd_cmd + call LCD_read + pop R2 + ret + +; ------------------------------------------------- +; LCD_read +; ------------------------------------------------- +; R0 = output +; R2 = register +LCD_read: call _read_lcd + swap R0 + push R0 + call _read_lcd + pop R2 + or R0, R2 + ret + +; ------------------------------------------------- +; _write +; ------------------------------------------------- +; R0 = input +_write_lcd: push R1 + + and R0, 0x0F + mov R1, R0 + or R1, R2 + xout (lcd_port), R1 + call delay1us + + mov R1, R0 + or R1, R2 + or R1, lcd_enable + xout (lcd_port), R1 + call delay1us + + mov R1, R0 + or R1, R2 + xout (lcd_port), R1 + call delay1us + + or R1, lcd_rd + xout (lcd_port), R1 + + pop R1 + ret + +; ------------------------------------------------- +; _read +; ------------------------------------------------- +; R0 = output +_read_lcd: push R1 + + mov R1, lcd_rd + or R1, R2 + xout (lcd_port), R1 + call delay1us + + mov R1, lcd_rd + or R1, R2 + or R1, lcd_enable + xout (lcd_port), R1 + call delay1us + xin R0, (lcd_port) + and R0, 0x0F + + mov R1, lcd_rd + or R1, R2 + xout (lcd_port), R1 + call delay1us + + pop R1 + ret + + \ No newline at end of file diff --git a/lib/CPUs/JCpu/tools/lib/mul8x8.inc.jsm b/lib/CPUs/JCpu/tools/lib/mul8x8.inc.jsm new file mode 100644 index 0000000..2f66e2a --- /dev/null +++ b/lib/CPUs/JCpu/tools/lib/mul8x8.inc.jsm @@ -0,0 +1,42 @@ +; ------------------------------------------------- +; mul8x8.inc.jsm +; ------------------------------------------------- + +; ------------------------------------------------- +; Parameter: +; R0 : operand 1 +; R1 : operand 2 +; Return: +; R0 : product low +; R1 : product high +mul8x8: push R2 + push R3 + push R4 + + mov R4, R1 + mov R1, 0 + mov R2, 0 + mov R3, 0 + +loop1: cmp R4, 0x01 + jeq ende1 + + shr R4 + jnc next1 + + add R2, R0 + addc R3, R1 + +next1: shl R0 + rolc R1 + jmp loop1 + +ende1: add R0, R2 + addc R1, R3 + + pop R4 + pop R3 + pop R2 + ret + +; ------------------------------------------------- diff --git a/lib/CPUs/JCpu/tools/lib/uart.inc.jsm b/lib/CPUs/JCpu/tools/lib/uart.inc.jsm new file mode 100644 index 0000000..1733305 --- /dev/null +++ b/lib/CPUs/JCpu/tools/lib/uart.inc.jsm @@ -0,0 +1,32 @@ +; ------------------------------------------------- +; uart.inc.jsm +; ------------------------------------------------- +; needs xmem-address definition for +; - uart_status (Status register) +; - uart_data (Data register) + +; ------------------------------------------------- +; sout +; ------------------------------------------------- +; R0 = input +sout: push R1 +sout1: xin R1, (uart_status) + and R1, 0x02 + jnz sout1 + xout (uart_data), R0 + pop R1 + ret + +; ------------------------------------------------- +; sin +; ------------------------------------------------- +; R0 = output +sin: push R1 +sin1: xin R1, (uart_status) + and R1, 0x10 + jnz sin1 + xin R0, (uart_data) + pop R1 + ret + +; ------------------------------------------------- diff --git a/lib/CPUs/JCpu/tools/lib/utils.inc.jsm b/lib/CPUs/JCpu/tools/lib/utils.inc.jsm new file mode 100644 index 0000000..f354d7c --- /dev/null +++ b/lib/CPUs/JCpu/tools/lib/utils.inc.jsm @@ -0,0 +1,32 @@ +; ------------------------------------------------- +; utils.inc.jsm +; ------------------------------------------------- + + +; ------------------------------------------------- +; Parameter +; R0 : Bin value in lower nibble +; Return +; R0 : Hex character representing lower nibble +nibble2hex: and R0, 0x0F + cmp R0, 0x0A + jlt isNum1 + add R0, 0x07 +isNum1: add R0, 0x30 + ret + +; ------------------------------------------------- +; Parameter +; R0 : Bin value +; Return +; R0 : Hex character high +; R1 : Hex character low +bin2hex: push R0 + call nibble2hex + mov R1, R0 + pop R0 + swap R0 + call nibble2hex + ret + +; ------------------------------------------------- diff --git a/lib/CPUs/JCpu/tools/opc.list b/lib/CPUs/JCpu/tools/opc.list new file mode 100644 index 0000000..59b3cfa --- /dev/null +++ b/lib/CPUs/JCpu/tools/opc.list @@ -0,0 +1,64 @@ +0 NOP +1 HALT +2 MOV|R|R +3 MOV|R|K +4 MOVX|R|Ri +5 MOVX|R|Ki +6 MOVX|Ri|R +7 MOVX|Ri|K +8 MOVX|Ki|R +9 MOVC|R|Ri +10 MOVC|R|Ki +11 MOVC|Ri|R +12 MOVC|Ri|K +13 MOVC|Ki|R +14 CMP|R|R +15 CMP|R|K +16 ADD|R|R +17 ADD|R|K +18 ADDC|R|R +19 ADDC|R|K +20 SUB|R|R +21 SUB|R|K +22 SUBC|R|R +23 SUBC|R|K +24 AND|R|R +25 AND|R|K +26 OR|R|R +27 OR|R|K +28 XOR|R|R +29 XOR|R|K +30 SHL|R +31 SHR|R +32 ROL|R +33 ROR|R +34 ROLC|R +35 RORC|R +36 XOUT|Ki|R +37 XOUT|Ri|K +38 COUT|Ki|R +39 COUT|Ri|K +40 XIN|R|Ki +41 CIN|R|Ki +42 SWAP|R +43 SETC +44 UNDEF +45 UNDEF +46 SUB|K|R +47 SUBC|K|R +48 JMP|K +49 JZ|K +50 JNZ|K +51 JC|K +52 JNC|K +53 JLT|K +54 JGT|K +55 JLE|K +56 JGE|K +57 JEQ|K +58 JNE|K +59 CALL|K +60 PUSH|R +61 POP|R +62 RET +63 RETI diff --git a/lib/CPUs/JCpu/tools/regx.rb b/lib/CPUs/JCpu/tools/regx.rb new file mode 100644 index 0000000..47775c9 --- /dev/null +++ b/lib/CPUs/JCpu/tools/regx.rb @@ -0,0 +1,20 @@ +#!/usr/bin/env ruby + +st = "\033[7m" +en = "\033[m" + + while TRUE + print "str> " + STDOUT.flush + str = gets + break if not str + str.chop! + print "pat> " + STDOUT.flush + re = gets + break if not re + re.chop! + str.gsub! re, "#{st}\\&#{en}" + print str, "\n" +end +print "\n" diff --git a/lib/CPUs/JCpu/tools/rom.tcl.tpl b/lib/CPUs/JCpu/tools/rom.tcl.tpl new file mode 100644 index 0000000..9f5c0dc --- /dev/null +++ b/lib/CPUs/JCpu/tools/rom.tcl.tpl @@ -0,0 +1,61 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/lib/CPUs/JCpu/tools/templates.rb b/lib/CPUs/JCpu/tools/templates.rb new file mode 100644 index 0000000..632f11c --- /dev/null +++ b/lib/CPUs/JCpu/tools/templates.rb @@ -0,0 +1,44 @@ +#!/usr/bin/env ruby + + +template = <<'END' + -- (tv #1342) read output FIFO + ( + cycles => 1, + cm_i => bus_read_init(addr => ADDR_KS_OFIFO_DOUT), + sep => msg(""), + cm_o => bus_no_ack, + irq => (others => '0') + ), + + -- (tv #1343) wait while FIFO is read + ( + cycles => 2, + cm_i => bus_wait_ack, + sep => msg(""), + cm_o => bus_no_ack, + irq => (others => '0') + ), + + -- (tv #1343) wait for ack + ( + cycles => 1, + cm_i => bus_wait_ack, + sep => msg(""), + cm_o => bus_read_ack(dat => #{exp_data}), + irq => (others => '0') + ), + +END + +puts "KS-128 testvectors:\n" +puts "\n" * 3 + + +0.upto(10) { |sk_no| + 3.downto(0) { |sl_no| + exp_data = "slice_32(TC1_SUBKEYS(#{sk_no}), #{sl_no})" + t = template.gsub(/"/, '\\"') + puts eval("format(\"#{t}\")") + } +} diff --git a/lib/CPUs/JCpu/tools/xrom.vhd.tpl b/lib/CPUs/JCpu/tools/xrom.vhd.tpl new file mode 100644 index 0000000..5f11f86 --- /dev/null +++ b/lib/CPUs/JCpu/tools/xrom.vhd.tpl @@ -0,0 +1,32 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.cpu_pkg.all; + +-- JASM_ROM_INSERT_HERE + diff --git a/lib/CPUs/JCpu/tools/xrom_ld.vhd.tpl b/lib/CPUs/JCpu/tools/xrom_ld.vhd.tpl new file mode 100644 index 0000000..696487f --- /dev/null +++ b/lib/CPUs/JCpu/tools/xrom_ld.vhd.tpl @@ -0,0 +1,151 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +library work; +use work.cpu_pkg.all; + +ENTITY xrom IS + Port ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in dmem_addr_t; + dout : out dmem_data_t + ); + +END xrom; + +ARCHITECTURE loadable OF xrom IS + + -- JASM_ROM_INSERT_HERE + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : dmem_addr_t; + signal jtag_ld_dout : dmem_data_t; + signal jtag_ld_din : dmem_data_t; + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (15 downto 0); + constant id : unsigned (15 downto 0) := X"BEEF"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto user_regi'left-dmem_data_t'length+1); + jtag_ld_din <= user_regi(dmem_data_t'left downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto dmem_data_t'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk, ce) + begin + if rising_edge(clk) and ce = '1' then + dout <= xmem_rom(to_integer(addr)); + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + xmem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= xmem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/MIPS/sim/compile_simprim.do b/lib/CPUs/MIPS/sim/compile_simprim.do new file mode 100644 index 0000000..16b23bb --- /dev/null +++ b/lib/CPUs/MIPS/sim/compile_simprim.do @@ -0,0 +1,6 @@ +vlib simprim + +vcom -93 -work simprim F:/Xilinx9/vhdl/src/simprims/simprim_Vcomponents_mti.vhd +vcom -93 -work simprim F:/Xilinx9/vhdl/src/simprims/simprim_Vpackage_mti.vhd +vcom -93 -work simprim F:/Xilinx9/vhdl/src/simprims/simprim_SMODEL_mti.vhd +vcom -93 -work simprim F:/Xilinx9/vhdl/src/simprims/simprim_VITAL_mti.vhd diff --git a/lib/CPUs/MIPS/sim/compile_unisim.do b/lib/CPUs/MIPS/sim/compile_unisim.do new file mode 100644 index 0000000..d35d8c9 --- /dev/null +++ b/lib/CPUs/MIPS/sim/compile_unisim.do @@ -0,0 +1,6 @@ +vlib unisim + +vcom -93 -work unisim F:/Xilinx9/vhdl/src/unisims/unisim_vpkg.vhd +vcom -93 -work unisim F:/Xilinx9/vhdl/src/unisims/unisim_vcomp.vhd +vcom -93 -work unisim F:/Xilinx9/vhdl/src/unisims/unisim_smodel.vhd +vcom -93 -work unisim F:/Xilinx9/vhdl/src/unisims/unisim_vital.vhd diff --git a/lib/CPUs/MIPS/sim/tb_eval_muldiv.fdo b/lib/CPUs/MIPS/sim/tb_eval_muldiv.fdo new file mode 100644 index 0000000..3b3c920 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_eval_muldiv.fdo @@ -0,0 +1,13 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/tb_eval_muldiv.vhd" +vsim -t 1ps -lib work tb_eval_muldiv +do {tb_eval_muldiv.wdo} +view wave + +view structure +view signals +run 2400ns diff --git a/lib/CPUs/MIPS/sim/tb_eval_muldiv.wdo b/lib/CPUs/MIPS/sim/tb_eval_muldiv.wdo new file mode 100644 index 0000000..e742ca4 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_eval_muldiv.wdo @@ -0,0 +1,27 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_eval_muldiv/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_eval_muldiv/op1_in +add wave -noupdate -format Literal -radix hexadecimal /tb_eval_muldiv/op2_in +add wave -noupdate -format Literal -radix hexadecimal /tb_eval_muldiv/pp0 +add wave -noupdate -format Literal -radix hexadecimal /tb_eval_muldiv/pp1 +add wave -noupdate -format Literal -radix hexadecimal /tb_eval_muldiv/pp2 +add wave -noupdate -format Literal -radix hexadecimal /tb_eval_muldiv/pp3 +add wave -noupdate -format Literal -radix hexadecimal /tb_eval_muldiv/result +add wave -noupdate -format Literal -radix hexadecimal /tb_eval_muldiv/result_reg +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {693234 ps} 0} {{Cursor 2} {290409 ps} 0} +configure wave -namecolwidth 149 +configure wave -valuecolwidth 171 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 100 +configure wave -griddelta 40 +configure wave -timeline 1 +update +WaveRestoreZoom {0 ps} {2520 ns} diff --git a/lib/CPUs/MIPS/sim/tb_mips_embedded.fdo b/lib/CPUs/MIPS/sim/tb_mips_embedded.fdo new file mode 100644 index 0000000..49ea3ab --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_embedded.fdo @@ -0,0 +1,22 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/core/mips_idecode_rom.vhd" +vcom -explicit -93 "../src/core/mips_reg.vhd" +vcom -explicit -93 "../src/core/mips_shifter.vhd" +vcom -explicit -93 "../src/core/mips_alu.vhd" +vcom -explicit -93 "../src/core/mips_bcu.vhd" +vcom -explicit -93 "../src/core/mips_pipeline.vhd" +vcom -explicit -93 "../src/core/mips_top.vhd" +vcom -explicit -93 "../src/ram.vhd" +vcom -explicit -93 "../asm/fibonacci.vhd" +vcom -explicit -93 "../src/mips_embedded.vhd" +vcom -explicit -93 "../src/tb_mips_embedded.vhd" +vsim -t 1ps -lib work tb_mips_embedded +do {tb_mips_embedded.wdo} +view wave +view structure +view signals +run 20us diff --git a/lib/CPUs/MIPS/sim/tb_mips_embedded.wdo b/lib/CPUs/MIPS/sim/tb_mips_embedded.wdo new file mode 100644 index 0000000..7115717 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_embedded.wdo @@ -0,0 +1,41 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_mips_embedded/rst +add wave -noupdate -format Logic /tb_mips_embedded/clk +add wave -noupdate -format Logic /tb_mips_embedded/uut/inst_mips_top/inst_pipeline/exception +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_embedded/uut/inst_mips_top/inst_pipeline/pc +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded/dout +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded/uut/inst_ram/sram +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded/uut/dmem_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded/uut/dmem_din +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded/uut/dmem_dout +add wave -noupdate -format Logic -radix hexadecimal /tb_mips_embedded/uut/dmem_re +add wave -noupdate -format Logic -radix hexadecimal /tb_mips_embedded/uut/dmem_we +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded/uut/imem_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded/uut/imem_din +add wave -noupdate -format Logic /tb_mips_embedded/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded/uut/inst_mips_top/inst_pipeline/id_stage +add wave -noupdate -format Logic /tb_mips_embedded/clk +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_embedded/uut/inst_mips_top/inst_pipeline/ex_stage +add wave -noupdate -format Logic /tb_mips_embedded/clk +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_embedded/uut/inst_mips_top/inst_pipeline/mem_stage +add wave -noupdate -format Logic /tb_mips_embedded/clk +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_embedded/uut/inst_mips_top/inst_pipeline/wb_stage +add wave -noupdate -format Logic /tb_mips_embedded/clk +add wave -noupdate -format Literal /tb_mips_embedded/uut/inst_mips_top/inst_pipeline/hdu +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {624000 ps} 0} +configure wave -namecolwidth 150 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 100 +configure wave -griddelta 40 +configure wave -timeline 1 +update +WaveRestoreZoom {0 ps} {2520 ns} diff --git a/lib/CPUs/MIPS/sim/tb_mips_embedded_syn.fdo b/lib/CPUs/MIPS/sim/tb_mips_embedded_syn.fdo new file mode 100644 index 0000000..97872a0 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_embedded_syn.fdo @@ -0,0 +1,31 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/core/mips_idecode_rom.vhd" +vcom -explicit -93 "../src/core/mips_reg.vhd" +vcom -explicit -93 "../src/core/mips_shifter.vhd" +vcom -explicit -93 "../src/core/mips_alu.vhd" +vcom -explicit -93 "../src/core/mips_bcu.vhd" +vcom -explicit -93 "../src/core/mips_pipeline.vhd" +vcom -explicit -93 "../src/core/mips_muldiv.vhd" +vcom -explicit -93 "../src/core/mips_cop.vhd" +vcom -explicit -93 "../src/core/mips_bui.vhd" +vcom -explicit -93 "../src/core/mips_top.vhd" +vcom -explicit -93 "../src/core/dcache.vhd" +vcom -explicit -93 "../asm/testbench.ROM.vhd" +vcom -explicit -93 "../src/mips_embedded.vhd" +vcom -explicit -93 "../src/mips_embedded_syn.vhd" +vcom -explicit -93 "../../../uart/bbfifo_16x8.vhd" +vcom -explicit -93 "../../../uart/kcuart_rx.vhd" +vcom -explicit -93 "../../../uart/kcuart_tx.vhd" +vcom -explicit -93 "../../../uart/uart_rx.vhd" +vcom -explicit -93 "../../../uart/uart_tx.vhd" +vcom -explicit -93 "../src/tb_mips_embedded_syn.vhd" +vsim -t 1ps -lib work tb_mips_embedded_syn +do {tb_mips_embedded_syn.wdo} +view wave +view structure +view signals +run 100us diff --git a/lib/CPUs/MIPS/sim/tb_mips_embedded_syn.tdo b/lib/CPUs/MIPS/sim/tb_mips_embedded_syn.tdo new file mode 100644 index 0000000..f9e8902 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_embedded_syn.tdo @@ -0,0 +1,13 @@ +## NOTE: Do not edit this file. +## +vlib work + +vcom -explicit -93 "../syn/ise9/netgen/par/mips_embedded_syn_timesim.vhd" +vcom -explicit -93 "../src/tb_mips_embedded_syn.vhd" +vsim -t 1ps -sdfmax "/uut=../syn/ise9/netgen/par/mips_embedded_syn_timesim.sdf" -lib work tb_mips_embedded_syn +do {tb_mips_embedded_syn.wdo} +view wave +#add wave * +view structure +view signals +run 2400ns diff --git a/lib/CPUs/MIPS/sim/tb_mips_embedded_syn.wdo b/lib/CPUs/MIPS/sim/tb_mips_embedded_syn.wdo new file mode 100644 index 0000000..9b1276c --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_embedded_syn.wdo @@ -0,0 +1,112 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/sys_rx +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/sys_tx +add wave -noupdate -format Logic /tb_mips_embedded_syn/sys_rst_n_in +add wave -noupdate -format Logic /tb_mips_embedded_syn/sys_clk_in +add wave -noupdate -format Literal /tb_mips_embedded_syn/sys_led +add wave -noupdate -format Literal /tb_mips_embedded_syn/sys_dip +add wave -noupdate -format Literal /tb_mips_embedded_syn/sys_btn +add wave -noupdate -format Literal /tb_mips_embedded_syn/sys_error +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/cpu_rst +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/cpu_run +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/reg_uart_rx +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/reg_uart_tx +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/reg_uart_ctrl +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/reg_uart_baud +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/uart_status_port +add wave -noupdate -format Literal -radix decimal /tb_mips_embedded_syn/uut/inst_mips_embedded/cnt_usec +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/cnt_usec_en +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/cnt_sec +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/mem_rdy +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/mem_en +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/mem_re +add wave -noupdate -format Literal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/mem_we +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/mem_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/mem_din +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/mem_dout +add wave -noupdate -format Literal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_bui/s +add wave -noupdate -divider DMEM +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/dmem_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/dmem_din +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/dmem_dout +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/dmem_en +add wave -noupdate -format Literal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/dmem_we +add wave -noupdate -divider IMEM +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/imem_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/imem_din +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/imem_en +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/pc_run +add wave -noupdate -divider PC +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/pc +add wave -noupdate -format Literal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/hdu +add wave -noupdate -divider Stages +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/clk +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/clk +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/clk +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/halt +add wave -noupdate -format Literal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_reg_dual_a/reg_mem +add wave -noupdate -divider Cop +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/ir_valid +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/cop_pipe_id +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/cop_pipe_ex +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/cop_ex_en +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/ctrl_in +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/ctrl_out +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/exc_entered +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/din +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/dout +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/epc +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/cause +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/test_reg_we +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/test_reg +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/stat_reg_we +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/status +add wave -noupdate -format Literal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/events +add wave -noupdate -format Literal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/eflags +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/badvaddr +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/rst +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/exception +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/status_save +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/status_rest +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/exc_strobe +add wave -noupdate -format Literal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_cop/ip +add wave -noupdate -divider Stages +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/id_stage +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/dmem_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/dmem_din +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/dmem_dout +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/ex_stage +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/clk +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/mem_stage +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/clk +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/wb_stage +add wave -noupdate -divider Muldiv +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_muldiv/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_muldiv/dout +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_muldiv/result +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_muldiv/start +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_muldiv/busy +add wave -noupdate -format Logic /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_muldiv/hilo_sel +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_muldiv/din_hi +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_embedded_syn/uut/inst_mips_embedded/inst_mips_top/inst_pipeline/inst_muldiv/din_lo +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {1121030000 ps} 0} {{Cursor 2} {1436367 ps} 0} {{Cursor 3} {1122030000 ps} 0} +configure wave -namecolwidth 179 +configure wave -valuecolwidth 89 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 100 +configure wave -griddelta 40 +configure wave -timeline 1 +update +WaveRestoreZoom {1351336 ps} {1583596 ps} diff --git a/lib/CPUs/MIPS/sim/tb_mips_muldiv.fdo b/lib/CPUs/MIPS/sim/tb_mips_muldiv.fdo new file mode 100644 index 0000000..b272e38 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_muldiv.fdo @@ -0,0 +1,15 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../../../PCK_FIO-1.16/PCK_FIO.vhd" +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/core/mips_muldiv.vhd" +vcom -explicit -93 "../src/tb_mips_muldiv.vhd" +vsim -t 1ps -lib work tb_mips_muldiv +do {tb_mips_muldiv.wdo} +view wave + +view structure +view signals +run 5000us diff --git a/lib/CPUs/MIPS/sim/tb_mips_muldiv.ndo b/lib/CPUs/MIPS/sim/tb_mips_muldiv.ndo new file mode 100644 index 0000000..70cb8bb --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_muldiv.ndo @@ -0,0 +1,19 @@ +## NOTE: Do not edit this file. +## Auto generated by Project Navigator for Post-Translate Simulation +## +vlib work +## Compile Post-Translate Model +vcom -explicit -93 "../syn/eval_muldiv/netgen/translate/muldiv_translate.vhd" +vcom -explicit -93 "../../../PCK_FIO-1.16/PCK_FIO.vhd" +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/tb_mips_muldiv.vhd" + +vsim -t 1ps -lib work tb_mips_muldiv +#do {tb_mips_muldiv.udo} +view wave +add wave * +view structure +view signals +run 1000ns +## End diff --git a/lib/CPUs/MIPS/sim/tb_mips_muldiv.sdo b/lib/CPUs/MIPS/sim/tb_mips_muldiv.sdo new file mode 100644 index 0000000..9546784 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_muldiv.sdo @@ -0,0 +1,19 @@ +## NOTE: Do not edit this file. +## Auto generated by Project Navigator for Post-Translate Simulation +## +vlib work +## Compile Post-Translate Model +vcom -explicit -93 "../syn/eval_muldiv/netgen/synthesis/muldiv_synthesis.vhd" +vcom -explicit -93 "../../../PCK_FIO-1.16/PCK_FIO.vhd" +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/tb_mips_muldiv.vhd" + +vsim -t 1ps -lib work tb_mips_muldiv +do {tb_mips_muldiv.wdo} +view wave +#add wave * +view structure +view signals +run 1000ns +## End diff --git a/lib/CPUs/MIPS/sim/tb_mips_muldiv.wdo b/lib/CPUs/MIPS/sim/tb_mips_muldiv.wdo new file mode 100644 index 0000000..2fc4121 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_muldiv.wdo @@ -0,0 +1,79 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_mips_muldiv/rst +add wave -noupdate -format Logic /tb_mips_muldiv/clk +add wave -noupdate -format Logic /tb_mips_muldiv/mul_divn +add wave -noupdate -format Logic /tb_mips_muldiv/start +add wave -noupdate -format Logic /tb_mips_muldiv/busy +add wave -noupdate -format Logic /tb_mips_muldiv/s_un +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/din_hi +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/din_lo +add wave -noupdate -format Logic /tb_mips_muldiv/hilo_sel +add wave -noupdate -format Logic /tb_mips_muldiv/hilo_we +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/dout +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/result +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/result +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/ref_result +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/ref_hi +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/ref_lo +add wave -noupdate -format Logic /tb_mips_muldiv/uut/pre_sum_vld +add wave -noupdate -format Logic /tb_mips_muldiv/uut/mul_en +add wave -noupdate -format Logic /tb_mips_muldiv/uut/sum_en +add wave -noupdate -divider FSM +add wave -noupdate -format Literal /tb_mips_muldiv/uut/cycle_cnt +add wave -noupdate -format Logic /tb_mips_muldiv/uut/cycle_cnt_load +add wave -noupdate -format Literal /tb_mips_muldiv/uut/cycle_cnt_preset +add wave -noupdate -format Literal /tb_mips_muldiv/uut/s +add wave -noupdate -format Literal /tb_mips_muldiv/uut/sn +add wave -noupdate -divider {Multiplier internals} +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_muldiv/uut/pprod +add wave -noupdate -format Literal /tb_mips_muldiv/uut/ppadd_cyi +add wave -noupdate -format Literal /tb_mips_muldiv/uut/ppadd_cyo +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/ppadd_op1 +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/ppadd_op2 +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/ppadd_res +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/pp_op2 +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/pp_op2_r +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/add_op1 +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/add_op2 +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/add_res +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/pp_reg +add wave -noupdate -divider {Divider internals} +add wave -noupdate -format Logic /tb_mips_muldiv/busy +add wave -noupdate -format Logic /tb_mips_muldiv/s_un +add wave -noupdate -format Logic /tb_mips_muldiv/uut/div_start +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/din_hi +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/din_lo +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/result +add wave -noupdate -format Logic /tb_mips_muldiv/uut/div_add_cyi +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/div_add_op1 +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/div_add_op2 +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/div_add_res +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/div_m +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/div_m_n +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/div_a +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_muldiv/uut/div_q +add wave -noupdate -format Logic /tb_mips_muldiv/uut/div_qbit +add wave -noupdate -format Logic /tb_mips_muldiv/uut/div_en +add wave -noupdate -divider FSM +add wave -noupdate -format Literal /tb_mips_muldiv/uut/cycle_cnt +add wave -noupdate -format Logic /tb_mips_muldiv/uut/cycle_cnt_load +add wave -noupdate -format Literal /tb_mips_muldiv/uut/cycle_cnt_preset +add wave -noupdate -format Literal /tb_mips_muldiv/uut/s +add wave -noupdate -format Literal /tb_mips_muldiv/uut/sn +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {4999822285 ps} 0} {{Cursor 2} {1278050000 ps} 0} +configure wave -namecolwidth 149 +configure wave -valuecolwidth 171 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 100 +configure wave -griddelta 40 +configure wave -timeline 1 +update +WaveRestoreZoom {0 ps} {5250 us} diff --git a/lib/CPUs/MIPS/sim/tb_mips_top.fdo b/lib/CPUs/MIPS/sim/tb_mips_top.fdo new file mode 100644 index 0000000..811b0b8 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_top.fdo @@ -0,0 +1,22 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../../../PCK_FIO-1.16/PCK_FIO.vhd" +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/core/mips_idecode_rom.vhd" +vcom -explicit -93 "../src/core/mips_reg.vhd" +vcom -explicit -93 "../src/core/mips_shifter.vhd" +vcom -explicit -93 "../src/core/mips_alu.vhd" +vcom -explicit -93 "../src/core/mips_bcu.vhd" +vcom -explicit -93 "../src/core/mips_pipeline.vhd" +vcom -explicit -93 "../src/core/mips_top.vhd" +vcom -explicit -93 "../asm/fibonacci.vhd" +vcom -explicit -93 "../src/ram.vhd" +vcom -explicit -93 "../src/tb_mips_top.vhd" +vsim -t 1ps -lib work tb_mips_top +do {tb_mips_top.wdo} +view wave +view structure +view signals +run 40000ns diff --git a/lib/CPUs/MIPS/sim/tb_mips_top.mdo b/lib/CPUs/MIPS/sim/tb_mips_top.mdo new file mode 100644 index 0000000..1ba3832 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_top.mdo @@ -0,0 +1,18 @@ +## NOTE: Do not edit this file. +## +vlib work +## Compile Post-Map Model +vcom -explicit -93 "../syn/ise9/netgen/map/mips_top_map.vhd" +vsim -t 1ps -sdfmax "/mips_top=../syn/ise9/netgen/map/mips_top_map.sdf" -lib work mips_top +vcom -explicit -93 "../../../PCK_FIO-1.16/PCK_FIO.vhd" +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/irom_hello.vhd" +vcom -explicit -93 "../src/tb_mips_top.vhd" +vsim -t 1ps -lib work tb_mips_top +do {tb_mips_top.mwdo} +view wave +#add wave * +view structure +view signals +run 2400ns diff --git a/lib/CPUs/MIPS/sim/tb_mips_top.mwdo b/lib/CPUs/MIPS/sim/tb_mips_top.mwdo new file mode 100644 index 0000000..b24adae --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_top.mwdo @@ -0,0 +1,31 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_mips_top/rst +add wave -noupdate -format Logic /tb_mips_top/clk +add wave -noupdate -format Logic /tb_mips_top/ce +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/irom_data +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/irom_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/dmem_din +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/dmem_dout +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/dmem_addr +add wave -noupdate -format Logic /tb_mips_top/dmem_we +add wave -noupdate -format Logic /tb_mips_top/dmem_re +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/sram +add wave -noupdate -format Literal /tb_mips_top/uut/inst_pipeline_ex_stage_alu_op2 +add wave -noupdate -format Literal /tb_mips_top/uut/inst_pipeline_ex_stage_alu_result +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {77481 ps} 0} +configure wave -namecolwidth 150 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 100 +configure wave -griddelta 40 +configure wave -timeline 1 +update +WaveRestoreZoom {0 ps} {729730 ps} diff --git a/lib/CPUs/MIPS/sim/tb_mips_top.sdo b/lib/CPUs/MIPS/sim/tb_mips_top.sdo new file mode 100644 index 0000000..25435ef --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_top.sdo @@ -0,0 +1,16 @@ +## NOTE: Do not edit this file. +## +vlib work +vcom -explicit -93 "../syn/ise9/netgen/synthesis/mips_top_synthesis.vhd" +vcom -explicit -93 "../../../PCK_FIO-1.16/PCK_FIO.vhd" +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/irom_hello.vhd" +vcom -explicit -93 "../src/tb_mips_top.vhd" +vsim -t 1ps -lib work tb_mips_top +#do {tb_mips_top.wdo} +view wave +add wave * +view structure +view signals +run 2400ns diff --git a/lib/CPUs/MIPS/sim/tb_mips_top.wdo b/lib/CPUs/MIPS/sim/tb_mips_top.wdo new file mode 100644 index 0000000..833e5af --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_top.wdo @@ -0,0 +1,51 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_mips_top/rst +add wave -noupdate -format Logic /tb_mips_top/clk +add wave -noupdate -format Logic /tb_mips_top/cpu_halt +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/irom_data +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/irom_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/dmem_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/dmem_din +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/dmem_dout +add wave -noupdate -format Logic /tb_mips_top/dmem_re +add wave -noupdate -format Logic /tb_mips_top/dmem_we +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/inst_ram/sram +add wave -noupdate -divider ALU +add wave -noupdate -format Literal /tb_mips_top/uut/inst_pipeline/hdu +add wave -noupdate -format Logic /tb_mips_top/clk +add wave -noupdate -divider PC +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/uut/inst_pipeline/pc +add wave -noupdate -format Logic /tb_mips_top/uut/inst_pipeline/exception +add wave -noupdate -format Logic /tb_mips_top/clk +add wave -noupdate -format Logic /tb_mips_top/uut/inst_pipeline/stall +add wave -noupdate -divider PC +add wave -noupdate -format Logic /tb_mips_top/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/uut/inst_pipeline/if_stage +add wave -noupdate -format Logic /tb_mips_top/clk +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_top/uut/inst_pipeline/id_stage +add wave -noupdate -format Logic /tb_mips_top/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/dmem_din +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_top/uut/inst_pipeline/ex_stage +add wave -noupdate -format Logic /tb_mips_top/clk +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_top/uut/inst_pipeline/mem_stage +add wave -noupdate -format Logic /tb_mips_top/clk +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top/dmem_din +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_top/uut/inst_pipeline/wb_stage +add wave -noupdate -format Logic /tb_mips_top/clk +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {0 ps} 0} +configure wave -namecolwidth 188 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 100 +configure wave -griddelta 40 +configure wave -timeline 1 +update +WaveRestoreZoom {0 ps} {42 us} diff --git a/lib/CPUs/MIPS/sim/tb_mips_top_syn.mdo b/lib/CPUs/MIPS/sim/tb_mips_top_syn.mdo new file mode 100644 index 0000000..91b4dc0 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_top_syn.mdo @@ -0,0 +1,17 @@ +## NOTE: Do not edit this file. +## +vlib work +## Compile Post-Map Model +vcom -explicit -93 "../syn/ise9/netgen/map/mips_top_syn_map.vhd" +vsim -t 1ps -sdfmax "/mips_top_syn=../syn/ise9/netgen/map/mips_top_syn_map.sdf" -lib work mips_top_syn +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/irom_hello.vhd" +vcom -explicit -93 "../src/tb_mips_top_syn.vhd" +vsim -t 1ps -lib work tb_mips_top_syn +do {tb_mips_top_syn.wdo} +view wave +#add wave * +view structure +view signals +run 2400ns diff --git a/lib/CPUs/MIPS/sim/tb_mips_top_syn.tdo b/lib/CPUs/MIPS/sim/tb_mips_top_syn.tdo new file mode 100644 index 0000000..cc7c65d --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_top_syn.tdo @@ -0,0 +1,17 @@ +## NOTE: Do not edit this file. +## +vlib work +## Compile Post-Map Model +vcom -explicit -93 "../syn/ise9/netgen/par/mips_top_syn_timesim.vhd" +vsim -t 1ps -sdfmax "/mips_top_syn=../syn/ise9/netgen/par/mips_top_syn_timesim.sdf" -lib work mips_top_syn +vcom -explicit -93 "../src/core/mips_types.vhd" +vcom -explicit -93 "../src/core/mips_instr.vhd" +vcom -explicit -93 "../src/irom_hello.vhd" +vcom -explicit -93 "../src/tb_mips_top_syn.vhd" +vsim -t 1ps -lib work tb_mips_top_syn +do {tb_mips_top_syn.wdo} +view wave +#add wave * +view structure +view signals +run 2400ns diff --git a/lib/CPUs/MIPS/sim/tb_mips_top_syn.wdo b/lib/CPUs/MIPS/sim/tb_mips_top_syn.wdo new file mode 100644 index 0000000..eafadd7 --- /dev/null +++ b/lib/CPUs/MIPS/sim/tb_mips_top_syn.wdo @@ -0,0 +1,31 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_mips_top_syn/rst +add wave -noupdate -format Logic /tb_mips_top_syn/clk +add wave -noupdate -format Logic /tb_mips_top_syn/ce +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top_syn/irom_data +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top_syn/irom_addr +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top_syn/dmem_din +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top_syn/dmem_dout +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top_syn/dmem_addr +add wave -noupdate -format Logic /tb_mips_top_syn/dmem_we +add wave -noupdate -format Logic /tb_mips_top_syn/dmem_re +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top_syn/uut/inst_mips_top_inst_pipeline_id_stage_boff +add wave -noupdate -format Literal -radix hexadecimal /tb_mips_top_syn/uut/inst_mips_top_inst_pipeline_stage_ex_inst_alu_sum_res +add wave -noupdate -format Literal -radix hexadecimal -expand /tb_mips_top_syn/sram +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {{Cursor 1} {118199 ps} 0} +configure wave -namecolwidth 188 +configure wave -valuecolwidth 100 +configure wave -justifyvalue left +configure wave -signalnamewidth 1 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 +configure wave -gridoffset 0 +configure wave -gridperiod 100 +configure wave -griddelta 40 +configure wave -timeline 1 +update +WaveRestoreZoom {0 ps} {2520 ns} diff --git a/lib/CPUs/MIPS/src/core/dcache.vhd b/lib/CPUs/MIPS/src/core/dcache.vhd new file mode 100644 index 0000000..367c9d5 --- /dev/null +++ b/lib/CPUs/MIPS/src/core/dcache.vhd @@ -0,0 +1,430 @@ +LIBRARY IEEE; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; +use IEEE.MATH_REAL.ALL; + +library work; +use work.mips_types.all; + +ENTITY dcache IS + Generic + ( + cache_size : natural := 2048; -- words + line_size : natural := 8 -- words + ); + Port + ( + clk : in STD_LOGIC; + rst : in STD_LOGIC; + en : in STD_LOGIC; + cpu_en : in STD_LOGIC; + cpu_r_wn : in STD_LOGIC; + cpu_we : in unsigned(3 downto 0); + cpu_addr : in word_t; + cpu_din : in word_t; + cpu_dout : out word_t; + cpu_busy : out STD_LOGIC; + mem_req : out STD_LOGIC; + mem_gnt : in STD_LOGIC; + mem_en : out STD_LOGIC; + mem_addr : out word_t; + mem_din : in word_t; + mem_valid : in STD_LOGIC; + mem_rdy : in STD_LOGIC + ); +END dcache; + +ARCHITECTURE behavior OF dcache IS + +COMPONENT dpram_1w1r + GENERIC + ( + addr_width : integer := 3; + data_width : integer := 8 + ); + PORT ( + clka : in STD_LOGIC; + clkb : in STD_LOGIC; + en_a : in STD_LOGIC; + en_b : in STD_LOGIC; + we_a : in STD_LOGIC; + addr_a : in unsigned (addr_width-1 downto 0); + addr_b : in unsigned (addr_width-1 downto 0); + din_a : in unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); +END COMPONENT; + +COMPONENT dpram_2w2r is + GENERIC + ( + addr_width : integer := 3; + data_width : integer := 8 + ); + PORT + ( + clk_a : in STD_LOGIC; + clk_b : in STD_LOGIC; + en_a : in STD_LOGIC; + en_b : in STD_LOGIC; + we_a : in STD_LOGIC; + we_b : in STD_LOGIC; + addr_a : in unsigned (addr_width-1 downto 0); + addr_b : in unsigned (addr_width-1 downto 0); + din_a : in unsigned (data_width-1 downto 0); + din_b : in unsigned (data_width-1 downto 0); + dout_a : out unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); +END COMPONENT; + + function lg2(x : natural) return natural is + begin + return natural(ceil(log2(real(x)))); + end lg2; + + function po2(x : natural) return natural is + begin + + return 2**lg2(x); + end po2; + + constant word_index_width : natural := lg2(line_size); + constant cache_index_width : natural := lg2(cache_size) - word_index_width; + constant tag_width : natural := 32 - word_index_width - cache_index_width - 2; + constant tag_parity_width : natural := 3; + constant tram_data_width : natural := 2 + tag_parity_width + tag_width; + constant tram_addr_width : natural := cache_index_width; + + subtype tram_data_t is unsigned (tram_data_width-1 downto 0); + + type dcache_entry_t is record + valid : std_logic; + dirty : std_logic; + tv_p : unsigned(tag_parity_width-1 downto 0); + tag : unsigned(tag_width-1 downto 0); + end record; + + alias cpu_word_index is cpu_addr(word_index_width+1 downto 2); + alias cpu_cache_index is cpu_addr(cache_index_width+word_index_width+1 downto word_index_width+2); + alias cpu_tag is cpu_addr(tag_width+cache_index_width+word_index_width+1 downto cache_index_width+word_index_width+2); + + function to_dcache_entry(x : tram_data_t) return dcache_entry_t is + variable result : dcache_entry_t; + begin + result.valid := x(0); + result.dirty := x(1); + result.tv_p := x(4 downto 2); + result.tag := x(tag_width+4 downto 5); + + return result; + end to_dcache_entry; + + function to_tram_data(x : dcache_entry_t) return tram_data_t is + variable result : tram_data_t; + begin + result(0) := x.valid; + result(1) := x.dirty; + result(4 downto 2) := x.tv_p; + result(tag_width+4 downto 5) := x.tag; + + return result; + end to_tram_data; + + type cache_state_t is (init, ready, flush, mem_request, mem_access, mem_wait, mem_data, upd_cache, rd_cache, wr_cache); + signal s, sn : cache_state_t; + + signal cache_busy : std_logic; + signal cache_read_miss : std_logic; + signal cache_write_miss : std_logic; + signal tag_match : std_logic; + signal word_index_reg : unsigned(word_index_width-1 downto 0); + signal cache_index_reg : unsigned(cache_index_width-1 downto 0); + signal tag_index_reg : unsigned(tag_width-1 downto 0); + + signal cache_entry_in : dcache_entry_t; + signal cache_entry_out : dcache_entry_t; + signal cpu_dram_addr : unsigned(lg2(cache_size)-1 downto 0); + signal cpu_dram_dout : word_t; + signal cpu_dram_din : word_t; + signal cpu_data_reg : word_t; + signal cpu_we_reg : unsigned(3 downto 0); + signal ctrl_force_we : unsigned(3 downto 0); + signal cpu_was_write : std_logic; + signal ctrl_dram_addr : unsigned(lg2(cache_size)-1 downto 0); + signal ctrl_dram_din : word_t; + signal ctrl_dram_we : unsigned(3 downto 0); + signal cpu_dram_we : unsigned(3 downto 0); + signal dram_en : std_logic; + signal cpu_was_en : std_logic; + + signal tram_addr_rd : unsigned(cache_index_width-1 downto 0); + signal tram_dout : tram_data_t; + signal tram_addr_wr : unsigned(cache_index_width-1 downto 0); + signal tram_din : tram_data_t; + signal tram_re : std_logic; + signal tram_we : std_logic; + + signal ram_index_count : natural range 0 to 2**word_index_width-1; + signal ram_index_count_rst : std_logic; + signal cache_index_count : natural range 0 to 2**cache_index_width-1; + signal cache_index_count_en : std_logic; + signal mem_index_count : natural range 0 to 2**word_index_width-1; + signal mem_index_count_en : std_logic; + signal mem_index_count_rst : std_logic; + signal cpu_reg_en : std_logic; + signal was_miss : std_logic; + signal data_write : std_logic; + signal cpu_we2 : std_logic; + +begin + + +cpu_index_reg: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + cache_index_reg <= (others => '0'); + tag_index_reg <= (others => '0'); + cpu_was_write <= '0'; + elsif cpu_reg_en = '1' and en = '1' then + word_index_reg <= cpu_word_index; + cache_index_reg <= cpu_cache_index; + tag_index_reg <= cpu_tag; + cpu_data_reg <= cpu_din; + cpu_we_reg <= cpu_we; + cpu_was_write <= not cpu_r_wn; + end if; + end if; + end process; + +cpu_was_wr_reg: + process(clk) + begin + if rising_edge(clk) then + cpu_was_en <= '0'; + cpu_we2 <= '0'; + if cpu_en = '1' and en = '1' then + cpu_we2 <= not cpu_r_wn; + cpu_was_en <= '1'; + cpu_dram_din <= cpu_din; + end if; + end if; + end process; + +inst_tag_ram : dpram_1w1r + GENERIC MAP ( + addr_width => tram_addr_width, + data_width => tram_data_width + ) + PORT MAP ( + clka => clk, + clkb => clk, + en_a => '1', + en_b => tram_re, + we_a => tram_we, + addr_a => tram_addr_wr, + addr_b => tram_addr_rd, + din_a => tram_din, + dout_b => tram_dout + ); + +gen_data_ram: + for i in 0 to 3 generate + begin + + inst_data_ram : dpram_2w2r + GENERIC MAP ( + addr_width => lg2(cache_size), + data_width => word_t'length/4 + ) + PORT MAP ( + clk_a => clk, + clk_b => clk, + en_a => '1', + en_b => dram_en, + we_a => ctrl_dram_we(i), + we_b => cpu_dram_we(i), + addr_a => ctrl_dram_addr, + addr_b => cpu_dram_addr, + din_a => ctrl_dram_din(8*(i+1)-1 downto 8*i), + din_b => cpu_dram_din(8*(i+1)-1 downto 8*i), + dout_a => open, + dout_b => cpu_dram_dout(8*(i+1)-1 downto 8*i) + ); + end generate; + +cache_state_next: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + s <= init; + else + s <= sn; + end if; + end if; + end process; + + cpu_busy <= cache_busy; + cpu_dout <= cpu_dram_dout; + + tag_match <= '1' when tag_index_reg = cache_entry_out.tag else '0'; + cache_read_miss <= not (tag_match and cache_entry_out.valid) and not cpu_was_write; + cache_write_miss <= not (tag_match and cache_entry_out.valid and cpu_was_write); + tram_din <= to_tram_data(cache_entry_in); + tram_addr_rd <= cpu_cache_index when was_miss = '0' else cache_index_reg; + cache_entry_out <= to_dcache_entry(tram_dout); + cpu_dram_addr <= (cpu_cache_index & cpu_word_index) when (was_miss = '0' and cpu_we2 = '0') else (cache_index_reg & word_index_reg); + mem_addr <= tag_index_reg & cache_index_reg & to_unsigned(mem_index_count, word_index_width) & "00"; + ctrl_dram_addr <= cache_index_reg & to_unsigned(ram_index_count, word_index_width); + ctrl_dram_din <= mem_din; + ctrl_dram_we <= (3 downto 0 => (data_write and mem_valid)) or ctrl_force_we; + cpu_dram_we <= cpu_we_reg when (cpu_we2 = '1' and cache_write_miss = '0') else (others => '0'); + +cache_state: + process(s, cache_read_miss, cache_index_count, ram_index_count, mem_index_count, cache_index_reg, mem_valid, tag_index_reg, cpu_en, cpu_r_wn, mem_gnt, mem_rdy, cpu_was_en, cpu_was_write, cpu_we_reg) + begin + cpu_reg_en <= '0'; + cache_busy <= '1'; + tram_we <= '0'; + cache_index_count_en <= '0'; + ram_index_count_rst <= '0'; + mem_index_count_en <= '0'; + mem_index_count_rst <= '0'; + mem_req <= '0'; + mem_en <= '0'; + dram_en <= '0'; + tram_re <= '0'; + was_miss <= '0'; + data_write <= '0'; + tram_addr_wr <= to_unsigned(cache_index_count, cache_index_width); + cache_entry_in.tv_p <= (others => '0'); + cache_entry_in.tag <= tag_index_reg; + cache_entry_in.valid <= '0'; + cache_entry_in.dirty <= '0'; + ctrl_force_we <= (others => '0'); + sn <= s; + + case s is + when init => + sn <= flush; + when ready => + cache_busy <= '0'; + cpu_reg_en <= '1'; + dram_en <= cpu_en or cpu_was_en; + tram_re <= cpu_en; + if cpu_was_en = '1' then + if cache_read_miss = '1' then + sn <= mem_request; + cpu_reg_en <= '0'; + cache_busy <= '1'; + end if; + end if; + when flush => + cache_index_count_en <= '1'; + tram_addr_wr <= to_unsigned(cache_index_count, cache_index_width); + tram_we <= '1'; + cache_entry_in.valid <= '0'; + cache_entry_in.tag <= (others => '0'); + if cache_index_count = 0 then + sn <= ready; + if cpu_en = '1' then + cpu_reg_en <= '1'; + dram_en <= '1'; + tram_re <= '1'; + end if; + end if; + when mem_request => + ram_index_count_rst <= '1'; + mem_index_count_rst <= '1'; + mem_req <= '1'; + if mem_gnt = '1' then + sn <= mem_access; + end if; + when mem_access => + data_write <= '1'; + mem_req <= '1'; + if mem_rdy = '1' then + mem_index_count_en <= '1'; + mem_en <= '1'; + if mem_index_count = 2**word_index_width-1 then + sn <= mem_data; + end if; + end if; + when mem_data => + mem_req <= '1'; + data_write <= '1'; + if ram_index_count = 2**word_index_width-1 then + if mem_valid = '1' then + sn <= upd_cache; + end if; + end if; + when upd_cache => + mem_req <= '1'; + tram_addr_wr <= cache_index_reg; + tram_we <= '1'; + cache_entry_in.valid <= '1'; + if cpu_was_write = '1' then + sn <= wr_cache; + else + sn <= rd_cache; + end if; + + when rd_cache => + tram_re <= '1'; + dram_en <= '1'; + was_miss <= '1'; + sn <= ready; + + when wr_cache => + tram_re <= '1'; + ctrl_force_we <= cpu_we_reg; + sn <= ready; + when others => + sn <= ready; + end case; + end process; + +cache_index_counter: + process(clk) + begin + if rising_edge(clk) then + if cache_index_count_en = '0' then + cache_index_count <= 2**cache_index_width-1; + elsif cache_index_count /= 0 then + cache_index_count <= cache_index_count - 1; + end if; + end if; + end process; + +ram_index_counter: + process(clk) + begin + if rising_edge(clk) then + if ram_index_count_rst = '1' then + ram_index_count <= 0; + elsif data_write = '1' and mem_valid = '1' then + if ram_index_count /= 2**word_index_width-1 then + ram_index_count <= ram_index_count + 1; + end if; + end if; + end if; + end process; + +mem_index_counter: + process(clk) + begin + if rising_edge(clk) then + if mem_index_count_rst = '1' then + mem_index_count <= 0; + elsif mem_index_count_en = '1' then + if mem_index_count /= 2**word_index_width-1 then + mem_index_count <= mem_index_count + 1; + end if; + end if; + end if; + end process; + +end behavior; diff --git a/lib/CPUs/MIPS/src/core/icache.vhd b/lib/CPUs/MIPS/src/core/icache.vhd new file mode 100644 index 0000000..d7e3026 --- /dev/null +++ b/lib/CPUs/MIPS/src/core/icache.vhd @@ -0,0 +1,356 @@ +LIBRARY IEEE; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; +use IEEE.MATH_REAL.ALL; + +library work; +use work.mips_types.all; + +ENTITY icache IS + Generic + ( + cache_size : natural := 2048; -- words + line_size : natural := 8 -- words + ); + Port + ( + clk : in STD_LOGIC; + rst : in STD_LOGIC; + en : in STD_LOGIC; + cpu_en : in STD_LOGIC; + cpu_addr : in word_t; + cpu_dout : out word_t; + cpu_busy : out STD_LOGIC; + mem_req : out STD_LOGIC; + mem_gnt : in STD_LOGIC; + mem_en : out STD_LOGIC; + mem_addr : out word_t; + mem_din : in word_t; + mem_valid : in STD_LOGIC; + mem_rdy : in STD_LOGIC + ); +END icache; + +ARCHITECTURE behavior OF icache IS + +COMPONENT dpram_1w1r + GENERIC + ( + addr_width : integer := 3; + data_width : integer := 8 + ); + PORT ( + clka : in STD_LOGIC; + clkb : in STD_LOGIC; + en_a : in STD_LOGIC; + en_b : in STD_LOGIC; + we_a : in STD_LOGIC; + addr_a : in unsigned (addr_width-1 downto 0); + addr_b : in unsigned (addr_width-1 downto 0); + din_a : in unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); +END COMPONENT; + + function lg2(x : natural) return natural is + begin + return natural(ceil(log2(real(x)))); + end lg2; + + function po2(x : natural) return natural is + begin + + return 2**lg2(x); + end po2; + + constant word_index_width : natural := lg2(line_size); + constant cache_index_width : natural := lg2(cache_size) - word_index_width; + constant tag_width : natural := 32 - word_index_width - cache_index_width - 2; + constant tag_parity_width : natural := 3; + constant tag_ram_data_width : natural := 1 + tag_parity_width + tag_width; + constant tag_ram_addr_width : natural := cache_index_width; + + subtype tag_ram_data_t is unsigned (tag_ram_data_width-1 downto 0); + + type icache_entry_t is record + valid : std_logic; + tv_p : unsigned(tag_parity_width-1 downto 0); + tag : unsigned(tag_width-1 downto 0); + end record; + + alias cpu_word_index is cpu_addr(word_index_width+1 downto 2); + alias cpu_cache_index is cpu_addr(cache_index_width+word_index_width+1 downto word_index_width+2); + alias cpu_tag is cpu_addr(tag_width+cache_index_width+word_index_width+1 downto cache_index_width+word_index_width+2); + + function to_icache_entry(x : tag_ram_data_t) return icache_entry_t is + variable result : icache_entry_t; + begin + result.valid := x(0); + result.tv_p := x(3 downto 1); + result.tag := x(tag_width+3 downto 4); + + return result; + end to_icache_entry; + + function to_tag_ram_data(x : icache_entry_t) return tag_ram_data_t is + variable result : tag_ram_data_t; + begin + result(0) := x.valid; + result(3 downto 1) := x.tv_p; + result(tag_width+3 downto 4) := x.tag; + + return result; + end to_tag_ram_data; + + type cache_state_t is (init, ready, flush, mem_request, mem_access, mem_wait, mem_data, upd_cache, rd_cache); + signal s, sn : cache_state_t; + + signal cache_busy : std_logic; + signal cache_miss : std_logic; + signal tag_match : std_logic; + signal word_index_reg : unsigned(word_index_width-1 downto 0); + signal cache_index_reg : unsigned(cache_index_width-1 downto 0); + signal tag_index_reg : unsigned(tag_width-1 downto 0); + + signal cache_entry_in : icache_entry_t; + signal cache_entry_out : icache_entry_t; + signal data_ram_addr_rd : unsigned(lg2(cache_size)-1 downto 0); + signal data_ram_data_rd : word_t; + signal data_ram_addr_wr : unsigned(lg2(cache_size)-1 downto 0); + signal data_ram_data_wr : word_t; + signal data_ram_we : std_logic; + signal data_ram_re : std_logic; + + signal tag_ram_addr_rd : unsigned(cache_index_width-1 downto 0); + signal tag_ram_data_rd : tag_ram_data_t; + signal tag_ram_addr_wr : unsigned(cache_index_width-1 downto 0); + signal tag_ram_data_wr : tag_ram_data_t; + signal tag_ram_re : std_logic; + signal tag_ram_we : std_logic; + + signal ram_index_count : natural range 0 to 2**word_index_width-1; + signal ram_index_count_rst : std_logic; + signal cache_index_count : natural range 0 to 2**cache_index_width-1; + signal cache_index_count_en : std_logic; + signal mem_index_count : natural range 0 to 2**word_index_width-1; + signal mem_index_count_en : std_logic; + signal mem_index_count_rst : std_logic; + signal cpu_reg_en : std_logic; + signal was_miss : std_logic; + signal data_write : std_logic; + +begin + + +cpu_index_reg: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + cache_index_reg <= (others => '0'); + tag_index_reg <= (others => '0'); + elsif cpu_reg_en = '1' then + word_index_reg <= cpu_word_index; + cache_index_reg <= cpu_cache_index; + tag_index_reg <= cpu_tag; + end if; + end if; + end process; + +inst_tag_ram : dpram_1w1r + GENERIC MAP ( + addr_width => tag_ram_addr_width, + data_width => tag_ram_data_width + ) + PORT MAP ( + clka => clk, + clkb => clk, + en_a => '1', + en_b => tag_ram_re, + we_a => tag_ram_we, + addr_a => tag_ram_addr_wr, + addr_b => tag_ram_addr_rd, + din_a => tag_ram_data_wr, + dout_b => tag_ram_data_rd + ); + +inst_data_ram : dpram_1w1r + GENERIC MAP ( + addr_width => lg2(cache_size), + data_width => word_t'length + ) + PORT MAP ( + clka => clk, + clkb => clk, + en_a => '1', + en_b => data_ram_re, + we_a => data_ram_we, + addr_a => data_ram_addr_wr, + addr_b => data_ram_addr_rd, + din_a => data_ram_data_wr, + dout_b => data_ram_data_rd + ); + + +cache_state_next: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + s <= init; + else + s <= sn; + end if; + end if; + end process; + + cpu_busy <= cache_busy; + cpu_dout <= data_ram_data_rd; + + tag_match <= '1' when tag_index_reg = cache_entry_out.tag else '0'; + cache_miss <= not (tag_match and cache_entry_out.valid); + tag_ram_data_wr <= to_tag_ram_data(cache_entry_in); + tag_ram_addr_rd <= cpu_cache_index when was_miss = '0' else cache_index_reg; + cache_entry_out <= to_icache_entry(tag_ram_data_rd); + data_ram_addr_rd <= (cpu_cache_index & cpu_word_index) when was_miss = '0' else (cache_index_reg & word_index_reg); + mem_addr <= tag_index_reg & cache_index_reg & to_unsigned(mem_index_count, word_index_width) & "00"; + data_ram_addr_wr <= cache_index_reg & to_unsigned(ram_index_count, word_index_width); + data_ram_data_wr <= mem_din; + data_ram_we <= data_write and mem_valid; + +cache_state: + process(s, cache_miss, cache_index_count, ram_index_count, mem_index_count, cache_index_reg, mem_valid, tag_index_reg, cpu_en, mem_gnt, mem_rdy, en) + begin + cpu_reg_en <= '0'; + cache_busy <= '1'; + tag_ram_we <= '0'; + cache_index_count_en <= '0'; + ram_index_count_rst <= '0'; + mem_index_count_en <= '0'; + mem_index_count_rst <= '0'; + mem_req <= '0'; + mem_en <= '0'; + data_ram_re <= '0'; + tag_ram_re <= '0'; + was_miss <= '0'; + data_write <= '0'; + tag_ram_addr_wr <= to_unsigned(cache_index_count, cache_index_width); + cache_entry_in.tv_p <= (others => '0'); + cache_entry_in.tag <= tag_index_reg; + cache_entry_in.valid <= '0'; + sn <= s; + + case s is + when init => + sn <= flush; + when ready => + if en = '1' then + cache_busy <= '0'; + if cache_miss = '1' then + sn <= mem_request; + cpu_reg_en <= '0'; + cache_busy <= '1'; + elsif cpu_en = '1' then + cpu_reg_en <= '1'; + data_ram_re <= '1'; + tag_ram_re <= '1'; + end if; + end if; + when flush => + cache_index_count_en <= '1'; + tag_ram_addr_wr <= to_unsigned(cache_index_count, cache_index_width); + tag_ram_we <= '1'; + cache_entry_in.valid <= '0'; + cache_entry_in.tag <= (others => '0'); + if cache_index_count = 0 then + sn <= ready; + if cpu_en = '1' then + cpu_reg_en <= '1'; + data_ram_re <= '1'; + tag_ram_re <= '1'; + end if; + end if; + when mem_request => + ram_index_count_rst <= '1'; + mem_index_count_rst <= '1'; + mem_req <= '1'; + if mem_gnt = '1' then + sn <= mem_access; + end if; + when mem_access => + data_write <= '1'; + mem_req <= '1'; + if mem_rdy = '1' then + mem_index_count_en <= '1'; + mem_en <= '1'; + if mem_index_count = 2**word_index_width-1 then + sn <= mem_data; + end if; + end if; + when mem_data => + mem_req <= '1'; + data_write <= '1'; + if ram_index_count = 2**word_index_width-1 then + if mem_valid = '1' then + sn <= upd_cache; + end if; + end if; + when upd_cache => + mem_req <= '1'; + tag_ram_addr_wr <= cache_index_reg; + tag_ram_we <= '1'; + cache_entry_in.valid <= '1'; + sn <= rd_cache; + + when rd_cache => +-- mem_req <= '1'; + tag_ram_re <= '1'; + data_ram_re <= '1'; + was_miss <= '1'; + sn <= ready; + when others => + sn <= ready; + end case; + end process; + +cache_index_counter: + process(clk) + begin + if rising_edge(clk) then + if cache_index_count_en = '0' then + cache_index_count <= 2**cache_index_width-1; + elsif cache_index_count /= 0 then + cache_index_count <= cache_index_count - 1; + end if; + end if; + end process; + +ram_index_counter: + process(clk) + begin + if rising_edge(clk) then + if ram_index_count_rst = '1' then + ram_index_count <= 0; + elsif data_write = '1' and mem_valid = '1' then + if ram_index_count /= 2**word_index_width-1 then + ram_index_count <= ram_index_count + 1; + end if; + end if; + end if; + end process; + +mem_index_counter: + process(clk) + begin + if rising_edge(clk) then + if mem_index_count_rst = '1' then + mem_index_count <= 0; + elsif mem_index_count_en = '1' then + if mem_index_count /= 2**word_index_width-1 then + mem_index_count <= mem_index_count + 1; + end if; + end if; + end if; + end process; + +end behavior; diff --git a/lib/CPUs/MIPS/src/core/mips_alu.vhd b/lib/CPUs/MIPS/src/core/mips_alu.vhd new file mode 100644 index 0000000..a64b5a4 --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_alu.vhd @@ -0,0 +1,184 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The arithmetic logic unit +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.mips_types.all; + +entity alu is + Generic + ( + data_width : integer := 8 + ); + Port + ( + op1_in : in unsigned (data_width-1 downto 0); + op2_in : in unsigned (data_width-1 downto 0); + op2_shifted : in unsigned (data_width-1 downto 0); + ctrl : in alu_ctrl_t; + result : out unsigned (data_width-1 downto 0); + flags : out alu_flags_t + ); +end alu; + +architecture Behavioral of alu is + + signal sum_res : unsigned (data_width-1 downto 0); + signal and_res : unsigned (data_width-1 downto 0); + signal xor_res : unsigned (data_width-1 downto 0); + signal nor_res : unsigned (data_width-1 downto 0); + signal or_res : unsigned (data_width-1 downto 0); + signal eq, sa, sb, sr, c, z : STD_LOGIC; + signal lts, ltu : STD_LOGIC; + +-------------------------------------------------------------------------- +begin + + eq <= '1' when op1_in = op2_in else '0' after 3 ns; + sa <= op1_in(op1_in'left); + sb <= op2_in(op2_in'left); + sr <= sum_res(sum_res'left); + z <= '1' when op1_in = (data_width-1 downto 0 => '0') else '0' after 2 ns; + + flags.uvf <= (not ctrl.add) and ((sa and (not sb) and (not sr)) or ((not sa) and sb and sr)); + flags.ovf <= ctrl.add and ((sa and sb and (not sr)) or ((not sa) and (not sb) and sr)); +-- lts <= (not eq) and (((not c) and sa and sb) or (((not sr) and sa) or (sa and (not sb)) or (sr and (not sb)))); + lts <= not eq and ((not c and sa) or (not sb and sa) or (not sb and sr)); + + ltu <= (not eq) and (not c); + flags.lts <= lts; + flags.ltu <= ltu; + flags.c <= c; + +-------------------------------------------------------------------------- +proc_op_and: + process(op1_in, op2_in) + variable x1, x2 : unsigned (data_width-1 downto 0); + begin + x1 := op1_in; + x2 := op2_in; + + and_res <= (x1 and x2) after 1 ns; + + end process; + +-------------------------------------------------------------------------- +proc_proc_xor: + process(op1_in, op2_in) + variable x1, x2 : unsigned (data_width-1 downto 0); + begin + x1 := op1_in; + x2 := op2_in; + + xor_res <= (x1 xor x2) after 2 ns; + + end process; + +-------------------------------------------------------------------------- +proc_proc_nor: + process(op1_in, op2_in) + variable x1, x2 : unsigned (data_width-1 downto 0); + begin + x1 := op1_in; + x2 := op2_in; + + nor_res <= (x1 nor x2) after 1 ns; + + end process; + +-------------------------------------------------------------------------- +proc_proc_or: + process(op1_in, op2_in) + variable x1, x2 : unsigned (data_width-1 downto 0); + begin + x1 := op1_in; + x2 := op2_in; + + or_res <= (x1 or x2) after 1 ns; + + end process; + +-------------------------------------------------------------------------- +proc_alu_out: + process(ctrl, sum_res, and_res, xor_res, nor_res, or_res, op2_shifted, lts, ltu) + begin + + result <= sum_res; + + case ctrl.outsel is + + when alu_adder => + result <= sum_res; + + when alu_and => + result <= and_res; + + when alu_xor => + result <= xor_res; + + when alu_nor => + result <= nor_res; + + when alu_or => + result <= or_res; + + when alu_shift2 => + result <= op2_shifted; + + when alu_ltu => + result <= (data_width-1 downto 1 => '0') & ltu; + + when alu_lts => + result <= (data_width-1 downto 1 => '0') & lts; + + when others => null; + + end case; + + end process; + +-------------------------------------------------------------------------- +alu_addsub: + process(op1_in, op2_in, ctrl) + variable sum : unsigned(data_width+1 downto 0); + variable op1, op2 : unsigned(data_width+1 downto 0); + begin + + op1 := '0' & op1_in & not ctrl.add; + if (ctrl.add = '1') then + op2 := '0' & op2_in & '0'; + else + op2 := '0' & not op2_in & '1'; + end if; + sum := op1 + op2; + + -- Form sum + carry + sum_res <= unsigned(sum(data_width downto 1)) after 4 ns; + c <= sum(sum'left) after 4 ns; + + end process; + +-------------------------------------------------------------------------- +end Behavioral; diff --git a/lib/CPUs/MIPS/src/core/mips_bcu.vhd b/lib/CPUs/MIPS/src/core/mips_bcu.vhd new file mode 100644 index 0000000..14e3f36 --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_bcu.vhd @@ -0,0 +1,53 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The arithmetic logic unit +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.mips_types.all; + +entity bcu is + Generic + ( + data_width : integer := 8 + ); + Port + ( + op1_in : in unsigned (data_width-1 downto 0); + op2_in : in unsigned (data_width-1 downto 0); + flags : out bcu_flags_t + ); +end bcu; + +architecture Behavioral of bcu is + +-------------------------------------------------------------------------- +begin + + flags.eq <= '1' when op1_in = op2_in else '0' after 3 ns; + flags.z <= '1' when op1_in = (data_width-1 downto 0 => '0') else '0' after 2 ns; + flags.ltz <= op1_in(op1_in'left) after 1 ns; + +-------------------------------------------------------------------------- +end Behavioral; diff --git a/lib/CPUs/MIPS/src/core/mips_bui.vhd b/lib/CPUs/MIPS/src/core/mips_bui.vhd new file mode 100644 index 0000000..b1adabe --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_bui.vhd @@ -0,0 +1,396 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: JIPS top file +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +library work; +use work.mips_types.all; + +entity bui is + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + cpu_wait : out STD_LOGIC; + cpu_imem_rdy : out STD_LOGIC; + cpu_imem_en : in STD_LOGIC; + cpu_imem_addr : in word_t; + cpu_imem_din : out word_t; + cpu_dmem_rdy : out STD_LOGIC; + cpu_dmem_en : in STD_LOGIC; + cpu_dmem_re : in STD_LOGIC; + cpu_dmem_we : in unsigned(3 downto 0); + cpu_dmem_dout : in word_t; + cpu_dmem_din : out word_t; + cpu_dmem_addr : in word_t; + mem_valid : in STD_LOGIC; + mem_rdy : in STD_LOGIC; + mem_addr : out word_t; + mem_din : in word_t; + mem_dout : out word_t; + mem_re : out STD_LOGIC; + mem_we : out unsigned(3 downto 0); + mem_ce : out STD_LOGIC + ); + +end bui; + +architecture behavior of bui is + +COMPONENT icache + GENERIC + ( + cache_size : natural := 2048; -- words + line_size : natural := 8 -- words + ); + PORT + ( + clk : in STD_LOGIC; + rst : in STD_LOGIC; + en : in STD_LOGIC; + cpu_en : in STD_LOGIC; + cpu_addr : in word_t; + cpu_dout : out word_t; + cpu_busy : out STD_LOGIC; + mem_en : out STD_LOGIC; + mem_req : out STD_LOGIC; + mem_gnt : in STD_LOGIC; + mem_addr : out word_t; + mem_din : in word_t; + mem_valid : in STD_LOGIC; + mem_rdy : in STD_LOGIC + ); +END COMPONENT; + +COMPONENT dcache + GENERIC + ( + cache_size : natural := 2048; -- words + line_size : natural := 8 -- words + ); + PORT + ( + clk : in STD_LOGIC; + rst : in STD_LOGIC; + en : in STD_LOGIC; + cpu_en : in STD_LOGIC; + cpu_r_wn : in STD_LOGIC; + cpu_we : in unsigned(3 downto 0); + cpu_addr : in word_t; + cpu_din : in word_t; + cpu_dout : out word_t; + cpu_busy : out STD_LOGIC; + mem_req : out STD_LOGIC; + mem_gnt : in STD_LOGIC; + mem_en : out STD_LOGIC; + mem_addr : out word_t; + mem_din : in word_t; + mem_valid : in STD_LOGIC; + mem_rdy : in STD_LOGIC + ); +END COMPONENT; + + type bus_state_t is (init, ready, i_cache_bus_access, d_cache_bus_access, d_bus_start, d_bus_access, d_bus_finish); + + signal s, sn : bus_state_t; + signal dmem_re : std_logic; + signal dmem_we : unsigned(3 downto 0); + signal dcache_dout : word_t; + signal dmem_dout : word_t; + signal dmem_din : word_t; + signal dmem_addr : word_t; + signal imem_addr : word_t; + signal imem_mem_out_en : std_logic; + signal dmem_mem_out_en : std_logic; + signal imem_valid : std_logic; + signal dmem_valid : std_logic; + signal dmem_ack : std_logic; + signal dcache_req : std_logic; + signal dcache_busy1 : std_logic; + signal dcache_busy2 : std_logic; + signal icache_busy : std_logic; + signal bus_req : std_logic; + signal bus_bsy : std_logic; + signal icache_mem_en : std_logic; + signal icache_mem_req : std_logic; + signal icache_mem_gnt : std_logic; + signal icache_mem_addr : word_t; + signal dcache_mem_en : std_logic; + signal dcache_mem_req : std_logic; + signal dcache_mem_gnt : std_logic; + signal dcache_mem_addr : word_t; + signal contention : std_logic; + signal dcached : std_logic; + signal duncached_access : std_logic; + +begin + + mem_ce <= mem_rdy and bus_req; + contention <= dcache_req and icache_mem_req; + + cpu_imem_rdy <= not icache_busy after 4.5 ns; +-- cpu_imem_din <= imem_din; +-- cpu_wait <= busy after 5.5 ns; + cpu_wait <= '0'; + cpu_dmem_rdy <= not (dcache_busy1 or dcache_busy2) after 4.5 ns; + +inst_icache : icache + GENERIC MAP + ( + cache_size => 2048, -- words + line_size => 8 + ) + PORT MAP + ( + clk => clk, + rst => rst, + en => '1', + cpu_en => cpu_imem_en, + cpu_addr => cpu_imem_addr, + cpu_dout => cpu_imem_din, + cpu_busy => icache_busy, + mem_en => icache_mem_en, + mem_req => icache_mem_req, + mem_gnt => icache_mem_gnt, + mem_addr => icache_mem_addr, + mem_din => mem_din, + mem_valid => imem_valid, + mem_rdy => mem_rdy + ); + +inst_dcache : dcache + GENERIC MAP + ( + cache_size => 2048, -- words + line_size => 8 + ) + PORT MAP + ( + clk => clk, + rst => rst, + en => dcached, + cpu_en => cpu_dmem_en, + cpu_r_wn => cpu_dmem_re, + cpu_we => cpu_dmem_we, + cpu_addr => cpu_dmem_addr, + cpu_din => cpu_dmem_dout, + cpu_dout => dcache_dout, + cpu_busy => dcache_busy2, + mem_req => dcache_mem_req, + mem_gnt => dcache_mem_gnt, + mem_en => dcache_mem_en, + mem_addr => dcache_mem_addr, + mem_din => mem_din, + mem_valid => dmem_valid, + mem_rdy => mem_rdy + ); + + dcached <= '1' when cpu_dmem_addr(31 downto 28) /= X"A" else '0'; + cpu_dmem_din <= dmem_din when duncached_access = '1' else dcache_dout; -- when dmem_valid = '1' else ram_dout after 0.5 ns; + +dcache_flags: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + dcache_busy1 <= '0'; + dcache_req <= '0'; + else + duncached_access <= '0'; + if dmem_ack = '1' then + duncached_access <= '1'; + dcache_req <= '0'; + if dmem_re = '1' then + if dmem_valid = '1' then + dcache_busy1 <= '0'; + end if; + else + dcache_busy1 <= '0'; + end if; + end if; + if cpu_dmem_en = '1' and dcache_busy1 = '0' and dcache_busy2 = '0' then + dcache_req <= '1'; + dcache_busy1 <= '1'; + if dcached = '1' and cpu_dmem_re = '1' then + dcache_req <= '0'; + dcache_busy1 <= '0'; + end if; + end if; + end if; + end if; + end process; + +dcache_regs: + process(clk) + begin + if rising_edge(clk) then + if cpu_dmem_en = '1' and dcache_busy1 = '0' and dcache_busy2 = '0' then + dmem_dout <= cpu_dmem_dout; + dmem_addr <= cpu_dmem_addr; + dmem_re <= cpu_dmem_re; + dmem_we <= cpu_dmem_we; + end if; + end if; + end process; + +dcache_data: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + dmem_din <= (others => '0'); + elsif dmem_valid = '1' then + dmem_din <= mem_din; + end if; + end if; + end process; + +bus_state_next: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + s <= init; + elsif ce = '1' then + s <= sn; + end if; + end if; + end process; + +bus_state: + process(s, icache_mem_en, icache_mem_req, dcache_mem_req, dcache_mem_en, dcache_req, dmem_re, mem_rdy, mem_valid) + begin + + imem_mem_out_en <= '0'; + dmem_mem_out_en <= '0'; + icache_mem_gnt <= '0'; + dcache_mem_gnt <= '0'; + imem_valid <= '0'; + dmem_valid <= '0'; + dmem_ack <= '0'; + bus_bsy <= '1'; + + sn <= s; + case s is + when init => + if mem_rdy = '1' then + sn <= ready; + end if; + when ready => + bus_bsy <= not mem_rdy; + if dcache_req = '1' then + if dcache_busy1 = '1' then + if mem_rdy = '1' then + dmem_mem_out_en <= '1'; + if dmem_re = '0' then + dmem_ack <= '1'; + else + sn <= d_bus_access; + end if; + end if; + end if; + elsif icache_mem_req = '1' then + sn <= i_cache_bus_access; + elsif dcache_mem_req = '1' then + sn <= d_cache_bus_access; + end if; + when i_cache_bus_access => + icache_mem_gnt <= '1'; + if icache_mem_en = '1' then + imem_mem_out_en <= '1'; + elsif icache_mem_req = '0' then + sn <= ready; + end if; + imem_valid <= mem_valid; + when d_cache_bus_access => + dcache_mem_gnt <= '1'; + if dcache_mem_en = '1' then + dmem_mem_out_en <= '1'; + elsif dcache_mem_req = '0' then + sn <= ready; + end if; + dmem_valid <= mem_valid; + when d_bus_access => + if mem_valid = '1' then + dmem_ack <= '1'; + dmem_valid <= '1'; + sn <= ready; + end if; + when d_bus_finish => + if mem_rdy = '1' then + sn <= ready; + end if; + when others => + sn <= ready; + end case; + + end process; + +bus_request: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + bus_req <= '0'; + elsif dmem_mem_out_en = '1' or imem_mem_out_en = '1' then + bus_req <= '1'; + elsif mem_rdy = '1' then + bus_req <= '0'; + end if; + end if; + end process; + +bus_out: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + mem_dout <= (others => '0'); + mem_addr <= (others => '0'); + mem_re <= '0'; + mem_we <= (others => '0'); + elsif dmem_mem_out_en = '1' then + if dcache_mem_gnt = '1' then + mem_addr <= dcache_mem_addr; + mem_re <= '1'; + mem_we <= (others => '0'); + else + mem_dout <= dmem_dout; + mem_addr <= dmem_addr; + mem_re <= dmem_re; + mem_we <= dmem_we; + end if; + elsif imem_mem_out_en = '1' then + mem_addr <= icache_mem_addr; + mem_re <= '1'; + mem_we <= (others => '0'); + end if; + end if; + end process; + +------------------------------------------------------------------- + +end behavior; diff --git a/lib/CPUs/MIPS/src/core/mips_cop.vhd b/lib/CPUs/MIPS/src/core/mips_cop.vhd new file mode 100644 index 0000000..d37de20 --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_cop.vhd @@ -0,0 +1,415 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The arithmetic logic unit +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.mips_types.all; +use work.mips_instr.all; + +entity cop is + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + sdu : in sdu_t; + IR_valid : in STD_LOGIC; + IR : in word_t; + events : in event_t; + ctrl_in : in cop_ctrl_in_t; + ctrl_out : out cop_ctrl_out_t; + din : in word_t; + dout : out word_t + ); +end cop; + +architecture Behavioral of cop is + + signal epc : word_t; + signal cause : word_t; + signal status : word_t; + signal BadVAddr : word_t; + signal exc_code : unsigned(4 downto 0); + signal test_reg : word_t; + signal test_reg_we : STD_LOGIC; + signal stat_reg_we : STD_LOGIC; + signal eflags_reg_we : STD_LOGIC; + signal epc_reg_we : STD_LOGIC; + signal code_reg_we : STD_LOGIC; + signal ip_reg_we : STD_LOGIC; + signal bd : STD_LOGIC; + signal ip : unsigned(7 downto 0); + signal im : unsigned(7 downto 0); + signal status_save : STD_LOGIC; + signal status_rest : STD_LOGIC; + signal exception : STD_LOGIC; + signal exception_end : STD_LOGIC; + signal eflags : exc_flags_t; + signal exc_enable : STD_LOGIC; + signal cop_EX_en : STD_LOGIC; + + type cop_pipe_t is record + din : word_t; + rs : reg_ptr_t; + rd : reg_ptr_t; + func : func_t; + we : std_logic; + re : std_logic; + cs : std_logic; + end record; + + signal cop_pipe_ID : cop_pipe_t; + signal cop_pipe_EX : cop_pipe_t; + + function eval_int(ip, im : unsigned) return STD_LOGIC is + variable result : STD_LOGIC; + begin + result := '0'; + for i in ip'range loop + result := result or (ip(i) and im(i)); + end loop; + + return result; + end eval_int; + + type exc_state_t is (exc_init, exc_idle, exc_commit_ID, exc_commit_EX, exc_commit_MEM); + signal exc_state, exc_staten : exc_state_t; + +-------------------------------------------------------------------------- +begin + + cop_pipe_ID.din <= din; + cop_pipe_ID.cs <= IR_valid; + cop_pipe_ID.rs <= extract_rs(IR); + cop_pipe_ID.rd <= extract_rd(IR); + cop_pipe_ID.func <= extract_func(IR); + cop_pipe_ID.re <= cop_pipe_ID.cs when cop_pipe_ID.rs = "00000" else '0'; + cop_pipe_ID.we <= cop_pipe_ID.cs when cop_pipe_ID.rs = "00100" else '0'; + cop_EX_en <= exc_enable and not status_save; + + ctrl_out.ee <= exc_enable; + ctrl_out.ec <= status_save; + ctrl_out.RE <= status(25); + ctrl_out.user_mode <= status(1); + ctrl_out.int <= eflags.Int; + + ctrl_out.cop_read <= cop_pipe_EX.cs and cop_pipe_EX.re after 1 ns; + ctrl_out.reg_write <= cop_pipe_ID.re after 1 ns; + + im <= status(15 downto 8); + cause <= bd & (30 downto 16 => '0') & ip & '0' & exc_code & "00"; + + eflags.Ov <= events.alu_ovf or events.alu_uvf; + eflags.DAdEL <= events.data_load_err; + eflags.DAdES <= events.data_store_err; + eflags.IAdEL <= events.inst_load_err; + eflags.IAdEK <= events.inst_priv_addr and status(1); + eflags.Sys <= events.syscall; + eflags.Bp <= events.break; + eflags.RI <= events.illegal; + eflags.Int <= eval_int(ip, im) and status(0); + + exception <= eflags.Ov or eflags.Sys or eflags.Bp or eflags.RI or eflags.IAdEL or eflags.IAdEK or eflags.DAdEL or eflags.DAdES or eflags.Int after 1 ns; + +exception_state: + process(exc_state, ctrl_in, exception, sdu) + begin + + exc_enable <= '0'; + ctrl_out.exc_commit <= '0'; + ctrl_out.exc_pending <= '0'; + epc_reg_we <= '0'; + code_reg_we <= '0'; + status_save <= '0'; + eflags_reg_we <= '0'; + + exc_staten <= exc_state; + + case exc_state is + + when exc_init => + exc_staten <= exc_idle; + + when exc_idle => + exc_enable <= '1'; + if exception = '1' then + status_save <= '1'; + eflags_reg_we <= '1'; + code_reg_we <= '1'; + exc_staten <= exc_commit_ID; + end if; + + when exc_commit_ID => + ctrl_out.exc_pending <= '1'; + ctrl_out.exc_commit <= '1'; + if sdu.ID_stall = '0' then + exc_staten <= exc_commit_EX; + end if; + + when exc_commit_EX => + ctrl_out.exc_pending <= '1'; + ctrl_out.exc_commit <= '1'; + if sdu.EX_stall = '0' then + exc_staten <= exc_commit_MEM; + end if; + + when exc_commit_MEM => + ctrl_out.exc_pending <= '1'; + if sdu.MEM_stall = '0' then + epc_reg_we <= '1'; + exc_staten <= exc_idle; + end if; + + when others => + exc_staten <= exc_idle; + + end case; + end process; + +exception_state_next: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + exc_state <= exc_init; + else + exc_state <= exc_staten; + end if; + end if; + end process; + +cop_exception_epc_write: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + bd <= '0'; + epc <= (others => '0'); + elsif epc_reg_we = '1' then + bd <= '0'; + epc <= ctrl_in.epc_mem; + if ctrl_in.bd_wb = '1' then + bd <= '1'; + epc <= ctrl_in.epc_wb; + end if; + end if; + end if; + end process; + +cop_exception_map: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + exc_code <= (others => '0'); + BadVAddr <= (others => '0'); + elsif code_reg_we = '1' then + if eflags.Ov = '1' then + exc_code <= "01100"; + elsif eflags.Sys = '1' then + exc_code <= "01000"; + elsif eflags.Bp = '1' then + exc_code <= "01001"; + elsif eflags.RI = '1' then + exc_code <= "01010"; + elsif eflags.IAdEL = '1' then + exc_code <= "00100"; + BadVAddr <= ctrl_in.imem_addr; + elsif eflags.IAdEK = '1' then + exc_code <= "00100"; + BadVAddr <= ctrl_in.imem_addr; + elsif eflags.DAdEL = '1' then + exc_code <= "00100"; + BadVAddr <= ctrl_in.dmem_addr; + elsif eflags.DAdES = '1' then + exc_code <= "00101"; + BadVAddr <= ctrl_in.dmem_addr; + elsif eflags.Int = '1' then + exc_code <= "00000"; + end if; + end if; + end if; + end process; + + status_rest <= exception_end and ctrl_in.exc_left; + +cop_status_restore: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + exception_end <= '0'; + ctrl_out.exc_exit <= '0'; + else + if cop_pipe_ID.func = "10000" and exception_end = '0' then -- RFE + exception_end <= cop_pipe_ID.cs; + ctrl_out.exc_exit <= cop_pipe_ID.cs; + elsif exception_end = '1' and ctrl_in.exc_left = '1' then + exception_end <= '0'; + ctrl_out.exc_exit <= '0'; + end if; + end if; + end if; + end process; + +cop_ip_reg_write: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + ip(1 downto 0) <= (others => '0'); + elsif ip_reg_we = '1' then + ip(1 downto 0) <= cop_pipe_EX.din(9 downto 8); + end if; + ip(7 downto 2) <= events.Int; + end if; + end process; + +cop_exc_vector: + process(clk) + begin + if rising_edge(clk) then + ctrl_out.exc_vec <= X"80000180"; + if status(22) = '1' then + ctrl_out.exc_vec <= X"BFC00180"; + end if; + end if; + end process; + +cop_pipe: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + cop_pipe_EX.cs <= '0'; + cop_pipe_EX.we <= '0'; + cop_pipe_EX.re <= '0'; + else + if sdu.EX_stall = '0' then + cop_pipe_EX <= cop_pipe_ID; + end if; + end if; + end if; + end process; + +cop_register_read: + process(clk) + variable reg : word_t; + begin + if rising_edge(clk) and cop_pipe_ID.re = '1' and sdu.ID_stall = '0' then + case cop_pipe_ID.rd is + when "01000" => -- BadVAddr + reg := BadVAddr; + + when "01100" => -- Status + reg := status; + + when "01101" => -- Cause + reg := cause; + + when "01110" => -- EPC (Exception Program Counter) + reg := epc; + + when "01111" => -- PRId (Processor Revision Register) + reg := X"000002" & to_unsigned(REVISION ,8); + + when "11111" => -- test_reg + reg := test_reg; + + when others => + reg := X"DEADBEEF"; + + end case; + dout <= reg; + end if; + end process; + +cop_we_gen: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + test_reg_we <= '0'; + stat_reg_we <= '0'; + ip_reg_we <= '0'; + else + test_reg_we <= '0'; + stat_reg_we <= '0'; + ip_reg_we <= '0'; + if (cop_EX_en and cop_pipe_EX.we) = '1' then + + case cop_pipe_EX.rd is + + when "01100" => + stat_reg_we <= not status(1) or status(28); + when "01101" => + ip_reg_we <= not status(1) or status(28); + when "11111" => + test_reg_we <= not status(1) or status(28); + when others => null; + + end case; + + end if; + end if; + end if; + end process; + +cop_test_reg_write: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + test_reg <= (others => '0'); + else --if ce = '1' then + if test_reg_we = '1' then + test_reg <= cop_pipe_EX.din; + end if; + end if; + end if; + end process; + +cop_status_reg_write: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + status <= X"00400000"; + else + if status_save = '1' then + status(5 downto 4) <= status(3 downto 2); + status(3 downto 2) <= status(1 downto 0); + status(1 downto 0) <= "00"; + elsif status_rest = '1' then + status(1 downto 0) <= status(3 downto 2); + status(3 downto 2) <= status(5 downto 4); + elsif stat_reg_we = '1' then + status <= cop_pipe_EX.din; + end if; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end Behavioral; diff --git a/lib/CPUs/MIPS/src/core/mips_idecode_rom.vhd b/lib/CPUs/MIPS/src/core/mips_idecode_rom.vhd new file mode 100644 index 0000000..720e65c --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_idecode_rom.vhd @@ -0,0 +1,101 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The datapath controller +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +library work; +use work.mips_types.all; +use work.mips_instr.all; + +entity idecode_rom is + Port + ( + nop : in std_logic; + inst_in : in word_t; + ctrl_out : out ctrl_lines_t + ); +end idecode_rom; + +architecture Behavioral of idecode_rom is + + signal ctrl_special : ctrl_lines_t; + signal ctrl_regimm : ctrl_lines_t; + signal ctrl_opcode : ctrl_lines_t; + + signal rom_special : rom_special_t := gen_rom_special; + signal rom_regimm : rom_regimm_t := gen_rom_regimm; + signal rom_opcode : rom_opcode_t := gen_rom_opcode; + + attribute rom_style : string; + + attribute rom_style of rom_special: signal is "distributed"; + attribute rom_style of rom_regimm: signal is "distributed"; + attribute rom_style of rom_opcode: signal is "distributed"; + +begin + +i_dec_special: + process(inst_in, rom_special) + variable func : func_t; + begin + func := extract_func(inst_in); + ctrl_special <= rom_special(to_integer(func)); + end process; + +i_dec_regimm: + process(inst_in, rom_regimm) + variable rt : reg_ptr_t; + begin + rt := extract_rt(inst_in); + ctrl_regimm <= rom_regimm(to_integer(rt)); + end process; + +i_dec_opcode: + process(inst_in, rom_opcode) + variable opc : opcode_t; + begin + opc := extract_opc(inst_in); + ctrl_opcode <= rom_opcode(to_integer(opc)); + end process; + +proc_decode: + process(inst_in, ctrl_special, ctrl_regimm, ctrl_opcode, nop) + variable opclass : opcode_t; + begin + opclass := extract_opc(inst_in); + ctrl_out <= ctrl_lines_default after 2 ns; + if nop = '0' then + case opclass is + when "000000" => + ctrl_out <= ctrl_special after 2 ns; + when "000001" => + ctrl_out <= ctrl_regimm after 2 ns; + when others => + ctrl_out <= ctrl_opcode after 2 ns; + end case; + end if; + end process; + +end Behavioral; diff --git a/lib/CPUs/MIPS/src/core/mips_instr.vhd b/lib/CPUs/MIPS/src/core/mips_instr.vhd new file mode 100644 index 0000000..97a0c0b --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_instr.vhd @@ -0,0 +1,997 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: Types, constants and functions for JCPU +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +library work; +use work.mips_types.all; + +-------------------------------------------------------------------------- +package mips_instr is + + function extract_opc(instr : word_t) return opcode_t; + function extract_rs(instr : word_t) return reg_ptr_t; + function extract_rt(instr : word_t) return reg_ptr_t; + function extract_rd(instr : word_t) return reg_ptr_t; + function extract_shamt(instr : word_t) return shamt_t; + function extract_func(instr : word_t) return func_t; + function extract_simm32(instr : word_t) return word_t; + function extract_uimm16(instr : word_t) return word_t; + function extract_jimm32(instr, pc : word_t) return word_t; + function extract_bimm18(instr, pc : word_t) return word_t; + function decode_op(instr : word_t) return op_t; + function ctrl_lines_default return ctrl_lines_t; + function special_ctrl_lines(func : func_t) return ctrl_lines_t; + function regimm_ctrl_lines(rt : reg_ptr_t) return ctrl_lines_t; + function opcode_ctrl_lines(opc : opcode_t) return ctrl_lines_t; + function gen_rom_opcode return rom_opcode_t; + function gen_rom_regimm return rom_regimm_t; + function gen_rom_special return rom_special_t; + +end mips_instr; + +-------------------------------------------------------------------------- +library work; +use work.mips_types.all; + +package body mips_instr is + + function extract_opc(instr : word_t) return opcode_t is + variable result : opcode_t; + begin + result := instr(31 downto 26); + + return result; + + end extract_opc; + + function extract_rs(instr : word_t) return reg_ptr_t is + variable result : reg_ptr_t; + begin + result := instr(25 downto 21); + + return result; + + end extract_rs; + + function extract_rt(instr : word_t) return reg_ptr_t is + variable result : reg_ptr_t; + begin + result := instr(20 downto 16); + + return result; + + end extract_rt; + + function extract_rd(instr : word_t) return reg_ptr_t is + variable result : reg_ptr_t; + begin + result := instr(15 downto 11); + + return result; + + end extract_rd; + + function extract_shamt(instr : word_t) return shamt_t is + variable result : shamt_t; + begin + result := instr(10 downto 6); + + return result; + + end extract_shamt; + + function extract_func(instr : word_t) return func_t is + variable result : func_t; + begin + result := instr(5 downto 0); + + return result; + + end extract_func; + + function extract_simm32(instr : word_t) return word_t is + variable result : word_t; + begin + result := (31 downto 16 => instr(15)) & instr(15 downto 0); + + return result; + + end extract_simm32; + + function extract_uimm16(instr : word_t) return word_t is + variable result : word_t; + begin + result := (31 downto 16 => '0') & instr(15 downto 0); + + return result; + + end extract_uimm16; + + function extract_jimm32(instr, pc : word_t) return word_t is + variable result : word_t; + begin + result := pc(31 downto 28) & instr(25 downto 0) & "00"; + + return result; + + end extract_jimm32; + + function extract_bimm18(instr, pc : word_t) return word_t is + variable result : word_t; + begin + result := (31 downto 18 => instr(15)) & instr(15 downto 0) & "00"; + + return result; + + end extract_bimm18; + + function decode_op(instr : word_t) return op_t is + variable result : op_t; + variable opc : natural range 0 to 63; + variable func : natural range 0 to 63; + variable rt : natural range 0 to 31; + + begin + + opc := to_integer(extract_opc(instr)); + func := to_integer(extract_func(instr)); + rt := to_integer(extract_rt(instr)); + + result := op_sll; + + case opc is + + when 0 => + case func is + + when 0 => + result := op_sll; + + when 2 => + result := op_srl; + + when 3 => + result := op_sra; + + when 4 => + result := op_sllv; + + when 6 => + result := op_srlv; + + when 7 => + result := op_srav; + + when 8 => + result := op_jr; + + when 9 => + result := op_jalr; + + when 12 => + result := op_syscall; + + when 13 => + result := op_break; + + when 16 => + result := op_mfhi; + + when 17 => + result := op_mthi; + + when 18 => + result := op_mflo; + + when 19 => + result := op_mtlo; + + when 24 => + result := op_mult; + + when 25 => + result := op_multu; + + when 26 => + result := op_div; + + when 27 => + result := op_divu; + + when 32 => + result := op_add; + + when 33 => + result := op_addu; + + when 34 => + result := op_sub; + + when 35 => + result := op_subu; + + when 36 => + result := op_and; + + when 37 => + result := op_or; + + when 38 => + result := op_xor; + + when 39 => + result := op_nor; + + when 42 => + result := op_slt; + + when 43 => + result := op_sltu; + + when others => null; -- undef + + end case; + + when 1 => + case rt is + + when 0 => + result := op_bltz; + + when 1 => + result := op_bgez; + + when 16 => + result := op_bltzal; + + when 17 => + result := op_bgezal; + + when others => null; -- undef + + end case; + + when 2 => + result := op_j; + + when 3 => + result := op_jal; + + when 4 => + result := op_beq; + + when 5 => + result := op_bne; + + when 6 => + result := op_blez; + + when 7 => + result := op_bgtz; + + when 8 => + result := op_addi; + + when 9 => + result := op_addiu; + + when 10 => + result := op_slti; + + when 11 => + result := op_sltiu; + + when 12 => + result := op_andi; + + when 13 => + result := op_ori; + + when 14 => + result := op_xori; + + when 15 => + result := op_lui; + + when 16 => + result := op_cop0; + + when 17 => + result := op_cop1; + + when 18 => + result := op_cop2; + + when 19 => + result := op_cop3; + + when 32 => + result := op_lb; + + when 33 => + result := op_lh; + + when 34 => + result := op_lwl; + + when 35 => + result := op_lw; + + when 36 => + result := op_lbu; + + when 37 => + result := op_lhu; + + when 38 => + result := op_lwr; + + when 40 => + result := op_sb; + + when 41 => + result := op_sh; + + when 42 => + result := op_swl; + + when 43 => + result := op_sw; + + when 46 => + result := op_swr; + + when 49 => + result := op_lwc1; + + when 50 => + result := op_lwc2; + + when 51 => + result := op_lwc3; + + when 57 => + result := op_swc1; + + when 58 => + result := op_swc2; + + when 59 => + result := op_swc3; + + when others => null; -- undef + + end case; + + return result; + + end decode_op; + + function ctrl_lines_default return ctrl_lines_t is + variable result : ctrl_lines_t; + begin + result.cop_instr_en := '0'; + result.jump := '0'; + result.jump_long := '0'; + result.branch := '0'; + result.bc_src := bc_eq_ne; + result.bc_not := '0'; + result.alu.outsel := alu_adder; + result.alu.add := '1'; + result.alu.shift_right := '0'; + result.alu.shift_arith := '0'; + result.shamt2_srcsel := sa_src_imm; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.imm_src := src_imm16; + result.reg_write := '0'; + result.dmem_we := '0'; + result.dmem_en := '0'; + result.wptr_srcsel := wptr_src_imm; + result.reg_link := '0'; + result.shift_offset := "00"; + result.shift_byp := '1'; + result.byte_en_byp := '1'; + result.sign_ext_byp := '1'; + result.word4_en := '0'; + result.word2_en := '0'; + result.align_left := '0'; + result.load_signed := '0'; + result.mul_access := '0'; + result.mul_hilo_we := '0'; + result.mul_start := '0'; + result.mul_s_un := '0'; + result.mul_mul_divn := '0'; + result.mul_hilo_sel := '1'; + result.exc_break := '0'; + result.exc_syscall := '0'; + result.exc_illegal := '0'; + result.except_en := '0'; + result.alu_exc_en := '0'; + + return result; + + end ctrl_lines_default; + + + function special_ctrl_lines(func : func_t) return ctrl_lines_t is + variable result : ctrl_lines_t; + variable op : integer range 0 to 2**func_t'length-1; + begin + + result := ctrl_lines_default; + + op := to_integer(func); + case op is + +-- when op_add => + when 32 => + result.alu.outsel := alu_adder; + result.alu.add := '1'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + result.alu_exc_en := '1'; + +-- when op_addu => + when 33 => + result.alu.outsel := alu_adder; + result.alu.add := '1'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + +-- when op_and => + when 36 => + result.alu.outsel := alu_and; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + +-- when op_break => + when 13 => + result.exc_break := '1'; + result.except_en := '1'; + +-- when op_div => + when 26 => + result.mul_access := '1'; + result.mul_start := '1'; + result.mul_s_un := '1'; + result.mul_mul_divn := '0'; + +-- when op_divu => + when 27 => + result.mul_access := '1'; + result.mul_start := '1'; + result.mul_s_un := '0'; + result.mul_mul_divn := '0'; + +-- when op_jalr => + when 9 => + result.jump_long := '1'; + result.wptr_srcsel := wptr_src_imm; + result.reg_write := '1'; + result.reg_link := '1'; + +-- when op_jr => + when 8 => + result.jump_long := '1'; + +-- when op_mfhi => + when 16 => + result.reg_write := '1'; + result.mul_access := '1'; + result.mul_hilo_sel := '1'; + +-- when op_mflo => + when 18 => + result.reg_write := '1'; + result.mul_access := '1'; + result.mul_hilo_sel := '0'; + +-- when op_mthi => + when 17 => + result.mul_hilo_we := '1'; + result.mul_hilo_sel := '1'; + +-- when op_mtlo => + when 19 => + result.mul_hilo_we := '1'; + result.mul_hilo_sel := '0'; + +-- when op_mult => + when 24 => + result.mul_access := '1'; + result.mul_start := '1'; + result.mul_s_un := '1'; + result.mul_mul_divn := '1'; + +-- when op_multu => + when 25 => + result.mul_access := '1'; + result.mul_start := '1'; + result.mul_s_un := '0'; + result.mul_mul_divn := '1'; + +-- when op_or => + when 37 => + result.alu.outsel := alu_or; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + +-- when op_nor => + when 39 => + result.alu.outsel := alu_nor; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + +-- when op_sll => + when 0 => + result.alu.op2_src := alu_src_reg; + result.alu.outsel := alu_shift2; + result.alu.shift_right := '0'; + result.shamt2_srcsel := sa_src_imm; + result.reg_write := '1'; + +-- when op_sllv => + when 4 => + result.alu.op2_src := alu_src_reg; + result.alu.outsel := alu_shift2; + result.alu.shift_right := '0'; + result.shamt2_srcsel := sa_src_reg; + result.reg_write := '1'; + +-- when op_slt => + when 42 => + result.alu.outsel := alu_lts; + result.alu.add := '0'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + +-- when op_sltu => + when 43 => + result.alu.outsel := alu_ltu; + result.alu.add := '0'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + +-- when op_sra => + when 3 => + result.alu.op2_src := alu_src_reg; + result.alu.outsel := alu_shift2; + result.alu.shift_right := '1'; + result.alu.shift_arith := '1'; + result.shamt2_srcsel := sa_src_imm; + result.reg_write := '1'; + +-- when op_srav => + when 7 => + result.alu.op2_src := alu_src_reg; + result.alu.outsel := alu_shift2; + result.alu.shift_right := '1'; + result.alu.shift_arith := '1'; + result.shamt2_srcsel := sa_src_reg; + result.reg_write := '1'; + +-- when op_srl => + when 2 => + result.alu.op2_src := alu_src_reg; + result.alu.outsel := alu_shift2; + result.alu.shift_right := '1'; + result.alu.shift_arith := '0'; + result.shamt2_srcsel := sa_src_imm; + result.reg_write := '1'; + +-- when op_srlv => + when 6 => + result.alu.op2_src := alu_src_reg; + result.alu.outsel := alu_shift2; + result.alu.shift_right := '1'; + result.alu.shift_arith := '0'; + result.shamt2_srcsel := sa_src_reg; + result.reg_write := '1'; + +-- when op_sub => + when 34 => + result.alu.outsel := alu_adder; + result.alu.add := '0'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + result.alu_exc_en := '1'; + +-- when op_subu => + when 35 => + result.alu.outsel := alu_adder; + result.alu.add := '0'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + +-- when op_syscall => + when 12 => + result.exc_syscall := '1'; + result.except_en := '1'; + +-- when op_xor => + when 38 => + result.alu.outsel := alu_xor; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_reg; + result.reg_write := '1'; + + when others => + result.exc_illegal := '1'; + + end case; + + return result; + + end special_ctrl_lines; + + function gen_rom_special return rom_special_t is + variable result : rom_special_t; + variable func : func_t; + begin + + for i in 0 to 2**func_t'length-1 loop + func := to_unsigned(i, func_t'length); + result(i) := special_ctrl_lines(func); + end loop; + + return result; + end gen_rom_special; + + function regimm_ctrl_lines(rt : reg_ptr_t) return ctrl_lines_t is + variable result : ctrl_lines_t; + variable op : integer range 0 to 2**reg_ptr_t'length-1; + begin + + result := ctrl_lines_default; + + op := to_integer(rt); + case op is + +-- when op_bgez => + when 1 => + result.branch := '1'; + result.bc_src := bc_ltz_gez; + result.bc_not := '1'; + +-- when op_bgezal => + when 17 => + result.branch := '1'; + result.bc_src := bc_ltz_gez; + result.bc_not := '1'; + result.wptr_srcsel := wptr_src_const; + result.reg_write := '1'; + result.reg_link := '1'; + +-- when op_bltz => + when 0 => + result.branch := '1'; + result.bc_src := bc_ltz_gez; + result.bc_not := '0'; + +-- when op_bltzal => + when 16 => + result.branch := '1'; + result.bc_src := bc_ltz_gez; + result.bc_not := '0'; + result.wptr_srcsel := wptr_src_const; + result.reg_write := '1'; + result.reg_link := '1'; + + when others => + result.exc_illegal := '1'; + + end case; + + return result; + + end regimm_ctrl_lines; + + function gen_rom_regimm return rom_regimm_t is + variable result : rom_regimm_t; + variable rt : reg_ptr_t; + begin + + for i in 0 to 2**reg_ptr_t'length-1 loop + rt := to_unsigned(i, reg_ptr_t'length); + result(i) := regimm_ctrl_lines(rt); + end loop; + + return result; + end gen_rom_regimm; + + function opcode_ctrl_lines(opc : opcode_t) return ctrl_lines_t is + variable result : ctrl_lines_t; + variable op : integer range 0 to 2**opcode_t'length-1; + begin + + result := ctrl_lines_default; + + op := to_integer(opc); + case op is + +-- when op_addi => + when 8 => + result.imm_src := src_imm32; + result.alu.outsel := alu_adder; + result.alu.add := '1'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_imm; + result.reg_write := '1'; + result.alu_exc_en := '1'; + +-- when op_addiu => + when 9 => + result.imm_src := src_imm32; + result.alu.outsel := alu_adder; + result.alu.add := '1'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_imm; + result.reg_write := '1'; + +-- when op_andi => + when 12 => + result.imm_src := src_imm16; + result.alu.outsel := alu_and; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_imm; + result.reg_write := '1'; + +-- when op_beq => + when 4 => + result.branch := '1'; + result.bc_src := bc_eq_ne; + result.bc_not := '0'; + +-- when op_bgtz => + when 7 => + result.branch := '1'; + result.bc_src := bc_lez_gtz; + result.bc_not := '1'; + +-- when op_blez => + when 6 => + result.branch := '1'; + result.bc_src := bc_lez_gtz; + result.bc_not := '0'; + +-- when op_bne => + when 5 => + result.branch := '1'; + result.bc_src := bc_eq_ne; + result.bc_not := '1'; + +-- when op_cop => + when 16 | 17 | 18 | 19 => + result.cop_instr_en := '1'; + +-- when op_j => + when 2 => + result.jump := '1'; + +-- when op_jal => + when 3 => + result.jump := '1'; + result.wptr_srcsel := wptr_src_const; + result.reg_write := '1'; + result.reg_link := '1'; + +-- when op_lb => + when 32 => + result.imm_src := src_imm32; + result.dmem_en := '1'; + result.reg_write := '1'; + result.shift_byp := '0'; + result.byte_en_byp := '1'; + result.sign_ext_byp := '0'; + result.load_signed := '1'; + result.word4_en := '1'; + +-- when op_lbu => + when 36 => + result.imm_src := src_imm32; + result.dmem_en := '1'; + result.reg_write := '1'; + result.shift_byp := '0'; + result.byte_en_byp := '1'; + result.sign_ext_byp := '0'; + result.load_signed := '0'; + result.word4_en := '1'; + +-- when op_lh => + when 33 => + result.imm_src := src_imm32; + result.dmem_en := '1'; + result.reg_write := '1'; + result.shift_byp := '0'; + result.sign_ext_byp := '0'; + result.byte_en_byp := '1'; + result.load_signed := '1'; + result.word2_en := '1'; + result.except_en := '1'; + +-- when op_lhu => + when 37 => + result.imm_src := src_imm32; + result.dmem_en := '1'; + result.reg_write := '1'; + result.shift_byp := '0'; + result.sign_ext_byp := '0'; + result.byte_en_byp := '1'; + result.load_signed := '0'; + result.word2_en := '1'; + result.except_en := '1'; + +-- when op_lui => + when 15 => + result.imm_src := src_imm16_high; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_imm; + result.alu.outsel := alu_adder; + result.reg_write := '1'; + result.alu.add := '1'; + +-- when op_lw => + when 35 => +-- result.imm_src := src_imm32; + result.dmem_en := '1'; + result.reg_write := '1'; + result.except_en := '1'; + +-- when op_lwl => + when 34 => +-- result.imm_src := src_imm32; + result.dmem_en := '1'; + result.reg_write := '1'; + result.shift_byp := '0'; + result.byte_en_byp := '0'; + result.shift_offset := "01"; + result.align_left := '1'; + +-- when op_lwr => + when 38 => +-- result.imm_src := src_imm32; + result.dmem_en := '1'; + result.reg_write := '1'; + result.shift_byp := '0'; + result.byte_en_byp := '0'; + result.shift_offset := "00"; + result.align_left := '0'; + +-- when op_ori => + when 13 => + result.imm_src := src_imm16; + result.alu.outsel := alu_or; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_imm; + result.reg_write := '1'; + +-- when op_sb => + when 40 => + result.dmem_en := '1'; + result.dmem_we := '1'; +-- result.imm_src := src_imm32; + result.shift_byp := '0'; + result.byte_en_byp := '0'; + result.word4_en := '1'; + +-- when op_sh => + when 41 => + result.dmem_en := '1'; + result.dmem_we := '1'; +-- result.imm_src := src_imm32; + result.shift_byp := '0'; + result.byte_en_byp := '0'; + result.word2_en := '1'; + result.except_en := '1'; + +-- when op_slti => + when 10 => + result.alu.outsel := alu_lts; + result.alu.add := '0'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_imm; + result.imm_src := src_imm32; + result.reg_write := '1'; + +-- when op_sltiu => + when 11 => + result.alu.outsel := alu_ltu; + result.alu.add := '0'; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_imm; + result.imm_src := src_imm32; + result.reg_write := '1'; + +-- when op_sw => + when 43 => + result.dmem_en := '1'; + result.dmem_we := '1'; +-- result.imm_src := src_imm32; + result.except_en := '1'; + +-- when op_swl => + when 42 => + result.dmem_en := '1'; + result.dmem_we := '1'; +-- result.imm_src := src_imm32; + result.shift_byp := '0'; + result.byte_en_byp := '0'; + result.shift_offset := "01"; + +-- when op_swr => + when 46 => + result.dmem_en := '1'; + result.dmem_we := '1'; +-- result.imm_src := src_imm32; + result.shift_byp := '0'; + result.byte_en_byp := '0'; + result.align_left := '1'; + +-- when op_xori => + when 14 => + result.imm_src := src_imm16; + result.alu.outsel := alu_xor; + result.alu.op1_src := alu_src_reg; + result.alu.op2_src := alu_src_imm; + result.reg_write := '1'; + + when others => + result.exc_illegal := '1'; + + end case; + + return result; + + end opcode_ctrl_lines; + + function gen_rom_opcode return rom_opcode_t is + variable result : rom_opcode_t; + variable opc : opcode_t; + begin + + for i in 0 to 2**opcode_t'length-1 loop + opc := to_unsigned(i, opcode_t'length); + result(i) := opcode_ctrl_lines(opc); + end loop; + + return result; + end gen_rom_opcode; + +end mips_instr; + +-------------------------------------------------------------------------- +-------------------------------------------------------------------------- + diff --git a/lib/CPUs/MIPS/src/core/mips_muldiv.vhd b/lib/CPUs/MIPS/src/core/mips_muldiv.vhd new file mode 100644 index 0000000..efce36b --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_muldiv.vhd @@ -0,0 +1,454 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The arithmetic logic unit +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.mips_types.all; + +entity muldiv is + Port + ( + rst : in std_logic; + clk : in std_logic; + hilo_we : in std_logic; + din_hi : in word_t; + din_lo : in word_t; + mul_divn : in std_logic; + start : in std_logic; + s_un : in std_logic; + hilo_sel : in std_logic; + busy : out std_logic; + dout : out word_t + ); +end muldiv; + +architecture Behavioral of muldiv is + + subtype pprod_t is unsigned (39 downto 0); + subtype prod_t is unsigned (63 downto 0); + subtype byte_t is unsigned (7 downto 0); + + type pprod_array_t is array (natural range <>) of pprod_t; + type word_array_t is array (natural range <>) of word_t; + type byte_array_t is array (natural range <>) of byte_t; + + signal pprod : pprod_array_t(0 to 3); + signal sign1 : std_logic; + signal sign2 : std_logic; + signal s1_r : std_logic; + signal s2_r : std_logic; + signal sr_r : std_logic; + signal cy : unsigned (3 downto 0); + signal mul_start : std_logic; + signal mul_en : std_logic; + signal sum_en : std_logic; + signal pre_sum_vld : std_logic; + signal pp_reg : unsigned (63 downto 8); + signal pre_const : word_array_t(0 to 1); + signal result : prod_t; + signal add_op1 : unsigned (39 downto 0); + signal add_op2 : unsigned (39 downto 0); + signal add_res : unsigned (39 downto 0); + signal ppadd_op1 : word_array_t(0 to 3); + signal ppadd_op2 : word_array_t(0 to 3); + signal ppadd_res : word_array_t(0 to 3); + signal ppadd_cyi : unsigned (3 downto 0); + signal ppadd_cyo : unsigned (3 downto 0); + + signal pp_op1_r : word_t; + signal pp_op1 : word_t; + signal pp_op2 : word_t; + signal pp_op2_r : byte_array_t(0 to 3); + signal bsy : std_logic; + + signal div_add_res : unsigned (32 downto 0); + signal div_add_op1 : unsigned (32 downto 0); + signal div_add_op2 : unsigned (32 downto 0); + signal div_add_cyi : std_logic; + signal div_qbit : std_logic; + signal div_start : std_logic; + signal div_en : std_logic; + + signal div_A : unsigned (32 downto 0); + signal div_M : unsigned (32 downto 0); + signal div_M_n : unsigned (32 downto 0); + signal div_Q : word_t; + + type md_state_t is (md_rdy, mul_pre1, mul_pre2, mul_pp, mul_sum, div_process, div_post1, div_post2, div_post3); + signal s, sn : md_state_t; + signal cycle_cnt : natural range 0 to 31; + signal cycle_cnt_preset : natural range 0 to 31; + signal cycle_cnt_load : std_logic; + signal div_fin_en : unsigned (2 downto 0); + +-------------------------------------------------------------------------- +begin +-- 9A0CD0570B88D78 + + busy <= bsy; + + sign1 <= din_hi(din_hi'left) and s_un; + sign2 <= din_lo(din_lo'left) and s_un; + pp_op1 <= not din_hi when sign1 = '1' else din_hi; + pp_op2 <= not din_lo when sign2 = '1' else din_lo; + +-------------------------------------------------------------------------- +md_state: + process(s, start, mul_divn, cycle_cnt) + begin + + bsy <= '1'; + cycle_cnt_load <= '0'; + cycle_cnt_preset <= 7; + + mul_en <= '0'; + div_en <= '0'; + sum_en <= '0'; + pre_sum_vld <= '0'; + mul_start <= '0'; + div_start <= '0'; + div_fin_en <= "000"; + sn <= s; + case s is + when md_rdy => + bsy <= '0'; + if start = '1' then + if mul_divn = '1' then + sn <= mul_pre1; + cycle_cnt_load <= '1'; + cycle_cnt_preset <= 7; + mul_start <= '1'; + else + sn <= div_process; + cycle_cnt_load <= '1'; + cycle_cnt_preset <= 31; + div_start <= '1'; + end if; + end if; + when mul_pre1 => + pre_sum_vld <= '1'; + mul_en <= '1'; + sn <= mul_pre2; + when mul_pre2 => + pre_sum_vld <= '1'; + mul_en <= '1'; + sn <= mul_pp; + when mul_pp => + mul_en <= '1'; + if cycle_cnt = 0 then + cycle_cnt_load <= '1'; + cycle_cnt_preset <= 3; + sn <= mul_sum; + end if; + when mul_sum => + sum_en <= '1'; + if cycle_cnt = 0 then + bsy <= '0'; + sn <= md_rdy; + end if; + when div_process => + div_en <= '1'; + if cycle_cnt = 0 then + sn <= div_post1; + end if; + when div_post1 => + div_fin_en <= "001"; + sn <= div_post2; + when div_post2 => + div_fin_en <= "010"; + sn <= div_post3; + when div_post3 => + div_fin_en <= "100"; + sn <= md_rdy; + bsy <= '0'; + when others => + sn <= md_rdy; + end case; + + end process; + +md_state_next: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + s <= md_rdy; + else + s <= sn; + end if; + end if; + end process; + +md_cycle_cnt: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + cycle_cnt <= 0; + elsif cycle_cnt_load = '1' then + cycle_cnt <= cycle_cnt_preset; + elsif cycle_cnt /= 0 then + cycle_cnt <= cycle_cnt - 1; + end if; + end if; + end process; + +proc_out_reg: + process(hilo_sel, result) + begin + if hilo_sel = '1' then + dout <= result(63 downto 32); + else + dout <= result(31 downto 0); + end if; + end process; + +proc_in_reg: + process(clk) + variable pre_cond : unsigned(1 downto 0); + begin + if rising_edge(clk) then + if mul_start = '1' or div_start = '1' then + pp_op1_r <= pp_op1; + pre_const(0) <= (others => '0'); + pre_const(1) <= (others => '0'); + pre_cond := (din_hi(din_hi'left) and s_un) & (din_lo(din_lo'left) and s_un); + s1_r <= pre_cond(1); + s2_r <= pre_cond(0); + sr_r <= pre_cond(0) xor pre_cond(1); + case pre_cond is + when "01" => + pre_const(0) <= din_hi; + pre_const(1) <= X"FFFF_FFFF"; + when "10" => + pre_const(0) <= X"0000_0000"; + pre_const(1) <= X"FFFF_FFFF"; + when "11" => + pre_const(0) <= not din_hi; + pre_const(1) <= X"0000_0001"; + when others => null; + end case; + elsif pre_sum_vld = '1' then + pre_const(0) <= pre_const(1); + end if; + end if; + end process; + +proc_mul_sr: + process(clk) + begin + if rising_edge(clk) then + if mul_start = '1' then + for i in 0 to 3 loop + cy(i) <= '0'; + pprod(i) <= ppadd_res(i) & X"00"; + end loop; + elsif mul_en = '1' then + for i in 0 to 3 loop + cy(i) <= ppadd_cyo(i); + pprod(i) <= ppadd_res(i) & pprod(i)(8 downto 1); + end loop; + elsif sum_en = '1' then + for i in 1 to 3 loop + pprod(i-1) <= pprod(i); + end loop; + end if; + end if; + end process; + +gen_mul32x8pp: + for i in 0 to 3 generate + begin + + pp_adder_mux: + process(mul_start, pp_op1, pp_op2, pp_op1_r, pp_op2_r(i), s1_r, sign1, pprod(i), cy(i)) + variable v2 : unsigned(7 downto 0); + begin + ppadd_cyi(i) <= '0'; + ppadd_op1(i) <= (others => '0'); + if mul_start = '1' then + ppadd_op2(i) <= (others => '0'); + v2 := pp_op2(8*(i+1)-1 downto 8*i); + if v2(0) = '1' then + ppadd_cyi(i) <= sign1; + ppadd_op1(i) <= pp_op1; + end if; + else + ppadd_op2(i) <= cy(i) & pprod(i)(39 downto 9); + v2 := pp_op2_r(i); + if v2(0) = '1' then + ppadd_cyi(i) <= s1_r; + ppadd_op1(i) <= pp_op1_r; + end if; + end if; + end process; + + pp_adder: + process(ppadd_op1(i), ppadd_op2(i), ppadd_cyi(i)) + variable sum_pp : unsigned(33 downto 0); + begin + sum_pp := ('0' & ppadd_op1(i) & ppadd_cyi(i)) + ('0' & ppadd_op2(i) & ppadd_cyi(i)); + ppadd_res(i) <= sum_pp(sum_pp'left-1 downto 1); + ppadd_cyo(i) <= sum_pp(sum_pp'left); + end process; + + proc_mul_ctrl: + process(clk) + begin + if rising_edge(clk) then + if mul_start = '1' then + pp_op2_r(i) <= '0' & pp_op2(8*(i+1)-1 downto 8*i+1); + elsif mul_en = '1' then + pp_op2_r(i) <= '0' & pp_op2_r(i)(7 downto 1); + end if; + end if; + end process; + + end generate; + +comb_mul_adder: + process(add_op1, add_op2) + variable sum_mul : unsigned(39 downto 0); + begin + sum_mul := (add_op1) + (add_op2); + add_res <= sum_mul(sum_mul'left downto 0); + end process; + +comb_mul_adder_mux: + process(pre_const, pre_sum_vld, pp_reg, pprod, sr_r) + variable s_ext : std_logic; + begin + if pre_sum_vld = '1' then + add_op1 <= pp_reg(63 downto 24); + add_op2 <= pre_const(0) & X"00"; + else + s_ext := pp_reg(63) and sr_r; + add_op1 <= (7 downto 0 => s_ext) & pp_reg(63 downto 32); + add_op2 <= pprod(0); + end if; + end process; + +comb_mul: + process(clk) + variable tmp : prod_t; + begin + if rising_edge(clk) then + if mul_start = '1' then + pp_reg <= (others => '0'); + elsif pre_sum_vld = '1' then + pp_reg <= add_res & X"0000"; + elsif sum_en = '1' then + tmp := add_res & pp_reg(31 downto 8); + pp_reg <= tmp(63 downto 8); + result <= tmp; + if sr_r = '1' then + result <= not tmp; + end if; + elsif div_fin_en(1) = '1' then + result(63 downto 32) <= div_A(31 downto 0); + if s1_r = '1' then + result(63 downto 32) <= div_add_res(31 downto 0); + end if; + elsif div_fin_en(2) = '1' then + result(31 downto 0) <= div_Q; + if sr_r = '1' then + result(31 downto 0) <= div_add_res(31 downto 0); + end if; + elsif hilo_we = '1' then + if hilo_sel = '1' then + result(63 downto 32) <= din_hi; + else + result(31 downto 0) <= din_hi; + end if; + end if; + end if; + end process; + +div_adder: + process(div_add_op1, div_add_op2, div_add_cyi) + variable sum_div : unsigned(33 downto 0); + begin + sum_div := (div_add_op1 & div_add_cyi) + (div_add_op2 & div_add_cyi); + div_add_res <= sum_div(sum_div'left downto 1); + end process; + +div_adder_mux: + process(div_start, div_en, div_fin_en, div_A, div_Q, pp_op1, sign1, s1_r, s2_r, sr_r, div_qbit, div_M, div_M_n) + begin + + div_add_cyi <= s2_r xor div_qbit; + div_add_op1 <= div_A(31 downto 0) & div_Q(31); + div_add_op2 <= (others => '0'); + if div_start = '1' then + div_add_op1 <= '0' & pp_op1; + div_add_cyi <= sign1; + elsif div_en = '1' then + div_add_op2 <= div_M; + if div_qbit = '1' then + div_add_op2 <= div_M_n; + end if; + elsif div_fin_en(0) = '1' then + div_add_op2 <= div_M; + div_add_cyi <= s2_r; + div_add_op1 <= '0' & div_A(31 downto 0); + elsif div_fin_en(1) = '1' then + div_add_cyi <= s1_r; + div_add_op1 <= '0' & not div_A(31 downto 0); + elsif div_fin_en(2) = '1' then + div_add_cyi <= sr_r; + div_add_op1 <= '0' & not div_Q; + end if; + end process; + +divide: + process(clk) + variable quo : std_logic; + begin + if rising_edge(clk) then + if div_start = '1' then + div_qbit <= '1'; + div_Q <= div_add_res(31 downto 0); + div_A <= (others => '0'); + if sign2 = '1' then + div_M_n <= '1' & din_lo; + div_M <= '0' & not din_lo; + else + div_M_n <= '1' & not din_lo; + div_M <= '0' & din_lo; + end if; + elsif div_en = '1' then + div_qbit <= not div_add_res(32); + div_A <= div_add_res(32 downto 0); + div_Q <= div_Q(30 downto 0) & not div_add_res(32); + elsif div_fin_en(0) = '1' then + if div_A(32) = '1' then + div_A <= '0' & div_add_res(31 downto 0); + end if; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end Behavioral; diff --git a/lib/CPUs/MIPS/src/core/mips_pipeline.vhd b/lib/CPUs/MIPS/src/core/mips_pipeline.vhd new file mode 100644 index 0000000..fbdc1e8 --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_pipeline.vhd @@ -0,0 +1,914 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The pipeline +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +library work; +use work.mips_types.all; +use work.mips_instr.all; + +entity pipeline is + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + halt : in STD_LOGIC; + int : in unsigned(5 downto 0); + imem_rdy : in STD_LOGIC; + imem_en : out STD_LOGIC; + imem_addr : out word_t; + imem_data : in word_t; + dmem_rdy : in STD_LOGIC; + dmem_en : out STD_LOGIC; + dmem_re : out STD_LOGIC; + dmem_we : out unsigned(3 downto 0); + dmem_addr : out word_t; + dmem_din : in word_t; + dmem_dout : out word_t + ); +end pipeline; + +architecture Behavioral of pipeline is + +-------------------------------------------------------------------------- + COMPONENT reg_dual is + Generic + ( + addr_width : integer := 3; + data_width : integer := 8 + ); + Port + ( + clk_w : in STD_LOGIC; + en : in STD_LOGIC; + we : in STD_LOGIC; + wptr : in unsigned (addr_width-1 downto 0); + din : in unsigned (data_width-1 downto 0); + rptr_a : in unsigned (addr_width-1 downto 0); + rptr_b : in unsigned (addr_width-1 downto 0); + dout_a : out unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); + END COMPONENT; + +-------------------------------------------------------------------------- + COMPONENT idecode_rom is + Port + ( + nop : in std_logic; + inst_in : in word_t; + ctrl_out : out ctrl_lines_t + ); + END COMPONENT; + +-------------------------------------------------------------------------- + COMPONENT shifter is + Generic + ( + data_width : integer + ); + Port + ( + shift_ctrl : in shift_ctrl_t; + din : in unsigned (data_width-1 downto 0); + dout : out unsigned (data_width-1 downto 0) + ); + END COMPONENT; + +-------------------------------------------------------------------------- + COMPONENT alu is + Generic + ( + data_width : integer + ); + Port + ( + op1_in : in unsigned (data_width-1 downto 0); + op2_in : in unsigned (data_width-1 downto 0); + op2_shifted : in unsigned (data_width-1 downto 0); + ctrl : in alu_ctrl_t; + result : out unsigned (data_width-1 downto 0); + flags : out alu_flags_t + ); + END COMPONENT; + +-------------------------------------------------------------------------- + COMPONENT bcu is + Generic + ( + data_width : integer + ); + Port + ( + op1_in : in unsigned (data_width-1 downto 0); + op2_in : in unsigned (data_width-1 downto 0); + flags : out bcu_flags_t + ); + END COMPONENT; + +-------------------------------------------------------------------------- + COMPONENT cop is + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + sdu : in sdu_t; + IR_valid : in STD_LOGIC; + IR : in word_t; + events : in event_t; + ctrl_in : in cop_ctrl_in_t; + ctrl_out : out cop_ctrl_out_t; + din : in word_t; + dout : out word_t + ); + END COMPONENT; + +-------------------------------------------------------------------------- + COMPONENT muldiv is + Port + ( + rst : in std_logic; + clk : in std_logic; + hilo_we : in std_logic; + din_hi : in word_t; + din_lo : in word_t; + mul_divn : in std_logic; + start : in std_logic; + s_un : in std_logic; + hilo_sel : in std_logic; + busy : out std_logic; + dout : out word_t + ); + END COMPONENT; + +-------------------------------------------------------------------------- + constant RESET_VECTOR : word_t := X"BFC00000"; + + signal ID_stage : ID_t; + signal EX_stage : EX_t; + signal MEM_stage : MEM_t; + signal WB_stage : WB_t; + signal clk_2, clk_1 : STD_LOGIC; + signal hdu : hdu_t; + signal sdu : sdu_t; + signal cpu_rst : STD_LOGIC; + signal reg_a : word_t; + signal reg_b : word_t; + signal ctrl_lines : ctrl_lines_t; + signal cpu_run : STD_LOGIC; + signal branch_ce : STD_LOGIC; + signal run_en : STD_LOGIC; + signal mul_dep : STD_LOGIC; + signal imem_dep : STD_LOGIC; + signal dmem_dep : STD_LOGIC; + signal cop_ctrl : cop_ctrl_in_t; + signal cop_stat : cop_ctrl_out_t; + signal cop_din : word_t; + signal cop_dout : word_t; + signal alu_result : word_t; + signal mul_result : word_t; + signal mul_busy : STD_LOGIC; + signal EX_events_instr : event_t; + signal EX_events_alu : event_t; + signal EX_events_mem : event_t; + signal EX_events : event_t; + signal MEM_events : event_t; + signal bcu_op_a : word_t; + signal bcu_op_b : word_t; + signal bcu_flags : bcu_flags_t; + signal vaddr : word_t; + + attribute ram_style : string; + + attribute ram_style of reg_a: signal is "distributed"; + attribute ram_style of reg_b: signal is "distributed"; + + signal pc : pc_t; + +-------------------------------------------------------------------------- +begin + + clk_1 <= clk; + clk_2 <= not clk; + cpu_run <= run_en; + + -- Stall Detection Unit --------------------------------------------------- + sdu.ID_nop <= imem_dep or cop_stat.exc_pending or EX_stage.exc or MEM_stage.exc; + sdu.EX_nop <= mul_dep or ID_stage.nop or ID_stage.exc; + sdu.MEM_nop <= EX_stage.nop or EX_stage.exc; + sdu.WB_nop <= dmem_dep or MEM_stage.nop; + + sdu.ID_stall <= dmem_dep or imem_dep or mul_dep or ID_stage.exc; + sdu.EX_stall <= dmem_dep; + sdu.MEM_stall <= dmem_dep; + sdu.WB_stall <= '0'; + + mul_dep <= ID_stage.ctrl.mul_access and (EX_stage.ctrl.mul_start or mul_busy); + imem_dep <= not imem_rdy; + dmem_dep <= not dmem_rdy and MEM_stage.ctrl.dmem_en; + --------------------------------------------------------------------------- + imem_en <= cpu_run and not (mul_dep or dmem_dep or cop_stat.exc_commit); + +-------------------------------------------------------------------------- +-- Muldiv +-------------------------------------------------------------------------- +inst_muldiv: muldiv + PORT MAP + ( + rst => cpu_rst, + clk => clk, + hilo_we => EX_stage.ctrl.mul_hilo_we, + din_hi => EX_stage.reg_a, + din_lo => EX_stage.reg_b, + mul_divn => EX_stage.ctrl.mul_mul_divn, + start => EX_stage.ctrl.mul_start, + s_un => EX_stage.ctrl.mul_s_un, + hilo_sel => EX_stage.ctrl.mul_hilo_sel, + busy => mul_busy, + dout => mul_result + ); + +-------------------------------------------------------------------------- +-- Coprocessor +-------------------------------------------------------------------------- +inst_cop: cop + PORT MAP + ( + rst => cpu_rst, + clk => clk, + sdu => sdu, + events => MEM_stage.events, + IR_valid => ID_stage.ctrl.cop_instr_en, + IR => ID_stage.IR, + ctrl_in => cop_ctrl, + ctrl_out => cop_stat, + dout => cop_dout, + din => cop_din + ); + + cop_ctrl.bd_wb <= WB_stage.bd; + cop_ctrl.epc_mem <= MEM_stage.pcn; + cop_ctrl.epc_wb <= MEM_stage.epc; + cop_ctrl.imem_addr <= pc.nxt; + cop_ctrl.dmem_addr <= MEM_stage.va; + +-------------------------------------------------------------------------- +-- IF stage +-------------------------------------------------------------------------- + imem_addr <= pc.curr; + +proc_stage_pc: + process(pc, rst, cop_stat) + begin + if rst = '1' then + pc.curr <= RESET_VECTOR after 2 ns; + else + if pc.is_branch and cop_stat.exc_pending = '0' then + pc.curr <= pc.pc_branch after 2 ns; + else + pc.curr <= pc.nxt after 2 ns; + end if; + end if; + end process; + +proc_stage_pc_branch: + process(clk_1) + begin + if rising_edge(clk_1) then + if sdu.ID_stall = '0' then + pc.pc_branch <= pc.curr + ID_stage.bimm18; + end if; + end if; + end process; + +proc_stage_pc_next: + process(clk_1) + begin + if rising_edge(clk_1) then + branch_ce <= '0'; + cop_ctrl.exc_left <= '0'; + if rst = '1' then + pc.nxt <= RESET_VECTOR; + pc.last <= RESET_VECTOR; + elsif cop_stat.exc_commit = '1' then + pc.nxt <= cop_stat.exc_vec; + elsif sdu.ID_stall = '0' then + cop_ctrl.exc_left <= cop_stat.exc_exit; + branch_ce <= '1'; + pc.last <= pc.curr; + if ID_stage.ctrl.jump = '1' then + pc.nxt <= ID_stage.jimm32; + elsif ID_stage.ctrl.jump_long = '1' then + pc.nxt <= ID_stage.reg_a; + else + pc.nxt <= pc.curr + 4; + end if; + end if; + end if; + end process; + +proc_stage_branch: + process(clk_2) + begin + if rising_edge(clk_2) and branch_ce = '1' then + pc.is_branch <= false; + if EX_stage.ctrl.branch = '1' then + + case EX_stage.ctrl.bc_src is + + when bc_eq_ne => + if (EX_stage.ctrl.bc_not xor bcu_flags.eq) = '1' then + pc.is_branch <= true; + end if; + + when bc_lez_gtz => + if (EX_stage.ctrl.bc_not xor (bcu_flags.z or bcu_flags.ltz)) = '1' then + pc.is_branch <= true; + end if; + + when bc_ltz_gez => + if (EX_stage.ctrl.bc_not xor bcu_flags.ltz) = '1' then + pc.is_branch <= true; + end if; + + when others => null; + end case; + end if; + end if; + end process; + + process(rst, clk_1) + variable reset_delay : unsigned (5 downto 0); + begin + if rising_edge(clk_1) then + if rst = '1' then + reset_delay := (others => '1'); + cpu_rst <= '1'; + run_en <= '0'; + elsif reset_delay /= (5 downto 0 => '0') then + reset_delay := reset_delay - 1; + else + cpu_rst <= '0'; + end if; + if reset_delay(reset_delay'left-1) = '0' then + run_en <= '1'; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ID stage +-------------------------------------------------------------------------- + ID_stage.IR <= to_01(imem_data); + ID_stage.pcn <= pc.curr; + ID_stage.op <= decode_op(ID_stage.IR); + ID_stage.jimm32 <= extract_jimm32(ID_stage.IR, ID_stage.pcn); + ID_stage.bimm18 <= extract_bimm18(ID_stage.IR, ID_stage.pcn); + ID_stage.shamt <= extract_shamt(ID_stage.IR); + ID_stage.reg_a_rptr <= extract_rs(ID_stage.IR); + ID_stage.reg_b_rptr <= extract_rt(ID_stage.IR); + ID_stage.ctrl <= ctrl_lines; + ID_stage.reg_write <= ID_stage.ctrl.reg_write or cop_stat.reg_write; + ID_stage.epc <= pc.last; + ID_stage.exc <= event_is_active(ID_stage.events); -- Todo: works + ID_stage.nop <= sdu.ID_nop; + +proc_ID_except: + process(ID_stage, cop_stat, pc) + begin + ID_stage.events <= events_clr; + ID_stage.events.inst_load_err <= pc.nxt(1) or pc.nxt(0); + ID_stage.events.inst_priv_addr <= pc.nxt(word_t'left) and cop_stat.user_mode; + end process; + +proc_stage_hdu: + process(ID_stage, EX_stage, MEM_stage, WB_stage) + variable read_a, read_b : boolean; + variable raw_a_EX, raw_a_MEM, raw_a_WB : boolean; + variable raw_b_EX, raw_b_MEM, raw_b_WB : boolean; + variable reg_ptr_a : reg_ptr_t; + variable reg_ptr_b : reg_ptr_t; + begin + + reg_ptr_a := ID_stage.reg_a_rptr; + reg_ptr_b := ID_stage.reg_b_rptr; + raw_a_EX := reg_ptr_a = EX_stage.reg_wptr and EX_stage.wreg_we = '1'; + raw_a_MEM := reg_ptr_a = MEM_stage.reg_wptr and MEM_stage.wreg_we = '1'; + raw_a_WB := reg_ptr_a = WB_stage.reg_wptr and WB_stage.wreg_we = '1'; + raw_b_EX := reg_ptr_b = EX_stage.reg_wptr and EX_stage.wreg_we = '1'; + raw_b_MEM := reg_ptr_b = MEM_stage.reg_wptr and MEM_stage.wreg_we = '1'; + raw_b_WB := reg_ptr_b = WB_stage.reg_wptr and WB_stage.wreg_we = '1'; + + hdu.alu_fwd_a_ex <= raw_a_EX after 1 ns; + hdu.alu_fwd_a_mem <= raw_a_MEM after 1 ns; + hdu.alu_fwd_a_wb <= raw_a_WB after 1 ns; + hdu.alu_fwd_b_ex <= raw_b_EX after 1 ns; + hdu.alu_fwd_b_mem <= raw_b_MEM after 1 ns; + hdu.alu_fwd_b_wb <= raw_b_WB after 1 ns; + + end process; + +proc_stage_fwd_a: + process(reg_a, hdu, EX_stage, MEM_stage, WB_stage) + variable data : word_t; + begin + data := reg_a; + if hdu.alu_fwd_a_ex then + data := EX_stage.result; + elsif hdu.alu_fwd_a_mem then + data := MEM_stage.data; + elsif hdu.alu_fwd_a_wb then + data := WB_stage.data; + end if; + ID_stage.reg_a <= to_01(data) after 2 ns; + end process; + +proc_stage_fwd_b: + process(reg_b, hdu, EX_stage, MEM_stage, WB_stage) + variable data : word_t; + begin + data := reg_b; + if hdu.alu_fwd_b_ex then + data := EX_stage.result; + elsif hdu.alu_fwd_b_mem then + data := MEM_stage.data; + elsif hdu.alu_fwd_b_wb then + data := WB_stage.data; + end if; + ID_stage.reg_b <= to_01(data) after 2 ns; + end process; + +proc_imm_mux: + process(ID_stage) + variable data : word_t; + begin + data := extract_uimm16(ID_stage.IR); + + case ID_stage.ctrl.imm_src is + + when src_imm32 => + data := extract_simm32(ID_stage.IR); + + when src_imm16 => + data := extract_uimm16(ID_stage.IR); + + when src_imm16_high => + data := ID_stage.IR(word_t'length/2-1 downto 0) & (word_t'length/2-1 downto 0 => '0'); + + when others => null; + + end case; + + ID_stage.imm <= data after 2 ns; + + end process; + +-------------------------------------------------------------------------- +inst_idecode_rom: idecode_rom + PORT MAP + ( + nop => sdu.ID_nop, + inst_in => ID_stage.IR, + ctrl_out => ctrl_lines + ); + +inst_reg_dual: reg_dual + GENERIC MAP + ( + addr_width => reg_ptr_t'length, + data_width => word_t'length + ) + PORT MAP + ( + clk_w => clk_1, + we => WB_stage.wreg_we, + en => '1', + wptr => WB_stage.reg_wptr, + din => WB_stage.data, + rptr_a => ID_stage.reg_a_rptr, + rptr_b => ID_stage.reg_b_rptr, + dout_a => reg_a, + dout_b => reg_b + ); + +-------------------------------------------------------------------------- +-- EX stage +-------------------------------------------------------------------------- + EX_stage.reg_a_rptr <= extract_rs(EX_stage.IR); + EX_stage.reg_b_rptr <= extract_rt(EX_stage.IR); + EX_stage.result <= mul_result when EX_stage.ctrl.mul_access = '1' else alu_result; + +proc_stage_ID_EX_1: + process(clk_1) + begin + if rising_edge(clk_1) then + if rst = '1' then + EX_stage.op <= NOP; + EX_stage.IR <= (others => '0'); + EX_stage.ctrl <= ctrl_lines_default; + EX_stage.reg_write <= '0'; + EX_stage.epc <= (others => '0'); + EX_stage.pcn <= (others => '0'); + EX_stage.events_in <= events_clr; + elsif sdu.EX_stall = '0' then + EX_stage.reg_a <= ID_stage.reg_a; + EX_stage.reg_b <= ID_stage.reg_b; + EX_stage.events_in <= ID_stage.events; + EX_stage.op <= ID_stage.op; + EX_stage.ctrl <= ID_stage.ctrl; + EX_stage.reg_write <= ID_stage.reg_write; + EX_stage.nop <= sdu.EX_nop; + EX_stage.IR <= ID_stage.IR; + EX_stage.pcn <= ID_stage.pcn; + if sdu.EX_nop = '1' then + EX_stage.op <= NOP; + EX_stage.IR <= (others => '0'); + EX_stage.ctrl <= ctrl_lines_default; + EX_stage.reg_write <= '0'; + else + EX_stage.epc <= ID_stage.epc; + end if; + end if; + end if; + end process; + +proc_stage_EX_instr_except: + process(EX_stage) + begin + EX_events_instr <= events_clr; + EX_events_instr.illegal <= EX_stage.ctrl.exc_illegal; + EX_events_instr.break <= EX_stage.ctrl.exc_break; + EX_events_instr.syscall <= EX_stage.ctrl.exc_syscall; + end process; + +proc_stage_EX_alu_except: + process(EX_stage) + begin + EX_events_alu <= events_clr; + if EX_stage.ctrl.alu_exc_en = '1' then + if EX_stage.alu_flags.ovf = '1' then + EX_events_alu.alu_ovf <= '1'; + end if; + if EX_stage.alu_flags.uvf = '1' then + EX_events_alu.alu_uvf <= '1'; + end if; + end if; + end process; + + vaddr <= ID_stage.reg_a + extract_simm32(ID_stage.IR); + +proc_stage_EX_mem_except: + process(clk_1) + begin + if rising_edge(clk_1) then + if rst = '1' then + dmem_en <= '0'; + elsif sdu.EX_stall = '0' then + EX_events_mem <= events_clr; + dmem_en <= '0'; + if ID_stage.ctrl.dmem_en = '1' then + dmem_en <= '1'; + if ID_stage.ctrl.except_en = '1' then + if ID_stage.ctrl.word2_en = '1' then + if vaddr(0) = '1' then + EX_events_mem.data_load_err <= not ID_stage.ctrl.dmem_we; + EX_events_mem.data_store_err <= ID_stage.ctrl.dmem_we; + dmem_en <= '0'; + end if; + elsif vaddr(1 downto 0) /= "00" then + EX_events_mem.data_load_err <= not ID_stage.ctrl.dmem_we; + EX_events_mem.data_store_err <= ID_stage.ctrl.dmem_we; + dmem_en <= '0'; + end if; + end if; + end if; + end if; + end if; + end process; + +proc_stage_DMEM_ADDR: + process(clk_1) + begin + if rising_edge(clk_1) then + if sdu.EX_stall = '0' then --and ID_stage.ctrl.dmem_en = '1' then + EX_stage.va <= vaddr; + if cop_stat.RE = '1' then + EX_stage.pa_off <= not vaddr(1 downto 0); + else + EX_stage.pa_off <= vaddr(1 downto 0); + end if; + end if; + end if; + end process; + dmem_we <= store_be(EX_stage.pa_off, EX_stage.ctrl.dmem_we, EX_stage.ctrl.word2_en, EX_stage.ctrl.word4_en, EX_stage.ctrl.align_left, EX_stage.ctrl.byte_en_byp) after 1 ns; + dmem_re <= not EX_stage.ctrl.dmem_we; + dmem_dout <= store_shift(EX_stage.reg_b, EX_stage.pa_off, EX_stage.ctrl.shift_offset, EX_stage.ctrl.shift_byp) after 1ns; + dmem_addr <= EX_stage.va; + cop_din <= EX_stage.reg_b; + EX_stage.events <= EX_events_instr or EX_events_mem or EX_events_alu or EX_stage.events_in; + EX_stage.exc <= event_is_active(EX_stage.events); + +-------------------------------------------------------------------------- +proc_wptr_mux: + process(EX_stage) + variable opclass : opcode_t; + variable reg_wptr : reg_ptr_t; + begin + + opclass := extract_opc(EX_stage.IR); + case opclass is + when "000000" => + reg_wptr := extract_rd(EX_stage.IR); + when others => + reg_wptr := extract_rt(EX_stage.IR); + end case; + + EX_stage.wreg_we <= EX_stage.reg_write after 1 ns; + if reg_wptr = "00000" then + EX_stage.wreg_we <= '0' after 1 ns; + end if; + + EX_stage.reg_wptr <= reg_wptr after 1 ns; + case EX_stage.ctrl.wptr_srcsel is + when wptr_src_imm => + EX_stage.reg_wptr <= reg_wptr after 1 ns; + + when wptr_src_const => + EX_stage.reg_wptr <= to_unsigned(31, reg_ptr_t'length) after 1 ns; + EX_stage.wreg_we <= '1' after 1 ns; + + when others => null; + end case; + + end process; + +-------------------------------------------------------------------------- +proc_stage_bcu_op: + process(clk_1) + begin + if rising_edge(clk_1) then + bcu_op_a <= ID_stage.reg_a; + bcu_op_b <= ID_stage.reg_b; + end if; + end process; + +alu_op1_mux: + process(EX_stage) + variable data : word_t; + begin + + data := EX_stage.reg_a; + +-- case EX_stage.ctrl.alu.op1_src is +-- +-- when alu_src_reg => +-- data := EX_stage.reg_a; +-- +-- when alu_src_muldiv => +-- data := mul_result; +-- +-- when others => null; +-- +-- end case; + + EX_stage.alu_op1 <= data; + + end process; + +alu_op2_mux: + process(clk_1) + variable data : word_t; + begin + + if rising_edge(clk_1) and sdu.EX_stall = '0' then + data := ID_stage.reg_b; + + case ID_stage.ctrl.alu.op2_src is + + when alu_src_reg => + data := ID_stage.reg_b; + + when alu_src_imm => + data := ID_stage.imm; + + when others => null; + + end case; + + EX_stage.alu_op2 <= data; + end if; + + end process; + +shifter_sa_mux: + process(clk_1) + variable data : shamt_t; + variable data_inv : shamt_t; + + begin + if rising_edge(clk_1) and sdu.EX_stall = '0' then + data := ID_stage.reg_a(4 downto 0); + case ID_stage.ctrl.shamt2_srcsel is + + when sa_src_reg => + data := ID_stage.reg_a(4 downto 0); + + when sa_src_imm => + data := ID_stage.shamt; + + when others => null; + + end case; + data_inv := not data + 1; + if ID_stage.ctrl.alu.shift_right = '0' then + EX_stage.shift_ctrl.shamt_rnd <= data_inv after 2 ns; + else + EX_stage.shift_ctrl.shamt_rnd <= data after 2 ns; + end if; + EX_stage.shift_ctrl.shamt_nrm <= data after 1 ns; + EX_stage.shift_ctrl.shift_right <= ID_stage.ctrl.alu.shift_right; + EX_stage.shift_ctrl.shift_arith <= ID_stage.ctrl.alu.shift_arith; + end if; + + end process; + +-------------------------------------------------------------------------- +inst_shifter: shifter + GENERIC MAP + ( + data_width => word_t'length + ) + PORT MAP + ( + shift_ctrl => EX_stage.shift_ctrl, + din => EX_stage.reg_b, + dout => EX_stage.alu_op2_s + ); + +inst_alu: alu + GENERIC MAP + ( + data_width => word_t'length + ) + PORT MAP + ( + op1_in => EX_stage.alu_op1, + op2_in => EX_stage.alu_op2, + op2_shifted => EX_stage.alu_op2_s, + ctrl => EX_stage.ctrl.alu, + result => alu_result, + flags => EX_stage.alu_flags + ); + +inst_bcu: bcu + GENERIC MAP + ( + data_width => word_t'length + ) + PORT MAP + ( + op1_in => bcu_op_a, + op2_in => bcu_op_b, + flags => bcu_flags + ); + +-------------------------------------------------------------------------- +-- MEM stage +-------------------------------------------------------------------------- +proc_stage_MEM_n: + process(clk_1) + begin + if rising_edge(clk_1) then + if rst = '1' then + MEM_stage.op <= NOP; + MEM_stage.wreg_we <= '0'; + MEM_stage.ctrl <= ctrl_lines_default; + MEM_stage.pa_off <= (others => '0'); + MEM_stage.events_in <= events_clr; +-- MEM_stage.epc <= (others => '0'); +-- MEM_stage.pcn <= (others => '0'); +-- MEM_stage.va <= (others => '0'); +-- MEM_stage.reg_wptr <= (others => '0'); +-- MEM_stage.ex_result <= (others => '0'); + elsif sdu.MEM_stall = '0' then + MEM_stage.events_in <= EX_stage.events; + MEM_stage.op <= EX_stage.op; + MEM_stage.wreg_we <= EX_stage.wreg_we; + MEM_stage.ctrl <= EX_stage.ctrl; + MEM_stage.va <= EX_stage.va; + MEM_stage.pa_off <= EX_stage.pa_off; + MEM_stage.reg_wptr <= EX_stage.reg_wptr; + MEM_stage.nop <= sdu.MEM_nop; + if EX_stage.ctrl.dmem_en = '1' then + MEM_stage.ex_result <= EX_stage.reg_b; + else + MEM_stage.ex_result <= EX_stage.result; + if cop_stat.cop_read = '1' then + MEM_stage.ex_result <= cop_dout; + end if; + end if; + if sdu.MEM_nop = '1' then + MEM_stage.op <= NOP; + MEM_stage.wreg_we <= '0'; + MEM_stage.ctrl <= ctrl_lines_default; + else + MEM_stage.pcn <= EX_stage.pcn; + MEM_stage.epc <= EX_stage.epc; + end if; + end if; + end if; + end process; + +proc_stage_MEM_mux: + process(MEM_stage, dmem_din) + variable temp1 : word_t; + variable temp2 : word_t; + variable data : word_t; + variable be : unsigned(3 downto 0); + begin + data := MEM_stage.ex_result; + be := load_be(MEM_stage.pa_off, MEM_stage.ctrl.align_left, MEM_stage.ctrl.byte_en_byp); + if MEM_stage.ctrl.reg_link = '1' then + data := MEM_stage.pcn + 4; + elsif MEM_stage.ctrl.dmem_en = '1' then + temp1 := load_shift(dmem_din, MEM_stage.pa_off, MEM_stage.ctrl.shift_offset, MEM_stage.ctrl.shift_byp); + temp2 := load_sign_ext(temp1, MEM_stage.ctrl.sign_ext_byp, MEM_stage.ctrl.load_signed, MEM_stage.ctrl.word2_en, MEM_stage.ctrl.word4_en); + if be(0) = '1' then + data(7 downto 0) := temp2(7 downto 0); + end if; + if be(1) = '1' then + data(15 downto 8) := temp2(15 downto 8); + end if; + if be(2) = '1' then + data(23 downto 16) := temp2(23 downto 16); + end if; + if be(3) = '1' then + data(31 downto 24) := temp2(31 downto 24); + end if; + end if; + MEM_stage.data <= data after 1 ns; + + end process; + +proc_stage_MEM_except: + process(MEM_stage, int) + begin + MEM_stage.events <= MEM_stage.events_in; + MEM_stage.events.Int <= int; + end process; + + MEM_stage.exc <= cop_stat.int or event_is_active(MEM_stage.events_in); + +-------------------------------------------------------------------------- +-- WB stage +-------------------------------------------------------------------------- +proc_stage_WB_p: + process(clk_1) + begin + if rising_edge(clk_1) then + if rst = '1' then + WB_stage.op <= NOP; + WB_stage.wreg_we <= '0'; +-- WB_stage.epc <= (others => '0'); +-- WB_stage.reg_wptr <= (others => '0'); +-- WB_stage.data <= (others => '0'); + elsif sdu.WB_stall = '0' then + WB_stage.op <= MEM_stage.op; + WB_stage.wreg_we <= MEM_stage.wreg_we; + WB_stage.reg_wptr <= MEM_stage.reg_wptr; + WB_stage.data <= MEM_stage.data; + WB_stage.nop <= sdu.WB_nop; + if sdu.WB_nop = '1' then + WB_stage.op <= NOP; + WB_stage.wreg_we <= '0'; + else + WB_stage.epc <= MEM_stage.epc; + WB_stage.bd <= MEM_stage.ctrl.branch or MEM_stage.ctrl.jump or MEM_stage.ctrl.jump_long; -- Todo: works + end if; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end Behavioral; diff --git a/lib/CPUs/MIPS/src/core/mips_reg.vhd b/lib/CPUs/MIPS/src/core/mips_reg.vhd new file mode 100644 index 0000000..da76225 --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_reg.vhd @@ -0,0 +1,81 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: On-Chip work registers +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.mips_types.all; + +entity reg_dual is + Generic + ( + addr_width : integer := 3; + data_width : integer := 8 + ); + Port ( + clk_w : in STD_LOGIC; + we : in STD_LOGIC; + en : in STD_LOGIC; + wptr : in unsigned (addr_width-1 downto 0); + din : in unsigned (data_width-1 downto 0); + rptr_a : in unsigned (addr_width-1 downto 0); + rptr_b : in unsigned (addr_width-1 downto 0); + dout_a : out unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); +end reg_dual; + +architecture Behavioral of reg_dual is + + constant depth : integer := 2**addr_width; + type mem_t is array (0 to depth-1) of unsigned (data_width-1 downto 0); + + function mem_clear(depth : natural) return mem_t is + variable result : mem_t; + begin + for i in 0 to depth-1 loop + result(i) := (others => '0'); + end loop; + return result; + end mem_clear; + + signal reg_mem : mem_t := mem_clear(depth); + +begin + +reg_in: + process(clk_w) + begin + if rising_edge(clk_w) then + if we = '1' and en = '1' then + reg_mem(to_integer(wptr)) <= din; + end if; + end if; + end process; + + dout_a <= reg_mem(to_integer(rptr_a)) after 2 ns; + dout_b <= reg_mem(to_integer(rptr_b)) after 2 ns; + +end Behavioral; + diff --git a/lib/CPUs/MIPS/src/core/mips_shifter.vhd b/lib/CPUs/MIPS/src/core/mips_shifter.vhd new file mode 100644 index 0000000..cff2c7d --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_shifter.vhd @@ -0,0 +1,114 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The shifter unit +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.mips_types.all; + +entity shifter is + Generic + ( + data_width : integer := 8 + ); + Port + ( + shift_ctrl : in shift_ctrl_t; + din : in unsigned (data_width-1 downto 0); + dout : out unsigned (data_width-1 downto 0) + ); +end shifter; + +architecture Behavioral of shifter is + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 5) of word_t; + + signal rot_data : word_array_t; + signal sa_rnd : unsigned (4 downto 0); + signal fill : std_logic; + +-------------------------------------------------------------------------- +function rot_stage(x : unsigned; en : std_logic; stage_num : natural) return unsigned is + variable result : unsigned(x'range); + constant sa : natural := 2**stage_num; + begin + if en = '1' then + result := x(sa-1 downto 0) & x(x'left downto sa); + else + result := x; + end if; + return result; + +end rot_stage; + +function rot_fill(x : unsigned; fill : std_logic; shift_right : std_logic; sa : natural) return unsigned is + variable result : unsigned(x'range) := (others => '0'); + variable j : integer; + begin + + if shift_right = '0' then + for i in 0 to x'left loop + if i >= sa then + result(i) := x(i); + else + result(i) := fill; + end if; + end loop; + else + j := x'left; + for i in 0 to x'left loop + if i < sa then + result(j) := fill; + else + result(j) := x(j); + end if; + j := j - 1; + end loop; + end if; + return result; + +end rot_fill; + +-------------------------------------------------------------------------- +begin + + rot_data(0) <= din; + +gen_rotate_right: + for stage in 0 to 4 generate + begin + rot_data(stage+1) <= rot_stage(rot_data(stage), sa_rnd(stage), stage); + end generate; + + sa_rnd <= shift_ctrl.shamt_rnd; + fill <= shift_ctrl.shift_arith and din(data_width-1); + dout <= rot_fill(rot_data(5), fill, shift_ctrl.shift_right, to_integer(shift_ctrl.shamt_nrm)) after 5 ns; +-- dout <= rot_data(5); + + + +-------------------------------------------------------------------------- +end Behavioral; + diff --git a/lib/CPUs/MIPS/src/core/mips_top.vhd b/lib/CPUs/MIPS/src/core/mips_top.vhd new file mode 100644 index 0000000..3d25c3e --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_top.vhd @@ -0,0 +1,164 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: JIPS top file +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +library work; +use work.mips_types.all; + +entity mips_top is + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + int : in unsigned (5 downto 0); + mem_valid : in STD_LOGIC; + mem_rdy : in STD_LOGIC; + mem_en : out STD_LOGIC; + mem_re : out STD_LOGIC; + mem_we : out unsigned(3 downto 0); + mem_din : in unsigned (WORD_WIDTH-1 downto 0); + mem_dout : out unsigned (WORD_WIDTH-1 downto 0); + mem_addr : out unsigned (WORD_WIDTH-1 downto 0) + ); + +end mips_top; + +architecture rtl of mips_top is + + COMPONENT pipeline is + Port ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + halt : in STD_LOGIC; + int : in unsigned (5 downto 0); + imem_rdy : in STD_LOGIC; + imem_en : out STD_LOGIC; + imem_addr : out word_t; + imem_data : in word_t; + dmem_rdy : in STD_LOGIC; + dmem_en : out STD_LOGIC; + dmem_re : out STD_LOGIC; + dmem_we : out unsigned(3 downto 0); + dmem_addr : out word_t; + dmem_din : in word_t; + dmem_dout : out word_t + ); + END COMPONENT; + signal halt : std_logic; + signal imem_rdy : std_logic; + signal imem_en : std_logic; + signal imem_addr : word_t; + signal imem_din : word_t; + signal dmem_rdy : std_logic; + signal dmem_en : std_logic; + signal dmem_re : std_logic; + signal dmem_addr : word_t; + signal dmem_dout : word_t; + signal dmem_din : word_t; + signal dmem_we : unsigned(3 downto 0); + + COMPONENT bui + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + ce : in STD_LOGIC; + cpu_wait : out STD_LOGIC; + cpu_imem_rdy : out STD_LOGIC; + cpu_imem_en : in STD_LOGIC; + cpu_imem_addr : in word_t; + cpu_imem_din : out word_t; + cpu_dmem_rdy : out STD_LOGIC; + cpu_dmem_en : in STD_LOGIC; + cpu_dmem_re : in STD_LOGIC; + cpu_dmem_we : in unsigned(3 downto 0); + cpu_dmem_addr : in word_t; + cpu_dmem_din : out word_t; + cpu_dmem_dout : in word_t; + mem_valid : in STD_LOGIC; + mem_rdy : in STD_LOGIC; + mem_addr : out word_t; + mem_din : in word_t; + mem_dout : out word_t; + mem_re : out STD_LOGIC; + mem_we : out unsigned(3 downto 0); + mem_ce : out STD_LOGIC + ); + END COMPONENT; + +begin + +------------------------------------------------------------------- + +inst_pipeline: pipeline + PORT MAP + ( + rst => rst, + clk => clk, + halt => halt, + int => int, + imem_rdy => imem_rdy, + imem_en => imem_en, + imem_addr => imem_addr, + imem_data => imem_din, + dmem_rdy => dmem_rdy, + dmem_en => dmem_en, + dmem_re => dmem_re, + dmem_we => dmem_we, + dmem_addr => dmem_addr, + dmem_din => dmem_din, + dmem_dout => dmem_dout + ); + +inst_bui: bui + PORT MAP + ( + rst => rst, + clk => clk, + ce => '1', + cpu_wait => halt, + cpu_imem_rdy => imem_rdy, + cpu_imem_en => imem_en, + cpu_imem_addr => imem_addr, + cpu_imem_din => imem_din, + cpu_dmem_rdy => dmem_rdy, + cpu_dmem_en => dmem_en, + cpu_dmem_re => dmem_re, + cpu_dmem_we => dmem_we, + cpu_dmem_addr => dmem_addr, + cpu_dmem_din => dmem_din, + cpu_dmem_dout => dmem_dout, + mem_valid => mem_valid, + mem_rdy => mem_rdy, + mem_addr => mem_addr, + mem_din => mem_din, + mem_dout => mem_dout, + mem_re => mem_re, + mem_we => mem_we, + mem_ce => mem_en + ); + +end rtl; diff --git a/lib/CPUs/MIPS/src/core/mips_types.vhd b/lib/CPUs/MIPS/src/core/mips_types.vhd new file mode 100644 index 0000000..0dec8a1 --- /dev/null +++ b/lib/CPUs/MIPS/src/core/mips_types.vhd @@ -0,0 +1,620 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: Types, constants and functions for JIPS +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + + +-------------------------------------------------------------------------- +package mips_types is + + -- Revision of the CPU + constant REVISION : integer := 1; + constant WORD_WIDTH : integer := 32; + + --Types + subtype instr_name_t is string(1 to 12); + type instr_name_array_t is array (0 to 63) of instr_name_t; + subtype opcode_t is unsigned (5 downto 0); + subtype word_t is unsigned (WORD_WIDTH-1 downto 0); + subtype reg_ptr_t is unsigned (4 downto 0); + subtype shamt_t is unsigned(4 downto 0); + subtype sa_t is natural range 0 to 63; + subtype func_t is unsigned(5 downto 0); + + type opclass_t is (special, regimm, opcode); + + type op_t is + ( + nop, + op_sll, + op_srl, + op_sra, + op_sllv, + op_srlv, + op_srav, + op_jr, + op_jalr, + op_syscall, + op_break, + op_mfhi, + op_mthi, + op_mflo, + op_mtlo, + op_mult, + op_multu, + op_div, + op_divu, + op_add, + op_addu, + op_sub, + op_subu, + op_and, + op_or, + op_xor, + op_nor, + op_slt, + op_sltu, + op_bltz, + op_bgez, + op_bltzal, + op_bgezal, + op_j, + op_jal, + op_beq, + op_bne, + op_blez, + op_bgtz, + op_addi, + op_addiu, + op_slti, + op_sltiu, + op_andi, + op_ori, + op_xori, + op_lui, + op_lb, + op_lh, + op_lwl, + op_lw, + op_lbu, + op_lhu, + op_lwr, + op_sb, + op_sh, + op_swl, + op_sw, + op_swr, + op_cop0, + op_cop1, + op_cop2, + op_cop3, + op_lwc1, + op_lwc2, + op_lwc3, + op_swc1, + op_swc2, + op_swc3 + ); + + attribute ENUM_ENCODING : string; + + type imm_src_t is (src_imm32, src_imm16, src_imm16_high); + type sa_src_t is (sa_src_reg, sa_src_imm); + type alu_src1_t is (alu_src_reg); + type alu_src2_t is (alu_src_reg, alu_src_imm); + type bc_src_t is (bc_eq_ne, bc_lez_gtz, bc_ltz_gez); + type shift_opsel_t is (shift_sll, shift_srl, shift_sra); + type wptr_src_t is (wptr_src_imm, wptr_src_const); + +-- attribute ENUM_ENCODING of itype_t: type is "ONE-HOT"; + + type pc_t is record + curr : word_t; + last : word_t; + nxt : word_t; + pc_branch : word_t; + is_branch : boolean; + end record; + + type alu_outsel_t is + ( + alu_adder, + alu_shift2, + alu_and, + alu_or, + alu_xor, + alu_nor, + alu_ltu, + alu_lts + ); + + type alu_flags_t is record + c : STD_LOGIC; + uvf : STD_LOGIC; + ovf : STD_LOGIC; + ltu : STD_LOGIC; + lts : STD_LOGIC; + end record; + + type bcu_flags_t is record + z : STD_LOGIC; + eq : STD_LOGIC; + ltz : STD_LOGIC; + end record; + + type event_t is record + Int : unsigned(5 downto 0); + data_load_err : STD_LOGIC; + data_store_err : STD_LOGIC; + inst_load_err : STD_LOGIC; + inst_priv_addr : STD_LOGIC; + alu_ovf : STD_LOGIC; + alu_uvf : STD_LOGIC; + syscall : STD_LOGIC; + break : STD_LOGIC; + illegal : STD_LOGIC; + end record; + + type exc_flags_t is record + Int : STD_LOGIC; + DAdEL : STD_LOGIC; + DAdES : STD_LOGIC; + IAdEL : STD_LOGIC; + IAdEK : STD_LOGIC; + Ov : STD_LOGIC; + Sys : STD_LOGIC; + Bp : STD_LOGIC; + RI : STD_LOGIC; + IBE : STD_LOGIC; + DBE : STD_LOGIC; + end record; + + type except_t is record + act : STD_LOGIC; + epc : word_t; + cause : word_t; + end record; + + type cop_ctrl_in_t is record + bd_wb : STD_LOGIC; + epc_mem : word_t; + epc_wb : word_t; + imem_addr : word_t; + dmem_addr : word_t; + exc_left : STD_LOGIC; + end record; + + type cop_ctrl_out_t is record + RE : STD_LOGIC; + ee : STD_LOGIC; + ec : STD_LOGIC; + exc_commit : STD_LOGIC; + exc_pending : STD_LOGIC; + exc_exit : STD_LOGIC; + reg_write : STD_LOGIC; + cop_read : STD_LOGIC; + user_mode : STD_LOGIC; + int : STD_LOGIC; + exc_vec : word_t; + end record; + + type sdu_t is record + ID_nop : STD_LOGIC; + EX_nop : STD_LOGIC; + MEM_nop : STD_LOGIC; + WB_nop : STD_LOGIC; + ID_stall : STD_LOGIC; + EX_stall : STD_LOGIC; + MEM_stall : STD_LOGIC; + WB_stall : STD_LOGIC; + end record; + + type hdu_t is record + alu_fwd_a_ex : boolean; + alu_fwd_a_mem : boolean; + alu_fwd_a_wb : boolean; + alu_fwd_b_ex : boolean; + alu_fwd_b_mem : boolean; + alu_fwd_b_wb : boolean; + end record; + + type alu_ctrl_t is record + outsel : alu_outsel_t; + add : STD_LOGIC; + shift_right : STD_LOGIC; + shift_arith : STD_LOGIC; + op1_src : alu_src1_t; + op2_src : alu_src2_t; + end record; + + type shift_ctrl_t is record + shamt_nrm : shamt_t; + shamt_rnd : shamt_t; + shift_right : STD_LOGIC; + shift_arith : STD_LOGIC; + end record; + + type ctrl_lines_t is record + branch : STD_LOGIC; + jump_long : STD_LOGIC; + jump : STD_LOGIC; + bc_not : STD_LOGIC; + bc_src : bc_src_t; + imm_src : imm_src_t; + alu : alu_ctrl_t; + reg_write : STD_LOGIC; + reg_link : STD_LOGIC; + dmem_we : STD_LOGIC; + dmem_en : STD_LOGIC; + shamt2_srcsel : sa_src_t; + wptr_srcsel : wptr_src_t; + cop_instr_en : STD_LOGIC; + shift_offset : unsigned(1 downto 0); + shift_byp : STD_LOGIC; + byte_en_byp : STD_LOGIC; + sign_ext_byp : STD_LOGIC; + word4_en : STD_LOGIC; + word2_en : STD_LOGIC; + align_left : STD_LOGIC; + load_signed : STD_LOGIC; + mul_access : STD_LOGIC; + mul_hilo_we : STD_LOGIC; + mul_mul_divn : STD_LOGIC; + mul_start : STD_LOGIC; + mul_s_un : STD_LOGIC; + mul_hilo_sel : STD_LOGIC; + exc_break : STD_LOGIC; + exc_syscall : STD_LOGIC; + exc_illegal : STD_LOGIC; + except_en : STD_LOGIC; + alu_exc_en : STD_LOGIC; + end record; + + type ID_t is record + nop : STD_LOGIC; + exc : std_logic; + IR : word_t; + op : op_t; + pcn : word_t; + epc : word_t; + jimm32 : word_t; + bimm18 : word_t; + imm : word_t; + shamt : shamt_t; + ctrl : ctrl_lines_t; + reg_write : STD_LOGIC; + reg_a_rptr : reg_ptr_t; + reg_b_rptr : reg_ptr_t; + reg_a : word_t; + reg_b : word_t; + events : event_t; + end record; + + type EX_t is record + nop : STD_LOGIC; + exc : std_logic; + IR : word_t; + op : op_t; + pcn : word_t; + epc : word_t; + reg_a : word_t; + reg_b : word_t; + ctrl : ctrl_lines_t; + shift_ctrl : shift_ctrl_t; + alu_op1 : word_t; + alu_op2 : word_t; + alu_op2_s : word_t; + alu_flags : alu_flags_t; + result : word_t; + reg_write : STD_LOGIC; + wreg_we : STD_LOGIC; + reg_wptr : reg_ptr_t; + reg_a_rptr : reg_ptr_t; + reg_b_rptr : reg_ptr_t; + va : word_t; + pa_off : unsigned(1 downto 0); + events_in : event_t; + events : event_t; + end record; + + type MEM_t is record + nop : STD_LOGIC; + exc : std_logic; + op : op_t; + pcn : word_t; + epc : word_t; + ctrl : ctrl_lines_t; + ex_result : word_t; + reg_wptr : reg_ptr_t; + wreg_we : STD_LOGIC; + data : word_t; + va : word_t; + pa_off : unsigned(1 downto 0); + events_in : event_t; + events : event_t; + end record; + + type WB_t is record + nop : STD_LOGIC; + op : op_t; + epc : word_t; + reg_wptr : reg_ptr_t; + wreg_we : STD_LOGIC; + data : word_t; + bd : STD_LOGIC; + end record; + + + type rom_special_t is array (0 to 2**func_t'length-1) of ctrl_lines_t; + type rom_regimm_t is array (0 to 2**reg_ptr_t'length-1) of ctrl_lines_t; + type rom_opcode_t is array (0 to 2**opcode_t'length-1) of ctrl_lines_t; + + function store_shift(x : word_t; va, shift_off : unsigned(1 downto 0); bypass : std_logic) return word_t; + function store_be(va : unsigned(1 downto 0); be_src, word2_en, word4_en, align_left, bypass : std_logic) return unsigned; + function load_shift(x : word_t; va, shift_off : unsigned(1 downto 0); bypass : std_logic) return word_t; + function load_be(va : unsigned(1 downto 0); align_left, bypass : std_logic) return unsigned; + function load_sign_ext(x : word_t; bypass, signed, word2_en, word4_en : std_logic) return word_t; + function events_clr return event_t; + function event_is_active(e : event_t) return std_logic; + function "or" (a, b : event_t) return event_t; + +end mips_types; + +-------------------------------------------------------------------------- +package body mips_types is + + function store_shift(x : word_t; va, shift_off : unsigned(1 downto 0); bypass : std_logic) return word_t is + variable stage1 : word_t; + variable result : word_t; + variable sa : unsigned(1 downto 0); + begin + + if bypass = '1' then + sa := "00"; + else + sa := va + shift_off; + end if; + + stage1 := x; + if sa(0) = '1' then + stage1 := x(23 downto 0) & x(31 downto 24); + end if; + result := stage1; + if sa(1) = '1' then + result := stage1(15 downto 0) & stage1(31 downto 16); + end if; + + return result; + end store_shift; + +-------------------------------------------------------------------------- + function store_be(va : unsigned(1 downto 0); be_src, word2_en, word4_en, align_left, bypass : std_logic) return unsigned is + variable result : unsigned(3 downto 0); + begin + if bypass = '1' then + result := (3 downto 0 => be_src); + elsif word2_en = '1' then + case va is + when "00" | "01" => + result := "00" & be_src & be_src; + when "10" | "11" => + result := be_src & be_src & "00"; + when others => + result := "0000"; + end case; + elsif word4_en = '1' then + case va is + when "00" => + result := "000" & be_src; + when "01" => + result := "00" & be_src & '0'; + when "10" => + result := '0' & be_src & "00"; + when "11" => + result := be_src & "000"; + when others => + result := "0000"; + end case; + elsif align_left = '1' then + case va is + when "00" => + result := be_src & be_src & be_src & be_src; + when "01" => + result := be_src & be_src & be_src & '0'; + when "10" => + result := be_src & be_src & "00"; + when "11" => + result := be_src & "000"; + when others => + result := "0000"; + end case; + else + case va is + when "00" => + result := "000" & be_src; + when "01" => + result := "00" & be_src & be_src; + when "10" => + result := '0' & be_src & be_src & be_src; + when "11" => + result := be_src & be_src & be_src & be_src; + when others => + result := "0000"; + end case; + end if; + + return result; + + end store_be; + +-------------------------------------------------------------------------- + function load_shift(x : word_t; va, shift_off : unsigned(1 downto 0); bypass : std_logic) return word_t is + variable stage1 : word_t; + variable result : word_t; + variable sa : unsigned(1 downto 0); + + begin + if bypass = '1' then + sa := "00"; + else + sa := va + shift_off; + end if; + + stage1 := x; + if sa(0) = '1' then + stage1 := x(7 downto 0) & x(31 downto 8); + end if; + result := stage1; + if sa(1) = '1' then + result := stage1(15 downto 0) & stage1(31 downto 16); + end if; + + return result; + end load_shift; + +-------------------------------------------------------------------------- + function load_be(va : unsigned(1 downto 0); align_left, bypass : std_logic) return unsigned is + variable result : unsigned(3 downto 0); + begin + if bypass = '1' then + result := (3 downto 0 => '1'); + elsif align_left = '1' then + case va is + when "00" => + result := "1000"; + when "01" => + result := "1100"; + when "10" => + result := "1110"; + when "11" => + result := "1111"; + when others => + result := "0000"; + end case; + else + case va is + when "00" => + result := "1111"; + when "01" => + result := "0111"; + when "10" => + result := "0011"; + when "11" => + result := "0001"; + when others => + result := "0000"; + end case; + end if; + + return result; + + end load_be; + +-------------------------------------------------------------------------- + function load_sign_ext(x : word_t; bypass, signed, word2_en, word4_en : std_logic) return word_t is + variable result : word_t; + variable sign : std_logic; + + begin + if bypass = '1' then + result := x; + elsif word2_en = '1' then + sign := signed and x(15); + result := (31 downto 16 => sign) & x(15 downto 0); + else + sign := signed and x(7); + result := (31 downto 8 => sign) & x(7 downto 0); + end if; + + return result; + end load_sign_ext; + +-------------------------------------------------------------------------- + function events_clr return event_t is + variable result : event_t; + begin + result.Int := (others => '0'); + result.data_load_err := '0'; + result.data_store_err := '0'; + result.inst_load_err := '0'; + result.inst_priv_addr := '0'; + result.alu_ovf := '0'; + result.alu_uvf := '0'; + result.syscall := '0'; + result.break := '0'; + result.illegal := '0'; + + return result; + + end events_clr; + + function event_is_active(e : event_t) return std_logic is + variable result : std_logic; + begin + result := '0'; + + for i in e.Int'range loop + result := result or e.Int(i); + end loop; + + result := result or e.data_load_err; + result := result or e.data_store_err; + result := result or e.inst_load_err; + result := result or e.inst_priv_addr; + result := result or e.alu_ovf; + result := result or e.alu_uvf; + result := result or e.syscall; + result := result or e.break; + result := result or e.illegal; + + return result; + + end event_is_active; + + function "or" (a, b : event_t) return event_t is + variable result : event_t; + begin + for i in a.Int'range loop + result.Int(i) := a.Int(i) or b.Int(i); + end loop; + result.data_load_err := a.data_load_err or b.data_load_err; + result.data_store_err := a.data_store_err or b.data_store_err; + result.inst_load_err := a.inst_load_err or b.inst_load_err; + result.inst_priv_addr := a.inst_priv_addr or b.inst_priv_addr; + result.alu_ovf := a.alu_ovf or b.alu_ovf; + result.alu_uvf := a.alu_uvf or b.alu_uvf; + result.syscall := a.syscall or b.syscall; + result.break := a.break or b.break; + result.illegal := a.illegal or b.illegal; + + return result; + + end "or"; + +-------------------------------------------------------------------------- +end mips_types; + +-------------------------------------------------------------------------- +-------------------------------------------------------------------------- diff --git a/lib/CPUs/MIPS/src/fibonacci.ROM_ld.vhd b/lib/CPUs/MIPS/src/fibonacci.ROM_ld.vhd new file mode 100644 index 0000000..759ad2a --- /dev/null +++ b/lib/CPUs/MIPS/src/fibonacci.ROM_ld.vhd @@ -0,0 +1,2174 @@ +LIBRARY IEEE; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +ENTITY rom IS + Port + ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in unsigned(31 downto 0); + dout : out unsigned(31 downto 0) + ); +END rom; + +ARCHITECTURE data OF rom IS + + subtype word_t is unsigned(31 downto 0); + type word_array_t is array (0 to 2047) of word_t; + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : unsigned (15 downto 0); + signal jtag_ld_dout : unsigned (31 downto 0); + signal jtag_ld_din : unsigned (31 downto 0); + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (47 downto 0); + + signal word_array : word_array_t := + ( + + X"401A6000", -- 00000000 + X"3C1B0040", -- 00000004 + X"035BD024", -- 00000008 + X"375A000C", -- 0000000C + X"409A6000", -- 00000010 + X"401A7800", -- 00000014 + X"00000000", -- 00000018 + X"409AF800", -- 0000001C + X"3C1D7FFF", -- 00000020 + X"37BDEFFC", -- 00000024 + X"3C1A0040", -- 00000028 + X"275A02E4", -- 0000002C + X"0340F809", -- 00000030 + X"42000010", -- 00000034 + X"00000000", -- 00000038 + X"00000000", -- 0000003C + X"00000000", -- 00000040 + X"00000000", -- 00000044 + X"00000000", -- 00000048 + X"00000000", -- 0000004C + X"00000000", -- 00000050 + X"00000000", -- 00000054 + X"00000000", -- 00000058 + X"00000000", -- 0000005C + X"00000000", -- 00000060 + X"00000000", -- 00000064 + X"00000000", -- 00000068 + X"00000000", -- 0000006C + X"00000000", -- 00000070 + X"00000000", -- 00000074 + X"00000000", -- 00000078 + X"00000000", -- 0000007C + X"00000000", -- 00000080 + X"00000000", -- 00000084 + X"00000000", -- 00000088 + X"00000000", -- 0000008C + X"00000000", -- 00000090 + X"00000000", -- 00000094 + X"00000000", -- 00000098 + X"00000000", -- 0000009C + X"00000000", -- 000000A0 + X"00000000", -- 000000A4 + X"00000000", -- 000000A8 + X"00000000", -- 000000AC + X"00000000", -- 000000B0 + X"00000000", -- 000000B4 + X"00000000", -- 000000B8 + X"00000000", -- 000000BC + X"00000000", -- 000000C0 + X"00000000", -- 000000C4 + X"00000000", -- 000000C8 + X"00000000", -- 000000CC + X"00000000", -- 000000D0 + X"00000000", -- 000000D4 + X"00000000", -- 000000D8 + X"00000000", -- 000000DC + X"00000000", -- 000000E0 + X"00000000", -- 000000E4 + X"00000000", -- 000000E8 + X"00000000", -- 000000EC + X"00000000", -- 000000F0 + X"00000000", -- 000000F4 + X"00000000", -- 000000F8 + X"00000000", -- 000000FC + X"00000000", -- 00000100 + X"00000000", -- 00000104 + X"00000000", -- 00000108 + X"00000000", -- 0000010C + X"00000000", -- 00000110 + X"00000000", -- 00000114 + X"00000000", -- 00000118 + X"00000000", -- 0000011C + X"00000000", -- 00000120 + X"00000000", -- 00000124 + X"00000000", -- 00000128 + X"00000000", -- 0000012C + X"00000000", -- 00000130 + X"00000000", -- 00000134 + X"00000000", -- 00000138 + X"00000000", -- 0000013C + X"00000000", -- 00000140 + X"00000000", -- 00000144 + X"00000000", -- 00000148 + X"00000000", -- 0000014C + X"00000000", -- 00000150 + X"00000000", -- 00000154 + X"00000000", -- 00000158 + X"00000000", -- 0000015C + X"00000000", -- 00000160 + X"00000000", -- 00000164 + X"00000000", -- 00000168 + X"00000000", -- 0000016C + X"00000000", -- 00000170 + X"00000000", -- 00000174 + X"00000000", -- 00000178 + X"00000000", -- 0000017C + X"401A6800", -- 00000180 + X"3C1B8000", -- 00000184 + X"001AD082", -- 00000188 + X"335A000F", -- 0000018C + X"035BD025", -- 00000190 + X"AF7A0000", -- 00000194 + X"401A7000", -- 00000198 + X"00000000", -- 0000019C + X"03400008", -- 000001A0 + X"42000010", -- 000001A4 + X"24080002", -- 000001A8 + X"0107102A", -- 000001AC + X"ACC40000", -- 000001B0 + X"1040000B", -- 000001B4 + X"ACC50004", -- 000001B8 + X"24C60008", -- 000001BC + X"24E8FFFE", -- 000001C0 + X"8CC2FFF8", -- 000001C4 + X"8CC3FFFC", -- 000001C8 + X"2508FFFF", -- 000001CC + X"00431021", -- 000001D0 + X"ACC20000", -- 000001D4 + X"1500FFFA", -- 000001D8 + X"24C60004", -- 000001DC + X"00E04021", -- 000001E0 + X"03E00008", -- 000001E4 + X"01001021", -- 000001E8 + X"94820002", -- 000001EC + X"A0800000", -- 000001F0 + X"2442FFFF", -- 000001F4 + X"00021C00", -- 000001F8 + X"A4820002", -- 000001FC + X"00031C03", -- 00000200 + X"2402FFFF", -- 00000204 + X"8C850004", -- 00000208 + X"1062000F", -- 0000020C + X"00000000", -- 00000210 + X"2406FFFF", -- 00000214 + X"90A30000", -- 00000218 + X"90820000", -- 0000021C + X"00000000", -- 00000220 + X"00431021", -- 00000224 + X"A0820000", -- 00000228 + X"A0A20000", -- 0000022C + X"94830002", -- 00000230 + X"24A50001", -- 00000234 + X"2463FFFF", -- 00000238 + X"00031400", -- 0000023C + X"00021403", -- 00000240 + X"1446FFF4", -- 00000244 + X"A4830002", -- 00000248 + X"80820002", -- 0000024C + X"03E00008", -- 00000250 + X"00000000", -- 00000254 + X"3C028000", -- 00000258 + X"00042600", -- 0000025C + X"00042603", -- 00000260 + X"34450004", -- 00000264 + X"34430008", -- 00000268 + X"90620000", -- 0000026C + X"00000000", -- 00000270 + X"00021042", -- 00000274 + X"30420001", -- 00000278 + X"1440FFFB", -- 0000027C + X"00000000", -- 00000280 + X"03E00008", -- 00000284 + X"A0A40000", -- 00000288 + X"27BDFFE0", -- 0000028C + X"AFB10014", -- 00000290 + X"AFB00010", -- 00000294 + X"AFBF0018", -- 00000298 + X"80820000", -- 0000029C + X"00808821", -- 000002A0 + X"1040000A", -- 000002A4 + X"00008021", -- 000002A8 + X"00801821", -- 000002AC + X"80640000", -- 000002B0 + X"0C100096", -- 000002B4 + X"26100001", -- 000002B8 + X"02301821", -- 000002BC + X"80620000", -- 000002C0 + X"00000000", -- 000002C4 + X"1440FFF9", -- 000002C8 + X"00000000", -- 000002CC + X"8FBF0018", -- 000002D0 + X"8FB10014", -- 000002D4 + X"8FB00010", -- 000002D8 + X"03E00008", -- 000002DC + X"27BD0020", -- 000002E0 + X"27BDF020", -- 000002E4 + X"3C02AAAA", -- 000002E8 + X"24040041", -- 000002EC + X"AFBF0FDC", -- 000002F0 + X"AFBE0FD8", -- 000002F4 + X"AFB70FD4", -- 000002F8 + X"AFB60FD0", -- 000002FC + X"AFB50FCC", -- 00000300 + X"AFB40FC8", -- 00000304 + X"AFB30FC4", -- 00000308 + X"AFB00FB8", -- 0000030C + X"AFB20FC0", -- 00000310 + X"3450AAAA", -- 00000314 + X"0C100096", -- 00000318 + X"AFB10FBC", -- 0000031C + X"0C100096", -- 00000320 + X"24040020", -- 00000324 + X"0C100096", -- 00000328 + X"24040041", -- 0000032C + X"0C100096", -- 00000330 + X"24040020", -- 00000334 + X"0C100096", -- 00000338 + X"24040041", -- 0000033C + X"0C100096", -- 00000340 + X"24040020", -- 00000344 + X"0C100096", -- 00000348 + X"24040041", -- 0000034C + X"0C100096", -- 00000350 + X"24040020", -- 00000354 + X"0C100096", -- 00000358 + X"24040030", -- 0000035C + X"0C100096", -- 00000360 + X"24040031", -- 00000364 + X"0C100096", -- 00000368 + X"24040032", -- 0000036C + X"0C100096", -- 00000370 + X"24040033", -- 00000374 + X"0C100096", -- 00000378 + X"24040034", -- 0000037C + X"0C100096", -- 00000380 + X"24040035", -- 00000384 + X"0C100096", -- 00000388 + X"24040036", -- 0000038C + X"0C100096", -- 00000390 + X"24040037", -- 00000394 + X"0C100096", -- 00000398 + X"24040038", -- 0000039C + X"0C100096", -- 000003A0 + X"24040039", -- 000003A4 + X"0C100096", -- 000003A8 + X"24040041", -- 000003AC + X"0C100096", -- 000003B0 + X"24040042", -- 000003B4 + X"0C100096", -- 000003B8 + X"24040043", -- 000003BC + X"0C100096", -- 000003C0 + X"24040044", -- 000003C4 + X"0C100096", -- 000003C8 + X"24040045", -- 000003CC + X"0C100096", -- 000003D0 + X"24040046", -- 000003D4 + X"0C100096", -- 000003D8 + X"2404000D", -- 000003DC + X"0C100096", -- 000003E0 + X"2404000A", -- 000003E4 + X"3C148000", -- 000003E8 + X"00009821", -- 000003EC + X"27BE0010", -- 000003F0 + X"27B70FB0", -- 000003F4 + X"241503E8", -- 000003F8 + X"3C164000", -- 000003FC + X"00008821", -- 00000400 + X"00002021", -- 00000404 + X"03C01021", -- 00000408 + X"240603E7", -- 0000040C + X"24C6FFFF", -- 00000410 + X"AC500000", -- 00000414 + X"04C1FFFD", -- 00000418 + X"24420004", -- 0000041C + X"02041026", -- 00000420 + X"24920001", -- 00000424 + X"24420001", -- 00000428 + X"02402821", -- 0000042C + X"27A60010", -- 00000430 + X"240703E8", -- 00000434 + X"0C10006A", -- 00000438 + X"00028040", -- 0000043C + X"24070002", -- 00000440 + X"27C50008", -- 00000444 + X"08100116", -- 00000448 + X"240603E5", -- 0000044C + X"04C0000A", -- 00000450 + X"00000000", -- 00000454 + X"8CA20000", -- 00000458 + X"8CA3FFFC", -- 0000045C + X"8CA4FFF8", -- 00000460 + X"00431023", -- 00000464 + X"24C6FFFF", -- 00000468 + X"1482FFF8", -- 0000046C + X"24A50004", -- 00000470 + X"04C1FFF8", -- 00000474 + X"24E70001", -- 00000478 + X"10F50013", -- 0000047C + X"00000000", -- 00000480 + X"2A4203E8", -- 00000484 + X"1440FFDF", -- 00000488 + X"02402021", -- 0000048C + X"12350010", -- 00000490 + X"00000000", -- 00000494 + X"02761025", -- 00000498 + X"AE820000", -- 0000049C + X"02E02021", -- 000004A0 + X"24020FA0", -- 000004A4 + X"A7A20FB2", -- 000004A8 + X"A3A00FB0", -- 000004AC + X"0C10007B", -- 000004B0 + X"AFBE0FB4", -- 000004B4 + X"02028026", -- 000004B8 + X"26730001", -- 000004BC + X"00008821", -- 000004C0 + X"08100102", -- 000004C4 + X"00002021", -- 000004C8 + X"08100121", -- 000004CC + X"26310001", -- 000004D0 + X"08100128", -- 000004D4 + X"AE930000", -- 000004D8 + X"00000000", -- 000004DC + X"00000000", -- 000004E0 + X"00000000", -- 000004E4 + X"00000000", -- 000004E8 + X"00000000", -- 000004EC + X"00000000", -- 000004F0 + X"00000000", -- 000004F4 + X"00000000", -- 000004F8 + X"00000000", -- 000004FC + X"00000000", -- 00000500 + X"00000000", -- 00000504 + X"00000000", -- 00000508 + X"00000000", -- 0000050C + X"00000000", -- 00000510 + X"00000000", -- 00000514 + X"00000000", -- 00000518 + X"00000000", -- 0000051C + X"00000000", -- 00000520 + X"00000000", -- 00000524 + X"00000000", -- 00000528 + X"00000000", -- 0000052C + X"00000000", -- 00000530 + X"00000000", -- 00000534 + X"00000000", -- 00000538 + X"00000000", -- 0000053C + X"00000000", -- 00000540 + X"00000000", -- 00000544 + X"00000000", -- 00000548 + X"00000000", -- 0000054C + X"00000000", -- 00000550 + X"00000000", -- 00000554 + X"00000000", -- 00000558 + X"00000000", -- 0000055C + X"00000000", -- 00000560 + X"00000000", -- 00000564 + X"00000000", -- 00000568 + X"00000000", -- 0000056C + X"00000000", -- 00000570 + X"00000000", -- 00000574 + X"00000000", -- 00000578 + X"00000000", -- 0000057C + X"00000000", -- 00000580 + X"00000000", -- 00000584 + X"00000000", -- 00000588 + X"00000000", -- 0000058C + X"00000000", -- 00000590 + X"00000000", -- 00000594 + X"00000000", -- 00000598 + X"00000000", -- 0000059C + X"00000000", -- 000005A0 + X"00000000", -- 000005A4 + X"00000000", -- 000005A8 + X"00000000", -- 000005AC + X"00000000", -- 000005B0 + X"00000000", -- 000005B4 + X"00000000", -- 000005B8 + X"00000000", -- 000005BC + X"00000000", -- 000005C0 + X"00000000", -- 000005C4 + X"00000000", -- 000005C8 + X"00000000", -- 000005CC + X"00000000", -- 000005D0 + X"00000000", -- 000005D4 + X"00000000", -- 000005D8 + X"00000000", -- 000005DC + X"00000000", -- 000005E0 + X"00000000", -- 000005E4 + X"00000000", -- 000005E8 + X"00000000", -- 000005EC + X"00000000", -- 000005F0 + X"00000000", -- 000005F4 + X"00000000", -- 000005F8 + X"00000000", -- 000005FC + X"00000000", -- 00000600 + X"00000000", -- 00000604 + X"00000000", -- 00000608 + X"00000000", -- 0000060C + X"00000000", -- 00000610 + X"00000000", -- 00000614 + X"00000000", -- 00000618 + X"00000000", -- 0000061C + X"00000000", -- 00000620 + X"00000000", -- 00000624 + X"00000000", -- 00000628 + X"00000000", -- 0000062C + X"00000000", -- 00000630 + X"00000000", -- 00000634 + X"00000000", -- 00000638 + X"00000000", -- 0000063C + X"00000000", -- 00000640 + X"00000000", -- 00000644 + X"00000000", -- 00000648 + X"00000000", -- 0000064C + X"00000000", -- 00000650 + X"00000000", -- 00000654 + X"00000000", -- 00000658 + X"00000000", -- 0000065C + X"00000000", -- 00000660 + X"00000000", -- 00000664 + X"00000000", -- 00000668 + X"00000000", -- 0000066C + X"00000000", -- 00000670 + X"00000000", -- 00000674 + X"00000000", -- 00000678 + X"00000000", -- 0000067C + X"00000000", -- 00000680 + X"00000000", -- 00000684 + X"00000000", -- 00000688 + X"00000000", -- 0000068C + X"00000000", -- 00000690 + X"00000000", -- 00000694 + X"00000000", -- 00000698 + X"00000000", -- 0000069C + X"00000000", -- 000006A0 + X"00000000", -- 000006A4 + X"00000000", -- 000006A8 + X"00000000", -- 000006AC + X"00000000", -- 000006B0 + X"00000000", -- 000006B4 + X"00000000", -- 000006B8 + X"00000000", -- 000006BC + X"00000000", -- 000006C0 + X"00000000", -- 000006C4 + X"00000000", -- 000006C8 + X"00000000", -- 000006CC + X"00000000", -- 000006D0 + X"00000000", -- 000006D4 + X"00000000", -- 000006D8 + X"00000000", -- 000006DC + X"00000000", -- 000006E0 + X"00000000", -- 000006E4 + X"00000000", -- 000006E8 + X"00000000", -- 000006EC + X"00000000", -- 000006F0 + X"00000000", -- 000006F4 + X"00000000", -- 000006F8 + X"00000000", -- 000006FC + X"00000000", -- 00000700 + X"00000000", -- 00000704 + X"00000000", -- 00000708 + X"00000000", -- 0000070C + X"00000000", -- 00000710 + X"00000000", -- 00000714 + X"00000000", -- 00000718 + X"00000000", -- 0000071C + X"00000000", -- 00000720 + X"00000000", -- 00000724 + X"00000000", -- 00000728 + X"00000000", -- 0000072C + X"00000000", -- 00000730 + X"00000000", -- 00000734 + X"00000000", -- 00000738 + X"00000000", -- 0000073C + X"00000000", -- 00000740 + X"00000000", -- 00000744 + X"00000000", -- 00000748 + X"00000000", -- 0000074C + X"00000000", -- 00000750 + X"00000000", -- 00000754 + X"00000000", -- 00000758 + X"00000000", -- 0000075C + X"00000000", -- 00000760 + X"00000000", -- 00000764 + X"00000000", -- 00000768 + X"00000000", -- 0000076C + X"00000000", -- 00000770 + X"00000000", -- 00000774 + X"00000000", -- 00000778 + X"00000000", -- 0000077C + X"00000000", -- 00000780 + X"00000000", -- 00000784 + X"00000000", -- 00000788 + X"00000000", -- 0000078C + X"00000000", -- 00000790 + X"00000000", -- 00000794 + X"00000000", -- 00000798 + X"00000000", -- 0000079C + X"00000000", -- 000007A0 + X"00000000", -- 000007A4 + X"00000000", -- 000007A8 + X"00000000", -- 000007AC + X"00000000", -- 000007B0 + X"00000000", -- 000007B4 + X"00000000", -- 000007B8 + X"00000000", -- 000007BC + X"00000000", -- 000007C0 + X"00000000", -- 000007C4 + X"00000000", -- 000007C8 + X"00000000", -- 000007CC + X"00000000", -- 000007D0 + X"00000000", -- 000007D4 + X"00000000", -- 000007D8 + X"00000000", -- 000007DC + X"00000000", -- 000007E0 + X"00000000", -- 000007E4 + X"00000000", -- 000007E8 + X"00000000", -- 000007EC + X"00000000", -- 000007F0 + X"00000000", -- 000007F4 + X"00000000", -- 000007F8 + X"00000000", -- 000007FC + X"00000000", -- 00000800 + X"00000000", -- 00000804 + X"00000000", -- 00000808 + X"00000000", -- 0000080C + X"00000000", -- 00000810 + X"00000000", -- 00000814 + X"00000000", -- 00000818 + X"00000000", -- 0000081C + X"00000000", -- 00000820 + X"00000000", -- 00000824 + X"00000000", -- 00000828 + X"00000000", -- 0000082C + X"00000000", -- 00000830 + X"00000000", -- 00000834 + X"00000000", -- 00000838 + X"00000000", -- 0000083C + X"00000000", -- 00000840 + X"00000000", -- 00000844 + X"00000000", -- 00000848 + X"00000000", -- 0000084C + X"00000000", -- 00000850 + X"00000000", -- 00000854 + X"00000000", -- 00000858 + X"00000000", -- 0000085C + X"00000000", -- 00000860 + X"00000000", -- 00000864 + X"00000000", -- 00000868 + X"00000000", -- 0000086C + X"00000000", -- 00000870 + X"00000000", -- 00000874 + X"00000000", -- 00000878 + X"00000000", -- 0000087C + X"00000000", -- 00000880 + X"00000000", -- 00000884 + X"00000000", -- 00000888 + X"00000000", -- 0000088C + X"00000000", -- 00000890 + X"00000000", -- 00000894 + X"00000000", -- 00000898 + X"00000000", -- 0000089C + X"00000000", -- 000008A0 + X"00000000", -- 000008A4 + X"00000000", -- 000008A8 + X"00000000", -- 000008AC + X"00000000", -- 000008B0 + X"00000000", -- 000008B4 + X"00000000", -- 000008B8 + X"00000000", -- 000008BC + X"00000000", -- 000008C0 + X"00000000", -- 000008C4 + X"00000000", -- 000008C8 + X"00000000", -- 000008CC + X"00000000", -- 000008D0 + X"00000000", -- 000008D4 + X"00000000", -- 000008D8 + X"00000000", -- 000008DC + X"00000000", -- 000008E0 + X"00000000", -- 000008E4 + X"00000000", -- 000008E8 + X"00000000", -- 000008EC + X"00000000", -- 000008F0 + X"00000000", -- 000008F4 + X"00000000", -- 000008F8 + X"00000000", -- 000008FC + X"00000000", -- 00000900 + X"00000000", -- 00000904 + X"00000000", -- 00000908 + X"00000000", -- 0000090C + X"00000000", -- 00000910 + X"00000000", -- 00000914 + X"00000000", -- 00000918 + X"00000000", -- 0000091C + X"00000000", -- 00000920 + X"00000000", -- 00000924 + X"00000000", -- 00000928 + X"00000000", -- 0000092C + X"00000000", -- 00000930 + X"00000000", -- 00000934 + X"00000000", -- 00000938 + X"00000000", -- 0000093C + X"00000000", -- 00000940 + X"00000000", -- 00000944 + X"00000000", -- 00000948 + X"00000000", -- 0000094C + X"00000000", -- 00000950 + X"00000000", -- 00000954 + X"00000000", -- 00000958 + X"00000000", -- 0000095C + X"00000000", -- 00000960 + X"00000000", -- 00000964 + X"00000000", -- 00000968 + X"00000000", -- 0000096C + X"00000000", -- 00000970 + X"00000000", -- 00000974 + X"00000000", -- 00000978 + X"00000000", -- 0000097C + X"00000000", -- 00000980 + X"00000000", -- 00000984 + X"00000000", -- 00000988 + X"00000000", -- 0000098C + X"00000000", -- 00000990 + X"00000000", -- 00000994 + X"00000000", -- 00000998 + X"00000000", -- 0000099C + X"00000000", -- 000009A0 + X"00000000", -- 000009A4 + X"00000000", -- 000009A8 + X"00000000", -- 000009AC + X"00000000", -- 000009B0 + X"00000000", -- 000009B4 + X"00000000", -- 000009B8 + X"00000000", -- 000009BC + X"00000000", -- 000009C0 + X"00000000", -- 000009C4 + X"00000000", -- 000009C8 + X"00000000", -- 000009CC + X"00000000", -- 000009D0 + X"00000000", -- 000009D4 + X"00000000", -- 000009D8 + X"00000000", -- 000009DC + X"00000000", -- 000009E0 + X"00000000", -- 000009E4 + X"00000000", -- 000009E8 + X"00000000", -- 000009EC + X"00000000", -- 000009F0 + X"00000000", -- 000009F4 + X"00000000", -- 000009F8 + X"00000000", -- 000009FC + X"00000000", -- 00000A00 + X"00000000", -- 00000A04 + X"00000000", -- 00000A08 + X"00000000", -- 00000A0C + X"00000000", -- 00000A10 + X"00000000", -- 00000A14 + X"00000000", -- 00000A18 + X"00000000", -- 00000A1C + X"00000000", -- 00000A20 + X"00000000", -- 00000A24 + X"00000000", -- 00000A28 + X"00000000", -- 00000A2C + X"00000000", -- 00000A30 + X"00000000", -- 00000A34 + X"00000000", -- 00000A38 + X"00000000", -- 00000A3C + X"00000000", -- 00000A40 + X"00000000", -- 00000A44 + X"00000000", -- 00000A48 + X"00000000", -- 00000A4C + X"00000000", -- 00000A50 + X"00000000", -- 00000A54 + X"00000000", -- 00000A58 + X"00000000", -- 00000A5C + X"00000000", -- 00000A60 + X"00000000", -- 00000A64 + X"00000000", -- 00000A68 + X"00000000", -- 00000A6C + X"00000000", -- 00000A70 + X"00000000", -- 00000A74 + X"00000000", -- 00000A78 + X"00000000", -- 00000A7C + X"00000000", -- 00000A80 + X"00000000", -- 00000A84 + X"00000000", -- 00000A88 + X"00000000", -- 00000A8C + X"00000000", -- 00000A90 + X"00000000", -- 00000A94 + X"00000000", -- 00000A98 + X"00000000", -- 00000A9C + X"00000000", -- 00000AA0 + X"00000000", -- 00000AA4 + X"00000000", -- 00000AA8 + X"00000000", -- 00000AAC + X"00000000", -- 00000AB0 + X"00000000", -- 00000AB4 + X"00000000", -- 00000AB8 + X"00000000", -- 00000ABC + X"00000000", -- 00000AC0 + X"00000000", -- 00000AC4 + X"00000000", -- 00000AC8 + X"00000000", -- 00000ACC + X"00000000", -- 00000AD0 + X"00000000", -- 00000AD4 + X"00000000", -- 00000AD8 + X"00000000", -- 00000ADC + X"00000000", -- 00000AE0 + X"00000000", -- 00000AE4 + X"00000000", -- 00000AE8 + X"00000000", -- 00000AEC + X"00000000", -- 00000AF0 + X"00000000", -- 00000AF4 + X"00000000", -- 00000AF8 + X"00000000", -- 00000AFC + X"00000000", -- 00000B00 + X"00000000", -- 00000B04 + X"00000000", -- 00000B08 + X"00000000", -- 00000B0C + X"00000000", -- 00000B10 + X"00000000", -- 00000B14 + X"00000000", -- 00000B18 + X"00000000", -- 00000B1C + X"00000000", -- 00000B20 + X"00000000", -- 00000B24 + X"00000000", -- 00000B28 + X"00000000", -- 00000B2C + X"00000000", -- 00000B30 + X"00000000", -- 00000B34 + X"00000000", -- 00000B38 + X"00000000", -- 00000B3C + X"00000000", -- 00000B40 + X"00000000", -- 00000B44 + X"00000000", -- 00000B48 + X"00000000", -- 00000B4C + X"00000000", -- 00000B50 + X"00000000", -- 00000B54 + X"00000000", -- 00000B58 + X"00000000", -- 00000B5C + X"00000000", -- 00000B60 + X"00000000", -- 00000B64 + X"00000000", -- 00000B68 + X"00000000", -- 00000B6C + X"00000000", -- 00000B70 + X"00000000", -- 00000B74 + X"00000000", -- 00000B78 + X"00000000", -- 00000B7C + X"00000000", -- 00000B80 + X"00000000", -- 00000B84 + X"00000000", -- 00000B88 + X"00000000", -- 00000B8C + X"00000000", -- 00000B90 + X"00000000", -- 00000B94 + X"00000000", -- 00000B98 + X"00000000", -- 00000B9C + X"00000000", -- 00000BA0 + X"00000000", -- 00000BA4 + X"00000000", -- 00000BA8 + X"00000000", -- 00000BAC + X"00000000", -- 00000BB0 + X"00000000", -- 00000BB4 + X"00000000", -- 00000BB8 + X"00000000", -- 00000BBC + X"00000000", -- 00000BC0 + X"00000000", -- 00000BC4 + X"00000000", -- 00000BC8 + X"00000000", -- 00000BCC + X"00000000", -- 00000BD0 + X"00000000", -- 00000BD4 + X"00000000", -- 00000BD8 + X"00000000", -- 00000BDC + X"00000000", -- 00000BE0 + X"00000000", -- 00000BE4 + X"00000000", -- 00000BE8 + X"00000000", -- 00000BEC + X"00000000", -- 00000BF0 + X"00000000", -- 00000BF4 + X"00000000", -- 00000BF8 + X"00000000", -- 00000BFC + X"00000000", -- 00000C00 + X"00000000", -- 00000C04 + X"00000000", -- 00000C08 + X"00000000", -- 00000C0C + X"00000000", -- 00000C10 + X"00000000", -- 00000C14 + X"00000000", -- 00000C18 + X"00000000", -- 00000C1C + X"00000000", -- 00000C20 + X"00000000", -- 00000C24 + X"00000000", -- 00000C28 + X"00000000", -- 00000C2C + X"00000000", -- 00000C30 + X"00000000", -- 00000C34 + X"00000000", -- 00000C38 + X"00000000", -- 00000C3C + X"00000000", -- 00000C40 + X"00000000", -- 00000C44 + X"00000000", -- 00000C48 + X"00000000", -- 00000C4C + X"00000000", -- 00000C50 + X"00000000", -- 00000C54 + X"00000000", -- 00000C58 + X"00000000", -- 00000C5C + X"00000000", -- 00000C60 + X"00000000", -- 00000C64 + X"00000000", -- 00000C68 + X"00000000", -- 00000C6C + X"00000000", -- 00000C70 + X"00000000", -- 00000C74 + X"00000000", -- 00000C78 + X"00000000", -- 00000C7C + X"00000000", -- 00000C80 + X"00000000", -- 00000C84 + X"00000000", -- 00000C88 + X"00000000", -- 00000C8C + X"00000000", -- 00000C90 + X"00000000", -- 00000C94 + X"00000000", -- 00000C98 + X"00000000", -- 00000C9C + X"00000000", -- 00000CA0 + X"00000000", -- 00000CA4 + X"00000000", -- 00000CA8 + X"00000000", -- 00000CAC + X"00000000", -- 00000CB0 + X"00000000", -- 00000CB4 + X"00000000", -- 00000CB8 + X"00000000", -- 00000CBC + X"00000000", -- 00000CC0 + X"00000000", -- 00000CC4 + X"00000000", -- 00000CC8 + X"00000000", -- 00000CCC + X"00000000", -- 00000CD0 + X"00000000", -- 00000CD4 + X"00000000", -- 00000CD8 + X"00000000", -- 00000CDC + X"00000000", -- 00000CE0 + X"00000000", -- 00000CE4 + X"00000000", -- 00000CE8 + X"00000000", -- 00000CEC + X"00000000", -- 00000CF0 + X"00000000", -- 00000CF4 + X"00000000", -- 00000CF8 + X"00000000", -- 00000CFC + X"00000000", -- 00000D00 + X"00000000", -- 00000D04 + X"00000000", -- 00000D08 + X"00000000", -- 00000D0C + X"00000000", -- 00000D10 + X"00000000", -- 00000D14 + X"00000000", -- 00000D18 + X"00000000", -- 00000D1C + X"00000000", -- 00000D20 + X"00000000", -- 00000D24 + X"00000000", -- 00000D28 + X"00000000", -- 00000D2C + X"00000000", -- 00000D30 + X"00000000", -- 00000D34 + X"00000000", -- 00000D38 + X"00000000", -- 00000D3C + X"00000000", -- 00000D40 + X"00000000", -- 00000D44 + X"00000000", -- 00000D48 + X"00000000", -- 00000D4C + X"00000000", -- 00000D50 + X"00000000", -- 00000D54 + X"00000000", -- 00000D58 + X"00000000", -- 00000D5C + X"00000000", -- 00000D60 + X"00000000", -- 00000D64 + X"00000000", -- 00000D68 + X"00000000", -- 00000D6C + X"00000000", -- 00000D70 + X"00000000", -- 00000D74 + X"00000000", -- 00000D78 + X"00000000", -- 00000D7C + X"00000000", -- 00000D80 + X"00000000", -- 00000D84 + X"00000000", -- 00000D88 + X"00000000", -- 00000D8C + X"00000000", -- 00000D90 + X"00000000", -- 00000D94 + X"00000000", -- 00000D98 + X"00000000", -- 00000D9C + X"00000000", -- 00000DA0 + X"00000000", -- 00000DA4 + X"00000000", -- 00000DA8 + X"00000000", -- 00000DAC + X"00000000", -- 00000DB0 + X"00000000", -- 00000DB4 + X"00000000", -- 00000DB8 + X"00000000", -- 00000DBC + X"00000000", -- 00000DC0 + X"00000000", -- 00000DC4 + X"00000000", -- 00000DC8 + X"00000000", -- 00000DCC + X"00000000", -- 00000DD0 + X"00000000", -- 00000DD4 + X"00000000", -- 00000DD8 + X"00000000", -- 00000DDC + X"00000000", -- 00000DE0 + X"00000000", -- 00000DE4 + X"00000000", -- 00000DE8 + X"00000000", -- 00000DEC + X"00000000", -- 00000DF0 + X"00000000", -- 00000DF4 + X"00000000", -- 00000DF8 + X"00000000", -- 00000DFC + X"00000000", -- 00000E00 + X"00000000", -- 00000E04 + X"00000000", -- 00000E08 + X"00000000", -- 00000E0C + X"00000000", -- 00000E10 + X"00000000", -- 00000E14 + X"00000000", -- 00000E18 + X"00000000", -- 00000E1C + X"00000000", -- 00000E20 + X"00000000", -- 00000E24 + X"00000000", -- 00000E28 + X"00000000", -- 00000E2C + X"00000000", -- 00000E30 + X"00000000", -- 00000E34 + X"00000000", -- 00000E38 + X"00000000", -- 00000E3C + X"00000000", -- 00000E40 + X"00000000", -- 00000E44 + X"00000000", -- 00000E48 + X"00000000", -- 00000E4C + X"00000000", -- 00000E50 + X"00000000", -- 00000E54 + X"00000000", -- 00000E58 + X"00000000", -- 00000E5C + X"00000000", -- 00000E60 + X"00000000", -- 00000E64 + X"00000000", -- 00000E68 + X"00000000", -- 00000E6C + X"00000000", -- 00000E70 + X"00000000", -- 00000E74 + X"00000000", -- 00000E78 + X"00000000", -- 00000E7C + X"00000000", -- 00000E80 + X"00000000", -- 00000E84 + X"00000000", -- 00000E88 + X"00000000", -- 00000E8C + X"00000000", -- 00000E90 + X"00000000", -- 00000E94 + X"00000000", -- 00000E98 + X"00000000", -- 00000E9C + X"00000000", -- 00000EA0 + X"00000000", -- 00000EA4 + X"00000000", -- 00000EA8 + X"00000000", -- 00000EAC + X"00000000", -- 00000EB0 + X"00000000", -- 00000EB4 + X"00000000", -- 00000EB8 + X"00000000", -- 00000EBC + X"00000000", -- 00000EC0 + X"00000000", -- 00000EC4 + X"00000000", -- 00000EC8 + X"00000000", -- 00000ECC + X"00000000", -- 00000ED0 + X"00000000", -- 00000ED4 + X"00000000", -- 00000ED8 + X"00000000", -- 00000EDC + X"00000000", -- 00000EE0 + X"00000000", -- 00000EE4 + X"00000000", -- 00000EE8 + X"00000000", -- 00000EEC + X"00000000", -- 00000EF0 + X"00000000", -- 00000EF4 + X"00000000", -- 00000EF8 + X"00000000", -- 00000EFC + X"00000000", -- 00000F00 + X"00000000", -- 00000F04 + X"00000000", -- 00000F08 + X"00000000", -- 00000F0C + X"00000000", -- 00000F10 + X"00000000", -- 00000F14 + X"00000000", -- 00000F18 + X"00000000", -- 00000F1C + X"00000000", -- 00000F20 + X"00000000", -- 00000F24 + X"00000000", -- 00000F28 + X"00000000", -- 00000F2C + X"00000000", -- 00000F30 + X"00000000", -- 00000F34 + X"00000000", -- 00000F38 + X"00000000", -- 00000F3C + X"00000000", -- 00000F40 + X"00000000", -- 00000F44 + X"00000000", -- 00000F48 + X"00000000", -- 00000F4C + X"00000000", -- 00000F50 + X"00000000", -- 00000F54 + X"00000000", -- 00000F58 + X"00000000", -- 00000F5C + X"00000000", -- 00000F60 + X"00000000", -- 00000F64 + X"00000000", -- 00000F68 + X"00000000", -- 00000F6C + X"00000000", -- 00000F70 + X"00000000", -- 00000F74 + X"00000000", -- 00000F78 + X"00000000", -- 00000F7C + X"00000000", -- 00000F80 + X"00000000", -- 00000F84 + X"00000000", -- 00000F88 + X"00000000", -- 00000F8C + X"00000000", -- 00000F90 + X"00000000", -- 00000F94 + X"00000000", -- 00000F98 + X"00000000", -- 00000F9C + X"00000000", -- 00000FA0 + X"00000000", -- 00000FA4 + X"00000000", -- 00000FA8 + X"00000000", -- 00000FAC + X"00000000", -- 00000FB0 + X"00000000", -- 00000FB4 + X"00000000", -- 00000FB8 + X"00000000", -- 00000FBC + X"00000000", -- 00000FC0 + X"00000000", -- 00000FC4 + X"00000000", -- 00000FC8 + X"00000000", -- 00000FCC + X"00000000", -- 00000FD0 + X"00000000", -- 00000FD4 + X"00000000", -- 00000FD8 + X"00000000", -- 00000FDC + X"00000000", -- 00000FE0 + X"00000000", -- 00000FE4 + X"00000000", -- 00000FE8 + X"00000000", -- 00000FEC + X"00000000", -- 00000FF0 + X"00000000", -- 00000FF4 + X"00000000", -- 00000FF8 + X"00000000", -- 00000FFC + X"00000000", -- 00001000 + X"00000000", -- 00001004 + X"00000000", -- 00001008 + X"00000000", -- 0000100C + X"00000000", -- 00001010 + X"00000000", -- 00001014 + X"00000000", -- 00001018 + X"00000000", -- 0000101C + X"00000000", -- 00001020 + X"00000000", -- 00001024 + X"00000000", -- 00001028 + X"00000000", -- 0000102C + X"00000000", -- 00001030 + X"00000000", -- 00001034 + X"00000000", -- 00001038 + X"00000000", -- 0000103C + X"00000000", -- 00001040 + X"00000000", -- 00001044 + X"00000000", -- 00001048 + X"00000000", -- 0000104C + X"00000000", -- 00001050 + X"00000000", -- 00001054 + X"00000000", -- 00001058 + X"00000000", -- 0000105C + X"00000000", -- 00001060 + X"00000000", -- 00001064 + X"00000000", -- 00001068 + X"00000000", -- 0000106C + X"00000000", -- 00001070 + X"00000000", -- 00001074 + X"00000000", -- 00001078 + X"00000000", -- 0000107C + X"00000000", -- 00001080 + X"00000000", -- 00001084 + X"00000000", -- 00001088 + X"00000000", -- 0000108C + X"00000000", -- 00001090 + X"00000000", -- 00001094 + X"00000000", -- 00001098 + X"00000000", -- 0000109C + X"00000000", -- 000010A0 + X"00000000", -- 000010A4 + X"00000000", -- 000010A8 + X"00000000", -- 000010AC + X"00000000", -- 000010B0 + X"00000000", -- 000010B4 + X"00000000", -- 000010B8 + X"00000000", -- 000010BC + X"00000000", -- 000010C0 + X"00000000", -- 000010C4 + X"00000000", -- 000010C8 + X"00000000", -- 000010CC + X"00000000", -- 000010D0 + X"00000000", -- 000010D4 + X"00000000", -- 000010D8 + X"00000000", -- 000010DC + X"00000000", -- 000010E0 + X"00000000", -- 000010E4 + X"00000000", -- 000010E8 + X"00000000", -- 000010EC + X"00000000", -- 000010F0 + X"00000000", -- 000010F4 + X"00000000", -- 000010F8 + X"00000000", -- 000010FC + X"00000000", -- 00001100 + X"00000000", -- 00001104 + X"00000000", -- 00001108 + X"00000000", -- 0000110C + X"00000000", -- 00001110 + X"00000000", -- 00001114 + X"00000000", -- 00001118 + X"00000000", -- 0000111C + X"00000000", -- 00001120 + X"00000000", -- 00001124 + X"00000000", -- 00001128 + X"00000000", -- 0000112C + X"00000000", -- 00001130 + X"00000000", -- 00001134 + X"00000000", -- 00001138 + X"00000000", -- 0000113C + X"00000000", -- 00001140 + X"00000000", -- 00001144 + X"00000000", -- 00001148 + X"00000000", -- 0000114C + X"00000000", -- 00001150 + X"00000000", -- 00001154 + X"00000000", -- 00001158 + X"00000000", -- 0000115C + X"00000000", -- 00001160 + X"00000000", -- 00001164 + X"00000000", -- 00001168 + X"00000000", -- 0000116C + X"00000000", -- 00001170 + X"00000000", -- 00001174 + X"00000000", -- 00001178 + X"00000000", -- 0000117C + X"00000000", -- 00001180 + X"00000000", -- 00001184 + X"00000000", -- 00001188 + X"00000000", -- 0000118C + X"00000000", -- 00001190 + X"00000000", -- 00001194 + X"00000000", -- 00001198 + X"00000000", -- 0000119C + X"00000000", -- 000011A0 + X"00000000", -- 000011A4 + X"00000000", -- 000011A8 + X"00000000", -- 000011AC + X"00000000", -- 000011B0 + X"00000000", -- 000011B4 + X"00000000", -- 000011B8 + X"00000000", -- 000011BC + X"00000000", -- 000011C0 + X"00000000", -- 000011C4 + X"00000000", -- 000011C8 + X"00000000", -- 000011CC + X"00000000", -- 000011D0 + X"00000000", -- 000011D4 + X"00000000", -- 000011D8 + X"00000000", -- 000011DC + X"00000000", -- 000011E0 + X"00000000", -- 000011E4 + X"00000000", -- 000011E8 + X"00000000", -- 000011EC + X"00000000", -- 000011F0 + X"00000000", -- 000011F4 + X"00000000", -- 000011F8 + X"00000000", -- 000011FC + X"00000000", -- 00001200 + X"00000000", -- 00001204 + X"00000000", -- 00001208 + X"00000000", -- 0000120C + X"00000000", -- 00001210 + X"00000000", -- 00001214 + X"00000000", -- 00001218 + X"00000000", -- 0000121C + X"00000000", -- 00001220 + X"00000000", -- 00001224 + X"00000000", -- 00001228 + X"00000000", -- 0000122C + X"00000000", -- 00001230 + X"00000000", -- 00001234 + X"00000000", -- 00001238 + X"00000000", -- 0000123C + X"00000000", -- 00001240 + X"00000000", -- 00001244 + X"00000000", -- 00001248 + X"00000000", -- 0000124C + X"00000000", -- 00001250 + X"00000000", -- 00001254 + X"00000000", -- 00001258 + X"00000000", -- 0000125C + X"00000000", -- 00001260 + X"00000000", -- 00001264 + X"00000000", -- 00001268 + X"00000000", -- 0000126C + X"00000000", -- 00001270 + X"00000000", -- 00001274 + X"00000000", -- 00001278 + X"00000000", -- 0000127C + X"00000000", -- 00001280 + X"00000000", -- 00001284 + X"00000000", -- 00001288 + X"00000000", -- 0000128C + X"00000000", -- 00001290 + X"00000000", -- 00001294 + X"00000000", -- 00001298 + X"00000000", -- 0000129C + X"00000000", -- 000012A0 + X"00000000", -- 000012A4 + X"00000000", -- 000012A8 + X"00000000", -- 000012AC + X"00000000", -- 000012B0 + X"00000000", -- 000012B4 + X"00000000", -- 000012B8 + X"00000000", -- 000012BC + X"00000000", -- 000012C0 + X"00000000", -- 000012C4 + X"00000000", -- 000012C8 + X"00000000", -- 000012CC + X"00000000", -- 000012D0 + X"00000000", -- 000012D4 + X"00000000", -- 000012D8 + X"00000000", -- 000012DC + X"00000000", -- 000012E0 + X"00000000", -- 000012E4 + X"00000000", -- 000012E8 + X"00000000", -- 000012EC + X"00000000", -- 000012F0 + X"00000000", -- 000012F4 + X"00000000", -- 000012F8 + X"00000000", -- 000012FC + X"00000000", -- 00001300 + X"00000000", -- 00001304 + X"00000000", -- 00001308 + X"00000000", -- 0000130C + X"00000000", -- 00001310 + X"00000000", -- 00001314 + X"00000000", -- 00001318 + X"00000000", -- 0000131C + X"00000000", -- 00001320 + X"00000000", -- 00001324 + X"00000000", -- 00001328 + X"00000000", -- 0000132C + X"00000000", -- 00001330 + X"00000000", -- 00001334 + X"00000000", -- 00001338 + X"00000000", -- 0000133C + X"00000000", -- 00001340 + X"00000000", -- 00001344 + X"00000000", -- 00001348 + X"00000000", -- 0000134C + X"00000000", -- 00001350 + X"00000000", -- 00001354 + X"00000000", -- 00001358 + X"00000000", -- 0000135C + X"00000000", -- 00001360 + X"00000000", -- 00001364 + X"00000000", -- 00001368 + X"00000000", -- 0000136C + X"00000000", -- 00001370 + X"00000000", -- 00001374 + X"00000000", -- 00001378 + X"00000000", -- 0000137C + X"00000000", -- 00001380 + X"00000000", -- 00001384 + X"00000000", -- 00001388 + X"00000000", -- 0000138C + X"00000000", -- 00001390 + X"00000000", -- 00001394 + X"00000000", -- 00001398 + X"00000000", -- 0000139C + X"00000000", -- 000013A0 + X"00000000", -- 000013A4 + X"00000000", -- 000013A8 + X"00000000", -- 000013AC + X"00000000", -- 000013B0 + X"00000000", -- 000013B4 + X"00000000", -- 000013B8 + X"00000000", -- 000013BC + X"00000000", -- 000013C0 + X"00000000", -- 000013C4 + X"00000000", -- 000013C8 + X"00000000", -- 000013CC + X"00000000", -- 000013D0 + X"00000000", -- 000013D4 + X"00000000", -- 000013D8 + X"00000000", -- 000013DC + X"00000000", -- 000013E0 + X"00000000", -- 000013E4 + X"00000000", -- 000013E8 + X"00000000", -- 000013EC + X"00000000", -- 000013F0 + X"00000000", -- 000013F4 + X"00000000", -- 000013F8 + X"00000000", -- 000013FC + X"00000000", -- 00001400 + X"00000000", -- 00001404 + X"00000000", -- 00001408 + X"00000000", -- 0000140C + X"00000000", -- 00001410 + X"00000000", -- 00001414 + X"00000000", -- 00001418 + X"00000000", -- 0000141C + X"00000000", -- 00001420 + X"00000000", -- 00001424 + X"00000000", -- 00001428 + X"00000000", -- 0000142C + X"00000000", -- 00001430 + X"00000000", -- 00001434 + X"00000000", -- 00001438 + X"00000000", -- 0000143C + X"00000000", -- 00001440 + X"00000000", -- 00001444 + X"00000000", -- 00001448 + X"00000000", -- 0000144C + X"00000000", -- 00001450 + X"00000000", -- 00001454 + X"00000000", -- 00001458 + X"00000000", -- 0000145C + X"00000000", -- 00001460 + X"00000000", -- 00001464 + X"00000000", -- 00001468 + X"00000000", -- 0000146C + X"00000000", -- 00001470 + X"00000000", -- 00001474 + X"00000000", -- 00001478 + X"00000000", -- 0000147C + X"00000000", -- 00001480 + X"00000000", -- 00001484 + X"00000000", -- 00001488 + X"00000000", -- 0000148C + X"00000000", -- 00001490 + X"00000000", -- 00001494 + X"00000000", -- 00001498 + X"00000000", -- 0000149C + X"00000000", -- 000014A0 + X"00000000", -- 000014A4 + X"00000000", -- 000014A8 + X"00000000", -- 000014AC + X"00000000", -- 000014B0 + X"00000000", -- 000014B4 + X"00000000", -- 000014B8 + X"00000000", -- 000014BC + X"00000000", -- 000014C0 + X"00000000", -- 000014C4 + X"00000000", -- 000014C8 + X"00000000", -- 000014CC + X"00000000", -- 000014D0 + X"00000000", -- 000014D4 + X"00000000", -- 000014D8 + X"00000000", -- 000014DC + X"00000000", -- 000014E0 + X"00000000", -- 000014E4 + X"00000000", -- 000014E8 + X"00000000", -- 000014EC + X"00000000", -- 000014F0 + X"00000000", -- 000014F4 + X"00000000", -- 000014F8 + X"00000000", -- 000014FC + X"00000000", -- 00001500 + X"00000000", -- 00001504 + X"00000000", -- 00001508 + X"00000000", -- 0000150C + X"00000000", -- 00001510 + X"00000000", -- 00001514 + X"00000000", -- 00001518 + X"00000000", -- 0000151C + X"00000000", -- 00001520 + X"00000000", -- 00001524 + X"00000000", -- 00001528 + X"00000000", -- 0000152C + X"00000000", -- 00001530 + X"00000000", -- 00001534 + X"00000000", -- 00001538 + X"00000000", -- 0000153C + X"00000000", -- 00001540 + X"00000000", -- 00001544 + X"00000000", -- 00001548 + X"00000000", -- 0000154C + X"00000000", -- 00001550 + X"00000000", -- 00001554 + X"00000000", -- 00001558 + X"00000000", -- 0000155C + X"00000000", -- 00001560 + X"00000000", -- 00001564 + X"00000000", -- 00001568 + X"00000000", -- 0000156C + X"00000000", -- 00001570 + X"00000000", -- 00001574 + X"00000000", -- 00001578 + X"00000000", -- 0000157C + X"00000000", -- 00001580 + X"00000000", -- 00001584 + X"00000000", -- 00001588 + X"00000000", -- 0000158C + X"00000000", -- 00001590 + X"00000000", -- 00001594 + X"00000000", -- 00001598 + X"00000000", -- 0000159C + X"00000000", -- 000015A0 + X"00000000", -- 000015A4 + X"00000000", -- 000015A8 + X"00000000", -- 000015AC + X"00000000", -- 000015B0 + X"00000000", -- 000015B4 + X"00000000", -- 000015B8 + X"00000000", -- 000015BC + X"00000000", -- 000015C0 + X"00000000", -- 000015C4 + X"00000000", -- 000015C8 + X"00000000", -- 000015CC + X"00000000", -- 000015D0 + X"00000000", -- 000015D4 + X"00000000", -- 000015D8 + X"00000000", -- 000015DC + X"00000000", -- 000015E0 + X"00000000", -- 000015E4 + X"00000000", -- 000015E8 + X"00000000", -- 000015EC + X"00000000", -- 000015F0 + X"00000000", -- 000015F4 + X"00000000", -- 000015F8 + X"00000000", -- 000015FC + X"00000000", -- 00001600 + X"00000000", -- 00001604 + X"00000000", -- 00001608 + X"00000000", -- 0000160C + X"00000000", -- 00001610 + X"00000000", -- 00001614 + X"00000000", -- 00001618 + X"00000000", -- 0000161C + X"00000000", -- 00001620 + X"00000000", -- 00001624 + X"00000000", -- 00001628 + X"00000000", -- 0000162C + X"00000000", -- 00001630 + X"00000000", -- 00001634 + X"00000000", -- 00001638 + X"00000000", -- 0000163C + X"00000000", -- 00001640 + X"00000000", -- 00001644 + X"00000000", -- 00001648 + X"00000000", -- 0000164C + X"00000000", -- 00001650 + X"00000000", -- 00001654 + X"00000000", -- 00001658 + X"00000000", -- 0000165C + X"00000000", -- 00001660 + X"00000000", -- 00001664 + X"00000000", -- 00001668 + X"00000000", -- 0000166C + X"00000000", -- 00001670 + X"00000000", -- 00001674 + X"00000000", -- 00001678 + X"00000000", -- 0000167C + X"00000000", -- 00001680 + X"00000000", -- 00001684 + X"00000000", -- 00001688 + X"00000000", -- 0000168C + X"00000000", -- 00001690 + X"00000000", -- 00001694 + X"00000000", -- 00001698 + X"00000000", -- 0000169C + X"00000000", -- 000016A0 + X"00000000", -- 000016A4 + X"00000000", -- 000016A8 + X"00000000", -- 000016AC + X"00000000", -- 000016B0 + X"00000000", -- 000016B4 + X"00000000", -- 000016B8 + X"00000000", -- 000016BC + X"00000000", -- 000016C0 + X"00000000", -- 000016C4 + X"00000000", -- 000016C8 + X"00000000", -- 000016CC + X"00000000", -- 000016D0 + X"00000000", -- 000016D4 + X"00000000", -- 000016D8 + X"00000000", -- 000016DC + X"00000000", -- 000016E0 + X"00000000", -- 000016E4 + X"00000000", -- 000016E8 + X"00000000", -- 000016EC + X"00000000", -- 000016F0 + X"00000000", -- 000016F4 + X"00000000", -- 000016F8 + X"00000000", -- 000016FC + X"00000000", -- 00001700 + X"00000000", -- 00001704 + X"00000000", -- 00001708 + X"00000000", -- 0000170C + X"00000000", -- 00001710 + X"00000000", -- 00001714 + X"00000000", -- 00001718 + X"00000000", -- 0000171C + X"00000000", -- 00001720 + X"00000000", -- 00001724 + X"00000000", -- 00001728 + X"00000000", -- 0000172C + X"00000000", -- 00001730 + X"00000000", -- 00001734 + X"00000000", -- 00001738 + X"00000000", -- 0000173C + X"00000000", -- 00001740 + X"00000000", -- 00001744 + X"00000000", -- 00001748 + X"00000000", -- 0000174C + X"00000000", -- 00001750 + X"00000000", -- 00001754 + X"00000000", -- 00001758 + X"00000000", -- 0000175C + X"00000000", -- 00001760 + X"00000000", -- 00001764 + X"00000000", -- 00001768 + X"00000000", -- 0000176C + X"00000000", -- 00001770 + X"00000000", -- 00001774 + X"00000000", -- 00001778 + X"00000000", -- 0000177C + X"00000000", -- 00001780 + X"00000000", -- 00001784 + X"00000000", -- 00001788 + X"00000000", -- 0000178C + X"00000000", -- 00001790 + X"00000000", -- 00001794 + X"00000000", -- 00001798 + X"00000000", -- 0000179C + X"00000000", -- 000017A0 + X"00000000", -- 000017A4 + X"00000000", -- 000017A8 + X"00000000", -- 000017AC + X"00000000", -- 000017B0 + X"00000000", -- 000017B4 + X"00000000", -- 000017B8 + X"00000000", -- 000017BC + X"00000000", -- 000017C0 + X"00000000", -- 000017C4 + X"00000000", -- 000017C8 + X"00000000", -- 000017CC + X"00000000", -- 000017D0 + X"00000000", -- 000017D4 + X"00000000", -- 000017D8 + X"00000000", -- 000017DC + X"00000000", -- 000017E0 + X"00000000", -- 000017E4 + X"00000000", -- 000017E8 + X"00000000", -- 000017EC + X"00000000", -- 000017F0 + X"00000000", -- 000017F4 + X"00000000", -- 000017F8 + X"00000000", -- 000017FC + X"00000000", -- 00001800 + X"00000000", -- 00001804 + X"00000000", -- 00001808 + X"00000000", -- 0000180C + X"00000000", -- 00001810 + X"00000000", -- 00001814 + X"00000000", -- 00001818 + X"00000000", -- 0000181C + X"00000000", -- 00001820 + X"00000000", -- 00001824 + X"00000000", -- 00001828 + X"00000000", -- 0000182C + X"00000000", -- 00001830 + X"00000000", -- 00001834 + X"00000000", -- 00001838 + X"00000000", -- 0000183C + X"00000000", -- 00001840 + X"00000000", -- 00001844 + X"00000000", -- 00001848 + X"00000000", -- 0000184C + X"00000000", -- 00001850 + X"00000000", -- 00001854 + X"00000000", -- 00001858 + X"00000000", -- 0000185C + X"00000000", -- 00001860 + X"00000000", -- 00001864 + X"00000000", -- 00001868 + X"00000000", -- 0000186C + X"00000000", -- 00001870 + X"00000000", -- 00001874 + X"00000000", -- 00001878 + X"00000000", -- 0000187C + X"00000000", -- 00001880 + X"00000000", -- 00001884 + X"00000000", -- 00001888 + X"00000000", -- 0000188C + X"00000000", -- 00001890 + X"00000000", -- 00001894 + X"00000000", -- 00001898 + X"00000000", -- 0000189C + X"00000000", -- 000018A0 + X"00000000", -- 000018A4 + X"00000000", -- 000018A8 + X"00000000", -- 000018AC + X"00000000", -- 000018B0 + X"00000000", -- 000018B4 + X"00000000", -- 000018B8 + X"00000000", -- 000018BC + X"00000000", -- 000018C0 + X"00000000", -- 000018C4 + X"00000000", -- 000018C8 + X"00000000", -- 000018CC + X"00000000", -- 000018D0 + X"00000000", -- 000018D4 + X"00000000", -- 000018D8 + X"00000000", -- 000018DC + X"00000000", -- 000018E0 + X"00000000", -- 000018E4 + X"00000000", -- 000018E8 + X"00000000", -- 000018EC + X"00000000", -- 000018F0 + X"00000000", -- 000018F4 + X"00000000", -- 000018F8 + X"00000000", -- 000018FC + X"00000000", -- 00001900 + X"00000000", -- 00001904 + X"00000000", -- 00001908 + X"00000000", -- 0000190C + X"00000000", -- 00001910 + X"00000000", -- 00001914 + X"00000000", -- 00001918 + X"00000000", -- 0000191C + X"00000000", -- 00001920 + X"00000000", -- 00001924 + X"00000000", -- 00001928 + X"00000000", -- 0000192C + X"00000000", -- 00001930 + X"00000000", -- 00001934 + X"00000000", -- 00001938 + X"00000000", -- 0000193C + X"00000000", -- 00001940 + X"00000000", -- 00001944 + X"00000000", -- 00001948 + X"00000000", -- 0000194C + X"00000000", -- 00001950 + X"00000000", -- 00001954 + X"00000000", -- 00001958 + X"00000000", -- 0000195C + X"00000000", -- 00001960 + X"00000000", -- 00001964 + X"00000000", -- 00001968 + X"00000000", -- 0000196C + X"00000000", -- 00001970 + X"00000000", -- 00001974 + X"00000000", -- 00001978 + X"00000000", -- 0000197C + X"00000000", -- 00001980 + X"00000000", -- 00001984 + X"00000000", -- 00001988 + X"00000000", -- 0000198C + X"00000000", -- 00001990 + X"00000000", -- 00001994 + X"00000000", -- 00001998 + X"00000000", -- 0000199C + X"00000000", -- 000019A0 + X"00000000", -- 000019A4 + X"00000000", -- 000019A8 + X"00000000", -- 000019AC + X"00000000", -- 000019B0 + X"00000000", -- 000019B4 + X"00000000", -- 000019B8 + X"00000000", -- 000019BC + X"00000000", -- 000019C0 + X"00000000", -- 000019C4 + X"00000000", -- 000019C8 + X"00000000", -- 000019CC + X"00000000", -- 000019D0 + X"00000000", -- 000019D4 + X"00000000", -- 000019D8 + X"00000000", -- 000019DC + X"00000000", -- 000019E0 + X"00000000", -- 000019E4 + X"00000000", -- 000019E8 + X"00000000", -- 000019EC + X"00000000", -- 000019F0 + X"00000000", -- 000019F4 + X"00000000", -- 000019F8 + X"00000000", -- 000019FC + X"00000000", -- 00001A00 + X"00000000", -- 00001A04 + X"00000000", -- 00001A08 + X"00000000", -- 00001A0C + X"00000000", -- 00001A10 + X"00000000", -- 00001A14 + X"00000000", -- 00001A18 + X"00000000", -- 00001A1C + X"00000000", -- 00001A20 + X"00000000", -- 00001A24 + X"00000000", -- 00001A28 + X"00000000", -- 00001A2C + X"00000000", -- 00001A30 + X"00000000", -- 00001A34 + X"00000000", -- 00001A38 + X"00000000", -- 00001A3C + X"00000000", -- 00001A40 + X"00000000", -- 00001A44 + X"00000000", -- 00001A48 + X"00000000", -- 00001A4C + X"00000000", -- 00001A50 + X"00000000", -- 00001A54 + X"00000000", -- 00001A58 + X"00000000", -- 00001A5C + X"00000000", -- 00001A60 + X"00000000", -- 00001A64 + X"00000000", -- 00001A68 + X"00000000", -- 00001A6C + X"00000000", -- 00001A70 + X"00000000", -- 00001A74 + X"00000000", -- 00001A78 + X"00000000", -- 00001A7C + X"00000000", -- 00001A80 + X"00000000", -- 00001A84 + X"00000000", -- 00001A88 + X"00000000", -- 00001A8C + X"00000000", -- 00001A90 + X"00000000", -- 00001A94 + X"00000000", -- 00001A98 + X"00000000", -- 00001A9C + X"00000000", -- 00001AA0 + X"00000000", -- 00001AA4 + X"00000000", -- 00001AA8 + X"00000000", -- 00001AAC + X"00000000", -- 00001AB0 + X"00000000", -- 00001AB4 + X"00000000", -- 00001AB8 + X"00000000", -- 00001ABC + X"00000000", -- 00001AC0 + X"00000000", -- 00001AC4 + X"00000000", -- 00001AC8 + X"00000000", -- 00001ACC + X"00000000", -- 00001AD0 + X"00000000", -- 00001AD4 + X"00000000", -- 00001AD8 + X"00000000", -- 00001ADC + X"00000000", -- 00001AE0 + X"00000000", -- 00001AE4 + X"00000000", -- 00001AE8 + X"00000000", -- 00001AEC + X"00000000", -- 00001AF0 + X"00000000", -- 00001AF4 + X"00000000", -- 00001AF8 + X"00000000", -- 00001AFC + X"00000000", -- 00001B00 + X"00000000", -- 00001B04 + X"00000000", -- 00001B08 + X"00000000", -- 00001B0C + X"00000000", -- 00001B10 + X"00000000", -- 00001B14 + X"00000000", -- 00001B18 + X"00000000", -- 00001B1C + X"00000000", -- 00001B20 + X"00000000", -- 00001B24 + X"00000000", -- 00001B28 + X"00000000", -- 00001B2C + X"00000000", -- 00001B30 + X"00000000", -- 00001B34 + X"00000000", -- 00001B38 + X"00000000", -- 00001B3C + X"00000000", -- 00001B40 + X"00000000", -- 00001B44 + X"00000000", -- 00001B48 + X"00000000", -- 00001B4C + X"00000000", -- 00001B50 + X"00000000", -- 00001B54 + X"00000000", -- 00001B58 + X"00000000", -- 00001B5C + X"00000000", -- 00001B60 + X"00000000", -- 00001B64 + X"00000000", -- 00001B68 + X"00000000", -- 00001B6C + X"00000000", -- 00001B70 + X"00000000", -- 00001B74 + X"00000000", -- 00001B78 + X"00000000", -- 00001B7C + X"00000000", -- 00001B80 + X"00000000", -- 00001B84 + X"00000000", -- 00001B88 + X"00000000", -- 00001B8C + X"00000000", -- 00001B90 + X"00000000", -- 00001B94 + X"00000000", -- 00001B98 + X"00000000", -- 00001B9C + X"00000000", -- 00001BA0 + X"00000000", -- 00001BA4 + X"00000000", -- 00001BA8 + X"00000000", -- 00001BAC + X"00000000", -- 00001BB0 + X"00000000", -- 00001BB4 + X"00000000", -- 00001BB8 + X"00000000", -- 00001BBC + X"00000000", -- 00001BC0 + X"00000000", -- 00001BC4 + X"00000000", -- 00001BC8 + X"00000000", -- 00001BCC + X"00000000", -- 00001BD0 + X"00000000", -- 00001BD4 + X"00000000", -- 00001BD8 + X"00000000", -- 00001BDC + X"00000000", -- 00001BE0 + X"00000000", -- 00001BE4 + X"00000000", -- 00001BE8 + X"00000000", -- 00001BEC + X"00000000", -- 00001BF0 + X"00000000", -- 00001BF4 + X"00000000", -- 00001BF8 + X"00000000", -- 00001BFC + X"00000000", -- 00001C00 + X"00000000", -- 00001C04 + X"00000000", -- 00001C08 + X"00000000", -- 00001C0C + X"00000000", -- 00001C10 + X"00000000", -- 00001C14 + X"00000000", -- 00001C18 + X"00000000", -- 00001C1C + X"00000000", -- 00001C20 + X"00000000", -- 00001C24 + X"00000000", -- 00001C28 + X"00000000", -- 00001C2C + X"00000000", -- 00001C30 + X"00000000", -- 00001C34 + X"00000000", -- 00001C38 + X"00000000", -- 00001C3C + X"00000000", -- 00001C40 + X"00000000", -- 00001C44 + X"00000000", -- 00001C48 + X"00000000", -- 00001C4C + X"00000000", -- 00001C50 + X"00000000", -- 00001C54 + X"00000000", -- 00001C58 + X"00000000", -- 00001C5C + X"00000000", -- 00001C60 + X"00000000", -- 00001C64 + X"00000000", -- 00001C68 + X"00000000", -- 00001C6C + X"00000000", -- 00001C70 + X"00000000", -- 00001C74 + X"00000000", -- 00001C78 + X"00000000", -- 00001C7C + X"00000000", -- 00001C80 + X"00000000", -- 00001C84 + X"00000000", -- 00001C88 + X"00000000", -- 00001C8C + X"00000000", -- 00001C90 + X"00000000", -- 00001C94 + X"00000000", -- 00001C98 + X"00000000", -- 00001C9C + X"00000000", -- 00001CA0 + X"00000000", -- 00001CA4 + X"00000000", -- 00001CA8 + X"00000000", -- 00001CAC + X"00000000", -- 00001CB0 + X"00000000", -- 00001CB4 + X"00000000", -- 00001CB8 + X"00000000", -- 00001CBC + X"00000000", -- 00001CC0 + X"00000000", -- 00001CC4 + X"00000000", -- 00001CC8 + X"00000000", -- 00001CCC + X"00000000", -- 00001CD0 + X"00000000", -- 00001CD4 + X"00000000", -- 00001CD8 + X"00000000", -- 00001CDC + X"00000000", -- 00001CE0 + X"00000000", -- 00001CE4 + X"00000000", -- 00001CE8 + X"00000000", -- 00001CEC + X"00000000", -- 00001CF0 + X"00000000", -- 00001CF4 + X"00000000", -- 00001CF8 + X"00000000", -- 00001CFC + X"00000000", -- 00001D00 + X"00000000", -- 00001D04 + X"00000000", -- 00001D08 + X"00000000", -- 00001D0C + X"00000000", -- 00001D10 + X"00000000", -- 00001D14 + X"00000000", -- 00001D18 + X"00000000", -- 00001D1C + X"00000000", -- 00001D20 + X"00000000", -- 00001D24 + X"00000000", -- 00001D28 + X"00000000", -- 00001D2C + X"00000000", -- 00001D30 + X"00000000", -- 00001D34 + X"00000000", -- 00001D38 + X"00000000", -- 00001D3C + X"00000000", -- 00001D40 + X"00000000", -- 00001D44 + X"00000000", -- 00001D48 + X"00000000", -- 00001D4C + X"00000000", -- 00001D50 + X"00000000", -- 00001D54 + X"00000000", -- 00001D58 + X"00000000", -- 00001D5C + X"00000000", -- 00001D60 + X"00000000", -- 00001D64 + X"00000000", -- 00001D68 + X"00000000", -- 00001D6C + X"00000000", -- 00001D70 + X"00000000", -- 00001D74 + X"00000000", -- 00001D78 + X"00000000", -- 00001D7C + X"00000000", -- 00001D80 + X"00000000", -- 00001D84 + X"00000000", -- 00001D88 + X"00000000", -- 00001D8C + X"00000000", -- 00001D90 + X"00000000", -- 00001D94 + X"00000000", -- 00001D98 + X"00000000", -- 00001D9C + X"00000000", -- 00001DA0 + X"00000000", -- 00001DA4 + X"00000000", -- 00001DA8 + X"00000000", -- 00001DAC + X"00000000", -- 00001DB0 + X"00000000", -- 00001DB4 + X"00000000", -- 00001DB8 + X"00000000", -- 00001DBC + X"00000000", -- 00001DC0 + X"00000000", -- 00001DC4 + X"00000000", -- 00001DC8 + X"00000000", -- 00001DCC + X"00000000", -- 00001DD0 + X"00000000", -- 00001DD4 + X"00000000", -- 00001DD8 + X"00000000", -- 00001DDC + X"00000000", -- 00001DE0 + X"00000000", -- 00001DE4 + X"00000000", -- 00001DE8 + X"00000000", -- 00001DEC + X"00000000", -- 00001DF0 + X"00000000", -- 00001DF4 + X"00000000", -- 00001DF8 + X"00000000", -- 00001DFC + X"00000000", -- 00001E00 + X"00000000", -- 00001E04 + X"00000000", -- 00001E08 + X"00000000", -- 00001E0C + X"00000000", -- 00001E10 + X"00000000", -- 00001E14 + X"00000000", -- 00001E18 + X"00000000", -- 00001E1C + X"00000000", -- 00001E20 + X"00000000", -- 00001E24 + X"00000000", -- 00001E28 + X"00000000", -- 00001E2C + X"00000000", -- 00001E30 + X"00000000", -- 00001E34 + X"00000000", -- 00001E38 + X"00000000", -- 00001E3C + X"00000000", -- 00001E40 + X"00000000", -- 00001E44 + X"00000000", -- 00001E48 + X"00000000", -- 00001E4C + X"00000000", -- 00001E50 + X"00000000", -- 00001E54 + X"00000000", -- 00001E58 + X"00000000", -- 00001E5C + X"00000000", -- 00001E60 + X"00000000", -- 00001E64 + X"00000000", -- 00001E68 + X"00000000", -- 00001E6C + X"00000000", -- 00001E70 + X"00000000", -- 00001E74 + X"00000000", -- 00001E78 + X"00000000", -- 00001E7C + X"00000000", -- 00001E80 + X"00000000", -- 00001E84 + X"00000000", -- 00001E88 + X"00000000", -- 00001E8C + X"00000000", -- 00001E90 + X"00000000", -- 00001E94 + X"00000000", -- 00001E98 + X"00000000", -- 00001E9C + X"00000000", -- 00001EA0 + X"00000000", -- 00001EA4 + X"00000000", -- 00001EA8 + X"00000000", -- 00001EAC + X"00000000", -- 00001EB0 + X"00000000", -- 00001EB4 + X"00000000", -- 00001EB8 + X"00000000", -- 00001EBC + X"00000000", -- 00001EC0 + X"00000000", -- 00001EC4 + X"00000000", -- 00001EC8 + X"00000000", -- 00001ECC + X"00000000", -- 00001ED0 + X"00000000", -- 00001ED4 + X"00000000", -- 00001ED8 + X"00000000", -- 00001EDC + X"00000000", -- 00001EE0 + X"00000000", -- 00001EE4 + X"00000000", -- 00001EE8 + X"00000000", -- 00001EEC + X"00000000", -- 00001EF0 + X"00000000", -- 00001EF4 + X"00000000", -- 00001EF8 + X"00000000", -- 00001EFC + X"00000000", -- 00001F00 + X"00000000", -- 00001F04 + X"00000000", -- 00001F08 + X"00000000", -- 00001F0C + X"00000000", -- 00001F10 + X"00000000", -- 00001F14 + X"00000000", -- 00001F18 + X"00000000", -- 00001F1C + X"00000000", -- 00001F20 + X"00000000", -- 00001F24 + X"00000000", -- 00001F28 + X"00000000", -- 00001F2C + X"00000000", -- 00001F30 + X"00000000", -- 00001F34 + X"00000000", -- 00001F38 + X"00000000", -- 00001F3C + X"00000000", -- 00001F40 + X"00000000", -- 00001F44 + X"00000000", -- 00001F48 + X"00000000", -- 00001F4C + X"00000000", -- 00001F50 + X"00000000", -- 00001F54 + X"00000000", -- 00001F58 + X"00000000", -- 00001F5C + X"00000000", -- 00001F60 + X"00000000", -- 00001F64 + X"00000000", -- 00001F68 + X"00000000", -- 00001F6C + X"00000000", -- 00001F70 + X"00000000", -- 00001F74 + X"00000000", -- 00001F78 + X"00000000", -- 00001F7C + X"00000000", -- 00001F80 + X"00000000", -- 00001F84 + X"00000000", -- 00001F88 + X"00000000", -- 00001F8C + X"00000000", -- 00001F90 + X"00000000", -- 00001F94 + X"00000000", -- 00001F98 + X"00000000", -- 00001F9C + X"00000000", -- 00001FA0 + X"00000000", -- 00001FA4 + X"00000000", -- 00001FA8 + X"00000000", -- 00001FAC + X"00000000", -- 00001FB0 + X"00000000", -- 00001FB4 + X"00000000", -- 00001FB8 + X"00000000", -- 00001FBC + X"00000000", -- 00001FC0 + X"00000000", -- 00001FC4 + X"00000000", -- 00001FC8 + X"00000000", -- 00001FCC + X"00000000", -- 00001FD0 + X"00000000", -- 00001FD4 + X"00000000", -- 00001FD8 + X"00000000", -- 00001FDC + X"00000000", -- 00001FE0 + X"00000000", -- 00001FE4 + X"00000000", -- 00001FE8 + X"00000000", -- 00001FEC + X"00000000", -- 00001FF0 + X"00000000", -- 00001FF4 + X"00000000", -- 00001FF8 + X"00000000" -- 00001FFC + ); + +begin + +PROM_READ: + process(clk) + begin + if rising_edge(clk) and ce = '1' then + dout <= word_array(to_integer(addr(12 downto 2))); + end if; + end process; + + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto jtag_ld_dout'length); + jtag_ld_din <= user_regi(jtag_ld_dout'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto jtag_ld_dout'length => '0') & jtag_ld_dout; + + end if; + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + word_array(to_integer(jtag_ld_addr(10 downto 0))) <= jtag_ld_din; + else + jtag_ld_dout <= word_array(to_integer(jtag_ld_addr(10 downto 0))); + end if; + end if; + end process; + +end data; diff --git a/lib/CPUs/MIPS/src/irom_hello.vhd b/lib/CPUs/MIPS/src/irom_hello.vhd new file mode 100644 index 0000000..21ee2eb --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_hello.vhd @@ -0,0 +1,320 @@ +------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + clk : in STD_LOGIC; + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + X"3C1D7FFF", -- 00000000 + X"0C100014", -- 00000004 + X"37BDEFFC", -- 00000008 + X"24080002", -- 0000000C + X"0107102A", -- 00000010 + X"ACC40000", -- 00000014 + X"1040000B", -- 00000018 + X"ACC50004", -- 0000001C + X"24C60008", -- 00000020 + X"24E8FFFE", -- 00000024 + X"8CC2FFF8", -- 00000028 + X"8CC3FFFC", -- 0000002C + X"2508FFFF", -- 00000030 + X"00431021", -- 00000034 + X"ACC20000", -- 00000038 + X"1500FFFA", -- 0000003C + X"24C60004", -- 00000040 + X"00E04021", -- 00000044 + X"03E00008", -- 00000048 + X"01001021", -- 0000004C + X"27BDFF78", -- 00000050 + X"3C021003", -- 00000054 + X"3C030001", -- 00000058 + X"AFB60078", -- 0000005C + X"3456FFFC", -- 00000060 + X"3C02AAAA", -- 00000064 + X"AFB7007C", -- 00000068 + X"AFB50074", -- 0000006C + X"AFB40070", -- 00000070 + X"AFB20068", -- 00000074 + X"AFB00060", -- 00000078 + X"AFBF0080", -- 0000007C + X"AFB3006C", -- 00000080 + X"AFB10064", -- 00000084 + X"AEC00000", -- 00000088 + X"3450AAAA", -- 0000008C + X"347786A0", -- 00000090 + X"27B20010", -- 00000094 + X"24150014", -- 00000098 + X"3474869F", -- 0000009C + X"00009821", -- 000000A0 + X"00002021", -- 000000A4 + X"02401021", -- 000000A8 + X"24060013", -- 000000AC + X"24C6FFFF", -- 000000B0 + X"AC500000", -- 000000B4 + X"04C1FFFD", -- 000000B8 + X"24420004", -- 000000BC + X"02041026", -- 000000C0 + X"24910001", -- 000000C4 + X"24420001", -- 000000C8 + X"02202821", -- 000000CC + X"27A60010", -- 000000D0 + X"24070014", -- 000000D4 + X"0C100003", -- 000000D8 + X"00028040", -- 000000DC + X"24070002", -- 000000E0 + X"26450008", -- 000000E4 + X"0810003E", -- 000000E8 + X"24060011", -- 000000EC + X"04C0000A", -- 000000F0 + X"00000000", -- 000000F4 + X"8CA20000", -- 000000F8 + X"8CA3FFFC", -- 000000FC + X"8CA4FFF8", -- 00000100 + X"00431023", -- 00000104 + X"24C6FFFF", -- 00000108 + X"1482FFF8", -- 0000010C + X"24A50004", -- 00000110 + X"04C1FFF8", -- 00000114 + X"24E70001", -- 00000118 + X"10F5000C", -- 0000011C + X"00000000", -- 00000120 + X"0291102A", -- 00000124 + X"1040FFDF", -- 00000128 + X"02202021", -- 0000012C + X"1677FFDB", -- 00000130 + X"00009821", -- 00000134 + X"8EC20000", -- 00000138 + X"00000000", -- 0000013C + X"24420001", -- 00000140 + X"AEC20000", -- 00000144 + X"0810002A", -- 00000148 + X"00002021", -- 0000014C + X"08100049", -- 00000150 + X"26730001", -- 00000154 + X"00000000", -- 00000158 + X"00000000", -- 0000015C + X"00000000", -- 00000160 + X"00000000", -- 00000164 + X"00000000", -- 00000168 + X"00000000", -- 0000016C + X"00000000", -- 00000170 + X"00000000", -- 00000174 + X"00000000", -- 00000178 + X"00000000", -- 0000017C + X"00000000", -- 00000180 + X"00000000", -- 00000184 + X"00000000", -- 00000188 + X"00000000", -- 0000018C + X"00000000", -- 00000190 + X"00000000", -- 00000194 + X"00000000", -- 00000198 + X"00000000", -- 0000019C + X"00000000", -- 000001A0 + X"00000000", -- 000001A4 + X"00000000", -- 000001A8 + X"00000000", -- 000001AC + X"00000000", -- 000001B0 + X"00000000", -- 000001B4 + X"00000000", -- 000001B8 + X"00000000", -- 000001BC + X"00000000", -- 000001C0 + X"00000000", -- 000001C4 + X"00000000", -- 000001C8 + X"00000000", -- 000001CC + X"00000000", -- 000001D0 + X"00000000", -- 000001D4 + X"00000000", -- 000001D8 + X"00000000", -- 000001DC + X"00000000", -- 000001E0 + X"00000000", -- 000001E4 + X"00000000", -- 000001E8 + X"00000000", -- 000001EC + X"00000000", -- 000001F0 + X"00000000", -- 000001F4 + X"00000000", -- 000001F8 + X"00000000", -- 000001FC + X"00000000", -- 00000200 + X"00000000", -- 00000204 + X"00000000", -- 00000208 + X"00000000", -- 0000020C + X"00000000", -- 00000210 + X"00000000", -- 00000214 + X"00000000", -- 00000218 + X"00000000", -- 0000021C + X"00000000", -- 00000220 + X"00000000", -- 00000224 + X"00000000", -- 00000228 + X"00000000", -- 0000022C + X"00000000", -- 00000230 + X"00000000", -- 00000234 + X"00000000", -- 00000238 + X"00000000", -- 0000023C + X"00000000", -- 00000240 + X"00000000", -- 00000244 + X"00000000", -- 00000248 + X"00000000", -- 0000024C + X"00000000", -- 00000250 + X"00000000", -- 00000254 + X"00000000", -- 00000258 + X"00000000", -- 0000025C + X"00000000", -- 00000260 + X"00000000", -- 00000264 + X"00000000", -- 00000268 + X"00000000", -- 0000026C + X"00000000", -- 00000270 + X"00000000", -- 00000274 + X"00000000", -- 00000278 + X"00000000", -- 0000027C + X"00000000", -- 00000280 + X"00000000", -- 00000284 + X"00000000", -- 00000288 + X"00000000", -- 0000028C + X"00000000", -- 00000290 + X"00000000", -- 00000294 + X"00000000", -- 00000298 + X"00000000", -- 0000029C + X"00000000", -- 000002A0 + X"00000000", -- 000002A4 + X"00000000", -- 000002A8 + X"00000000", -- 000002AC + X"00000000", -- 000002B0 + X"00000000", -- 000002B4 + X"00000000", -- 000002B8 + X"00000000", -- 000002BC + X"00000000", -- 000002C0 + X"00000000", -- 000002C4 + X"00000000", -- 000002C8 + X"00000000", -- 000002CC + X"00000000", -- 000002D0 + X"00000000", -- 000002D4 + X"00000000", -- 000002D8 + X"00000000", -- 000002DC + X"00000000", -- 000002E0 + X"00000000", -- 000002E4 + X"00000000", -- 000002E8 + X"00000000", -- 000002EC + X"00000000", -- 000002F0 + X"00000000", -- 000002F4 + X"00000000", -- 000002F8 + X"00000000", -- 000002FC + X"00000000", -- 00000300 + X"00000000", -- 00000304 + X"00000000", -- 00000308 + X"00000000", -- 0000030C + X"00000000", -- 00000310 + X"00000000", -- 00000314 + X"00000000", -- 00000318 + X"00000000", -- 0000031C + X"00000000", -- 00000320 + X"00000000", -- 00000324 + X"00000000", -- 00000328 + X"00000000", -- 0000032C + X"00000000", -- 00000330 + X"00000000", -- 00000334 + X"00000000", -- 00000338 + X"00000000", -- 0000033C + X"00000000", -- 00000340 + X"00000000", -- 00000344 + X"00000000", -- 00000348 + X"00000000", -- 0000034C + X"00000000", -- 00000350 + X"00000000", -- 00000354 + X"00000000", -- 00000358 + X"00000000", -- 0000035C + X"00000000", -- 00000360 + X"00000000", -- 00000364 + X"00000000", -- 00000368 + X"00000000", -- 0000036C + X"00000000", -- 00000370 + X"00000000", -- 00000374 + X"00000000", -- 00000378 + X"00000000", -- 0000037C + X"00000000", -- 00000380 + X"00000000", -- 00000384 + X"00000000", -- 00000388 + X"00000000", -- 0000038C + X"00000000", -- 00000390 + X"00000000", -- 00000394 + X"00000000", -- 00000398 + X"00000000", -- 0000039C + X"00000000", -- 000003A0 + X"00000000", -- 000003A4 + X"00000000", -- 000003A8 + X"00000000", -- 000003AC + X"00000000", -- 000003B0 + X"00000000", -- 000003B4 + X"00000000", -- 000003B8 + X"00000000", -- 000003BC + X"00000000", -- 000003C0 + X"00000000", -- 000003C4 + X"00000000", -- 000003C8 + X"00000000", -- 000003CC + X"00000000", -- 000003D0 + X"00000000", -- 000003D4 + X"00000000", -- 000003D8 + X"00000000", -- 000003DC + X"00000000", -- 000003E0 + X"00000000", -- 000003E4 + X"00000000", -- 000003E8 + X"00000000", -- 000003EC + X"00000000", -- 000003F0 + X"00000000", -- 000003F4 + X"00000000", -- 000003F8 + X"00000000" -- 000003FC + ); + +begin + +PROM_READ: + process(clk) + begin + if rising_edge(clk) then + dout <= word_array(to_integer(addr)); + end if; + end process; + + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test1.vhd b/lib/CPUs/MIPS/src/irom_test1.vhd new file mode 100644 index 0000000..24007c4 --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test1.vhd @@ -0,0 +1,121 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + X"08100001", -- [0x00400000] j 0x00400004 [main] + X"3c011234", -- [0x00400004] lui $1, 4660 + X"34215678", -- [0x00400008] ori $1, $1, 22136 + X"3021f00f", -- [0x0040000c] andi $1, $1, -4081 + X"2021affc", -- [0x00400010] addi $1, $1, -20484 + X"2021ffff", -- [0x00400014] addi $1, $1, -1 + X"1c20fffe", -- [0x00400018] bgtz $1 -8 [loop-0x00400018] + X"3c020000", -- [0x0040001c] lui $2, 0 + X"34420001", -- [0x00400020] ori $2, $2, 1 + X"3c010000", -- [0x00400024] lui $1, 0 + X"34210004", -- [0x00400028] ori $1, $1, 4 + X"00220822", -- [0x0040002c] sub $1, $1, $2 + X"1c20fffe", -- [0x00400030] bgtz $1 -8 [loop2-0x00400030] + X"3c1f0040", -- [0x00400034] lui $31, 64 + X"03e00008", -- [0x00400038] jr $31 + X"00000000", -- [0x0040003c] nop + X"00000000", -- [0x00400040] nop + X"00000000", -- [0x00400044] nop + X"00000000", -- [0x00400048] nop + X"00000000", -- [0x0040004c] nop + X"00000000", -- [0x00400050] nop + X"00000000", -- [0x00400054] nop + X"00000000", -- [0x00400058] nop + X"00000000", -- [0x0040005c] nop + X"00000000", -- [0x00400060] nop + X"00000000", -- [0x00400064] nop + X"00000000", -- [0x00400068] nop + X"00000000", -- [0x0040006c] nop + X"00000000", -- [0x00400070] nop + X"00000000", -- [0x00400074] nop + X"00000000", -- [0x00400078] nop + X"00000000", -- [0x0040007c] nop + X"00000000", -- [0x00400080] nop + X"00000000", -- [0x00400084] nop + X"00000000", -- [0x00400088] nop + X"00000000", -- [0x0040008c] nop + X"00000000", -- [0x00400090] nop + X"00000000", -- [0x00400094] nop + X"00000000", -- [0x00400098] nop + X"00000000", -- [0x0040009c] nop + X"00000000", -- [0x004000a0] nop + X"00000000", -- [0x004000a4] nop + X"00000000", -- [0x004000a8] nop + X"00000000", -- [0x004000ac] nop + X"00000000", -- [0x004000b0] nop + X"00000000", -- [0x004000b4] nop + X"00000000", -- [0x004000b8] nop + X"00000000", -- [0x004000bc] nop + X"00000000", -- [0x004000c0] nop + X"00000000", -- [0x004000c4] nop + X"00000000", -- [0x004000c8] nop + X"00000000", -- [0x004000cc] nop + X"00000000", -- [0x004000d0] nop + X"00000000", -- [0x004000d4] nop + X"00000000", -- [0x004000d8] nop + X"00000000", -- [0x004000dc] nop + X"00000000", -- [0x004000e0] nop + X"00000000", -- [0x004000e4] nop + X"00000000", -- [0x004000e8] nop + X"00000000", -- [0x004000ec] nop + X"00000000", -- [0x004000f0] nop + X"00000000", -- [0x004000f4] nop + X"00000000", -- [0x004000f8] nop + X"00000000" -- [0x004000fc] nop + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test2.vhd b/lib/CPUs/MIPS/src/irom_test2.vhd new file mode 100644 index 0000000..289c9f9 --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test2.vhd @@ -0,0 +1,73 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + X"08100001", -- j 0x00400004 [main] ; 5: j main + X"3c011234", -- lui $1, 4660 ; 7: lui $1, 0x1234 + X"34215678", -- ori $1, $1, 22136 ; 8: ori $1, $1, 0x5678 + X"3c035555", -- lui $3, 21845 ; 9: lui $3, 0x5555 + X"3463aaaa", -- ori $3, $3, -21846 ; 10: ori $3, $3, 0xAAAA + X"3c021000", -- lui $2, 4096 ; 11: lui $2, 0x1000 + X"ac410000", -- sw $1, 0($2) ; 12: sw $1, 0($2) + X"ac430004", -- sw $3, 4($2) ; 13: sw $3, 4($2) + X"00000000", -- nop ; 14: sll $0, $0, 0 + X"ac400000", -- sw $0, 0($2) ; 15: sw $0, 0($2) + X"ac400004", -- sw $0, 4($2) ; 16: sw $0, 4($2) + X"8c410000", -- lw $1, 0($2) ; 17: lw $1, 0($2) + X"8c430004", -- lw $3, 4($2) ; 18: lw $3, 4($2) + X"00000000", -- nop ; 19: sll $0, $0, 0 + X"00000000", -- nop ; 20: sll $0, $0, 0 + X"08100001" -- j 0x00400004 [main] ; 21: j main + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test3.vhd b/lib/CPUs/MIPS/src/irom_test3.vhd new file mode 100644 index 0000000..7d53d2a --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test3.vhd @@ -0,0 +1,122 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + + X"08100001", -- [0x00400000] j 0x00400004 [main] + X"3c011234", -- [0x00400004] lui $1, 4660 + X"34215a5a", -- [0x00400008] ori $1, $1, 23130 + X"00010840", -- [0x0040000c] sll $1, $1, 1 + X"00010900", -- [0x00400010] sll $1, $1, 4 + X"00010880", -- [0x00400014] sll $1, $1, 2 + X"00010840", -- [0x00400018] sll $1, $1, 1 + X"00010a00", -- [0x0040001c] sll $1, $1, 8 + X"00010882", -- [0x00400020] srl $1, $1, 2 + X"00010942", -- [0x00400024] srl $1, $1, 5 + X"00010842", -- [0x00400028] srl $1, $1, 1 + X"00010a02", -- [0x0040002c] srl $1, $1, 8 + X"3821ffff", -- [0x00400030] xori $1, $1, -1 + X"3c1f0040", -- [0x00400034] lui $31, 64 + X"03e00008", -- [0x00400038] jr $31 + X"003f0826", -- [0x0040003c] xor $1, $1, $31 + X"00000000", -- [0x00400040] nop + X"00000000", -- [0x00400044] nop + X"00000000", -- [0x00400048] nop + X"00000000", -- [0x0040004c] nop + X"00000000", -- [0x00400050] nop + X"00000000", -- [0x00400054] nop + X"00000000", -- [0x00400058] nop + X"00000000", -- [0x0040005c] nop + X"00000000", -- [0x00400060] nop + X"00000000", -- [0x00400064] nop + X"00000000", -- [0x00400068] nop + X"00000000", -- [0x0040006c] nop + X"00000000", -- [0x00400070] nop + X"00000000", -- [0x00400074] nop + X"00000000", -- [0x00400078] nop + X"00000000", -- [0x0040007c] nop + X"00000000", -- [0x00400080] nop + X"00000000", -- [0x00400084] nop + X"00000000", -- [0x00400088] nop + X"00000000", -- [0x0040008c] nop + X"00000000", -- [0x00400090] nop + X"00000000", -- [0x00400094] nop + X"00000000", -- [0x00400098] nop + X"00000000", -- [0x0040009c] nop + X"00000000", -- [0x004000a0] nop + X"00000000", -- [0x004000a4] nop + X"00000000", -- [0x004000a8] nop + X"00000000", -- [0x004000ac] nop + X"00000000", -- [0x004000b0] nop + X"00000000", -- [0x004000b4] nop + X"00000000", -- [0x004000b8] + X"00000000", -- [0x004000bc] + X"00000000", -- [0x004000c0] + X"00000000", -- [0x004000c4] + X"00000000", -- [0x004000c8] + X"00000000", -- [0x004000cc] + X"00000000", -- [0x004000d0] + X"00000000", -- [0x004000d4] + X"00000000", -- [0x004000d8] + X"00000000", -- [0x004000dc] + X"00000000", -- [0x004000e0] + X"00000000", -- [0x004000e4] + X"00000000", -- [0x004000e8] + X"00000000", -- [0x004000ec] + X"00000000", -- [0x004000f0] + X"00000000", -- [0x004000f4] + X"00000000", -- [0x004000f8] + X"00000000" -- [0x004000fc] + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test4.vhd b/lib/CPUs/MIPS/src/irom_test4.vhd new file mode 100644 index 0000000..bbce904 --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test4.vhd @@ -0,0 +1,122 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + + X"08100001", -- [0x00400000] j 0x00400004 [main] ; 5: j main + X"00000000", -- [0x00400004] nop ; 7: sll $0, $0, 0 + X"3c011000", -- [0x00400008] lui $1, 4096 ; 8: lui $1, 0x1000 + X"20220000", -- [0x0040000c] addi $2, $1, 0 ; 9: addi $2, $1, 0 + X"3c071234", -- [0x00400010] lui $7, 4660 ; 10: lui $7, 0x1234 + X"3c050001", -- [0x00400014] lui $5, 1 ; 11: lui $5, 0x0001 + X"ac270000", -- [0x00400018] sw $7, 0($1) ; 12: sw $7, 0($1) + X"8c430000", -- [0x0040001c] lw $3, 0($2) ; 13: lw $3, 0($2) + X"00654020", -- [0x00400020] add $8, $3, $5 ; 14: add $8, $3, $5 + X"00654820", -- [0x00400024] add $9, $3, $5 ; 15: add $9, $3, $5 + X"00655020", -- [0x00400028] add $10, $3, $5 ; 16: add $10, $3, $5 + X"00655820", -- [0x0040002c] add $11, $3, $5 ; 17: add $11, $3, $5 + X"00000000", -- [0x00400030] nop ; 18: sll $0, $0, 0 + X"00000000", -- [0x00400034] nop ; 19: sll $0, $0, 0 + X"08100001", -- [0x00400038] j 0x00400004 [main] ; 20: j main + X"00000000", -- [0x0040003c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400040] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400044] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400048] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040004c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400050] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400054] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400058] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040005c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400060] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400064] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400068] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040006c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400070] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400074] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400078] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040007c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400080] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400084] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400088] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040008c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400090] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400094] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400098] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040009c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000a0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000a4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000a8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000ac] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000b0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000b4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000b8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000bc] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000c0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000c4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000c8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000cc] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000d0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000d4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000d8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000dc] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000e0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000e4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000e8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000ec] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000f0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000f4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000f8] nop ; 21: sll $0, $0, 0 + X"00000000" -- [0x004000fc] nop ; 21: sll $0, $0, 0 + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test5.vhd b/lib/CPUs/MIPS/src/irom_test5.vhd new file mode 100644 index 0000000..490bdd9 --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test5.vhd @@ -0,0 +1,122 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + + X"08100001", -- [0x00400000] j 0x00400004 [main] + X"3c018000", -- [0x00400004] lui $1, -32768 + X"3c020000", -- [0x00400008] lui $2, 0 + X"3c030000", -- [0x0040000c] lui $3, 0 + X"34420001", -- [0x00400010] ori $2, $2, 1 + X"34630003", -- [0x00400014] ori $3, $3, 3 + X"00010842", -- [0x00400018] srl $1, $1, 1 + X"00010840", -- [0x0040001c] sll $1, $1, 1 + X"00010843", -- [0x00400020] sra $1, $1, 1 + X"000108c3", -- [0x00400024] sra $1, $1, 3 + X"00612004", -- [0x00400028] sllv $4, $1, $3 + X"00412807", -- [0x0040002c] srav $5, $1, $2 + X"00613007", -- [0x00400030] srav $6, $1, $3 + X"3c1f0040", -- [0x00400034] lui $31, 64 + X"03e00008", -- [0x00400038] jr $31 + X"00000000", -- [0x0040003c] nop + X"00000000", -- [0x00400040] nop + X"00000000", -- [0x00400044] nop + X"00000000", -- [0x00400048] nop + X"00000000", -- [0x0040004c] nop + X"00000000", -- [0x00400050] nop + X"00000000", -- [0x00400054] nop + X"00000000", -- [0x00400058] nop + X"00000000", -- [0x0040005c] nop + X"00000000", -- [0x00400060] nop + X"00000000", -- [0x00400064] nop + X"00000000", -- [0x00400068] nop + X"00000000", -- [0x0040006c] nop + X"00000000", -- [0x00400070] nop + X"00000000", -- [0x00400074] nop + X"00000000", -- [0x00400078] nop + X"00000000", -- [0x0040007c] nop + X"00000000", -- [0x00400080] nop + X"00000000", -- [0x00400084] nop + X"00000000", -- [0x00400088] nop + X"00000000", -- [0x0040008c] nop + X"00000000", -- [0x00400090] nop + X"00000000", -- [0x00400094] nop + X"00000000", -- [0x00400098] nop + X"00000000", -- [0x0040009c] nop + X"00000000", -- [0x004000a0] nop + X"00000000", -- [0x004000a4] nop + X"00000000", -- [0x004000a8] nop + X"00000000", -- [0x004000ac] nop + X"00000000", -- [0x004000b0] nop + X"00000000", -- [0x004000b4] nop + X"00000000", -- [0x004000b8] nop + X"00000000", -- [0x004000bc] nop + X"00000000", -- [0x004000c0] nop + X"00000000", -- [0x004000c4] nop + X"00000000", -- [0x004000c8] nop + X"00000000", -- [0x004000cc] nop + X"00000000", -- [0x004000d0] nop + X"00000000", -- [0x004000d4] nop + X"00000000", -- [0x004000d8] nop + X"00000000", -- [0x004000dc] nop + X"00000000", -- [0x004000e0] nop + X"00000000", -- [0x004000e4] nop + X"00000000", -- [0x004000e8] nop + X"00000000", -- [0x004000ec] nop + X"00000000", -- [0x004000f0] nop + X"00000000", -- [0x004000f4] nop + X"00000000", -- [0x004000f8] nop + X"00000000" -- [0x004000fc] nop + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test6.vhd b/lib/CPUs/MIPS/src/irom_test6.vhd new file mode 100644 index 0000000..5231af8 --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test6.vhd @@ -0,0 +1,121 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + X"08100001", -- [0x00400000] j 0x00400004 [main] ; 5: j main + X"3c080000", -- [0x00400004] lui $8, 0 ; 7: lui $8, 0 + X"00000000", -- [0x00400008] nop ; 8: sll $0, $0, 0 + X"0c100009", -- [0x0040000c] jal 0x00400024 [subr1] ; 9: jal subr1 + X"3c010040", -- [0x00400010] lui $1, 64 [subr2] ; 10: la $2, subr2 + X"34220030", -- [0x00400014] ori $2, $1, 48 [subr2] + X"00407809", -- [0x00400018] jalr $15, $2 ; 11: jalr $15, $2 + X"00000000", -- [0x0040001c] nop ; 12: sll $0, $0, 0 + X"08100002", -- [0x00400020] j 0x00400008 [loop] ; 13: j loop + X"21080001", -- [0x00400024] addi $8, $8, 1 ; 15: addi $8, 1 + X"00000000", -- [0x00400028] nop ; 16: sll $0, $0, 0 + X"03e00008", -- [0x0040002c] jr $31 ; 17: jr $31 + X"21080010", -- [0x00400030] addi $8, $8, 16 ; 18: addi $8, 16 + X"00000000", -- [0x00400034] nop ; 19: sll $0, $0, 0 + X"01e00008", -- [0x00400038] jr $15 ; 20: jr $15 + X"00000000", -- [0x0040003c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400040] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400044] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400048] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040004c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400050] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400054] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400058] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040005c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400060] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400064] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400068] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040006c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400070] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400074] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400078] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040007c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400080] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400084] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400088] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040008c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400090] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400094] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x00400098] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x0040009c] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000a0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000a4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000a8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000ac] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000b0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000b4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000b8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000bc] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000c0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000c4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000c8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000cc] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000d0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000d4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000d8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000dc] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000e0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000e4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000e8] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000ec] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000f0] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000f4] nop ; 21: sll $0, $0, 0 + X"00000000", -- [0x004000f8] nop ; 21: sll $0, $0, 0 + X"00000000" -- [0x004000fc] nop ; 21: sll $0, $0, 0 + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test_addsub.vhd b/lib/CPUs/MIPS/src/irom_test_addsub.vhd new file mode 100644 index 0000000..bbe764f --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test_addsub.vhd @@ -0,0 +1,121 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + X"3c011234", -- [0x00400000] lui $1, 4660 + X"34225678", -- [0x00400004] ori $2, $1, 22136 + X"3c012345", -- [0x00400008] lui $1, 9029 + X"34236789", -- [0x0040000c] ori $3, $1, 26505 + X"3c018765", -- [0x00400010] lui $1, -30875 + X"34244321", -- [0x00400014] ori $4, $1, 17185 + X"3c019876", -- [0x00400018] lui $1, -26506 + X"34255432", -- [0x0040001c] ori $5, $1, 21554 + X"00000000", -- [0x00400020] nop + X"00427823", -- [0x00400024] subu $15, $2, $2 + X"00437823", -- [0x00400028] subu $15, $2, $3 + X"00447823", -- [0x0040002c] subu $15, $2, $4 + X"00457823", -- [0x00400030] subu $15, $2, $5 + X"00627823", -- [0x00400034] subu $15, $3, $2 + X"00637823", -- [0x00400038] subu $15, $3, $3 + X"00647823", -- [0x0040003c] subu $15, $3, $4 + X"00657823", -- [0x00400040] subu $15, $3, $5 + X"00827823", -- [0x00400044] subu $15, $4, $2 + X"00837823", -- [0x00400048] subu $15, $4, $3 + X"00847823", -- [0x0040004c] subu $15, $4, $4 + X"00857823", -- [0x00400050] subu $15, $4, $5 + X"00a27823", -- [0x00400054] subu $15, $5, $2 + X"00a37823", -- [0x00400058] subu $15, $5, $3 + X"00a47823", -- [0x0040005c] subu $15, $5, $4 + X"00a57823", -- [0x00400060] subu $15, $5, $5 + X"00000000", -- [0x00400064] nop + X"00427822", -- [0x00400068] sub $15, $2, $2 + X"00437822", -- [0x0040006c] sub $15, $2, $3 + X"00447822", -- [0x00400070] sub $15, $2, $4 + X"00457822", -- [0x00400074] sub $15, $2, $5 + X"00627822", -- [0x00400078] sub $15, $3, $2 + X"00637822", -- [0x0040007c] sub $15, $3, $3 + X"00647822", -- [0x00400080] sub $15, $3, $4 + X"00657822", -- [0x00400084] sub $15, $3, $5 + X"00827822", -- [0x00400088] sub $15, $4, $2 + X"00837822", -- [0x0040008c] sub $15, $4, $3 + X"00847822", -- [0x00400090] sub $15, $4, $4 + X"00857822", -- [0x00400094] sub $15, $4, $5 + X"00a27822", -- [0x00400098] sub $15, $5, $2 + X"00a37822", -- [0x0040009c] sub $15, $5, $3 + X"00a47822", -- [0x004000a0] sub $15, $5, $4 + X"00a57822", -- [0x004000a4] sub $15, $5, $5 + X"00000000", -- [0x004000a8] nop + X"08104000", -- [0x004000ac] j 0x00410000 [main] + X"00000000", -- [0x004000b0] nop + X"00000000", -- [0x004000b4] + X"00000000", -- [0x004000b8] + X"00000000", -- [0x004000bc] + X"00000000", -- [0x004000c0] + X"00000000", -- [0x004000c4] + X"00000000", -- [0x004000c8] + X"00000000", -- [0x004000cc] + X"00000000", -- [0x004000d0] + X"00000000", -- [0x004000d4] + X"00000000", -- [0x004000d8] + X"00000000", -- [0x004000dc] + X"00000000", -- [0x004000e0] + X"00000000", -- [0x004000e4] + X"00000000", -- [0x004000e8] + X"00000000", -- [0x004000ec] + X"00000000", -- [0x004000f0] + X"00000000", -- [0x004000f4] + X"00000000", -- [0x004000f8] + X"00000000" -- [0x004000fc] + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test_slt.vhd b/lib/CPUs/MIPS/src/irom_test_slt.vhd new file mode 100644 index 0000000..5fcf2fe --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test_slt.vhd @@ -0,0 +1,121 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + X"3c011234", -- [0x00400000] lui $1, 4660 + X"34225678", -- [0x00400004] ori $2, $1, 22136 + X"3c012345", -- [0x00400008] lui $1, 9029 + X"34236789", -- [0x0040000c] ori $3, $1, 26505 + X"3c018765", -- [0x00400010] lui $1, -30875 + X"34244321", -- [0x00400014] ori $4, $1, 17185 + X"3c019876", -- [0x00400018] lui $1, -26506 + X"34255432", -- [0x0040001c] ori $5, $1, 21554 + X"3c081000", -- [0x00400020] lui $8, 4096 + X"00000000", -- [0x00400024] nop + X"0042782b", -- [0x00400028] sltu $15, $2, $2 + X"0043782b", -- [0x0040002c] sltu $15, $2, $3 + X"0044782b", -- [0x00400030] sltu $15, $2, $4 + X"0045782b", -- [0x00400034] sltu $15, $2, $5 + X"0062782b", -- [0x00400038] sltu $15, $3, $2 + X"0063782b", -- [0x0040003c] sltu $15, $3, $3 + X"0064782b", -- [0x00400040] sltu $15, $3, $4 + X"0065782b", -- [0x00400044] sltu $15, $3, $5 + X"0082782b", -- [0x00400048] sltu $15, $4, $2 + X"0083782b", -- [0x0040004c] sltu $15, $4, $3 + X"0084782b", -- [0x00400050] sltu $15, $4, $4 + X"0085782b", -- [0x00400054] sltu $15, $4, $5 + X"00a2782b", -- [0x00400058] sltu $15, $5, $2 + X"00a3782b", -- [0x0040005c] sltu $15, $5, $3 + X"00a4782b", -- [0x00400060] sltu $15, $5, $4 + X"00a5782b", -- [0x00400064] sltu $15, $5, $5 + X"00000000", -- [0x00400068] nop + X"0042782a", -- [0x0040006c] slt $15, $2, $2 + X"0043782a", -- [0x00400070] slt $15, $2, $3 + X"0044782a", -- [0x00400074] slt $15, $2, $4 + X"0045782a", -- [0x00400078] slt $15, $2, $5 + X"0062782a", -- [0x0040007c] slt $15, $3, $2 + X"0063782a", -- [0x00400080] slt $15, $3, $3 + X"0064782a", -- [0x00400084] slt $15, $3, $4 + X"0065782a", -- [0x00400088] slt $15, $3, $5 + X"0082782a", -- [0x0040008c] slt $15, $4, $2 + X"0083782a", -- [0x00400090] slt $15, $4, $3 + X"0084782a", -- [0x00400094] slt $15, $4, $4 + X"0085782a", -- [0x00400098] slt $15, $4, $5 + X"00a2782a", -- [0x0040009c] slt $15, $5, $2 + X"00a3782a", -- [0x004000a0] slt $15, $5, $3 + X"00a4782a", -- [0x004000a4] slt $15, $5, $4 + X"00a5782a", -- [0x004000a8] slt $15, $5, $5 + X"00000000", -- [0x004000ac] nop + X"08104000", -- [0x004000b0] j 0x00410000 [main] + X"00000000", -- [0x004000b4] nop + X"00000000", -- [0x004000b8] + X"00000000", -- [0x004000bc] + X"00000000", -- [0x004000c0] + X"00000000", -- [0x004000c4] + X"00000000", -- [0x004000c8] + X"00000000", -- [0x004000cc] + X"00000000", -- [0x004000d0] + X"00000000", -- [0x004000d4] + X"00000000", -- [0x004000d8] + X"00000000", -- [0x004000dc] + X"00000000", -- [0x004000e0] + X"00000000", -- [0x004000e4] + X"00000000", -- [0x004000e8] + X"00000000", -- [0x004000ec] + X"00000000", -- [0x004000f0] + X"00000000", -- [0x004000f4] + X"00000000", -- [0x004000f8] + X"00000000" -- [0x004000fc] + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test_slti.vhd b/lib/CPUs/MIPS/src/irom_test_slti.vhd new file mode 100644 index 0000000..b87fd8a --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test_slti.vhd @@ -0,0 +1,121 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + X"3c011234", -- [0x00400000] lui $1, 4660 + X"34225678", -- [0x00400004] ori $2, $1, 22136 + X"3c012345", -- [0x00400008] lui $1, 9029 + X"34236789", -- [0x0040000c] ori $3, $1, 26505 + X"3c018765", -- [0x00400010] lui $1, -30875 + X"34244321", -- [0x00400014] ori $4, $1, 17185 + X"3c019876", -- [0x00400018] lui $1, -26506 + X"34255432", -- [0x0040001c] ori $5, $1, 21554 + X"3c081000", -- [0x00400020] lui $8, 4096 + X"00000000", -- [0x00400024] nop + X"2c4f1234", -- [0x00400028] sltiu $15, $2, 4660 + X"2c4f2345", -- [0x0040002c] sltiu $15, $2, 9029 + X"2c4fedcc", -- [0x00400030] sltiu $15, $2, -4660 + X"2c4fdcbb", -- [0x00400034] sltiu $15, $2, -9029 + X"2c6f1234", -- [0x00400038] sltiu $15, $3, 4660 + X"2c6f2345", -- [0x0040003c] sltiu $15, $3, 9029 + X"2c6fedcc", -- [0x00400040] sltiu $15, $3, -4660 + X"2c6fdcbb", -- [0x00400044] sltiu $15, $3, -9029 + X"2c8f1234", -- [0x00400048] sltiu $15, $4, 4660 + X"2c8f2345", -- [0x0040004c] sltiu $15, $4, 9029 + X"2c8fedcc", -- [0x00400050] sltiu $15, $4, -4660 + X"2c8fdcbb", -- [0x00400054] sltiu $15, $4, -9029 + X"2caf1234", -- [0x00400058] sltiu $15, $5, 4660 + X"2caf2345", -- [0x0040005c] sltiu $15, $5, 9029 + X"2cafedcc", -- [0x00400060] sltiu $15, $5, -4660 + X"2cafdcbb", -- [0x00400064] sltiu $15, $5, -9029 + X"00000000", -- [0x00400068] nop + X"284f1234", -- [0x0040006c] slti $15, $2, 4660 + X"284f2345", -- [0x00400070] slti $15, $2, 9029 + X"284fedcc", -- [0x00400074] slti $15, $2, -4660 + X"284fdcbb", -- [0x00400078] slti $15, $2, -9029 + X"286f1234", -- [0x0040007c] slti $15, $3, 4660 + X"286f2345", -- [0x00400080] slti $15, $3, 9029 + X"286fedcc", -- [0x00400084] slti $15, $3, -4660 + X"286fdcbb", -- [0x00400088] slti $15, $3, -9029 + X"288f1234", -- [0x0040008c] slti $15, $4, 4660 + X"288f2345", -- [0x00400090] slti $15, $4, 9029 + X"288fedcc", -- [0x00400094] slti $15, $4, -4660 + X"288fdcbb", -- [0x00400098] slti $15, $4, -9029 + X"28af1234", -- [0x0040009c] slti $15, $5, 4660 + X"28af2345", -- [0x004000a0] slti $15, $5, 9029 + X"28afedcc", -- [0x004000a4] slti $15, $5, -4660 + X"28afdcbb", -- [0x004000a8] slti $15, $5, -9029 + X"00000000", -- [0x004000ac] nop + X"08104000", -- [0x004000b0] j 0x00410000 [main] + X"00000000", -- [0x004000b4] nop + X"00000000", -- [0x004000b8] + X"00000000", -- [0x004000bc] + X"00000000", -- [0x004000c0] + X"00000000", -- [0x004000c4] + X"00000000", -- [0x004000c8] + X"00000000", -- [0x004000cc] + X"00000000", -- [0x004000d0] + X"00000000", -- [0x004000d4] + X"00000000", -- [0x004000d8] + X"00000000", -- [0x004000dc] + X"00000000", -- [0x004000e0] + X"00000000", -- [0x004000e4] + X"00000000", -- [0x004000e8] + X"00000000", -- [0x004000ec] + X"00000000", -- [0x004000f0] + X"00000000", -- [0x004000f4] + X"00000000", -- [0x004000f8] + X"00000000" -- [0x004000fc] + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/irom_test_sub.vhd b/lib/CPUs/MIPS/src/irom_test_sub.vhd new file mode 100644 index 0000000..bbe764f --- /dev/null +++ b/lib/CPUs/MIPS/src/irom_test_sub.vhd @@ -0,0 +1,121 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY rom IS + Generic + ( + addr_width : integer := 2; + data_width : integer := 32 + ); + Port + ( + addr : in unsigned(addr_width-1 downto 0); + dout : out unsigned(data_width-1 downto 0) + ); +END rom; + +ARCHITECTURE itest OF rom IS + + subtype word_t is unsigned(data_width-1 downto 0); + type word_array_t is array (0 to 2**addr_width-1) of word_t; + + -- Assembled from itest.jsm + constant word_array : word_array_t := + ( + X"3c011234", -- [0x00400000] lui $1, 4660 + X"34225678", -- [0x00400004] ori $2, $1, 22136 + X"3c012345", -- [0x00400008] lui $1, 9029 + X"34236789", -- [0x0040000c] ori $3, $1, 26505 + X"3c018765", -- [0x00400010] lui $1, -30875 + X"34244321", -- [0x00400014] ori $4, $1, 17185 + X"3c019876", -- [0x00400018] lui $1, -26506 + X"34255432", -- [0x0040001c] ori $5, $1, 21554 + X"00000000", -- [0x00400020] nop + X"00427823", -- [0x00400024] subu $15, $2, $2 + X"00437823", -- [0x00400028] subu $15, $2, $3 + X"00447823", -- [0x0040002c] subu $15, $2, $4 + X"00457823", -- [0x00400030] subu $15, $2, $5 + X"00627823", -- [0x00400034] subu $15, $3, $2 + X"00637823", -- [0x00400038] subu $15, $3, $3 + X"00647823", -- [0x0040003c] subu $15, $3, $4 + X"00657823", -- [0x00400040] subu $15, $3, $5 + X"00827823", -- [0x00400044] subu $15, $4, $2 + X"00837823", -- [0x00400048] subu $15, $4, $3 + X"00847823", -- [0x0040004c] subu $15, $4, $4 + X"00857823", -- [0x00400050] subu $15, $4, $5 + X"00a27823", -- [0x00400054] subu $15, $5, $2 + X"00a37823", -- [0x00400058] subu $15, $5, $3 + X"00a47823", -- [0x0040005c] subu $15, $5, $4 + X"00a57823", -- [0x00400060] subu $15, $5, $5 + X"00000000", -- [0x00400064] nop + X"00427822", -- [0x00400068] sub $15, $2, $2 + X"00437822", -- [0x0040006c] sub $15, $2, $3 + X"00447822", -- [0x00400070] sub $15, $2, $4 + X"00457822", -- [0x00400074] sub $15, $2, $5 + X"00627822", -- [0x00400078] sub $15, $3, $2 + X"00637822", -- [0x0040007c] sub $15, $3, $3 + X"00647822", -- [0x00400080] sub $15, $3, $4 + X"00657822", -- [0x00400084] sub $15, $3, $5 + X"00827822", -- [0x00400088] sub $15, $4, $2 + X"00837822", -- [0x0040008c] sub $15, $4, $3 + X"00847822", -- [0x00400090] sub $15, $4, $4 + X"00857822", -- [0x00400094] sub $15, $4, $5 + X"00a27822", -- [0x00400098] sub $15, $5, $2 + X"00a37822", -- [0x0040009c] sub $15, $5, $3 + X"00a47822", -- [0x004000a0] sub $15, $5, $4 + X"00a57822", -- [0x004000a4] sub $15, $5, $5 + X"00000000", -- [0x004000a8] nop + X"08104000", -- [0x004000ac] j 0x00410000 [main] + X"00000000", -- [0x004000b0] nop + X"00000000", -- [0x004000b4] + X"00000000", -- [0x004000b8] + X"00000000", -- [0x004000bc] + X"00000000", -- [0x004000c0] + X"00000000", -- [0x004000c4] + X"00000000", -- [0x004000c8] + X"00000000", -- [0x004000cc] + X"00000000", -- [0x004000d0] + X"00000000", -- [0x004000d4] + X"00000000", -- [0x004000d8] + X"00000000", -- [0x004000dc] + X"00000000", -- [0x004000e0] + X"00000000", -- [0x004000e4] + X"00000000", -- [0x004000e8] + X"00000000", -- [0x004000ec] + X"00000000", -- [0x004000f0] + X"00000000", -- [0x004000f4] + X"00000000", -- [0x004000f8] + X"00000000" -- [0x004000fc] + ); + +begin + +PROM_READ: + dout <= word_array(to_integer(addr)); + +end itest; diff --git a/lib/CPUs/MIPS/src/mips_embedded.vhd b/lib/CPUs/MIPS/src/mips_embedded.vhd new file mode 100644 index 0000000..47d7bd7 --- /dev/null +++ b/lib/CPUs/MIPS/src/mips_embedded.vhd @@ -0,0 +1,332 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: cpu_embedded using cpu_core and rom +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +library work; +use work.mips_types.all; + +entity mips_embedded is + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + halt : in STD_LOGIC; + int : in unsigned(5 downto 0); + rxd : in STD_LOGIC; + txd : out STD_LOGIC; + dout : out word_t + ); +end mips_embedded; + +architecture rtl of mips_embedded is + + COMPONENT mips_top + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + int : in unsigned(5 downto 0); + mem_rdy : in STD_LOGIC; + mem_re : out STD_LOGIC; + mem_en : out STD_LOGIC; + mem_we : out unsigned(3 downto 0); + mem_din : in word_t; + mem_dout : out word_t; + mem_addr : out word_t + + ); + END COMPONENT; + + signal mem_din : word_t; + signal mem_dout : word_t; + signal mem_addr : word_t; + signal mem_re : std_logic; + signal mem_en : std_logic; + signal mem_we : unsigned(3 downto 0); + signal mem_rdy : std_logic; + + subtype tick_usec_t is natural range 0 to 99; + signal tick_usec : tick_usec_t; + signal cnt_usec : word_t; + signal cnt_sec : word_t; + signal cnt_usec_preset : word_t; + signal cnt_sec_preset : word_t; + signal cnt_usec_en : std_logic; + signal cnt_usec_we : std_logic; + signal cnt_sec_en : std_logic; + signal cnt_sec_we : std_logic; + + COMPONENT uart_tx + Port + ( + data_in : in std_logic_vector(7 downto 0); + write_buffer : in std_logic; + reset_buffer : in std_logic; + en_16_x_baud : in std_logic; + serial_out : out std_logic; + buffer_full : out std_logic; + buffer_half_full : out std_logic; + clk : in std_logic + ); + END COMPONENT; + + COMPONENT uart_rx + Port + ( + serial_in : in std_logic; + data_out : out std_logic_vector(7 downto 0); + read_buffer : in std_logic; + reset_buffer : in std_logic; + en_16_x_baud : in std_logic; + buffer_data_present : out std_logic; + buffer_full : out std_logic; + buffer_half_full : out std_logic; + clk : in std_logic + ); + END COMPONENT; + + signal baud_count : unsigned(7 downto 0); + signal en_16_x_baud : std_logic; + signal reg_we_uart_tx : std_logic; + signal tx_full : std_logic; + signal tx_half_full : std_logic; + signal reg_uart_tx : unsigned(7 downto 0); + signal reg_re_uart_rx : std_logic; + signal reg_uart_rx : std_logic_vector(7 downto 0); + signal rx_data_present : std_logic; + signal rx_full : std_logic; + signal rx_half_full : std_logic; + signal uart_status_port : unsigned(7 downto 0); + signal reg_uart_ctrl : unsigned(7 downto 0); + signal reg_uart_baud : unsigned(7 downto 0); + +begin + +registers_write: + process(clk) + begin + if rising_edge(clk) then + reg_we_uart_tx <= '0'; + cnt_usec_we <= '0'; + cnt_sec_we <= '0'; + if rst = '1' then + dout <= (others => '0'); + reg_uart_baud <= to_unsigned(53, 8); + reg_uart_ctrl <= to_unsigned(0, 8); + elsif mem_en = '1' then + case mem_addr(5 downto 2) is + + when "0000" => + if mem_we(0) = '1' then + dout(7 downto 0) <= mem_dout(7 downto 0); + end if; + if mem_we(1) = '1' then + dout(15 downto 8) <= mem_dout(15 downto 8); + end if; + if mem_we(2) = '1' then + dout(23 downto 16) <= mem_dout(23 downto 16); + end if; + if mem_we(3) = '1' then + dout(31 downto 24) <= mem_dout(31 downto 24); + end if; + + when "0001" => + if mem_we(0) = '1' then + reg_we_uart_tx <= '1'; + reg_uart_tx <= mem_dout(7 downto 0); + end if; + + when "0010" => + if mem_we(0) = '1' then + reg_uart_ctrl <= mem_dout(7 downto 0); + end if; + if mem_we(1) = '1' then + reg_uart_baud <= mem_dout(15 downto 8); + end if; + + when "0100" => + if mem_we(3) = '1' then + cnt_usec_we <= '1'; + cnt_usec_preset <= mem_dout; + end if; + + when "0101" => + if mem_we(3) = '1' then + cnt_sec_we <= '1'; + cnt_sec_preset <= mem_dout; + end if; + + when others => null; + end case; + end if; + end if; + end process; + +registers_read: + process(clk) + begin + if rising_edge(clk) then + reg_re_uart_rx <= '0'; + if mem_en = '1' then + mem_din <= (others => '0'); + case mem_addr(5 downto 2) is + + when "0000" => null; + + when "0001" => + reg_re_uart_rx <= '1'; + mem_din(7 downto 0) <= unsigned(reg_uart_rx); + + when "0010" => + mem_din(7 downto 0) <= uart_status_port; + mem_din(15 downto 8) <= reg_uart_baud; + + when "0100" => + mem_din <= cnt_usec; + + when "0101" => + mem_din <= cnt_sec; + + when others => null; + end case; + end if; + end if; + end process; + + mem_rdy <= not halt; + +inst_mips_top: mips_top + PORT MAP + ( + rst => rst, + clk => clk, + int => int, + mem_rdy => mem_rdy, + mem_en => mem_en, + mem_we => mem_we, + mem_din => mem_din, + mem_dout => mem_dout, + mem_addr => mem_addr + ); + +inst_uart_tx: uart_tx + port map + ( + data_in => std_logic_vector(reg_uart_tx), + write_buffer => reg_we_uart_tx, + reset_buffer => rst, + en_16_x_baud => en_16_x_baud, + serial_out => txd, + buffer_full => tx_full, + buffer_half_full => tx_half_full, + clk => clk + ); + +inst_uart_rx: uart_rx + port map + ( + serial_in => rxd, + data_out => reg_uart_rx, + read_buffer => reg_re_uart_rx, + reset_buffer => rst, + en_16_x_baud => en_16_x_baud, + buffer_data_present => rx_data_present, + buffer_full => rx_full, + buffer_half_full => rx_half_full, + clk => clk + ); + + uart_status_port <= (7 downto 5 => '0') & rx_data_present & rx_full & rx_half_full & tx_full & tx_half_full; + +tick_usec_timer: + process(clk) + begin + if clk'event and clk='1' then + cnt_usec_en <= '0'; + if rst = '1' then + tick_usec <= 0; + cnt_usec_en <= '0'; + elsif tick_usec = tick_usec_t'high then + tick_usec <= 0; + cnt_usec_en <= '1'; + else + tick_usec <= tick_usec + 1; + end if; + end if; + end process; + +cnt_usec_timer: + process(clk) + begin + if clk'event and clk='1' then + cnt_sec_en <= '0'; + if rst = '1' then + cnt_usec <= (others => '0'); + cnt_sec_en <= '0'; + elsif cnt_usec_we = '1' then + cnt_usec <= cnt_usec_preset; + elsif cnt_usec_en = '1' then + if cnt_usec = to_unsigned(1E6 - 1, word_t'length) then + cnt_usec <= (others => '0'); + cnt_sec_en <= '1'; + else + cnt_usec <= cnt_usec + 1; + end if; + end if; + end if; + end process; + +cnt_sec_timer: + process(clk) + begin + if clk'event and clk='1' then + if rst = '1' then + cnt_sec <= (others => '0'); + elsif cnt_sec_we = '1' then + cnt_sec <= cnt_sec_preset; + elsif cnt_sec_en = '1' then + cnt_sec <= cnt_sec + 1; + end if; + end if; + end process; + +baud_timer: + process(clk) + begin + if clk'event and clk='1' then + if rst = '1' then + baud_count <= (others => '0'); + elsif baud_count = reg_uart_baud then + baud_count <= (others => '0'); + en_16_x_baud <= '1'; + else + baud_count <= baud_count + 1; + en_16_x_baud <= '0'; + end if; + end if; + end process; + +end rtl; diff --git a/lib/CPUs/MIPS/src/mips_embedded_syn.vhd b/lib/CPUs/MIPS/src/mips_embedded_syn.vhd new file mode 100644 index 0000000..9de77e7 --- /dev/null +++ b/lib/CPUs/MIPS/src/mips_embedded_syn.vhd @@ -0,0 +1,137 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: JIPS top file +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +library work; +use work.mips_types.all; + +entity mips_embedded_syn is + Port + ( + sys_rst_n_in : in STD_LOGIC; + sys_clk_in : in STD_LOGIC; + sys_dip : in STD_LOGIC_VECTOR (7 downto 0); + sys_btn : in STD_LOGIC_VECTOR (8 downto 0); + sys_led : out STD_LOGIC_VECTOR (7 downto 0); + sys_rx : in STD_LOGIC; + sys_tx : out STD_LOGIC; + sys_error : out STD_LOGIC_VECTOR (1 downto 0) + ); + +end mips_embedded_syn; + +architecture struct of mips_embedded_syn is + + COMPONENT mips_embedded + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + halt : in STD_LOGIC; + int : in unsigned(5 downto 0); + rxd : in STD_LOGIC; + txd : out STD_LOGIC; + dout : out word_t + ); + END COMPONENT; + + signal dout : word_t; + signal rst : STD_LOGIC; + signal clk : STD_LOGIC; + signal halt : STD_LOGIC; + signal int : unsigned(5 downto 0); + signal btn_r : unsigned (8 downto 0); + signal dip_r : unsigned (7 downto 0); + +begin + +------------------------------------------------------------------- +inst_mips_embedded: mips_embedded + PORT MAP + ( + rst => rst, + clk => clk, + halt => halt, + int => int, + rxd => sys_rx, + txd => sys_tx, + dout => dout + ); + + clk <= sys_clk_in; + rst <= not sys_rst_n_in; + +ERR_LED_reg: + process(rst, clk) + begin + if rst = '1' then + sys_error <= (others => '1'); + elsif rising_edge(clk) then + sys_error <= STD_LOGIC_VECTOR(dout(31 downto 30)); + end if; + end process; + +LED_reg: + process(rst, clk) + begin + if rst = '1' then + sys_led <= (others => '0'); + elsif rising_edge(clk) then + sys_led <= STD_LOGIC_VECTOR(dout(7 downto 0)); + end if; + end process; + +DIP_reg: + process(rst, clk) + begin + if rst = '1' then + dip_r <= (others => '0'); + elsif rising_edge(clk) then + dip_r <= unsigned(sys_dip); + end if; + end process; + +BTN_reg: + process(rst, clk) + begin + if rst = '1' then + btn_r <= (others => '0'); + elsif rising_edge(clk) then + btn_r <= unsigned(sys_btn); + end if; + end process; + + halt <= btn_r(4) after 6.5 ns; + int(0) <= dip_r(0) and btn_r(3) after 1 ns; + int(1) <= dip_r(1) and btn_r(3) after 1 ns; + int(2) <= dip_r(2) and btn_r(3) after 1 ns; + int(3) <= dip_r(3) and btn_r(3) after 1 ns; + int(4) <= dip_r(4) and btn_r(3) after 1 ns; + int(5) <= dip_r(5) and btn_r(3) after 1 ns; + +------------------------------------------------------------------- + +end struct; diff --git a/lib/CPUs/MIPS/src/mips_muldiv.vhd b/lib/CPUs/MIPS/src/mips_muldiv.vhd new file mode 100644 index 0000000..34016d9 --- /dev/null +++ b/lib/CPUs/MIPS/src/mips_muldiv.vhd @@ -0,0 +1,83 @@ +-------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The arithmetic logic unit +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.STD_LOGIC_1164.ALL; +use IEEE.numeric_std.ALL; + +use work.mips_types.all; + +entity muldiv is + Port + ( + rst : in std_logic; + clk : in std_logic; + din_vld_hi : in std_logic; + din_vld_lo : in std_logic; + din_hi : in word_t; + din_lo : in word_t; + hilo_sel : in std_logic; + dout : out word_t + ); +end muldiv; + +architecture Behavioral of muldiv is + + signal reg_hi, reg_lo : word_t; + +-------------------------------------------------------------------------- +begin + +-------------------------------------------------------------------------- +proc_reg_out: + process(hilo_sel, reg_hi, reg_lo) + begin + if hilo_sel = '1' then + dout <= reg_hi; + else + dout <= reg_lo; + end if; + end process; + +proc_reg_in: + process(clk) + begin + if rising_edge(clk) then + if rst = '1' then + reg_hi <= (others => '0'); + reg_lo <= (others => '0'); + elsif din_vld_hi = '1' then + if hilo_sel = '1' then + reg_hi <= din_hi; + else + reg_lo <= din_hi; + end if; + end if; + if din_vld_lo = '1' then + reg_lo <= din_lo; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end Behavioral; diff --git a/lib/CPUs/MIPS/src/ram.vhd b/lib/CPUs/MIPS/src/ram.vhd new file mode 100644 index 0000000..d054c72 --- /dev/null +++ b/lib/CPUs/MIPS/src/ram.vhd @@ -0,0 +1,115 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY ram IS + Generic + ( + word_addr_width : integer := 6 + ); + Port + ( + clk : in STD_LOGIC; + we : in unsigned(3 downto 0); + ce : in STD_LOGIC; + addr : in unsigned(31 downto 0); + din : in unsigned(31 downto 0); + dout : out unsigned(31 downto 0) + ); +END ram; + +ARCHITECTURE behavior OF ram IS + + constant depth : natural := 2**word_addr_width; + + type sram_t is array (0 to depth-1) of unsigned(7 downto 0); + + function sram_clear return sram_t is + + variable result : sram_t; + begin + for i in 0 to sram_t'length-1 loop + result(i) := (others => '0'); + end loop; + return result; + end sram_clear; + + signal sram0, sram1, sram2, sram3 : sram_t := sram_clear; + +BEGIN + + +SRAM_RW: + process(clk) + variable index : natural range 0 to depth-1; + begin + if rising_edge(clk) and ce = '1' then + index := to_integer(addr(word_addr_width+1 downto 2)); + if we(0) = '1' then + sram0(index)<= din(7 downto 0); + end if; + dout(7 downto 0) <= sram0(index); + end if; + end process; + + process(clk) + variable index : natural range 0 to depth-1; + begin + if rising_edge(clk) and ce = '1' then + index := to_integer(addr(word_addr_width+1 downto 2)); + if we(1) = '1' then + sram1(index)<= din(15 downto 8); + end if; + dout(15 downto 8) <= sram1(index); + end if; + end process; + + process(clk) + variable index : natural range 0 to depth-1; + begin + if rising_edge(clk) and ce = '1' then + index := to_integer(addr(word_addr_width+1 downto 2)); + if we(2) = '1' then + sram2(index)<= din(23 downto 16); + end if; + dout(23 downto 16) <= sram2(index); + end if; + end process; + + process(clk) + variable index : natural range 0 to depth-1; + begin + if rising_edge(clk) and ce = '1' then + index := to_integer(addr(word_addr_width+1 downto 2)); + if we(3) = '1' then + sram3(index)<= din(31 downto 24); + end if; + dout(31 downto 24) <= sram3(index); + end if; + end process; + +end behavior; diff --git a/lib/CPUs/MIPS/src/ram_ld.vhd b/lib/CPUs/MIPS/src/ram_ld.vhd new file mode 100644 index 0000000..7a36b13 --- /dev/null +++ b/lib/CPUs/MIPS/src/ram_ld.vhd @@ -0,0 +1,177 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +ENTITY ram IS + Generic + ( + word_addr_width : integer := 6 + ); + Port + ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + we : in unsigned(3 downto 0); + addr : in unsigned(31 downto 0); + din : in unsigned(31 downto 0); + dout : out unsigned(31 downto 0) + ); +END ram; + +ARCHITECTURE behavior OF ram IS + + COMPONENT dpram_2w2r + Generic + ( + addr_width : integer; + data_width : integer + ); + Port + ( + clk_a : in STD_LOGIC; + clk_b : in STD_LOGIC; + en_a : in STD_LOGIC; + en_b : in STD_LOGIC; + we_a : in STD_LOGIC; + we_b : in STD_LOGIC; + addr_a : in unsigned (addr_width-1 downto 0); + addr_b : in unsigned (addr_width-1 downto 0); + din_a : in unsigned (data_width-1 downto 0); + din_b : in unsigned (data_width-1 downto 0); + dout_a : out unsigned (data_width-1 downto 0); + dout_b : out unsigned (data_width-1 downto 0) + ); + END COMPONENT; + + signal jtag_clk : STD_LOGIC; + signal jtag_we : unsigned(3 downto 0); + signal jtag_addr : unsigned (15 downto 0); + signal jtag_dout : unsigned (31 downto 0); + signal jtag_din : unsigned (31 downto 0); + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (47 downto 0); + +BEGIN + +gen_sram: + for i in 0 to 3 generate + begin + inst_dpram_2w2r : dpram_2w2r + GENERIC MAP + ( + addr_width => word_addr_width, + data_width => 8 + ) + PORT MAP + ( + clk_a => clk, + en_a => ce, + we_a => we(i), + addr_a => addr(word_addr_width+1 downto 2), + din_a => din((i+1)*8-1 downto i*8), + dout_a => dout((i+1)*8-1 downto i*8), + + clk_b => jtag_clk, + en_b => jtag_we(i), + we_b => jtag_we(i), + addr_b => jtag_addr(word_addr_width-1 downto 0), + din_b => jtag_din((i+1)*8-1 downto i*8), + dout_b => jtag_dout((i+1)*8-1 downto i*8) + ); + end generate; + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst2 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 2 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_addr <= user_regi(user_regi'left downto jtag_dout'length); + jtag_din <= user_regi(jtag_dout'length-1 downto 0); + jtag_clk <= bs_update1; + jtag_we <= (3 downto 0 => bs_sel); + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto jtag_dout'length => '0') & jtag_dout; + end if; + end if; + end process; + +-------------------------------------------------------------------------- +end behavior; diff --git a/lib/CPUs/MIPS/src/ram_sim.vhd b/lib/CPUs/MIPS/src/ram_sim.vhd new file mode 100644 index 0000000..6d26672 --- /dev/null +++ b/lib/CPUs/MIPS/src/ram_sim.vhd @@ -0,0 +1,88 @@ +------------------------------------------------------------------------- +-- Project: JCPU, a portable 8-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + + +ENTITY ram IS + Generic + ( + word_addr_width : integer := 6 + ); + Port + ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + we : in unsigned(3 downto 0); + addr : in unsigned(31 downto 0); + din : in unsigned(31 downto 0); + dout : out unsigned(31 downto 0) + ); +END ram; + +ARCHITECTURE behavior OF ram IS + + constant depth : natural := 2**word_addr_width; + + type sram_t is array (0 to depth-1) of unsigned(31 downto 0); + + function sram_clear return sram_t is + + variable result : sram_t; + begin + for i in 0 to sram_t'length-1 loop + result(i) := (others => '0'); + end loop; + return result; + end sram_clear; + + signal sram : sram_t := sram_clear; + +BEGIN + + +SRAM_RW: + process(clk) + variable index : natural range 0 to depth-1; + begin + if rising_edge(clk) and ce = '1' then + index := to_integer(addr(word_addr_width+1 downto 2)); + if we(0) = '1' then + sram(index)(7 downto 0) <= din(7 downto 0); + end if; + if we(1) = '1' then + sram(index)(15 downto 8) <= din(15 downto 8); + end if; + if we(2) = '1' then + sram(index)(23 downto 16) <= din(23 downto 16); + end if; + if we(3) = '1' then + sram(index)(31 downto 24) <= din(31 downto 24); + end if; + dout <= sram(index); + end if; + end process; + +end behavior; diff --git a/lib/CPUs/MIPS/src/rmd160_test.ROM_ld.vhd b/lib/CPUs/MIPS/src/rmd160_test.ROM_ld.vhd new file mode 100644 index 0000000..b0c6fe3 --- /dev/null +++ b/lib/CPUs/MIPS/src/rmd160_test.ROM_ld.vhd @@ -0,0 +1,4222 @@ +LIBRARY IEEE; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +ENTITY rom IS + Port + ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in unsigned(31 downto 0); + dout : out unsigned(31 downto 0) + ); +END rom; + +ARCHITECTURE data OF rom IS + + subtype word_t is unsigned(31 downto 0); + type word_array_t is array (0 to 4095) of word_t; + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : unsigned (15 downto 0); + signal jtag_ld_dout : unsigned (31 downto 0); + signal jtag_ld_din : unsigned (31 downto 0); + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (47 downto 0); + + signal word_array : word_array_t := + ( + + X"401A6000", -- 00000000 + X"3C1B0040", -- 00000004 + X"035BD024", -- 00000008 + X"375A000C", -- 0000000C + X"409A6000", -- 00000010 + X"401A7800", -- 00000014 + X"00000000", -- 00000018 + X"409AF800", -- 0000001C + X"3C1D7FFF", -- 00000020 + X"37BDEFFC", -- 00000024 + X"3C1A0040", -- 00000028 + X"275A05B4", -- 0000002C + X"0340F809", -- 00000030 + X"42000010", -- 00000034 + X"00000000", -- 00000038 + X"00000000", -- 0000003C + X"00000000", -- 00000040 + X"00000000", -- 00000044 + X"00000000", -- 00000048 + X"00000000", -- 0000004C + X"00000000", -- 00000050 + X"00000000", -- 00000054 + X"00000000", -- 00000058 + X"00000000", -- 0000005C + X"00000000", -- 00000060 + X"00000000", -- 00000064 + X"00000000", -- 00000068 + X"00000000", -- 0000006C + X"00000000", -- 00000070 + X"00000000", -- 00000074 + X"00000000", -- 00000078 + X"00000000", -- 0000007C + X"00000000", -- 00000080 + X"00000000", -- 00000084 + X"00000000", -- 00000088 + X"00000000", -- 0000008C + X"00000000", -- 00000090 + X"00000000", -- 00000094 + X"00000000", -- 00000098 + X"00000000", -- 0000009C + X"00000000", -- 000000A0 + X"00000000", -- 000000A4 + X"00000000", -- 000000A8 + X"00000000", -- 000000AC + X"00000000", -- 000000B0 + X"00000000", -- 000000B4 + X"00000000", -- 000000B8 + X"00000000", -- 000000BC + X"00000000", -- 000000C0 + X"00000000", -- 000000C4 + X"00000000", -- 000000C8 + X"00000000", -- 000000CC + X"00000000", -- 000000D0 + X"00000000", -- 000000D4 + X"00000000", -- 000000D8 + X"00000000", -- 000000DC + X"00000000", -- 000000E0 + X"00000000", -- 000000E4 + X"00000000", -- 000000E8 + X"00000000", -- 000000EC + X"00000000", -- 000000F0 + X"00000000", -- 000000F4 + X"00000000", -- 000000F8 + X"00000000", -- 000000FC + X"00000000", -- 00000100 + X"00000000", -- 00000104 + X"00000000", -- 00000108 + X"00000000", -- 0000010C + X"00000000", -- 00000110 + X"00000000", -- 00000114 + X"00000000", -- 00000118 + X"00000000", -- 0000011C + X"00000000", -- 00000120 + X"00000000", -- 00000124 + X"00000000", -- 00000128 + X"00000000", -- 0000012C + X"00000000", -- 00000130 + X"00000000", -- 00000134 + X"00000000", -- 00000138 + X"00000000", -- 0000013C + X"00000000", -- 00000140 + X"00000000", -- 00000144 + X"00000000", -- 00000148 + X"00000000", -- 0000014C + X"00000000", -- 00000150 + X"00000000", -- 00000154 + X"00000000", -- 00000158 + X"00000000", -- 0000015C + X"00000000", -- 00000160 + X"00000000", -- 00000164 + X"00000000", -- 00000168 + X"00000000", -- 0000016C + X"00000000", -- 00000170 + X"00000000", -- 00000174 + X"00000000", -- 00000178 + X"00000000", -- 0000017C + X"3C010000", -- 00000180 + X"AC3D0018", -- 00000184 + X"3C1D0000", -- 00000188 + X"27BD0018", -- 0000018C + X"27BD0004", -- 00000190 + X"AFA80000", -- 00000194 + X"27BD0004", -- 00000198 + X"AFA90000", -- 0000019C + X"27BD0004", -- 000001A0 + X"AFAA0000", -- 000001A4 + X"27BD0004", -- 000001A8 + X"AFAB0000", -- 000001AC + X"27BD0004", -- 000001B0 + X"AFAC0000", -- 000001B4 + X"27BD0004", -- 000001B8 + X"AFBF0000", -- 000001BC + X"400A4000", -- 000001C0 + X"27BD0004", -- 000001C4 + X"AFAA0000", -- 000001C8 + X"400A6000", -- 000001CC + X"27BD0004", -- 000001D0 + X"AFAA0000", -- 000001D4 + X"400A6800", -- 000001D8 + X"27BD0004", -- 000001DC + X"AFAA0000", -- 000001E0 + X"000A5742", -- 000001E4 + X"314B0004", -- 000001E8 + X"400A7000", -- 000001EC + X"27BD0004", -- 000001F0 + X"AFAA0000", -- 000001F4 + X"014B5021", -- 000001F8 + X"27BD0004", -- 000001FC + X"AFAA0000", -- 00000200 + X"3C0B0000", -- 00000204 + X"256B0156", -- 00000208 + X"0C100126", -- 0000020C + X"00000000", -- 00000210 + X"3C0B0000", -- 00000214 + X"256B0118", -- 00000218 + X"0C100126", -- 0000021C + X"00000000", -- 00000220 + X"8FAA0000", -- 00000224 + X"27BDFFFC", -- 00000228 + X"0C1000DE", -- 0000022C + X"00000000", -- 00000230 + X"3C0B0000", -- 00000234 + X"256B0156", -- 00000238 + X"0C100126", -- 0000023C + X"00000000", -- 00000240 + X"3C0B0000", -- 00000244 + X"256B0126", -- 00000248 + X"0C100126", -- 0000024C + X"00000000", -- 00000250 + X"8FAA0000", -- 00000254 + X"27BDFFFC", -- 00000258 + X"0C1000DE", -- 0000025C + X"00000000", -- 00000260 + X"3C0B0000", -- 00000264 + X"256B0156", -- 00000268 + X"0C100126", -- 0000026C + X"00000000", -- 00000270 + X"3C0B0000", -- 00000274 + X"256B0132", -- 00000278 + X"0C100126", -- 0000027C + X"00000000", -- 00000280 + X"8FAA0000", -- 00000284 + X"27BDFFFC", -- 00000288 + X"0C1000DE", -- 0000028C + X"00000000", -- 00000290 + X"3C0B0000", -- 00000294 + X"256B0156", -- 00000298 + X"0C100126", -- 0000029C + X"00000000", -- 000002A0 + X"3C0B0000", -- 000002A4 + X"256B013E", -- 000002A8 + X"0C100126", -- 000002AC + X"00000000", -- 000002B0 + X"8FAA0000", -- 000002B4 + X"27BDFFFC", -- 000002B8 + X"0C1000DE", -- 000002BC + X"00000000", -- 000002C0 + X"3C0B0000", -- 000002C4 + X"256B0156", -- 000002C8 + X"0C100126", -- 000002CC + X"00000000", -- 000002D0 + X"3C0B0000", -- 000002D4 + X"256B014A", -- 000002D8 + X"0C100126", -- 000002DC + X"00000000", -- 000002E0 + X"8FAA0000", -- 000002E4 + X"27BDFFFC", -- 000002E8 + X"0C1000DE", -- 000002EC + X"00000000", -- 000002F0 + X"3C0B0000", -- 000002F4 + X"256B0156", -- 000002F8 + X"0C100126", -- 000002FC + X"00000000", -- 00000300 + X"401A6800", -- 00000304 + X"3C1B8000", -- 00000308 + X"001AD082", -- 0000030C + X"335A000F", -- 00000310 + X"035BD025", -- 00000314 + X"AF7A0000", -- 00000318 + X"401A6800", -- 0000031C + X"00000000", -- 00000320 + X"001AD202", -- 00000324 + X"335A0001", -- 00000328 + X"1740FFFB", -- 0000032C + X"00000000", -- 00000330 + X"401A7000", -- 00000334 + X"8FBF0000", -- 00000338 + X"27BDFFFC", -- 0000033C + X"8FAC0000", -- 00000340 + X"27BDFFFC", -- 00000344 + X"8FAB0000", -- 00000348 + X"27BDFFFC", -- 0000034C + X"8FAA0000", -- 00000350 + X"27BDFFFC", -- 00000354 + X"8FA90000", -- 00000358 + X"27BDFFFC", -- 0000035C + X"8FA80000", -- 00000360 + X"27BDFFFC", -- 00000364 + X"3C1D0000", -- 00000368 + X"8FBD0018", -- 0000036C + X"03400008", -- 00000370 + X"42000010", -- 00000374 + X"27BD0004", -- 00000378 + X"AFBF0000", -- 0000037C + X"27BD0004", -- 00000380 + X"AFAA0000", -- 00000384 + X"000A5402", -- 00000388 + X"0C1000ED", -- 0000038C + X"00000000", -- 00000390 + X"8FAA0000", -- 00000394 + X"27BDFFFC", -- 00000398 + X"0C1000ED", -- 0000039C + X"00000000", -- 000003A0 + X"8FBF0000", -- 000003A4 + X"27BDFFFC", -- 000003A8 + X"03E00008", -- 000003AC + X"00000000", -- 000003B0 + X"27BD0004", -- 000003B4 + X"AFBF0000", -- 000003B8 + X"27BD0004", -- 000003BC + X"AFAA0000", -- 000003C0 + X"000A5202", -- 000003C4 + X"0C1000FC", -- 000003C8 + X"00000000", -- 000003CC + X"8FAA0000", -- 000003D0 + X"27BDFFFC", -- 000003D4 + X"0C1000FC", -- 000003D8 + X"00000000", -- 000003DC + X"8FBF0000", -- 000003E0 + X"27BDFFFC", -- 000003E4 + X"03E00008", -- 000003E8 + X"00000000", -- 000003EC + X"27BD0004", -- 000003F0 + X"AFBF0000", -- 000003F4 + X"27BD0004", -- 000003F8 + X"AFAA0000", -- 000003FC + X"000A5102", -- 00000400 + X"0C10010B", -- 00000404 + X"00000000", -- 00000408 + X"8FAA0000", -- 0000040C + X"27BDFFFC", -- 00000410 + X"0C10010B", -- 00000414 + X"00000000", -- 00000418 + X"8FBF0000", -- 0000041C + X"27BDFFFC", -- 00000420 + X"03E00008", -- 00000424 + X"00000000", -- 00000428 + X"27BD0004", -- 0000042C + X"AFBF0000", -- 00000430 + X"27BD0004", -- 00000434 + X"AFAA0000", -- 00000438 + X"3C0C0000", -- 0000043C + X"258C0159", -- 00000440 + X"314A000F", -- 00000444 + X"018A6021", -- 00000448 + X"918A0000", -- 0000044C + X"0C10011C", -- 00000450 + X"00000000", -- 00000454 + X"8FAA0000", -- 00000458 + X"27BDFFFC", -- 0000045C + X"8FBF0000", -- 00000460 + X"27BDFFFC", -- 00000464 + X"03E00008", -- 00000468 + X"00000000", -- 0000046C + X"3C088000", -- 00000470 + X"35080008", -- 00000474 + X"91080000", -- 00000478 + X"3C098000", -- 0000047C + X"35290004", -- 00000480 + X"31080002", -- 00000484 + X"1500FFF9", -- 00000488 + X"00000000", -- 0000048C + X"03E00008", -- 00000490 + X"A12A0000", -- 00000494 + X"27BD0004", -- 00000498 + X"AFAB0000", -- 0000049C + X"27BD0004", -- 000004A0 + X"AFBF0000", -- 000004A4 + X"916A0000", -- 000004A8 + X"256B0001", -- 000004AC + X"19400005", -- 000004B0 + X"00000000", -- 000004B4 + X"0C10011C", -- 000004B8 + X"00000000", -- 000004BC + X"0810012A", -- 000004C0 + X"00000000", -- 000004C4 + X"8FBF0000", -- 000004C8 + X"27BDFFFC", -- 000004CC + X"8FAB0000", -- 000004D0 + X"27BDFFFC", -- 000004D4 + X"03E00008", -- 000004D8 + X"00000000", -- 000004DC + X"3C028000", -- 000004E0 + X"00042600", -- 000004E4 + X"00042603", -- 000004E8 + X"34450004", -- 000004EC + X"34430008", -- 000004F0 + X"90620000", -- 000004F4 + X"00000000", -- 000004F8 + X"30420002", -- 000004FC + X"1440FFFC", -- 00000500 + X"00000000", -- 00000504 + X"03E00008", -- 00000508 + X"A0A40000", -- 0000050C + X"27BDFFE0", -- 00000510 + X"AFB10014", -- 00000514 + X"AFB00010", -- 00000518 + X"AFBF0018", -- 0000051C + X"00808021", -- 00000520 + X"80840000", -- 00000524 + X"08100150", -- 00000528 + X"02008821", -- 0000052C + X"0C100138", -- 00000530 + X"26100001", -- 00000534 + X"82040000", -- 00000538 + X"00000000", -- 0000053C + X"1480FFFB", -- 00000540 + X"02111023", -- 00000544 + X"8FBF0018", -- 00000548 + X"8FB10014", -- 0000054C + X"8FB00010", -- 00000550 + X"03E00008", -- 00000554 + X"27BD0020", -- 00000558 + X"27BDFFE0", -- 0000055C + X"AFB10014", -- 00000560 + X"AFB00010", -- 00000564 + X"AFBF0018", -- 00000568 + X"00808021", -- 0000056C + X"24110007", -- 00000570 + X"00101F02", -- 00000574 + X"2C62000A", -- 00000578 + X"2631FFFF", -- 0000057C + X"00108100", -- 00000580 + X"14400002", -- 00000584 + X"24640030", -- 00000588 + X"24640037", -- 0000058C + X"0C100138", -- 00000590 + X"00000000", -- 00000594 + X"0621FFF7", -- 00000598 + X"00101F02", -- 0000059C + X"8FBF0018", -- 000005A0 + X"8FB10014", -- 000005A4 + X"8FB00010", -- 000005A8 + X"03E00008", -- 000005AC + X"27BD0020", -- 000005B0 + X"3C020000", -- 000005B4 + X"8C420000", -- 000005B8 + X"3C030000", -- 000005BC + X"8C630004", -- 000005C0 + X"27BDFFB8", -- 000005C4 + X"AFA20028", -- 000005C8 + X"AFA3002C", -- 000005CC + X"3C020000", -- 000005D0 + X"8C420008", -- 000005D4 + X"3C030000", -- 000005D8 + X"8C63000C", -- 000005DC + X"AFA20030", -- 000005E0 + X"AFA30034", -- 000005E4 + X"3C020000", -- 000005E8 + X"8C420010", -- 000005EC + X"3C030000", -- 000005F0 + X"8C630014", -- 000005F4 + X"3C058000", -- 000005F8 + X"AFA20038", -- 000005FC + X"AFA3003C", -- 00000600 + X"34A60009", -- 00000604 + X"24020035", -- 00000608 + X"34A50008", -- 0000060C + X"24030055", -- 00000610 + X"A0C20000", -- 00000614 + X"27A40010", -- 00000618 + X"A0A30000", -- 0000061C + X"AFBF0040", -- 00000620 + X"AFA00010", -- 00000624 + X"AFA00014", -- 00000628 + X"AFA00018", -- 0000062C + X"AFA0001C", -- 00000630 + X"0C100193", -- 00000634 + X"AFA00020", -- 00000638 + X"0C100144", -- 0000063C + X"27A40028", -- 00000640 + X"08100191", -- 00000644 + X"00000000", -- 00000648 + X"3C02C3D2", -- 0000064C + X"3442E1F0", -- 00000650 + X"AC820010", -- 00000654 + X"3C036745", -- 00000658 + X"3C02EFCD", -- 0000065C + X"34632301", -- 00000660 + X"3442AB89", -- 00000664 + X"AC830000", -- 00000668 + X"AC820004", -- 0000066C + X"3C0398BA", -- 00000670 + X"3C021032", -- 00000674 + X"3463DCFE", -- 00000678 + X"34425476", -- 0000067C + X"AC830008", -- 00000680 + X"03E00008", -- 00000684 + X"AC82000C", -- 00000688 + X"27BDFF80", -- 0000068C + X"AFB30064", -- 00000690 + X"8C93000C", -- 00000694 + X"AFB40068", -- 00000698 + X"8C980004", -- 0000069C + X"8C940008", -- 000006A0 + X"AFBE0078", -- 000006A4 + X"AFB70074", -- 000006A8 + X"AFB60070", -- 000006AC + X"AFB5006C", -- 000006B0 + X"AFB20060", -- 000006B4 + X"AFB1005C", -- 000006B8 + X"AFB00058", -- 000006BC + X"00131027", -- 000006C0 + X"8CA60014", -- 000006C4 + X"8CA70000", -- 000006C8 + X"8C950000", -- 000006CC + X"03141826", -- 000006D0 + X"00541025", -- 000006D4 + X"00731826", -- 000006D8 + X"00581026", -- 000006DC + X"00671821", -- 000006E0 + X"02A08821", -- 000006E4 + X"00461021", -- 000006E8 + X"3C0B50A2", -- 000006EC + X"356B8BE6", -- 000006F0 + X"02A3A821", -- 000006F4 + X"00511021", -- 000006F8 + X"004B8821", -- 000006FC + X"8C990010", -- 00000700 + X"AFA6000C", -- 00000704 + X"00151D42", -- 00000708 + X"00144582", -- 0000070C + X"00143280", -- 00000710 + X"001512C0", -- 00000714 + X"00C8B825", -- 00000718 + X"00431025", -- 0000071C + X"00113E02", -- 00000720 + X"00111A00", -- 00000724 + X"0059A821", -- 00000728 + X"00671825", -- 0000072C + X"00171027", -- 00000730 + X"00798821", -- 00000734 + X"8CA80038", -- 00000738 + X"8CA60004", -- 0000073C + X"02B81826", -- 00000740 + X"00581025", -- 00000744 + X"00771826", -- 00000748 + X"00511026", -- 0000074C + X"0320F021", -- 00000750 + X"00661821", -- 00000754 + X"00481021", -- 00000758 + X"0323C821", -- 0000075C + X"005E1021", -- 00000760 + X"004BF021", -- 00000764 + X"AFA80024", -- 00000768 + X"00191C82", -- 0000076C + X"00184582", -- 00000770 + X"00183280", -- 00000774 + X"00191380", -- 00000778 + X"00C8B025", -- 0000077C + X"00431025", -- 00000780 + X"001E3DC2", -- 00000784 + X"001E1A40", -- 00000788 + X"0053C821", -- 0000078C + X"00671825", -- 00000790 + X"00161027", -- 00000794 + X"0073F021", -- 00000798 + X"8CA70008", -- 0000079C + X"8CA8001C", -- 000007A0 + X"03351826", -- 000007A4 + X"00511025", -- 000007A8 + X"00761826", -- 000007AC + X"005E1026", -- 000007B0 + X"02609021", -- 000007B4 + X"00671821", -- 000007B8 + X"00481021", -- 000007BC + X"02639821", -- 000007C0 + X"00521021", -- 000007C4 + X"004B9021", -- 000007C8 + X"AFA70000", -- 000007CC + X"00113582", -- 000007D0 + X"00133C42", -- 000007D4 + X"00131BC0", -- 000007D8 + X"00111280", -- 000007DC + X"00468825", -- 000007E0 + X"00671825", -- 000007E4 + X"001215C2", -- 000007E8 + X"00123240", -- 000007EC + X"00779821", -- 000007F0 + X"00C23025", -- 000007F4 + X"00153D82", -- 000007F8 + X"00111027", -- 000007FC + X"00151A80", -- 00000800 + X"00D79021", -- 00000804 + X"0067A825", -- 00000808 + X"8CA60000", -- 0000080C + X"8CA7000C", -- 00000810 + X"02791826", -- 00000814 + X"005E1025", -- 00000818 + X"00751826", -- 0000081C + X"00521026", -- 00000820 + X"00671821", -- 00000824 + X"00461021", -- 00000828 + X"02E3A021", -- 0000082C + X"00571021", -- 00000830 + X"004BB821", -- 00000834 + X"AFA60008", -- 00000838 + X"00143D02", -- 0000083C + X"001E3582", -- 00000840 + X"00141B00", -- 00000844 + X"001E1280", -- 00000848 + X"0046F025", -- 0000084C + X"00671825", -- 00000850 + X"00171542", -- 00000854 + X"001732C0", -- 00000858 + X"0076A021", -- 0000085C + X"00C23025", -- 00000860 + X"00193D82", -- 00000864 + X"001E1027", -- 00000868 + X"00191A80", -- 0000086C + X"00D6B821", -- 00000870 + X"0067C825", -- 00000874 + X"8CA60010", -- 00000878 + X"AFA80014", -- 0000087C + X"02931826", -- 00000880 + X"8CA80024", -- 00000884 + X"00521025", -- 00000888 + X"00791826", -- 0000088C + X"00571026", -- 00000890 + X"00661821", -- 00000894 + X"00481021", -- 00000898 + X"02C3C021", -- 0000089C + X"00561021", -- 000008A0 + X"004BB021", -- 000008A4 + X"00183EC2", -- 000008A8 + X"00123582", -- 000008AC + X"00181940", -- 000008B0 + X"00121280", -- 000008B4 + X"00469025", -- 000008B8 + X"00671825", -- 000008BC + X"001614C2", -- 000008C0 + X"00163340", -- 000008C4 + X"0075C021", -- 000008C8 + X"00C23025", -- 000008CC + X"00133D82", -- 000008D0 + X"00121027", -- 000008D4 + X"00131A80", -- 000008D8 + X"00D1B021", -- 000008DC + X"00679825", -- 000008E0 + X"00571025", -- 000008E4 + X"8FA70000", -- 000008E8 + X"AFA80010", -- 000008EC + X"03141826", -- 000008F0 + X"8CA80014", -- 000008F4 + X"00561026", -- 000008F8 + X"00731826", -- 000008FC + X"00471021", -- 00000900 + X"00681821", -- 00000904 + X"00511021", -- 00000908 + X"004B8821", -- 0000090C + X"02A3A821", -- 00000910 + X"00173582", -- 00000914 + X"00171280", -- 00000918 + X"0046B825", -- 0000091C + X"AFA7001C", -- 00000920 + X"00111442", -- 00000924 + X"00153E02", -- 00000928 + X"00151A00", -- 0000092C + X"001133C0", -- 00000930 + X"00671825", -- 00000934 + X"00C23025", -- 00000938 + X"00143D82", -- 0000093C + X"00141280", -- 00000940 + X"0047A025", -- 00000944 + X"8CA2002C", -- 00000948 + X"0079A821", -- 0000094C + X"00171827", -- 00000950 + X"AFA2002C", -- 00000954 + X"00DE8821", -- 00000958 + X"8FA7002C", -- 0000095C + X"8CA60018", -- 00000960 + X"02B81026", -- 00000964 + X"00761825", -- 00000968 + X"00541026", -- 0000096C + X"00711826", -- 00000970 + X"00461021", -- 00000974 + X"00671821", -- 00000978 + X"0322C821", -- 0000097C + X"007E1821", -- 00000980 + X"006BF021", -- 00000984 + X"00193E42", -- 00000988 + X"00163582", -- 0000098C + X"001919C0", -- 00000990 + X"00161280", -- 00000994 + X"0046B025", -- 00000998 + X"00671825", -- 0000099C + X"001E1442", -- 000009A0 + X"001E33C0", -- 000009A4 + X"0073C821", -- 000009A8 + X"00C23025", -- 000009AC + X"00183D82", -- 000009B0 + X"00161027", -- 000009B4 + X"00181A80", -- 000009B8 + X"00D2F021", -- 000009BC + X"0067C025", -- 000009C0 + X"8CA80010", -- 000009C4 + X"8CA6001C", -- 000009C8 + X"03351826", -- 000009CC + X"00511025", -- 000009D0 + X"00781826", -- 000009D4 + X"005E1026", -- 000009D8 + X"00661821", -- 000009DC + X"00481021", -- 000009E0 + X"02639821", -- 000009E4 + X"00521021", -- 000009E8 + X"004B9021", -- 000009EC + X"00133DC2", -- 000009F0 + X"00113582", -- 000009F4 + X"00131A40", -- 000009F8 + X"00111280", -- 000009FC + X"00468825", -- 00000A00 + X"00671825", -- 00000A04 + X"001216C2", -- 00000A08 + X"00123140", -- 00000A0C + X"00749821", -- 00000A10 + X"00C23025", -- 00000A14 + X"00153D82", -- 00000A18 + X"00111827", -- 00000A1C + X"00151280", -- 00000A20 + X"00D79021", -- 00000A24 + X"0047A825", -- 00000A28 + X"AFA80004", -- 00000A2C + X"8CA70034", -- 00000A30 + X"8CA80020", -- 00000A34 + X"02791026", -- 00000A38 + X"007E1825", -- 00000A3C + X"00551026", -- 00000A40 + X"00721826", -- 00000A44 + X"00481021", -- 00000A48 + X"00671821", -- 00000A4C + X"0282A021", -- 00000A50 + X"00771821", -- 00000A54 + X"006BB821", -- 00000A58 + X"AFA70034", -- 00000A5C + X"001E3582", -- 00000A60 + X"00143D42", -- 00000A64 + X"00141AC0", -- 00000A68 + X"001E1280", -- 00000A6C + X"0046F025", -- 00000A70 + X"00671825", -- 00000A74 + X"00171642", -- 00000A78 + X"001731C0", -- 00000A7C + X"0078A021", -- 00000A80 + X"00C23025", -- 00000A84 + X"00193D82", -- 00000A88 + X"001E1827", -- 00000A8C + X"00191280", -- 00000A90 + X"8CAC0018", -- 00000A94 + X"00D6B821", -- 00000A98 + X"0047C825", -- 00000A9C + X"8CA60024", -- 00000AA0 + X"02931026", -- 00000AA4 + X"00721825", -- 00000AA8 + X"00591026", -- 00000AAC + X"00771826", -- 00000AB0 + X"00461021", -- 00000AB4 + X"006C1821", -- 00000AB8 + X"0302C021", -- 00000ABC + X"00761821", -- 00000AC0 + X"006BB021", -- 00000AC4 + X"00183CC2", -- 00000AC8 + X"00123582", -- 00000ACC + X"00181B40", -- 00000AD0 + X"00121280", -- 00000AD4 + X"00469025", -- 00000AD8 + X"00671825", -- 00000ADC + X"00161642", -- 00000AE0 + X"001631C0", -- 00000AE4 + X"0075C021", -- 00000AE8 + X"00C23025", -- 00000AEC + X"00133D82", -- 00000AF0 + X"00121827", -- 00000AF4 + X"00131280", -- 00000AF8 + X"00D1B021", -- 00000AFC + X"00479825", -- 00000B00 + X"8CA80028", -- 00000B04 + X"8CA7003C", -- 00000B08 + X"03141026", -- 00000B0C + X"00771825", -- 00000B10 + X"00531026", -- 00000B14 + X"00761826", -- 00000B18 + X"00481021", -- 00000B1C + X"00671821", -- 00000B20 + X"02A2A821", -- 00000B24 + X"00711821", -- 00000B28 + X"AFA70030", -- 00000B2C + X"006B8821", -- 00000B30 + X"00153C82", -- 00000B34 + X"00173582", -- 00000B38 + X"00151B80", -- 00000B3C + X"00171280", -- 00000B40 + X"0046B825", -- 00000B44 + X"00671825", -- 00000B48 + X"00111602", -- 00000B4C + X"00113200", -- 00000B50 + X"0079A821", -- 00000B54 + X"00C23025", -- 00000B58 + X"00143D82", -- 00000B5C + X"00171827", -- 00000B60 + X"00141280", -- 00000B64 + X"8CAD0020", -- 00000B68 + X"00DE8821", -- 00000B6C + X"0047A025", -- 00000B70 + X"8CA6002C", -- 00000B74 + X"02B81026", -- 00000B78 + X"00761825", -- 00000B7C + X"00541026", -- 00000B80 + X"00711826", -- 00000B84 + X"00461021", -- 00000B88 + X"006D1821", -- 00000B8C + X"0322C821", -- 00000B90 + X"007E1821", -- 00000B94 + X"006BF021", -- 00000B98 + X"00193C42", -- 00000B9C + X"00163582", -- 00000BA0 + X"00191BC0", -- 00000BA4 + X"00161280", -- 00000BA8 + X"0046B025", -- 00000BAC + X"00671825", -- 00000BB0 + X"001E1542", -- 00000BB4 + X"001E32C0", -- 00000BB8 + X"0073C821", -- 00000BBC + X"00C23025", -- 00000BC0 + X"00183D82", -- 00000BC4 + X"00161027", -- 00000BC8 + X"00181A80", -- 00000BCC + X"00D2F021", -- 00000BD0 + X"0067C025", -- 00000BD4 + X"8CA80030", -- 00000BD8 + X"8CA70004", -- 00000BDC + X"03351826", -- 00000BE0 + X"00511025", -- 00000BE4 + X"00781826", -- 00000BE8 + X"005E1026", -- 00000BEC + X"00681821", -- 00000BF0 + X"00471021", -- 00000BF4 + X"02639821", -- 00000BF8 + X"00521021", -- 00000BFC + X"AFA70028", -- 00000C00 + X"004B9021", -- 00000C04 + X"00133E82", -- 00000C08 + X"00113582", -- 00000C0C + X"00131980", -- 00000C10 + X"00111280", -- 00000C14 + X"00468825", -- 00000C18 + X"00671825", -- 00000C1C + X"00121482", -- 00000C20 + X"00123380", -- 00000C24 + X"00749821", -- 00000C28 + X"00C23025", -- 00000C2C + X"00153D82", -- 00000C30 + X"00111027", -- 00000C34 + X"00151A80", -- 00000C38 + X"00D79021", -- 00000C3C + X"0067A825", -- 00000C40 + X"8CA60028", -- 00000C44 + X"8CA70034", -- 00000C48 + X"02791826", -- 00000C4C + X"005E1025", -- 00000C50 + X"00751826", -- 00000C54 + X"00521026", -- 00000C58 + X"00671821", -- 00000C5C + X"00461021", -- 00000C60 + X"0283A021", -- 00000C64 + X"00571021", -- 00000C68 + X"AFA60020", -- 00000C6C + X"004BB821", -- 00000C70 + X"00143E42", -- 00000C74 + X"001E3582", -- 00000C78 + X"001419C0", -- 00000C7C + X"001E1280", -- 00000C80 + X"0046F025", -- 00000C84 + X"00671825", -- 00000C88 + X"00171482", -- 00000C8C + X"00173380", -- 00000C90 + X"0078A021", -- 00000C94 + X"00C23025", -- 00000C98 + X"00193D82", -- 00000C9C + X"001E1827", -- 00000CA0 + X"00191280", -- 00000CA4 + X"8CB0000C", -- 00000CA8 + X"00D6B821", -- 00000CAC + X"0047C825", -- 00000CB0 + X"8CA80038", -- 00000CB4 + X"02931026", -- 00000CB8 + X"00721825", -- 00000CBC + X"00591026", -- 00000CC0 + X"00771826", -- 00000CC4 + X"00481021", -- 00000CC8 + X"00701821", -- 00000CCC + X"0302C021", -- 00000CD0 + X"00761821", -- 00000CD4 + X"006BB021", -- 00000CD8 + X"00183DC2", -- 00000CDC + X"00181A40", -- 00000CE0 + X"00671825", -- 00000CE4 + X"00123582", -- 00000CE8 + X"00121280", -- 00000CEC + X"0075C021", -- 00000CF0 + X"00469025", -- 00000CF4 + X"00133D82", -- 00000CF8 + X"00161502", -- 00000CFC + X"00163300", -- 00000D00 + X"00131A80", -- 00000D04 + X"00679825", -- 00000D08 + X"00C23025", -- 00000D0C + X"8CA7003C", -- 00000D10 + X"03141826", -- 00000D14 + X"00121027", -- 00000D18 + X"00D1B021", -- 00000D1C + X"00571025", -- 00000D20 + X"8CA60030", -- 00000D24 + X"00731826", -- 00000D28 + X"00671821", -- 00000D2C + X"00561026", -- 00000D30 + X"02A3A821", -- 00000D34 + X"00461021", -- 00000D38 + X"AFA60018", -- 00000D3C + X"00151E02", -- 00000D40 + X"00511021", -- 00000D44 + X"00153200", -- 00000D48 + X"004B8821", -- 00000D4C + X"00C33025", -- 00000D50 + X"00173D82", -- 00000D54 + X"00171280", -- 00000D58 + X"0047B825", -- 00000D5C + X"00D9A821", -- 00000D60 + X"00114682", -- 00000D64 + X"00111980", -- 00000D68 + X"00143D82", -- 00000D6C + X"00141280", -- 00000D70 + X"0047A025", -- 00000D74 + X"00681825", -- 00000D78 + X"00153027", -- 00000D7C + X"007E8821", -- 00000D80 + X"8CA8001C", -- 00000D84 + X"00D43024", -- 00000D88 + X"02B81024", -- 00000D8C + X"00173827", -- 00000D90 + X"00F63824", -- 00000D94 + X"02371824", -- 00000D98 + X"00461025", -- 00000D9C + X"00671825", -- 00000DA0 + X"00481021", -- 00000DA4 + X"3C0B5A82", -- 00000DA8 + X"356B7999", -- 00000DAC + X"00591021", -- 00000DB0 + X"006C1821", -- 00000DB4 + X"3C0A5C4D", -- 00000DB8 + X"354AD124", -- 00000DBC + X"004BC821", -- 00000DC0 + X"007E1821", -- 00000DC4 + X"006AF021", -- 00000DC8 + X"00194642", -- 00000DCC + X"001919C0", -- 00000DD0 + X"001E4DC2", -- 00000DD4 + X"00681825", -- 00000DD8 + X"00163D82", -- 00000DDC + X"001E3240", -- 00000DE0 + X"00161280", -- 00000DE4 + X"0073C821", -- 00000DE8 + X"0047B025", -- 00000DEC + X"00C93025", -- 00000DF0 + X"00181D82", -- 00000DF4 + X"00181280", -- 00000DF8 + X"00D2F021", -- 00000DFC + X"0043C025", -- 00000E00 + X"00193027", -- 00000E04 + X"00D83024", -- 00000E08 + X"03351024", -- 00000E0C + X"00163827", -- 00000E10 + X"00F13824", -- 00000E14 + X"03D61824", -- 00000E18 + X"00461025", -- 00000E1C + X"8FA6002C", -- 00000E20 + X"00671825", -- 00000E24 + X"8CA70010", -- 00000E28 + X"00661821", -- 00000E2C + X"00721821", -- 00000E30 + X"00471021", -- 00000E34 + X"006A9021", -- 00000E38 + X"00531021", -- 00000E3C + X"004B9821", -- 00000E40 + X"00123CC2", -- 00000E44 + X"00113582", -- 00000E48 + X"00121B40", -- 00000E4C + X"00111280", -- 00000E50 + X"00468825", -- 00000E54 + X"00671825", -- 00000E58 + X"00133682", -- 00000E5C + X"00131180", -- 00000E60 + X"00779021", -- 00000E64 + X"00461025", -- 00000E68 + X"00113027", -- 00000E6C + X"00549821", -- 00000E70 + X"00DE3024", -- 00000E74 + X"02511024", -- 00000E78 + X"00153D82", -- 00000E7C + X"00151A80", -- 00000E80 + X"00461025", -- 00000E84 + X"0067A825", -- 00000E88 + X"00501021", -- 00000E8C + X"00131827", -- 00000E90 + X"8CA80034", -- 00000E94 + X"00751824", -- 00000E98 + X"02793024", -- 00000E9C + X"00571021", -- 00000EA0 + X"004AB821", -- 00000EA4 + X"00C33025", -- 00000EA8 + X"00C83021", -- 00000EAC + X"001E3D82", -- 00000EB0 + X"00174442", -- 00000EB4 + X"00171BC0", -- 00000EB8 + X"001E1280", -- 00000EBC + X"0047F025", -- 00000EC0 + X"00681825", -- 00000EC4 + X"00D43021", -- 00000EC8 + X"0076B821", -- 00000ECC + X"00CBA021", -- 00000ED0 + X"001E1027", -- 00000ED4 + X"00143E02", -- 00000ED8 + X"00521024", -- 00000EDC + X"02FE1824", -- 00000EE0 + X"00143200", -- 00000EE4 + X"00C73025", -- 00000EE8 + X"00621825", -- 00000EEC + X"00193D82", -- 00000EF0 + X"00191280", -- 00000EF4 + X"0047C825", -- 00000EF8 + X"8FA20014", -- 00000EFC + X"00D8A021", -- 00000F00 + X"00621821", -- 00000F04 + X"00761821", -- 00000F08 + X"00141027", -- 00000F0C + X"006AB021", -- 00000F10 + X"00591024", -- 00000F14 + X"8CA30004", -- 00000F18 + X"02933024", -- 00000F1C + X"00C23025", -- 00000F20 + X"00164642", -- 00000F24 + X"00C33021", -- 00000F28 + X"00123D82", -- 00000F2C + X"001619C0", -- 00000F30 + X"00121280", -- 00000F34 + X"00479025", -- 00000F38 + X"00681825", -- 00000F3C + X"0071B021", -- 00000F40 + X"00123827", -- 00000F44 + X"00F73824", -- 00000F48 + X"02D21824", -- 00000F4C + X"00D83021", -- 00000F50 + X"00CBC021", -- 00000F54 + X"00671825", -- 00000F58 + X"8FA70008", -- 00000F5C + X"001834C2", -- 00000F60 + X"00181340", -- 00000F64 + X"00461025", -- 00000F68 + X"00671821", -- 00000F6C + X"0055C021", -- 00000F70 + X"00133582", -- 00000F74 + X"00131280", -- 00000F78 + X"00711821", -- 00000F7C + X"00469825", -- 00000F80 + X"006A8821", -- 00000F84 + X"00181027", -- 00000F88 + X"00531024", -- 00000F8C + X"03141824", -- 00000F90 + X"00114502", -- 00000F94 + X"00113B00", -- 00000F98 + X"00E83825", -- 00000F9C + X"00621825", -- 00000FA0 + X"8CA80028", -- 00000FA4 + X"00173582", -- 00000FA8 + X"00171280", -- 00000FAC + X"0046B825", -- 00000FB0 + X"00FE8821", -- 00000FB4 + X"00681821", -- 00000FB8 + X"00173027", -- 00000FBC + X"00D63024", -- 00000FC0 + X"02371024", -- 00000FC4 + X"00751821", -- 00000FC8 + X"006BA821", -- 00000FCC + X"00461025", -- 00000FD0 + X"8FA60034", -- 00000FD4 + X"00153D42", -- 00000FD8 + X"00151AC0", -- 00000FDC + X"00671825", -- 00000FE0 + X"00461021", -- 00000FE4 + X"0079A821", -- 00000FE8 + X"005E1021", -- 00000FEC + X"00143582", -- 00000FF0 + X"00141A80", -- 00000FF4 + X"0066A025", -- 00000FF8 + X"004AF021", -- 00000FFC + X"00153827", -- 00001000 + X"00F43824", -- 00001004 + X"001E4E02", -- 00001008 + X"02B83024", -- 0000100C + X"00164582", -- 00001010 + X"001E1A00", -- 00001014 + X"00161280", -- 00001018 + X"0048B025", -- 0000101C + X"00691825", -- 00001020 + X"00C73025", -- 00001024 + X"0072F021", -- 00001028 + X"00CC3021", -- 0000102C + X"00161827", -- 00001030 + X"8FA8000C", -- 00001034 + X"00711824", -- 00001038 + X"03D61024", -- 0000103C + X"00D93021", -- 00001040 + X"00CBC821", -- 00001044 + X"00431025", -- 00001048 + X"00193DC2", -- 0000104C + X"00481021", -- 00001050 + X"00191A40", -- 00001054 + X"00671825", -- 00001058 + X"00521021", -- 0000105C + X"0073C821", -- 00001060 + X"004A9021", -- 00001064 + X"00181D82", -- 00001068 + X"00181280", -- 0000106C + X"0043C025", -- 00001070 + X"00113582", -- 00001074 + X"00191827", -- 00001078 + X"00111280", -- 0000107C + X"00468825", -- 00001080 + X"001245C2", -- 00001084 + X"00781824", -- 00001088 + X"03351024", -- 0000108C + X"00123A40", -- 00001090 + X"00E83825", -- 00001094 + X"00431025", -- 00001098 + X"8CA3003C", -- 0000109C + X"00F79021", -- 000010A0 + X"00113027", -- 000010A4 + X"00DE3024", -- 000010A8 + X"00431021", -- 000010AC + X"02511824", -- 000010B0 + X"00661825", -- 000010B4 + X"8FA60020", -- 000010B8 + X"00531021", -- 000010BC + X"004B9821", -- 000010C0 + X"00661821", -- 000010C4 + X"00771821", -- 000010C8 + X"00133642", -- 000010CC + X"001311C0", -- 000010D0 + X"006AB821", -- 000010D4 + X"00461025", -- 000010D8 + X"00549821", -- 000010DC + X"00174D42", -- 000010E0 + X"00154582", -- 000010E4 + X"001E3D82", -- 000010E8 + X"00171AC0", -- 000010EC + X"00153280", -- 000010F0 + X"001E1280", -- 000010F4 + X"0047F025", -- 000010F8 + X"00C8A825", -- 000010FC + X"00691825", -- 00001100 + X"00131027", -- 00001104 + X"0076B821", -- 00001108 + X"00551024", -- 0000110C + X"02791824", -- 00001110 + X"001E3027", -- 00001114 + X"8FA80024", -- 00001118 + X"00D23024", -- 0000111C + X"00621825", -- 00001120 + X"02FE1024", -- 00001124 + X"00461025", -- 00001128 + X"00701821", -- 0000112C + X"00741821", -- 00001130 + X"00481021", -- 00001134 + X"006BA021", -- 00001138 + X"00561021", -- 0000113C + X"004AB021", -- 00001140 + X"00141C42", -- 00001144 + X"001433C0", -- 00001148 + X"00C33025", -- 0000114C + X"00164642", -- 00001150 + X"00123D82", -- 00001154 + X"001619C0", -- 00001158 + X"00121280", -- 0000115C + X"00479025", -- 00001160 + X"00D8A021", -- 00001164 + X"00681825", -- 00001168 + X"00193D82", -- 0000116C + X"00191280", -- 00001170 + X"0047C825", -- 00001174 + X"0071B021", -- 00001178 + X"00143027", -- 0000117C + X"00123827", -- 00001180 + X"00D93024", -- 00001184 + X"00F73824", -- 00001188 + X"02931024", -- 0000118C + X"02D21824", -- 00001190 + X"00461025", -- 00001194 + X"00671825", -- 00001198 + X"8CA60030", -- 0000119C + X"8FA70030", -- 000011A0 + X"00461021", -- 000011A4 + X"00671821", -- 000011A8 + X"00581021", -- 000011AC + X"00711821", -- 000011B0 + X"004BC021", -- 000011B4 + X"006A8821", -- 000011B8 + X"00184642", -- 000011BC + X"00114E42", -- 000011C0 + X"00173D82", -- 000011C4 + X"001819C0", -- 000011C8 + X"001131C0", -- 000011CC + X"00171280", -- 000011D0 + X"0047B825", -- 000011D4 + X"00681825", -- 000011D8 + X"00C93025", -- 000011DC + X"0075C021", -- 000011E0 + X"00DE8821", -- 000011E4 + X"00131D82", -- 000011E8 + X"00173827", -- 000011EC + X"00131280", -- 000011F0 + X"00439825", -- 000011F4 + X"00F63824", -- 000011F8 + X"02371824", -- 000011FC + X"00183027", -- 00001200 + X"8CA80000", -- 00001204 + X"00D33024", -- 00001208 + X"03141024", -- 0000120C + X"00671825", -- 00001210 + X"00461025", -- 00001214 + X"006D1821", -- 00001218 + X"007E1821", -- 0000121C + X"00481021", -- 00001220 + X"006AF021", -- 00001224 + X"00551021", -- 00001228 + X"004BA821", -- 0000122C + X"001E3D02", -- 00001230 + X"00163582", -- 00001234 + X"001E1B00", -- 00001238 + X"00161280", -- 0000123C + X"0046B025", -- 00001240 + X"00671825", -- 00001244 + X"00153502", -- 00001248 + X"00151300", -- 0000124C + X"0072F021", -- 00001250 + X"00461025", -- 00001254 + X"00163027", -- 00001258 + X"0059A821", -- 0000125C + X"00D13024", -- 00001260 + X"03D61024", -- 00001264 + X"00143D82", -- 00001268 + X"00141A80", -- 0000126C + X"00461025", -- 00001270 + X"8FA60018", -- 00001274 + X"0067A025", -- 00001278 + X"00151827", -- 0000127C + X"8CA70024", -- 00001280 + X"00741824", -- 00001284 + X"00461021", -- 00001288 + X"02B83024", -- 0000128C + X"00C33025", -- 00001290 + X"00521021", -- 00001294 + X"004A9021", -- 00001298 + X"00C73021", -- 0000129C + X"00124642", -- 000012A0 + X"00D93021", -- 000012A4 + X"00113D82", -- 000012A8 + X"001219C0", -- 000012AC + X"00111280", -- 000012B0 + X"00478825", -- 000012B4 + X"00CBC821", -- 000012B8 + X"00681825", -- 000012BC + X"00779021", -- 000012C0 + X"00193C42", -- 000012C4 + X"001933C0", -- 000012C8 + X"00111027", -- 000012CC + X"00C73025", -- 000012D0 + X"005E1024", -- 000012D4 + X"02511824", -- 000012D8 + X"00D3C821", -- 000012DC + X"8FA80004", -- 000012E0 + X"00621825", -- 000012E4 + X"00183D82", -- 000012E8 + X"00181280", -- 000012EC + X"0047C025", -- 000012F0 + X"00191027", -- 000012F4 + X"00581024", -- 000012F8 + X"03353024", -- 000012FC + X"00681821", -- 00001300 + X"00771821", -- 00001304 + X"00C23025", -- 00001308 + X"8CA20014", -- 0000130C + X"006AB821", -- 00001310 + X"00174682", -- 00001314 + X"00C23021", -- 00001318 + X"001E3D82", -- 0000131C + X"00171980", -- 00001320 + X"001E1280", -- 00001324 + X"0047F025", -- 00001328 + X"00681825", -- 0000132C + X"0076B821", -- 00001330 + X"00D33021", -- 00001334 + X"001E3827", -- 00001338 + X"00CB9821", -- 0000133C + X"00F23824", -- 00001340 + X"02FE1824", -- 00001344 + X"001335C2", -- 00001348 + X"00131240", -- 0000134C + X"00671825", -- 00001350 + X"8FA70010", -- 00001354 + X"00461025", -- 00001358 + X"00549821", -- 0000135C + X"00153582", -- 00001360 + X"00671821", -- 00001364 + X"00151280", -- 00001368 + X"0046A825", -- 0000136C + X"00761821", -- 00001370 + X"00131027", -- 00001374 + X"006AB021", -- 00001378 + X"00551024", -- 0000137C + X"02791824", -- 00001380 + X"00164442", -- 00001384 + X"00621825", -- 00001388 + X"00123582", -- 0000138C + X"00163BC0", -- 00001390 + X"00121280", -- 00001394 + X"00469025", -- 00001398 + X"00E83825", -- 0000139C + X"8FA80000", -- 000013A0 + X"00F1B021", -- 000013A4 + X"00123027", -- 000013A8 + X"00D73024", -- 000013AC + X"02D21024", -- 000013B0 + X"00681821", -- 000013B4 + X"00741821", -- 000013B8 + X"00461025", -- 000013BC + X"8FA60028", -- 000013C0 + X"006BA021", -- 000013C4 + X"00143D42", -- 000013C8 + X"00141AC0", -- 000013CC + X"00461021", -- 000013D0 + X"00671825", -- 000013D4 + X"00511021", -- 000013D8 + X"0078A021", -- 000013DC + X"004A8821", -- 000013E0 + X"00193582", -- 000013E4 + X"00191A80", -- 000013E8 + X"0066C825", -- 000013EC + X"00114CC2", -- 000013F0 + X"00143827", -- 000013F4 + X"00174582", -- 000013F8 + X"00111B40", -- 000013FC + X"00171280", -- 00001400 + X"0048B825", -- 00001404 + X"00F93824", -- 00001408 + X"02933024", -- 0000140C + X"00691825", -- 00001410 + X"007E8821", -- 00001414 + X"00C73025", -- 00001418 + X"00171827", -- 0000141C + X"8CA70038", -- 00001420 + X"8FA8001C", -- 00001424 + X"00761824", -- 00001428 + X"02371024", -- 0000142C + X"00C73021", -- 00001430 + X"00431025", -- 00001434 + X"00D83021", -- 00001438 + X"00481021", -- 0000143C + X"00CBC021", -- 00001440 + X"005E1021", -- 00001444 + X"004AF021", -- 00001448 + X"00183E42", -- 0000144C + X"001819C0", -- 00001450 + X"00133582", -- 00001454 + X"00131280", -- 00001458 + X"00469825", -- 0000145C + X"00671825", -- 00001460 + X"001E32C0", -- 00001464 + X"001E3D42", -- 00001468 + X"0075C021", -- 0000146C + X"00C73025", -- 00001470 + X"00D2F021", -- 00001474 + X"00181827", -- 00001478 + X"00163D82", -- 0000147C + X"00163280", -- 00001480 + X"00C7B025", -- 00001484 + X"00731824", -- 00001488 + X"8CA6002C", -- 0000148C + X"03141024", -- 00001490 + X"00431025", -- 00001494 + X"00111827", -- 00001498 + X"8FA70030", -- 0000149C + X"007E1825", -- 000014A0 + X"00461021", -- 000014A4 + X"00551021", -- 000014A8 + X"00761826", -- 000014AC + X"004BA821", -- 000014B0 + X"00671821", -- 000014B4 + X"3C0A6D70", -- 000014B8 + X"354A3EF3", -- 000014BC + X"001534C2", -- 000014C0 + X"00721821", -- 000014C4 + X"00151340", -- 000014C8 + X"006A9021", -- 000014CC + X"00461025", -- 000014D0 + X"0059A821", -- 000014D4 + X"001245C2", -- 000014D8 + X"00143582", -- 000014DC + X"00121A40", -- 000014E0 + X"00141280", -- 000014E4 + X"0046A025", -- 000014E8 + X"00681825", -- 000014EC + X"00153827", -- 000014F0 + X"00779021", -- 000014F4 + X"00F44024", -- 000014F8 + X"02B81824", -- 000014FC + X"00114D82", -- 00001500 + X"001E1027", -- 00001504 + X"00113280", -- 00001508 + X"00C98825", -- 0000150C + X"00681825", -- 00001510 + X"8FA6000C", -- 00001514 + X"00521025", -- 00001518 + X"00511026", -- 0000151C + X"006D1821", -- 00001520 + X"00791821", -- 00001524 + X"00461021", -- 00001528 + X"006BC821", -- 0000152C + X"00571021", -- 00001530 + X"004AB821", -- 00001534 + X"00191D02", -- 00001538 + X"00191300", -- 0000153C + X"00431025", -- 00001540 + X"00173642", -- 00001544 + X"001719C0", -- 00001548 + X"0053C821", -- 0000154C + X"00661825", -- 00001550 + X"00181280", -- 00001554 + X"00183582", -- 00001558 + X"0076B821", -- 0000155C + X"0046C025", -- 00001560 + X"00F93825", -- 00001564 + X"001E3582", -- 00001568 + X"00121027", -- 0000156C + X"001E1A80", -- 00001570 + X"0066F025", -- 00001574 + X"00F83826", -- 00001578 + X"8FA30028", -- 0000157C + X"00571025", -- 00001580 + X"005E1026", -- 00001584 + X"00F03821", -- 00001588 + X"3C096ED9", -- 0000158C + X"3529EBA1", -- 00001590 + X"00F33821", -- 00001594 + X"00431021", -- 00001598 + X"00E99821", -- 0000159C + X"00561021", -- 000015A0 + X"004AB021", -- 000015A4 + X"00131D42", -- 000015A8 + X"001312C0", -- 000015AC + X"00431025", -- 000015B0 + X"00163442", -- 000015B4 + X"00161BC0", -- 000015B8 + X"00549821", -- 000015BC + X"00661825", -- 000015C0 + X"00153D82", -- 000015C4 + X"00151280", -- 000015C8 + X"0071B021", -- 000015CC + X"0047A825", -- 000015D0 + X"00193027", -- 000015D4 + X"00123D82", -- 000015D8 + X"00121A80", -- 000015DC + X"00679025", -- 000015E0 + X"00D33025", -- 000015E4 + X"8CA70028", -- 000015E8 + X"00171027", -- 000015EC + X"00D53026", -- 000015F0 + X"00561025", -- 000015F4 + X"00521026", -- 000015F8 + X"00C73021", -- 000015FC + X"00D43021", -- 00001600 + X"00501021", -- 00001604 + X"00C9A021", -- 00001608 + X"00511021", -- 0000160C + X"004A8821", -- 00001610 + X"00141CC2", -- 00001614 + X"00141340", -- 00001618 + X"00431025", -- 0000161C + X"00113542", -- 00001620 + X"00111AC0", -- 00001624 + X"0058A021", -- 00001628 + X"00661825", -- 0000162C + X"00193D82", -- 00001630 + X"00133027", -- 00001634 + X"00191280", -- 00001638 + X"007E8821", -- 0000163C + X"0047C825", -- 00001640 + X"8CA80038", -- 00001644 + X"00D43025", -- 00001648 + X"00173D82", -- 0000164C + X"00161027", -- 00001650 + X"00171A80", -- 00001654 + X"0067B825", -- 00001658 + X"00D93026", -- 0000165C + X"8FA30014", -- 00001660 + X"00511025", -- 00001664 + X"00571026", -- 00001668 + X"00C83021", -- 0000166C + X"00D83021", -- 00001670 + X"00431021", -- 00001674 + X"00C9C021", -- 00001678 + X"005E1021", -- 0000167C + X"004AF021", -- 00001680 + X"00181E82", -- 00001684 + X"00181180", -- 00001688 + X"00431025", -- 0000168C + X"001E3602", -- 00001690 + X"001E1A00", -- 00001694 + X"0055C021", -- 00001698 + X"00661825", -- 0000169C + X"00133D82", -- 000016A0 + X"00131280", -- 000016A4 + X"0072F021", -- 000016A8 + X"00479825", -- 000016AC + X"00143027", -- 000016B0 + X"00163D82", -- 000016B4 + X"00161A80", -- 000016B8 + X"0067B025", -- 000016BC + X"00D83025", -- 000016C0 + X"8CA70010", -- 000016C4 + X"00111027", -- 000016C8 + X"00D33026", -- 000016CC + X"005E1025", -- 000016D0 + X"00561026", -- 000016D4 + X"00C73021", -- 000016D8 + X"00D53021", -- 000016DC + X"00481021", -- 000016E0 + X"00C9A821", -- 000016E4 + X"00521021", -- 000016E8 + X"004A9021", -- 000016EC + X"00151E42", -- 000016F0 + X"001511C0", -- 000016F4 + X"00431025", -- 000016F8 + X"00123682", -- 000016FC + X"00121980", -- 00001700 + X"0059A821", -- 00001704 + X"00661825", -- 00001708 + X"00143D82", -- 0000170C + X"00141280", -- 00001710 + X"00779021", -- 00001714 + X"0047A025", -- 00001718 + X"00183027", -- 0000171C + X"00113D82", -- 00001720 + X"00111A80", -- 00001724 + X"00678825", -- 00001728 + X"00D53025", -- 0000172C + X"8CA30024", -- 00001730 + X"001E1027", -- 00001734 + X"00D43026", -- 00001738 + X"00521025", -- 0000173C + X"00511026", -- 00001740 + X"00C33021", -- 00001744 + X"00D93021", -- 00001748 + X"004C1021", -- 0000174C + X"00C9C821", -- 00001750 + X"00571021", -- 00001754 + X"004AB821", -- 00001758 + X"00191C82", -- 0000175C + X"00191380", -- 00001760 + X"00431025", -- 00001764 + X"00173682", -- 00001768 + X"00171980", -- 0000176C + X"0053C821", -- 00001770 + X"00661825", -- 00001774 + X"00183D82", -- 00001778 + X"00181280", -- 0000177C + X"0076B821", -- 00001780 + X"0047C025", -- 00001784 + X"00153027", -- 00001788 + X"001E3D82", -- 0000178C + X"001E1A80", -- 00001790 + X"0067F025", -- 00001794 + X"00D93025", -- 00001798 + X"8CA7003C", -- 0000179C + X"00121027", -- 000017A0 + X"8FA80010", -- 000017A4 + X"00D83026", -- 000017A8 + X"00571025", -- 000017AC + X"005E1026", -- 000017B0 + X"00C73021", -- 000017B4 + X"00D33021", -- 000017B8 + X"00481021", -- 000017BC + X"00C99821", -- 000017C0 + X"00561021", -- 000017C4 + X"004AB021", -- 000017C8 + X"00131DC2", -- 000017CC + X"00131240", -- 000017D0 + X"00431025", -- 000017D4 + X"00163482", -- 000017D8 + X"00161B80", -- 000017DC + X"00549821", -- 000017E0 + X"00661825", -- 000017E4 + X"00153D82", -- 000017E8 + X"00193027", -- 000017EC + X"00151280", -- 000017F0 + X"0071B021", -- 000017F4 + X"0047A825", -- 000017F8 + X"00D33025", -- 000017FC + X"00123D82", -- 00001800 + X"00171027", -- 00001804 + X"00121A80", -- 00001808 + X"00679025", -- 0000180C + X"00D53026", -- 00001810 + X"8FA7002C", -- 00001814 + X"00561025", -- 00001818 + X"00521026", -- 0000181C + X"00CD3021", -- 00001820 + X"00D43021", -- 00001824 + X"00471021", -- 00001828 + X"00C9A021", -- 0000182C + X"00511021", -- 00001830 + X"004A8821", -- 00001834 + X"00141CC2", -- 00001838 + X"00141340", -- 0000183C + X"00431025", -- 00001840 + X"00113502", -- 00001844 + X"00111B00", -- 00001848 + X"0058A021", -- 0000184C + X"00661825", -- 00001850 + X"00193D82", -- 00001854 + X"00133027", -- 00001858 + X"00191280", -- 0000185C + X"007E8821", -- 00001860 + X"0047C825", -- 00001864 + X"8CA80004", -- 00001868 + X"00D43025", -- 0000186C + X"00173D82", -- 00001870 + X"00161027", -- 00001874 + X"00171A80", -- 00001878 + X"0067B825", -- 0000187C + X"00D93026", -- 00001880 + X"00511025", -- 00001884 + X"00571026", -- 00001888 + X"00C83021", -- 0000188C + X"00D83021", -- 00001890 + X"004D1021", -- 00001894 + X"00C9C021", -- 00001898 + X"005E1021", -- 0000189C + X"004AF021", -- 000018A0 + X"00181C42", -- 000018A4 + X"001813C0", -- 000018A8 + X"00431025", -- 000018AC + X"001E34C2", -- 000018B0 + X"001E1B40", -- 000018B4 + X"0055C021", -- 000018B8 + X"00661825", -- 000018BC + X"00133D82", -- 000018C0 + X"00131280", -- 000018C4 + X"0072F021", -- 000018C8 + X"00479825", -- 000018CC + X"00143027", -- 000018D0 + X"00163D82", -- 000018D4 + X"00161A80", -- 000018D8 + X"0067B025", -- 000018DC + X"00D83025", -- 000018E0 + X"8FA30000", -- 000018E4 + X"00111027", -- 000018E8 + X"8FA70018", -- 000018EC + X"00D33026", -- 000018F0 + X"005E1025", -- 000018F4 + X"00561026", -- 000018F8 + X"00C33021", -- 000018FC + X"00D53021", -- 00001900 + X"00471021", -- 00001904 + X"00C9A821", -- 00001908 + X"00521021", -- 0000190C + X"004A9021", -- 00001910 + X"00151C82", -- 00001914 + X"00151380", -- 00001918 + X"00431025", -- 0000191C + X"001236C2", -- 00001920 + X"00121940", -- 00001924 + X"0059A821", -- 00001928 + X"00661825", -- 0000192C + X"00143D82", -- 00001930 + X"00183027", -- 00001934 + X"00141280", -- 00001938 + X"00779021", -- 0000193C + X"0047A025", -- 00001940 + X"8CA8001C", -- 00001944 + X"00D53025", -- 00001948 + X"00113D82", -- 0000194C + X"001E1027", -- 00001950 + X"00111A80", -- 00001954 + X"00678825", -- 00001958 + X"00D43026", -- 0000195C + X"8FA3001C", -- 00001960 + X"00521025", -- 00001964 + X"00511026", -- 00001968 + X"00C83021", -- 0000196C + X"00D93021", -- 00001970 + X"00431021", -- 00001974 + X"00C9C821", -- 00001978 + X"00571021", -- 0000197C + X"004AB821", -- 00001980 + X"00191E02", -- 00001984 + X"00191200", -- 00001988 + X"00431025", -- 0000198C + X"00173482", -- 00001990 + X"00171B80", -- 00001994 + X"0053C821", -- 00001998 + X"00661825", -- 0000199C + X"00183D82", -- 000019A0 + X"00181280", -- 000019A4 + X"0076B821", -- 000019A8 + X"0047C025", -- 000019AC + X"00153027", -- 000019B0 + X"001E3D82", -- 000019B4 + X"001E1A80", -- 000019B8 + X"0067F025", -- 000019BC + X"00D93025", -- 000019C0 + X"8CA70000", -- 000019C4 + X"00121027", -- 000019C8 + X"8FA80020", -- 000019CC + X"00D83026", -- 000019D0 + X"00571025", -- 000019D4 + X"005E1026", -- 000019D8 + X"00C73021", -- 000019DC + X"00D33021", -- 000019E0 + X"00481021", -- 000019E4 + X"00C99821", -- 000019E8 + X"00561021", -- 000019EC + X"004AB021", -- 000019F0 + X"00131CC2", -- 000019F4 + X"00131340", -- 000019F8 + X"00431025", -- 000019FC + X"001634C2", -- 00001A00 + X"00161B40", -- 00001A04 + X"00549821", -- 00001A08 + X"00661825", -- 00001A0C + X"00153D82", -- 00001A10 + X"00193027", -- 00001A14 + X"00151280", -- 00001A18 + X"0071B021", -- 00001A1C + X"0047A825", -- 00001A20 + X"00D33025", -- 00001A24 + X"00123D82", -- 00001A28 + X"00171027", -- 00001A2C + X"00121A80", -- 00001A30 + X"00679025", -- 00001A34 + X"00D53026", -- 00001A38 + X"8FA70008", -- 00001A3C + X"00561025", -- 00001A40 + X"00521026", -- 00001A44 + X"00CC3021", -- 00001A48 + X"00D43021", -- 00001A4C + X"00471021", -- 00001A50 + X"00C9A021", -- 00001A54 + X"00511021", -- 00001A58 + X"004A8821", -- 00001A5C + X"00141E82", -- 00001A60 + X"00141180", -- 00001A64 + X"00431025", -- 00001A68 + X"001134C2", -- 00001A6C + X"00111B40", -- 00001A70 + X"0058A021", -- 00001A74 + X"8CA80010", -- 00001A78 + X"00661825", -- 00001A7C + X"00193D82", -- 00001A80 + X"00191280", -- 00001A84 + X"007E8821", -- 00001A88 + X"0047C825", -- 00001A8C + X"00133027", -- 00001A90 + X"00173D82", -- 00001A94 + X"00171A80", -- 00001A98 + X"AFA80038", -- 00001A9C + X"0067B825", -- 00001AA0 + X"00D43025", -- 00001AA4 + X"8CA30034", -- 00001AA8 + X"00161027", -- 00001AAC + X"00D93026", -- 00001AB0 + X"00511025", -- 00001AB4 + X"00571026", -- 00001AB8 + X"00C33021", -- 00001ABC + X"00D83021", -- 00001AC0 + X"00481021", -- 00001AC4 + X"00C9C021", -- 00001AC8 + X"005E1021", -- 00001ACC + X"004AF021", -- 00001AD0 + X"00181EC2", -- 00001AD4 + X"00181140", -- 00001AD8 + X"00431025", -- 00001ADC + X"001E3642", -- 00001AE0 + X"001E19C0", -- 00001AE4 + X"0055C021", -- 00001AE8 + X"00661825", -- 00001AEC + X"00133D82", -- 00001AF0 + X"00131280", -- 00001AF4 + X"0072F021", -- 00001AF8 + X"00479825", -- 00001AFC + X"00143027", -- 00001B00 + X"00163D82", -- 00001B04 + X"00111027", -- 00001B08 + X"00161A80", -- 00001B0C + X"0067B025", -- 00001B10 + X"8FA80034", -- 00001B14 + X"8CA7002C", -- 00001B18 + X"00D83025", -- 00001B1C + X"005E1025", -- 00001B20 + X"00D33026", -- 00001B24 + X"00561026", -- 00001B28 + X"00C73021", -- 00001B2C + X"00481021", -- 00001B30 + X"00D53021", -- 00001B34 + X"00521021", -- 00001B38 + X"00C9A821", -- 00001B3C + X"004A9021", -- 00001B40 + X"00151D02", -- 00001B44 + X"00123EC2", -- 00001B48 + X"00151300", -- 00001B4C + X"00123140", -- 00001B50 + X"00431025", -- 00001B54 + X"00C73025", -- 00001B58 + X"00141A80", -- 00001B5C + X"00143D82", -- 00001B60 + X"00D79021", -- 00001B64 + X"0059A821", -- 00001B68 + X"0067A025", -- 00001B6C + X"00181027", -- 00001B70 + X"00113582", -- 00001B74 + X"00111A80", -- 00001B78 + X"00668825", -- 00001B7C + X"00551025", -- 00001B80 + X"8CA30014", -- 00001B84 + X"00541026", -- 00001B88 + X"00123027", -- 00001B8C + X"00D13024", -- 00001B90 + X"00431021", -- 00001B94 + X"025E1824", -- 00001B98 + X"00661825", -- 00001B9C + X"00591021", -- 00001BA0 + X"006D1821", -- 00001BA4 + X"3C0B7A6D", -- 00001BA8 + X"356B76E9", -- 00001BAC + X"0049C821", -- 00001BB0 + X"00771821", -- 00001BB4 + X"006BB821", -- 00001BB8 + X"00193642", -- 00001BBC + X"001911C0", -- 00001BC0 + X"00461025", -- 00001BC4 + X"00174442", -- 00001BC8 + X"001733C0", -- 00001BCC + X"0053C821", -- 00001BD0 + X"00C83025", -- 00001BD4 + X"00183D82", -- 00001BD8 + X"00181280", -- 00001BDC + X"00D6B821", -- 00001BE0 + X"0047C025", -- 00001BE4 + X"00151827", -- 00001BE8 + X"001E3582", -- 00001BEC + X"001E1280", -- 00001BF0 + X"0046F025", -- 00001BF4 + X"00791825", -- 00001BF8 + X"8CA60030", -- 00001BFC + X"00781826", -- 00001C00 + X"00661821", -- 00001C04 + X"00173027", -- 00001C08 + X"00DE3024", -- 00001C0C + X"02F21024", -- 00001C10 + X"00731821", -- 00001C14 + X"00461025", -- 00001C18 + X"00699821", -- 00001C1C + X"004C1021", -- 00001C20 + X"001346C2", -- 00001C24 + X"00153D82", -- 00001C28 + X"00133140", -- 00001C2C + X"00151A80", -- 00001C30 + X"00561021", -- 00001C34 + X"0067A825", -- 00001C38 + X"00C83025", -- 00001C3C + X"004BB021", -- 00001C40 + X"00D49821", -- 00001C44 + X"00163EC2", -- 00001C48 + X"00153027", -- 00001C4C + X"00161140", -- 00001C50 + X"00D93024", -- 00001C54 + X"02751824", -- 00001C58 + X"00471025", -- 00001C5C + X"8CA70004", -- 00001C60 + X"00661825", -- 00001C64 + X"0051B021", -- 00001C68 + X"00671821", -- 00001C6C + X"00123582", -- 00001C70 + X"00121280", -- 00001C74 + X"3C0A8F1B", -- 00001C78 + X"354ABCDC", -- 00001C7C + X"00469025", -- 00001C80 + X"00741821", -- 00001C84 + X"00161027", -- 00001C88 + X"006AA021", -- 00001C8C + X"00521024", -- 00001C90 + X"02D71824", -- 00001C94 + X"00144542", -- 00001C98 + X"00621825", -- 00001C9C + X"00193582", -- 00001CA0 + X"00143AC0", -- 00001CA4 + X"00191280", -- 00001CA8 + X"0046C825", -- 00001CAC + X"00E83825", -- 00001CB0 + X"8FA80038", -- 00001CB4 + X"00F8A021", -- 00001CB8 + X"00193027", -- 00001CBC + X"00D33024", -- 00001CC0 + X"02991024", -- 00001CC4 + X"00681821", -- 00001CC8 + X"00711821", -- 00001CCC + X"00461025", -- 00001CD0 + X"8CA60024", -- 00001CD4 + X"006B8821", -- 00001CD8 + X"00113E02", -- 00001CDC + X"00111A00", -- 00001CE0 + X"00461021", -- 00001CE4 + X"00671825", -- 00001CE8 + X"00581021", -- 00001CEC + X"007E8821", -- 00001CF0 + X"004AC021", -- 00001CF4 + X"00173582", -- 00001CF8 + X"8CA20004", -- 00001CFC + X"00171A80", -- 00001D00 + X"0066B825", -- 00001D04 + X"00184D02", -- 00001D08 + X"00181B00", -- 00001D0C + X"AFA2003C", -- 00001D10 + X"00691825", -- 00001D14 + X"00113827", -- 00001D18 + X"0075C021", -- 00001D1C + X"00F73824", -- 00001D20 + X"8FA3003C", -- 00001D24 + X"02363024", -- 00001D28 + X"00134582", -- 00001D2C + X"00131280", -- 00001D30 + X"00C73025", -- 00001D34 + X"00489825", -- 00001D38 + X"00C33021", -- 00001D3C + X"00DE3021", -- 00001D40 + X"00131827", -- 00001D44 + X"00CBF021", -- 00001D48 + X"00741824", -- 00001D4C + X"8CA6002C", -- 00001D50 + X"03131024", -- 00001D54 + X"00431025", -- 00001D58 + X"00461021", -- 00001D5C + X"001E1AC0", -- 00001D60 + X"001E3542", -- 00001D64 + X"00661825", -- 00001D68 + X"00551021", -- 00001D6C + X"0072F021", -- 00001D70 + X"004AA821", -- 00001D74 + X"00161D82", -- 00001D78 + X"00161280", -- 00001D7C + X"0043B025", -- 00001D80 + X"00154482", -- 00001D84 + X"00143582", -- 00001D88 + X"00153B80", -- 00001D8C + X"001E1827", -- 00001D90 + X"00141280", -- 00001D94 + X"0046A025", -- 00001D98 + X"00E83825", -- 00001D9C + X"00761824", -- 00001DA0 + X"03D11024", -- 00001DA4 + X"00F9A821", -- 00001DA8 + X"00431025", -- 00001DAC + X"00143027", -- 00001DB0 + X"8CA70028", -- 00001DB4 + X"00D83024", -- 00001DB8 + X"02B41824", -- 00001DBC + X"00501021", -- 00001DC0 + X"00661825", -- 00001DC4 + X"00521021", -- 00001DC8 + X"004B9021", -- 00001DCC + X"00671821", -- 00001DD0 + X"00123482", -- 00001DD4 + X"00791821", -- 00001DD8 + X"00121380", -- 00001DDC + X"006AC821", -- 00001DE0 + X"00461025", -- 00001DE4 + X"00579021", -- 00001DE8 + X"00194C42", -- 00001DEC + X"00183D82", -- 00001DF0 + X"00114582", -- 00001DF4 + X"00191BC0", -- 00001DF8 + X"00181280", -- 00001DFC + X"00113280", -- 00001E00 + X"0047C025", -- 00001E04 + X"00C88825", -- 00001E08 + X"00691825", -- 00001E0C + X"00121027", -- 00001E10 + X"0073C821", -- 00001E14 + X"00511024", -- 00001E18 + X"025E1824", -- 00001E1C + X"00183027", -- 00001E20 + X"8FA8002C", -- 00001E24 + X"00D53024", -- 00001E28 + X"00621825", -- 00001E2C + X"03381024", -- 00001E30 + X"00461025", -- 00001E34 + X"8CA60000", -- 00001E38 + X"00681821", -- 00001E3C + X"00771821", -- 00001E40 + X"00461021", -- 00001E44 + X"006BB821", -- 00001E48 + X"00531021", -- 00001E4C + X"004A9821", -- 00001E50 + X"00171C82", -- 00001E54 + X"00173380", -- 00001E58 + X"00C33025", -- 00001E5C + X"00134482", -- 00001E60 + X"00153D82", -- 00001E64 + X"00131B80", -- 00001E68 + X"00151280", -- 00001E6C + X"00D6B821", -- 00001E70 + X"0047A825", -- 00001E74 + X"00681825", -- 00001E78 + X"001E3D82", -- 00001E7C + X"001E1280", -- 00001E80 + X"00749821", -- 00001E84 + X"0047F025", -- 00001E88 + X"00153027", -- 00001E8C + X"00173827", -- 00001E90 + X"8FA80030", -- 00001E94 + X"00D93024", -- 00001E98 + X"00FE3824", -- 00001E9C + X"02751024", -- 00001EA0 + X"02F21824", -- 00001EA4 + X"00461025", -- 00001EA8 + X"00671825", -- 00001EAC + X"00681821", -- 00001EB0 + X"004D1021", -- 00001EB4 + X"00541021", -- 00001EB8 + X"00761821", -- 00001EBC + X"004AA021", -- 00001EC0 + X"006BB021", -- 00001EC4 + X"00144442", -- 00001EC8 + X"00164E82", -- 00001ECC + X"00193D82", -- 00001ED0 + X"001433C0", -- 00001ED4 + X"00161980", -- 00001ED8 + X"00191280", -- 00001EDC + X"0047C825", -- 00001EE0 + X"00C83025", -- 00001EE4 + X"00691825", -- 00001EE8 + X"0071B021", -- 00001EEC + X"00D8A021", -- 00001EF0 + X"00121D82", -- 00001EF4 + X"00193827", -- 00001EF8 + X"00121280", -- 00001EFC + X"00439025", -- 00001F00 + X"8CA80030", -- 00001F04 + X"00F33824", -- 00001F08 + X"02991824", -- 00001F0C + X"00163027", -- 00001F10 + X"00D23024", -- 00001F14 + X"02D71024", -- 00001F18 + X"00671825", -- 00001F1C + X"8CA70000", -- 00001F20 + X"00461025", -- 00001F24 + X"00681821", -- 00001F28 + X"00781821", -- 00001F2C + X"00471021", -- 00001F30 + X"006AC021", -- 00001F34 + X"00511021", -- 00001F38 + X"004B8821", -- 00001F3C + X"AFA70040", -- 00001F40 + X"00133582", -- 00001F44 + X"00183DC2", -- 00001F48 + X"00181A40", -- 00001F4C + X"00131280", -- 00001F50 + X"00469825", -- 00001F54 + X"00671825", -- 00001F58 + X"00113482", -- 00001F5C + X"00111380", -- 00001F60 + X"0075C021", -- 00001F64 + X"00461025", -- 00001F68 + X"00133827", -- 00001F6C + X"00173582", -- 00001F70 + X"00171A80", -- 00001F74 + X"005E8821", -- 00001F78 + X"0066B825", -- 00001F7C + X"00F43824", -- 00001F80 + X"8CA30010", -- 00001F84 + X"03131024", -- 00001F88 + X"00471025", -- 00001F8C + X"00113027", -- 00001F90 + X"8CAF0014", -- 00001F94 + X"00D73024", -- 00001F98 + X"00431021", -- 00001F9C + X"02361824", -- 00001FA0 + X"00551021", -- 00001FA4 + X"00661825", -- 00001FA8 + X"004AA821", -- 00001FAC + X"006F1821", -- 00001FB0 + X"00154602", -- 00001FB4 + X"007E1821", -- 00001FB8 + X"00143D82", -- 00001FBC + X"00153200", -- 00001FC0 + X"00141280", -- 00001FC4 + X"0047A025", -- 00001FC8 + X"00C83025", -- 00001FCC + X"006BF021", -- 00001FD0 + X"00D9A821", -- 00001FD4 + X"001E1E82", -- 00001FD8 + X"00141027", -- 00001FDC + X"001E3180", -- 00001FE0 + X"00C33025", -- 00001FE4 + X"00581024", -- 00001FE8 + X"02B41824", -- 00001FEC + X"00621825", -- 00001FF0 + X"00163D82", -- 00001FF4 + X"00161280", -- 00001FF8 + X"00D2F021", -- 00001FFC + X"0047B025", -- 00002000 + X"8CA60034", -- 00002004 + X"8CA70030", -- 00002008 + X"001E1027", -- 0000200C + X"AFA70044", -- 00002010 + X"00561024", -- 00002014 + X"00661821", -- 00002018 + X"03D13024", -- 0000201C + X"00791821", -- 00002020 + X"00C23025", -- 00002024 + X"8FA20044", -- 00002028 + X"006AC821", -- 0000202C + X"001945C2", -- 00002030 + X"00183D82", -- 00002034 + X"00C23021", -- 00002038 + X"00191A40", -- 0000203C + X"00181280", -- 00002040 + X"0047C025", -- 00002044 + X"00681825", -- 00002048 + X"00D23021", -- 0000204C + X"0073C821", -- 00002050 + X"00CB9021", -- 00002054 + X"00183827", -- 00002058 + X"00F53824", -- 0000205C + X"001235C2", -- 00002060 + X"03381024", -- 00002064 + X"00121A40", -- 00002068 + X"00661825", -- 0000206C + X"00471025", -- 00002070 + X"00779021", -- 00002074 + X"00501021", -- 00002078 + X"00113582", -- 0000207C + X"00111A80", -- 00002080 + X"00668825", -- 00002084 + X"00531021", -- 00002088 + X"00121827", -- 0000208C + X"004A9821", -- 00002090 + X"00711824", -- 00002094 + X"025E3024", -- 00002098 + X"8CAE0008", -- 0000209C + X"00134482", -- 000020A0 + X"00C33025", -- 000020A4 + X"00133B80", -- 000020A8 + X"00151D82", -- 000020AC + X"00151280", -- 000020B0 + X"0043A825", -- 000020B4 + X"00E83825", -- 000020B8 + X"00F49821", -- 000020BC + X"00151827", -- 000020C0 + X"00CE3021", -- 000020C4 + X"8CA7001C", -- 000020C8 + X"00791824", -- 000020CC + X"02751024", -- 000020D0 + X"00D73021", -- 000020D4 + X"00CBB821", -- 000020D8 + X"00431025", -- 000020DC + X"00173502", -- 000020E0 + X"00171B00", -- 000020E4 + X"00471021", -- 000020E8 + X"00661825", -- 000020EC + X"00541021", -- 000020F0 + X"0076B821", -- 000020F4 + X"004AA021", -- 000020F8 + X"001E3582", -- 000020FC + X"001E1A80", -- 00002100 + X"0066F025", -- 00002104 + X"00144EC2", -- 00002108 + X"00173827", -- 0000210C + X"00194582", -- 00002110 + X"00141940", -- 00002114 + X"00191280", -- 00002118 + X"0048C825", -- 0000211C + X"00FE3824", -- 00002120 + X"8FA80034", -- 00002124 + X"02F23024", -- 00002128 + X"00691825", -- 0000212C + X"0078A021", -- 00002130 + X"00C73025", -- 00002134 + X"00191827", -- 00002138 + X"00731824", -- 0000213C + X"02991024", -- 00002140 + X"00C83021", -- 00002144 + X"00D63021", -- 00002148 + X"00431025", -- 0000214C + X"8CA3003C", -- 00002150 + X"00CBB021", -- 00002154 + X"001635C2", -- 00002158 + X"00431021", -- 0000215C + X"00161A40", -- 00002160 + X"00661825", -- 00002164 + X"00581021", -- 00002168 + X"0071B021", -- 0000216C + X"004AC021", -- 00002170 + X"00121D82", -- 00002174 + X"00121280", -- 00002178 + X"00439025", -- 0000217C + X"00184682", -- 00002180 + X"00131D82", -- 00002184 + X"00183980", -- 00002188 + X"00163027", -- 0000218C + X"00131280", -- 00002190 + X"00439825", -- 00002194 + X"00E83825", -- 00002198 + X"00D23024", -- 0000219C + X"8CA80024", -- 000021A0 + X"02D71824", -- 000021A4 + X"00661825", -- 000021A8 + X"00681821", -- 000021AC + X"00F5C021", -- 000021B0 + X"00133027", -- 000021B4 + X"00711821", -- 000021B8 + X"006B8821", -- 000021BC + X"00D43024", -- 000021C0 + X"8CA30038", -- 000021C4 + X"03131024", -- 000021C8 + X"00461025", -- 000021CC + X"00431021", -- 000021D0 + X"00113502", -- 000021D4 + X"00551021", -- 000021D8 + X"00111B00", -- 000021DC + X"004AA821", -- 000021E0 + X"AFA80048", -- 000021E4 + X"00661825", -- 000021E8 + X"00174582", -- 000021EC + X"00173280", -- 000021F0 + X"007E8821", -- 000021F4 + X"00C8B825", -- 000021F8 + X"00154E02", -- 000021FC + X"8CA6001C", -- 00002200 + X"00143D82", -- 00002204 + X"00151A00", -- 00002208 + X"00141280", -- 0000220C + X"0047A025", -- 00002210 + X"00691825", -- 00002214 + X"00111027", -- 00002218 + X"AFA6004C", -- 0000221C + X"0079A821", -- 00002220 + X"8FA7004C", -- 00002224 + X"00571024", -- 00002228 + X"02361824", -- 0000222C + X"00143027", -- 00002230 + X"00D83024", -- 00002234 + X"00621825", -- 00002238 + X"02B41024", -- 0000223C + X"00461025", -- 00002240 + X"00671821", -- 00002244 + X"007E1821", -- 00002248 + X"004F1021", -- 0000224C + X"006BF021", -- 00002250 + X"00591021", -- 00002254 + X"004AC821", -- 00002258 + X"001E1EC2", -- 0000225C + X"001E3140", -- 00002260 + X"00C33025", -- 00002264 + X"00194682", -- 00002268 + X"00183D82", -- 0000226C + X"00191980", -- 00002270 + X"00181280", -- 00002274 + X"00D2F021", -- 00002278 + X"0047C025", -- 0000227C + X"00681825", -- 00002280 + X"00163D82", -- 00002284 + X"00161280", -- 00002288 + X"0073C821", -- 0000228C + X"0047B025", -- 00002290 + X"00183027", -- 00002294 + X"001E3827", -- 00002298 + X"8CA80028", -- 0000229C + X"00D53024", -- 000022A0 + X"00F63824", -- 000022A4 + X"03381024", -- 000022A8 + X"03D11824", -- 000022AC + X"00461025", -- 000022B0 + X"00671825", -- 000022B4 + X"00681821", -- 000022B8 + X"004C1021", -- 000022BC + X"00531021", -- 000022C0 + X"00721821", -- 000022C4 + X"004A9821", -- 000022C8 + X"006B9021", -- 000022CC + X"AFA80050", -- 000022D0 + X"00124C42", -- 000022D4 + X"001346C2", -- 000022D8 + X"00153D82", -- 000022DC + X"00133140", -- 000022E0 + X"00121BC0", -- 000022E4 + X"00151280", -- 000022E8 + X"0047A825", -- 000022EC + X"00C83025", -- 000022F0 + X"00691825", -- 000022F4 + X"00779021", -- 000022F8 + X"00D49821", -- 000022FC + X"00113D82", -- 00002300 + X"00151827", -- 00002304 + X"00111280", -- 00002308 + X"00478825", -- 0000230C + X"00791824", -- 00002310 + X"02751024", -- 00002314 + X"00123027", -- 00002318 + X"8CA70038", -- 0000231C + X"00D13024", -- 00002320 + X"00431025", -- 00002324 + X"025E1824", -- 00002328 + X"00661825", -- 0000232C + X"004E1021", -- 00002330 + X"00541021", -- 00002334 + X"00671821", -- 00002338 + X"004AA021", -- 0000233C + X"00771821", -- 00002340 + X"00192D82", -- 00002344 + X"00191280", -- 00002348 + X"0045C825", -- 0000234C + X"006BB821", -- 00002350 + X"00141502", -- 00002354 + X"00142B00", -- 00002358 + X"00A22825", -- 0000235C + X"00173602", -- 00002360 + X"00171200", -- 00002364 + X"00461025", -- 00002368 + X"00B8A021", -- 0000236C + X"0056B821", -- 00002370 + X"00191827", -- 00002374 + X"001E2D82", -- 00002378 + X"001E1280", -- 0000237C + X"0045F025", -- 00002380 + X"00731825", -- 00002384 + X"8FA20004", -- 00002388 + X"8FA60044", -- 0000238C + X"02F22826", -- 00002390 + X"00741826", -- 00002394 + X"00621821", -- 00002398 + X"00BE2826", -- 0000239C + X"3C08A953", -- 000023A0 + X"3508FD4E", -- 000023A4 + X"00A62821", -- 000023A8 + X"00781821", -- 000023AC + X"0068C021", -- 000023B0 + X"02C5B021", -- 000023B4 + X"00133582", -- 000023B8 + X"00131280", -- 000023BC + X"00469825", -- 000023C0 + X"00182A40", -- 000023C4 + X"001815C2", -- 000023C8 + X"00163602", -- 000023CC + X"00161A00", -- 000023D0 + X"00A22825", -- 000023D4 + X"00661825", -- 000023D8 + X"00B5C021", -- 000023DC + X"0071B021", -- 000023E0 + X"00131027", -- 000023E4 + X"00122D82", -- 000023E8 + X"00121A80", -- 000023EC + X"00659025", -- 000023F0 + X"00541025", -- 000023F4 + X"8FA30008", -- 000023F8 + X"00581026", -- 000023FC + X"8FA50030", -- 00002400 + X"00431021", -- 00002404 + X"02D71826", -- 00002408 + X"00721826", -- 0000240C + X"00651821", -- 00002410 + X"00551021", -- 00002414 + X"0048A821", -- 00002418 + X"02238821", -- 0000241C + X"00142D82", -- 00002420 + X"00141280", -- 00002424 + X"0045A025", -- 00002428 + X"001136C2", -- 0000242C + X"00151442", -- 00002430 + X"00152BC0", -- 00002434 + X"00111940", -- 00002438 + X"00A22825", -- 0000243C + X"00661825", -- 00002440 + X"00141027", -- 00002444 + X"00B9A821", -- 00002448 + X"007E8821", -- 0000244C + X"00581025", -- 00002450 + X"00172D82", -- 00002454 + X"00171A80", -- 00002458 + X"0065B825", -- 0000245C + X"00551026", -- 00002460 + X"8FA50050", -- 00002464 + X"02361826", -- 00002468 + X"00771826", -- 0000246C + X"004F1021", -- 00002470 + X"00651821", -- 00002474 + X"00591021", -- 00002478 + X"0048C821", -- 0000247C + X"03C3F021", -- 00002480 + X"00182D82", -- 00002484 + X"00181280", -- 00002488 + X"0045C025", -- 0000248C + X"001E3502", -- 00002490 + X"001916C2", -- 00002494 + X"00192940", -- 00002498 + X"001E1B00", -- 0000249C + X"00A22825", -- 000024A0 + X"00661825", -- 000024A4 + X"00181027", -- 000024A8 + X"00B3C821", -- 000024AC + X"0072F021", -- 000024B0 + X"8FA60010", -- 000024B4 + X"00551025", -- 000024B8 + X"00162D82", -- 000024BC + X"00161A80", -- 000024C0 + X"0065B025", -- 000024C4 + X"00591026", -- 000024C8 + X"8FA50038", -- 000024CC + X"03D11826", -- 000024D0 + X"00461021", -- 000024D4 + X"00761826", -- 000024D8 + X"00651821", -- 000024DC + X"00531021", -- 000024E0 + X"00489821", -- 000024E4 + X"02439021", -- 000024E8 + X"00152D82", -- 000024EC + X"00151280", -- 000024F0 + X"0045A825", -- 000024F4 + X"001235C2", -- 000024F8 + X"00131542", -- 000024FC + X"00132AC0", -- 00002500 + X"00121A40", -- 00002504 + X"00A22825", -- 00002508 + X"00661825", -- 0000250C + X"00151027", -- 00002510 + X"00B49821", -- 00002514 + X"00779021", -- 00002518 + X"8FA60014", -- 0000251C + X"00591025", -- 00002520 + X"00112D82", -- 00002524 + X"00111A80", -- 00002528 + X"00658825", -- 0000252C + X"00531026", -- 00002530 + X"8FA5003C", -- 00002534 + X"025E1826", -- 00002538 + X"00461021", -- 0000253C + X"00711826", -- 00002540 + X"00651821", -- 00002544 + X"00541021", -- 00002548 + X"0048A021", -- 0000254C + X"02E3B821", -- 00002550 + X"00192D82", -- 00002554 + X"00191280", -- 00002558 + X"0045C825", -- 0000255C + X"00173502", -- 00002560 + X"00141682", -- 00002564 + X"00142980", -- 00002568 + X"00171B00", -- 0000256C + X"00A22825", -- 00002570 + X"00661825", -- 00002574 + X"00191027", -- 00002578 + X"00B8A021", -- 0000257C + X"0076B821", -- 00002580 + X"8FA60018", -- 00002584 + X"00531025", -- 00002588 + X"001E2D82", -- 0000258C + X"001E1A80", -- 00002590 + X"0065F025", -- 00002594 + X"00541026", -- 00002598 + X"02F21826", -- 0000259C + X"00461021", -- 000025A0 + X"007E1826", -- 000025A4 + X"00581021", -- 000025A8 + X"006F1821", -- 000025AC + X"0048C021", -- 000025B0 + X"02C3B021", -- 000025B4 + X"00132D82", -- 000025B8 + X"00131280", -- 000025BC + X"00459825", -- 000025C0 + X"001636C2", -- 000025C4 + X"00181602", -- 000025C8 + X"00182A00", -- 000025CC + X"00161940", -- 000025D0 + X"00A22825", -- 000025D4 + X"00661825", -- 000025D8 + X"00131027", -- 000025DC + X"00B5C021", -- 000025E0 + X"0071B021", -- 000025E4 + X"00541025", -- 000025E8 + X"00122D82", -- 000025EC + X"00121A80", -- 000025F0 + X"00659025", -- 000025F4 + X"00581026", -- 000025F8 + X"02D71826", -- 000025FC + X"00721826", -- 00002600 + X"004E1021", -- 00002604 + X"00551021", -- 00002608 + X"006D1821", -- 0000260C + X"0048A821", -- 00002610 + X"02238821", -- 00002614 + X"00142D82", -- 00002618 + X"00141280", -- 0000261C + X"0045A025", -- 00002620 + X"00113482", -- 00002624 + X"001514C2", -- 00002628 + X"00152B40", -- 0000262C + X"00111B80", -- 00002630 + X"00A22825", -- 00002634 + X"00661825", -- 00002638 + X"00B9A821", -- 0000263C + X"007E8821", -- 00002640 + X"00141027", -- 00002644 + X"00172D82", -- 00002648 + X"00171A80", -- 0000264C + X"0065B825", -- 00002650 + X"00581025", -- 00002654 + X"8FA50020", -- 00002658 + X"8FA6004C", -- 0000265C + X"02361826", -- 00002660 + X"00551026", -- 00002664 + X"00451021", -- 00002668 + X"00771826", -- 0000266C + X"00661821", -- 00002670 + X"00591021", -- 00002674 + X"0048C821", -- 00002678 + X"03C3F021", -- 0000267C + X"00182D82", -- 00002680 + X"00181280", -- 00002684 + X"0045C025", -- 00002688 + X"001E3682", -- 0000268C + X"00191502", -- 00002690 + X"00192B00", -- 00002694 + X"001E1980", -- 00002698 + X"00A22825", -- 0000269C + X"00661825", -- 000026A0 + X"00181027", -- 000026A4 + X"00B3C821", -- 000026A8 + X"0072F021", -- 000026AC + X"00551025", -- 000026B0 + X"00162D82", -- 000026B4 + X"00161A80", -- 000026B8 + X"0065B025", -- 000026BC + X"00591026", -- 000026C0 + X"03D11826", -- 000026C4 + X"00471021", -- 000026C8 + X"00761826", -- 000026CC + X"00531021", -- 000026D0 + X"006C1821", -- 000026D4 + X"00489821", -- 000026D8 + X"02439021", -- 000026DC + X"00152D82", -- 000026E0 + X"00151280", -- 000026E4 + X"0045A825", -- 000026E8 + X"00123602", -- 000026EC + X"001316C2", -- 000026F0 + X"00132940", -- 000026F4 + X"00121A00", -- 000026F8 + X"00A22825", -- 000026FC + X"00661825", -- 00002700 + X"00B49821", -- 00002704 + X"00779021", -- 00002708 + X"00151027", -- 0000270C + X"00112D82", -- 00002710 + X"00111A80", -- 00002714 + X"00658825", -- 00002718 + X"00591025", -- 0000271C + X"8FA50028", -- 00002720 + X"025E1826", -- 00002724 + X"00531026", -- 00002728 + X"00451021", -- 0000272C + X"00711826", -- 00002730 + X"00541021", -- 00002734 + X"006E1821", -- 00002738 + X"0048A021", -- 0000273C + X"02E3B821", -- 00002740 + X"00192D82", -- 00002744 + X"00191280", -- 00002748 + X"0045C825", -- 0000274C + X"001734C2", -- 00002750 + X"00141502", -- 00002754 + X"00142B00", -- 00002758 + X"00171B40", -- 0000275C + X"00A22825", -- 00002760 + X"00661825", -- 00002764 + X"00191027", -- 00002768 + X"00B8A021", -- 0000276C + X"0076B821", -- 00002770 + X"00531025", -- 00002774 + X"001E2D82", -- 00002778 + X"001E1A80", -- 0000277C + X"0065F025", -- 00002780 + X"8FA60034", -- 00002784 + X"02F21826", -- 00002788 + X"00541026", -- 0000278C + X"00501021", -- 00002790 + X"007E1826", -- 00002794 + X"00661821", -- 00002798 + X"00581021", -- 0000279C + X"0048C021", -- 000027A0 + X"02C3B021", -- 000027A4 + X"00132D82", -- 000027A8 + X"00131280", -- 000027AC + X"00459825", -- 000027B0 + X"00163682", -- 000027B4 + X"001814C2", -- 000027B8 + X"00182B40", -- 000027BC + X"00161980", -- 000027C0 + X"00A22825", -- 000027C4 + X"00661825", -- 000027C8 + X"00131027", -- 000027CC + X"00B5C021", -- 000027D0 + X"0071B021", -- 000027D4 + X"00541025", -- 000027D8 + X"00122D82", -- 000027DC + X"00121A80", -- 000027E0 + X"00659025", -- 000027E4 + X"00581026", -- 000027E8 + X"02D71826", -- 000027EC + X"00721826", -- 000027F0 + X"004D1021", -- 000027F4 + X"00671821", -- 000027F8 + X"00551021", -- 000027FC + X"0048A821", -- 00002800 + X"02238821", -- 00002804 + X"00142D82", -- 00002808 + X"00141280", -- 0000280C + X"0045A025", -- 00002810 + X"001136C2", -- 00002814 + X"00151482", -- 00002818 + X"00152B80", -- 0000281C + X"00111940", -- 00002820 + X"00A22825", -- 00002824 + X"00661825", -- 00002828 + X"00141027", -- 0000282C + X"00B9A821", -- 00002830 + X"007E8821", -- 00002834 + X"8FA7002C", -- 00002838 + X"00581025", -- 0000283C + X"00172D82", -- 00002840 + X"00171A80", -- 00002844 + X"0065B825", -- 00002848 + X"00551026", -- 0000284C + X"8FA50040", -- 00002850 + X"02361826", -- 00002854 + X"00471021", -- 00002858 + X"00771826", -- 0000285C + X"00651821", -- 00002860 + X"00591021", -- 00002864 + X"0048C821", -- 00002868 + X"03C3F021", -- 0000286C + X"00182D82", -- 00002870 + X"00181280", -- 00002874 + X"0045C025", -- 00002878 + X"001E3442", -- 0000287C + X"00191542", -- 00002880 + X"00192AC0", -- 00002884 + X"001E1BC0", -- 00002888 + X"00A22825", -- 0000288C + X"00661825", -- 00002890 + X"00181027", -- 00002894 + X"00B3C821", -- 00002898 + X"0072F021", -- 0000289C + X"00551025", -- 000028A0 + X"00162D82", -- 000028A4 + X"00161A80", -- 000028A8 + X"0065B025", -- 000028AC + X"00591026", -- 000028B0 + X"03D11826", -- 000028B4 + X"00761826", -- 000028B8 + X"004C1021", -- 000028BC + X"00701821", -- 000028C0 + X"00531021", -- 000028C4 + X"00489821", -- 000028C8 + X"02439021", -- 000028CC + X"00152D82", -- 000028D0 + X"00151280", -- 000028D4 + X"0045A825", -- 000028D8 + X"001234C2", -- 000028DC + X"00131602", -- 000028E0 + X"00132A00", -- 000028E4 + X"00121B40", -- 000028E8 + X"00A22825", -- 000028EC + X"00661825", -- 000028F0 + X"00151027", -- 000028F4 + X"00B49821", -- 000028F8 + X"00779021", -- 000028FC + X"8FA60030", -- 00002900 + X"00591025", -- 00002904 + X"00112D82", -- 00002908 + X"00111A80", -- 0000290C + X"00658825", -- 00002910 + X"8FA70048", -- 00002914 + X"025E1826", -- 00002918 + X"00531026", -- 0000291C + X"00461021", -- 00002920 + X"00711826", -- 00002924 + X"00671821", -- 00002928 + X"00541021", -- 0000292C + X"0048A021", -- 00002930 + X"02E3B821", -- 00002934 + X"00192D82", -- 00002938 + X"00191280", -- 0000293C + X"0045C825", -- 00002940 + X"00141EC2", -- 00002944 + X"00173542", -- 00002948 + X"00142940", -- 0000294C + X"001712C0", -- 00002950 + X"00A32825", -- 00002954 + X"00461025", -- 00002958 + X"00B8A021", -- 0000295C + X"0056B821", -- 00002960 + X"001E2D82", -- 00002964 + X"001E1280", -- 00002968 + X"00191827", -- 0000296C + X"0045F025", -- 00002970 + X"00731825", -- 00002974 + X"8FA20034", -- 00002978 + X"00741826", -- 0000297C + X"00621821", -- 00002980 + X"00781821", -- 00002984 + X"0068C021", -- 00002988 + X"02F21026", -- 0000298C + X"8FA3002C", -- 00002990 + X"8C860008", -- 00002994 + X"00133D82", -- 00002998 + X"00132A80", -- 0000299C + X"00A79825", -- 000029A0 + X"005E1026", -- 000029A4 + X"00431021", -- 000029A8 + X"00D33021", -- 000029AC + X"02C2B021", -- 000029B0 + X"00DE3021", -- 000029B4 + X"00181682", -- 000029B8 + X"00182980", -- 000029BC + X"00161D42", -- 000029C0 + X"8C8A0004", -- 000029C4 + X"8C87000C", -- 000029C8 + X"8C880000", -- 000029CC + X"00A22825", -- 000029D0 + X"00164AC0", -- 000029D4 + X"AC860004", -- 000029D8 + X"8C860010", -- 000029DC + X"01234825", -- 000029E0 + X"00B5C021", -- 000029E4 + X"00121D82", -- 000029E8 + X"00121280", -- 000029EC + X"0131B021", -- 000029F0 + X"01545021", -- 000029F4 + X"00D53021", -- 000029F8 + X"00439025", -- 000029FC + X"00F93821", -- 00002A00 + X"01184021", -- 00002A04 + X"024A9021", -- 00002A08 + X"00F13821", -- 00002A0C + X"00D63021", -- 00002A10 + X"01174021", -- 00002A14 + X"AC920000", -- 00002A18 + X"AC870008", -- 00002A1C + X"AC86000C", -- 00002A20 + X"AC880010", -- 00002A24 + X"8FBE0078", -- 00002A28 + X"8FB70074", -- 00002A2C + X"8FB60070", -- 00002A30 + X"8FB5006C", -- 00002A34 + X"8FB40068", -- 00002A38 + X"8FB30064", -- 00002A3C + X"8FB20060", -- 00002A40 + X"8FB1005C", -- 00002A44 + X"8FB00058", -- 00002A48 + X"03E00008", -- 00002A4C + X"27BD0080", -- 00002A50 + X"27BDFF98", -- 00002A54 + X"AFB10054", -- 00002A58 + X"27B10010", -- 00002A5C + X"AFB40060", -- 00002A60 + X"AFB20058", -- 00002A64 + X"AFB00050", -- 00002A68 + X"00C09021", -- 00002A6C + X"0080A021", -- 00002A70 + X"24060040", -- 00002A74 + X"00A08021", -- 00002A78 + X"02202021", -- 00002A7C + X"00002821", -- 00002A80 + X"AFB3005C", -- 00002A84 + X"AFBF0064", -- 00002A88 + X"0C100AEB", -- 00002A8C + X"00E09821", -- 00002A90 + X"3247003F", -- 00002A94 + X"10E0000F", -- 00002A98 + X"00003021", -- 00002A9C + X"00062882", -- 00002AA0 + X"00052880", -- 00002AA4 + X"92040000", -- 00002AA8 + X"00B12821", -- 00002AAC + X"30C20003", -- 00002AB0 + X"000210C0", -- 00002AB4 + X"8CA30000", -- 00002AB8 + X"00442004", -- 00002ABC + X"24C60001", -- 00002AC0 + X"00641826", -- 00002AC4 + X"00C7102B", -- 00002AC8 + X"ACA30000", -- 00002ACC + X"1440FFF3", -- 00002AD0 + X"26100001", -- 00002AD4 + X"3245003C", -- 00002AD8 + X"32430003", -- 00002ADC + X"00B12821", -- 00002AE0 + X"000318C0", -- 00002AE4 + X"24630007", -- 00002AE8 + X"8CA40000", -- 00002AEC + X"24020001", -- 00002AF0 + X"00621004", -- 00002AF4 + X"00822026", -- 00002AF8 + X"2CE30038", -- 00002AFC + X"10600012", -- 00002B00 + X"ACA40000", -- 00002B04 + X"001318C0", -- 00002B08 + X"00121742", -- 00002B0C + X"00431025", -- 00002B10 + X"02802021", -- 00002B14 + X"001218C0", -- 00002B18 + X"02202821", -- 00002B1C + X"AFA30048", -- 00002B20 + X"0C1001A3", -- 00002B24 + X"AFA2004C", -- 00002B28 + X"8FBF0064", -- 00002B2C + X"8FB40060", -- 00002B30 + X"8FB3005C", -- 00002B34 + X"8FB20058", -- 00002B38 + X"8FB10054", -- 00002B3C + X"8FB00050", -- 00002B40 + X"03E00008", -- 00002B44 + X"27BD0068", -- 00002B48 + X"02802021", -- 00002B4C + X"0C1001A3", -- 00002B50 + X"02202821", -- 00002B54 + X"02202021", -- 00002B58 + X"00002821", -- 00002B5C + X"0C100AEB", -- 00002B60 + X"24060040", -- 00002B64 + X"001318C0", -- 00002B68 + X"00121742", -- 00002B6C + X"00431025", -- 00002B70 + X"02802021", -- 00002B74 + X"001218C0", -- 00002B78 + X"02202821", -- 00002B7C + X"AFA30048", -- 00002B80 + X"0C1001A3", -- 00002B84 + X"AFA2004C", -- 00002B88 + X"8FBF0064", -- 00002B8C + X"8FB40060", -- 00002B90 + X"8FB3005C", -- 00002B94 + X"8FB20058", -- 00002B98 + X"8FB10054", -- 00002B9C + X"8FB00050", -- 00002BA0 + X"03E00008", -- 00002BA4 + X"27BD0068", -- 00002BA8 + X"2CC20010", -- 00002BAC + X"14400027", -- 00002BB0 + X"00801821", -- 00002BB4 + X"30870003", -- 00002BB8 + X"10E00009", -- 00002BBC + X"2CE20004", -- 00002BC0 + X"08100AF7", -- 00002BC4 + X"00000000", -- 00002BC8 + X"A0650000", -- 00002BCC + X"2CE20004", -- 00002BD0 + X"24C6FFFF", -- 00002BD4 + X"24630001", -- 00002BD8 + X"1440FFFB", -- 00002BDC + X"24E70001", -- 00002BE0 + X"30A500FF", -- 00002BE4 + X"00603821", -- 00002BE8 + X"10A00005", -- 00002BEC + X"00A04021", -- 00002BF0 + X"00051200", -- 00002BF4 + X"00A24025", -- 00002BF8 + X"00081C00", -- 00002BFC + X"01034025", -- 00002C00 + X"000610C2", -- 00002C04 + X"08100B07", -- 00002C08 + X"30C60007", -- 00002C0C + X"ACE80000", -- 00002C10 + X"ACE80004", -- 00002C14 + X"24E70008", -- 00002C18 + X"1440FFFC", -- 00002C1C + X"2442FFFF", -- 00002C20 + X"2CC20004", -- 00002C24 + X"14400004", -- 00002C28 + X"00000000", -- 00002C2C + X"ACE80000", -- 00002C30 + X"24C6FFFC", -- 00002C34 + X"24E70004", -- 00002C38 + X"10C00006", -- 00002C3C + X"00E01821", -- 00002C40 + X"A0650000", -- 00002C44 + X"24C6FFFF", -- 00002C48 + X"24630001", -- 00002C4C + X"14C0FFFC", -- 00002C50 + X"00000000", -- 00002C54 + X"03E00008", -- 00002C58 + X"00801021", -- 00002C5C + X"00000000", -- 00002C60 + X"00000000", -- 00002C64 + X"00000000", -- 00002C68 + X"00000000", -- 00002C6C + X"00000000", -- 00002C70 + X"00000000", -- 00002C74 + X"00000000", -- 00002C78 + X"00000000", -- 00002C7C + X"00000000", -- 00002C80 + X"00000000", -- 00002C84 + X"00000000", -- 00002C88 + X"00000000", -- 00002C8C + X"00000000", -- 00002C90 + X"00000000", -- 00002C94 + X"00000000", -- 00002C98 + X"00000000", -- 00002C9C + X"00000000", -- 00002CA0 + X"00000000", -- 00002CA4 + X"00000000", -- 00002CA8 + X"00000000", -- 00002CAC + X"00000000", -- 00002CB0 + X"00000000", -- 00002CB4 + X"00000000", -- 00002CB8 + X"00000000", -- 00002CBC + X"00000000", -- 00002CC0 + X"00000000", -- 00002CC4 + X"00000000", -- 00002CC8 + X"00000000", -- 00002CCC + X"00000000", -- 00002CD0 + X"00000000", -- 00002CD4 + X"00000000", -- 00002CD8 + X"00000000", -- 00002CDC + X"00000000", -- 00002CE0 + X"00000000", -- 00002CE4 + X"00000000", -- 00002CE8 + X"00000000", -- 00002CEC + X"00000000", -- 00002CF0 + X"00000000", -- 00002CF4 + X"00000000", -- 00002CF8 + X"00000000", -- 00002CFC + X"00000000", -- 00002D00 + X"00000000", -- 00002D04 + X"00000000", -- 00002D08 + X"00000000", -- 00002D0C + X"00000000", -- 00002D10 + X"00000000", -- 00002D14 + X"00000000", -- 00002D18 + X"00000000", -- 00002D1C + X"00000000", -- 00002D20 + X"00000000", -- 00002D24 + X"00000000", -- 00002D28 + X"00000000", -- 00002D2C + X"00000000", -- 00002D30 + X"00000000", -- 00002D34 + X"00000000", -- 00002D38 + X"00000000", -- 00002D3C + X"00000000", -- 00002D40 + X"00000000", -- 00002D44 + X"00000000", -- 00002D48 + X"00000000", -- 00002D4C + X"00000000", -- 00002D50 + X"00000000", -- 00002D54 + X"00000000", -- 00002D58 + X"00000000", -- 00002D5C + X"00000000", -- 00002D60 + X"00000000", -- 00002D64 + X"00000000", -- 00002D68 + X"00000000", -- 00002D6C + X"00000000", -- 00002D70 + X"00000000", -- 00002D74 + X"00000000", -- 00002D78 + X"00000000", -- 00002D7C + X"00000000", -- 00002D80 + X"00000000", -- 00002D84 + X"00000000", -- 00002D88 + X"00000000", -- 00002D8C + X"00000000", -- 00002D90 + X"00000000", -- 00002D94 + X"00000000", -- 00002D98 + X"00000000", -- 00002D9C + X"00000000", -- 00002DA0 + X"00000000", -- 00002DA4 + X"00000000", -- 00002DA8 + X"00000000", -- 00002DAC + X"00000000", -- 00002DB0 + X"00000000", -- 00002DB4 + X"00000000", -- 00002DB8 + X"00000000", -- 00002DBC + X"00000000", -- 00002DC0 + X"00000000", -- 00002DC4 + X"00000000", -- 00002DC8 + X"00000000", -- 00002DCC + X"00000000", -- 00002DD0 + X"00000000", -- 00002DD4 + X"00000000", -- 00002DD8 + X"00000000", -- 00002DDC + X"00000000", -- 00002DE0 + X"00000000", -- 00002DE4 + X"00000000", -- 00002DE8 + X"00000000", -- 00002DEC + X"00000000", -- 00002DF0 + X"00000000", -- 00002DF4 + X"00000000", -- 00002DF8 + X"00000000", -- 00002DFC + X"00000000", -- 00002E00 + X"00000000", -- 00002E04 + X"00000000", -- 00002E08 + X"00000000", -- 00002E0C + X"00000000", -- 00002E10 + X"00000000", -- 00002E14 + X"00000000", -- 00002E18 + X"00000000", -- 00002E1C + X"00000000", -- 00002E20 + X"00000000", -- 00002E24 + X"00000000", -- 00002E28 + X"00000000", -- 00002E2C + X"00000000", -- 00002E30 + X"00000000", -- 00002E34 + X"00000000", -- 00002E38 + X"00000000", -- 00002E3C + X"00000000", -- 00002E40 + X"00000000", -- 00002E44 + X"00000000", -- 00002E48 + X"00000000", -- 00002E4C + X"00000000", -- 00002E50 + X"00000000", -- 00002E54 + X"00000000", -- 00002E58 + X"00000000", -- 00002E5C + X"00000000", -- 00002E60 + X"00000000", -- 00002E64 + X"00000000", -- 00002E68 + X"00000000", -- 00002E6C + X"00000000", -- 00002E70 + X"00000000", -- 00002E74 + X"00000000", -- 00002E78 + X"00000000", -- 00002E7C + X"00000000", -- 00002E80 + X"00000000", -- 00002E84 + X"00000000", -- 00002E88 + X"00000000", -- 00002E8C + X"00000000", -- 00002E90 + X"00000000", -- 00002E94 + X"00000000", -- 00002E98 + X"00000000", -- 00002E9C + X"00000000", -- 00002EA0 + X"00000000", -- 00002EA4 + X"00000000", -- 00002EA8 + X"00000000", -- 00002EAC + X"00000000", -- 00002EB0 + X"00000000", -- 00002EB4 + X"00000000", -- 00002EB8 + X"00000000", -- 00002EBC + X"00000000", -- 00002EC0 + X"00000000", -- 00002EC4 + X"00000000", -- 00002EC8 + X"00000000", -- 00002ECC + X"00000000", -- 00002ED0 + X"00000000", -- 00002ED4 + X"00000000", -- 00002ED8 + X"00000000", -- 00002EDC + X"00000000", -- 00002EE0 + X"00000000", -- 00002EE4 + X"00000000", -- 00002EE8 + X"00000000", -- 00002EEC + X"00000000", -- 00002EF0 + X"00000000", -- 00002EF4 + X"00000000", -- 00002EF8 + X"00000000", -- 00002EFC + X"00000000", -- 00002F00 + X"00000000", -- 00002F04 + X"00000000", -- 00002F08 + X"00000000", -- 00002F0C + X"00000000", -- 00002F10 + X"00000000", -- 00002F14 + X"00000000", -- 00002F18 + X"00000000", -- 00002F1C + X"00000000", -- 00002F20 + X"00000000", -- 00002F24 + X"00000000", -- 00002F28 + X"00000000", -- 00002F2C + X"00000000", -- 00002F30 + X"00000000", -- 00002F34 + X"00000000", -- 00002F38 + X"00000000", -- 00002F3C + X"00000000", -- 00002F40 + X"00000000", -- 00002F44 + X"00000000", -- 00002F48 + X"00000000", -- 00002F4C + X"00000000", -- 00002F50 + X"00000000", -- 00002F54 + X"00000000", -- 00002F58 + X"00000000", -- 00002F5C + X"00000000", -- 00002F60 + X"00000000", -- 00002F64 + X"00000000", -- 00002F68 + X"00000000", -- 00002F6C + X"00000000", -- 00002F70 + X"00000000", -- 00002F74 + X"00000000", -- 00002F78 + X"00000000", -- 00002F7C + X"00000000", -- 00002F80 + X"00000000", -- 00002F84 + X"00000000", -- 00002F88 + X"00000000", -- 00002F8C + X"00000000", -- 00002F90 + X"00000000", -- 00002F94 + X"00000000", -- 00002F98 + X"00000000", -- 00002F9C + X"00000000", -- 00002FA0 + X"00000000", -- 00002FA4 + X"00000000", -- 00002FA8 + X"00000000", -- 00002FAC + X"00000000", -- 00002FB0 + X"00000000", -- 00002FB4 + X"00000000", -- 00002FB8 + X"00000000", -- 00002FBC + X"00000000", -- 00002FC0 + X"00000000", -- 00002FC4 + X"00000000", -- 00002FC8 + X"00000000", -- 00002FCC + X"00000000", -- 00002FD0 + X"00000000", -- 00002FD4 + X"00000000", -- 00002FD8 + X"00000000", -- 00002FDC + X"00000000", -- 00002FE0 + X"00000000", -- 00002FE4 + X"00000000", -- 00002FE8 + X"00000000", -- 00002FEC + X"00000000", -- 00002FF0 + X"00000000", -- 00002FF4 + X"00000000", -- 00002FF8 + X"00000000", -- 00002FFC + X"00000000", -- 00003000 + X"00000000", -- 00003004 + X"00000000", -- 00003008 + X"00000000", -- 0000300C + X"00000000", -- 00003010 + X"00000000", -- 00003014 + X"00000000", -- 00003018 + X"00000000", -- 0000301C + X"00000000", -- 00003020 + X"00000000", -- 00003024 + X"00000000", -- 00003028 + X"00000000", -- 0000302C + X"00000000", -- 00003030 + X"00000000", -- 00003034 + X"00000000", -- 00003038 + X"00000000", -- 0000303C + X"00000000", -- 00003040 + X"00000000", -- 00003044 + X"00000000", -- 00003048 + X"00000000", -- 0000304C + X"00000000", -- 00003050 + X"00000000", -- 00003054 + X"00000000", -- 00003058 + X"00000000", -- 0000305C + X"00000000", -- 00003060 + X"00000000", -- 00003064 + X"00000000", -- 00003068 + X"00000000", -- 0000306C + X"00000000", -- 00003070 + X"00000000", -- 00003074 + X"00000000", -- 00003078 + X"00000000", -- 0000307C + X"00000000", -- 00003080 + X"00000000", -- 00003084 + X"00000000", -- 00003088 + X"00000000", -- 0000308C + X"00000000", -- 00003090 + X"00000000", -- 00003094 + X"00000000", -- 00003098 + X"00000000", -- 0000309C + X"00000000", -- 000030A0 + X"00000000", -- 000030A4 + X"00000000", -- 000030A8 + X"00000000", -- 000030AC + X"00000000", -- 000030B0 + X"00000000", -- 000030B4 + X"00000000", -- 000030B8 + X"00000000", -- 000030BC + X"00000000", -- 000030C0 + X"00000000", -- 000030C4 + X"00000000", -- 000030C8 + X"00000000", -- 000030CC + X"00000000", -- 000030D0 + X"00000000", -- 000030D4 + X"00000000", -- 000030D8 + X"00000000", -- 000030DC + X"00000000", -- 000030E0 + X"00000000", -- 000030E4 + X"00000000", -- 000030E8 + X"00000000", -- 000030EC + X"00000000", -- 000030F0 + X"00000000", -- 000030F4 + X"00000000", -- 000030F8 + X"00000000", -- 000030FC + X"00000000", -- 00003100 + X"00000000", -- 00003104 + X"00000000", -- 00003108 + X"00000000", -- 0000310C + X"00000000", -- 00003110 + X"00000000", -- 00003114 + X"00000000", -- 00003118 + X"00000000", -- 0000311C + X"00000000", -- 00003120 + X"00000000", -- 00003124 + X"00000000", -- 00003128 + X"00000000", -- 0000312C + X"00000000", -- 00003130 + X"00000000", -- 00003134 + X"00000000", -- 00003138 + X"00000000", -- 0000313C + X"00000000", -- 00003140 + X"00000000", -- 00003144 + X"00000000", -- 00003148 + X"00000000", -- 0000314C + X"00000000", -- 00003150 + X"00000000", -- 00003154 + X"00000000", -- 00003158 + X"00000000", -- 0000315C + X"00000000", -- 00003160 + X"00000000", -- 00003164 + X"00000000", -- 00003168 + X"00000000", -- 0000316C + X"00000000", -- 00003170 + X"00000000", -- 00003174 + X"00000000", -- 00003178 + X"00000000", -- 0000317C + X"00000000", -- 00003180 + X"00000000", -- 00003184 + X"00000000", -- 00003188 + X"00000000", -- 0000318C + X"00000000", -- 00003190 + X"00000000", -- 00003194 + X"00000000", -- 00003198 + X"00000000", -- 0000319C + X"00000000", -- 000031A0 + X"00000000", -- 000031A4 + X"00000000", -- 000031A8 + X"00000000", -- 000031AC + X"00000000", -- 000031B0 + X"00000000", -- 000031B4 + X"00000000", -- 000031B8 + X"00000000", -- 000031BC + X"00000000", -- 000031C0 + X"00000000", -- 000031C4 + X"00000000", -- 000031C8 + X"00000000", -- 000031CC + X"00000000", -- 000031D0 + X"00000000", -- 000031D4 + X"00000000", -- 000031D8 + X"00000000", -- 000031DC + X"00000000", -- 000031E0 + X"00000000", -- 000031E4 + X"00000000", -- 000031E8 + X"00000000", -- 000031EC + X"00000000", -- 000031F0 + X"00000000", -- 000031F4 + X"00000000", -- 000031F8 + X"00000000", -- 000031FC + X"00000000", -- 00003200 + X"00000000", -- 00003204 + X"00000000", -- 00003208 + X"00000000", -- 0000320C + X"00000000", -- 00003210 + X"00000000", -- 00003214 + X"00000000", -- 00003218 + X"00000000", -- 0000321C + X"00000000", -- 00003220 + X"00000000", -- 00003224 + X"00000000", -- 00003228 + X"00000000", -- 0000322C + X"00000000", -- 00003230 + X"00000000", -- 00003234 + X"00000000", -- 00003238 + X"00000000", -- 0000323C + X"00000000", -- 00003240 + X"00000000", -- 00003244 + X"00000000", -- 00003248 + X"00000000", -- 0000324C + X"00000000", -- 00003250 + X"00000000", -- 00003254 + X"00000000", -- 00003258 + X"00000000", -- 0000325C + X"00000000", -- 00003260 + X"00000000", -- 00003264 + X"00000000", -- 00003268 + X"00000000", -- 0000326C + X"00000000", -- 00003270 + X"00000000", -- 00003274 + X"00000000", -- 00003278 + X"00000000", -- 0000327C + X"00000000", -- 00003280 + X"00000000", -- 00003284 + X"00000000", -- 00003288 + X"00000000", -- 0000328C + X"00000000", -- 00003290 + X"00000000", -- 00003294 + X"00000000", -- 00003298 + X"00000000", -- 0000329C + X"00000000", -- 000032A0 + X"00000000", -- 000032A4 + X"00000000", -- 000032A8 + X"00000000", -- 000032AC + X"00000000", -- 000032B0 + X"00000000", -- 000032B4 + X"00000000", -- 000032B8 + X"00000000", -- 000032BC + X"00000000", -- 000032C0 + X"00000000", -- 000032C4 + X"00000000", -- 000032C8 + X"00000000", -- 000032CC + X"00000000", -- 000032D0 + X"00000000", -- 000032D4 + X"00000000", -- 000032D8 + X"00000000", -- 000032DC + X"00000000", -- 000032E0 + X"00000000", -- 000032E4 + X"00000000", -- 000032E8 + X"00000000", -- 000032EC + X"00000000", -- 000032F0 + X"00000000", -- 000032F4 + X"00000000", -- 000032F8 + X"00000000", -- 000032FC + X"00000000", -- 00003300 + X"00000000", -- 00003304 + X"00000000", -- 00003308 + X"00000000", -- 0000330C + X"00000000", -- 00003310 + X"00000000", -- 00003314 + X"00000000", -- 00003318 + X"00000000", -- 0000331C + X"00000000", -- 00003320 + X"00000000", -- 00003324 + X"00000000", -- 00003328 + X"00000000", -- 0000332C + X"00000000", -- 00003330 + X"00000000", -- 00003334 + X"00000000", -- 00003338 + X"00000000", -- 0000333C + X"00000000", -- 00003340 + X"00000000", -- 00003344 + X"00000000", -- 00003348 + X"00000000", -- 0000334C + X"00000000", -- 00003350 + X"00000000", -- 00003354 + X"00000000", -- 00003358 + X"00000000", -- 0000335C + X"00000000", -- 00003360 + X"00000000", -- 00003364 + X"00000000", -- 00003368 + X"00000000", -- 0000336C + X"00000000", -- 00003370 + X"00000000", -- 00003374 + X"00000000", -- 00003378 + X"00000000", -- 0000337C + X"00000000", -- 00003380 + X"00000000", -- 00003384 + X"00000000", -- 00003388 + X"00000000", -- 0000338C + X"00000000", -- 00003390 + X"00000000", -- 00003394 + X"00000000", -- 00003398 + X"00000000", -- 0000339C + X"00000000", -- 000033A0 + X"00000000", -- 000033A4 + X"00000000", -- 000033A8 + X"00000000", -- 000033AC + X"00000000", -- 000033B0 + X"00000000", -- 000033B4 + X"00000000", -- 000033B8 + X"00000000", -- 000033BC + X"00000000", -- 000033C0 + X"00000000", -- 000033C4 + X"00000000", -- 000033C8 + X"00000000", -- 000033CC + X"00000000", -- 000033D0 + X"00000000", -- 000033D4 + X"00000000", -- 000033D8 + X"00000000", -- 000033DC + X"00000000", -- 000033E0 + X"00000000", -- 000033E4 + X"00000000", -- 000033E8 + X"00000000", -- 000033EC + X"00000000", -- 000033F0 + X"00000000", -- 000033F4 + X"00000000", -- 000033F8 + X"00000000", -- 000033FC + X"00000000", -- 00003400 + X"00000000", -- 00003404 + X"00000000", -- 00003408 + X"00000000", -- 0000340C + X"00000000", -- 00003410 + X"00000000", -- 00003414 + X"00000000", -- 00003418 + X"00000000", -- 0000341C + X"00000000", -- 00003420 + X"00000000", -- 00003424 + X"00000000", -- 00003428 + X"00000000", -- 0000342C + X"00000000", -- 00003430 + X"00000000", -- 00003434 + X"00000000", -- 00003438 + X"00000000", -- 0000343C + X"00000000", -- 00003440 + X"00000000", -- 00003444 + X"00000000", -- 00003448 + X"00000000", -- 0000344C + X"00000000", -- 00003450 + X"00000000", -- 00003454 + X"00000000", -- 00003458 + X"00000000", -- 0000345C + X"00000000", -- 00003460 + X"00000000", -- 00003464 + X"00000000", -- 00003468 + X"00000000", -- 0000346C + X"00000000", -- 00003470 + X"00000000", -- 00003474 + X"00000000", -- 00003478 + X"00000000", -- 0000347C + X"00000000", -- 00003480 + X"00000000", -- 00003484 + X"00000000", -- 00003488 + X"00000000", -- 0000348C + X"00000000", -- 00003490 + X"00000000", -- 00003494 + X"00000000", -- 00003498 + X"00000000", -- 0000349C + X"00000000", -- 000034A0 + X"00000000", -- 000034A4 + X"00000000", -- 000034A8 + X"00000000", -- 000034AC + X"00000000", -- 000034B0 + X"00000000", -- 000034B4 + X"00000000", -- 000034B8 + X"00000000", -- 000034BC + X"00000000", -- 000034C0 + X"00000000", -- 000034C4 + X"00000000", -- 000034C8 + X"00000000", -- 000034CC + X"00000000", -- 000034D0 + X"00000000", -- 000034D4 + X"00000000", -- 000034D8 + X"00000000", -- 000034DC + X"00000000", -- 000034E0 + X"00000000", -- 000034E4 + X"00000000", -- 000034E8 + X"00000000", -- 000034EC + X"00000000", -- 000034F0 + X"00000000", -- 000034F4 + X"00000000", -- 000034F8 + X"00000000", -- 000034FC + X"00000000", -- 00003500 + X"00000000", -- 00003504 + X"00000000", -- 00003508 + X"00000000", -- 0000350C + X"00000000", -- 00003510 + X"00000000", -- 00003514 + X"00000000", -- 00003518 + X"00000000", -- 0000351C + X"00000000", -- 00003520 + X"00000000", -- 00003524 + X"00000000", -- 00003528 + X"00000000", -- 0000352C + X"00000000", -- 00003530 + X"00000000", -- 00003534 + X"00000000", -- 00003538 + X"00000000", -- 0000353C + X"00000000", -- 00003540 + X"00000000", -- 00003544 + X"00000000", -- 00003548 + X"00000000", -- 0000354C + X"00000000", -- 00003550 + X"00000000", -- 00003554 + X"00000000", -- 00003558 + X"00000000", -- 0000355C + X"00000000", -- 00003560 + X"00000000", -- 00003564 + X"00000000", -- 00003568 + X"00000000", -- 0000356C + X"00000000", -- 00003570 + X"00000000", -- 00003574 + X"00000000", -- 00003578 + X"00000000", -- 0000357C + X"00000000", -- 00003580 + X"00000000", -- 00003584 + X"00000000", -- 00003588 + X"00000000", -- 0000358C + X"00000000", -- 00003590 + X"00000000", -- 00003594 + X"00000000", -- 00003598 + X"00000000", -- 0000359C + X"00000000", -- 000035A0 + X"00000000", -- 000035A4 + X"00000000", -- 000035A8 + X"00000000", -- 000035AC + X"00000000", -- 000035B0 + X"00000000", -- 000035B4 + X"00000000", -- 000035B8 + X"00000000", -- 000035BC + X"00000000", -- 000035C0 + X"00000000", -- 000035C4 + X"00000000", -- 000035C8 + X"00000000", -- 000035CC + X"00000000", -- 000035D0 + X"00000000", -- 000035D4 + X"00000000", -- 000035D8 + X"00000000", -- 000035DC + X"00000000", -- 000035E0 + X"00000000", -- 000035E4 + X"00000000", -- 000035E8 + X"00000000", -- 000035EC + X"00000000", -- 000035F0 + X"00000000", -- 000035F4 + X"00000000", -- 000035F8 + X"00000000", -- 000035FC + X"00000000", -- 00003600 + X"00000000", -- 00003604 + X"00000000", -- 00003608 + X"00000000", -- 0000360C + X"00000000", -- 00003610 + X"00000000", -- 00003614 + X"00000000", -- 00003618 + X"00000000", -- 0000361C + X"00000000", -- 00003620 + X"00000000", -- 00003624 + X"00000000", -- 00003628 + X"00000000", -- 0000362C + X"00000000", -- 00003630 + X"00000000", -- 00003634 + X"00000000", -- 00003638 + X"00000000", -- 0000363C + X"00000000", -- 00003640 + X"00000000", -- 00003644 + X"00000000", -- 00003648 + X"00000000", -- 0000364C + X"00000000", -- 00003650 + X"00000000", -- 00003654 + X"00000000", -- 00003658 + X"00000000", -- 0000365C + X"00000000", -- 00003660 + X"00000000", -- 00003664 + X"00000000", -- 00003668 + X"00000000", -- 0000366C + X"00000000", -- 00003670 + X"00000000", -- 00003674 + X"00000000", -- 00003678 + X"00000000", -- 0000367C + X"00000000", -- 00003680 + X"00000000", -- 00003684 + X"00000000", -- 00003688 + X"00000000", -- 0000368C + X"00000000", -- 00003690 + X"00000000", -- 00003694 + X"00000000", -- 00003698 + X"00000000", -- 0000369C + X"00000000", -- 000036A0 + X"00000000", -- 000036A4 + X"00000000", -- 000036A8 + X"00000000", -- 000036AC + X"00000000", -- 000036B0 + X"00000000", -- 000036B4 + X"00000000", -- 000036B8 + X"00000000", -- 000036BC + X"00000000", -- 000036C0 + X"00000000", -- 000036C4 + X"00000000", -- 000036C8 + X"00000000", -- 000036CC + X"00000000", -- 000036D0 + X"00000000", -- 000036D4 + X"00000000", -- 000036D8 + X"00000000", -- 000036DC + X"00000000", -- 000036E0 + X"00000000", -- 000036E4 + X"00000000", -- 000036E8 + X"00000000", -- 000036EC + X"00000000", -- 000036F0 + X"00000000", -- 000036F4 + X"00000000", -- 000036F8 + X"00000000", -- 000036FC + X"00000000", -- 00003700 + X"00000000", -- 00003704 + X"00000000", -- 00003708 + X"00000000", -- 0000370C + X"00000000", -- 00003710 + X"00000000", -- 00003714 + X"00000000", -- 00003718 + X"00000000", -- 0000371C + X"00000000", -- 00003720 + X"00000000", -- 00003724 + X"00000000", -- 00003728 + X"00000000", -- 0000372C + X"00000000", -- 00003730 + X"00000000", -- 00003734 + X"00000000", -- 00003738 + X"00000000", -- 0000373C + X"00000000", -- 00003740 + X"00000000", -- 00003744 + X"00000000", -- 00003748 + X"00000000", -- 0000374C + X"00000000", -- 00003750 + X"00000000", -- 00003754 + X"00000000", -- 00003758 + X"00000000", -- 0000375C + X"00000000", -- 00003760 + X"00000000", -- 00003764 + X"00000000", -- 00003768 + X"00000000", -- 0000376C + X"00000000", -- 00003770 + X"00000000", -- 00003774 + X"00000000", -- 00003778 + X"00000000", -- 0000377C + X"00000000", -- 00003780 + X"00000000", -- 00003784 + X"00000000", -- 00003788 + X"00000000", -- 0000378C + X"00000000", -- 00003790 + X"00000000", -- 00003794 + X"00000000", -- 00003798 + X"00000000", -- 0000379C + X"00000000", -- 000037A0 + X"00000000", -- 000037A4 + X"00000000", -- 000037A8 + X"00000000", -- 000037AC + X"00000000", -- 000037B0 + X"00000000", -- 000037B4 + X"00000000", -- 000037B8 + X"00000000", -- 000037BC + X"00000000", -- 000037C0 + X"00000000", -- 000037C4 + X"00000000", -- 000037C8 + X"00000000", -- 000037CC + X"00000000", -- 000037D0 + X"00000000", -- 000037D4 + X"00000000", -- 000037D8 + X"00000000", -- 000037DC + X"00000000", -- 000037E0 + X"00000000", -- 000037E4 + X"00000000", -- 000037E8 + X"00000000", -- 000037EC + X"00000000", -- 000037F0 + X"00000000", -- 000037F4 + X"00000000", -- 000037F8 + X"00000000", -- 000037FC + X"00000000", -- 00003800 + X"00000000", -- 00003804 + X"00000000", -- 00003808 + X"00000000", -- 0000380C + X"00000000", -- 00003810 + X"00000000", -- 00003814 + X"00000000", -- 00003818 + X"00000000", -- 0000381C + X"00000000", -- 00003820 + X"00000000", -- 00003824 + X"00000000", -- 00003828 + X"00000000", -- 0000382C + X"00000000", -- 00003830 + X"00000000", -- 00003834 + X"00000000", -- 00003838 + X"00000000", -- 0000383C + X"00000000", -- 00003840 + X"00000000", -- 00003844 + X"00000000", -- 00003848 + X"00000000", -- 0000384C + X"00000000", -- 00003850 + X"00000000", -- 00003854 + X"00000000", -- 00003858 + X"00000000", -- 0000385C + X"00000000", -- 00003860 + X"00000000", -- 00003864 + X"00000000", -- 00003868 + X"00000000", -- 0000386C + X"00000000", -- 00003870 + X"00000000", -- 00003874 + X"00000000", -- 00003878 + X"00000000", -- 0000387C + X"00000000", -- 00003880 + X"00000000", -- 00003884 + X"00000000", -- 00003888 + X"00000000", -- 0000388C + X"00000000", -- 00003890 + X"00000000", -- 00003894 + X"00000000", -- 00003898 + X"00000000", -- 0000389C + X"00000000", -- 000038A0 + X"00000000", -- 000038A4 + X"00000000", -- 000038A8 + X"00000000", -- 000038AC + X"00000000", -- 000038B0 + X"00000000", -- 000038B4 + X"00000000", -- 000038B8 + X"00000000", -- 000038BC + X"00000000", -- 000038C0 + X"00000000", -- 000038C4 + X"00000000", -- 000038C8 + X"00000000", -- 000038CC + X"00000000", -- 000038D0 + X"00000000", -- 000038D4 + X"00000000", -- 000038D8 + X"00000000", -- 000038DC + X"00000000", -- 000038E0 + X"00000000", -- 000038E4 + X"00000000", -- 000038E8 + X"00000000", -- 000038EC + X"00000000", -- 000038F0 + X"00000000", -- 000038F4 + X"00000000", -- 000038F8 + X"00000000", -- 000038FC + X"00000000", -- 00003900 + X"00000000", -- 00003904 + X"00000000", -- 00003908 + X"00000000", -- 0000390C + X"00000000", -- 00003910 + X"00000000", -- 00003914 + X"00000000", -- 00003918 + X"00000000", -- 0000391C + X"00000000", -- 00003920 + X"00000000", -- 00003924 + X"00000000", -- 00003928 + X"00000000", -- 0000392C + X"00000000", -- 00003930 + X"00000000", -- 00003934 + X"00000000", -- 00003938 + X"00000000", -- 0000393C + X"00000000", -- 00003940 + X"00000000", -- 00003944 + X"00000000", -- 00003948 + X"00000000", -- 0000394C + X"00000000", -- 00003950 + X"00000000", -- 00003954 + X"00000000", -- 00003958 + X"00000000", -- 0000395C + X"00000000", -- 00003960 + X"00000000", -- 00003964 + X"00000000", -- 00003968 + X"00000000", -- 0000396C + X"00000000", -- 00003970 + X"00000000", -- 00003974 + X"00000000", -- 00003978 + X"00000000", -- 0000397C + X"00000000", -- 00003980 + X"00000000", -- 00003984 + X"00000000", -- 00003988 + X"00000000", -- 0000398C + X"00000000", -- 00003990 + X"00000000", -- 00003994 + X"00000000", -- 00003998 + X"00000000", -- 0000399C + X"00000000", -- 000039A0 + X"00000000", -- 000039A4 + X"00000000", -- 000039A8 + X"00000000", -- 000039AC + X"00000000", -- 000039B0 + X"00000000", -- 000039B4 + X"00000000", -- 000039B8 + X"00000000", -- 000039BC + X"00000000", -- 000039C0 + X"00000000", -- 000039C4 + X"00000000", -- 000039C8 + X"00000000", -- 000039CC + X"00000000", -- 000039D0 + X"00000000", -- 000039D4 + X"00000000", -- 000039D8 + X"00000000", -- 000039DC + X"00000000", -- 000039E0 + X"00000000", -- 000039E4 + X"00000000", -- 000039E8 + X"00000000", -- 000039EC + X"00000000", -- 000039F0 + X"00000000", -- 000039F4 + X"00000000", -- 000039F8 + X"00000000", -- 000039FC + X"00000000", -- 00003A00 + X"00000000", -- 00003A04 + X"00000000", -- 00003A08 + X"00000000", -- 00003A0C + X"00000000", -- 00003A10 + X"00000000", -- 00003A14 + X"00000000", -- 00003A18 + X"00000000", -- 00003A1C + X"00000000", -- 00003A20 + X"00000000", -- 00003A24 + X"00000000", -- 00003A28 + X"00000000", -- 00003A2C + X"00000000", -- 00003A30 + X"00000000", -- 00003A34 + X"00000000", -- 00003A38 + X"00000000", -- 00003A3C + X"00000000", -- 00003A40 + X"00000000", -- 00003A44 + X"00000000", -- 00003A48 + X"00000000", -- 00003A4C + X"00000000", -- 00003A50 + X"00000000", -- 00003A54 + X"00000000", -- 00003A58 + X"00000000", -- 00003A5C + X"00000000", -- 00003A60 + X"00000000", -- 00003A64 + X"00000000", -- 00003A68 + X"00000000", -- 00003A6C + X"00000000", -- 00003A70 + X"00000000", -- 00003A74 + X"00000000", -- 00003A78 + X"00000000", -- 00003A7C + X"00000000", -- 00003A80 + X"00000000", -- 00003A84 + X"00000000", -- 00003A88 + X"00000000", -- 00003A8C + X"00000000", -- 00003A90 + X"00000000", -- 00003A94 + X"00000000", -- 00003A98 + X"00000000", -- 00003A9C + X"00000000", -- 00003AA0 + X"00000000", -- 00003AA4 + X"00000000", -- 00003AA8 + X"00000000", -- 00003AAC + X"00000000", -- 00003AB0 + X"00000000", -- 00003AB4 + X"00000000", -- 00003AB8 + X"00000000", -- 00003ABC + X"00000000", -- 00003AC0 + X"00000000", -- 00003AC4 + X"00000000", -- 00003AC8 + X"00000000", -- 00003ACC + X"00000000", -- 00003AD0 + X"00000000", -- 00003AD4 + X"00000000", -- 00003AD8 + X"00000000", -- 00003ADC + X"00000000", -- 00003AE0 + X"00000000", -- 00003AE4 + X"00000000", -- 00003AE8 + X"00000000", -- 00003AEC + X"00000000", -- 00003AF0 + X"00000000", -- 00003AF4 + X"00000000", -- 00003AF8 + X"00000000", -- 00003AFC + X"00000000", -- 00003B00 + X"00000000", -- 00003B04 + X"00000000", -- 00003B08 + X"00000000", -- 00003B0C + X"00000000", -- 00003B10 + X"00000000", -- 00003B14 + X"00000000", -- 00003B18 + X"00000000", -- 00003B1C + X"00000000", -- 00003B20 + X"00000000", -- 00003B24 + X"00000000", -- 00003B28 + X"00000000", -- 00003B2C + X"00000000", -- 00003B30 + X"00000000", -- 00003B34 + X"00000000", -- 00003B38 + X"00000000", -- 00003B3C + X"00000000", -- 00003B40 + X"00000000", -- 00003B44 + X"00000000", -- 00003B48 + X"00000000", -- 00003B4C + X"00000000", -- 00003B50 + X"00000000", -- 00003B54 + X"00000000", -- 00003B58 + X"00000000", -- 00003B5C + X"00000000", -- 00003B60 + X"00000000", -- 00003B64 + X"00000000", -- 00003B68 + X"00000000", -- 00003B6C + X"00000000", -- 00003B70 + X"00000000", -- 00003B74 + X"00000000", -- 00003B78 + X"00000000", -- 00003B7C + X"00000000", -- 00003B80 + X"00000000", -- 00003B84 + X"00000000", -- 00003B88 + X"00000000", -- 00003B8C + X"00000000", -- 00003B90 + X"00000000", -- 00003B94 + X"00000000", -- 00003B98 + X"00000000", -- 00003B9C + X"00000000", -- 00003BA0 + X"00000000", -- 00003BA4 + X"00000000", -- 00003BA8 + X"00000000", -- 00003BAC + X"00000000", -- 00003BB0 + X"00000000", -- 00003BB4 + X"00000000", -- 00003BB8 + X"00000000", -- 00003BBC + X"00000000", -- 00003BC0 + X"00000000", -- 00003BC4 + X"00000000", -- 00003BC8 + X"00000000", -- 00003BCC + X"00000000", -- 00003BD0 + X"00000000", -- 00003BD4 + X"00000000", -- 00003BD8 + X"00000000", -- 00003BDC + X"00000000", -- 00003BE0 + X"00000000", -- 00003BE4 + X"00000000", -- 00003BE8 + X"00000000", -- 00003BEC + X"00000000", -- 00003BF0 + X"00000000", -- 00003BF4 + X"00000000", -- 00003BF8 + X"00000000", -- 00003BFC + X"00000000", -- 00003C00 + X"00000000", -- 00003C04 + X"00000000", -- 00003C08 + X"00000000", -- 00003C0C + X"00000000", -- 00003C10 + X"00000000", -- 00003C14 + X"00000000", -- 00003C18 + X"00000000", -- 00003C1C + X"00000000", -- 00003C20 + X"00000000", -- 00003C24 + X"00000000", -- 00003C28 + X"00000000", -- 00003C2C + X"00000000", -- 00003C30 + X"00000000", -- 00003C34 + X"00000000", -- 00003C38 + X"00000000", -- 00003C3C + X"00000000", -- 00003C40 + X"00000000", -- 00003C44 + X"00000000", -- 00003C48 + X"00000000", -- 00003C4C + X"00000000", -- 00003C50 + X"00000000", -- 00003C54 + X"00000000", -- 00003C58 + X"00000000", -- 00003C5C + X"00000000", -- 00003C60 + X"00000000", -- 00003C64 + X"00000000", -- 00003C68 + X"00000000", -- 00003C6C + X"00000000", -- 00003C70 + X"00000000", -- 00003C74 + X"00000000", -- 00003C78 + X"00000000", -- 00003C7C + X"00000000", -- 00003C80 + X"00000000", -- 00003C84 + X"00000000", -- 00003C88 + X"00000000", -- 00003C8C + X"00000000", -- 00003C90 + X"00000000", -- 00003C94 + X"00000000", -- 00003C98 + X"00000000", -- 00003C9C + X"00000000", -- 00003CA0 + X"00000000", -- 00003CA4 + X"00000000", -- 00003CA8 + X"00000000", -- 00003CAC + X"00000000", -- 00003CB0 + X"00000000", -- 00003CB4 + X"00000000", -- 00003CB8 + X"00000000", -- 00003CBC + X"00000000", -- 00003CC0 + X"00000000", -- 00003CC4 + X"00000000", -- 00003CC8 + X"00000000", -- 00003CCC + X"00000000", -- 00003CD0 + X"00000000", -- 00003CD4 + X"00000000", -- 00003CD8 + X"00000000", -- 00003CDC + X"00000000", -- 00003CE0 + X"00000000", -- 00003CE4 + X"00000000", -- 00003CE8 + X"00000000", -- 00003CEC + X"00000000", -- 00003CF0 + X"00000000", -- 00003CF4 + X"00000000", -- 00003CF8 + X"00000000", -- 00003CFC + X"00000000", -- 00003D00 + X"00000000", -- 00003D04 + X"00000000", -- 00003D08 + X"00000000", -- 00003D0C + X"00000000", -- 00003D10 + X"00000000", -- 00003D14 + X"00000000", -- 00003D18 + X"00000000", -- 00003D1C + X"00000000", -- 00003D20 + X"00000000", -- 00003D24 + X"00000000", -- 00003D28 + X"00000000", -- 00003D2C + X"00000000", -- 00003D30 + X"00000000", -- 00003D34 + X"00000000", -- 00003D38 + X"00000000", -- 00003D3C + X"00000000", -- 00003D40 + X"00000000", -- 00003D44 + X"00000000", -- 00003D48 + X"00000000", -- 00003D4C + X"00000000", -- 00003D50 + X"00000000", -- 00003D54 + X"00000000", -- 00003D58 + X"00000000", -- 00003D5C + X"00000000", -- 00003D60 + X"00000000", -- 00003D64 + X"00000000", -- 00003D68 + X"00000000", -- 00003D6C + X"00000000", -- 00003D70 + X"00000000", -- 00003D74 + X"00000000", -- 00003D78 + X"00000000", -- 00003D7C + X"00000000", -- 00003D80 + X"00000000", -- 00003D84 + X"00000000", -- 00003D88 + X"00000000", -- 00003D8C + X"00000000", -- 00003D90 + X"00000000", -- 00003D94 + X"00000000", -- 00003D98 + X"00000000", -- 00003D9C + X"00000000", -- 00003DA0 + X"00000000", -- 00003DA4 + X"00000000", -- 00003DA8 + X"00000000", -- 00003DAC + X"00000000", -- 00003DB0 + X"00000000", -- 00003DB4 + X"00000000", -- 00003DB8 + X"00000000", -- 00003DBC + X"00000000", -- 00003DC0 + X"00000000", -- 00003DC4 + X"00000000", -- 00003DC8 + X"00000000", -- 00003DCC + X"00000000", -- 00003DD0 + X"00000000", -- 00003DD4 + X"00000000", -- 00003DD8 + X"00000000", -- 00003DDC + X"00000000", -- 00003DE0 + X"00000000", -- 00003DE4 + X"00000000", -- 00003DE8 + X"00000000", -- 00003DEC + X"00000000", -- 00003DF0 + X"00000000", -- 00003DF4 + X"00000000", -- 00003DF8 + X"00000000", -- 00003DFC + X"00000000", -- 00003E00 + X"00000000", -- 00003E04 + X"00000000", -- 00003E08 + X"00000000", -- 00003E0C + X"00000000", -- 00003E10 + X"00000000", -- 00003E14 + X"00000000", -- 00003E18 + X"00000000", -- 00003E1C + X"00000000", -- 00003E20 + X"00000000", -- 00003E24 + X"00000000", -- 00003E28 + X"00000000", -- 00003E2C + X"00000000", -- 00003E30 + X"00000000", -- 00003E34 + X"00000000", -- 00003E38 + X"00000000", -- 00003E3C + X"00000000", -- 00003E40 + X"00000000", -- 00003E44 + X"00000000", -- 00003E48 + X"00000000", -- 00003E4C + X"00000000", -- 00003E50 + X"00000000", -- 00003E54 + X"00000000", -- 00003E58 + X"00000000", -- 00003E5C + X"00000000", -- 00003E60 + X"00000000", -- 00003E64 + X"00000000", -- 00003E68 + X"00000000", -- 00003E6C + X"00000000", -- 00003E70 + X"00000000", -- 00003E74 + X"00000000", -- 00003E78 + X"00000000", -- 00003E7C + X"00000000", -- 00003E80 + X"00000000", -- 00003E84 + X"00000000", -- 00003E88 + X"00000000", -- 00003E8C + X"00000000", -- 00003E90 + X"00000000", -- 00003E94 + X"00000000", -- 00003E98 + X"00000000", -- 00003E9C + X"00000000", -- 00003EA0 + X"00000000", -- 00003EA4 + X"00000000", -- 00003EA8 + X"00000000", -- 00003EAC + X"00000000", -- 00003EB0 + X"00000000", -- 00003EB4 + X"00000000", -- 00003EB8 + X"00000000", -- 00003EBC + X"00000000", -- 00003EC0 + X"00000000", -- 00003EC4 + X"00000000", -- 00003EC8 + X"00000000", -- 00003ECC + X"00000000", -- 00003ED0 + X"00000000", -- 00003ED4 + X"00000000", -- 00003ED8 + X"00000000", -- 00003EDC + X"00000000", -- 00003EE0 + X"00000000", -- 00003EE4 + X"00000000", -- 00003EE8 + X"00000000", -- 00003EEC + X"00000000", -- 00003EF0 + X"00000000", -- 00003EF4 + X"00000000", -- 00003EF8 + X"00000000", -- 00003EFC + X"00000000", -- 00003F00 + X"00000000", -- 00003F04 + X"00000000", -- 00003F08 + X"00000000", -- 00003F0C + X"00000000", -- 00003F10 + X"00000000", -- 00003F14 + X"00000000", -- 00003F18 + X"00000000", -- 00003F1C + X"00000000", -- 00003F20 + X"00000000", -- 00003F24 + X"00000000", -- 00003F28 + X"00000000", -- 00003F2C + X"00000000", -- 00003F30 + X"00000000", -- 00003F34 + X"00000000", -- 00003F38 + X"00000000", -- 00003F3C + X"00000000", -- 00003F40 + X"00000000", -- 00003F44 + X"00000000", -- 00003F48 + X"00000000", -- 00003F4C + X"00000000", -- 00003F50 + X"00000000", -- 00003F54 + X"00000000", -- 00003F58 + X"00000000", -- 00003F5C + X"00000000", -- 00003F60 + X"00000000", -- 00003F64 + X"00000000", -- 00003F68 + X"00000000", -- 00003F6C + X"00000000", -- 00003F70 + X"00000000", -- 00003F74 + X"00000000", -- 00003F78 + X"00000000", -- 00003F7C + X"00000000", -- 00003F80 + X"00000000", -- 00003F84 + X"00000000", -- 00003F88 + X"00000000", -- 00003F8C + X"00000000", -- 00003F90 + X"00000000", -- 00003F94 + X"00000000", -- 00003F98 + X"00000000", -- 00003F9C + X"00000000", -- 00003FA0 + X"00000000", -- 00003FA4 + X"00000000", -- 00003FA8 + X"00000000", -- 00003FAC + X"00000000", -- 00003FB0 + X"00000000", -- 00003FB4 + X"00000000", -- 00003FB8 + X"00000000", -- 00003FBC + X"00000000", -- 00003FC0 + X"00000000", -- 00003FC4 + X"00000000", -- 00003FC8 + X"00000000", -- 00003FCC + X"00000000", -- 00003FD0 + X"00000000", -- 00003FD4 + X"00000000", -- 00003FD8 + X"00000000", -- 00003FDC + X"00000000", -- 00003FE0 + X"00000000", -- 00003FE4 + X"00000000", -- 00003FE8 + X"00000000", -- 00003FEC + X"00000000", -- 00003FF0 + X"00000000", -- 00003FF4 + X"00000000", -- 00003FF8 + X"00000000" -- 00003FFC + ); + +begin + +PROM_READ: + process(clk) + begin + if rising_edge(clk) and ce = '1' then + dout <= word_array(to_integer(addr(13 downto 2))); + end if; + end process; + + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto jtag_ld_dout'length); + jtag_ld_din <= user_regi(jtag_ld_dout'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto jtag_ld_dout'length => '0') & jtag_ld_dout; + + end if; + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + word_array(to_integer(jtag_ld_addr(11 downto 0))) <= jtag_ld_din; + else + jtag_ld_dout <= word_array(to_integer(jtag_ld_addr(11 downto 0))); + end if; + end if; + end process; + +end data; diff --git a/lib/CPUs/MIPS/src/tb_eval_muldiv.vhd b/lib/CPUs/MIPS/src/tb_eval_muldiv.vhd new file mode 100644 index 0000000..e4bbef2 --- /dev/null +++ b/lib/CPUs/MIPS/src/tb_eval_muldiv.vhd @@ -0,0 +1,156 @@ +------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: Testbench for JCPU +-- also writes 'opc.lst' for JASM-assembler +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; +use std.textio.all; -- Imports the standard textio package. + +library work; +use work.mips_types.all; +use work.mips_instr.all; + +ENTITY tb_eval_muldiv IS +END tb_eval_muldiv; + +ARCHITECTURE behavior OF tb_eval_muldiv IS + + constant CLK_PERIOD : time := 10 ns; + signal rst : std_logic := '1'; + signal clk : std_logic := '1'; + signal ce : std_logic := '0'; + signal mul_divn : std_logic := '1'; + signal op_valid : std_logic := '0'; + signal op1_in : word_t := (others => '-'); + signal op2_in : word_t := (others => '-'); + signal result : unsigned (2*word_t'length-1 downto 0); + signal res_valid : std_logic; + signal busy : std_logic; + signal result_reg : unsigned (2*word_t'length-1 downto 0); + subtype pp_t is unsigned (39 downto 0); + + signal pp0, pp1, pp2, pp3 : pp_t; + + signal signed_mul : std_logic := '1'; + signal sign1 : std_logic; + signal sign2 : std_logic; + signal cy : std_logic; + +BEGIN + + sign1 <= signed_mul and op1_in(op1_in'left); + sign2 <= signed_mul and op2_in(op1_in'left); + cy <= sign1; + + pp0 <= op1_in * op2_in(7 downto 0); + pp1 <= op1_in * op2_in(15 downto 8); + pp2 <= op1_in * op2_in(23 downto 16); + pp3 <= op1_in * op2_in(31 downto 24); + + result <= ((63 downto 40 => '0') & pp0) + + ((63 downto 48 => '0') & pp1 & (7 downto 0 => '0')) + + ((63 downto 56 => '0') & pp2 & (15 downto 0 => '0')) + + (pp3 & (23 downto 0 => '0')); + + result_reg <= (63 downto 0 => sign1) xor (result + ((63 downto 0 => sign1) and X"0000_0000_0000_0000")); + +CLK_GEN: process + begin + wait for CLK_PERIOD/2; + clk <= not clk; + end process; + +STIMULUS: process + + begin + + wait for 3*CLK_PERIOD; + wait until rising_edge(clk); + rst <= '0'; + wait for 10*CLK_PERIOD; + + wait until rising_edge(clk); + ce <= '1'; + + wait for 10*CLK_PERIOD; + op1_in <= X"FFFF_FFFA"; -- (-6) + op2_in <= X"0000_0005"; -- (+5) + op_valid <= '1'; + wait until rising_edge(clk); + op_valid <= '0'; + + wait for 10*CLK_PERIOD; + op1_in <= X"0000_0006"; -- (+6) + op2_in <= X"FFFF_FFFB"; -- (-5) + op_valid <= '1'; + wait until rising_edge(clk); + op_valid <= '0'; + + wait for 10*CLK_PERIOD; + op1_in <= X"1234_5678"; + op2_in <= X"8765_4321"; + op_valid <= '1'; + wait until rising_edge(clk); + op_valid <= '0'; + + wait for 10*CLK_PERIOD; + op1_in <= X"8765_4321"; + op2_in <= X"1234_5678"; + op_valid <= '1'; + wait until rising_edge(clk); + op_valid <= '0'; + + wait for 10*CLK_PERIOD; + op1_in <= X"1234_5678"; + op2_in <= X"1234_5678"; + op_valid <= '1'; + wait until rising_edge(clk); + op_valid <= '0'; + + wait for 10*CLK_PERIOD; + op1_in <= X"8765_4321"; + op2_in <= X"8765_4321"; + op_valid <= '1'; + wait until rising_edge(clk); + op_valid <= '0'; + + wait for 10*CLK_PERIOD; + op1_in <= X"789A_BCDE"; + op2_in <= X"8765_4321"; + op_valid <= '1'; + wait until rising_edge(clk); + op_valid <= '0'; + + wait for 10*CLK_PERIOD; + op1_in <= X"8765_4321"; + op2_in <= X"789A_BCDE"; + op_valid <= '1'; + wait until rising_edge(clk); + op_valid <= '0'; + + wait; + + end process; + +END; diff --git a/lib/CPUs/MIPS/src/tb_mips_embedded.vhd b/lib/CPUs/MIPS/src/tb_mips_embedded.vhd new file mode 100644 index 0000000..cbae0b7 --- /dev/null +++ b/lib/CPUs/MIPS/src/tb_mips_embedded.vhd @@ -0,0 +1,82 @@ +------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: Testbench for JCPU +-- also writes 'opc.lst' for JASM-assembler +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; +use std.textio.all; -- Imports the standard textio package. + +library work; +use work.mips_types.all; + +ENTITY tb_mips_embedded IS +END tb_mips_embedded; + +ARCHITECTURE behavior OF tb_mips_embedded IS + + COMPONENT mips_embedded + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + halt : in STD_LOGIC; + dout : out word_t + ); + END COMPONENT; + + constant CLK_PERIOD : time := 10 ns; + + signal rst : std_logic := '1'; + signal clk : std_logic := '1'; + signal halt : std_logic := '0'; + signal dout : word_t; + +BEGIN + +uut: mips_embedded + PORT MAP( + rst => rst, + clk => clk, + halt => halt, + dout => dout + ); + +CLK_GEN: process + begin + wait for CLK_PERIOD/2; + clk <= not clk; + end process; + +STIMULUS: process + begin + + wait for 3*CLK_PERIOD; + wait until rising_edge(clk); + rst <= '0'; + + wait; + + end process; + +END; diff --git a/lib/CPUs/MIPS/src/tb_mips_embedded_syn.vhd b/lib/CPUs/MIPS/src/tb_mips_embedded_syn.vhd new file mode 100644 index 0000000..ac471b4 --- /dev/null +++ b/lib/CPUs/MIPS/src/tb_mips_embedded_syn.vhd @@ -0,0 +1,123 @@ +------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: Testbench for JCPU +-- also writes 'opc.lst' for JASM-assembler +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; +use std.textio.all; -- Imports the standard textio package. + +ENTITY tb_mips_embedded_syn IS +END tb_mips_embedded_syn; + +ARCHITECTURE behavior OF tb_mips_embedded_syn IS + + COMPONENT mips_embedded_syn + Port + ( + sys_rst_n_in : in STD_LOGIC; + sys_clk_in : in STD_LOGIC; + sys_dip : in STD_LOGIC_VECTOR (7 downto 0); + sys_btn : in STD_LOGIC_VECTOR (8 downto 0); + sys_led : out STD_LOGIC_VECTOR (7 downto 0); + sys_rx : in STD_LOGIC; + sys_tx : out STD_LOGIC; + sys_error : out STD_LOGIC_VECTOR (1 downto 0) + ); + END COMPONENT; + + constant CLK_PERIOD : time := 10.0 ns; + + signal sys_rst_n_in : std_logic := '0'; + signal sys_clk_in : std_logic := '1'; + signal sys_led : STD_LOGIC_VECTOR (7 downto 0); + signal sys_btn : STD_LOGIC_VECTOR (8 downto 0) := "000000000"; + signal sys_dip : STD_LOGIC_VECTOR (7 downto 0) := "10001001"; + signal sys_error : STD_LOGIC_VECTOR (1 downto 0); + signal sys_rx : std_logic := '1'; + signal sys_tx : std_logic; + +BEGIN + +uut: mips_embedded_syn + PORT MAP + ( + sys_rst_n_in => sys_rst_n_in, + sys_clk_in => sys_clk_in, + sys_btn => sys_btn, + sys_dip => sys_dip, + sys_led => sys_led, + sys_rx => sys_rx, + sys_tx => sys_tx, + sys_error => sys_error + ); + +CLK_GEN: process + begin + wait for CLK_PERIOD/2; + sys_clk_in <= not sys_clk_in; + end process; + +STIMULUS1: process + begin + + wait for 3*CLK_PERIOD; + wait until rising_edge(sys_clk_in); + sys_rst_n_in <= '1'; + + + +-- wait for 9994999*CLK_PERIOD; +-- for i in 1 to 10000 loop +-- wait for 100*CLK_PERIOD; +-- sys_btn(3) <= '1'; +-- wait for 10*CLK_PERIOD; +-- sys_btn(3) <= '0'; +-- end loop; + + wait until rising_edge(sys_clk_in) and now = 38980 ns; + sys_btn <= "000001000"; + wait until rising_edge(sys_clk_in); + sys_btn <= "000000000"; + + wait; + + end process; + +STIMULUS2: process + begin + + + wait for 9999999*CLK_PERIOD; + for i in 1 to 10000 loop + wait for 137*CLK_PERIOD; + sys_btn(4) <= '1'; + wait for 21*CLK_PERIOD; + sys_btn(4) <= '0'; + end loop; + + wait; + + end process; + +END; diff --git a/lib/CPUs/MIPS/src/tb_mips_muldiv.vhd b/lib/CPUs/MIPS/src/tb_mips_muldiv.vhd new file mode 100644 index 0000000..8235438 --- /dev/null +++ b/lib/CPUs/MIPS/src/tb_mips_muldiv.vhd @@ -0,0 +1,308 @@ +------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: Testbench for JCPU +-- also writes 'opc.lst' for JASM-assembler +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library work; +use work.mips_types.all; +use work.mips_instr.all; + +ENTITY tb_mips_muldiv IS +END tb_mips_muldiv; + +ARCHITECTURE behavior OF tb_mips_muldiv IS + + COMPONENT muldiv is + Port + ( + rst : in std_logic; + clk : in std_logic; + hilo_we : in std_logic; + din_hi : in word_t; + din_lo : in word_t; + mul_divn : in std_logic; + s_un : in std_logic; + start : in std_logic; + hilo_sel : in std_logic; + busy : out std_logic; + dout : out word_t + ); + END COMPONENT; + + constant CLK_PERIOD : time := 10 ns; + signal ENABLE_FAIL_REPORT : boolean := true; + signal rst : std_logic := '1'; + signal clk : std_logic := '1'; + signal busy : std_logic; + signal mul_divn : std_logic := '0'; + signal s_un : std_logic := '1'; + signal hilo_we : std_logic := '0'; + signal start : std_logic := '0'; + signal din_hi : word_t := (others => '-'); + signal din_lo : word_t := (others => '-'); + signal ref_hi : word_t := (others => '-'); + signal ref_lo : word_t := (others => '-'); + signal dout : word_t; + signal hilo_sel : std_logic := '0'; + signal result : unsigned (2*word_t'length-1 downto 0); + signal ref_result : unsigned (2*word_t'length-1 downto 0); + + type word_array_t is array (natural range <>) of word_t; + + constant operands : word_array_t(0 to 63) := + ( + X"00000000", + X"00000001", + X"00000010", + X"00000100", + X"00001000", + X"00010000", + X"00100000", + X"01000000", + X"10000000", + X"0000000F", + X"000000FF", + X"00000FFF", + X"0000FFFF", + X"000FFFFF", + X"00FFFFFF", + X"0FFFFFFF", + X"12345678", + X"23456789", + X"7FFFFFFF", + X"80000000", + X"A541B3B9", + X"80000001", + X"80000010", + X"80000100", + X"80001000", + X"80010000", + X"80100000", + X"81000000", + X"87654321", + X"98765432", + X"FFFFFFFF", + X"FFFFFFFE", + X"FFFFFFFD", + X"FFFFFFFB", + X"FFFFFFF7", + X"FFFFFFEF", + X"FFFFFFDF", + X"FFFFFFBF", + X"FFFFFF7F", + X"FFFFFEFF", + X"FFFFFDFF", + X"FFFFFBFF", + X"FFFFF7FF", + X"FFFFEFFF", + X"FFFFDFFF", + X"FFFFBFFF", + X"FFFF7FFF", + X"FFFEFFFF", + X"FFFDFFFF", + X"FFFBFFFF", + X"FFF7FFFF", + X"FFEFFFFF", + X"FFDFFFFF", + X"FFBFFFFF", + X"FF7FFFFF", + X"FEFFFFFF", + X"FDFFFFFF", + X"FBFFFFFF", + X"F7FFFFFF", + X"EFFFFFFF", + X"DFFFFFFF", + X"BFFFFFFF", + X"CFFFFFFF", + X"7FFFFFFF" + ); + +BEGIN + +uut: muldiv + PORT MAP( + rst => rst, + clk => clk, + hilo_we => hilo_we, + din_hi => din_hi, + din_lo => din_lo, + mul_divn => mul_divn, + s_un => s_un, + start => start, + hilo_sel => hilo_sel, + busy => busy, + dout => dout + ); + +CLK_GEN: process + begin + wait for CLK_PERIOD/2; + clk <= not clk; + end process; + +REF_GEN: process + variable tmp : unsigned (2*word_t'length-1 downto 0); + variable tmp2 : unsigned (word_t'length-1 downto 0); + begin + if mul_divn = '0' then + wait until rising_edge(clk) and start = '1'; + ref_lo <= din_lo; + ref_hi <= din_hi; + wait until rising_edge(clk) and busy = '0'; + wait until rising_edge(clk); + wait until rising_edge(clk); + if s_un = '1' then + tmp := unsigned(signed(result(31 downto 0)) * signed(ref_lo)); + tmp2 := unsigned(signed(tmp(31 downto 0)) + signed(result(63 downto 32))); + ref_result <= X"00000000" & tmp2(31 downto 0); + else + tmp := result(31 downto 0) * ref_lo; + tmp2 := tmp(31 downto 0) + result(63 downto 32); + ref_result <= X"00000000" & tmp2(31 downto 0); + end if; + wait until rising_edge(clk); + + if ref_lo /= X"00000000" then + if ENABLE_FAIL_REPORT then + assert ref_hi = ref_result(31 downto 0) report "Error on divison" severity failure; + end if; + end if; + else + wait until rising_edge(clk) and start = '1'; + wait until rising_edge(clk) and busy = '0'; + if s_un = '1' then + ref_result <= unsigned(signed(din_hi) * signed(din_lo)); + else + ref_result <= unsigned(din_hi) * unsigned(din_lo); + end if; + wait until rising_edge(clk); + wait until rising_edge(clk); + wait until rising_edge(clk); + if ENABLE_FAIL_REPORT then + assert ref_result = result report "Error on multiplication" severity failure; + end if; + end if; + + end process; + +STIMULUS: process + + begin + + wait for 3*CLK_PERIOD; + wait until rising_edge(clk); + rst <= '0'; + wait for 2*CLK_PERIOD; + + mul_divn <= '0'; + s_un <= '0'; + for i in 0 to operands'length-1 loop + for j in 0 to operands'length-1 loop + wait until rising_edge(clk) and busy = '0'; + din_hi <= operands(i); + din_lo <= operands(j); + start <= '1'; + wait until rising_edge(clk); + start <= '0'; + hilo_sel <= '0'; + + -- Read result + wait until rising_edge(clk) and busy = '0'; + result(31 downto 0) <= dout; + hilo_sel <= '1'; + wait until rising_edge(clk); + result(63 downto 32) <= dout; + wait for 2*CLK_PERIOD; + end loop; + end loop; + + s_un <= '1'; + for i in 0 to operands'length-1 loop + for j in 0 to operands'length-1 loop + wait until rising_edge(clk) and busy = '0'; + din_hi <= operands(i); + din_lo <= operands(j); + start <= '1'; + wait until rising_edge(clk); + start <= '0'; + hilo_sel <= '0'; + + -- Read result + wait until rising_edge(clk) and busy = '0'; + result(31 downto 0) <= dout; + hilo_sel <= '1'; + wait until rising_edge(clk); + result(63 downto 32) <= dout; + wait for 2*CLK_PERIOD; + end loop; + end loop; + + mul_divn <= '1'; + s_un <= '0'; + for i in 0 to operands'length-1 loop + for j in 0 to operands'length-1 loop + wait until rising_edge(clk) and busy = '0'; + din_hi <= operands(i); + din_lo <= operands(j); + start <= '1'; + wait until rising_edge(clk); + start <= '0'; + hilo_sel <= '0'; + + -- Read result + wait until rising_edge(clk) and busy = '0'; + result(31 downto 0) <= dout; + hilo_sel <= '1'; + wait until rising_edge(clk); + result(63 downto 32) <= dout; + end loop; + end loop; + + s_un <= '1'; + for i in 0 to operands'length-1 loop + for j in 0 to operands'length-1 loop + wait until rising_edge(clk) and busy = '0'; + din_hi <= operands(i); + din_lo <= operands(j); + start <= '1'; + wait until rising_edge(clk); + start <= '0'; + hilo_sel <= '0'; + + -- Read result + wait until rising_edge(clk) and busy = '0'; + result(31 downto 0) <= dout; + hilo_sel <= '1'; + wait until rising_edge(clk); + result(63 downto 32) <= dout; + end loop; + end loop; + + wait; + + end process; + +END; diff --git a/lib/CPUs/MIPS/src/tb_mips_top.vhd b/lib/CPUs/MIPS/src/tb_mips_top.vhd new file mode 100644 index 0000000..0bf5fed --- /dev/null +++ b/lib/CPUs/MIPS/src/tb_mips_top.vhd @@ -0,0 +1,174 @@ +------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: Testbench for JCPU +-- also writes 'opc.lst' for JASM-assembler +-- +-- Copyright (C) 2007 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; +use std.textio.all; -- Imports the standard textio package. + +library work; +use work.mips_types.all; +use work.mips_instr.all; + +ENTITY tb_mips_top IS +END tb_mips_top; + +ARCHITECTURE behavior OF tb_mips_top IS + + COMPONENT mips_top + Port + ( + rst : in STD_LOGIC; + clk : in STD_LOGIC; + halt : in STD_LOGIC; + imem_din : in unsigned (WORD_WIDTH-1 downto 0); + imem_addr : out unsigned (WORD_WIDTH-1 downto 0); + dmem_we : out STD_LOGIC; + dmem_re : out STD_LOGIC; + dmem_din : in unsigned (WORD_WIDTH-1 downto 0); + dmem_dout : out unsigned (WORD_WIDTH-1 downto 0); + dmem_addr : out unsigned (WORD_WIDTH-1 downto 0) + + ); + END COMPONENT; + + COMPONENT rom + Port + ( + clk : in STD_LOGIC; + addr : in word_t; + dout : out word_t + ); + END COMPONENT; + + COMPONENT ram + Generic + ( + word_addr_width : integer + ); + Port + ( + clk : in STD_LOGIC; + we : in STD_LOGIC; + addr : in word_t; + din : in word_t; + dout : out word_t + ); + END COMPONENT; + + constant CLK_PERIOD : time := 10 ns; + + signal rst : std_logic := '1'; + signal clk : std_logic := '1'; + signal cpu_halt : std_logic; + signal irom_data : word_t := (others => '-'); + signal irom_addr : word_t; + signal dmem_din : word_t := (others => '-'); + signal dmem_dout : word_t; + signal dmem_addr : word_t; + signal dmem_we : std_logic; + signal dmem_re : std_logic; + +BEGIN + +uut: mips_top + PORT MAP( + rst => rst, + clk => clk, + halt => cpu_halt, + imem_din => irom_data, + imem_addr => irom_addr, + dmem_we => dmem_we, + dmem_re => dmem_re, + dmem_din => dmem_din, + dmem_dout => dmem_dout, + dmem_addr => dmem_addr + ); + +inst_rom: rom + PORT MAP + ( + clk => clk, + addr => irom_addr, + dout => irom_data + ); + +inst_ram: ram + GENERIC MAP + ( + word_addr_width => 6 + ) + PORT MAP + ( + clk => clk, + we => dmem_we, + addr => dmem_addr, + din => dmem_dout, + dout => dmem_din + ); + +CLK_GEN: process + begin + wait for CLK_PERIOD/2; + clk <= not clk; + end process; + +HLT_GEN: + process(rst, clk) + subtype cnt_t is natural range 0 to 2; + variable cnt : cnt_t; + begin + if rst = '1' then + cnt := cnt_t'high; + cpu_halt <= '0'; + elsif rising_edge(clk) then + cpu_halt <= '0'; + if cnt /= 0 then + cnt := cnt - 1; + else + cnt := cnt_t'high; + cpu_halt <= '1'; + end if; + end if; + end process; + +STIMULUS: process + + begin + +-- for i in 0 to instr_name_array'length-1 loop +-- fprint(RESULT, L,"%d %s\n", fo(i), instr_name_array(i)); +-- end loop; + + wait for 3*CLK_PERIOD; + wait until rising_edge(clk); + rst <= '0'; + wait for 2*CLK_PERIOD; + +-- assert false report "Test finished" severity error; + wait; + + end process; + +END; diff --git a/lib/CPUs/MIPS/src/testbench.ROM_ld.vhd b/lib/CPUs/MIPS/src/testbench.ROM_ld.vhd new file mode 100644 index 0000000..f46253b --- /dev/null +++ b/lib/CPUs/MIPS/src/testbench.ROM_ld.vhd @@ -0,0 +1,4222 @@ +LIBRARY IEEE; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +ENTITY icache IS + Port + ( + clk : in STD_LOGIC; + ce : in STD_LOGIC; + addr : in unsigned(31 downto 0); + dout : out unsigned(31 downto 0) + ); +END icache; + +ARCHITECTURE data OF icache IS + + subtype word_t is unsigned(31 downto 0); + type word_array_t is array (0 to 4095) of word_t; + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : unsigned (15 downto 0); + signal jtag_ld_dout : unsigned (31 downto 0); + signal jtag_ld_din : unsigned (31 downto 0); + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (47 downto 0); + + signal word_array : word_array_t := + ( + + X"3C1A1040", -- 00000000 + X"375A040C", -- 00000004 + X"409A6000", -- 00000008 + X"241A0000", -- 0000000C + X"409A6800", -- 00000010 + X"401A7800", -- 00000014 + X"00000000", -- 00000018 + X"409AF800", -- 0000001C + X"3C1A0040", -- 00000020 + X"275A04F4", -- 00000024 + X"03400008", -- 00000028 + X"42000010", -- 0000002C + X"00000000", -- 00000030 + X"00000000", -- 00000034 + X"00000000", -- 00000038 + X"00000000", -- 0000003C + X"00000000", -- 00000040 + X"00000000", -- 00000044 + X"00000000", -- 00000048 + X"00000000", -- 0000004C + X"00000000", -- 00000050 + X"00000000", -- 00000054 + X"00000000", -- 00000058 + X"00000000", -- 0000005C + X"00000000", -- 00000060 + X"00000000", -- 00000064 + X"00000000", -- 00000068 + X"00000000", -- 0000006C + X"00000000", -- 00000070 + X"00000000", -- 00000074 + X"00000000", -- 00000078 + X"00000000", -- 0000007C + X"00000000", -- 00000080 + X"00000000", -- 00000084 + X"00000000", -- 00000088 + X"00000000", -- 0000008C + X"00000000", -- 00000090 + X"00000000", -- 00000094 + X"00000000", -- 00000098 + X"00000000", -- 0000009C + X"00000000", -- 000000A0 + X"00000000", -- 000000A4 + X"00000000", -- 000000A8 + X"00000000", -- 000000AC + X"00000000", -- 000000B0 + X"00000000", -- 000000B4 + X"00000000", -- 000000B8 + X"00000000", -- 000000BC + X"00000000", -- 000000C0 + X"00000000", -- 000000C4 + X"00000000", -- 000000C8 + X"00000000", -- 000000CC + X"00000000", -- 000000D0 + X"00000000", -- 000000D4 + X"00000000", -- 000000D8 + X"00000000", -- 000000DC + X"00000000", -- 000000E0 + X"00000000", -- 000000E4 + X"00000000", -- 000000E8 + X"00000000", -- 000000EC + X"00000000", -- 000000F0 + X"00000000", -- 000000F4 + X"00000000", -- 000000F8 + X"00000000", -- 000000FC + X"00000000", -- 00000100 + X"00000000", -- 00000104 + X"00000000", -- 00000108 + X"00000000", -- 0000010C + X"00000000", -- 00000110 + X"00000000", -- 00000114 + X"00000000", -- 00000118 + X"00000000", -- 0000011C + X"00000000", -- 00000120 + X"00000000", -- 00000124 + X"00000000", -- 00000128 + X"00000000", -- 0000012C + X"00000000", -- 00000130 + X"00000000", -- 00000134 + X"00000000", -- 00000138 + X"00000000", -- 0000013C + X"00000000", -- 00000140 + X"00000000", -- 00000144 + X"00000000", -- 00000148 + X"00000000", -- 0000014C + X"00000000", -- 00000150 + X"00000000", -- 00000154 + X"00000000", -- 00000158 + X"00000000", -- 0000015C + X"00000000", -- 00000160 + X"00000000", -- 00000164 + X"00000000", -- 00000168 + X"00000000", -- 0000016C + X"00000000", -- 00000170 + X"00000000", -- 00000174 + X"00000000", -- 00000178 + X"00000000", -- 0000017C + X"3C010000", -- 00000180 + X"AC3D09A0", -- 00000184 + X"3C1D0000", -- 00000188 + X"27BD09A0", -- 0000018C + X"27BD0004", -- 00000190 + X"AFA80000", -- 00000194 + X"27BD0004", -- 00000198 + X"AFA90000", -- 0000019C + X"27BD0004", -- 000001A0 + X"AFAA0000", -- 000001A4 + X"27BD0004", -- 000001A8 + X"AFAB0000", -- 000001AC + X"27BD0004", -- 000001B0 + X"AFAC0000", -- 000001B4 + X"27BD0004", -- 000001B8 + X"AFBF0000", -- 000001BC + X"400A4000", -- 000001C0 + X"27BD0004", -- 000001C4 + X"AFAA0000", -- 000001C8 + X"400A6000", -- 000001CC + X"27BD0004", -- 000001D0 + X"AFAA0000", -- 000001D4 + X"400A6800", -- 000001D8 + X"27BD0004", -- 000001DC + X"AFAA0000", -- 000001E0 + X"000A5742", -- 000001E4 + X"314B0004", -- 000001E8 + X"400A7000", -- 000001EC + X"27BD0004", -- 000001F0 + X"AFAA0000", -- 000001F4 + X"014B5021", -- 000001F8 + X"27BD0004", -- 000001FC + X"AFAA0000", -- 00000200 + X"3C1A8000", -- 00000204 + X"275A0009", -- 00000208 + X"241B000D", -- 0000020C + X"A35B0000", -- 00000210 + X"3C0B0000", -- 00000214 + X"256B0ADE", -- 00000218 + X"0C10012B", -- 0000021C + X"00000000", -- 00000220 + X"3C0B0000", -- 00000224 + X"256B0AA0", -- 00000228 + X"0C10012B", -- 0000022C + X"00000000", -- 00000230 + X"8FAA0000", -- 00000234 + X"27BDFFFC", -- 00000238 + X"0C1000E3", -- 0000023C + X"00000000", -- 00000240 + X"3C0B0000", -- 00000244 + X"256B0ADE", -- 00000248 + X"0C10012B", -- 0000024C + X"00000000", -- 00000250 + X"3C0B0000", -- 00000254 + X"256B0AAE", -- 00000258 + X"0C10012B", -- 0000025C + X"00000000", -- 00000260 + X"8FAA0000", -- 00000264 + X"27BDFFFC", -- 00000268 + X"0C1000E3", -- 0000026C + X"00000000", -- 00000270 + X"3C0B0000", -- 00000274 + X"256B0ADE", -- 00000278 + X"0C10012B", -- 0000027C + X"00000000", -- 00000280 + X"3C0B0000", -- 00000284 + X"256B0ABA", -- 00000288 + X"0C10012B", -- 0000028C + X"00000000", -- 00000290 + X"8FAA0000", -- 00000294 + X"27BDFFFC", -- 00000298 + X"0C1000E3", -- 0000029C + X"00000000", -- 000002A0 + X"3C0B0000", -- 000002A4 + X"256B0ADE", -- 000002A8 + X"0C10012B", -- 000002AC + X"00000000", -- 000002B0 + X"3C0B0000", -- 000002B4 + X"256B0AC6", -- 000002B8 + X"0C10012B", -- 000002BC + X"00000000", -- 000002C0 + X"8FAA0000", -- 000002C4 + X"27BDFFFC", -- 000002C8 + X"0C1000E3", -- 000002CC + X"00000000", -- 000002D0 + X"3C0B0000", -- 000002D4 + X"256B0ADE", -- 000002D8 + X"0C10012B", -- 000002DC + X"00000000", -- 000002E0 + X"3C0B0000", -- 000002E4 + X"256B0AD2", -- 000002E8 + X"0C10012B", -- 000002EC + X"00000000", -- 000002F0 + X"8FAA0000", -- 000002F4 + X"27BDFFFC", -- 000002F8 + X"0C1000E3", -- 000002FC + X"00000000", -- 00000300 + X"3C0B0000", -- 00000304 + X"256B0ADE", -- 00000308 + X"0C10012B", -- 0000030C + X"00000000", -- 00000310 + X"401A6800", -- 00000314 + X"3C1B8000", -- 00000318 + X"277B0000", -- 0000031C + X"001AD082", -- 00000320 + X"335A000F", -- 00000324 + X"035BD025", -- 00000328 + X"AF7A0000", -- 0000032C + X"401A6800", -- 00000330 + X"00000000", -- 00000334 + X"001AD202", -- 00000338 + X"335A00FF", -- 0000033C + X"1740FFFB", -- 00000340 + X"00000000", -- 00000344 + X"401A7000", -- 00000348 + X"8FBF0000", -- 0000034C + X"27BDFFFC", -- 00000350 + X"8FAC0000", -- 00000354 + X"27BDFFFC", -- 00000358 + X"8FAB0000", -- 0000035C + X"27BDFFFC", -- 00000360 + X"8FAA0000", -- 00000364 + X"27BDFFFC", -- 00000368 + X"8FA90000", -- 0000036C + X"27BDFFFC", -- 00000370 + X"8FA80000", -- 00000374 + X"27BDFFFC", -- 00000378 + X"3C1D0000", -- 0000037C + X"8FBD09A0", -- 00000380 + X"03400008", -- 00000384 + X"42000010", -- 00000388 + X"27BD0004", -- 0000038C + X"AFBF0000", -- 00000390 + X"27BD0004", -- 00000394 + X"AFAA0000", -- 00000398 + X"000A5402", -- 0000039C + X"0C1000F2", -- 000003A0 + X"00000000", -- 000003A4 + X"8FAA0000", -- 000003A8 + X"27BDFFFC", -- 000003AC + X"0C1000F2", -- 000003B0 + X"00000000", -- 000003B4 + X"8FBF0000", -- 000003B8 + X"27BDFFFC", -- 000003BC + X"03E00008", -- 000003C0 + X"00000000", -- 000003C4 + X"27BD0004", -- 000003C8 + X"AFBF0000", -- 000003CC + X"27BD0004", -- 000003D0 + X"AFAA0000", -- 000003D4 + X"000A5202", -- 000003D8 + X"0C100101", -- 000003DC + X"00000000", -- 000003E0 + X"8FAA0000", -- 000003E4 + X"27BDFFFC", -- 000003E8 + X"0C100101", -- 000003EC + X"00000000", -- 000003F0 + X"8FBF0000", -- 000003F4 + X"27BDFFFC", -- 000003F8 + X"03E00008", -- 000003FC + X"00000000", -- 00000400 + X"27BD0004", -- 00000404 + X"AFBF0000", -- 00000408 + X"27BD0004", -- 0000040C + X"AFAA0000", -- 00000410 + X"000A5102", -- 00000414 + X"0C100110", -- 00000418 + X"00000000", -- 0000041C + X"8FAA0000", -- 00000420 + X"27BDFFFC", -- 00000424 + X"0C100110", -- 00000428 + X"00000000", -- 0000042C + X"8FBF0000", -- 00000430 + X"27BDFFFC", -- 00000434 + X"03E00008", -- 00000438 + X"00000000", -- 0000043C + X"27BD0004", -- 00000440 + X"AFBF0000", -- 00000444 + X"27BD0004", -- 00000448 + X"AFAA0000", -- 0000044C + X"3C0C0000", -- 00000450 + X"258C0AE1", -- 00000454 + X"314A000F", -- 00000458 + X"018A6021", -- 0000045C + X"918A0000", -- 00000460 + X"0C100121", -- 00000464 + X"00000000", -- 00000468 + X"8FAA0000", -- 0000046C + X"27BDFFFC", -- 00000470 + X"8FBF0000", -- 00000474 + X"27BDFFFC", -- 00000478 + X"03E00008", -- 0000047C + X"00000000", -- 00000480 + X"3C088000", -- 00000484 + X"25080008", -- 00000488 + X"91080000", -- 0000048C + X"3C098000", -- 00000490 + X"25290004", -- 00000494 + X"31080002", -- 00000498 + X"1500FFF9", -- 0000049C + X"00000000", -- 000004A0 + X"03E00008", -- 000004A4 + X"A12A0000", -- 000004A8 + X"27BD0004", -- 000004AC + X"AFAB0000", -- 000004B0 + X"27BD0004", -- 000004B4 + X"AFBF0000", -- 000004B8 + X"916A0000", -- 000004BC + X"256B0001", -- 000004C0 + X"19400005", -- 000004C4 + X"00000000", -- 000004C8 + X"0C100121", -- 000004CC + X"00000000", -- 000004D0 + X"0810012F", -- 000004D4 + X"00000000", -- 000004D8 + X"8FBF0000", -- 000004DC + X"27BDFFFC", -- 000004E0 + X"8FAB0000", -- 000004E4 + X"27BDFFFC", -- 000004E8 + X"03E00008", -- 000004EC + X"00000000", -- 000004F0 + X"3C1A8000", -- 000004F4 + X"275A0009", -- 000004F8 + X"241B000D", -- 000004FC + X"A35B0000", -- 00000500 + X"3C1D8000", -- 00000504 + X"27BDEFFC", -- 00000508 + X"3C1A0040", -- 0000050C + X"275A0D90", -- 00000510 + X"0340F809", -- 00000514 + X"00000000", -- 00000518 + X"08100146", -- 0000051C + X"00000000", -- 00000520 + X"3C028000", -- 00000524 + X"34440004", -- 00000528 + X"34430008", -- 0000052C + X"90620000", -- 00000530 + X"00000000", -- 00000534 + X"30420010", -- 00000538 + X"1040FFFC", -- 0000053C + X"00000000", -- 00000540 + X"90820000", -- 00000544 + X"00000000", -- 00000548 + X"00021600", -- 0000054C + X"03E00008", -- 00000550 + X"00021603", -- 00000554 + X"3C028000", -- 00000558 + X"00042600", -- 0000055C + X"00042603", -- 00000560 + X"34450004", -- 00000564 + X"34430008", -- 00000568 + X"90620000", -- 0000056C + X"00000000", -- 00000570 + X"30420002", -- 00000574 + X"1440FFFC", -- 00000578 + X"00000000", -- 0000057C + X"03E00008", -- 00000580 + X"A0A40000", -- 00000584 + X"3C028000", -- 00000588 + X"34420014", -- 0000058C + X"8C420000", -- 00000590 + X"10800005", -- 00000594 + X"00000000", -- 00000598 + X"AC80000C", -- 0000059C + X"AC820000", -- 000005A0 + X"AC800004", -- 000005A4 + X"AC800008", -- 000005A8 + X"03E00008", -- 000005AC + X"00000000", -- 000005B0 + X"3C028000", -- 000005B4 + X"34450014", -- 000005B8 + X"10800007", -- 000005BC + X"34430010", -- 000005C0 + X"8CA20000", -- 000005C4 + X"00000000", -- 000005C8 + X"AC820000", -- 000005CC + X"8C630000", -- 000005D0 + X"00000000", -- 000005D4 + X"AC830004", -- 000005D8 + X"03E00008", -- 000005DC + X"00001021", -- 000005E0 + X"27BDFFD8", -- 000005E4 + X"AFB20020", -- 000005E8 + X"AFB1001C", -- 000005EC + X"AFB00018", -- 000005F0 + X"AFBF0024", -- 000005F4 + X"8C850004", -- 000005F8 + X"3C06000F", -- 000005FC + X"00808021", -- 00000600 + X"3C028000", -- 00000604 + X"34C64240", -- 00000608 + X"27A40010", -- 0000060C + X"34520014", -- 00000610 + X"0C1003B1", -- 00000614 + X"34510010", -- 00000618 + X"12000009", -- 0000061C + X"00000000", -- 00000620 + X"8FA20014", -- 00000624 + X"00000000", -- 00000628 + X"AE220000", -- 0000062C + X"8E030000", -- 00000630 + X"8FA20010", -- 00000634 + X"00000000", -- 00000638 + X"00621821", -- 0000063C + X"AE430000", -- 00000640 + X"8FBF0024", -- 00000644 + X"8FB20020", -- 00000648 + X"8FB1001C", -- 0000064C + X"8FB00018", -- 00000650 + X"00001021", -- 00000654 + X"03E00008", -- 00000658 + X"27BD0028", -- 0000065C + X"8F820988", -- 00000660 + X"00000000", -- 00000664 + X"14400004", -- 00000668 + X"00441821", -- 0000066C + X"3C028000", -- 00000670 + X"2442EFFC", -- 00000674 + X"00441821", -- 00000678 + X"03E00008", -- 0000067C + X"AF830988", -- 00000680 + X"24022000", -- 00000684 + X"ACA20004", -- 00000688 + X"03E00008", -- 0000068C + X"00001021", -- 00000690 + X"03E00008", -- 00000694 + X"00001021", -- 00000698 + X"03E00008", -- 0000069C + X"2402FFFF", -- 000006A0 + X"03E00008", -- 000006A4 + X"2402FFFF", -- 000006A8 + X"03E00008", -- 000006AC + X"00001021", -- 000006B0 + X"27BDFFE0", -- 000006B4 + X"AFB20018", -- 000006B8 + X"AFB10014", -- 000006BC + X"AFB00010", -- 000006C0 + X"AFBF001C", -- 000006C4 + X"00C09021", -- 000006C8 + X"00A08021", -- 000006CC + X"18C00007", -- 000006D0 + X"00008821", -- 000006D4 + X"82040000", -- 000006D8 + X"0C100156", -- 000006DC + X"26310001", -- 000006E0 + X"0232102A", -- 000006E4 + X"1440FFFB", -- 000006E8 + X"26100001", -- 000006EC + X"02201021", -- 000006F0 + X"8FBF001C", -- 000006F4 + X"8FB20018", -- 000006F8 + X"8FB10014", -- 000006FC + X"8FB00010", -- 00000700 + X"03E00008", -- 00000704 + X"27BD0020", -- 00000708 + X"03E00008", -- 0000070C + X"24020001", -- 00000710 + X"27BDFFE0", -- 00000714 + X"AFB10014", -- 00000718 + X"AFB00010", -- 0000071C + X"AFBF0018", -- 00000720 + X"00808021", -- 00000724 + X"80840000", -- 00000728 + X"081001D1", -- 0000072C + X"02008821", -- 00000730 + X"0C100156", -- 00000734 + X"26100001", -- 00000738 + X"82040000", -- 0000073C + X"00000000", -- 00000740 + X"1480FFFB", -- 00000744 + X"02111023", -- 00000748 + X"8FBF0018", -- 0000074C + X"8FB10014", -- 00000750 + X"8FB00010", -- 00000754 + X"03E00008", -- 00000758 + X"27BD0020", -- 0000075C + X"27BDFFE0", -- 00000760 + X"AFB00010", -- 00000764 + X"00048600", -- 00000768 + X"AFB10014", -- 0000076C + X"AFBF0018", -- 00000770 + X"00108603", -- 00000774 + X"24110001", -- 00000778 + X"00101103", -- 0000077C + X"3045000F", -- 00000780 + X"00101100", -- 00000784 + X"00028600", -- 00000788 + X"2CA3000A", -- 0000078C + X"2631FFFF", -- 00000790 + X"00108603", -- 00000794 + X"14600002", -- 00000798 + X"24A40030", -- 0000079C + X"24A40037", -- 000007A0 + X"0C100156", -- 000007A4 + X"00000000", -- 000007A8 + X"0621FFF4", -- 000007AC + X"00101103", -- 000007B0 + X"8FBF0018", -- 000007B4 + X"8FB10014", -- 000007B8 + X"8FB00010", -- 000007BC + X"03E00008", -- 000007C0 + X"27BD0020", -- 000007C4 + X"27BDFFE0", -- 000007C8 + X"AFB10014", -- 000007CC + X"AFB00010", -- 000007D0 + X"AFBF0018", -- 000007D4 + X"00808021", -- 000007D8 + X"24110003", -- 000007DC + X"00102603", -- 000007E0 + X"0C1001D8", -- 000007E4 + X"2631FFFF", -- 000007E8 + X"0621FFFC", -- 000007EC + X"00108200", -- 000007F0 + X"8FBF0018", -- 000007F4 + X"8FB10014", -- 000007F8 + X"8FB00010", -- 000007FC + X"03E00008", -- 00000800 + X"27BD0020", -- 00000804 + X"24080002", -- 00000808 + X"0107102A", -- 0000080C + X"ACC40000", -- 00000810 + X"1040000A", -- 00000814 + X"ACC50004", -- 00000818 + X"24C60008", -- 0000081C + X"8CC2FFF8", -- 00000820 + X"8CC3FFFC", -- 00000824 + X"25080001", -- 00000828 + X"00431021", -- 0000082C + X"0107202A", -- 00000830 + X"ACC20000", -- 00000834 + X"1480FFF9", -- 00000838 + X"24C60004", -- 0000083C + X"03E00008", -- 00000840 + X"01001021", -- 00000844 + X"40026000", -- 00000848 + X"03E00008", -- 0000084C + X"00000000", -- 00000850 + X"40027800", -- 00000854 + X"03E00008", -- 00000858 + X"00000000", -- 0000085C + X"3C020000", -- 00000860 + X"8C420098", -- 00000864 + X"27BDFFC0", -- 00000868 + X"3C030000", -- 0000086C + X"8C63009C", -- 00000870 + X"AFA20010", -- 00000874 + X"3C020000", -- 00000878 + X"8C4200A0", -- 0000087C + X"AFA30014", -- 00000880 + X"AFA20018", -- 00000884 + X"3C030000", -- 00000888 + X"8C6300A4", -- 0000088C + X"3C020000", -- 00000890 + X"8C4200A8", -- 00000894 + X"AFA3001C", -- 00000898 + X"AFA20020", -- 0000089C + X"3C030000", -- 000008A0 + X"8C6300AC", -- 000008A4 + X"3C020000", -- 000008A8 + X"8C4200B0", -- 000008AC + X"AFA30024", -- 000008B0 + X"AFBF0038", -- 000008B4 + X"AFB10034", -- 000008B8 + X"AFB00030", -- 000008BC + X"0C100212", -- 000008C0 + X"AFA20028", -- 000008C4 + X"3C040000", -- 000008C8 + X"2484003C", -- 000008CC + X"0C1001C5", -- 000008D0 + X"00408821", -- 000008D4 + X"0C1001F2", -- 000008D8 + X"02202021", -- 000008DC + X"3C040000", -- 000008E0 + X"0C1001C5", -- 000008E4 + X"24840078", -- 000008E8 + X"0C100215", -- 000008EC + X"00000000", -- 000008F0 + X"00028203", -- 000008F4 + X"321000FF", -- 000008F8 + X"3C040000", -- 000008FC + X"24840048", -- 00000900 + X"0C1001C5", -- 00000904 + X"00408821", -- 00000908 + X"00101880", -- 0000090C + X"2610FFFF", -- 00000910 + X"2E100006", -- 00000914 + X"3C040000", -- 00000918 + X"24840054", -- 0000091C + X"12000012", -- 00000920 + X"03A31021", -- 00000924 + X"8C440010", -- 00000928 + X"0C1001C5", -- 0000092C + X"00000000", -- 00000930 + X"3C040000", -- 00000934 + X"0C1001C5", -- 00000938 + X"2484005C", -- 0000093C + X"00112600", -- 00000940 + X"0C1001D8", -- 00000944 + X"00042603", -- 00000948 + X"3C040000", -- 0000094C + X"0C1001C5", -- 00000950 + X"24840078", -- 00000954 + X"8FBF0038", -- 00000958 + X"8FB10034", -- 0000095C + X"8FB00030", -- 00000960 + X"03E00008", -- 00000964 + X"27BD0040", -- 00000968 + X"0C1001C5", -- 0000096C + X"00000000", -- 00000970 + X"3C040000", -- 00000974 + X"0C1001C5", -- 00000978 + X"24840078", -- 0000097C + X"8FBF0038", -- 00000980 + X"8FB10034", -- 00000984 + X"8FB00030", -- 00000988 + X"03E00008", -- 0000098C + X"27BD0040", -- 00000990 + X"27BDFFE8", -- 00000994 + X"24040080", -- 00000998 + X"AFBF0014", -- 0000099C + X"0C1003D6", -- 000009A0 + X"AFB00010", -- 000009A4 + X"00402021", -- 000009A8 + X"3C025555", -- 000009AC + X"3C03AAAA", -- 000009B0 + X"34455555", -- 000009B4 + X"3466AAAA", -- 000009B8 + X"2407FFFF", -- 000009BC + X"AC800000", -- 000009C0 + X"AC850004", -- 000009C4 + X"AC860008", -- 000009C8 + X"AC87000C", -- 000009CC + X"8C830000", -- 000009D0 + X"3C028000", -- 000009D4 + X"14600005", -- 000009D8 + X"34500010", -- 000009DC + X"8C820004", -- 000009E0 + X"00000000", -- 000009E4 + X"10450008", -- 000009E8 + X"00000000", -- 000009EC + X"0C1003DA", -- 000009F0 + X"00000000", -- 000009F4 + X"02001021", -- 000009F8 + X"8FBF0014", -- 000009FC + X"8FB00010", -- 00000A00 + X"03E00008", -- 00000A04 + X"27BD0018", -- 00000A08 + X"8C820008", -- 00000A0C + X"00000000", -- 00000A10 + X"1446FFF6", -- 00000A14 + X"00000000", -- 00000A18 + X"8C82000C", -- 00000A1C + X"00000000", -- 00000A20 + X"1447FFF2", -- 00000A24 + X"00801821", -- 00000A28 + X"00002821", -- 00000A2C + X"3C078000", -- 00000A30 + X"2406001F", -- 00000A34 + X"00051043", -- 00000A38 + X"24C6FFFF", -- 00000A3C + X"AC650000", -- 00000A40 + X"24630004", -- 00000A44 + X"04C1FFFB", -- 00000A48 + X"00472825", -- 00000A4C + X"00801821", -- 00000A50 + X"00002821", -- 00000A54 + X"00003021", -- 00000A58 + X"0810029D", -- 00000A5C + X"3C088000", -- 00000A60 + X"24C60001", -- 00000A64 + X"28C20020", -- 00000A68 + X"10400005", -- 00000A6C + X"00E82825", -- 00000A70 + X"8C620000", -- 00000A74 + X"00053843", -- 00000A78 + X"1045FFF9", -- 00000A7C + X"24630004", -- 00000A80 + X"24020020", -- 00000A84 + X"14C2FFD9", -- 00000A88 + X"00801821", -- 00000A8C + X"00002821", -- 00000A90 + X"2406001F", -- 00000A94 + X"00051040", -- 00000A98 + X"24C6FFFF", -- 00000A9C + X"AC650000", -- 00000AA0 + X"24630004", -- 00000AA4 + X"04C1FFFB", -- 00000AA8 + X"34450001", -- 00000AAC + X"00801821", -- 00000AB0 + X"00002821", -- 00000AB4 + X"081002B4", -- 00000AB8 + X"00003021", -- 00000ABC + X"24C60001", -- 00000AC0 + X"28C20020", -- 00000AC4 + X"10400005", -- 00000AC8 + X"34E50001", -- 00000ACC + X"8C620000", -- 00000AD0 + X"00053840", -- 00000AD4 + X"1045FFF9", -- 00000AD8 + X"24630004", -- 00000ADC + X"24020020", -- 00000AE0 + X"14C2FFC2", -- 00000AE4 + X"00801821", -- 00000AE8 + X"24050001", -- 00000AEC + X"2406001F", -- 00000AF0 + X"24C6FFFF", -- 00000AF4 + X"AC650000", -- 00000AF8 + X"24630004", -- 00000AFC + X"04C1FFFC", -- 00000B00 + X"00052840", -- 00000B04 + X"00801821", -- 00000B08 + X"24050001", -- 00000B0C + X"081002CA", -- 00000B10 + X"00003021", -- 00000B14 + X"24C60001", -- 00000B18 + X"28C20020", -- 00000B1C + X"10400005", -- 00000B20 + X"00052840", -- 00000B24 + X"8C620000", -- 00000B28 + X"00000000", -- 00000B2C + X"1045FFF9", -- 00000B30 + X"24630004", -- 00000B34 + X"24020020", -- 00000B38 + X"14C2FFAC", -- 00000B3C + X"00801821", -- 00000B40 + X"2405FFFE", -- 00000B44 + X"2406001F", -- 00000B48 + X"00051040", -- 00000B4C + X"24C6FFFF", -- 00000B50 + X"AC650000", -- 00000B54 + X"24630004", -- 00000B58 + X"04C1FFFB", -- 00000B5C + X"34450001", -- 00000B60 + X"00801821", -- 00000B64 + X"2405FFFE", -- 00000B68 + X"081002E1", -- 00000B6C + X"00003021", -- 00000B70 + X"24C60001", -- 00000B74 + X"28C20020", -- 00000B78 + X"10400005", -- 00000B7C + X"34E50001", -- 00000B80 + X"8C620000", -- 00000B84 + X"00053840", -- 00000B88 + X"1045FFF9", -- 00000B8C + X"24630004", -- 00000B90 + X"24020020", -- 00000B94 + X"14C2FF95", -- 00000B98 + X"00000000", -- 00000B9C + X"0810027C", -- 00000BA0 + X"00008021", -- 00000BA4 + X"27BDFF88", -- 00000BA8 + X"3C02AAAA", -- 00000BAC + X"AFB3006C", -- 00000BB0 + X"AFB20068", -- 00000BB4 + X"AFB00060", -- 00000BB8 + X"AFBF0070", -- 00000BBC + X"AFB10064", -- 00000BC0 + X"3450AAAA", -- 00000BC4 + X"00009821", -- 00000BC8 + X"00002021", -- 00000BCC + X"27B20010", -- 00000BD0 + X"02401021", -- 00000BD4 + X"24060013", -- 00000BD8 + X"24C6FFFF", -- 00000BDC + X"AC500000", -- 00000BE0 + X"04C1FFFD", -- 00000BE4 + X"24420004", -- 00000BE8 + X"02041026", -- 00000BEC + X"24910001", -- 00000BF0 + X"2442FFFF", -- 00000BF4 + X"02202821", -- 00000BF8 + X"27A60010", -- 00000BFC + X"24070014", -- 00000C00 + X"0C100202", -- 00000C04 + X"00028040", -- 00000C08 + X"24070002", -- 00000C0C + X"26450008", -- 00000C10 + X"08100309", -- 00000C14 + X"24060011", -- 00000C18 + X"04C0000A", -- 00000C1C + X"00000000", -- 00000C20 + X"8CA20000", -- 00000C24 + X"8CA3FFFC", -- 00000C28 + X"8CA4FFF8", -- 00000C2C + X"00431023", -- 00000C30 + X"24C6FFFF", -- 00000C34 + X"1482FFF8", -- 00000C38 + X"24A50004", -- 00000C3C + X"04C1FFF8", -- 00000C40 + X"24E70001", -- 00000C44 + X"24060014", -- 00000C48 + X"10E6000F", -- 00000C4C + X"00000000", -- 00000C50 + X"2A220003", -- 00000C54 + X"1440FFDE", -- 00000C58 + X"02202021", -- 00000C5C + X"24020003", -- 00000C60 + X"1662000B", -- 00000C64 + X"00001821", -- 00000C68 + X"8FBF0070", -- 00000C6C + X"8FB3006C", -- 00000C70 + X"8FB20068", -- 00000C74 + X"8FB10064", -- 00000C78 + X"8FB00060", -- 00000C7C + X"00601021", -- 00000C80 + X"03E00008", -- 00000C84 + X"27BD0078", -- 00000C88 + X"08100315", -- 00000C8C + X"26730001", -- 00000C90 + X"3C028000", -- 00000C94 + X"34430011", -- 00000C98 + X"8FBF0070", -- 00000C9C + X"8FB3006C", -- 00000CA0 + X"8FB20068", -- 00000CA4 + X"8FB10064", -- 00000CA8 + X"8FB00060", -- 00000CAC + X"00601021", -- 00000CB0 + X"03E00008", -- 00000CB4 + X"27BD0078", -- 00000CB8 + X"3C041970", -- 00000CBC + X"27BDFFD0", -- 00000CC0 + X"34841031", -- 00000CC4 + X"AFB30024", -- 00000CC8 + X"AFBF0028", -- 00000CCC + X"AFB20020", -- 00000CD0 + X"AFB1001C", -- 00000CD4 + X"AFB00018", -- 00000CD8 + X"0C100897", -- 00000CDC + X"00009821", -- 00000CE0 + X"0810033D", -- 00000CE4 + X"24120001", -- 00000CE8 + X"10800022", -- 00000CEC + X"00000000", -- 00000CF0 + X"0C10089C", -- 00000CF4 + X"26520001", -- 00000CF8 + X"00021C00", -- 00000CFC + X"00021200", -- 00000D00 + X"0C10089C", -- 00000D04 + X"00438026", -- 00000D08 + X"0C10089C", -- 00000D0C + X"00508826", -- 00000D10 + X"00021C00", -- 00000D14 + X"00021200", -- 00000D18 + X"0C10089C", -- 00000D1C + X"00438026", -- 00000D20 + X"00508026", -- 00000D24 + X"27A40010", -- 00000D28 + X"02202821", -- 00000D2C + X"0C1003B1", -- 00000D30 + X"02003021", -- 00000D34 + X"8FA30010", -- 00000D38 + X"8FA20014", -- 00000D3C + X"00700018", -- 00000D40 + X"00001812", -- 00000D44 + X"00431021", -- 00000D48 + X"1051FFE7", -- 00000D4C + X"2A4403E8", -- 00000D50 + X"3C028000", -- 00000D54 + X"34420012", -- 00000D58 + X"8FBF0028", -- 00000D5C + X"8FB30024", -- 00000D60 + X"8FB20020", -- 00000D64 + X"8FB1001C", -- 00000D68 + X"8FB00018", -- 00000D6C + X"03E00008", -- 00000D70 + X"27BD0030", -- 00000D74 + X"26730001", -- 00000D78 + X"2A620064", -- 00000D7C + X"1440FFDC", -- 00000D80 + X"24120001", -- 00000D84 + X"08100357", -- 00000D88 + X"00001021", -- 00000D8C + X"27BDFFD0", -- 00000D90 + X"AFB30024", -- 00000D94 + X"AFB20020", -- 00000D98 + X"AFB1001C", -- 00000D9C + X"AFBF0028", -- 00000DA0 + X"0C100218", -- 00000DA4 + X"AFB00018", -- 00000DA8 + X"3C023FFF", -- 00000DAC + X"3453FFFF", -- 00000DB0 + X"3C128000", -- 00000DB4 + X"08100399", -- 00000DB8 + X"00008821", -- 00000DBC + X"0C1002EA", -- 00000DC0 + X"00000000", -- 00000DC4 + X"0440002B", -- 00000DC8 + X"00408021", -- 00000DCC + X"0C10032F", -- 00000DD0 + X"00000000", -- 00000DD4 + X"3C040000", -- 00000DD8 + X"24840064", -- 00000DDC + X"04400025", -- 00000DE0 + X"00408021", -- 00000DE4 + X"0C1001C5", -- 00000DE8 + X"00000000", -- 00000DEC + X"0C1001F2", -- 00000DF0 + X"02202021", -- 00000DF4 + X"3C040000", -- 00000DF8 + X"24840070", -- 00000DFC + X"0C1001C5", -- 00000E00 + X"26310001", -- 00000E04 + X"0C1008CE", -- 00000E08 + X"00002021", -- 00000E0C + X"27A40010", -- 00000E10 + X"0C1003D1", -- 00000E14 + X"AFA20010", -- 00000E18 + X"80440008", -- 00000E1C + X"0C1001D8", -- 00000E20 + X"00408021", -- 00000E24 + X"3C040000", -- 00000E28 + X"0C1001C5", -- 00000E2C + X"2484007C", -- 00000E30 + X"82040004", -- 00000E34 + X"0C1001D8", -- 00000E38 + X"00000000", -- 00000E3C + X"3C040000", -- 00000E40 + X"0C1001C5", -- 00000E44 + X"2484007C", -- 00000E48 + X"82040000", -- 00000E4C + X"0C1001D8", -- 00000E50 + X"00000000", -- 00000E54 + X"3C040000", -- 00000E58 + X"0C1001C5", -- 00000E5C + X"24840078", -- 00000E60 + X"02331024", -- 00000E64 + X"0C100265", -- 00000E68 + X"AE420000", -- 00000E6C + X"0441FFD3", -- 00000E70 + X"00408021", -- 00000E74 + X"3C024000", -- 00000E78 + X"02221025", -- 00000E7C + X"3C040000", -- 00000E80 + X"24840080", -- 00000E84 + X"0C1001C5", -- 00000E88 + X"AE420000", -- 00000E8C + X"0C1001F2", -- 00000E90 + X"02002021", -- 00000E94 + X"3C040000", -- 00000E98 + X"0C1001C5", -- 00000E9C + X"24840094", -- 00000EA0 + X"8FBF0028", -- 00000EA4 + X"8FB30024", -- 00000EA8 + X"8FB20020", -- 00000EAC + X"8FB1001C", -- 00000EB0 + X"8FB00018", -- 00000EB4 + X"24020001", -- 00000EB8 + X"03E00008", -- 00000EBC + X"27BD0030", -- 00000EC0 + X"14C00002", -- 00000EC4 + X"00A6001A", -- 00000EC8 + X"0007000D", -- 00000ECC + X"27BDFFF8", -- 00000ED0 + X"00001010", -- 00000ED4 + X"00001812", -- 00000ED8 + X"04A0000D", -- 00000EDC + X"00803821", -- 00000EE0 + X"00463023", -- 00000EE4 + X"0440000D", -- 00000EE8 + X"24640001", -- 00000EEC + X"AFA20004", -- 00000EF0 + X"AFA30000", -- 00000EF4 + X"8FA40000", -- 00000EF8 + X"8FA30004", -- 00000EFC + X"00E01021", -- 00000F00 + X"27BD0008", -- 00000F04 + X"ACE30004", -- 00000F08 + X"03E00008", -- 00000F0C + X"ACE40000", -- 00000F10 + X"00463021", -- 00000F14 + X"1840FFF5", -- 00000F18 + X"2464FFFF", -- 00000F1C + X"AFA40000", -- 00000F20 + X"AFA60004", -- 00000F24 + X"8FA40000", -- 00000F28 + X"8FA30004", -- 00000F2C + X"00E01021", -- 00000F30 + X"27BD0008", -- 00000F34 + X"ACE30004", -- 00000F38 + X"03E00008", -- 00000F3C + X"ACE40000", -- 00000F40 + X"8F85096C", -- 00000F44 + X"081003D4", -- 00000F48 + X"24A5007C", -- 00000F4C + X"081006BE", -- 00000F50 + X"24060001", -- 00000F54 + X"00802821", -- 00000F58 + X"8F84096C", -- 00000F5C + X"081003DE", -- 00000F60 + X"00000000", -- 00000F64 + X"00802821", -- 00000F68 + X"8F84096C", -- 00000F6C + X"08100938", -- 00000F70 + X"00000000", -- 00000F74 + X"24A6000B", -- 00000F78 + X"27BDFFC8", -- 00000F7C + X"2CC20017", -- 00000F80 + X"AFB20018", -- 00000F84 + X"AFB10014", -- 00000F88 + X"AFBF0034", -- 00000F8C + X"AFBE0030", -- 00000F90 + X"AFB7002C", -- 00000F94 + X"AFB60028", -- 00000F98 + X"AFB50024", -- 00000F9C + X"AFB40020", -- 00000FA0 + X"AFB3001C", -- 00000FA4 + X"AFB00010", -- 00000FA8 + X"00809021", -- 00000FAC + X"14400005", -- 00000FB0 + X"24110010", -- 00000FB4 + X"2402FFF8", -- 00000FB8 + X"00C28824", -- 00000FBC + X"06200004", -- 00000FC0 + X"2402000C", -- 00000FC4 + X"0225102B", -- 00000FC8 + X"10400010", -- 00000FCC + X"2402000C", -- 00000FD0 + X"00001821", -- 00000FD4 + X"AE420000", -- 00000FD8 + X"8FBF0034", -- 00000FDC + X"8FBE0030", -- 00000FE0 + X"8FB7002C", -- 00000FE4 + X"8FB60028", -- 00000FE8 + X"8FB50024", -- 00000FEC + X"8FB40020", -- 00000FF0 + X"8FB3001C", -- 00000FF4 + X"8FB20018", -- 00000FF8 + X"8FB10014", -- 00000FFC + X"8FB00010", -- 00001000 + X"00601021", -- 00001004 + X"03E00008", -- 00001008 + X"27BD0038", -- 0000100C + X"0C100893", -- 00001010 + X"02402021", -- 00001014 + X"2E2201F8", -- 00001018 + X"10400024", -- 0000101C + X"00111A42", -- 00001020 + X"3C020000", -- 00001024 + X"24420520", -- 00001028 + X"02223021", -- 0000102C + X"8CD0000C", -- 00001030 + X"00000000", -- 00001034 + X"12060059", -- 00001038 + X"001140C2", -- 0000103C + X"8E030004", -- 00001040 + X"2402FFFC", -- 00001044 + X"00622024", -- 00001048 + X"02042021", -- 0000104C + X"8C820004", -- 00001050 + X"8E07000C", -- 00001054 + X"8E060008", -- 00001058 + X"34420001", -- 0000105C + X"ACE60008", -- 00001060 + X"AC820004", -- 00001064 + X"ACC7000C", -- 00001068 + X"02402021", -- 0000106C + X"0C100895", -- 00001070 + X"00000000", -- 00001074 + X"26030008", -- 00001078 + X"8FBF0034", -- 0000107C + X"8FBE0030", -- 00001080 + X"8FB7002C", -- 00001084 + X"8FB60028", -- 00001088 + X"8FB50024", -- 0000108C + X"8FB40020", -- 00001090 + X"8FB3001C", -- 00001094 + X"8FB20018", -- 00001098 + X"8FB10014", -- 0000109C + X"8FB00010", -- 000010A0 + X"00601021", -- 000010A4 + X"03E00008", -- 000010A8 + X"27BD0038", -- 000010AC + X"1060000C", -- 000010B0 + X"001140C2", -- 000010B4 + X"2C620005", -- 000010B8 + X"1440003F", -- 000010BC + X"00111182", -- 000010C0 + X"2C620015", -- 000010C4 + X"14400006", -- 000010C8 + X"2468005B", -- 000010CC + X"2C620055", -- 000010D0 + X"10400162", -- 000010D4 + X"2C620155", -- 000010D8 + X"00111302", -- 000010DC + X"2448006E", -- 000010E0 + X"000810C0", -- 000010E4 + X"3C040000", -- 000010E8 + X"24840520", -- 000010EC + X"00441821", -- 000010F0 + X"8C70000C", -- 000010F4 + X"00000000", -- 000010F8 + X"1203000F", -- 000010FC + X"00000000", -- 00001100 + X"2406FFFC", -- 00001104 + X"8E020004", -- 00001108 + X"00000000", -- 0000110C + X"00462024", -- 00001110 + X"00912823", -- 00001114 + X"28A20010", -- 00001118 + X"10400102", -- 0000111C + X"00000000", -- 00001120 + X"04A10102", -- 00001124 + X"00000000", -- 00001128 + X"8E10000C", -- 0000112C + X"00000000", -- 00001130 + X"1603FFF4", -- 00001134 + X"00000000", -- 00001138 + X"25080001", -- 0000113C + X"3C100000", -- 00001140 + X"8E100530", -- 00001144 + X"3C0C0000", -- 00001148 + X"258C0528", -- 0000114C + X"120C0032", -- 00001150 + X"2403FFFC", -- 00001154 + X"8E020004", -- 00001158 + X"00000000", -- 0000115C + X"00432024", -- 00001160 + X"00912823", -- 00001164 + X"28A20010", -- 00001168 + X"10400073", -- 0000116C + X"00000000", -- 00001170 + X"AD8C000C", -- 00001174 + X"04A00012", -- 00001178 + X"AD8C0008", -- 0000117C + X"02041821", -- 00001180 + X"8C620004", -- 00001184 + X"02402021", -- 00001188 + X"34420001", -- 0000118C + X"0C100895", -- 00001190 + X"AC620004", -- 00001194 + X"0810041F", -- 00001198 + X"26030008", -- 0000119C + X"26060008", -- 000011A0 + X"8CD0000C", -- 000011A4 + X"00000000", -- 000011A8 + X"1606FFA4", -- 000011AC + X"25080002", -- 000011B0 + X"08100450", -- 000011B4 + X"00000000", -- 000011B8 + X"08100439", -- 000011BC + X"24480038", -- 000011C0 + X"2C820200", -- 000011C4 + X"104000E2", -- 000011C8 + X"00042A42", -- 000011CC + X"000418C2", -- 000011D0 + X"3C050000", -- 000011D4 + X"24A50520", -- 000011D8 + X"04600155", -- 000011DC + X"00602021", -- 000011E0 + X"000310C0", -- 000011E4 + X"00453821", -- 000011E8 + X"00042083", -- 000011EC + X"3C020000", -- 000011F0 + X"8C420524", -- 000011F4 + X"24030001", -- 000011F8 + X"8CE60008", -- 000011FC + X"00831804", -- 00001200 + X"00431025", -- 00001204 + X"AE07000C", -- 00001208 + X"AE060008", -- 0000120C + X"ACA20004", -- 00001210 + X"ACD0000C", -- 00001214 + X"ACF00008", -- 00001218 + X"0500010E", -- 0000121C + X"01001021", -- 00001220 + X"00021083", -- 00001224 + X"3C0A0000", -- 00001228 + X"8D4A0524", -- 0000122C + X"24030001", -- 00001230 + X"00433804", -- 00001234 + X"0147202B", -- 00001238 + X"1480004C", -- 0000123C + X"01471024", -- 00001240 + X"1440000A", -- 00001244 + X"2402FFFC", -- 00001248 + X"00073840", -- 0000124C + X"01021024", -- 00001250 + X"01471824", -- 00001254 + X"14600005", -- 00001258 + X"24480004", -- 0000125C + X"00073840", -- 00001260 + X"01471024", -- 00001264 + X"1040FFFD", -- 00001268 + X"25080004", -- 0000126C + X"3C030000", -- 00001270 + X"24630520", -- 00001274 + X"000810C0", -- 00001278 + X"00433021", -- 0000127C + X"01005821", -- 00001280 + X"00C01821", -- 00001284 + X"8C70000C", -- 00001288 + X"00000000", -- 0000128C + X"1203000F", -- 00001290 + X"00000000", -- 00001294 + X"2409FFFC", -- 00001298 + X"8E020004", -- 0000129C + X"00000000", -- 000012A0 + X"00492024", -- 000012A4 + X"00912823", -- 000012A8 + X"28A20010", -- 000012AC + X"104000CD", -- 000012B0 + X"00000000", -- 000012B4 + X"04A100DE", -- 000012B8 + X"00000000", -- 000012BC + X"8E10000C", -- 000012C0 + X"00000000", -- 000012C4 + X"1603FFF4", -- 000012C8 + X"00000000", -- 000012CC + X"25080001", -- 000012D0 + X"31020003", -- 000012D4 + X"1440FFEB", -- 000012D8 + X"24630008", -- 000012DC + X"31620003", -- 000012E0 + X"24C6FFF8", -- 000012E4 + X"10400132", -- 000012E8 + X"256BFFFF", -- 000012EC + X"8CC20008", -- 000012F0 + X"00000000", -- 000012F4 + X"1046FFFA", -- 000012F8 + X"31620003", -- 000012FC + X"00073840", -- 00001300 + X"0147102B", -- 00001304 + X"14400019", -- 00001308 + X"00000000", -- 0000130C + X"10E00017", -- 00001310 + X"01471024", -- 00001314 + X"081004CB", -- 00001318 + X"00000000", -- 0000131C + X"00073840", -- 00001320 + X"01471024", -- 00001324 + X"25080004", -- 00001328 + X"1040FFFC", -- 0000132C + X"00000000", -- 00001330 + X"0810049C", -- 00001334 + X"00000000", -- 00001338 + X"02114021", -- 0000133C + X"34A40001", -- 00001340 + X"36230001", -- 00001344 + X"01051021", -- 00001348 + X"AE030004", -- 0000134C + X"AD040004", -- 00001350 + X"02402021", -- 00001354 + X"AD88000C", -- 00001358 + X"AD880008", -- 0000135C + X"AC450000", -- 00001360 + X"AD0C0008", -- 00001364 + X"0810041C", -- 00001368 + X"AD0C000C", -- 0000136C + X"3C130000", -- 00001370 + X"8E730528", -- 00001374 + X"2403FFFC", -- 00001378 + X"8E620004", -- 0000137C + X"00000000", -- 00001380 + X"0043B024", -- 00001384 + X"02D1202B", -- 00001388 + X"14800004", -- 0000138C + X"02D12823", -- 00001390 + X"28A20010", -- 00001394 + X"10400028", -- 00001398 + X"02712021", -- 0000139C + X"8F820994", -- 000013A0 + X"241EFFFF", -- 000013A4 + X"02221821", -- 000013A8 + X"8F820970", -- 000013AC + X"02C0B821", -- 000013B0 + X"0276A021", -- 000013B4 + X"105E0004", -- 000013B8 + X"24750010", -- 000013BC + X"2463100F", -- 000013C0 + X"2402F000", -- 000013C4 + X"0062A824", -- 000013C8 + X"02402021", -- 000013CC + X"0C1008B8", -- 000013D0 + X"02A02821", -- 000013D4 + X"105E0008", -- 000013D8 + X"00408021", -- 000013DC + X"0054102B", -- 000013E0 + X"1040001F", -- 000013E4 + X"00000000", -- 000013E8 + X"3C020000", -- 000013EC + X"24420520", -- 000013F0 + X"1262001B", -- 000013F4 + X"00000000", -- 000013F8 + X"3C130000", -- 000013FC + X"8E730528", -- 00001400 + X"00000000", -- 00001404 + X"8E620004", -- 00001408 + X"2403FFFC", -- 0000140C + X"00431024", -- 00001410 + X"0051202B", -- 00001414 + X"14800004", -- 00001418 + X"00512823", -- 0000141C + X"28A20010", -- 00001420 + X"10400005", -- 00001424 + X"02712021", -- 00001428 + X"0C100895", -- 0000142C + X"02402021", -- 00001430 + X"081003F7", -- 00001434 + X"00001821", -- 00001438 + X"34A30001", -- 0000143C + X"36220001", -- 00001440 + X"AE620004", -- 00001444 + X"3C010000", -- 00001448 + X"AC240528", -- 0000144C + X"AC830004", -- 00001450 + X"0C100895", -- 00001454 + X"02402021", -- 00001458 + X"081003F7", -- 0000145C + X"26630008", -- 00001460 + X"3C020000", -- 00001464 + X"8C420AF4", -- 00001468 + X"121400C7", -- 0000146C + X"00552021", -- 00001470 + X"8F830970", -- 00001474 + X"2402FFFF", -- 00001478 + X"106200BF", -- 0000147C + X"02141023", -- 00001480 + X"00821021", -- 00001484 + X"3C010000", -- 00001488 + X"AC220AF4", -- 0000148C + X"32030007", -- 00001490 + X"10600004", -- 00001494 + X"0000A021", -- 00001498 + X"24020008", -- 0000149C + X"0043A023", -- 000014A0 + X"02148021", -- 000014A4 + X"02151021", -- 000014A8 + X"30420FFF", -- 000014AC + X"24031000", -- 000014B0 + X"00621823", -- 000014B4 + X"0283A021", -- 000014B8 + X"02402021", -- 000014BC + X"0C1008B8", -- 000014C0 + X"02802821", -- 000014C4 + X"00401821", -- 000014C8 + X"2402FFFF", -- 000014CC + X"106200C2", -- 000014D0 + X"00000000", -- 000014D4 + X"3C020000", -- 000014D8 + X"8C420AF4", -- 000014DC + X"00701823", -- 000014E0 + X"00741821", -- 000014E4 + X"00541021", -- 000014E8 + X"3C040000", -- 000014EC + X"24840520", -- 000014F0 + X"3C010000", -- 000014F4 + X"AC220AF4", -- 000014F8 + X"3C010000", -- 000014FC + X"AC300528", -- 00001500 + X"126400B1", -- 00001504 + X"34650001", -- 00001508 + X"2EC20010", -- 0000150C + X"10400065", -- 00001510 + X"26C3FFF4", -- 00001514 + X"24020001", -- 00001518 + X"02009821", -- 0000151C + X"08100502", -- 00001520 + X"AE020004", -- 00001524 + X"0810044F", -- 00001528 + X"2508FFFF", -- 0000152C + X"02041821", -- 00001530 + X"8C620004", -- 00001534 + X"8E07000C", -- 00001538 + X"8E060008", -- 0000153C + X"34420001", -- 00001540 + X"ACE60008", -- 00001544 + X"AC620004", -- 00001548 + X"0810041B", -- 0000154C + X"ACC7000C", -- 00001550 + X"10A00006", -- 00001554 + X"000418C2", -- 00001558 + X"2CA20005", -- 0000155C + X"10400049", -- 00001560 + X"2CA20015", -- 00001564 + X"00041182", -- 00001568 + X"24430038", -- 0000156C + X"000310C0", -- 00001570 + X"3C050000", -- 00001574 + X"24A50520", -- 00001578 + X"00453821", -- 0000157C + X"8CE60008", -- 00001580 + X"00000000", -- 00001584 + X"10C7006C", -- 00001588 + X"00000000", -- 0000158C + X"8CC20004", -- 00001590 + X"2403FFFC", -- 00001594 + X"00431024", -- 00001598 + X"0082102B", -- 0000159C + X"1040000B", -- 000015A0 + X"00000000", -- 000015A4 + X"8CC60008", -- 000015A8 + X"00000000", -- 000015AC + X"10C70007", -- 000015B0 + X"00000000", -- 000015B4 + X"8CC20004", -- 000015B8 + X"00000000", -- 000015BC + X"00431024", -- 000015C0 + X"0082102B", -- 000015C4 + X"1440FFF7", -- 000015C8 + X"00000000", -- 000015CC + X"8CC7000C", -- 000015D0 + X"AE060008", -- 000015D4 + X"AE07000C", -- 000015D8 + X"ACF00008", -- 000015DC + X"08100487", -- 000015E0 + X"ACD0000C", -- 000015E4 + X"02114021", -- 000015E8 + X"8E07000C", -- 000015EC + X"8E060008", -- 000015F0 + X"36230001", -- 000015F4 + X"34A40001", -- 000015F8 + X"01051021", -- 000015FC + X"ACE60008", -- 00001600 + X"AE030004", -- 00001604 + X"ACC7000C", -- 00001608 + X"AD040004", -- 0000160C + X"AD880008", -- 00001610 + X"AD88000C", -- 00001614 + X"AC450000", -- 00001618 + X"AD0C0008", -- 0000161C + X"02402021", -- 00001620 + X"0C100895", -- 00001624 + X"AD0C000C", -- 00001628 + X"0810041F", -- 0000162C + X"26030008", -- 00001630 + X"02041821", -- 00001634 + X"8C620004", -- 00001638 + X"8E07000C", -- 0000163C + X"8E060008", -- 00001640 + X"34420001", -- 00001644 + X"AC620004", -- 00001648 + X"ACE60008", -- 0000164C + X"0810041B", -- 00001650 + X"ACC7000C", -- 00001654 + X"08100489", -- 00001658 + X"25020003", -- 0000165C + X"10400004", -- 00001660 + X"2C620555", -- 00001664 + X"001113C2", -- 00001668 + X"08100439", -- 0000166C + X"24480077", -- 00001670 + X"1040FE9B", -- 00001674 + X"2408007E", -- 00001678 + X"00111482", -- 0000167C + X"08100439", -- 00001680 + X"2448007C", -- 00001684 + X"1440FFB9", -- 00001688 + X"24A3005B", -- 0000168C + X"2CA20055", -- 00001690 + X"10400054", -- 00001694 + X"2CA20155", -- 00001698 + X"00041302", -- 0000169C + X"0810055C", -- 000016A0 + X"2443006E", -- 000016A4 + X"2402FFF8", -- 000016A8 + X"0062B824", -- 000016AC + X"02772021", -- 000016B0 + X"24030005", -- 000016B4 + X"AE050004", -- 000016B8 + X"AC830008", -- 000016BC + X"AC830004", -- 000016C0 + X"8E620004", -- 000016C4 + X"2EE30010", -- 000016C8 + X"30420001", -- 000016CC + X"00571025", -- 000016D0 + X"10600012", -- 000016D4 + X"AE620004", -- 000016D8 + X"3C130000", -- 000016DC + X"8E730528", -- 000016E0 + X"3C030000", -- 000016E4 + X"8C630AF4", -- 000016E8 + X"8F820990", -- 000016EC + X"00000000", -- 000016F0 + X"0043102B", -- 000016F4 + X"10400002", -- 000016F8 + X"00000000", -- 000016FC + X"AF830990", -- 00001700 + X"8F82098C", -- 00001704 + X"00000000", -- 00001708 + X"0043102B", -- 0000170C + X"1040FF3D", -- 00001710 + X"00000000", -- 00001714 + X"08100502", -- 00001718 + X"AF83098C", -- 0000171C + X"26650008", -- 00001720 + X"0C100938", -- 00001724 + X"02402021", -- 00001728 + X"081005B7", -- 0000172C + X"00000000", -- 00001730 + X"08100479", -- 00001734 + X"24640003", -- 00001738 + X"0460002F", -- 0000173C + X"00601021", -- 00001740 + X"00021083", -- 00001744 + X"3C040000", -- 00001748 + X"8C840524", -- 0000174C + X"24030001", -- 00001750 + X"00431804", -- 00001754 + X"00832025", -- 00001758 + X"3C020000", -- 0000175C + X"24420520", -- 00001760 + X"AE07000C", -- 00001764 + X"AE060008", -- 00001768 + X"AC440004", -- 0000176C + X"ACD0000C", -- 00001770 + X"08100487", -- 00001774 + X"ACF00008", -- 00001778 + X"3C010000", -- 0000177C + X"AC240AF4", -- 00001780 + X"08100524", -- 00001784 + X"AF900970", -- 00001788 + X"32020FFF", -- 0000178C + X"1440FF38", -- 00001790 + X"02B71821", -- 00001794 + X"3C130000", -- 00001798 + X"8E730528", -- 0000179C + X"34620001", -- 000017A0 + X"3C010000", -- 000017A4 + X"AC240AF4", -- 000017A8 + X"081005B9", -- 000017AC + X"AE620004", -- 000017B0 + X"00071027", -- 000017B4 + X"01421024", -- 000017B8 + X"3C010000", -- 000017BC + X"AC220524", -- 000017C0 + X"081004C0", -- 000017C4 + X"00405021", -- 000017C8 + X"3C130000", -- 000017CC + X"8E730528", -- 000017D0 + X"081005B9", -- 000017D4 + X"AE050004", -- 000017D8 + X"0000A021", -- 000017DC + X"08100536", -- 000017E0 + X"02001821", -- 000017E4 + X"10400006", -- 000017E8 + X"2CA20555", -- 000017EC + X"000413C2", -- 000017F0 + X"0810055C", -- 000017F4 + X"24430077", -- 000017F8 + X"081005D1", -- 000017FC + X"24620003", -- 00001800 + X"1040FF5A", -- 00001804 + X"2403007E", -- 00001808 + X"00041482", -- 0000180C + X"0810055C", -- 00001810 + X"2443007C", -- 00001814 + X"27BDFFE8", -- 00001818 + X"AFB00010", -- 0000181C + X"AFBF0014", -- 00001820 + X"0C100A23", -- 00001824 + X"00808021", -- 00001828 + X"00405821", -- 0000182C + X"2A0207B2", -- 00001830 + X"14400086", -- 00001834 + X"00002021", -- 00001838 + X"2602F84E", -- 0000183C + X"000218C0", -- 00001840 + X"00621821", -- 00001844 + X"000318C0", -- 00001848 + X"00621821", -- 0000184C + X"00032080", -- 00001850 + X"2606F84F", -- 00001854 + X"00641021", -- 00001858 + X"04C000A2", -- 0000185C + X"AD700004", -- 00001860 + X"3C0451EB", -- 00001864 + X"3484851F", -- 00001868 + X"2607F893", -- 0000186C + X"00E40018", -- 00001870 + X"2603F9BF", -- 00001874 + X"000347C3", -- 00001878 + X"00063083", -- 0000187C + X"00073FC3", -- 00001880 + X"00463021", -- 00001884 + X"3C029249", -- 00001888 + X"34592493", -- 0000188C + X"320E0003", -- 00001890 + X"01604821", -- 00001894 + X"240C0001", -- 00001898 + X"00002810", -- 0000189C + X"00052943", -- 000018A0 + X"00A72823", -- 000018A4 + X"00640018", -- 000018A8 + X"00C53023", -- 000018AC + X"00001810", -- 000018B0 + X"000319C3", -- 000018B4 + X"00681823", -- 000018B8 + X"02040018", -- 000018BC + X"00C36821", -- 000018C0 + X"00002010", -- 000018C4 + X"000479C3", -- 000018C8 + X"0004C143", -- 000018CC + X"81230008", -- 000018D0 + X"2402004A", -- 000018D4 + X"10620062", -- 000018D8 + X"24020044", -- 000018DC + X"10620044", -- 000018E0 + X"00002021", -- 000018E4 + X"15C00009", -- 000018E8 + X"00102FC3", -- 000018EC + X"03051823", -- 000018F0 + X"00031040", -- 000018F4 + X"00431021", -- 000018F8 + X"000210C0", -- 000018FC + X"00431021", -- 00001900 + X"00021080", -- 00001904 + X"1602006B", -- 00001908 + X"00000000", -- 0000190C + X"01E51823", -- 00001910 + X"00031040", -- 00001914 + X"00431021", -- 00001918 + X"000210C0", -- 0000191C + X"00431021", -- 00001920 + X"00021100", -- 00001924 + X"12020063", -- 00001928 + X"00000000", -- 0000192C + X"00041040", -- 00001930 + X"8D25000C", -- 00001934 + X"00441021", -- 00001938 + X"24080001", -- 0000193C + X"00021100", -- 00001940 + X"3C030000", -- 00001944 + X"246300B8", -- 00001948 + X"0105202A", -- 0000194C + X"00435021", -- 00001950 + X"10800008", -- 00001954 + X"01A03821", -- 00001958 + X"01402021", -- 0000195C + X"8C820000", -- 00001960 + X"25080001", -- 00001964 + X"0105182A", -- 00001968 + X"00E23821", -- 0000196C + X"1460FFFB", -- 00001970 + X"24840004", -- 00001974 + X"24E40004", -- 00001978 + X"00990018", -- 0000197C + X"00042FC3", -- 00001980 + X"8D260014", -- 00001984 + X"00001810", -- 00001988 + X"00641821", -- 0000198C + X"00031883", -- 00001990 + X"00651823", -- 00001994 + X"000310C0", -- 00001998 + X"00431023", -- 0000199C + X"00821823", -- 000019A0 + X"00C33023", -- 000019A4 + X"04C00051", -- 000019A8 + X"00000000", -- 000019AC + X"8D240010", -- 000019B0 + X"00081880", -- 000019B4 + X"000410C0", -- 000019B8 + X"00441023", -- 000019BC + X"006A1821", -- 000019C0 + X"00461021", -- 000019C4 + X"8C65FFFC", -- 000019C8 + X"2444FFF9", -- 000019CC + X"0085182A", -- 000019D0 + X"14600005", -- 000019D4 + X"00000000", -- 000019D8 + X"2484FFF9", -- 000019DC + X"0085102A", -- 000019E0 + X"1040FFFD", -- 000019E4 + X"00000000", -- 000019E8 + X"08100680", -- 000019EC + X"00E43821", -- 000019F0 + X"8D220014", -- 000019F4 + X"00000000", -- 000019F8 + X"004D3821", -- 000019FC + X"00071840", -- 00001A00 + X"00671821", -- 00001A04 + X"00032100", -- 00001A08 + X"00832023", -- 00001A0C + X"00041100", -- 00001A10 + X"8D250018", -- 00001A14 + X"00441023", -- 00001A18 + X"8D230020", -- 00001A1C + X"000211C0", -- 00001A20 + X"00451021", -- 00001A24 + X"00431021", -- 00001A28 + X"258CFFFF", -- 00001A2C + X"AD22001C", -- 00001A30 + X"0581FFA6", -- 00001A34 + X"2529001C", -- 00001A38 + X"8D62001C", -- 00001A3C + X"8D630038", -- 00001A40 + X"24040001", -- 00001A44 + X"0043102A", -- 00001A48 + X"AD620000", -- 00001A4C + X"8FBF0014", -- 00001A50 + X"8FB00010", -- 00001A54 + X"00801021", -- 00001A58 + X"03E00008", -- 00001A5C + X"27BD0018", -- 00001A60 + X"8D220014", -- 00001A64 + X"00003021", -- 00001A68 + X"004D2021", -- 00001A6C + X"11C00013", -- 00001A70 + X"00102FC3", -- 00001A74 + X"01E51823", -- 00001A78 + X"00031040", -- 00001A7C + X"00431021", -- 00001A80 + X"000210C0", -- 00001A84 + X"00431021", -- 00001A88 + X"00021100", -- 00001A8C + X"1602FFDB", -- 00001A90 + X"00863821", -- 00001A94 + X"8D220014", -- 00001A98 + X"00000000", -- 00001A9C + X"2842003C", -- 00001AA0 + X"14400002", -- 00001AA4 + X"00000000", -- 00001AA8 + X"24060001", -- 00001AAC + X"08100680", -- 00001AB0 + X"00863821", -- 00001AB4 + X"0810064C", -- 00001AB8 + X"24040001", -- 00001ABC + X"03051823", -- 00001AC0 + X"00031040", -- 00001AC4 + X"00431021", -- 00001AC8 + X"000210C0", -- 00001ACC + X"00431021", -- 00001AD0 + X"00021080", -- 00001AD4 + X"1602FFEF", -- 00001AD8 + X"01E51823", -- 00001ADC + X"081006A0", -- 00001AE0 + X"00031040", -- 00001AE4 + X"08100619", -- 00001AE8 + X"2606F852", -- 00001AEC + X"0810066C", -- 00001AF0 + X"24C60007", -- 00001AF4 + X"27BDFFD0", -- 00001AF8 + X"AFB50024", -- 00001AFC + X"AFB40020", -- 00001B00 + X"AFB3001C", -- 00001B04 + X"0080A021", -- 00001B08 + X"AFB10014", -- 00001B0C + X"AFBF0028", -- 00001B10 + X"00A08821", -- 00001B14 + X"AFB20018", -- 00001B18 + X"AFB00010", -- 00001B1C + X"0C100A23", -- 00001B20 + X"00C0A821", -- 00001B24 + X"00409821", -- 00001B28 + X"8E850000", -- 00001B2C + X"3C02C22E", -- 00001B30 + X"34424507", -- 00001B34 + X"00A20018", -- 00001B38 + X"000527C3", -- 00001B3C + X"00001010", -- 00001B40 + X"00451021", -- 00001B44 + X"00021403", -- 00001B48 + X"00444823", -- 00001B4C + X"00091840", -- 00001B50 + X"00691821", -- 00001B54 + X"00032100", -- 00001B58 + X"00832023", -- 00001B5C + X"00041100", -- 00001B60 + X"00441023", -- 00001B64 + X"000211C0", -- 00001B68 + X"00A24023", -- 00001B6C + X"05000091", -- 00001B70 + X"3C020001", -- 00001B74 + X"3445517F", -- 00001B78 + X"00A8182A", -- 00001B7C + X"10600007", -- 00001B80 + X"3C02FFFE", -- 00001B84 + X"3444AE80", -- 00001B88 + X"00A01821", -- 00001B8C + X"01044021", -- 00001B90 + X"0068102A", -- 00001B94 + X"1440FFFD", -- 00001B98 + X"25290001", -- 00001B9C + X"3C0391A2", -- 00001BA0 + X"3463B3C5", -- 00001BA4 + X"01030018", -- 00001BA8 + X"000827C3", -- 00001BAC + X"25250004", -- 00001BB0 + X"00053FC3", -- 00001BB4 + X"00001810", -- 00001BB8 + X"00681821", -- 00001BBC + X"00031AC3", -- 00001BC0 + X"00642023", -- 00001BC4 + X"000410C0", -- 00001BC8 + X"00441023", -- 00001BCC + X"00021140", -- 00001BD0 + X"00441021", -- 00001BD4 + X"00021100", -- 00001BD8 + X"3C038888", -- 00001BDC + X"01024023", -- 00001BE0 + X"34638889", -- 00001BE4 + X"01030018", -- 00001BE8 + X"AE240008", -- 00001BEC + X"3C049249", -- 00001BF0 + X"34842493", -- 00001BF4 + X"000837C3", -- 00001BF8 + X"00001810", -- 00001BFC + X"00681821", -- 00001C00 + X"00031943", -- 00001C04 + X"00A40018", -- 00001C08 + X"00661823", -- 00001C0C + X"00031100", -- 00001C10 + X"00431023", -- 00001C14 + X"00021080", -- 00001C18 + X"01021023", -- 00001C1C + X"AE220000", -- 00001C20 + X"00002010", -- 00001C24 + X"00852021", -- 00001C28 + X"00042083", -- 00001C2C + X"00872023", -- 00001C30 + X"000410C0", -- 00001C34 + X"00441023", -- 00001C38 + X"00A22823", -- 00001C3C + X"04A0008B", -- 00001C40 + X"AE230004", -- 00001C44 + X"AE250018", -- 00001C48 + X"05200060", -- 00001C4C + X"241007B2", -- 00001C50 + X"27860978", -- 00001C54 + X"32020003", -- 00001C58 + X"001027C3", -- 00001C5C + X"1440000E", -- 00001C60 + X"00002821", -- 00001C64 + X"3C0351EB", -- 00001C68 + X"3463851F", -- 00001C6C + X"02030018", -- 00001C70 + X"00001810", -- 00001C74 + X"00031943", -- 00001C78 + X"00641823", -- 00001C7C + X"00031040", -- 00001C80 + X"00431021", -- 00001C84 + X"000210C0", -- 00001C88 + X"00431021", -- 00001C8C + X"00021080", -- 00001C90 + X"16020017", -- 00001C94 + X"00000000", -- 00001C98 + X"3C0351EB", -- 00001C9C + X"3463851F", -- 00001CA0 + X"02030018", -- 00001CA4 + X"00001810", -- 00001CA8 + X"000319C3", -- 00001CAC + X"00641823", -- 00001CB0 + X"00031040", -- 00001CB4 + X"00431021", -- 00001CB8 + X"000210C0", -- 00001CBC + X"00431021", -- 00001CC0 + X"00021100", -- 00001CC4 + X"1202000A", -- 00001CC8 + X"00051080", -- 00001CCC + X"00461021", -- 00001CD0 + X"8C420000", -- 00001CD4 + X"00000000", -- 00001CD8 + X"0122182A", -- 00001CDC + X"1460000D", -- 00001CE0 + X"00000000", -- 00001CE4 + X"01224823", -- 00001CE8 + X"08100716", -- 00001CEC + X"26100001", -- 00001CF0 + X"24050001", -- 00001CF4 + X"00051080", -- 00001CF8 + X"00461021", -- 00001CFC + X"8C420000", -- 00001D00 + X"00000000", -- 00001D04 + X"0122182A", -- 00001D08 + X"1060FFF7", -- 00001D0C + X"01224823", -- 00001D10 + X"01224821", -- 00001D14 + X"00051040", -- 00001D18 + X"00451021", -- 00001D1C + X"00021100", -- 00001D20 + X"2603F894", -- 00001D24 + X"3C040000", -- 00001D28 + X"248400B8", -- 00001D2C + X"AE230014", -- 00001D30 + X"00449021", -- 00001D34 + X"AE29001C", -- 00001D38 + X"AE200010", -- 00001D3C + X"8E420000", -- 00001D40 + X"0810075F", -- 00001D44 + X"0122102A", -- 00001D48 + X"8E220010", -- 00001D4C + X"00000000", -- 00001D50 + X"24440001", -- 00001D54 + X"00021080", -- 00001D58 + X"00521021", -- 00001D5C + X"00041880", -- 00001D60 + X"8C450000", -- 00001D64 + X"00721821", -- 00001D68 + X"AE240010", -- 00001D6C + X"8C620000", -- 00001D70 + X"01254823", -- 00001D74 + X"0122102A", -- 00001D78 + X"1040FFF3", -- 00001D7C + X"25220001", -- 00001D80 + X"12A0003D", -- 00001D84 + X"AE22000C", -- 00001D88 + X"02201021", -- 00001D8C + X"AE200020", -- 00001D90 + X"8FBF0028", -- 00001D94 + X"8FB50024", -- 00001D98 + X"8FB40020", -- 00001D9C + X"8FB3001C", -- 00001DA0 + X"8FB20018", -- 00001DA4 + X"8FB10014", -- 00001DA8 + X"8FB00010", -- 00001DAC + X"03E00008", -- 00001DB0 + X"27BD0030", -- 00001DB4 + X"34425180", -- 00001DB8 + X"01024021", -- 00001DBC + X"0500FFFE", -- 00001DC0 + X"2529FFFF", -- 00001DC4 + X"081006DE", -- 00001DC8 + X"3C020001", -- 00001DCC + X"3C0251EB", -- 00001DD0 + X"3447851F", -- 00001DD4 + X"27860978", -- 00001DD8 + X"2610FFFF", -- 00001DDC + X"32020003", -- 00001DE0 + X"00002821", -- 00001DE4 + X"1440000C", -- 00001DE8 + X"001027C3", -- 00001DEC + X"02070018", -- 00001DF0 + X"00001810", -- 00001DF4 + X"00031943", -- 00001DF8 + X"00641823", -- 00001DFC + X"00031040", -- 00001E00 + X"00431021", -- 00001E04 + X"000210C0", -- 00001E08 + X"00431021", -- 00001E0C + X"00021080", -- 00001E10 + X"1602000C", -- 00001E14 + X"00000000", -- 00001E18 + X"02070018", -- 00001E1C + X"00001810", -- 00001E20 + X"000319C3", -- 00001E24 + X"00641823", -- 00001E28 + X"00031040", -- 00001E2C + X"00431021", -- 00001E30 + X"000210C0", -- 00001E34 + X"00431021", -- 00001E38 + X"00021100", -- 00001E3C + X"16020003", -- 00001E40 + X"00051080", -- 00001E44 + X"24050001", -- 00001E48 + X"00051080", -- 00001E4C + X"00461021", -- 00001E50 + X"8C430000", -- 00001E54 + X"00000000", -- 00001E58 + X"01234821", -- 00001E5C + X"0520FFDE", -- 00001E60 + X"00051040", -- 00001E64 + X"08100748", -- 00001E68 + X"00451021", -- 00001E6C + X"24A20007", -- 00001E70 + X"08100713", -- 00001E74 + X"AE220018", -- 00001E78 + X"0C1008E6", -- 00001E7C + X"00000000", -- 00001E80 + X"8F82099C", -- 00001E84 + X"00000000", -- 00001E88 + X"1040001B", -- 00001E8C + X"00000000", -- 00001E90 + X"8E620004", -- 00001E94 + X"00000000", -- 00001E98 + X"10500005", -- 00001E9C + X"00000000", -- 00001EA0 + X"0C100606", -- 00001EA4 + X"02002021", -- 00001EA8 + X"1040008C", -- 00001EAC + X"2402FFFF", -- 00001EB0 + X"8E620000", -- 00001EB4 + X"00000000", -- 00001EB8 + X"10400080", -- 00001EBC + X"00000000", -- 00001EC0 + X"8E840000", -- 00001EC4 + X"8E62001C", -- 00001EC8 + X"00000000", -- 00001ECC + X"0082102A", -- 00001ED0 + X"14400007", -- 00001ED4 + X"00001821", -- 00001ED8 + X"8E620038", -- 00001EDC + X"00000000", -- 00001EE0 + X"0082102A", -- 00001EE4 + X"10400002", -- 00001EE8 + X"00000000", -- 00001EEC + X"24030001", -- 00001EF0 + X"081007C0", -- 00001EF4 + X"AE230020", -- 00001EF8 + X"AE200020", -- 00001EFC + X"8E230020", -- 00001F00 + X"24020001", -- 00001F04 + X"10620068", -- 00001F08 + X"00000000", -- 00001F0C + X"8E690020", -- 00001F10 + X"3C0491A2", -- 00001F14 + X"3484B3C5", -- 00001F18 + X"01240018", -- 00001F1C + X"00091FC3", -- 00001F20 + X"8E270000", -- 00001F24 + X"8E280004", -- 00001F28 + X"8E260008", -- 00001F2C + X"00002010", -- 00001F30 + X"00892021", -- 00001F34 + X"000422C3", -- 00001F38 + X"00832023", -- 00001F3C + X"000410C0", -- 00001F40 + X"00441023", -- 00001F44 + X"00021140", -- 00001F48 + X"00441021", -- 00001F4C + X"00021100", -- 00001F50 + X"3C038888", -- 00001F54 + X"01224823", -- 00001F58 + X"34638889", -- 00001F5C + X"01230018", -- 00001F60 + X"00092FC3", -- 00001F64 + X"00C43023", -- 00001F68 + X"00C02021", -- 00001F6C + X"00001810", -- 00001F70 + X"00691821", -- 00001F74 + X"00031943", -- 00001F78 + X"00651823", -- 00001F7C + X"00031100", -- 00001F80 + X"00431023", -- 00001F84 + X"00021080", -- 00001F88 + X"01221023", -- 00001F8C + X"00E22823", -- 00001F90 + X"01034023", -- 00001F94 + X"28A2003C", -- 00001F98 + X"1440003F", -- 00001F9C + X"01001821", -- 00001FA0 + X"25080001", -- 00001FA4 + X"24A2FFC4", -- 00001FA8 + X"01001821", -- 00001FAC + X"AE220000", -- 00001FB0 + X"2862003C", -- 00001FB4 + X"14400034", -- 00001FB8 + X"00000000", -- 00001FBC + X"24860001", -- 00001FC0 + X"2463FFC4", -- 00001FC4 + X"00C02021", -- 00001FC8 + X"AE230004", -- 00001FCC + X"28820018", -- 00001FD0 + X"14400027", -- 00001FD4 + X"00000000", -- 00001FD8 + X"8E220018", -- 00001FDC + X"8E23001C", -- 00001FE0 + X"24450001", -- 00001FE4 + X"24630001", -- 00001FE8 + X"28A20007", -- 00001FEC + X"14400031", -- 00001FF0 + X"AE23001C", -- 00001FF4 + X"AE200018", -- 00001FF8 + X"8E22000C", -- 00001FFC + X"8E260010", -- 00002000 + X"24450001", -- 00002004 + X"2484FFE8", -- 00002008 + X"00061080", -- 0000200C + X"AE240008", -- 00002010 + X"00521021", -- 00002014 + X"AE25000C", -- 00002018 + X"8C420000", -- 0000201C + X"00000000", -- 00002020 + X"0045182A", -- 00002024 + X"10600006", -- 00002028 + X"00A21823", -- 0000202C + X"24C40001", -- 00002030 + X"2402000C", -- 00002034 + X"1082004E", -- 00002038 + X"AE23000C", -- 0000203C + X"AE240010", -- 00002040 + X"0C1008E8", -- 00002044 + X"00000000", -- 00002048 + X"02201021", -- 0000204C + X"8FBF0028", -- 00002050 + X"8FB50024", -- 00002054 + X"8FB40020", -- 00002058 + X"8FB3001C", -- 0000205C + X"8FB20018", -- 00002060 + X"8FB10014", -- 00002064 + X"8FB00010", -- 00002068 + X"03E00008", -- 0000206C + X"27BD0030", -- 00002070 + X"04800023", -- 00002074 + X"00000000", -- 00002078 + X"0C1008E8", -- 0000207C + X"AE260008", -- 00002080 + X"08100814", -- 00002084 + X"02201021", -- 00002088 + X"04600019", -- 0000208C + X"2462003C", -- 00002090 + X"081007F4", -- 00002094 + X"AE280004", -- 00002098 + X"04A00012", -- 0000209C + X"00000000", -- 000020A0 + X"081007ED", -- 000020A4 + X"AE250000", -- 000020A8 + X"8E69003C", -- 000020AC + X"081007C6", -- 000020B0 + X"3C0491A2", -- 000020B4 + X"081007FF", -- 000020B8 + X"AE250018", -- 000020BC + X"8E840000", -- 000020C0 + X"8E62001C", -- 000020C4 + X"00000000", -- 000020C8 + X"0082102A", -- 000020CC + X"1040FF87", -- 000020D0 + X"00001821", -- 000020D4 + X"081007B7", -- 000020D8 + X"00000000", -- 000020DC + X"081007C0", -- 000020E0 + X"AE220020", -- 000020E4 + X"2508FFFF", -- 000020E8 + X"081007EB", -- 000020EC + X"24A2003C", -- 000020F0 + X"2486FFFF", -- 000020F4 + X"00C02021", -- 000020F8 + X"081007F4", -- 000020FC + X"AE220004", -- 00002100 + X"8E220018", -- 00002104 + X"8E23001C", -- 00002108 + X"2445FFFF", -- 0000210C + X"04A00024", -- 00002110 + X"2466FFFF", -- 00002114 + X"AE250018", -- 00002118 + X"8E22000C", -- 0000211C + X"24830018", -- 00002120 + X"2442FFFF", -- 00002124 + X"AE230008", -- 00002128 + X"14400019", -- 0000212C + X"AE22000C", -- 00002130 + X"8E220010", -- 00002134 + X"00000000", -- 00002138 + X"2444FFFF", -- 0000213C + X"0480001B", -- 00002140 + X"00000000", -- 00002144 + X"AE240010", -- 00002148 + X"AE26001C", -- 0000214C + X"8E220010", -- 00002150 + X"00000000", -- 00002154 + X"00021080", -- 00002158 + X"00521021", -- 0000215C + X"8C430000", -- 00002160 + X"0C1008E8", -- 00002164 + X"AE23000C", -- 00002168 + X"08100814", -- 0000216C + X"02201021", -- 00002170 + X"8E220014", -- 00002174 + X"AE200010", -- 00002178 + X"24420001", -- 0000217C + X"AE220014", -- 00002180 + X"0C1008E8", -- 00002184 + X"AE20001C", -- 00002188 + X"08100814", -- 0000218C + X"02201021", -- 00002190 + X"0C1008E8", -- 00002194 + X"AE26001C", -- 00002198 + X"08100814", -- 0000219C + X"02201021", -- 000021A0 + X"24020006", -- 000021A4 + X"08100847", -- 000021A8 + X"AE220018", -- 000021AC + X"8E220014", -- 000021B0 + X"00003021", -- 000021B4 + X"2444FFFF", -- 000021B8 + X"30830003", -- 000021BC + X"2402000B", -- 000021C0 + X"AE220010", -- 000021C4 + X"AE240014", -- 000021C8 + X"1460000E", -- 000021CC + X"00042FC3", -- 000021D0 + X"3C0351EB", -- 000021D4 + X"3463851F", -- 000021D8 + X"00830018", -- 000021DC + X"00001810", -- 000021E0 + X"00031943", -- 000021E4 + X"00651823", -- 000021E8 + X"00031040", -- 000021EC + X"00431021", -- 000021F0 + X"000210C0", -- 000021F4 + X"00431021", -- 000021F8 + X"00021080", -- 000021FC + X"1482000E", -- 00002200 + X"00000000", -- 00002204 + X"3C0351EB", -- 00002208 + X"3463851F", -- 0000220C + X"00830018", -- 00002210 + X"00001810", -- 00002214 + X"000319C3", -- 00002218 + X"00651823", -- 0000221C + X"00031040", -- 00002220 + X"00431021", -- 00002224 + X"000210C0", -- 00002228 + X"00431021", -- 0000222C + X"00021100", -- 00002230 + X"14820002", -- 00002234 + X"00000000", -- 00002238 + X"24060001", -- 0000223C + X"24C2016D", -- 00002240 + X"08100854", -- 00002244 + X"AE22001C", -- 00002248 + X"03E00008", -- 0000224C + X"00000000", -- 00002250 + X"03E00008", -- 00002254 + X"00000000", -- 00002258 + X"8F82096C", -- 0000225C + X"00002821", -- 00002260 + X"AC4400A8", -- 00002264 + X"03E00008", -- 00002268 + X"AC4500AC", -- 0000226C + X"8F88096C", -- 00002270 + X"3C045851", -- 00002274 + X"8D0600A8", -- 00002278 + X"3484F42D", -- 0000227C + X"00C40018", -- 00002280 + X"3C054C95", -- 00002284 + X"34A57F2D", -- 00002288 + X"8D0700AC", -- 0000228C + X"00002012", -- 00002290 + X"00000000", -- 00002294 + X"00000000", -- 00002298 + X"00C50019", -- 0000229C + X"00001810", -- 000022A0 + X"00832021", -- 000022A4 + X"00001012", -- 000022A8 + X"24420001", -- 000022AC + X"2C460001", -- 000022B0 + X"00E50018", -- 000022B4 + X"AD0200A8", -- 000022B8 + X"3C027FFF", -- 000022BC + X"3442FFFF", -- 000022C0 + X"00002812", -- 000022C4 + X"00851821", -- 000022C8 + X"00661821", -- 000022CC + X"00032002", -- 000022D0 + X"00441024", -- 000022D4 + X"03E00008", -- 000022D8 + X"AD0300AC", -- 000022DC + X"27BDFFE8", -- 000022E0 + X"AFB00010", -- 000022E4 + X"00808021", -- 000022E8 + X"00A02021", -- 000022EC + X"AFBF0014", -- 000022F0 + X"0C100198", -- 000022F4 + X"AF800B1C", -- 000022F8 + X"00401821", -- 000022FC + X"2402FFFF", -- 00002300 + X"10620006", -- 00002304 + X"00000000", -- 00002308 + X"8FBF0014", -- 0000230C + X"8FB00010", -- 00002310 + X"00601021", -- 00002314 + X"03E00008", -- 00002318 + X"27BD0018", -- 0000231C + X"8F820B1C", -- 00002320 + X"00000000", -- 00002324 + X"1040FFF8", -- 00002328 + X"00000000", -- 0000232C + X"081008C3", -- 00002330 + X"AE020000", -- 00002334 + X"27BDFFE0", -- 00002338 + X"AFB00018", -- 0000233C + X"00808021", -- 00002340 + X"8F84096C", -- 00002344 + X"27A50010", -- 00002348 + X"AFBF001C", -- 0000234C + X"0C100A08", -- 00002350 + X"00003021", -- 00002354 + X"04400007", -- 00002358 + X"2403FFFF", -- 0000235C + X"1200000A", -- 00002360 + X"00000000", -- 00002364 + X"8FA20010", -- 00002368 + X"00000000", -- 0000236C + X"AE020000", -- 00002370 + X"00401821", -- 00002374 + X"8FBF001C", -- 00002378 + X"8FB00018", -- 0000237C + X"00601021", -- 00002380 + X"03E00008", -- 00002384 + X"27BD0020", -- 00002388 + X"8FA20010", -- 0000238C + X"081008DE", -- 00002390 + X"00401821", -- 00002394 + X"03E00008", -- 00002398 + X"00000000", -- 0000239C + X"03E00008", -- 000023A0 + X"00000000", -- 000023A4 + X"27BDFFE0", -- 000023A8 + X"AFB20018", -- 000023AC + X"AFB10014", -- 000023B0 + X"AFB00010", -- 000023B4 + X"00809021", -- 000023B8 + X"AFBF001C", -- 000023BC + X"0C100893", -- 000023C0 + X"00A08021", -- 000023C4 + X"3C020000", -- 000023C8 + X"8C420528", -- 000023CC + X"02402021", -- 000023D0 + X"8C430004", -- 000023D4 + X"2402FFFC", -- 000023D8 + X"00628824", -- 000023DC + X"02308023", -- 000023E0 + X"26100FEF", -- 000023E4 + X"00108302", -- 000023E8 + X"2610FFFF", -- 000023EC + X"00108300", -- 000023F0 + X"2A021000", -- 000023F4 + X"14400009", -- 000023F8 + X"00002821", -- 000023FC + X"0C1008B8", -- 00002400 + X"00000000", -- 00002404 + X"3C030000", -- 00002408 + X"8C630528", -- 0000240C + X"02402021", -- 00002410 + X"00711821", -- 00002414 + X"1062000A", -- 00002418 + X"00102823", -- 0000241C + X"0C100895", -- 00002420 + X"00000000", -- 00002424 + X"00001021", -- 00002428 + X"8FBF001C", -- 0000242C + X"8FB20018", -- 00002430 + X"8FB10014", -- 00002434 + X"8FB00010", -- 00002438 + X"03E00008", -- 0000243C + X"27BD0020", -- 00002440 + X"0C1008B8", -- 00002444 + X"02402021", -- 00002448 + X"02301823", -- 0000244C + X"34660001", -- 00002450 + X"2403FFFF", -- 00002454 + X"02402021", -- 00002458 + X"1043000F", -- 0000245C + X"00002821", -- 00002460 + X"3C030000", -- 00002464 + X"8C630528", -- 00002468 + X"00000000", -- 0000246C + X"AC660004", -- 00002470 + X"3C020000", -- 00002474 + X"8C420AF4", -- 00002478 + X"00000000", -- 0000247C + X"00501023", -- 00002480 + X"3C010000", -- 00002484 + X"AC220AF4", -- 00002488 + X"0C100895", -- 0000248C + X"02402021", -- 00002490 + X"0810090B", -- 00002494 + X"24020001", -- 00002498 + X"0C1008B8", -- 0000249C + X"00000000", -- 000024A0 + X"3C050000", -- 000024A4 + X"8CA50528", -- 000024A8 + X"00401821", -- 000024AC + X"00458823", -- 000024B0 + X"2A220010", -- 000024B4 + X"02402021", -- 000024B8 + X"1440FFD8", -- 000024BC + X"36260001", -- 000024C0 + X"8F820970", -- 000024C4 + X"00000000", -- 000024C8 + X"00621023", -- 000024CC + X"3C010000", -- 000024D0 + X"AC220AF4", -- 000024D4 + X"08100908", -- 000024D8 + X"ACA60004", -- 000024DC + X"27BDFFE0", -- 000024E0 + X"AFB10014", -- 000024E4 + X"AFB00010", -- 000024E8 + X"AFBF0018", -- 000024EC + X"00A08021", -- 000024F0 + X"10A0003C", -- 000024F4 + X"00808821", -- 000024F8 + X"0C100893", -- 000024FC + X"00000000", -- 00002500 + X"260BFFF8", -- 00002504 + X"8D640004", -- 00002508 + X"2402FFFE", -- 0000250C + X"00824824", -- 00002510 + X"01693021", -- 00002514 + X"8CC30004", -- 00002518 + X"2402FFFC", -- 0000251C + X"00625024", -- 00002520 + X"3C020000", -- 00002524 + X"8C420528", -- 00002528 + X"3C0C0000", -- 0000252C + X"258C0520", -- 00002530 + X"10460053", -- 00002534 + X"30820001", -- 00002538 + X"ACCA0004", -- 0000253C + X"1440000D", -- 00002540 + X"00002021", -- 00002544 + X"8E05FFF8", -- 00002548 + X"3C020000", -- 0000254C + X"24420528", -- 00002550 + X"01655823", -- 00002554 + X"8D630008", -- 00002558 + X"00000000", -- 0000255C + X"10620087", -- 00002560 + X"01254821", -- 00002564 + X"8D68000C", -- 00002568 + X"00000000", -- 0000256C + X"AD030008", -- 00002570 + X"AC68000C", -- 00002574 + X"00CA1821", -- 00002578 + X"8C620004", -- 0000257C + X"00000000", -- 00002580 + X"30420001", -- 00002584 + X"1440000D", -- 00002588 + X"35220001", -- 0000258C + X"1480001A", -- 00002590 + X"012A4821", -- 00002594 + X"8CC30008", -- 00002598 + X"3C020000", -- 0000259C + X"24420528", -- 000025A0 + X"10620070", -- 000025A4 + X"00000000", -- 000025A8 + X"8CC8000C", -- 000025AC + X"00000000", -- 000025B0 + X"AD030008", -- 000025B4 + X"AC68000C", -- 000025B8 + X"35220001", -- 000025BC + X"01691821", -- 000025C0 + X"AD620004", -- 000025C4 + X"10800012", -- 000025C8 + X"AC690000", -- 000025CC + X"02202021", -- 000025D0 + X"8FBF0018", -- 000025D4 + X"8FB10014", -- 000025D8 + X"8FB00010", -- 000025DC + X"08100895", -- 000025E0 + X"27BD0020", -- 000025E4 + X"8FBF0018", -- 000025E8 + X"8FB10014", -- 000025EC + X"8FB00010", -- 000025F0 + X"03E00008", -- 000025F4 + X"27BD0020", -- 000025F8 + X"8CC30008", -- 000025FC + X"8CC8000C", -- 00002600 + X"00000000", -- 00002604 + X"AD030008", -- 00002608 + X"0810096F", -- 0000260C + X"AC68000C", -- 00002610 + X"2D220200", -- 00002614 + X"1040002F", -- 00002618 + X"00092242", -- 0000261C + X"000918C2", -- 00002620 + X"3C050000", -- 00002624 + X"24A50520", -- 00002628 + X"0460005E", -- 0000262C + X"00602021", -- 00002630 + X"000310C0", -- 00002634 + X"00454021", -- 00002638 + X"00042083", -- 0000263C + X"3C020000", -- 00002640 + X"8C420524", -- 00002644 + X"24030001", -- 00002648 + X"8D070008", -- 0000264C + X"00831804", -- 00002650 + X"00431025", -- 00002654 + X"AD68000C", -- 00002658 + X"AD670008", -- 0000265C + X"ACA20004", -- 00002660 + X"ACEB000C", -- 00002664 + X"AD0B0008", -- 00002668 + X"02202021", -- 0000266C + X"8FBF0018", -- 00002670 + X"8FB10014", -- 00002674 + X"8FB00010", -- 00002678 + X"08100895", -- 0000267C + X"27BD0020", -- 00002680 + X"14400009", -- 00002684 + X"012A4821", -- 00002688 + X"8E05FFF8", -- 0000268C + X"00000000", -- 00002690 + X"01655823", -- 00002694 + X"8D68000C", -- 00002698 + X"8D670008", -- 0000269C + X"01254821", -- 000026A0 + X"AD070008", -- 000026A4 + X"ACE8000C", -- 000026A8 + X"8F820974", -- 000026AC + X"35230001", -- 000026B0 + X"0122102B", -- 000026B4 + X"AD8B0008", -- 000026B8 + X"1440FFC4", -- 000026BC + X"AD630004", -- 000026C0 + X"8F850994", -- 000026C4 + X"0C1008EA", -- 000026C8 + X"02202021", -- 000026CC + X"08100975", -- 000026D0 + X"02202021", -- 000026D4 + X"1480001D", -- 000026D8 + X"000918C2", -- 000026DC + X"000310C0", -- 000026E0 + X"004C4021", -- 000026E4 + X"8D070008", -- 000026E8 + X"00000000", -- 000026EC + X"10E8002F", -- 000026F0 + X"00000000", -- 000026F4 + X"8CE20004", -- 000026F8 + X"2403FFFC", -- 000026FC + X"00431024", -- 00002700 + X"0122102B", -- 00002704 + X"1040000B", -- 00002708 + X"00000000", -- 0000270C + X"8CE70008", -- 00002710 + X"00000000", -- 00002714 + X"10E80007", -- 00002718 + X"00000000", -- 0000271C + X"8CE20004", -- 00002720 + X"00000000", -- 00002724 + X"00431024", -- 00002728 + X"0122102B", -- 0000272C + X"1440FFF7", -- 00002730 + X"00000000", -- 00002734 + X"8CE8000C", -- 00002738 + X"AD670008", -- 0000273C + X"AD68000C", -- 00002740 + X"AD0B0008", -- 00002744 + X"0810099B", -- 00002748 + X"ACEB000C", -- 0000274C + X"2C820005", -- 00002750 + X"1040000C", -- 00002754 + X"2C820015", -- 00002758 + X"00091182", -- 0000275C + X"081009B8", -- 00002760 + X"24430038", -- 00002764 + X"24040001", -- 00002768 + X"AC6B000C", -- 0000276C + X"AC6B0008", -- 00002770 + X"AD63000C", -- 00002774 + X"0810096F", -- 00002778 + X"AD630008", -- 0000277C + X"0810095E", -- 00002780 + X"24040001", -- 00002784 + X"1440FFD5", -- 00002788 + X"2483005B", -- 0000278C + X"2C820055", -- 00002790 + X"10400016", -- 00002794 + X"2C820155", -- 00002798 + X"00091302", -- 0000279C + X"081009B8", -- 000027A0 + X"2443006E", -- 000027A4 + X"0810098D", -- 000027A8 + X"24640003", -- 000027AC + X"04600014", -- 000027B0 + X"00601021", -- 000027B4 + X"00021083", -- 000027B8 + X"3C040000", -- 000027BC + X"8C840524", -- 000027C0 + X"24030001", -- 000027C4 + X"00431804", -- 000027C8 + X"00832025", -- 000027CC + X"3C020000", -- 000027D0 + X"24420520", -- 000027D4 + X"AD68000C", -- 000027D8 + X"AD670008", -- 000027DC + X"AC440004", -- 000027E0 + X"ACEB000C", -- 000027E4 + X"0810099B", -- 000027E8 + X"AD0B0008", -- 000027EC + X"10400006", -- 000027F0 + X"2C820555", -- 000027F4 + X"000913C2", -- 000027F8 + X"081009B8", -- 000027FC + X"24430077", -- 00002800 + X"081009EE", -- 00002804 + X"24620003", -- 00002808 + X"1040FFB4", -- 0000280C + X"2403007E", -- 00002810 + X"00091482", -- 00002814 + X"081009B8", -- 00002818 + X"2443007C", -- 0000281C + X"27BDFFE8", -- 00002820 + X"AFB00010", -- 00002824 + X"00808021", -- 00002828 + X"00A02021", -- 0000282C + X"00C02821", -- 00002830 + X"AFBF0014", -- 00002834 + X"0C10016D", -- 00002838 + X"AF800B1C", -- 0000283C + X"00401821", -- 00002840 + X"2402FFFF", -- 00002844 + X"10620006", -- 00002848 + X"00000000", -- 0000284C + X"8FBF0014", -- 00002850 + X"8FB00010", -- 00002854 + X"00601021", -- 00002858 + X"03E00008", -- 0000285C + X"27BD0018", -- 00002860 + X"8F820B1C", -- 00002864 + X"00000000", -- 00002868 + X"1040FFF8", -- 0000286C + X"00000000", -- 00002870 + X"AE020000", -- 00002874 + X"8FBF0014", -- 00002878 + X"8FB00010", -- 0000287C + X"00601021", -- 00002880 + X"03E00008", -- 00002884 + X"27BD0018", -- 00002888 + X"3C020000", -- 0000288C + X"03E00008", -- 00002890 + X"24420928", -- 00002894 + X"27BDFFE0", -- 00002898 + X"AFB10014", -- 0000289C + X"AFB00010", -- 000028A0 + X"AFBF0018", -- 000028A4 + X"8CA20000", -- 000028A8 + X"00A08821", -- 000028AC + X"00808021", -- 000028B0 + X"14400008", -- 000028B4 + X"00402821", -- 000028B8 + X"02002021", -- 000028BC + X"02202821", -- 000028C0 + X"8FBF0018", -- 000028C4 + X"8FB10014", -- 000028C8 + X"8FB00010", -- 000028CC + X"08100938", -- 000028D0 + X"27BD0020", -- 000028D4 + X"0C100A26", -- 000028D8 + X"00000000", -- 000028DC + X"02002021", -- 000028E0 + X"02202821", -- 000028E4 + X"8FBF0018", -- 000028E8 + X"8FB10014", -- 000028EC + X"8FB00010", -- 000028F0 + X"08100938", -- 000028F4 + X"27BD0020", -- 000028F8 + X"8F82096C", -- 000028FC + X"27BDFFE0", -- 00002900 + X"AFB10014", -- 00002904 + X"AFBF001C", -- 00002908 + X"AFB20018", -- 0000290C + X"AFB00010", -- 00002910 + X"1082001F", -- 00002914 + X"00808821", -- 00002918 + X"8C85004C", -- 0000291C + X"00000000", -- 00002920 + X"14A00021", -- 00002924 + X"00000000", -- 00002928 + X"8E250040", -- 0000292C + X"00000000", -- 00002930 + X"14A00035", -- 00002934 + X"00000000", -- 00002938 + X"8E250148", -- 0000293C + X"00000000", -- 00002940 + X"10A0000B", -- 00002944 + X"00000000", -- 00002948 + X"2632014C", -- 0000294C + X"10B20008", -- 00002950 + X"00000000", -- 00002954 + X"08100A5B", -- 00002958 + X"00A08021", -- 0000295C + X"8E100000", -- 00002960 + X"0C100938", -- 00002964 + X"02202021", -- 00002968 + X"1650FFFC", -- 0000296C + X"02002821", -- 00002970 + X"8E250054", -- 00002974 + X"00000000", -- 00002978 + X"14A00036", -- 0000297C + X"00000000", -- 00002980 + X"8E220038", -- 00002984 + X"00000000", -- 00002988 + X"14400023", -- 0000298C + X"00000000", -- 00002990 + X"8FBF001C", -- 00002994 + X"8FB20018", -- 00002998 + X"8FB10014", -- 0000299C + X"8FB00010", -- 000029A0 + X"03E00008", -- 000029A4 + X"27BD0020", -- 000029A8 + X"00009021", -- 000029AC + X"00121080", -- 000029B0 + X"00451021", -- 000029B4 + X"8C500000", -- 000029B8 + X"00000000", -- 000029BC + X"12000008", -- 000029C0 + X"00000000", -- 000029C4 + X"02002821", -- 000029C8 + X"8E100000", -- 000029CC + X"0C100938", -- 000029D0 + X"02202021", -- 000029D4 + X"1600FFFC", -- 000029D8 + X"02002821", -- 000029DC + X"8E25004C", -- 000029E0 + X"26520001", -- 000029E4 + X"2A42000F", -- 000029E8 + X"1440FFF1", -- 000029EC + X"00121080", -- 000029F0 + X"0C100938", -- 000029F4 + X"02202021", -- 000029F8 + X"8E250040", -- 000029FC + X"00000000", -- 00002A00 + X"10A0FFCD", -- 00002A04 + X"00000000", -- 00002A08 + X"0C100938", -- 00002A0C + X"02202021", -- 00002A10 + X"08100A4F", -- 00002A14 + X"00000000", -- 00002A18 + X"8E22003C", -- 00002A1C + X"00000000", -- 00002A20 + X"0040F809", -- 00002A24 + X"02202021", -- 00002A28 + X"8E2502E0", -- 00002A2C + X"00000000", -- 00002A30 + X"10A0FFD7", -- 00002A34 + X"00000000", -- 00002A38 + X"02202021", -- 00002A3C + X"8FBF001C", -- 00002A40 + X"8FB20018", -- 00002A44 + X"8FB10014", -- 00002A48 + X"8FB00010", -- 00002A4C + X"08100A26", -- 00002A50 + X"27BD0020", -- 00002A54 + X"0C100938", -- 00002A58 + X"02202021", -- 00002A5C + X"08100A61", -- 00002A60 + X"00000000", -- 00002A64 + X"27BDFFD8", -- 00002A68 + X"AFB3001C", -- 00002A6C + X"AFBF0020", -- 00002A70 + X"AFB20018", -- 00002A74 + X"AFB10014", -- 00002A78 + X"AFB00010", -- 00002A7C + X"10800028", -- 00002A80 + X"00809821", -- 00002A84 + X"8E720148", -- 00002A88 + X"00000000", -- 00002A8C + X"12400012", -- 00002A90 + X"00000000", -- 00002A94 + X"8E510004", -- 00002A98 + X"00000000", -- 00002A9C + X"2631FFFF", -- 00002AA0 + X"06200009", -- 00002AA4 + X"00111080", -- 00002AA8 + X"00521021", -- 00002AAC + X"24500008", -- 00002AB0 + X"8E020000", -- 00002AB4 + X"00000000", -- 00002AB8 + X"0040F809", -- 00002ABC + X"2631FFFF", -- 00002AC0 + X"0621FFFB", -- 00002AC4 + X"2610FFFC", -- 00002AC8 + X"8E520000", -- 00002ACC + X"00000000", -- 00002AD0 + X"1640FFF0", -- 00002AD4 + X"00000000", -- 00002AD8 + X"8E79003C", -- 00002ADC + X"00000000", -- 00002AE0 + X"17200008", -- 00002AE4 + X"02602021", -- 00002AE8 + X"8FBF0020", -- 00002AEC + X"8FB3001C", -- 00002AF0 + X"8FB20018", -- 00002AF4 + X"8FB10014", -- 00002AF8 + X"8FB00010", -- 00002AFC + X"03E00008", -- 00002B00 + X"27BD0028", -- 00002B04 + X"8FBF0020", -- 00002B08 + X"8FB3001C", -- 00002B0C + X"8FB20018", -- 00002B10 + X"8FB10014", -- 00002B14 + X"8FB00010", -- 00002B18 + X"03200008", -- 00002B1C + X"27BD0028", -- 00002B20 + X"8F93096C", -- 00002B24 + X"08100AA2", -- 00002B28 + X"00000000", -- 00002B2C + X"00000000", -- 00002B30 + X"00000000", -- 00002B34 + X"00000000", -- 00002B38 + X"00000000", -- 00002B3C + X"00000000", -- 00002B40 + X"00000000", -- 00002B44 + X"00000000", -- 00002B48 + X"00000000", -- 00002B4C + X"00000000", -- 00002B50 + X"00000000", -- 00002B54 + X"00000000", -- 00002B58 + X"00000000", -- 00002B5C + X"00000000", -- 00002B60 + X"00000000", -- 00002B64 + X"00000000", -- 00002B68 + X"00000000", -- 00002B6C + X"00000000", -- 00002B70 + X"00000000", -- 00002B74 + X"00000000", -- 00002B78 + X"00000000", -- 00002B7C + X"00000000", -- 00002B80 + X"00000000", -- 00002B84 + X"00000000", -- 00002B88 + X"00000000", -- 00002B8C + X"00000000", -- 00002B90 + X"00000000", -- 00002B94 + X"00000000", -- 00002B98 + X"00000000", -- 00002B9C + X"00000000", -- 00002BA0 + X"00000000", -- 00002BA4 + X"00000000", -- 00002BA8 + X"00000000", -- 00002BAC + X"00000000", -- 00002BB0 + X"00000000", -- 00002BB4 + X"00000000", -- 00002BB8 + X"00000000", -- 00002BBC + X"00000000", -- 00002BC0 + X"00000000", -- 00002BC4 + X"00000000", -- 00002BC8 + X"00000000", -- 00002BCC + X"00000000", -- 00002BD0 + X"00000000", -- 00002BD4 + X"00000000", -- 00002BD8 + X"00000000", -- 00002BDC + X"00000000", -- 00002BE0 + X"00000000", -- 00002BE4 + X"00000000", -- 00002BE8 + X"00000000", -- 00002BEC + X"00000000", -- 00002BF0 + X"00000000", -- 00002BF4 + X"00000000", -- 00002BF8 + X"00000000", -- 00002BFC + X"00000000", -- 00002C00 + X"00000000", -- 00002C04 + X"00000000", -- 00002C08 + X"00000000", -- 00002C0C + X"00000000", -- 00002C10 + X"00000000", -- 00002C14 + X"00000000", -- 00002C18 + X"00000000", -- 00002C1C + X"00000000", -- 00002C20 + X"00000000", -- 00002C24 + X"00000000", -- 00002C28 + X"00000000", -- 00002C2C + X"00000000", -- 00002C30 + X"00000000", -- 00002C34 + X"00000000", -- 00002C38 + X"00000000", -- 00002C3C + X"00000000", -- 00002C40 + X"00000000", -- 00002C44 + X"00000000", -- 00002C48 + X"00000000", -- 00002C4C + X"00000000", -- 00002C50 + X"00000000", -- 00002C54 + X"00000000", -- 00002C58 + X"00000000", -- 00002C5C + X"00000000", -- 00002C60 + X"00000000", -- 00002C64 + X"00000000", -- 00002C68 + X"00000000", -- 00002C6C + X"00000000", -- 00002C70 + X"00000000", -- 00002C74 + X"00000000", -- 00002C78 + X"00000000", -- 00002C7C + X"00000000", -- 00002C80 + X"00000000", -- 00002C84 + X"00000000", -- 00002C88 + X"00000000", -- 00002C8C + X"00000000", -- 00002C90 + X"00000000", -- 00002C94 + X"00000000", -- 00002C98 + X"00000000", -- 00002C9C + X"00000000", -- 00002CA0 + X"00000000", -- 00002CA4 + X"00000000", -- 00002CA8 + X"00000000", -- 00002CAC + X"00000000", -- 00002CB0 + X"00000000", -- 00002CB4 + X"00000000", -- 00002CB8 + X"00000000", -- 00002CBC + X"00000000", -- 00002CC0 + X"00000000", -- 00002CC4 + X"00000000", -- 00002CC8 + X"00000000", -- 00002CCC + X"00000000", -- 00002CD0 + X"00000000", -- 00002CD4 + X"00000000", -- 00002CD8 + X"00000000", -- 00002CDC + X"00000000", -- 00002CE0 + X"00000000", -- 00002CE4 + X"00000000", -- 00002CE8 + X"00000000", -- 00002CEC + X"00000000", -- 00002CF0 + X"00000000", -- 00002CF4 + X"00000000", -- 00002CF8 + X"00000000", -- 00002CFC + X"00000000", -- 00002D00 + X"00000000", -- 00002D04 + X"00000000", -- 00002D08 + X"00000000", -- 00002D0C + X"00000000", -- 00002D10 + X"00000000", -- 00002D14 + X"00000000", -- 00002D18 + X"00000000", -- 00002D1C + X"00000000", -- 00002D20 + X"00000000", -- 00002D24 + X"00000000", -- 00002D28 + X"00000000", -- 00002D2C + X"00000000", -- 00002D30 + X"00000000", -- 00002D34 + X"00000000", -- 00002D38 + X"00000000", -- 00002D3C + X"00000000", -- 00002D40 + X"00000000", -- 00002D44 + X"00000000", -- 00002D48 + X"00000000", -- 00002D4C + X"00000000", -- 00002D50 + X"00000000", -- 00002D54 + X"00000000", -- 00002D58 + X"00000000", -- 00002D5C + X"00000000", -- 00002D60 + X"00000000", -- 00002D64 + X"00000000", -- 00002D68 + X"00000000", -- 00002D6C + X"00000000", -- 00002D70 + X"00000000", -- 00002D74 + X"00000000", -- 00002D78 + X"00000000", -- 00002D7C + X"00000000", -- 00002D80 + X"00000000", -- 00002D84 + X"00000000", -- 00002D88 + X"00000000", -- 00002D8C + X"00000000", -- 00002D90 + X"00000000", -- 00002D94 + X"00000000", -- 00002D98 + X"00000000", -- 00002D9C + X"00000000", -- 00002DA0 + X"00000000", -- 00002DA4 + X"00000000", -- 00002DA8 + X"00000000", -- 00002DAC + X"00000000", -- 00002DB0 + X"00000000", -- 00002DB4 + X"00000000", -- 00002DB8 + X"00000000", -- 00002DBC + X"00000000", -- 00002DC0 + X"00000000", -- 00002DC4 + X"00000000", -- 00002DC8 + X"00000000", -- 00002DCC + X"00000000", -- 00002DD0 + X"00000000", -- 00002DD4 + X"00000000", -- 00002DD8 + X"00000000", -- 00002DDC + X"00000000", -- 00002DE0 + X"00000000", -- 00002DE4 + X"00000000", -- 00002DE8 + X"00000000", -- 00002DEC + X"00000000", -- 00002DF0 + X"00000000", -- 00002DF4 + X"00000000", -- 00002DF8 + X"00000000", -- 00002DFC + X"00000000", -- 00002E00 + X"00000000", -- 00002E04 + X"00000000", -- 00002E08 + X"00000000", -- 00002E0C + X"00000000", -- 00002E10 + X"00000000", -- 00002E14 + X"00000000", -- 00002E18 + X"00000000", -- 00002E1C + X"00000000", -- 00002E20 + X"00000000", -- 00002E24 + X"00000000", -- 00002E28 + X"00000000", -- 00002E2C + X"00000000", -- 00002E30 + X"00000000", -- 00002E34 + X"00000000", -- 00002E38 + X"00000000", -- 00002E3C + X"00000000", -- 00002E40 + X"00000000", -- 00002E44 + X"00000000", -- 00002E48 + X"00000000", -- 00002E4C + X"00000000", -- 00002E50 + X"00000000", -- 00002E54 + X"00000000", -- 00002E58 + X"00000000", -- 00002E5C + X"00000000", -- 00002E60 + X"00000000", -- 00002E64 + X"00000000", -- 00002E68 + X"00000000", -- 00002E6C + X"00000000", -- 00002E70 + X"00000000", -- 00002E74 + X"00000000", -- 00002E78 + X"00000000", -- 00002E7C + X"00000000", -- 00002E80 + X"00000000", -- 00002E84 + X"00000000", -- 00002E88 + X"00000000", -- 00002E8C + X"00000000", -- 00002E90 + X"00000000", -- 00002E94 + X"00000000", -- 00002E98 + X"00000000", -- 00002E9C + X"00000000", -- 00002EA0 + X"00000000", -- 00002EA4 + X"00000000", -- 00002EA8 + X"00000000", -- 00002EAC + X"00000000", -- 00002EB0 + X"00000000", -- 00002EB4 + X"00000000", -- 00002EB8 + X"00000000", -- 00002EBC + X"00000000", -- 00002EC0 + X"00000000", -- 00002EC4 + X"00000000", -- 00002EC8 + X"00000000", -- 00002ECC + X"00000000", -- 00002ED0 + X"00000000", -- 00002ED4 + X"00000000", -- 00002ED8 + X"00000000", -- 00002EDC + X"00000000", -- 00002EE0 + X"00000000", -- 00002EE4 + X"00000000", -- 00002EE8 + X"00000000", -- 00002EEC + X"00000000", -- 00002EF0 + X"00000000", -- 00002EF4 + X"00000000", -- 00002EF8 + X"00000000", -- 00002EFC + X"00000000", -- 00002F00 + X"00000000", -- 00002F04 + X"00000000", -- 00002F08 + X"00000000", -- 00002F0C + X"00000000", -- 00002F10 + X"00000000", -- 00002F14 + X"00000000", -- 00002F18 + X"00000000", -- 00002F1C + X"00000000", -- 00002F20 + X"00000000", -- 00002F24 + X"00000000", -- 00002F28 + X"00000000", -- 00002F2C + X"00000000", -- 00002F30 + X"00000000", -- 00002F34 + X"00000000", -- 00002F38 + X"00000000", -- 00002F3C + X"00000000", -- 00002F40 + X"00000000", -- 00002F44 + X"00000000", -- 00002F48 + X"00000000", -- 00002F4C + X"00000000", -- 00002F50 + X"00000000", -- 00002F54 + X"00000000", -- 00002F58 + X"00000000", -- 00002F5C + X"00000000", -- 00002F60 + X"00000000", -- 00002F64 + X"00000000", -- 00002F68 + X"00000000", -- 00002F6C + X"00000000", -- 00002F70 + X"00000000", -- 00002F74 + X"00000000", -- 00002F78 + X"00000000", -- 00002F7C + X"00000000", -- 00002F80 + X"00000000", -- 00002F84 + X"00000000", -- 00002F88 + X"00000000", -- 00002F8C + X"00000000", -- 00002F90 + X"00000000", -- 00002F94 + X"00000000", -- 00002F98 + X"00000000", -- 00002F9C + X"00000000", -- 00002FA0 + X"00000000", -- 00002FA4 + X"00000000", -- 00002FA8 + X"00000000", -- 00002FAC + X"00000000", -- 00002FB0 + X"00000000", -- 00002FB4 + X"00000000", -- 00002FB8 + X"00000000", -- 00002FBC + X"00000000", -- 00002FC0 + X"00000000", -- 00002FC4 + X"00000000", -- 00002FC8 + X"00000000", -- 00002FCC + X"00000000", -- 00002FD0 + X"00000000", -- 00002FD4 + X"00000000", -- 00002FD8 + X"00000000", -- 00002FDC + X"00000000", -- 00002FE0 + X"00000000", -- 00002FE4 + X"00000000", -- 00002FE8 + X"00000000", -- 00002FEC + X"00000000", -- 00002FF0 + X"00000000", -- 00002FF4 + X"00000000", -- 00002FF8 + X"00000000", -- 00002FFC + X"00000000", -- 00003000 + X"00000000", -- 00003004 + X"00000000", -- 00003008 + X"00000000", -- 0000300C + X"00000000", -- 00003010 + X"00000000", -- 00003014 + X"00000000", -- 00003018 + X"00000000", -- 0000301C + X"00000000", -- 00003020 + X"00000000", -- 00003024 + X"00000000", -- 00003028 + X"00000000", -- 0000302C + X"00000000", -- 00003030 + X"00000000", -- 00003034 + X"00000000", -- 00003038 + X"00000000", -- 0000303C + X"00000000", -- 00003040 + X"00000000", -- 00003044 + X"00000000", -- 00003048 + X"00000000", -- 0000304C + X"00000000", -- 00003050 + X"00000000", -- 00003054 + X"00000000", -- 00003058 + X"00000000", -- 0000305C + X"00000000", -- 00003060 + X"00000000", -- 00003064 + X"00000000", -- 00003068 + X"00000000", -- 0000306C + X"00000000", -- 00003070 + X"00000000", -- 00003074 + X"00000000", -- 00003078 + X"00000000", -- 0000307C + X"00000000", -- 00003080 + X"00000000", -- 00003084 + X"00000000", -- 00003088 + X"00000000", -- 0000308C + X"00000000", -- 00003090 + X"00000000", -- 00003094 + X"00000000", -- 00003098 + X"00000000", -- 0000309C + X"00000000", -- 000030A0 + X"00000000", -- 000030A4 + X"00000000", -- 000030A8 + X"00000000", -- 000030AC + X"00000000", -- 000030B0 + X"00000000", -- 000030B4 + X"00000000", -- 000030B8 + X"00000000", -- 000030BC + X"00000000", -- 000030C0 + X"00000000", -- 000030C4 + X"00000000", -- 000030C8 + X"00000000", -- 000030CC + X"00000000", -- 000030D0 + X"00000000", -- 000030D4 + X"00000000", -- 000030D8 + X"00000000", -- 000030DC + X"00000000", -- 000030E0 + X"00000000", -- 000030E4 + X"00000000", -- 000030E8 + X"00000000", -- 000030EC + X"00000000", -- 000030F0 + X"00000000", -- 000030F4 + X"00000000", -- 000030F8 + X"00000000", -- 000030FC + X"00000000", -- 00003100 + X"00000000", -- 00003104 + X"00000000", -- 00003108 + X"00000000", -- 0000310C + X"00000000", -- 00003110 + X"00000000", -- 00003114 + X"00000000", -- 00003118 + X"00000000", -- 0000311C + X"00000000", -- 00003120 + X"00000000", -- 00003124 + X"00000000", -- 00003128 + X"00000000", -- 0000312C + X"00000000", -- 00003130 + X"00000000", -- 00003134 + X"00000000", -- 00003138 + X"00000000", -- 0000313C + X"00000000", -- 00003140 + X"00000000", -- 00003144 + X"00000000", -- 00003148 + X"00000000", -- 0000314C + X"00000000", -- 00003150 + X"00000000", -- 00003154 + X"00000000", -- 00003158 + X"00000000", -- 0000315C + X"00000000", -- 00003160 + X"00000000", -- 00003164 + X"00000000", -- 00003168 + X"00000000", -- 0000316C + X"00000000", -- 00003170 + X"00000000", -- 00003174 + X"00000000", -- 00003178 + X"00000000", -- 0000317C + X"00000000", -- 00003180 + X"00000000", -- 00003184 + X"00000000", -- 00003188 + X"00000000", -- 0000318C + X"00000000", -- 00003190 + X"00000000", -- 00003194 + X"00000000", -- 00003198 + X"00000000", -- 0000319C + X"00000000", -- 000031A0 + X"00000000", -- 000031A4 + X"00000000", -- 000031A8 + X"00000000", -- 000031AC + X"00000000", -- 000031B0 + X"00000000", -- 000031B4 + X"00000000", -- 000031B8 + X"00000000", -- 000031BC + X"00000000", -- 000031C0 + X"00000000", -- 000031C4 + X"00000000", -- 000031C8 + X"00000000", -- 000031CC + X"00000000", -- 000031D0 + X"00000000", -- 000031D4 + X"00000000", -- 000031D8 + X"00000000", -- 000031DC + X"00000000", -- 000031E0 + X"00000000", -- 000031E4 + X"00000000", -- 000031E8 + X"00000000", -- 000031EC + X"00000000", -- 000031F0 + X"00000000", -- 000031F4 + X"00000000", -- 000031F8 + X"00000000", -- 000031FC + X"00000000", -- 00003200 + X"00000000", -- 00003204 + X"00000000", -- 00003208 + X"00000000", -- 0000320C + X"00000000", -- 00003210 + X"00000000", -- 00003214 + X"00000000", -- 00003218 + X"00000000", -- 0000321C + X"00000000", -- 00003220 + X"00000000", -- 00003224 + X"00000000", -- 00003228 + X"00000000", -- 0000322C + X"00000000", -- 00003230 + X"00000000", -- 00003234 + X"00000000", -- 00003238 + X"00000000", -- 0000323C + X"00000000", -- 00003240 + X"00000000", -- 00003244 + X"00000000", -- 00003248 + X"00000000", -- 0000324C + X"00000000", -- 00003250 + X"00000000", -- 00003254 + X"00000000", -- 00003258 + X"00000000", -- 0000325C + X"00000000", -- 00003260 + X"00000000", -- 00003264 + X"00000000", -- 00003268 + X"00000000", -- 0000326C + X"00000000", -- 00003270 + X"00000000", -- 00003274 + X"00000000", -- 00003278 + X"00000000", -- 0000327C + X"00000000", -- 00003280 + X"00000000", -- 00003284 + X"00000000", -- 00003288 + X"00000000", -- 0000328C + X"00000000", -- 00003290 + X"00000000", -- 00003294 + X"00000000", -- 00003298 + X"00000000", -- 0000329C + X"00000000", -- 000032A0 + X"00000000", -- 000032A4 + X"00000000", -- 000032A8 + X"00000000", -- 000032AC + X"00000000", -- 000032B0 + X"00000000", -- 000032B4 + X"00000000", -- 000032B8 + X"00000000", -- 000032BC + X"00000000", -- 000032C0 + X"00000000", -- 000032C4 + X"00000000", -- 000032C8 + X"00000000", -- 000032CC + X"00000000", -- 000032D0 + X"00000000", -- 000032D4 + X"00000000", -- 000032D8 + X"00000000", -- 000032DC + X"00000000", -- 000032E0 + X"00000000", -- 000032E4 + X"00000000", -- 000032E8 + X"00000000", -- 000032EC + X"00000000", -- 000032F0 + X"00000000", -- 000032F4 + X"00000000", -- 000032F8 + X"00000000", -- 000032FC + X"00000000", -- 00003300 + X"00000000", -- 00003304 + X"00000000", -- 00003308 + X"00000000", -- 0000330C + X"00000000", -- 00003310 + X"00000000", -- 00003314 + X"00000000", -- 00003318 + X"00000000", -- 0000331C + X"00000000", -- 00003320 + X"00000000", -- 00003324 + X"00000000", -- 00003328 + X"00000000", -- 0000332C + X"00000000", -- 00003330 + X"00000000", -- 00003334 + X"00000000", -- 00003338 + X"00000000", -- 0000333C + X"00000000", -- 00003340 + X"00000000", -- 00003344 + X"00000000", -- 00003348 + X"00000000", -- 0000334C + X"00000000", -- 00003350 + X"00000000", -- 00003354 + X"00000000", -- 00003358 + X"00000000", -- 0000335C + X"00000000", -- 00003360 + X"00000000", -- 00003364 + X"00000000", -- 00003368 + X"00000000", -- 0000336C + X"00000000", -- 00003370 + X"00000000", -- 00003374 + X"00000000", -- 00003378 + X"00000000", -- 0000337C + X"00000000", -- 00003380 + X"00000000", -- 00003384 + X"00000000", -- 00003388 + X"00000000", -- 0000338C + X"00000000", -- 00003390 + X"00000000", -- 00003394 + X"00000000", -- 00003398 + X"00000000", -- 0000339C + X"00000000", -- 000033A0 + X"00000000", -- 000033A4 + X"00000000", -- 000033A8 + X"00000000", -- 000033AC + X"00000000", -- 000033B0 + X"00000000", -- 000033B4 + X"00000000", -- 000033B8 + X"00000000", -- 000033BC + X"00000000", -- 000033C0 + X"00000000", -- 000033C4 + X"00000000", -- 000033C8 + X"00000000", -- 000033CC + X"00000000", -- 000033D0 + X"00000000", -- 000033D4 + X"00000000", -- 000033D8 + X"00000000", -- 000033DC + X"00000000", -- 000033E0 + X"00000000", -- 000033E4 + X"00000000", -- 000033E8 + X"00000000", -- 000033EC + X"00000000", -- 000033F0 + X"00000000", -- 000033F4 + X"00000000", -- 000033F8 + X"00000000", -- 000033FC + X"00000000", -- 00003400 + X"00000000", -- 00003404 + X"00000000", -- 00003408 + X"00000000", -- 0000340C + X"00000000", -- 00003410 + X"00000000", -- 00003414 + X"00000000", -- 00003418 + X"00000000", -- 0000341C + X"00000000", -- 00003420 + X"00000000", -- 00003424 + X"00000000", -- 00003428 + X"00000000", -- 0000342C + X"00000000", -- 00003430 + X"00000000", -- 00003434 + X"00000000", -- 00003438 + X"00000000", -- 0000343C + X"00000000", -- 00003440 + X"00000000", -- 00003444 + X"00000000", -- 00003448 + X"00000000", -- 0000344C + X"00000000", -- 00003450 + X"00000000", -- 00003454 + X"00000000", -- 00003458 + X"00000000", -- 0000345C + X"00000000", -- 00003460 + X"00000000", -- 00003464 + X"00000000", -- 00003468 + X"00000000", -- 0000346C + X"00000000", -- 00003470 + X"00000000", -- 00003474 + X"00000000", -- 00003478 + X"00000000", -- 0000347C + X"00000000", -- 00003480 + X"00000000", -- 00003484 + X"00000000", -- 00003488 + X"00000000", -- 0000348C + X"00000000", -- 00003490 + X"00000000", -- 00003494 + X"00000000", -- 00003498 + X"00000000", -- 0000349C + X"00000000", -- 000034A0 + X"00000000", -- 000034A4 + X"00000000", -- 000034A8 + X"00000000", -- 000034AC + X"00000000", -- 000034B0 + X"00000000", -- 000034B4 + X"00000000", -- 000034B8 + X"00000000", -- 000034BC + X"00000000", -- 000034C0 + X"00000000", -- 000034C4 + X"00000000", -- 000034C8 + X"00000000", -- 000034CC + X"00000000", -- 000034D0 + X"00000000", -- 000034D4 + X"00000000", -- 000034D8 + X"00000000", -- 000034DC + X"00000000", -- 000034E0 + X"00000000", -- 000034E4 + X"00000000", -- 000034E8 + X"00000000", -- 000034EC + X"00000000", -- 000034F0 + X"00000000", -- 000034F4 + X"00000000", -- 000034F8 + X"00000000", -- 000034FC + X"00000000", -- 00003500 + X"00000000", -- 00003504 + X"00000000", -- 00003508 + X"00000000", -- 0000350C + X"00000000", -- 00003510 + X"00000000", -- 00003514 + X"00000000", -- 00003518 + X"00000000", -- 0000351C + X"00000000", -- 00003520 + X"00000000", -- 00003524 + X"00000000", -- 00003528 + X"00000000", -- 0000352C + X"00000000", -- 00003530 + X"00000000", -- 00003534 + X"00000000", -- 00003538 + X"00000000", -- 0000353C + X"00000000", -- 00003540 + X"00000000", -- 00003544 + X"00000000", -- 00003548 + X"00000000", -- 0000354C + X"00000000", -- 00003550 + X"00000000", -- 00003554 + X"00000000", -- 00003558 + X"00000000", -- 0000355C + X"00000000", -- 00003560 + X"00000000", -- 00003564 + X"00000000", -- 00003568 + X"00000000", -- 0000356C + X"00000000", -- 00003570 + X"00000000", -- 00003574 + X"00000000", -- 00003578 + X"00000000", -- 0000357C + X"00000000", -- 00003580 + X"00000000", -- 00003584 + X"00000000", -- 00003588 + X"00000000", -- 0000358C + X"00000000", -- 00003590 + X"00000000", -- 00003594 + X"00000000", -- 00003598 + X"00000000", -- 0000359C + X"00000000", -- 000035A0 + X"00000000", -- 000035A4 + X"00000000", -- 000035A8 + X"00000000", -- 000035AC + X"00000000", -- 000035B0 + X"00000000", -- 000035B4 + X"00000000", -- 000035B8 + X"00000000", -- 000035BC + X"00000000", -- 000035C0 + X"00000000", -- 000035C4 + X"00000000", -- 000035C8 + X"00000000", -- 000035CC + X"00000000", -- 000035D0 + X"00000000", -- 000035D4 + X"00000000", -- 000035D8 + X"00000000", -- 000035DC + X"00000000", -- 000035E0 + X"00000000", -- 000035E4 + X"00000000", -- 000035E8 + X"00000000", -- 000035EC + X"00000000", -- 000035F0 + X"00000000", -- 000035F4 + X"00000000", -- 000035F8 + X"00000000", -- 000035FC + X"00000000", -- 00003600 + X"00000000", -- 00003604 + X"00000000", -- 00003608 + X"00000000", -- 0000360C + X"00000000", -- 00003610 + X"00000000", -- 00003614 + X"00000000", -- 00003618 + X"00000000", -- 0000361C + X"00000000", -- 00003620 + X"00000000", -- 00003624 + X"00000000", -- 00003628 + X"00000000", -- 0000362C + X"00000000", -- 00003630 + X"00000000", -- 00003634 + X"00000000", -- 00003638 + X"00000000", -- 0000363C + X"00000000", -- 00003640 + X"00000000", -- 00003644 + X"00000000", -- 00003648 + X"00000000", -- 0000364C + X"00000000", -- 00003650 + X"00000000", -- 00003654 + X"00000000", -- 00003658 + X"00000000", -- 0000365C + X"00000000", -- 00003660 + X"00000000", -- 00003664 + X"00000000", -- 00003668 + X"00000000", -- 0000366C + X"00000000", -- 00003670 + X"00000000", -- 00003674 + X"00000000", -- 00003678 + X"00000000", -- 0000367C + X"00000000", -- 00003680 + X"00000000", -- 00003684 + X"00000000", -- 00003688 + X"00000000", -- 0000368C + X"00000000", -- 00003690 + X"00000000", -- 00003694 + X"00000000", -- 00003698 + X"00000000", -- 0000369C + X"00000000", -- 000036A0 + X"00000000", -- 000036A4 + X"00000000", -- 000036A8 + X"00000000", -- 000036AC + X"00000000", -- 000036B0 + X"00000000", -- 000036B4 + X"00000000", -- 000036B8 + X"00000000", -- 000036BC + X"00000000", -- 000036C0 + X"00000000", -- 000036C4 + X"00000000", -- 000036C8 + X"00000000", -- 000036CC + X"00000000", -- 000036D0 + X"00000000", -- 000036D4 + X"00000000", -- 000036D8 + X"00000000", -- 000036DC + X"00000000", -- 000036E0 + X"00000000", -- 000036E4 + X"00000000", -- 000036E8 + X"00000000", -- 000036EC + X"00000000", -- 000036F0 + X"00000000", -- 000036F4 + X"00000000", -- 000036F8 + X"00000000", -- 000036FC + X"00000000", -- 00003700 + X"00000000", -- 00003704 + X"00000000", -- 00003708 + X"00000000", -- 0000370C + X"00000000", -- 00003710 + X"00000000", -- 00003714 + X"00000000", -- 00003718 + X"00000000", -- 0000371C + X"00000000", -- 00003720 + X"00000000", -- 00003724 + X"00000000", -- 00003728 + X"00000000", -- 0000372C + X"00000000", -- 00003730 + X"00000000", -- 00003734 + X"00000000", -- 00003738 + X"00000000", -- 0000373C + X"00000000", -- 00003740 + X"00000000", -- 00003744 + X"00000000", -- 00003748 + X"00000000", -- 0000374C + X"00000000", -- 00003750 + X"00000000", -- 00003754 + X"00000000", -- 00003758 + X"00000000", -- 0000375C + X"00000000", -- 00003760 + X"00000000", -- 00003764 + X"00000000", -- 00003768 + X"00000000", -- 0000376C + X"00000000", -- 00003770 + X"00000000", -- 00003774 + X"00000000", -- 00003778 + X"00000000", -- 0000377C + X"00000000", -- 00003780 + X"00000000", -- 00003784 + X"00000000", -- 00003788 + X"00000000", -- 0000378C + X"00000000", -- 00003790 + X"00000000", -- 00003794 + X"00000000", -- 00003798 + X"00000000", -- 0000379C + X"00000000", -- 000037A0 + X"00000000", -- 000037A4 + X"00000000", -- 000037A8 + X"00000000", -- 000037AC + X"00000000", -- 000037B0 + X"00000000", -- 000037B4 + X"00000000", -- 000037B8 + X"00000000", -- 000037BC + X"00000000", -- 000037C0 + X"00000000", -- 000037C4 + X"00000000", -- 000037C8 + X"00000000", -- 000037CC + X"00000000", -- 000037D0 + X"00000000", -- 000037D4 + X"00000000", -- 000037D8 + X"00000000", -- 000037DC + X"00000000", -- 000037E0 + X"00000000", -- 000037E4 + X"00000000", -- 000037E8 + X"00000000", -- 000037EC + X"00000000", -- 000037F0 + X"00000000", -- 000037F4 + X"00000000", -- 000037F8 + X"00000000", -- 000037FC + X"00000000", -- 00003800 + X"00000000", -- 00003804 + X"00000000", -- 00003808 + X"00000000", -- 0000380C + X"00000000", -- 00003810 + X"00000000", -- 00003814 + X"00000000", -- 00003818 + X"00000000", -- 0000381C + X"00000000", -- 00003820 + X"00000000", -- 00003824 + X"00000000", -- 00003828 + X"00000000", -- 0000382C + X"00000000", -- 00003830 + X"00000000", -- 00003834 + X"00000000", -- 00003838 + X"00000000", -- 0000383C + X"00000000", -- 00003840 + X"00000000", -- 00003844 + X"00000000", -- 00003848 + X"00000000", -- 0000384C + X"00000000", -- 00003850 + X"00000000", -- 00003854 + X"00000000", -- 00003858 + X"00000000", -- 0000385C + X"00000000", -- 00003860 + X"00000000", -- 00003864 + X"00000000", -- 00003868 + X"00000000", -- 0000386C + X"00000000", -- 00003870 + X"00000000", -- 00003874 + X"00000000", -- 00003878 + X"00000000", -- 0000387C + X"00000000", -- 00003880 + X"00000000", -- 00003884 + X"00000000", -- 00003888 + X"00000000", -- 0000388C + X"00000000", -- 00003890 + X"00000000", -- 00003894 + X"00000000", -- 00003898 + X"00000000", -- 0000389C + X"00000000", -- 000038A0 + X"00000000", -- 000038A4 + X"00000000", -- 000038A8 + X"00000000", -- 000038AC + X"00000000", -- 000038B0 + X"00000000", -- 000038B4 + X"00000000", -- 000038B8 + X"00000000", -- 000038BC + X"00000000", -- 000038C0 + X"00000000", -- 000038C4 + X"00000000", -- 000038C8 + X"00000000", -- 000038CC + X"00000000", -- 000038D0 + X"00000000", -- 000038D4 + X"00000000", -- 000038D8 + X"00000000", -- 000038DC + X"00000000", -- 000038E0 + X"00000000", -- 000038E4 + X"00000000", -- 000038E8 + X"00000000", -- 000038EC + X"00000000", -- 000038F0 + X"00000000", -- 000038F4 + X"00000000", -- 000038F8 + X"00000000", -- 000038FC + X"00000000", -- 00003900 + X"00000000", -- 00003904 + X"00000000", -- 00003908 + X"00000000", -- 0000390C + X"00000000", -- 00003910 + X"00000000", -- 00003914 + X"00000000", -- 00003918 + X"00000000", -- 0000391C + X"00000000", -- 00003920 + X"00000000", -- 00003924 + X"00000000", -- 00003928 + X"00000000", -- 0000392C + X"00000000", -- 00003930 + X"00000000", -- 00003934 + X"00000000", -- 00003938 + X"00000000", -- 0000393C + X"00000000", -- 00003940 + X"00000000", -- 00003944 + X"00000000", -- 00003948 + X"00000000", -- 0000394C + X"00000000", -- 00003950 + X"00000000", -- 00003954 + X"00000000", -- 00003958 + X"00000000", -- 0000395C + X"00000000", -- 00003960 + X"00000000", -- 00003964 + X"00000000", -- 00003968 + X"00000000", -- 0000396C + X"00000000", -- 00003970 + X"00000000", -- 00003974 + X"00000000", -- 00003978 + X"00000000", -- 0000397C + X"00000000", -- 00003980 + X"00000000", -- 00003984 + X"00000000", -- 00003988 + X"00000000", -- 0000398C + X"00000000", -- 00003990 + X"00000000", -- 00003994 + X"00000000", -- 00003998 + X"00000000", -- 0000399C + X"00000000", -- 000039A0 + X"00000000", -- 000039A4 + X"00000000", -- 000039A8 + X"00000000", -- 000039AC + X"00000000", -- 000039B0 + X"00000000", -- 000039B4 + X"00000000", -- 000039B8 + X"00000000", -- 000039BC + X"00000000", -- 000039C0 + X"00000000", -- 000039C4 + X"00000000", -- 000039C8 + X"00000000", -- 000039CC + X"00000000", -- 000039D0 + X"00000000", -- 000039D4 + X"00000000", -- 000039D8 + X"00000000", -- 000039DC + X"00000000", -- 000039E0 + X"00000000", -- 000039E4 + X"00000000", -- 000039E8 + X"00000000", -- 000039EC + X"00000000", -- 000039F0 + X"00000000", -- 000039F4 + X"00000000", -- 000039F8 + X"00000000", -- 000039FC + X"00000000", -- 00003A00 + X"00000000", -- 00003A04 + X"00000000", -- 00003A08 + X"00000000", -- 00003A0C + X"00000000", -- 00003A10 + X"00000000", -- 00003A14 + X"00000000", -- 00003A18 + X"00000000", -- 00003A1C + X"00000000", -- 00003A20 + X"00000000", -- 00003A24 + X"00000000", -- 00003A28 + X"00000000", -- 00003A2C + X"00000000", -- 00003A30 + X"00000000", -- 00003A34 + X"00000000", -- 00003A38 + X"00000000", -- 00003A3C + X"00000000", -- 00003A40 + X"00000000", -- 00003A44 + X"00000000", -- 00003A48 + X"00000000", -- 00003A4C + X"00000000", -- 00003A50 + X"00000000", -- 00003A54 + X"00000000", -- 00003A58 + X"00000000", -- 00003A5C + X"00000000", -- 00003A60 + X"00000000", -- 00003A64 + X"00000000", -- 00003A68 + X"00000000", -- 00003A6C + X"00000000", -- 00003A70 + X"00000000", -- 00003A74 + X"00000000", -- 00003A78 + X"00000000", -- 00003A7C + X"00000000", -- 00003A80 + X"00000000", -- 00003A84 + X"00000000", -- 00003A88 + X"00000000", -- 00003A8C + X"00000000", -- 00003A90 + X"00000000", -- 00003A94 + X"00000000", -- 00003A98 + X"00000000", -- 00003A9C + X"00000000", -- 00003AA0 + X"00000000", -- 00003AA4 + X"00000000", -- 00003AA8 + X"00000000", -- 00003AAC + X"00000000", -- 00003AB0 + X"00000000", -- 00003AB4 + X"00000000", -- 00003AB8 + X"00000000", -- 00003ABC + X"00000000", -- 00003AC0 + X"00000000", -- 00003AC4 + X"00000000", -- 00003AC8 + X"00000000", -- 00003ACC + X"00000000", -- 00003AD0 + X"00000000", -- 00003AD4 + X"00000000", -- 00003AD8 + X"00000000", -- 00003ADC + X"00000000", -- 00003AE0 + X"00000000", -- 00003AE4 + X"00000000", -- 00003AE8 + X"00000000", -- 00003AEC + X"00000000", -- 00003AF0 + X"00000000", -- 00003AF4 + X"00000000", -- 00003AF8 + X"00000000", -- 00003AFC + X"00000000", -- 00003B00 + X"00000000", -- 00003B04 + X"00000000", -- 00003B08 + X"00000000", -- 00003B0C + X"00000000", -- 00003B10 + X"00000000", -- 00003B14 + X"00000000", -- 00003B18 + X"00000000", -- 00003B1C + X"00000000", -- 00003B20 + X"00000000", -- 00003B24 + X"00000000", -- 00003B28 + X"00000000", -- 00003B2C + X"00000000", -- 00003B30 + X"00000000", -- 00003B34 + X"00000000", -- 00003B38 + X"00000000", -- 00003B3C + X"00000000", -- 00003B40 + X"00000000", -- 00003B44 + X"00000000", -- 00003B48 + X"00000000", -- 00003B4C + X"00000000", -- 00003B50 + X"00000000", -- 00003B54 + X"00000000", -- 00003B58 + X"00000000", -- 00003B5C + X"00000000", -- 00003B60 + X"00000000", -- 00003B64 + X"00000000", -- 00003B68 + X"00000000", -- 00003B6C + X"00000000", -- 00003B70 + X"00000000", -- 00003B74 + X"00000000", -- 00003B78 + X"00000000", -- 00003B7C + X"00000000", -- 00003B80 + X"00000000", -- 00003B84 + X"00000000", -- 00003B88 + X"00000000", -- 00003B8C + X"00000000", -- 00003B90 + X"00000000", -- 00003B94 + X"00000000", -- 00003B98 + X"00000000", -- 00003B9C + X"00000000", -- 00003BA0 + X"00000000", -- 00003BA4 + X"00000000", -- 00003BA8 + X"00000000", -- 00003BAC + X"00000000", -- 00003BB0 + X"00000000", -- 00003BB4 + X"00000000", -- 00003BB8 + X"00000000", -- 00003BBC + X"00000000", -- 00003BC0 + X"00000000", -- 00003BC4 + X"00000000", -- 00003BC8 + X"00000000", -- 00003BCC + X"00000000", -- 00003BD0 + X"00000000", -- 00003BD4 + X"00000000", -- 00003BD8 + X"00000000", -- 00003BDC + X"00000000", -- 00003BE0 + X"00000000", -- 00003BE4 + X"00000000", -- 00003BE8 + X"00000000", -- 00003BEC + X"00000000", -- 00003BF0 + X"00000000", -- 00003BF4 + X"00000000", -- 00003BF8 + X"00000000", -- 00003BFC + X"00000000", -- 00003C00 + X"00000000", -- 00003C04 + X"00000000", -- 00003C08 + X"00000000", -- 00003C0C + X"00000000", -- 00003C10 + X"00000000", -- 00003C14 + X"00000000", -- 00003C18 + X"00000000", -- 00003C1C + X"00000000", -- 00003C20 + X"00000000", -- 00003C24 + X"00000000", -- 00003C28 + X"00000000", -- 00003C2C + X"00000000", -- 00003C30 + X"00000000", -- 00003C34 + X"00000000", -- 00003C38 + X"00000000", -- 00003C3C + X"00000000", -- 00003C40 + X"00000000", -- 00003C44 + X"00000000", -- 00003C48 + X"00000000", -- 00003C4C + X"00000000", -- 00003C50 + X"00000000", -- 00003C54 + X"00000000", -- 00003C58 + X"00000000", -- 00003C5C + X"00000000", -- 00003C60 + X"00000000", -- 00003C64 + X"00000000", -- 00003C68 + X"00000000", -- 00003C6C + X"00000000", -- 00003C70 + X"00000000", -- 00003C74 + X"00000000", -- 00003C78 + X"00000000", -- 00003C7C + X"00000000", -- 00003C80 + X"00000000", -- 00003C84 + X"00000000", -- 00003C88 + X"00000000", -- 00003C8C + X"00000000", -- 00003C90 + X"00000000", -- 00003C94 + X"00000000", -- 00003C98 + X"00000000", -- 00003C9C + X"00000000", -- 00003CA0 + X"00000000", -- 00003CA4 + X"00000000", -- 00003CA8 + X"00000000", -- 00003CAC + X"00000000", -- 00003CB0 + X"00000000", -- 00003CB4 + X"00000000", -- 00003CB8 + X"00000000", -- 00003CBC + X"00000000", -- 00003CC0 + X"00000000", -- 00003CC4 + X"00000000", -- 00003CC8 + X"00000000", -- 00003CCC + X"00000000", -- 00003CD0 + X"00000000", -- 00003CD4 + X"00000000", -- 00003CD8 + X"00000000", -- 00003CDC + X"00000000", -- 00003CE0 + X"00000000", -- 00003CE4 + X"00000000", -- 00003CE8 + X"00000000", -- 00003CEC + X"00000000", -- 00003CF0 + X"00000000", -- 00003CF4 + X"00000000", -- 00003CF8 + X"00000000", -- 00003CFC + X"00000000", -- 00003D00 + X"00000000", -- 00003D04 + X"00000000", -- 00003D08 + X"00000000", -- 00003D0C + X"00000000", -- 00003D10 + X"00000000", -- 00003D14 + X"00000000", -- 00003D18 + X"00000000", -- 00003D1C + X"00000000", -- 00003D20 + X"00000000", -- 00003D24 + X"00000000", -- 00003D28 + X"00000000", -- 00003D2C + X"00000000", -- 00003D30 + X"00000000", -- 00003D34 + X"00000000", -- 00003D38 + X"00000000", -- 00003D3C + X"00000000", -- 00003D40 + X"00000000", -- 00003D44 + X"00000000", -- 00003D48 + X"00000000", -- 00003D4C + X"00000000", -- 00003D50 + X"00000000", -- 00003D54 + X"00000000", -- 00003D58 + X"00000000", -- 00003D5C + X"00000000", -- 00003D60 + X"00000000", -- 00003D64 + X"00000000", -- 00003D68 + X"00000000", -- 00003D6C + X"00000000", -- 00003D70 + X"00000000", -- 00003D74 + X"00000000", -- 00003D78 + X"00000000", -- 00003D7C + X"00000000", -- 00003D80 + X"00000000", -- 00003D84 + X"00000000", -- 00003D88 + X"00000000", -- 00003D8C + X"00000000", -- 00003D90 + X"00000000", -- 00003D94 + X"00000000", -- 00003D98 + X"00000000", -- 00003D9C + X"00000000", -- 00003DA0 + X"00000000", -- 00003DA4 + X"00000000", -- 00003DA8 + X"00000000", -- 00003DAC + X"00000000", -- 00003DB0 + X"00000000", -- 00003DB4 + X"00000000", -- 00003DB8 + X"00000000", -- 00003DBC + X"00000000", -- 00003DC0 + X"00000000", -- 00003DC4 + X"00000000", -- 00003DC8 + X"00000000", -- 00003DCC + X"00000000", -- 00003DD0 + X"00000000", -- 00003DD4 + X"00000000", -- 00003DD8 + X"00000000", -- 00003DDC + X"00000000", -- 00003DE0 + X"00000000", -- 00003DE4 + X"00000000", -- 00003DE8 + X"00000000", -- 00003DEC + X"00000000", -- 00003DF0 + X"00000000", -- 00003DF4 + X"00000000", -- 00003DF8 + X"00000000", -- 00003DFC + X"00000000", -- 00003E00 + X"00000000", -- 00003E04 + X"00000000", -- 00003E08 + X"00000000", -- 00003E0C + X"00000000", -- 00003E10 + X"00000000", -- 00003E14 + X"00000000", -- 00003E18 + X"00000000", -- 00003E1C + X"00000000", -- 00003E20 + X"00000000", -- 00003E24 + X"00000000", -- 00003E28 + X"00000000", -- 00003E2C + X"00000000", -- 00003E30 + X"00000000", -- 00003E34 + X"00000000", -- 00003E38 + X"00000000", -- 00003E3C + X"00000000", -- 00003E40 + X"00000000", -- 00003E44 + X"00000000", -- 00003E48 + X"00000000", -- 00003E4C + X"00000000", -- 00003E50 + X"00000000", -- 00003E54 + X"00000000", -- 00003E58 + X"00000000", -- 00003E5C + X"00000000", -- 00003E60 + X"00000000", -- 00003E64 + X"00000000", -- 00003E68 + X"00000000", -- 00003E6C + X"00000000", -- 00003E70 + X"00000000", -- 00003E74 + X"00000000", -- 00003E78 + X"00000000", -- 00003E7C + X"00000000", -- 00003E80 + X"00000000", -- 00003E84 + X"00000000", -- 00003E88 + X"00000000", -- 00003E8C + X"00000000", -- 00003E90 + X"00000000", -- 00003E94 + X"00000000", -- 00003E98 + X"00000000", -- 00003E9C + X"00000000", -- 00003EA0 + X"00000000", -- 00003EA4 + X"00000000", -- 00003EA8 + X"00000000", -- 00003EAC + X"00000000", -- 00003EB0 + X"00000000", -- 00003EB4 + X"00000000", -- 00003EB8 + X"00000000", -- 00003EBC + X"00000000", -- 00003EC0 + X"00000000", -- 00003EC4 + X"00000000", -- 00003EC8 + X"00000000", -- 00003ECC + X"00000000", -- 00003ED0 + X"00000000", -- 00003ED4 + X"00000000", -- 00003ED8 + X"00000000", -- 00003EDC + X"00000000", -- 00003EE0 + X"00000000", -- 00003EE4 + X"00000000", -- 00003EE8 + X"00000000", -- 00003EEC + X"00000000", -- 00003EF0 + X"00000000", -- 00003EF4 + X"00000000", -- 00003EF8 + X"00000000", -- 00003EFC + X"00000000", -- 00003F00 + X"00000000", -- 00003F04 + X"00000000", -- 00003F08 + X"00000000", -- 00003F0C + X"00000000", -- 00003F10 + X"00000000", -- 00003F14 + X"00000000", -- 00003F18 + X"00000000", -- 00003F1C + X"00000000", -- 00003F20 + X"00000000", -- 00003F24 + X"00000000", -- 00003F28 + X"00000000", -- 00003F2C + X"00000000", -- 00003F30 + X"00000000", -- 00003F34 + X"00000000", -- 00003F38 + X"00000000", -- 00003F3C + X"00000000", -- 00003F40 + X"00000000", -- 00003F44 + X"00000000", -- 00003F48 + X"00000000", -- 00003F4C + X"00000000", -- 00003F50 + X"00000000", -- 00003F54 + X"00000000", -- 00003F58 + X"00000000", -- 00003F5C + X"00000000", -- 00003F60 + X"00000000", -- 00003F64 + X"00000000", -- 00003F68 + X"00000000", -- 00003F6C + X"00000000", -- 00003F70 + X"00000000", -- 00003F74 + X"00000000", -- 00003F78 + X"00000000", -- 00003F7C + X"00000000", -- 00003F80 + X"00000000", -- 00003F84 + X"00000000", -- 00003F88 + X"00000000", -- 00003F8C + X"00000000", -- 00003F90 + X"00000000", -- 00003F94 + X"00000000", -- 00003F98 + X"00000000", -- 00003F9C + X"00000000", -- 00003FA0 + X"00000000", -- 00003FA4 + X"00000000", -- 00003FA8 + X"00000000", -- 00003FAC + X"00000000", -- 00003FB0 + X"00000000", -- 00003FB4 + X"00000000", -- 00003FB8 + X"00000000", -- 00003FBC + X"00000000", -- 00003FC0 + X"00000000", -- 00003FC4 + X"00000000", -- 00003FC8 + X"00000000", -- 00003FCC + X"00000000", -- 00003FD0 + X"00000000", -- 00003FD4 + X"00000000", -- 00003FD8 + X"00000000", -- 00003FDC + X"00000000", -- 00003FE0 + X"00000000", -- 00003FE4 + X"00000000", -- 00003FE8 + X"00000000", -- 00003FEC + X"00000000", -- 00003FF0 + X"00000000", -- 00003FF4 + X"00000000", -- 00003FF8 + X"00000000" -- 00003FFC + ); + +begin + +PROM_READ: + process(clk) + begin + if rising_edge(clk) and ce = '1' then + dout <= word_array(to_integer(addr(13 downto 2))); + end if; + end process; + + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto jtag_ld_dout'length); + jtag_ld_din <= user_regi(jtag_ld_dout'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto jtag_ld_dout'length => '0') & jtag_ld_dout; + + end if; + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + word_array(to_integer(jtag_ld_addr(11 downto 0))) <= jtag_ld_din; + else + jtag_ld_dout <= word_array(to_integer(jtag_ld_addr(11 downto 0))); + end if; + end if; + end process; + +end data; diff --git a/lib/CPUs/MIPS/tools/insrom.rb b/lib/CPUs/MIPS/tools/insrom.rb new file mode 100644 index 0000000..fdbf1ed --- /dev/null +++ b/lib/CPUs/MIPS/tools/insrom.rb @@ -0,0 +1,46 @@ +#!/usr/bin/env ruby + +# ---------------------------------------------------------------------- +# Project: JIPS, a portable 32-bit RISC CPU written in VHDL +# This file: Insertion of code fragments into templates +# +# Copyright (C) 2008 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +arg = $* +rom_filename = arg[0].to_s +tpl_filename = arg[1].to_s + +subst_pattern = "ROM_INSERT_HERE" + +# -------------------------------------------------------- +# Open file +# -------------------------------------------------------- +romfile = File.open(rom_filename, "r") +tplfile = File.open(tpl_filename, "r") +re = Regexp.new(subst_pattern) + +while (line = tplfile.gets) + puts line + line.scan(re).each do |word| + romfile.each do |raw_line| + puts raw_line + end + end +end diff --git a/lib/CPUs/MIPS/tools/irom.vhd.tpl b/lib/CPUs/MIPS/tools/irom.vhd.tpl new file mode 100644 index 0000000..5ffd6d7 --- /dev/null +++ b/lib/CPUs/MIPS/tools/irom.vhd.tpl @@ -0,0 +1,29 @@ +------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: The ROM file for use in your VHDL design +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +-- ROM_INSERT_HERE + diff --git a/lib/CPUs/MIPS/tools/irom_ld.vhd.tpl b/lib/CPUs/MIPS/tools/irom_ld.vhd.tpl new file mode 100644 index 0000000..3bd3afb --- /dev/null +++ b/lib/CPUs/MIPS/tools/irom_ld.vhd.tpl @@ -0,0 +1,147 @@ +------------------------------------------------------------------------- +-- Project: JIPS, a portable 32-bit RISC CPU written in VHDL +-- This file: loadable ROM +-- +-- Copyright (C) 2008 J. Ahrensfeld +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- For questions and ideas, please contact the author at jens@jayfield.org +-- +-------------------------------------------------------------------------- + +LIBRARY ieee; +use IEEE.STD_LOGIC_1164.ALL; +USE ieee.numeric_std.ALL; + +library UNISIM; +use UNISIM.VComponents.all; + +ENTITY irom IS + Port ( + clk : in STD_LOGIC; + addr : in inst_addr_t; + dout : out inst_t + ); + +END irom; + +ARCHITECTURE loadable OF irom IS + + -- JASM_ROM_INSERT_HERE + + signal jtag_ld_clk : STD_LOGIC; + signal jtag_ld_we : STD_LOGIC; + signal jtag_ld_addr : unsigned (15 downto 0); + signal jtag_ld_dout : unsigned (31 downto 0); + signal jtag_ld_din : unsigned (31 downto 0); + signal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic; + signal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic; + signal user_regi, user_rego : unsigned (47 downto 0); + constant id : unsigned (47 downto 0) := X"DEAD" & X"BEEF" & "X"BABE"; + +begin + +-------------------------------------------------------------------------- +-- Virtex-4: JTAG Loader +-------------------------------------------------------------------------- + i00_BUFG : BUFG + port map + ( + O => bs_clk1, + I => bs_clk0 + ); + + i01_BUFG : BUFG + port map + ( + O => bs_update1, + I => bs_update0 + ); + + BSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 + generic map + ( + JTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4) + ) + port map + ( + CAPTURE => bs_capture, -- CAPTURE output from TAP controller + DRCK => bs_clk0, -- Data register output for USER functions + RESET => bs_rst, -- Reset output from TAP controller + SEL => bs_sel, -- USER active output + SHIFT => bs_shift, -- SHIFT output from TAP controller + TDI => bs_tdi, -- TDI output from TAP controller + UPDATE => bs_update0, -- UPDATE output from TAP controller + TDO => bs_tdo -- Data input for USER function + ); + + jtag_ld_addr <= user_regi(user_regi'left downto jtag_ld_dout'length); + jtag_ld_din <= user_regi(jtag_ld_dout'length-1 downto 0); + jtag_ld_clk <= bs_update1; + jtag_ld_we <= bs_sel; + +sipo: + process (bs_rst, bs_clk1, bs_tdi, bs_shift) + begin + if bs_rst = '1' then + user_regi <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_regi <= bs_tdi & user_regi(user_regi'left downto 1); + end if; + end if; + end process; + +piso: + process (bs_rst, bs_clk1, bs_shift, user_rego) + begin + bs_tdo <= user_rego(0); + if bs_rst = '1' then + user_rego <= (others => '0'); + elsif rising_edge(bs_clk1) then + if bs_shift = '1' then + user_rego <= user_rego(0) & user_rego(user_rego'left downto 1); + else + user_rego <= (user_rego'left downto jtag_ld_dout'length => '0') & jtag_ld_dout; +-- user_rego <= id; + end if; + end if; + end process; + +PROM_WRITE: + process(jtag_ld_clk, jtag_ld_we) + begin + if rising_edge(jtag_ld_clk) then + if jtag_ld_we = '1' then + imem_rom(to_integer(jtag_ld_addr)) <= jtag_ld_din; + else + jtag_ld_dout <= imem_rom(to_integer(jtag_ld_addr)); + end if; + end if; + end process; + +-------------------------------------------------------------------------- +-- ROM Read/Write +-------------------------------------------------------------------------- +PROM_READ: + process(clk) + begin + if rising_edge(clk) then + dout <= imem_rom(to_integer(addr)); + end if; + end process; + +-------------------------------------------------------------------------- +end loadable; diff --git a/lib/CPUs/MIPS/tools/make b/lib/CPUs/MIPS/tools/make new file mode 100644 index 0000000..e7f598f --- /dev/null +++ b/lib/CPUs/MIPS/tools/make @@ -0,0 +1,50 @@ +#!/bin/sh + +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: rom-file generation for cpu_core +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +TARGET=$2 +DSTDIR=$1 + +JASM_HOME=/cygdrive/w/vhdl/lib/CPUs/JCpu/tools + +$JASM_HOME/jasm.rb $TARGET.jsm + +irom_tcl_snippet="$TARGET.irom.tcl.snip" +irom_vhdl_snippet="$TARGET.irom.vhdl.snip" +irom_ld_vhdl_snippet="$TARGET.irom_ld.vhdl.snip" +xrom_tcl_snippet="$TARGET.xrom.tcl.snip" +xrom_vhdl_snippet="$TARGET.xrom.vhdl.snip" +xrom_ld_vhdl_snippet="$TARGET.xrom_ld.vhdl.snip" + +$JASM_HOME/insrom.rb $irom_vhdl_snippet $JASM_HOME/irom.vhd.tpl >$DSTDIR/$TARGET\_irom.vhdl +$JASM_HOME/insrom.rb $irom_ld_vhdl_snippet $JASM_HOME/irom_ld.vhd.tpl >$DSTDIR/$TARGET\_irom_ld.vhdl + +$JASM_HOME/insrom.rb $xrom_vhdl_snippet $JASM_HOME/xrom.vhd.tpl >$DSTDIR/$TARGET\_xrom.vhdl +$JASM_HOME/insrom.rb $xrom_ld_vhdl_snippet $JASM_HOME/xrom_ld.vhd.tpl >$DSTDIR/$TARGET\_xrom_ld.vhdl + +cat $irom_tcl_snippet > $TARGET.tcl.snip.snip +cat $xrom_tcl_snippet >> $TARGET.tcl.snip.snip +$JASM_HOME/insrom.rb $TARGET.tcl.snip.snip $JASM_HOME/rom.tcl.tpl >$TARGET.tcl + +rm -f *.snip diff --git a/lib/CPUs/MIPS/tools/rom.tcl.tpl b/lib/CPUs/MIPS/tools/rom.tcl.tpl new file mode 100644 index 0000000..9f5c0dc --- /dev/null +++ b/lib/CPUs/MIPS/tools/rom.tcl.tpl @@ -0,0 +1,61 @@ +# ---------------------------------------------------------------------- +# Project: JCPU, a portable 8-bit RISC CPU written in VHDL +# This file: The ROM file for upload to target over JTAG +# +# Copyright (C) 2007 J. Ahrensfeld +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# For questions and ideas, please contact the author at jens@jayfield.org +# +# --------------------------------------------------------------------- + +# --------------------------------------------------------------------- +# For Chipscope 9.1 +# --------------------------------------------------------------------- +# Source JTAG/TCL frame work +cd $env(CHIPSCOPE)\\bin\\nt +source csejtag.tcl + +namespace import ::chipscope::* + +# Platform USB Cable +set PLATFORM_USB_CABLE_ARGS [list "port=USB2" "frequency=6000000"] +# frequency="24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000" + +# Create session +set handle [::chipscope::csejtag_session create 0] + +# Open JTAG and lock +set open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS] +set lock_result [::chipscope::csejtag_target lock $handle 1000] + +set devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT] + +# Get Device ID +set devtype "Virtex-4SX" +set devid 2 +set irlength [::chipscope::csejtag_tap get_irlength $handle $devid] +set idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid] + +set CSE_OP $CSEJTAG_SHIFT_READWRITE +set CSE_ES $CSEJTAG_RUN_TEST_IDLE + +# Write Program +# JASM_ROM_INSERT_HERE + +::chipscope::csejtag_target unlock $handle +::chipscope::csejtag_target close $handle +::chipscope::csejtag_session destroy $handle +exit diff --git a/lib/CPUs/MIPS/tools/src/ramgen.c b/lib/CPUs/MIPS/tools/src/ramgen.c new file mode 100644 index 0000000..a266e35 --- /dev/null +++ b/lib/CPUs/MIPS/tools/src/ramgen.c @@ -0,0 +1,125 @@ +#include +#include +#include +#include + +#define ARCH_NAME "data" +#define ENT_NAME "ram" +#define JTAG_ADDR_WIDTH 16 + +// -------------------------------------------------------------- +void basename(char *pSrc, char *pDst) +{ + int i, size; + + size = strlen(pSrc); + + while(pSrc[size] != '.') + size--; + + for (i=0; i < size; i++) + pDst[i] = pSrc[i]; + + pDst[i] = 0; + +} + +int SaveRAM_TCL(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, word_addr, filesize, romsize; + char binstr_addr[33]; + char binstr_data[33]; + + char tpl[] = {"# ---------------------------------------------------------------------\n# For Chipscope 9.1\n# ---------------------------------------------------------------------\n# Source JTAG/TCL frame work\ncd $env(CHIPSCOPE)\\\\bin\\\\nt\nsource csejtag.tcl\n\nnamespace import ::chipscope::*\n\n# Platform USB Cable\nset PLATFORM_USB_CABLE_ARGS [list \"port=USB2\" \"frequency=6000000\"]\n# frequency=\"24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000\"\n\n# Create session\nset handle [::chipscope::csejtag_session create 0]\n\n# Open JTAG and lock\nset open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS]\nset lock_result [::chipscope::csejtag_target lock $handle 1000]\n\nset devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT]\n\n# Get Device ID\nset devtype \"Virtex-4SX\"\nset devid 2\nset irlength [::chipscope::csejtag_tap get_irlength $handle $devid]\nset idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid]\n\nset CSE_OP $CSEJTAG_SHIFT_READWRITE\nset CSE_ES $CSEJTAG_RUN_TEST_IDLE\n\n# Write Program\n"}; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fputs(tpl, pFileOut); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + fprintf(pFileOut, "# Assembled from %s\n", pFilenameIn); + fprintf(pFileOut, "# ---------------------------------------------------------------\n"); + fprintf(pFileOut, "# Shift the USER2 Instruction (b1111000011) into the Instruction Register of FPGA\n"); + fprintf(pFileOut, "# User 2\n"); + fprintf(pFileOut, "set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength \"3C3\"]\n\n"); + + word_addr = 0; + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + fprintf(pFileOut, "::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%4.4X%8.8X\"\n", nbits_data + JTAG_ADDR_WIDTH, word_addr, word); + word_addr++; + } + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "::chipscope::csejtag_target unlock $handle\n"); + fprintf(pFileOut, "::chipscope::csejtag_target close $handle\n"); + fprintf(pFileOut, "::chipscope::csejtag_session destroy $handle\n"); + fprintf(pFileOut, "exit\n"); + + return 0; +} + +int main(int argc, char *argv[]) +{ + char *pFilenameIn; + char name_prj[1024]; + char name_rom_tcl[1024]; + + FILE *pFileIn; + int filesize, romsize, nbits_addr, nbits_data; + long start, end; + int word, i; + + if (argc < 2) + { + fprintf(stderr, "Usage: romgen \n"); + return 1; + } + + pFilenameIn = argv[1]; + if (argc == 3) + nbits_addr = atoi(argv[2]); + + + basename(pFilenameIn, name_prj); + sprintf(name_rom_tcl, "%s.tcl", name_prj); + + SaveRAM_TCL(pFilenameIn, name_rom_tcl, ARCH_NAME, ENT_NAME, nbits_addr, 32); + + + return 0; +} + diff --git a/lib/CPUs/MIPS/tools/src/romgen.c b/lib/CPUs/MIPS/tools/src/romgen.c new file mode 100644 index 0000000..6d1ec5f --- /dev/null +++ b/lib/CPUs/MIPS/tools/src/romgen.c @@ -0,0 +1,368 @@ +#include +#include +#include +#include + +#define ARCH_NAME "data" +#define ENT_NAME "icache" +#define JTAG_ADDR_WIDTH 16 + +// -------------------------------------------------------------- +void basename(char *pSrc, char *pDst) +{ + int i, size; + + size = strlen(pSrc); + + while(pSrc[size] != '.') + size--; + + for (i=0; i < size; i++) + pDst[i] = pSrc[i]; + + pDst[i] = 0; + +} + +int SaveROM(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, filesize, romsize; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fprintf(pFileOut, "LIBRARY IEEE;\n"); + fprintf(pFileOut, "USE IEEE.STD_LOGIC_1164.ALL;\n"); + fprintf(pFileOut, "USE IEEE.NUMERIC_STD.ALL;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "ENTITY %s IS\n", ENT_NAME); + fprintf(pFileOut, "\tPort\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\t\tclk\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\tce\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\taddr\t\t: in unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\t\tdout\t\t: out unsigned(%d downto 0)\n", nbits_data-1); + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "END %s;\n", ENT_NAME); + fprintf(pFileOut, "\n"); + + + fprintf(pFileOut, "ARCHITECTURE %s OF %s IS\n", ARCH_NAME, ENT_NAME); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "\tsubtype word_t is unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\ttype word_array_t is array (0 to %d) of word_t;\n", romsize/4-1); + + fprintf(pFileOut, "\tconstant word_array : word_array_t :=\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + word = 0; + for (; i < romsize; i += sizeof(int)) + { + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "begin\n", ARCH_NAME); + fprintf(pFileOut, "\n"); + fprintf(pFileOut, "PROM_READ:\n", ARCH_NAME); + fprintf(pFileOut, "\tprocess(clk)\n"); + fprintf(pFileOut, "\tbegin\n"); + fprintf(pFileOut, "\t\tif rising_edge(clk) and ce = '1' then\n"); + fprintf(pFileOut, "\t\t\tdout <= word_array(to_integer(addr(%d downto 2)));\n", nbits_addr+1); + fprintf(pFileOut, "\t\tend if;\n"); + fprintf(pFileOut, "\tend process;\n"); + fprintf(pFileOut, "\n"); + fprintf(pFileOut, "end %s;\n", ARCH_NAME); + + return 0; +} + +int SaveROM_V4LD(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, filesize, romsize; + + char tpl[] = {"--------------------------------------------------------------------------\n-- Virtex-4: JTAG Loader\n--------------------------------------------------------------------------\n\ti00_BUFG : BUFG\n\tport map\n\t(\n\t\tO => bs_clk1,\n I => bs_clk0\n\t);\n\t\n\ti01_BUFG : BUFG\n\tport map\n\t(\n\t\tO => bs_update1,\n I => bs_update0\n\t);\n\n\tBSCAN_VIRTEX4_inst1 : BSCAN_VIRTEX4 \n\tgeneric map\n\t(\n\t\tJTAG_CHAIN => 1 -- Value to set BSCAN site of device. Possible values: (1,2,3 or 4)\n\t)\n\tport map \n\t(\n\t\tCAPTURE => bs_capture, -- CAPTURE output from TAP controller\n\t\tDRCK => bs_clk0, -- Data register output for USER functions\n\t\tRESET => bs_rst, -- Reset output from TAP controller\n\t\tSEL => bs_sel, -- USER active output\n\t\tSHIFT => bs_shift, -- SHIFT output from TAP controller\n\t\tTDI => bs_tdi, -- TDI output from TAP controller\n\t\tUPDATE => bs_update0, -- UPDATE output from TAP controller\n\t\tTDO => bs_tdo -- Data input for USER function\n\t);\n\n\tjtag_ld_addr <= user_regi(user_regi'left downto jtag_ld_dout'length);\n\tjtag_ld_din <= user_regi(jtag_ld_dout'length-1 downto 0);\n\tjtag_ld_clk <= bs_update1;\n\tjtag_ld_we <= bs_sel;\n\t\nsipo:\n\tprocess (bs_rst, bs_clk1, bs_tdi, bs_shift)\n\tbegin\n\t\tif bs_rst = '1' then\n\t\t\tuser_regi <= (others => '0');\n\t\telsif rising_edge(bs_clk1) then\n\t\t\tif bs_shift = '1' then\n\t\t\t\tuser_regi <= bs_tdi & user_regi(user_regi'left downto 1);\n\t\t\tend if;\n\t\tend if;\n\tend process;\t\n\npiso:\n\tprocess (bs_rst, bs_clk1, bs_shift, user_rego)\n\tbegin\n\t\tbs_tdo <= user_rego(0);\n\t\tif bs_rst = '1' then\n\t\t\tuser_rego <= (others => '0');\n\t\telsif rising_edge(bs_clk1) then\n\t\t\tif bs_shift = '1' then\n\t\t\t\tuser_rego <= user_rego(0) & user_rego(user_rego'left downto 1);\n\t\t\telse\n\t\t\t\tuser_rego <= (user_rego'left downto jtag_ld_dout'length => '0') & jtag_ld_dout;\t\n\t\n\t\t\tend if;\n\t\tend if;\n\tend process;\n\n"}; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fprintf(pFileOut, "LIBRARY IEEE;\n"); + fprintf(pFileOut, "USE IEEE.STD_LOGIC_1164.ALL;\n"); + fprintf(pFileOut, "USE IEEE.NUMERIC_STD.ALL;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "library UNISIM;\n"); + fprintf(pFileOut, "use UNISIM.VComponents.all;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "ENTITY %s IS\n", ENT_NAME); + fprintf(pFileOut, "\tPort\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\t\tclk\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\tce\t\t: in STD_LOGIC;\n"); + fprintf(pFileOut, "\t\taddr\t\t: in unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\t\tdout\t\t: out unsigned(%d downto 0)\n", nbits_data-1); + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "END %s;\n", ENT_NAME); + fprintf(pFileOut, "\n"); + + + fprintf(pFileOut, "ARCHITECTURE %s OF %s IS\n", ARCH_NAME, ENT_NAME); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "\tsubtype word_t is unsigned(%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\ttype word_array_t is array (0 to %d) of word_t;\n", romsize/4-1); + + fprintf(pFileOut, "\tsignal jtag_ld_clk\t\t: STD_LOGIC;\n"); + fprintf(pFileOut, "\tsignal jtag_ld_we\t\t: STD_LOGIC;\n"); + fprintf(pFileOut, "\tsignal jtag_ld_addr\t\t: unsigned (%d downto 0);\n", JTAG_ADDR_WIDTH-1); + fprintf(pFileOut, "\tsignal jtag_ld_dout\t\t: unsigned (%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\tsignal jtag_ld_din\t\t: unsigned (%d downto 0);\n", nbits_data-1); + fprintf(pFileOut, "\tsignal bs_rst, bs_sel, bs_shift, bs_tdi, bs_tdo : std_logic;\n"); + fprintf(pFileOut, "\tsignal bs_capture, bs_clk0, bs_clk1, bs_update0, bs_update1 : std_logic;\n"); + fprintf(pFileOut, "\tsignal user_regi, user_rego : unsigned (%d downto 0);\n", 31 + JTAG_ADDR_WIDTH); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "\tsignal word_array : word_array_t :=\n"); + fprintf(pFileOut, "\t(\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + word = 0; + for (; i < romsize; i += sizeof(int)) + { + fprintf(pFileOut, "\t\tX\"%8.8X\"", word); + if (i < (romsize-sizeof(int))) + fprintf(pFileOut, ", -- %8.8X\n", i); + else + fprintf(pFileOut, " -- %8.8X\n", i); + } + fprintf(pFileOut, "\t);\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "begin\n", ARCH_NAME); + + fprintf(pFileOut, "\n"); + fprintf(pFileOut, "PROM_READ:\n", ARCH_NAME); + fprintf(pFileOut, "\tprocess(clk)\n"); + fprintf(pFileOut, "\tbegin\n"); + fprintf(pFileOut, "\t\tif rising_edge(clk) and ce = '1' then\n"); + fprintf(pFileOut, "\t\t\tdout <= word_array(to_integer(addr(%d downto 2)));\n", nbits_addr+1); + fprintf(pFileOut, "\t\tend if;\n"); + fprintf(pFileOut, "\tend process;\n"); + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "\n"); + fputs(tpl, pFileOut); + + fprintf(pFileOut, "PROM_WRITE:\n", ARCH_NAME); + fprintf(pFileOut, "\tprocess(jtag_ld_clk, jtag_ld_we)\n"); + fprintf(pFileOut, "\tbegin\n"); + fprintf(pFileOut, "\t\tif rising_edge(jtag_ld_clk) then\n"); + fprintf(pFileOut, "\t\t\tif jtag_ld_we = '1' then\n"); + fprintf(pFileOut, "\t\t\t\tword_array(to_integer(jtag_ld_addr(%d downto 0))) <= jtag_ld_din;\n", nbits_addr-1); + fprintf(pFileOut, "\t\t\telse\n"); + fprintf(pFileOut, "\t\t\t\tjtag_ld_dout <= word_array(to_integer(jtag_ld_addr(%d downto 0)));\n", nbits_addr-1); + fprintf(pFileOut, "\t\t\tend if;\n"); + fprintf(pFileOut, "\t\tend if;\n"); + fprintf(pFileOut, "\tend process;\n"); + fprintf(pFileOut, "\n"); + + fprintf(pFileOut, "end %s;\n", ARCH_NAME); + return 0; +} + +int SaveROM_TCL(char *pFilenameIn, char *pFilenameOut, char *pArchName, char *pEntName, int nbits_addr, int nbits_data) +{ + FILE *pFileIn, *pFileOut; + long start, end; + int i, word, word_addr, filesize, romsize; + char binstr_addr[33]; + char binstr_data[33]; + + char tpl[] = {"# ---------------------------------------------------------------------\n# For Chipscope 9.1\n# ---------------------------------------------------------------------\n# Source JTAG/TCL frame work\ncd $env(CHIPSCOPE)\\\\bin\\\\nt\nsource csejtag.tcl\n\nnamespace import ::chipscope::*\n\n# Platform USB Cable\nset PLATFORM_USB_CABLE_ARGS [list \"port=USB2\" \"frequency=6000000\"]\n# frequency=\"24000000 | 12000000 | 6000000 | 3000000 | 1500000 | 750000\"\n\n# Create session\nset handle [::chipscope::csejtag_session create 0]\n\n# Open JTAG and lock\nset open_result [::chipscope::csejtag_target open $handle $CSEJTAG_TARGET_PLATFORMUSB 0 $PLATFORM_USB_CABLE_ARGS]\nset lock_result [::chipscope::csejtag_target lock $handle 1000]\n\nset devlist [::chipscope::csejtag_tap autodetect_chain $handle $CSEJTAG_SCAN_DEFAULT]\n\n# Get Device ID\nset devtype \"Virtex-4SX\"\nset devid 2\nset irlength [::chipscope::csejtag_tap get_irlength $handle $devid]\nset idcode [::chipscope::csejtag_tap get_device_idcode $handle $devid]\n\nset CSE_OP $CSEJTAG_SHIFT_READWRITE\nset CSE_ES $CSEJTAG_RUN_TEST_IDLE\n\n# Write Program\n"}; + + pFileIn = fopen(pFilenameIn, "rb"); + if (!pFileIn) + { + fprintf(stderr, "Error opening file %s\n", pFilenameIn); + return 1; + } + + pFileOut = fopen(pFilenameOut, "wb"); + if (!pFileOut) + { + fprintf(stderr, "Error opening file %s\n", pFilenameOut); + return 1; + } + + fseek(pFileIn, 0, SEEK_SET); + start = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_END); + end = ftell(pFileIn); + fseek(pFileIn, 0, SEEK_SET); + + filesize = (end-start); + romsize = (int)pow(2, nbits_addr+2); + + // ------------------------------------------------------------------------- + // Header + + // ------------------------------------------------------------------------- + fputs(tpl, pFileOut); + + // ------------------------------------------------------------------------- + // ROM part + // ------------------------------------------------------------------------- + fprintf(pFileOut, "# Assembled from %s\n", pFilenameIn); + fprintf(pFileOut, "# ---------------------------------------------------------------\n"); + fprintf(pFileOut, "# Shift the USER1 Instruction (b1111000010) into the Instruction Register of FPGA\n"); + fprintf(pFileOut, "# User 1\n"); + fprintf(pFileOut, "set result [::chipscope::csejtag_tap shift_device_ir $handle $devid $CSE_OP $CSE_ES 0 $irlength \"3C2\"]\n\n"); + + word_addr = 0; + for (i=0; i < filesize; i += sizeof(int)) + { + fread(&word, 1, sizeof(int), pFileIn); + fprintf(pFileOut, "::chipscope::csejtag_tap shift_device_dr $handle $devid $CSE_OP $CSE_ES 0 %d \"%4.4X%8.8X\"\n", nbits_data + JTAG_ADDR_WIDTH, word_addr, word); + word_addr++; + } + fprintf(pFileOut, "\n"); + + // ------------------------------------------------------------------------- + // Trailer + // ------------------------------------------------------------------------- + fprintf(pFileOut, "::chipscope::csejtag_target unlock $handle\n"); + fprintf(pFileOut, "::chipscope::csejtag_target close $handle\n"); + fprintf(pFileOut, "::chipscope::csejtag_session destroy $handle\n"); + fprintf(pFileOut, "exit\n"); + + return 0; +} + +int main(int argc, char *argv[]) +{ + char *pFilenameIn; + char name_prj[1024]; + char name_rom[1024]; + char name_rom_v4ld[1024]; + char name_rom_tcl[1024]; + + FILE *pFileIn; + int filesize, romsize, nbits_addr, nbits_data; + long start, end; + int word, i; + + if (argc < 2) + { + fprintf(stderr, "Usage: romgen \n"); + return 1; + } + + pFilenameIn = argv[1]; + if (argc == 3) + nbits_addr = atoi(argv[2]); + + + basename(pFilenameIn, name_prj); + sprintf(name_rom, "%s.vhd", name_prj); + sprintf(name_rom_v4ld, "%s_ld.vhd", name_prj); + sprintf(name_rom_tcl, "%s.tcl", name_prj); + + SaveROM(pFilenameIn, name_rom, ARCH_NAME, ENT_NAME, nbits_addr, 32); + SaveROM_V4LD(pFilenameIn, name_rom_v4ld, ARCH_NAME, ENT_NAME, nbits_addr, 32); + SaveROM_TCL(pFilenameIn, name_rom_tcl, ARCH_NAME, ENT_NAME, nbits_addr, 32); + + + return 0; +} +