OpenCores
URL https://opencores.org/ocsvn/t400/t400/trunk

Subversion Repositories t400

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 171 to Rev 172
    Reverse comparison

Rev 171 → Rev 172

/tags/rel_1_1/CHANGELOG
0,0 → 1,32
 
Change log for the T400 uController core
========================================
Version: $Date: 2008-05-01 20:14:52 $
$Name: not supported by cvs2svn $
 
 
Release 1.1
-----------
 
* code optimizations in the decoder to reduce LUT usage with
Xilinx ISE/XST.
 
* synthesis templates for QuartusII and ISE.
 
* updated version of hex2rom utility for RTL ROM generation
(keeps compatibility with QuartusII 7.2).
 
 
Release 1.0
-----------
 
* Production test plus related testbench added.
 
* Bugfix for
"Timer skipped in T421 configuration"
 
* T421 system and testbench added.
 
* T410 system and testbench added.
 
* Regression test suite environment enhanced for T421 system.
/tags/rel_1_1/syn/t421/xc3s1000/compile_list
0,0 → 1,30
../../../rtl/vhdl/t400_opt_pack-p.vhd
../../../rtl/vhdl/t400_clkgen.vhd
../../../rtl/vhdl/t400_reset.vhd
../../../rtl/vhdl/t400_pack-p.vhd
../../../rtl/vhdl/t400_pmem_ctrl.vhd
../../../rtl/vhdl/t400_dmem_ctrl.vhd
../../../rtl/vhdl/t400_comp_pack-p.vhd
../../../rtl/vhdl/t400_mnemonic_pack-p.vhd
../../../rtl/vhdl/t400_decoder.vhd
../../../rtl/vhdl/t400_skip.vhd
../../../rtl/vhdl/t400_alu.vhd
../../../rtl/vhdl/t400_stack.vhd
../../../rtl/vhdl/t400_io_pack-p.vhd
../../../rtl/vhdl/t400_io_l.vhd
../../../rtl/vhdl/t400_io_d.vhd
../../../rtl/vhdl/t400_io_g.vhd
../../../rtl/vhdl/t400_io_in.vhd
../../../rtl/vhdl/t400_sio.vhd
../../../rtl/vhdl/t400_timer.vhd
../../../rtl/vhdl/t400_core.vhd
../../../rtl/tech/generic/generic_ram_ena.vhd
rom_t42x.vhd
../../../rtl/vhdl/system/t420_rom-e.vhd
../../../rtl/vhdl/system/t420_rom-struct-a.vhd
../../../rtl/tech/spartan/t400_por.vhd
../../../rtl/vhdl/t400_core_comp_pack-p.vhd
../../../rtl/tech/t400_tech_comp_pack-p.vhd
../../../rtl/vhdl/system/t420_notri.vhd
../../../rtl/vhdl/system/t400_system_comp_pack-p.vhd
../../../rtl/vhdl/system/t421.vhd
/tags/rel_1_1/syn/t421/xc3s1000/rom_t42x.vhd
0,0 → 1,604
-- This file was generated with hex2rom written by Daniel Wallner
 
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
 
entity rom_t42x is
port(
Clk : in std_logic;
A : in std_logic_vector(9 downto 0);
D : out std_logic_vector(7 downto 0)
);
end rom_t42x;
 
architecture rtl of rom_t42x is
begin
process (Clk)
begin
if Clk'event and Clk = '1' then
case to_integer(unsigned(A)) is
when 000000 => D <= "01000100"; -- 0x0000
when 000001 => D <= "00110011"; -- 0x0001
when 000002 => D <= "01011001"; -- 0x0002
when 000003 => D <= "00110011"; -- 0x0003
when 000004 => D <= "01010110"; -- 0x0004
when 000005 => D <= "01111000"; -- 0x0005
when 000006 => D <= "00111100"; -- 0x0006
when 000007 => D <= "00110011"; -- 0x0007
when 000008 => D <= "00111110"; -- 0x0008
when 000009 => D <= "00000000"; -- 0x0009
when 000010 => D <= "00010010"; -- 0x000A
when 000011 => D <= "01010000"; -- 0x000B
when 000012 => D <= "00110011"; -- 0x000C
when 000013 => D <= "00111110"; -- 0x000D
when 000014 => D <= "00000000"; -- 0x000E
when 000015 => D <= "01010010"; -- 0x000F
when 000016 => D <= "01010000"; -- 0x0010
when 000017 => D <= "00110011"; -- 0x0011
when 000018 => D <= "00111110"; -- 0x0012
when 000019 => D <= "01110111"; -- 0x0013
when 000020 => D <= "00110011"; -- 0x0014
when 000021 => D <= "00111110"; -- 0x0015
when 000022 => D <= "01010000"; -- 0x0016
when 000023 => D <= "00110011"; -- 0x0017
when 000024 => D <= "00111010"; -- 0x0018
when 000025 => D <= "00000000"; -- 0x0019
when 000026 => D <= "01010000"; -- 0x001A
when 000027 => D <= "00110011"; -- 0x001B
when 000028 => D <= "00111010"; -- 0x001C
when 000029 => D <= "01001101"; -- 0x001D
when 000030 => D <= "00110011"; -- 0x001E
when 000031 => D <= "00111010"; -- 0x001F
when 000032 => D <= "01000111"; -- 0x0020
when 000033 => D <= "00110011"; -- 0x0021
when 000034 => D <= "00111010"; -- 0x0022
when 000035 => D <= "01001100"; -- 0x0023
when 000036 => D <= "01000011"; -- 0x0024
when 000037 => D <= "00000101"; -- 0x0025
when 000038 => D <= "01010000"; -- 0x0026
when 000039 => D <= "00110011"; -- 0x0027
when 000040 => D <= "00111010"; -- 0x0028
when 000041 => D <= "00010101"; -- 0x0029
when 000042 => D <= "00100011"; -- 0x002A
when 000043 => D <= "10000000"; -- 0x002B
when 000044 => D <= "01011111"; -- 0x002C
when 000045 => D <= "00100011"; -- 0x002D
when 000046 => D <= "00000000"; -- 0x002E
when 000047 => D <= "00000110"; -- 0x002F
when 000048 => D <= "00110011"; -- 0x0030
when 000049 => D <= "00111010"; -- 0x0031
when 000050 => D <= "00000101"; -- 0x0032
when 000051 => D <= "01001010"; -- 0x0033
when 000052 => D <= "00000111"; -- 0x0034
when 000053 => D <= "00000111"; -- 0x0035
when 000054 => D <= "00110011"; -- 0x0036
when 000055 => D <= "00111110"; -- 0x0037
when 000056 => D <= "01110101"; -- 0x0038
when 000057 => D <= "01001110"; -- 0x0039
when 000058 => D <= "01010011"; -- 0x003A
when 000059 => D <= "00000111"; -- 0x003B
when 000060 => D <= "00110011"; -- 0x003C
when 000061 => D <= "00111010"; -- 0x003D
when 000062 => D <= "00000111"; -- 0x003E
when 000063 => D <= "00100011"; -- 0x003F
when 000064 => D <= "00000000"; -- 0x0040
when 000065 => D <= "00110011"; -- 0x0041
when 000066 => D <= "00111110"; -- 0x0042
when 000067 => D <= "01010100"; -- 0x0043
when 000068 => D <= "00000110"; -- 0x0044
when 000069 => D <= "00110011"; -- 0x0045
when 000070 => D <= "00111010"; -- 0x0046
when 000071 => D <= "00000000"; -- 0x0047
when 000072 => D <= "01000000"; -- 0x0048
when 000073 => D <= "00000010"; -- 0x0049
when 000074 => D <= "00000100"; -- 0x004A
when 000075 => D <= "00100011"; -- 0x004B
when 000076 => D <= "00000000"; -- 0x004C
when 000077 => D <= "01011000"; -- 0x004D
when 000078 => D <= "00100011"; -- 0x004E
when 000079 => D <= "00000000"; -- 0x004F
when 000080 => D <= "00100001"; -- 0x0050
when 000081 => D <= "00110011"; -- 0x0051
when 000082 => D <= "10010010"; -- 0x0052
when 000083 => D <= "00110011"; -- 0x0053
when 000084 => D <= "00111110"; -- 0x0054
when 000085 => D <= "00100001"; -- 0x0055
when 000086 => D <= "00011111"; -- 0x0056
when 000087 => D <= "01000110"; -- 0x0057
when 000088 => D <= "00100001"; -- 0x0058
when 000089 => D <= "01000010"; -- 0x0059
when 000090 => D <= "00100001"; -- 0x005A
when 000091 => D <= "01001011"; -- 0x005B
when 000092 => D <= "00100001"; -- 0x005C
when 000093 => D <= "00100011"; -- 0x005D
when 000094 => D <= "00000000"; -- 0x005E
when 000095 => D <= "00110110"; -- 0x005F
when 000096 => D <= "00100011"; -- 0x0060
when 000097 => D <= "10010001"; -- 0x0061
when 000098 => D <= "00010100"; -- 0x0062
when 000099 => D <= "00110011"; -- 0x0063
when 000100 => D <= "00101010"; -- 0x0064
when 000101 => D <= "00000110"; -- 0x0065
when 000102 => D <= "00000000"; -- 0x0066
when 000103 => D <= "00110000"; -- 0x0067
when 000104 => D <= "00100010"; -- 0x0068
when 000105 => D <= "00100000"; -- 0x0069
when 000106 => D <= "00100011"; -- 0x006A
when 000107 => D <= "00000000"; -- 0x006B
when 000108 => D <= "00000110"; -- 0x006C
when 000109 => D <= "00110011"; -- 0x006D
when 000110 => D <= "00111010"; -- 0x006E
when 000111 => D <= "00000000"; -- 0x006F
when 000112 => D <= "00110000"; -- 0x0070
when 000113 => D <= "00000110"; -- 0x0071
when 000114 => D <= "00110011"; -- 0x0072
when 000115 => D <= "00111010"; -- 0x0073
when 000116 => D <= "00110011"; -- 0x0074
when 000117 => D <= "00111100"; -- 0x0075
when 000118 => D <= "00000111"; -- 0x0076
when 000119 => D <= "00110011"; -- 0x0077
when 000120 => D <= "00101100"; -- 0x0078
when 000121 => D <= "00110011"; -- 0x0079
when 000122 => D <= "00111010"; -- 0x007A
when 000123 => D <= "00100101"; -- 0x007B
when 000124 => D <= "00110011"; -- 0x007C
when 000125 => D <= "00111010"; -- 0x007D
when 000126 => D <= "00110101"; -- 0x007E
when 000127 => D <= "00110011"; -- 0x007F
when 000128 => D <= "00111010"; -- 0x0080
when 000129 => D <= "00110001"; -- 0x0081
when 000130 => D <= "00000110"; -- 0x0082
when 000131 => D <= "00100010"; -- 0x0083
when 000132 => D <= "00100011"; -- 0x0084
when 000133 => D <= "00000000"; -- 0x0085
when 000134 => D <= "00010000"; -- 0x0086
when 000135 => D <= "00100000"; -- 0x0087
when 000136 => D <= "00000110"; -- 0x0088
when 000137 => D <= "00110011"; -- 0x0089
when 000138 => D <= "00111010"; -- 0x008A
when 000139 => D <= "00000000"; -- 0x008B
when 000140 => D <= "01010011"; -- 0x008C
when 000141 => D <= "00000110"; -- 0x008D
when 000142 => D <= "00100010"; -- 0x008E
when 000143 => D <= "00100000"; -- 0x008F
when 000144 => D <= "00000110"; -- 0x0090
when 000145 => D <= "00110011"; -- 0x0091
when 000146 => D <= "00111010"; -- 0x0092
when 000147 => D <= "00110010"; -- 0x0093
when 000148 => D <= "00100000"; -- 0x0094
when 000149 => D <= "00000110"; -- 0x0095
when 000150 => D <= "00110011"; -- 0x0096
when 000151 => D <= "00111010"; -- 0x0097
when 000152 => D <= "00001111"; -- 0x0098
when 000153 => D <= "00011110"; -- 0x0099
when 000154 => D <= "00110011"; -- 0x009A
when 000155 => D <= "10100111"; -- 0x009B
when 000156 => D <= "00110011"; -- 0x009C
when 000157 => D <= "00111010"; -- 0x009D
when 000158 => D <= "00110011"; -- 0x009E
when 000159 => D <= "00101100"; -- 0x009F
when 000160 => D <= "00110011"; -- 0x00A0
when 000161 => D <= "00111010"; -- 0x00A1
when 000162 => D <= "00000110"; -- 0x00A2
when 000163 => D <= "00110011"; -- 0x00A3
when 000164 => D <= "00111010"; -- 0x00A4
when 000165 => D <= "00110011"; -- 0x00A5
when 000166 => D <= "01100001"; -- 0x00A6
when 000167 => D <= "01001111"; -- 0x00A7
when 000168 => D <= "00000000"; -- 0x00A8
when 000169 => D <= "01010111"; -- 0x00A9
when 000170 => D <= "00110011"; -- 0x00AA
when 000171 => D <= "00000001"; -- 0x00AB
when 000172 => D <= "00000110"; -- 0x00AC
when 000173 => D <= "00110011"; -- 0x00AD
when 000174 => D <= "00111010"; -- 0x00AE
when 000175 => D <= "00110011"; -- 0x00AF
when 000176 => D <= "00010001"; -- 0x00B0
when 000177 => D <= "00000110"; -- 0x00B1
when 000178 => D <= "00110011"; -- 0x00B2
when 000179 => D <= "00111010"; -- 0x00B3
when 000180 => D <= "00110011"; -- 0x00B4
when 000181 => D <= "00000011"; -- 0x00B5
when 000182 => D <= "00000110"; -- 0x00B6
when 000183 => D <= "00110011"; -- 0x00B7
when 000184 => D <= "00111010"; -- 0x00B8
when 000185 => D <= "00110011"; -- 0x00B9
when 000186 => D <= "00010011"; -- 0x00BA
when 000187 => D <= "00000110"; -- 0x00BB
when 000188 => D <= "00110011"; -- 0x00BC
when 000189 => D <= "00111010"; -- 0x00BD
when 000190 => D <= "00110011"; -- 0x00BE
when 000191 => D <= "00100001"; -- 0x00BF
when 000192 => D <= "00000110"; -- 0x00C0
when 000193 => D <= "00110011"; -- 0x00C1
when 000194 => D <= "00111010"; -- 0x00C2
when 000195 => D <= "00110011"; -- 0x00C3
when 000196 => D <= "01010000"; -- 0x00C4
when 000197 => D <= "00110011"; -- 0x00C5
when 000198 => D <= "00100001"; -- 0x00C6
when 000199 => D <= "00000110"; -- 0x00C7
when 000200 => D <= "00110011"; -- 0x00C8
when 000201 => D <= "00111010"; -- 0x00C9
when 000202 => D <= "00000001"; -- 0x00CA
when 000203 => D <= "00000110"; -- 0x00CB
when 000204 => D <= "00110011"; -- 0x00CC
when 000205 => D <= "00111010"; -- 0x00CD
when 000206 => D <= "00010001"; -- 0x00CE
when 000207 => D <= "00000110"; -- 0x00CF
when 000208 => D <= "00110011"; -- 0x00D0
when 000209 => D <= "00111010"; -- 0x00D1
when 000210 => D <= "00000011"; -- 0x00D2
when 000211 => D <= "00000110"; -- 0x00D3
when 000212 => D <= "00110011"; -- 0x00D4
when 000213 => D <= "00111010"; -- 0x00D5
when 000214 => D <= "00110011"; -- 0x00D6
when 000215 => D <= "00101001"; -- 0x00D7
when 000216 => D <= "00110011"; -- 0x00D8
when 000217 => D <= "00101000"; -- 0x00D9
when 000218 => D <= "00100001"; -- 0x00DA
when 000219 => D <= "00010110"; -- 0x00DB
when 000220 => D <= "00110011"; -- 0x00DC
when 000221 => D <= "00111010"; -- 0x00DD
when 000222 => D <= "00110011"; -- 0x00DE
when 000223 => D <= "00101001"; -- 0x00DF
when 000224 => D <= "00000110"; -- 0x00E0
when 000225 => D <= "00010011"; -- 0x00E1
when 000226 => D <= "00110011"; -- 0x00E2
when 000227 => D <= "00111110"; -- 0x00E3
when 000228 => D <= "00110011"; -- 0x00E4
when 000229 => D <= "01010001"; -- 0x00E5
when 000230 => D <= "00111010"; -- 0x00E6
when 000231 => D <= "00110011"; -- 0x00E7
when 000232 => D <= "01010000"; -- 0x00E8
when 000233 => D <= "01000100"; -- 0x00E9
when 000234 => D <= "00110011"; -- 0x00EA
when 000235 => D <= "00101001"; -- 0x00EB
when 000236 => D <= "00000110"; -- 0x00EC
when 000237 => D <= "00000001"; -- 0x00ED
when 000238 => D <= "00110011"; -- 0x00EE
when 000239 => D <= "00111110"; -- 0x00EF
when 000240 => D <= "01000100"; -- 0x00F0
when 000241 => D <= "01001111"; -- 0x00F1
when 000242 => D <= "00000110"; -- 0x00F2
when 000243 => D <= "00110011"; -- 0x00F3
when 000244 => D <= "00111010"; -- 0x00F4
when 000245 => D <= "00001111"; -- 0x00F5
when 000246 => D <= "01110111"; -- 0x00F6
when 000247 => D <= "01111110"; -- 0x00F7
when 000248 => D <= "01110101"; -- 0x00F8
when 000249 => D <= "01111100"; -- 0x00F9
when 000250 => D <= "01110011"; -- 0x00FA
when 000251 => D <= "01111010"; -- 0x00FB
when 000252 => D <= "01110001"; -- 0x00FC
when 000253 => D <= "01111000"; -- 0x00FD
when 000254 => D <= "01111111"; -- 0x00FE
when 000255 => D <= "01110110"; -- 0x00FF
when 000256 => D <= "01111101"; -- 0x0100
when 000257 => D <= "01110100"; -- 0x0101
when 000258 => D <= "01111011"; -- 0x0102
when 000259 => D <= "01110010"; -- 0x0103
when 000260 => D <= "01111001"; -- 0x0104
when 000261 => D <= "01110000"; -- 0x0105
when 000262 => D <= "00011111"; -- 0x0106
when 000263 => D <= "01110111"; -- 0x0107
when 000264 => D <= "01111110"; -- 0x0108
when 000265 => D <= "01110101"; -- 0x0109
when 000266 => D <= "01111100"; -- 0x010A
when 000267 => D <= "01110011"; -- 0x010B
when 000268 => D <= "01111010"; -- 0x010C
when 000269 => D <= "01110001"; -- 0x010D
when 000270 => D <= "01111000"; -- 0x010E
when 000271 => D <= "01111111"; -- 0x010F
when 000272 => D <= "01110110"; -- 0x0110
when 000273 => D <= "01111101"; -- 0x0111
when 000274 => D <= "01110100"; -- 0x0112
when 000275 => D <= "01111011"; -- 0x0113
when 000276 => D <= "01110010"; -- 0x0114
when 000277 => D <= "01111001"; -- 0x0115
when 000278 => D <= "01110000"; -- 0x0116
when 000279 => D <= "00101111"; -- 0x0117
when 000280 => D <= "01110111"; -- 0x0118
when 000281 => D <= "01111110"; -- 0x0119
when 000282 => D <= "01110101"; -- 0x011A
when 000283 => D <= "01111100"; -- 0x011B
when 000284 => D <= "01110011"; -- 0x011C
when 000285 => D <= "01111010"; -- 0x011D
when 000286 => D <= "01110001"; -- 0x011E
when 000287 => D <= "01111000"; -- 0x011F
when 000288 => D <= "01111111"; -- 0x0120
when 000289 => D <= "01110110"; -- 0x0121
when 000290 => D <= "01111101"; -- 0x0122
when 000291 => D <= "01110100"; -- 0x0123
when 000292 => D <= "01111011"; -- 0x0124
when 000293 => D <= "01110010"; -- 0x0125
when 000294 => D <= "01111001"; -- 0x0126
when 000295 => D <= "01110000"; -- 0x0127
when 000296 => D <= "00111111"; -- 0x0128
when 000297 => D <= "01110111"; -- 0x0129
when 000298 => D <= "01111110"; -- 0x012A
when 000299 => D <= "01110101"; -- 0x012B
when 000300 => D <= "01111100"; -- 0x012C
when 000301 => D <= "01110011"; -- 0x012D
when 000302 => D <= "01111010"; -- 0x012E
when 000303 => D <= "01110001"; -- 0x012F
when 000304 => D <= "01111000"; -- 0x0130
when 000305 => D <= "01111111"; -- 0x0131
when 000306 => D <= "01110110"; -- 0x0132
when 000307 => D <= "01111101"; -- 0x0133
when 000308 => D <= "01110100"; -- 0x0134
when 000309 => D <= "01111011"; -- 0x0135
when 000310 => D <= "01110010"; -- 0x0136
when 000311 => D <= "01111001"; -- 0x0137
when 000312 => D <= "01110000"; -- 0x0138
when 000313 => D <= "00001111"; -- 0x0139
when 000314 => D <= "00110011"; -- 0x013A
when 000315 => D <= "00111010"; -- 0x013B
when 000316 => D <= "00000101"; -- 0x013C
when 000317 => D <= "00000100"; -- 0x013D
when 000318 => D <= "00110011"; -- 0x013E
when 000319 => D <= "00111010"; -- 0x013F
when 000320 => D <= "00000101"; -- 0x0140
when 000321 => D <= "00000100"; -- 0x0141
when 000322 => D <= "00110011"; -- 0x0142
when 000323 => D <= "00111010"; -- 0x0143
when 000324 => D <= "00000101"; -- 0x0144
when 000325 => D <= "00000100"; -- 0x0145
when 000326 => D <= "00110011"; -- 0x0146
when 000327 => D <= "00111010"; -- 0x0147
when 000328 => D <= "00000101"; -- 0x0148
when 000329 => D <= "00000100"; -- 0x0149
when 000330 => D <= "00110011"; -- 0x014A
when 000331 => D <= "00111010"; -- 0x014B
when 000332 => D <= "00000101"; -- 0x014C
when 000333 => D <= "00000100"; -- 0x014D
when 000334 => D <= "00110011"; -- 0x014E
when 000335 => D <= "00111010"; -- 0x014F
when 000336 => D <= "00000101"; -- 0x0150
when 000337 => D <= "00000100"; -- 0x0151
when 000338 => D <= "00110011"; -- 0x0152
when 000339 => D <= "00111010"; -- 0x0153
when 000340 => D <= "00000101"; -- 0x0154
when 000341 => D <= "00000100"; -- 0x0155
when 000342 => D <= "00110011"; -- 0x0156
when 000343 => D <= "00111010"; -- 0x0157
when 000344 => D <= "00000101"; -- 0x0158
when 000345 => D <= "00000100"; -- 0x0159
when 000346 => D <= "00110011"; -- 0x015A
when 000347 => D <= "00111010"; -- 0x015B
when 000348 => D <= "00000101"; -- 0x015C
when 000349 => D <= "00000100"; -- 0x015D
when 000350 => D <= "00110011"; -- 0x015E
when 000351 => D <= "00111010"; -- 0x015F
when 000352 => D <= "00000101"; -- 0x0160
when 000353 => D <= "00000100"; -- 0x0161
when 000354 => D <= "00110011"; -- 0x0162
when 000355 => D <= "00111010"; -- 0x0163
when 000356 => D <= "00000101"; -- 0x0164
when 000357 => D <= "00000100"; -- 0x0165
when 000358 => D <= "00110011"; -- 0x0166
when 000359 => D <= "00111010"; -- 0x0167
when 000360 => D <= "00000101"; -- 0x0168
when 000361 => D <= "00000100"; -- 0x0169
when 000362 => D <= "00110011"; -- 0x016A
when 000363 => D <= "00111010"; -- 0x016B
when 000364 => D <= "00000101"; -- 0x016C
when 000365 => D <= "00000100"; -- 0x016D
when 000366 => D <= "00110011"; -- 0x016E
when 000367 => D <= "00111010"; -- 0x016F
when 000368 => D <= "00000101"; -- 0x0170
when 000369 => D <= "00000100"; -- 0x0171
when 000370 => D <= "00110011"; -- 0x0172
when 000371 => D <= "00111010"; -- 0x0173
when 000372 => D <= "00000101"; -- 0x0174
when 000373 => D <= "00000100"; -- 0x0175
when 000374 => D <= "00110011"; -- 0x0176
when 000375 => D <= "00111010"; -- 0x0177
when 000376 => D <= "00000101"; -- 0x0178
when 000377 => D <= "00000100"; -- 0x0179
when 000378 => D <= "01000100"; -- 0x017A
when 000379 => D <= "00011111"; -- 0x017B
when 000380 => D <= "00110011"; -- 0x017C
when 000381 => D <= "00111010"; -- 0x017D
when 000382 => D <= "00000101"; -- 0x017E
when 000383 => D <= "00000100"; -- 0x017F
when 000384 => D <= "00110011"; -- 0x0180
when 000385 => D <= "00111010"; -- 0x0181
when 000386 => D <= "00000101"; -- 0x0182
when 000387 => D <= "00000100"; -- 0x0183
when 000388 => D <= "00110011"; -- 0x0184
when 000389 => D <= "00111010"; -- 0x0185
when 000390 => D <= "00000101"; -- 0x0186
when 000391 => D <= "00000100"; -- 0x0187
when 000392 => D <= "00110011"; -- 0x0188
when 000393 => D <= "00111010"; -- 0x0189
when 000394 => D <= "00000101"; -- 0x018A
when 000395 => D <= "00000100"; -- 0x018B
when 000396 => D <= "00110011"; -- 0x018C
when 000397 => D <= "00111010"; -- 0x018D
when 000398 => D <= "00000101"; -- 0x018E
when 000399 => D <= "00000100"; -- 0x018F
when 000400 => D <= "00110011"; -- 0x0190
when 000401 => D <= "00111010"; -- 0x0191
when 000402 => D <= "00000101"; -- 0x0192
when 000403 => D <= "00000100"; -- 0x0193
when 000404 => D <= "00110011"; -- 0x0194
when 000405 => D <= "00111010"; -- 0x0195
when 000406 => D <= "00000101"; -- 0x0196
when 000407 => D <= "00000100"; -- 0x0197
when 000408 => D <= "00110011"; -- 0x0198
when 000409 => D <= "00111010"; -- 0x0199
when 000410 => D <= "00000101"; -- 0x019A
when 000411 => D <= "00000100"; -- 0x019B
when 000412 => D <= "00110011"; -- 0x019C
when 000413 => D <= "00111010"; -- 0x019D
when 000414 => D <= "00000101"; -- 0x019E
when 000415 => D <= "00000100"; -- 0x019F
when 000416 => D <= "00110011"; -- 0x01A0
when 000417 => D <= "00111010"; -- 0x01A1
when 000418 => D <= "00000101"; -- 0x01A2
when 000419 => D <= "00000100"; -- 0x01A3
when 000420 => D <= "00110011"; -- 0x01A4
when 000421 => D <= "00111010"; -- 0x01A5
when 000422 => D <= "00000101"; -- 0x01A6
when 000423 => D <= "00000100"; -- 0x01A7
when 000424 => D <= "00110011"; -- 0x01A8
when 000425 => D <= "00111010"; -- 0x01A9
when 000426 => D <= "00000101"; -- 0x01AA
when 000427 => D <= "00000100"; -- 0x01AB
when 000428 => D <= "00110011"; -- 0x01AC
when 000429 => D <= "00111010"; -- 0x01AD
when 000430 => D <= "00000101"; -- 0x01AE
when 000431 => D <= "00000100"; -- 0x01AF
when 000432 => D <= "00110011"; -- 0x01B0
when 000433 => D <= "00111010"; -- 0x01B1
when 000434 => D <= "00000101"; -- 0x01B2
when 000435 => D <= "00000100"; -- 0x01B3
when 000436 => D <= "00110011"; -- 0x01B4
when 000437 => D <= "00111010"; -- 0x01B5
when 000438 => D <= "00000101"; -- 0x01B6
when 000439 => D <= "00000100"; -- 0x01B7
when 000440 => D <= "00110011"; -- 0x01B8
when 000441 => D <= "00111010"; -- 0x01B9
when 000442 => D <= "00000101"; -- 0x01BA
when 000443 => D <= "00000100"; -- 0x01BB
when 000444 => D <= "01000100"; -- 0x01BC
when 000445 => D <= "00101111"; -- 0x01BD
when 000446 => D <= "00110011"; -- 0x01BE
when 000447 => D <= "00111010"; -- 0x01BF
when 000448 => D <= "00000101"; -- 0x01C0
when 000449 => D <= "00000100"; -- 0x01C1
when 000450 => D <= "00110011"; -- 0x01C2
when 000451 => D <= "00111010"; -- 0x01C3
when 000452 => D <= "00000101"; -- 0x01C4
when 000453 => D <= "00000100"; -- 0x01C5
when 000454 => D <= "00110011"; -- 0x01C6
when 000455 => D <= "00111010"; -- 0x01C7
when 000456 => D <= "00000101"; -- 0x01C8
when 000457 => D <= "00000100"; -- 0x01C9
when 000458 => D <= "00110011"; -- 0x01CA
when 000459 => D <= "00111010"; -- 0x01CB
when 000460 => D <= "00000101"; -- 0x01CC
when 000461 => D <= "00000100"; -- 0x01CD
when 000462 => D <= "00110011"; -- 0x01CE
when 000463 => D <= "00111010"; -- 0x01CF
when 000464 => D <= "00000101"; -- 0x01D0
when 000465 => D <= "00000100"; -- 0x01D1
when 000466 => D <= "00110011"; -- 0x01D2
when 000467 => D <= "00111010"; -- 0x01D3
when 000468 => D <= "00000101"; -- 0x01D4
when 000469 => D <= "00000100"; -- 0x01D5
when 000470 => D <= "00110011"; -- 0x01D6
when 000471 => D <= "00111010"; -- 0x01D7
when 000472 => D <= "00000101"; -- 0x01D8
when 000473 => D <= "00000100"; -- 0x01D9
when 000474 => D <= "00110011"; -- 0x01DA
when 000475 => D <= "00111010"; -- 0x01DB
when 000476 => D <= "00000101"; -- 0x01DC
when 000477 => D <= "00000100"; -- 0x01DD
when 000478 => D <= "00110011"; -- 0x01DE
when 000479 => D <= "00111010"; -- 0x01DF
when 000480 => D <= "00000101"; -- 0x01E0
when 000481 => D <= "00000100"; -- 0x01E1
when 000482 => D <= "00110011"; -- 0x01E2
when 000483 => D <= "00111010"; -- 0x01E3
when 000484 => D <= "00000101"; -- 0x01E4
when 000485 => D <= "00000100"; -- 0x01E5
when 000486 => D <= "00110011"; -- 0x01E6
when 000487 => D <= "00111010"; -- 0x01E7
when 000488 => D <= "00000101"; -- 0x01E8
when 000489 => D <= "00000100"; -- 0x01E9
when 000490 => D <= "00110011"; -- 0x01EA
when 000491 => D <= "00111010"; -- 0x01EB
when 000492 => D <= "00000101"; -- 0x01EC
when 000493 => D <= "00000100"; -- 0x01ED
when 000494 => D <= "00110011"; -- 0x01EE
when 000495 => D <= "00111010"; -- 0x01EF
when 000496 => D <= "00000101"; -- 0x01F0
when 000497 => D <= "00000100"; -- 0x01F1
when 000498 => D <= "00110011"; -- 0x01F2
when 000499 => D <= "00111010"; -- 0x01F3
when 000500 => D <= "00000101"; -- 0x01F4
when 000501 => D <= "00000100"; -- 0x01F5
when 000502 => D <= "00110011"; -- 0x01F6
when 000503 => D <= "00111010"; -- 0x01F7
when 000504 => D <= "00000101"; -- 0x01F8
when 000505 => D <= "00000100"; -- 0x01F9
when 000506 => D <= "00110011"; -- 0x01FA
when 000507 => D <= "00111010"; -- 0x01FB
when 000508 => D <= "00000101"; -- 0x01FC
when 000509 => D <= "00000100"; -- 0x01FD
when 000510 => D <= "01000100"; -- 0x01FE
when 000511 => D <= "00111111"; -- 0x01FF
when 000512 => D <= "00110011"; -- 0x0200
when 000513 => D <= "00111010"; -- 0x0201
when 000514 => D <= "00000101"; -- 0x0202
when 000515 => D <= "00000100"; -- 0x0203
when 000516 => D <= "00110011"; -- 0x0204
when 000517 => D <= "00111010"; -- 0x0205
when 000518 => D <= "00000101"; -- 0x0206
when 000519 => D <= "00000100"; -- 0x0207
when 000520 => D <= "00110011"; -- 0x0208
when 000521 => D <= "00111010"; -- 0x0209
when 000522 => D <= "00000101"; -- 0x020A
when 000523 => D <= "00000100"; -- 0x020B
when 000524 => D <= "00110011"; -- 0x020C
when 000525 => D <= "00111010"; -- 0x020D
when 000526 => D <= "00000101"; -- 0x020E
when 000527 => D <= "00000100"; -- 0x020F
when 000528 => D <= "00110011"; -- 0x0210
when 000529 => D <= "00111010"; -- 0x0211
when 000530 => D <= "00000101"; -- 0x0212
when 000531 => D <= "00000100"; -- 0x0213
when 000532 => D <= "00110011"; -- 0x0214
when 000533 => D <= "00111010"; -- 0x0215
when 000534 => D <= "00000101"; -- 0x0216
when 000535 => D <= "00000100"; -- 0x0217
when 000536 => D <= "00110011"; -- 0x0218
when 000537 => D <= "00111010"; -- 0x0219
when 000538 => D <= "00000101"; -- 0x021A
when 000539 => D <= "00000100"; -- 0x021B
when 000540 => D <= "00110011"; -- 0x021C
when 000541 => D <= "00111010"; -- 0x021D
when 000542 => D <= "00000101"; -- 0x021E
when 000543 => D <= "00000100"; -- 0x021F
when 000544 => D <= "00110011"; -- 0x0220
when 000545 => D <= "00111010"; -- 0x0221
when 000546 => D <= "00000101"; -- 0x0222
when 000547 => D <= "00000100"; -- 0x0223
when 000548 => D <= "00110011"; -- 0x0224
when 000549 => D <= "00111010"; -- 0x0225
when 000550 => D <= "00000101"; -- 0x0226
when 000551 => D <= "00000100"; -- 0x0227
when 000552 => D <= "00110011"; -- 0x0228
when 000553 => D <= "00111010"; -- 0x0229
when 000554 => D <= "00000101"; -- 0x022A
when 000555 => D <= "00000100"; -- 0x022B
when 000556 => D <= "00110011"; -- 0x022C
when 000557 => D <= "00111010"; -- 0x022D
when 000558 => D <= "00000101"; -- 0x022E
when 000559 => D <= "00000100"; -- 0x022F
when 000560 => D <= "00110011"; -- 0x0230
when 000561 => D <= "00111010"; -- 0x0231
when 000562 => D <= "00000101"; -- 0x0232
when 000563 => D <= "00000100"; -- 0x0233
when 000564 => D <= "00110011"; -- 0x0234
when 000565 => D <= "00111010"; -- 0x0235
when 000566 => D <= "00000101"; -- 0x0236
when 000567 => D <= "00000100"; -- 0x0237
when 000568 => D <= "00110011"; -- 0x0238
when 000569 => D <= "00111010"; -- 0x0239
when 000570 => D <= "00000101"; -- 0x023A
when 000571 => D <= "00000100"; -- 0x023B
when 000572 => D <= "00110011"; -- 0x023C
when 000573 => D <= "00111010"; -- 0x023D
when 000574 => D <= "00000101"; -- 0x023E
when 000575 => D <= "00000100"; -- 0x023F
when 000576 => D <= "01000100"; -- 0x0240
when 000577 => D <= "01100010"; -- 0x0241
when 000578 => D <= "01000001"; -- 0x0242
when others => D <= "--------";
end case;
end if;
end process;
end;
/tags/rel_1_1/syn/t421/xc3s1000/rom_42x.hex
0,0 → 1,38
:100000004433593356783C333E001250333E00524D
:1000100050333E77333E50333A0050333A4D333A03
:1000200047333A4C430550333A1523805F2300068B
:10003000333A054A0707333E754E5307333A0723D1
:1000400000333E5406333A00400204230058230094
:10005000213392333E211F462142214B212300367A
:10006000239114332A0600302220230006333A005D
:100070003006333A333C07332C333A25333A3533A1
:100080003A3106222300102006333A00530622207C
:1000900006333A322006333A0F1E33A7333A332C55
:1000A000333A06333A33614F0057330106333A335C
:1000B0001106333A330306333A331306333A332106
:1000C00006333A3350332106333A0106333A1106E8
:1000D000333A0306333A332933282116333A332986
:1000E0000613333E33513A33504433290601333E2D
:1000F000444F06333A0F777E757C737A71787F763A
:100100007D747B7279701F777E757C737A71787FCE
:10011000767D747B7279702F777E757C737A7178B7
:100120007F767D747B7279703F777E757C737A7190
:10013000787F767D747B7279700F333A0504333A99
:100140000504333A0504333A0504333A0504333AD7
:100150000504333A0504333A0504333A0504333AC7
:100160000504333A0504333A0504333A0504333AB7
:100170000504333A0504333A0504441F333A0504B1
:10018000333A0504333A0504333A0504333A050497
:10019000333A0504333A0504333A0504333A050487
:1001A000333A0504333A0504333A0504333A050477
:1001B000333A0504333A0504333A0504442F333AFD
:1001C0000504333A0504333A0504333A0504333A57
:1001D0000504333A0504333A0504333A0504333A47
:1001E0000504333A0504333A0504333A0504333A37
:1001F0000504333A0504333A0504333A0504443F11
:10020000333A0504333A0504333A0504333A050416
:10021000333A0504333A0504333A0504333A050406
:10022000333A0504333A0504333A0504333A0504F6
:10023000333A0504333A0504333A0504333A0504E6
:03024000446241D4
:00000001FF
/tags/rel_1_1/syn/t421/xc3s1000/compile_project.tcl
0,0 → 1,46
##############################################################################
#
# Generic project compile script
#
# $Id: compile_project.tcl,v 1.1 2008-04-26 22:13:59 arniml Exp $
#
# Execute from within xtclsh.
#
# Environment variables:
# $MODULE : Name of the toplevel project
# -> mandatory <-
# $BLD : Build directory where the project and all temporary files
# are stored
# -> optional, default is "bld" <-
#
##############################################################################
 
# mandatory environment variable for project name: $MODULE
if {[info exists env(MODULE)]} {
set PROJECT $env(MODULE)
puts "Info: Setting project name from \$MODULE: $PROJECT"
} else {
puts "Error: Environment variable MODULE not set."
exit 1
}
 
# optional environment variable for build directory: $BLD
# default is 'bld'
puts -nonewline "Info: "
if {[info exists env(BLD)]} {
set bld $env(BLD)
puts -nonewline "Setting build directory from \$BLD"
} else {
set bld bld
puts -nonewline "Setting build directory to default"
}
puts ": $bld"
 
cd $bld
 
project open $PROJECT.ise
 
puts "Starting design implementation..."
process run "Generate Programming File"
 
project close
/tags/rel_1_1/syn/t421/xc3s1000/gen_ise_project.tcl
0,0 → 1,160
###############################################################################
#
# $Id: gen_ise_project.tcl,v 1.1 2008-04-26 22:13:59 arniml Exp $
#
# Based on
# Created by Phil Hays, Xilinx
# Setup Xilinx environment, then run from Unix with "xtclsh dice.tcl"
#
# This Tcl script will implement a design and load it in the S3E FPGA on
# the Spartan 3E Starter Kit Board
#
# There are two ucf files, one for pins and one for timing
#
###############################################################################
# Contact : e-mail hotline@xilinx.com
# phone + 1 800 255 7778
#
# Disclaimer: LIMITED WARRANTY AND DISCLAMER. These designs are
# provided to you "as is". Xilinx and its licensors make and you
# receive no warranties or conditions, express, implied,
# statutory or otherwise, and Xilinx specifically disclaims any
# implied warranties of merchantability, non-infringement, or
# fitness for a particular purpose. Xilinx does not warrant that
# the functions contained in these designs will meet your
# requirements, or that the operation of these designs will be
# uninterrupted or error free, or that defects in the Designs
# will be corrected. Furthermore, Xilinx does not warrant or
# make any representations regarding use or the results of the
# use of the designs in terms of correctness, accuracy,
# reliability, or otherwise.
#
# LIMITATION OF LIABILITY. In no event will Xilinx or its
# licensors be liable for any loss of data, lost profits, cost
# or procurement of substitute goods or services, or for any
# special, incidental, consequential, or indirect damages
# arising from the use or operation of the designs or
# accompanying documentation, however caused and on any theory
# of liability. This limitation will apply even if Xilinx
# has been advised of the possibility of such damage. This
# limitation shall apply not-withstanding the failure of the
# essential purpose of any limited remedies herein.
#
# Copyright (c) 2006 Xilinx, Inc.
# All rights reserved
#
###############################################################################
# Version 1.0 - 19-Oct-2006
# Initial version
###############################################################################
 
###############################################################################
# MAIN
###############################################################################
# Modify the project settings for the specific design
#
# Make sure there are no files in the build directory that you may want to
# keep, as this TCL script cleans that directory by default!
###############################################################################
 
# mandatory environment variable for project name: $MODULE
if {[info exists env(MODULE)]} {
set PROJECT $env(MODULE)
puts "Info: Setting project name from \$MODULE: $PROJECT"
} else {
puts "Error: Environment variable MODULE not set."
exit 1
}
 
# optional environment variable for build directory: $BLD
# default is 'bld'
puts -nonewline "Info: "
if {[info exists env(BLD)]} {
set bld $env(BLD)
puts -nonewline "Setting build directory from \$BLD"
} else {
set bld bld
puts -nonewline "Setting build directory to default"
}
puts ": $bld"
 
# optional environment variable for source file compile list: $COMPILE_LIST
# default is 'compile_list'
puts -nonewline "Info: "
if {[info exists env(COMPILE_LIST)]} {
set compile_list $env(COMPILE_LIST)
puts -nonewline "Setting source file compile list from \$COMPILE_LIST"
} else {
set compile_list compile_list
puts -nonewline "Setting source file compile list to default"
}
puts ": $compile_list"
 
if {[file exists $bld]} {
puts "Deleting all existing project files in '$bld'"
# Perhaps ask ok here??
# Or perhaps skip project creation if project exists??
file delete -force $bld
}
puts "Creating new project directory in '$bld'..."
file mkdir $bld
 
###############################################################################
# Put two ucf file into one.
# This could be made as complex as required, however for demonstration it is
# just a simple copy.
###############################################################################
 
puts "Creating new UCF file..."
 
set tempucf [file join $bld temp.ucf]
set outfile [open $tempucf "w"]
set infile [open "timing.ucf" "r"]
while {![eof $infile]} {
puts $outfile [gets $infile]
}
close $infile
close $outfile
#
puts "Creating new ISE project..."
cd $bld
project new $PROJECT.ise
project set family spartan3
project set device xc3s1000
project set package fg456
project set speed -4
 
 
###############################################################################
# Modify the xfile add argument for the source files in the design
###############################################################################
 
puts "Adding source files..."
set infile [open "../compile_list" "r"]
while {![eof $infile]} {
xfile add "../[gets $infile]"
}
xfile add temp.ucf
 
 
###############################################################################
# Set optional implementation options here. There is a problem with setting
# project properties that at least one source must be added to the project
# first. Therefore, the "project set" commands are after the "xfile add"
# commands.
###############################################################################
 
puts "Setting project properties..."
 
project set {Optimization Goal} Area -process {Synthesize - XST}
project set {Optimization Effort} Normal -process {Synthesize - XST}
#project set "Map Effort Level" High
#project set {Perform Timing-Driven Packing and Placement} 1
project set {Place & Route Effort Level (Overall)} Standard
#project set "Other Place & Route Command Line Options" "-intsyle xflow"
project set {Generate Post-Place & Route Static Timing Report} true
project set {Report Unconstrained Paths} 10 -process {Generate Post-Place & Route Static Timing}
project set {Report Type} {Verbose Report} -process {Generate Post-Place & Route Static Timing}
project set {Create Binary Configuration File} 1 -process {Generate Programming File}
 
project close
/tags/rel_1_1/syn/t421/xc3s1000/timing.ucf
0,0 → 1,6
################################################################################
# Clock Constraints
################################################################################
 
NET "ck_i" TNM_NET = "ck_i";
TIMESPEC "TS_ck_i" = PERIOD "ck_i" 250 ns;
/tags/rel_1_1/syn/t421/xc3s1000/Makefile
0,0 → 1,42
##############################################################################
#
# Generic Makefile for ISE projects
#
# $Id: Makefile,v 1.1 2008-04-26 22:13:59 arniml Exp $
#
# Execute with 'make <target>', where target is one of
# ise : build ISE project from
# - files in compile_list
# - project settings in timing.ucf and <board>.ucf
# - project settings applied in gen_ise_project.tcl
# compile : compile ISE project by means of tcl script
# compile_project.tcl
# <blank> | all : run through all targets above
#
##############################################################################
 
export MODULE := t421
 
export COMPILE_LIST := compile_list
SOURCE_FILES := $(shell cat $(COMPILE_LIST))
export BLD := bld
 
.PHONY: all
all: $(BLD)/$(MODULE).bit
 
.PHONY: ise
ise: $(BLD)/$(MODULE).ise
 
.PHONY: compile
compile: $(BLD)/$(MODULE).bit
 
$(BLD)/$(MODULE).ise: $(COMPILE_LIST) *.ucf gen_ise_project.tcl
xtclsh gen_ise_project.tcl
 
$(BLD)/$(MODULE).bit: $(SOURCE_FILES) $(BLD)/$(MODULE).ise compile_project.tcl
xtclsh compile_project.tcl
touch $@
 
.PHONY: clean
clean:
rm -rf *~ bld
/tags/rel_1_1/syn/t421/ep1c12/t421.qsf
0,0 → 1,76
set_global_assignment -name TOP_LEVEL_ENTITY t421
# Copyright (C) 1991-2005 Altera Corporation
# Your use of Altera Corporation's design tools, logic functions
# and other software and tools, and its AMPP partner logic
# functions, and any output files any of the foregoing
# (including device programming or simulation files), and any
# associated documentation or information are expressly subject
# to the terms and conditions of the Altera Program License
# Subscription Agreement, Altera MegaCore Function License
# Agreement, or other applicable license agreement, including,
# without limitation, that your use is for the sole purpose of
# programming logic devices manufactured by Altera and sold by
# Altera or its authorized distributors. Please refer to the
# applicable agreement for further details.
 
 
# The default values for assignments are stored in the file
# t421_assignment_defaults.qdf
# If this file doesn't exist, and for assignments not listed, see file
# assignment_defaults.qdf
 
# Altera recommends that you do not modify this file. This
# file is updated automatically by the Quartus II software
# and any changes you make may be lost or overwritten.
 
 
# Project-Wide Assignments
# ========================
set_global_assignment -name ORIGINAL_QUARTUS_VERSION "7.0 SP1"
set_global_assignment -name PROJECT_CREATION_TIME_DATE "20:20:14 April 27, 2008"
set_global_assignment -name LAST_QUARTUS_VERSION 7.0
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_opt_pack-p.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_clkgen.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_reset.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_pack-p.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_pmem_ctrl.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_dmem_ctrl.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_comp_pack-p.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_mnemonic_pack-p.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_decoder.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_skip.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_alu.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_stack.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_io_pack-p.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_io_l.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_io_d.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_io_g.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_io_in.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_sio.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_timer.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_core.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/tech/generic/generic_ram_ena.vhd
set_global_assignment -name VHDL_FILE rom_t42x.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/system/t420_rom-e.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/system/t420_rom-struct-a.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/tech/cyclone/t400_por.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/t400_core_comp_pack-p.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/tech/t400_tech_comp_pack-p.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/system/t420_notri.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/system/t400_system_comp_pack-p.vhd
set_global_assignment -name VHDL_FILE ../../../rtl/vhdl/system/t421.vhd
 
# Analysis & Synthesis Assignments
# ================================
set_global_assignment -name VHDL_INPUT_VERSION VHDL87
 
set_global_assignment -name FAMILY Cyclone
set_global_assignment -name DEVICE EP1C12Q240C8
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED WITH WEAK PULL-UP"
set_global_assignment -name RESERVE_ASDO_AFTER_CONFIGURATION "AS INPUT TRI-STATED"
set_global_assignment -name FMAX_REQUIREMENT "4 MHz" -section_id ck_i
set_instance_assignment -name CLOCK_SETTINGS ck_i -to ck_i
set_instance_assignment -name PARTITION_HIERARCHY no_file_for_top_partition -to | -section_id Top
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
 
set_global_assignment -name CYCLONE_OPTIMIZATION_TECHNIQUE AREA
/tags/rel_1_1/syn/t421/ep1c12/rom_t42x.vhd
0,0 → 1,604
-- This file was generated with hex2rom written by Daniel Wallner
 
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
 
entity rom_t42x is
port(
Clk : in std_logic;
A : in std_logic_vector(9 downto 0);
D : out std_logic_vector(7 downto 0)
);
end rom_t42x;
 
architecture rtl of rom_t42x is
begin
process (Clk)
begin
if Clk'event and Clk = '1' then
case to_integer(unsigned(A)) is
when 000000 => D <= "01000100"; -- 0x0000
when 000001 => D <= "00110011"; -- 0x0001
when 000002 => D <= "01011001"; -- 0x0002
when 000003 => D <= "00110011"; -- 0x0003
when 000004 => D <= "01010110"; -- 0x0004
when 000005 => D <= "01111000"; -- 0x0005
when 000006 => D <= "00111100"; -- 0x0006
when 000007 => D <= "00110011"; -- 0x0007
when 000008 => D <= "00111110"; -- 0x0008
when 000009 => D <= "00000000"; -- 0x0009
when 000010 => D <= "00010010"; -- 0x000A
when 000011 => D <= "01010000"; -- 0x000B
when 000012 => D <= "00110011"; -- 0x000C
when 000013 => D <= "00111110"; -- 0x000D
when 000014 => D <= "00000000"; -- 0x000E
when 000015 => D <= "01010010"; -- 0x000F
when 000016 => D <= "01010000"; -- 0x0010
when 000017 => D <= "00110011"; -- 0x0011
when 000018 => D <= "00111110"; -- 0x0012
when 000019 => D <= "01110111"; -- 0x0013
when 000020 => D <= "00110011"; -- 0x0014
when 000021 => D <= "00111110"; -- 0x0015
when 000022 => D <= "01010000"; -- 0x0016
when 000023 => D <= "00110011"; -- 0x0017
when 000024 => D <= "00111010"; -- 0x0018
when 000025 => D <= "00000000"; -- 0x0019
when 000026 => D <= "01010000"; -- 0x001A
when 000027 => D <= "00110011"; -- 0x001B
when 000028 => D <= "00111010"; -- 0x001C
when 000029 => D <= "01001101"; -- 0x001D
when 000030 => D <= "00110011"; -- 0x001E
when 000031 => D <= "00111010"; -- 0x001F
when 000032 => D <= "01000111"; -- 0x0020
when 000033 => D <= "00110011"; -- 0x0021
when 000034 => D <= "00111010"; -- 0x0022
when 000035 => D <= "01001100"; -- 0x0023
when 000036 => D <= "01000011"; -- 0x0024
when 000037 => D <= "00000101"; -- 0x0025
when 000038 => D <= "01010000"; -- 0x0026
when 000039 => D <= "00110011"; -- 0x0027
when 000040 => D <= "00111010"; -- 0x0028
when 000041 => D <= "00010101"; -- 0x0029
when 000042 => D <= "00100011"; -- 0x002A
when 000043 => D <= "10000000"; -- 0x002B
when 000044 => D <= "01011111"; -- 0x002C
when 000045 => D <= "00100011"; -- 0x002D
when 000046 => D <= "00000000"; -- 0x002E
when 000047 => D <= "00000110"; -- 0x002F
when 000048 => D <= "00110011"; -- 0x0030
when 000049 => D <= "00111010"; -- 0x0031
when 000050 => D <= "00000101"; -- 0x0032
when 000051 => D <= "01001010"; -- 0x0033
when 000052 => D <= "00000111"; -- 0x0034
when 000053 => D <= "00000111"; -- 0x0035
when 000054 => D <= "00110011"; -- 0x0036
when 000055 => D <= "00111110"; -- 0x0037
when 000056 => D <= "01110101"; -- 0x0038
when 000057 => D <= "01001110"; -- 0x0039
when 000058 => D <= "01010011"; -- 0x003A
when 000059 => D <= "00000111"; -- 0x003B
when 000060 => D <= "00110011"; -- 0x003C
when 000061 => D <= "00111010"; -- 0x003D
when 000062 => D <= "00000111"; -- 0x003E
when 000063 => D <= "00100011"; -- 0x003F
when 000064 => D <= "00000000"; -- 0x0040
when 000065 => D <= "00110011"; -- 0x0041
when 000066 => D <= "00111110"; -- 0x0042
when 000067 => D <= "01010100"; -- 0x0043
when 000068 => D <= "00000110"; -- 0x0044
when 000069 => D <= "00110011"; -- 0x0045
when 000070 => D <= "00111010"; -- 0x0046
when 000071 => D <= "00000000"; -- 0x0047
when 000072 => D <= "01000000"; -- 0x0048
when 000073 => D <= "00000010"; -- 0x0049
when 000074 => D <= "00000100"; -- 0x004A
when 000075 => D <= "00100011"; -- 0x004B
when 000076 => D <= "00000000"; -- 0x004C
when 000077 => D <= "01011000"; -- 0x004D
when 000078 => D <= "00100011"; -- 0x004E
when 000079 => D <= "00000000"; -- 0x004F
when 000080 => D <= "00100001"; -- 0x0050
when 000081 => D <= "00110011"; -- 0x0051
when 000082 => D <= "10010010"; -- 0x0052
when 000083 => D <= "00110011"; -- 0x0053
when 000084 => D <= "00111110"; -- 0x0054
when 000085 => D <= "00100001"; -- 0x0055
when 000086 => D <= "00011111"; -- 0x0056
when 000087 => D <= "01000110"; -- 0x0057
when 000088 => D <= "00100001"; -- 0x0058
when 000089 => D <= "01000010"; -- 0x0059
when 000090 => D <= "00100001"; -- 0x005A
when 000091 => D <= "01001011"; -- 0x005B
when 000092 => D <= "00100001"; -- 0x005C
when 000093 => D <= "00100011"; -- 0x005D
when 000094 => D <= "00000000"; -- 0x005E
when 000095 => D <= "00110110"; -- 0x005F
when 000096 => D <= "00100011"; -- 0x0060
when 000097 => D <= "10010001"; -- 0x0061
when 000098 => D <= "00010100"; -- 0x0062
when 000099 => D <= "00110011"; -- 0x0063
when 000100 => D <= "00101010"; -- 0x0064
when 000101 => D <= "00000110"; -- 0x0065
when 000102 => D <= "00000000"; -- 0x0066
when 000103 => D <= "00110000"; -- 0x0067
when 000104 => D <= "00100010"; -- 0x0068
when 000105 => D <= "00100000"; -- 0x0069
when 000106 => D <= "00100011"; -- 0x006A
when 000107 => D <= "00000000"; -- 0x006B
when 000108 => D <= "00000110"; -- 0x006C
when 000109 => D <= "00110011"; -- 0x006D
when 000110 => D <= "00111010"; -- 0x006E
when 000111 => D <= "00000000"; -- 0x006F
when 000112 => D <= "00110000"; -- 0x0070
when 000113 => D <= "00000110"; -- 0x0071
when 000114 => D <= "00110011"; -- 0x0072
when 000115 => D <= "00111010"; -- 0x0073
when 000116 => D <= "00110011"; -- 0x0074
when 000117 => D <= "00111100"; -- 0x0075
when 000118 => D <= "00000111"; -- 0x0076
when 000119 => D <= "00110011"; -- 0x0077
when 000120 => D <= "00101100"; -- 0x0078
when 000121 => D <= "00110011"; -- 0x0079
when 000122 => D <= "00111010"; -- 0x007A
when 000123 => D <= "00100101"; -- 0x007B
when 000124 => D <= "00110011"; -- 0x007C
when 000125 => D <= "00111010"; -- 0x007D
when 000126 => D <= "00110101"; -- 0x007E
when 000127 => D <= "00110011"; -- 0x007F
when 000128 => D <= "00111010"; -- 0x0080
when 000129 => D <= "00110001"; -- 0x0081
when 000130 => D <= "00000110"; -- 0x0082
when 000131 => D <= "00100010"; -- 0x0083
when 000132 => D <= "00100011"; -- 0x0084
when 000133 => D <= "00000000"; -- 0x0085
when 000134 => D <= "00010000"; -- 0x0086
when 000135 => D <= "00100000"; -- 0x0087
when 000136 => D <= "00000110"; -- 0x0088
when 000137 => D <= "00110011"; -- 0x0089
when 000138 => D <= "00111010"; -- 0x008A
when 000139 => D <= "00000000"; -- 0x008B
when 000140 => D <= "01010011"; -- 0x008C
when 000141 => D <= "00000110"; -- 0x008D
when 000142 => D <= "00100010"; -- 0x008E
when 000143 => D <= "00100000"; -- 0x008F
when 000144 => D <= "00000110"; -- 0x0090
when 000145 => D <= "00110011"; -- 0x0091
when 000146 => D <= "00111010"; -- 0x0092
when 000147 => D <= "00110010"; -- 0x0093
when 000148 => D <= "00100000"; -- 0x0094
when 000149 => D <= "00000110"; -- 0x0095
when 000150 => D <= "00110011"; -- 0x0096
when 000151 => D <= "00111010"; -- 0x0097
when 000152 => D <= "00001111"; -- 0x0098
when 000153 => D <= "00011110"; -- 0x0099
when 000154 => D <= "00110011"; -- 0x009A
when 000155 => D <= "10100111"; -- 0x009B
when 000156 => D <= "00110011"; -- 0x009C
when 000157 => D <= "00111010"; -- 0x009D
when 000158 => D <= "00110011"; -- 0x009E
when 000159 => D <= "00101100"; -- 0x009F
when 000160 => D <= "00110011"; -- 0x00A0
when 000161 => D <= "00111010"; -- 0x00A1
when 000162 => D <= "00000110"; -- 0x00A2
when 000163 => D <= "00110011"; -- 0x00A3
when 000164 => D <= "00111010"; -- 0x00A4
when 000165 => D <= "00110011"; -- 0x00A5
when 000166 => D <= "01100001"; -- 0x00A6
when 000167 => D <= "01001111"; -- 0x00A7
when 000168 => D <= "00000000"; -- 0x00A8
when 000169 => D <= "01010111"; -- 0x00A9
when 000170 => D <= "00110011"; -- 0x00AA
when 000171 => D <= "00000001"; -- 0x00AB
when 000172 => D <= "00000110"; -- 0x00AC
when 000173 => D <= "00110011"; -- 0x00AD
when 000174 => D <= "00111010"; -- 0x00AE
when 000175 => D <= "00110011"; -- 0x00AF
when 000176 => D <= "00010001"; -- 0x00B0
when 000177 => D <= "00000110"; -- 0x00B1
when 000178 => D <= "00110011"; -- 0x00B2
when 000179 => D <= "00111010"; -- 0x00B3
when 000180 => D <= "00110011"; -- 0x00B4
when 000181 => D <= "00000011"; -- 0x00B5
when 000182 => D <= "00000110"; -- 0x00B6
when 000183 => D <= "00110011"; -- 0x00B7
when 000184 => D <= "00111010"; -- 0x00B8
when 000185 => D <= "00110011"; -- 0x00B9
when 000186 => D <= "00010011"; -- 0x00BA
when 000187 => D <= "00000110"; -- 0x00BB
when 000188 => D <= "00110011"; -- 0x00BC
when 000189 => D <= "00111010"; -- 0x00BD
when 000190 => D <= "00110011"; -- 0x00BE
when 000191 => D <= "00100001"; -- 0x00BF
when 000192 => D <= "00000110"; -- 0x00C0
when 000193 => D <= "00110011"; -- 0x00C1
when 000194 => D <= "00111010"; -- 0x00C2
when 000195 => D <= "00110011"; -- 0x00C3
when 000196 => D <= "01010000"; -- 0x00C4
when 000197 => D <= "00110011"; -- 0x00C5
when 000198 => D <= "00100001"; -- 0x00C6
when 000199 => D <= "00000110"; -- 0x00C7
when 000200 => D <= "00110011"; -- 0x00C8
when 000201 => D <= "00111010"; -- 0x00C9
when 000202 => D <= "00000001"; -- 0x00CA
when 000203 => D <= "00000110"; -- 0x00CB
when 000204 => D <= "00110011"; -- 0x00CC
when 000205 => D <= "00111010"; -- 0x00CD
when 000206 => D <= "00010001"; -- 0x00CE
when 000207 => D <= "00000110"; -- 0x00CF
when 000208 => D <= "00110011"; -- 0x00D0
when 000209 => D <= "00111010"; -- 0x00D1
when 000210 => D <= "00000011"; -- 0x00D2
when 000211 => D <= "00000110"; -- 0x00D3
when 000212 => D <= "00110011"; -- 0x00D4
when 000213 => D <= "00111010"; -- 0x00D5
when 000214 => D <= "00110011"; -- 0x00D6
when 000215 => D <= "00101001"; -- 0x00D7
when 000216 => D <= "00110011"; -- 0x00D8
when 000217 => D <= "00101000"; -- 0x00D9
when 000218 => D <= "00100001"; -- 0x00DA
when 000219 => D <= "00010110"; -- 0x00DB
when 000220 => D <= "00110011"; -- 0x00DC
when 000221 => D <= "00111010"; -- 0x00DD
when 000222 => D <= "00110011"; -- 0x00DE
when 000223 => D <= "00101001"; -- 0x00DF
when 000224 => D <= "00000110"; -- 0x00E0
when 000225 => D <= "00010011"; -- 0x00E1
when 000226 => D <= "00110011"; -- 0x00E2
when 000227 => D <= "00111110"; -- 0x00E3
when 000228 => D <= "00110011"; -- 0x00E4
when 000229 => D <= "01010001"; -- 0x00E5
when 000230 => D <= "00111010"; -- 0x00E6
when 000231 => D <= "00110011"; -- 0x00E7
when 000232 => D <= "01010000"; -- 0x00E8
when 000233 => D <= "01000100"; -- 0x00E9
when 000234 => D <= "00110011"; -- 0x00EA
when 000235 => D <= "00101001"; -- 0x00EB
when 000236 => D <= "00000110"; -- 0x00EC
when 000237 => D <= "00000001"; -- 0x00ED
when 000238 => D <= "00110011"; -- 0x00EE
when 000239 => D <= "00111110"; -- 0x00EF
when 000240 => D <= "01000100"; -- 0x00F0
when 000241 => D <= "01001111"; -- 0x00F1
when 000242 => D <= "00000110"; -- 0x00F2
when 000243 => D <= "00110011"; -- 0x00F3
when 000244 => D <= "00111010"; -- 0x00F4
when 000245 => D <= "00001111"; -- 0x00F5
when 000246 => D <= "01110111"; -- 0x00F6
when 000247 => D <= "01111110"; -- 0x00F7
when 000248 => D <= "01110101"; -- 0x00F8
when 000249 => D <= "01111100"; -- 0x00F9
when 000250 => D <= "01110011"; -- 0x00FA
when 000251 => D <= "01111010"; -- 0x00FB
when 000252 => D <= "01110001"; -- 0x00FC
when 000253 => D <= "01111000"; -- 0x00FD
when 000254 => D <= "01111111"; -- 0x00FE
when 000255 => D <= "01110110"; -- 0x00FF
when 000256 => D <= "01111101"; -- 0x0100
when 000257 => D <= "01110100"; -- 0x0101
when 000258 => D <= "01111011"; -- 0x0102
when 000259 => D <= "01110010"; -- 0x0103
when 000260 => D <= "01111001"; -- 0x0104
when 000261 => D <= "01110000"; -- 0x0105
when 000262 => D <= "00011111"; -- 0x0106
when 000263 => D <= "01110111"; -- 0x0107
when 000264 => D <= "01111110"; -- 0x0108
when 000265 => D <= "01110101"; -- 0x0109
when 000266 => D <= "01111100"; -- 0x010A
when 000267 => D <= "01110011"; -- 0x010B
when 000268 => D <= "01111010"; -- 0x010C
when 000269 => D <= "01110001"; -- 0x010D
when 000270 => D <= "01111000"; -- 0x010E
when 000271 => D <= "01111111"; -- 0x010F
when 000272 => D <= "01110110"; -- 0x0110
when 000273 => D <= "01111101"; -- 0x0111
when 000274 => D <= "01110100"; -- 0x0112
when 000275 => D <= "01111011"; -- 0x0113
when 000276 => D <= "01110010"; -- 0x0114
when 000277 => D <= "01111001"; -- 0x0115
when 000278 => D <= "01110000"; -- 0x0116
when 000279 => D <= "00101111"; -- 0x0117
when 000280 => D <= "01110111"; -- 0x0118
when 000281 => D <= "01111110"; -- 0x0119
when 000282 => D <= "01110101"; -- 0x011A
when 000283 => D <= "01111100"; -- 0x011B
when 000284 => D <= "01110011"; -- 0x011C
when 000285 => D <= "01111010"; -- 0x011D
when 000286 => D <= "01110001"; -- 0x011E
when 000287 => D <= "01111000"; -- 0x011F
when 000288 => D <= "01111111"; -- 0x0120
when 000289 => D <= "01110110"; -- 0x0121
when 000290 => D <= "01111101"; -- 0x0122
when 000291 => D <= "01110100"; -- 0x0123
when 000292 => D <= "01111011"; -- 0x0124
when 000293 => D <= "01110010"; -- 0x0125
when 000294 => D <= "01111001"; -- 0x0126
when 000295 => D <= "01110000"; -- 0x0127
when 000296 => D <= "00111111"; -- 0x0128
when 000297 => D <= "01110111"; -- 0x0129
when 000298 => D <= "01111110"; -- 0x012A
when 000299 => D <= "01110101"; -- 0x012B
when 000300 => D <= "01111100"; -- 0x012C
when 000301 => D <= "01110011"; -- 0x012D
when 000302 => D <= "01111010"; -- 0x012E
when 000303 => D <= "01110001"; -- 0x012F
when 000304 => D <= "01111000"; -- 0x0130
when 000305 => D <= "01111111"; -- 0x0131
when 000306 => D <= "01110110"; -- 0x0132
when 000307 => D <= "01111101"; -- 0x0133
when 000308 => D <= "01110100"; -- 0x0134
when 000309 => D <= "01111011"; -- 0x0135
when 000310 => D <= "01110010"; -- 0x0136
when 000311 => D <= "01111001"; -- 0x0137
when 000312 => D <= "01110000"; -- 0x0138
when 000313 => D <= "00001111"; -- 0x0139
when 000314 => D <= "00110011"; -- 0x013A
when 000315 => D <= "00111010"; -- 0x013B
when 000316 => D <= "00000101"; -- 0x013C
when 000317 => D <= "00000100"; -- 0x013D
when 000318 => D <= "00110011"; -- 0x013E
when 000319 => D <= "00111010"; -- 0x013F
when 000320 => D <= "00000101"; -- 0x0140
when 000321 => D <= "00000100"; -- 0x0141
when 000322 => D <= "00110011"; -- 0x0142
when 000323 => D <= "00111010"; -- 0x0143
when 000324 => D <= "00000101"; -- 0x0144
when 000325 => D <= "00000100"; -- 0x0145
when 000326 => D <= "00110011"; -- 0x0146
when 000327 => D <= "00111010"; -- 0x0147
when 000328 => D <= "00000101"; -- 0x0148
when 000329 => D <= "00000100"; -- 0x0149
when 000330 => D <= "00110011"; -- 0x014A
when 000331 => D <= "00111010"; -- 0x014B
when 000332 => D <= "00000101"; -- 0x014C
when 000333 => D <= "00000100"; -- 0x014D
when 000334 => D <= "00110011"; -- 0x014E
when 000335 => D <= "00111010"; -- 0x014F
when 000336 => D <= "00000101"; -- 0x0150
when 000337 => D <= "00000100"; -- 0x0151
when 000338 => D <= "00110011"; -- 0x0152
when 000339 => D <= "00111010"; -- 0x0153
when 000340 => D <= "00000101"; -- 0x0154
when 000341 => D <= "00000100"; -- 0x0155
when 000342 => D <= "00110011"; -- 0x0156
when 000343 => D <= "00111010"; -- 0x0157
when 000344 => D <= "00000101"; -- 0x0158
when 000345 => D <= "00000100"; -- 0x0159
when 000346 => D <= "00110011"; -- 0x015A
when 000347 => D <= "00111010"; -- 0x015B
when 000348 => D <= "00000101"; -- 0x015C
when 000349 => D <= "00000100"; -- 0x015D
when 000350 => D <= "00110011"; -- 0x015E
when 000351 => D <= "00111010"; -- 0x015F
when 000352 => D <= "00000101"; -- 0x0160
when 000353 => D <= "00000100"; -- 0x0161
when 000354 => D <= "00110011"; -- 0x0162
when 000355 => D <= "00111010"; -- 0x0163
when 000356 => D <= "00000101"; -- 0x0164
when 000357 => D <= "00000100"; -- 0x0165
when 000358 => D <= "00110011"; -- 0x0166
when 000359 => D <= "00111010"; -- 0x0167
when 000360 => D <= "00000101"; -- 0x0168
when 000361 => D <= "00000100"; -- 0x0169
when 000362 => D <= "00110011"; -- 0x016A
when 000363 => D <= "00111010"; -- 0x016B
when 000364 => D <= "00000101"; -- 0x016C
when 000365 => D <= "00000100"; -- 0x016D
when 000366 => D <= "00110011"; -- 0x016E
when 000367 => D <= "00111010"; -- 0x016F
when 000368 => D <= "00000101"; -- 0x0170
when 000369 => D <= "00000100"; -- 0x0171
when 000370 => D <= "00110011"; -- 0x0172
when 000371 => D <= "00111010"; -- 0x0173
when 000372 => D <= "00000101"; -- 0x0174
when 000373 => D <= "00000100"; -- 0x0175
when 000374 => D <= "00110011"; -- 0x0176
when 000375 => D <= "00111010"; -- 0x0177
when 000376 => D <= "00000101"; -- 0x0178
when 000377 => D <= "00000100"; -- 0x0179
when 000378 => D <= "01000100"; -- 0x017A
when 000379 => D <= "00011111"; -- 0x017B
when 000380 => D <= "00110011"; -- 0x017C
when 000381 => D <= "00111010"; -- 0x017D
when 000382 => D <= "00000101"; -- 0x017E
when 000383 => D <= "00000100"; -- 0x017F
when 000384 => D <= "00110011"; -- 0x0180
when 000385 => D <= "00111010"; -- 0x0181
when 000386 => D <= "00000101"; -- 0x0182
when 000387 => D <= "00000100"; -- 0x0183
when 000388 => D <= "00110011"; -- 0x0184
when 000389 => D <= "00111010"; -- 0x0185
when 000390 => D <= "00000101"; -- 0x0186
when 000391 => D <= "00000100"; -- 0x0187
when 000392 => D <= "00110011"; -- 0x0188
when 000393 => D <= "00111010"; -- 0x0189
when 000394 => D <= "00000101"; -- 0x018A
when 000395 => D <= "00000100"; -- 0x018B
when 000396 => D <= "00110011"; -- 0x018C
when 000397 => D <= "00111010"; -- 0x018D
when 000398 => D <= "00000101"; -- 0x018E
when 000399 => D <= "00000100"; -- 0x018F
when 000400 => D <= "00110011"; -- 0x0190
when 000401 => D <= "00111010"; -- 0x0191
when 000402 => D <= "00000101"; -- 0x0192
when 000403 => D <= "00000100"; -- 0x0193
when 000404 => D <= "00110011"; -- 0x0194
when 000405 => D <= "00111010"; -- 0x0195
when 000406 => D <= "00000101"; -- 0x0196
when 000407 => D <= "00000100"; -- 0x0197
when 000408 => D <= "00110011"; -- 0x0198
when 000409 => D <= "00111010"; -- 0x0199
when 000410 => D <= "00000101"; -- 0x019A
when 000411 => D <= "00000100"; -- 0x019B
when 000412 => D <= "00110011"; -- 0x019C
when 000413 => D <= "00111010"; -- 0x019D
when 000414 => D <= "00000101"; -- 0x019E
when 000415 => D <= "00000100"; -- 0x019F
when 000416 => D <= "00110011"; -- 0x01A0
when 000417 => D <= "00111010"; -- 0x01A1
when 000418 => D <= "00000101"; -- 0x01A2
when 000419 => D <= "00000100"; -- 0x01A3
when 000420 => D <= "00110011"; -- 0x01A4
when 000421 => D <= "00111010"; -- 0x01A5
when 000422 => D <= "00000101"; -- 0x01A6
when 000423 => D <= "00000100"; -- 0x01A7
when 000424 => D <= "00110011"; -- 0x01A8
when 000425 => D <= "00111010"; -- 0x01A9
when 000426 => D <= "00000101"; -- 0x01AA
when 000427 => D <= "00000100"; -- 0x01AB
when 000428 => D <= "00110011"; -- 0x01AC
when 000429 => D <= "00111010"; -- 0x01AD
when 000430 => D <= "00000101"; -- 0x01AE
when 000431 => D <= "00000100"; -- 0x01AF
when 000432 => D <= "00110011"; -- 0x01B0
when 000433 => D <= "00111010"; -- 0x01B1
when 000434 => D <= "00000101"; -- 0x01B2
when 000435 => D <= "00000100"; -- 0x01B3
when 000436 => D <= "00110011"; -- 0x01B4
when 000437 => D <= "00111010"; -- 0x01B5
when 000438 => D <= "00000101"; -- 0x01B6
when 000439 => D <= "00000100"; -- 0x01B7
when 000440 => D <= "00110011"; -- 0x01B8
when 000441 => D <= "00111010"; -- 0x01B9
when 000442 => D <= "00000101"; -- 0x01BA
when 000443 => D <= "00000100"; -- 0x01BB
when 000444 => D <= "01000100"; -- 0x01BC
when 000445 => D <= "00101111"; -- 0x01BD
when 000446 => D <= "00110011"; -- 0x01BE
when 000447 => D <= "00111010"; -- 0x01BF
when 000448 => D <= "00000101"; -- 0x01C0
when 000449 => D <= "00000100"; -- 0x01C1
when 000450 => D <= "00110011"; -- 0x01C2
when 000451 => D <= "00111010"; -- 0x01C3
when 000452 => D <= "00000101"; -- 0x01C4
when 000453 => D <= "00000100"; -- 0x01C5
when 000454 => D <= "00110011"; -- 0x01C6
when 000455 => D <= "00111010"; -- 0x01C7
when 000456 => D <= "00000101"; -- 0x01C8
when 000457 => D <= "00000100"; -- 0x01C9
when 000458 => D <= "00110011"; -- 0x01CA
when 000459 => D <= "00111010"; -- 0x01CB
when 000460 => D <= "00000101"; -- 0x01CC
when 000461 => D <= "00000100"; -- 0x01CD
when 000462 => D <= "00110011"; -- 0x01CE
when 000463 => D <= "00111010"; -- 0x01CF
when 000464 => D <= "00000101"; -- 0x01D0
when 000465 => D <= "00000100"; -- 0x01D1
when 000466 => D <= "00110011"; -- 0x01D2
when 000467 => D <= "00111010"; -- 0x01D3
when 000468 => D <= "00000101"; -- 0x01D4
when 000469 => D <= "00000100"; -- 0x01D5
when 000470 => D <= "00110011"; -- 0x01D6
when 000471 => D <= "00111010"; -- 0x01D7
when 000472 => D <= "00000101"; -- 0x01D8
when 000473 => D <= "00000100"; -- 0x01D9
when 000474 => D <= "00110011"; -- 0x01DA
when 000475 => D <= "00111010"; -- 0x01DB
when 000476 => D <= "00000101"; -- 0x01DC
when 000477 => D <= "00000100"; -- 0x01DD
when 000478 => D <= "00110011"; -- 0x01DE
when 000479 => D <= "00111010"; -- 0x01DF
when 000480 => D <= "00000101"; -- 0x01E0
when 000481 => D <= "00000100"; -- 0x01E1
when 000482 => D <= "00110011"; -- 0x01E2
when 000483 => D <= "00111010"; -- 0x01E3
when 000484 => D <= "00000101"; -- 0x01E4
when 000485 => D <= "00000100"; -- 0x01E5
when 000486 => D <= "00110011"; -- 0x01E6
when 000487 => D <= "00111010"; -- 0x01E7
when 000488 => D <= "00000101"; -- 0x01E8
when 000489 => D <= "00000100"; -- 0x01E9
when 000490 => D <= "00110011"; -- 0x01EA
when 000491 => D <= "00111010"; -- 0x01EB
when 000492 => D <= "00000101"; -- 0x01EC
when 000493 => D <= "00000100"; -- 0x01ED
when 000494 => D <= "00110011"; -- 0x01EE
when 000495 => D <= "00111010"; -- 0x01EF
when 000496 => D <= "00000101"; -- 0x01F0
when 000497 => D <= "00000100"; -- 0x01F1
when 000498 => D <= "00110011"; -- 0x01F2
when 000499 => D <= "00111010"; -- 0x01F3
when 000500 => D <= "00000101"; -- 0x01F4
when 000501 => D <= "00000100"; -- 0x01F5
when 000502 => D <= "00110011"; -- 0x01F6
when 000503 => D <= "00111010"; -- 0x01F7
when 000504 => D <= "00000101"; -- 0x01F8
when 000505 => D <= "00000100"; -- 0x01F9
when 000506 => D <= "00110011"; -- 0x01FA
when 000507 => D <= "00111010"; -- 0x01FB
when 000508 => D <= "00000101"; -- 0x01FC
when 000509 => D <= "00000100"; -- 0x01FD
when 000510 => D <= "01000100"; -- 0x01FE
when 000511 => D <= "00111111"; -- 0x01FF
when 000512 => D <= "00110011"; -- 0x0200
when 000513 => D <= "00111010"; -- 0x0201
when 000514 => D <= "00000101"; -- 0x0202
when 000515 => D <= "00000100"; -- 0x0203
when 000516 => D <= "00110011"; -- 0x0204
when 000517 => D <= "00111010"; -- 0x0205
when 000518 => D <= "00000101"; -- 0x0206
when 000519 => D <= "00000100"; -- 0x0207
when 000520 => D <= "00110011"; -- 0x0208
when 000521 => D <= "00111010"; -- 0x0209
when 000522 => D <= "00000101"; -- 0x020A
when 000523 => D <= "00000100"; -- 0x020B
when 000524 => D <= "00110011"; -- 0x020C
when 000525 => D <= "00111010"; -- 0x020D
when 000526 => D <= "00000101"; -- 0x020E
when 000527 => D <= "00000100"; -- 0x020F
when 000528 => D <= "00110011"; -- 0x0210
when 000529 => D <= "00111010"; -- 0x0211
when 000530 => D <= "00000101"; -- 0x0212
when 000531 => D <= "00000100"; -- 0x0213
when 000532 => D <= "00110011"; -- 0x0214
when 000533 => D <= "00111010"; -- 0x0215
when 000534 => D <= "00000101"; -- 0x0216
when 000535 => D <= "00000100"; -- 0x0217
when 000536 => D <= "00110011"; -- 0x0218
when 000537 => D <= "00111010"; -- 0x0219
when 000538 => D <= "00000101"; -- 0x021A
when 000539 => D <= "00000100"; -- 0x021B
when 000540 => D <= "00110011"; -- 0x021C
when 000541 => D <= "00111010"; -- 0x021D
when 000542 => D <= "00000101"; -- 0x021E
when 000543 => D <= "00000100"; -- 0x021F
when 000544 => D <= "00110011"; -- 0x0220
when 000545 => D <= "00111010"; -- 0x0221
when 000546 => D <= "00000101"; -- 0x0222
when 000547 => D <= "00000100"; -- 0x0223
when 000548 => D <= "00110011"; -- 0x0224
when 000549 => D <= "00111010"; -- 0x0225
when 000550 => D <= "00000101"; -- 0x0226
when 000551 => D <= "00000100"; -- 0x0227
when 000552 => D <= "00110011"; -- 0x0228
when 000553 => D <= "00111010"; -- 0x0229
when 000554 => D <= "00000101"; -- 0x022A
when 000555 => D <= "00000100"; -- 0x022B
when 000556 => D <= "00110011"; -- 0x022C
when 000557 => D <= "00111010"; -- 0x022D
when 000558 => D <= "00000101"; -- 0x022E
when 000559 => D <= "00000100"; -- 0x022F
when 000560 => D <= "00110011"; -- 0x0230
when 000561 => D <= "00111010"; -- 0x0231
when 000562 => D <= "00000101"; -- 0x0232
when 000563 => D <= "00000100"; -- 0x0233
when 000564 => D <= "00110011"; -- 0x0234
when 000565 => D <= "00111010"; -- 0x0235
when 000566 => D <= "00000101"; -- 0x0236
when 000567 => D <= "00000100"; -- 0x0237
when 000568 => D <= "00110011"; -- 0x0238
when 000569 => D <= "00111010"; -- 0x0239
when 000570 => D <= "00000101"; -- 0x023A
when 000571 => D <= "00000100"; -- 0x023B
when 000572 => D <= "00110011"; -- 0x023C
when 000573 => D <= "00111010"; -- 0x023D
when 000574 => D <= "00000101"; -- 0x023E
when 000575 => D <= "00000100"; -- 0x023F
when 000576 => D <= "01000100"; -- 0x0240
when 000577 => D <= "01100010"; -- 0x0241
when 000578 => D <= "01000001"; -- 0x0242
when others => D <= "--------";
end case;
end if;
end process;
end;
/tags/rel_1_1/syn/t421/ep1c12/t421.qpf
0,0 → 1,29
# Copyright (C) 1991-2004 Altera Corporation
# Any megafunction design, and related netlist (encrypted or decrypted),
# support information, device programming or simulation file, and any other
# associated documentation or information provided by Altera or a partner
# under Altera's Megafunction Partnership Program may be used only
# to program PLD devices (but not masked PLD devices) from Altera. Any
# other use of such megafunction design, netlist, support information,
# device programming or simulation file, or any other related documentation
# or information is prohibited for any other purpose, including, but not
# limited to modification, reverse engineering, de-compiling, or use with
# any other silicon devices, unless such use is explicitly licensed under
# a separate agreement with Altera or a megafunction partner. Title to the
# intellectual property, including patents, copyrights, trademarks, trade
# secrets, or maskworks, embodied in any such megafunction design, netlist,
# support information, device programming or simulation file, or any other
# related documentation or information provided by Altera or a megafunction
# partner, remains with Altera, the megafunction partner, or their respective
# licensors. No other licenses, including any licenses needed under any third
# party's intellectual property, are provided herein.
 
 
 
QUARTUS_VERSION = "7.0"
DATE = "20:42:11 April 27, 2008"
 
 
# Revisions
 
PROJECT_REVISION = "t421"
/tags/rel_1_1/syn/t421/ep1c12/rom_42x.hex
0,0 → 1,38
:100000004433593356783C333E001250333E00524D
:1000100050333E77333E50333A0050333A4D333A03
:1000200047333A4C430550333A1523805F2300068B
:10003000333A054A0707333E754E5307333A0723D1
:1000400000333E5406333A00400204230058230094
:10005000213392333E211F462142214B212300367A
:10006000239114332A0600302220230006333A005D
:100070003006333A333C07332C333A25333A3533A1
:100080003A3106222300102006333A00530622207C
:1000900006333A322006333A0F1E33A7333A332C55
:1000A000333A06333A33614F0057330106333A335C
:1000B0001106333A330306333A331306333A332106
:1000C00006333A3350332106333A0106333A1106E8
:1000D000333A0306333A332933282116333A332986
:1000E0000613333E33513A33504433290601333E2D
:1000F000444F06333A0F777E757C737A71787F763A
:100100007D747B7279701F777E757C737A71787FCE
:10011000767D747B7279702F777E757C737A7178B7
:100120007F767D747B7279703F777E757C737A7190
:10013000787F767D747B7279700F333A0504333A99
:100140000504333A0504333A0504333A0504333AD7
:100150000504333A0504333A0504333A0504333AC7
:100160000504333A0504333A0504333A0504333AB7
:100170000504333A0504333A0504441F333A0504B1
:10018000333A0504333A0504333A0504333A050497
:10019000333A0504333A0504333A0504333A050487
:1001A000333A0504333A0504333A0504333A050477
:1001B000333A0504333A0504333A0504442F333AFD
:1001C0000504333A0504333A0504333A0504333A57
:1001D0000504333A0504333A0504333A0504333A47
:1001E0000504333A0504333A0504333A0504333A37
:1001F0000504333A0504333A0504333A0504443F11
:10020000333A0504333A0504333A0504333A050416
:10021000333A0504333A0504333A0504333A050406
:10022000333A0504333A0504333A0504333A0504F6
:10023000333A0504333A0504333A0504333A0504E6
:03024000446241D4
:00000001FF
/tags/rel_1_1/rtl/vhdl/t400_mnemonic_pack-p.vhd
0,0 → 1,308
-------------------------------------------------------------------------------
--
-- $Id: t400_mnemonic_pack-p.vhd,v 1.1 2008-05-01 19:52:37 arniml Exp $
--
-- Copyright (c) 2008, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
use work.t400_pack.byte_t;
 
package t400_mnemonic_pack is
 
-- Mnemonics ----------------------------------------------------------------
type mnemonic_t is (-- Arithmetic instructions
MN_ASC,
MN_ADD,
MN_ADT,
MN_AISC,
MN_CASC,
MN_CLRA,
MN_COMP,
MN_NOP,
MN_C,
MN_XOR,
-- Transfer of control instructions
MN_JID,
MN_JMP,
MN_JP_JSRP,
MN_JSR,
MN_RET,
MN_RETSK,
-- Memory reference instructions
MN_LD,
MN_LDD_XAD,
MN_LQID,
MN_RMB,
MN_SMB,
MN_STII,
MN_X,
MN_XDS,
MN_XIS,
-- Register reference instructions
MN_CAB,
MN_CBA,
MN_LBI,
MN_XABR,
-- Test instructions
MN_SKC,
MN_SKE,
MN_SKMBZ,
MN_SKT,
-- Input/output instructions
MN_EXT,
MN_XAS);
 
type mnemonic_rec_t is
record
mnemonic : mnemonic_t;
multi_byte : boolean;
end record;
 
function decode_opcode_f(opcode : in byte_t;
opt_type : in integer) return
mnemonic_rec_t;
 
end t400_mnemonic_pack;
 
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.t400_opt_type_410_c;
 
package body t400_mnemonic_pack is
 
function decode_opcode_f(opcode : in byte_t;
opt_type : in integer) return
mnemonic_rec_t is
variable t41x_type_v : boolean;
variable mnemonic_v : mnemonic_t;
variable multi_byte_v : boolean;
variable result_v : mnemonic_rec_t;
begin
-- default assignment
mnemonic_v := MN_NOP;
multi_byte_v := false;
-- determine type
t41x_type_v := opt_type = t400_opt_type_410_c;
 
case opcode is
-- Mnemonic ASC----------------------------------------------------------
when "00110000" =>
mnemonic_v := MN_ASC;
 
-- Mnemonic ADD ---------------------------------------------------------
when "00110001" =>
mnemonic_v := MN_ADD;
 
-- Mnemonic ADT ---------------------------------------------------------
when "01001010" =>
if not t41x_type_v then
mnemonic_v := MN_ADT;
end if;
 
-- Mnemonic AISC --------------------------------------------------------
when "01010001" | "01010010" | "01010011" |
"01010100" | "01010101" | "01010110" | "01010111" |
"01011000" | "01011001" | "01011010" | "01011011" |
"01011100" | "01011101" | "01011110" | "01011111" =>
mnemonic_v := MN_AISC;
 
-- Mnemonic CASC --------------------------------------------------------
when "00010000" =>
if not t41x_type_v then
mnemonic_v := MN_CASC;
end if;
 
-- Mnemonic CLRA --------------------------------------------------------
when "00000000" =>
mnemonic_v := MN_CLRA;
 
-- Mnemonic COMP --------------------------------------------------------
when "01000000" =>
mnemonic_v := MN_COMP;
 
-- Mnemonic NOP ---------------------------------------------------------
when "01000100" =>
mnemonic_v := MN_NOP;
 
-- Mnemonic C -----------------------------------------------------------
when "00110010" | -- RC
"00100010" => -- SC
mnemonic_v := MN_C;
 
-- Mnemonic XOR ---------------------------------------------------------
when "00000010" =>
mnemonic_v := MN_XOR;
 
-- Mnemonic JID ---------------------------------------------------------
when "11111111" =>
mnemonic_v := MN_JID;
 
-- Mnemonic JMP ---------------------------------------------------------
when "01100000" | "01100001" | "01100010" | "01100011" =>
mnemonic_v := MN_JMP;
multi_byte_v := true;
 
-- Mnemonic JP_JSRP -----------------------------------------------------
when "10000000" | "10000001" | "10000010" | "10000011" |
"10000100" | "10000101" | "10000110" | "10000111" |
"10001000" | "10001001" | "10001010" | "10001011" |
"10001100" | "10001101" | "10001110" | "10001111" |
"10010000" | "10010001" | "10010010" | "10010011" |
"10010100" | "10010101" | "10010110" | "10010111" |
"10011000" | "10011001" | "10011010" | "10011011" |
"10011100" | "10011101" | "10011110" | "10011111" |
"10100000" | "10100001" | "10100010" | "10100011" |
"10100100" | "10100101" | "10100110" | "10100111" |
"10101000" | "10101001" | "10101010" | "10101011" |
"10101100" | "10101101" | "10101110" | "10101111" |
"10110000" | "10110001" | "10110010" | "10110011" |
"10110100" | "10110101" | "10110110" | "10110111" |
"10111000" | "10111001" | "10111010" | "10111011" |
"10111100" | "10111101" | "10111110" |
"11000000" | "11000001" | "11000010" | "11000011" |
"11000100" | "11000101" | "11000110" | "11000111" |
"11001000" | "11001001" | "11001010" | "11001011" |
"11001100" | "11001101" | "11001110" | "11001111" |
"11010000" | "11010001" | "11010010" | "11010011" |
"11010100" | "11010101" | "11010110" | "11010111" |
"11011000" | "11011001" | "11011010" | "11011011" |
"11011100" | "11011101" | "11011110" | "11011111" |
"11100000" | "11100001" | "11100010" | "11100011" |
"11100100" | "11100101" | "11100110" | "11100111" |
"11101000" | "11101001" | "11101010" | "11101011" |
"11101100" | "11101101" | "11101110" | "11101111" |
"11110000" | "11110001" | "11110010" | "11110011" |
"11110100" | "11110101" | "11110110" | "11110111" |
"11111000" | "11111001" | "11111010" | "11111011" |
"11111100" | "11111101" | "11111110" =>
mnemonic_v := MN_JP_JSRP;
 
-- Mnemonic JSR ---------------------------------------------------------
when "01101000" | "01101001" | "01101010" | "01101011" =>
mnemonic_v := MN_JSR;
multi_byte_v := true;
 
-- Mnemonic RET ---------------------------------------------------------
when "01001000" =>
mnemonic_v := MN_RET;
 
-- Mnemonic RETSK -------------------------------------------------------
when "01001001" =>
mnemonic_v := MN_RETSK;
 
-- Mnemonic LD ----------------------------------------------------------
when "00000101" | "00010101" | "00100101" | "00110101" =>
mnemonic_v := MN_LD;
 
-- Mnemonic LDD_XAD -----------------------------------------------------
when "00100011" =>
mnemonic_v := MN_LDD_XAD;
multi_byte_v := true;
 
-- Mnemonic LQID --------------------------------------------------------
when "10111111" =>
mnemonic_v := MN_LQID;
 
-- Mnemonic RMB ---------------------------------------------------------
when "01001100" | "01000101" | "01000010" | "01000011" =>
mnemonic_v := MN_RMB;
 
-- Mnemonic SMB ---------------------------------------------------------
when "01001101" | "01000111" | "01000110" | "01001011" =>
mnemonic_v := MN_SMB;
 
-- Mnemonic STII --------------------------------------------------------
when "01110000" | "01110001" | "01110010" | "01110011" |
"01110100" | "01110101" | "01110110" | "01110111" |
"01111000" | "01111001" | "01111010" | "01111011" |
"01111100" | "01111101" | "01111110" | "01111111" =>
mnemonic_v := MN_STII;
 
-- Mnemonic X -----------------------------------------------------------
when "00000110" | "00010110" | "00100110" | "00110110" =>
mnemonic_v := MN_X;
 
-- Mnemonic XDS ---------------------------------------------------------
when "00000111" | "00010111" | "00100111" | "00110111" =>
mnemonic_v := MN_XDS;
 
-- Mnemonic XIS ---------------------------------------------------------
when "00000100" | "00010100" | "00100100" | "00110100" =>
mnemonic_v := MN_XIS;
 
-- Mnemonic CAB ---------------------------------------------------------
when "01010000" =>
mnemonic_v := MN_CAB;
 
-- Mnemonic CBA ---------------------------------------------------------
when "01001110" =>
mnemonic_v := MN_CBA;
 
-- Mnemonic LBI ---------------------------------------------------------
when "00001000" | "00001001" | "00001010" | "00001011" |
"00001100" | "00001101" | "00001110" | "00001111" |
"00011000" | "00011001" | "00011010" | "00011011" |
"00011100" | "00011101" | "00011110" | "00011111" |
"00101000" | "00101001" | "00101010" | "00101011" |
"00101100" | "00101101" | "00101110" | "00101111" |
"00111000" | "00111001" | "00111010" | "00111011" |
"00111100" | "00111101" | "00111110" | "00111111" =>
mnemonic_v := MN_LBI;
 
-- Mnemonic XABR --------------------------------------------------------
when "00010010" =>
if not t41x_type_v then
mnemonic_v := MN_XABR;
end if;
 
-- Mnemonic SKC ---------------------------------------------------------
when "00100000" =>
mnemonic_v := MN_SKC;
 
-- Mnemonic SKE ---------------------------------------------------------
when "00100001" =>
mnemonic_v := MN_SKE;
 
-- Mnemonic SKMBZ -------------------------------------------------------
when "00000001" | "00010001" | "00000011" | "00010011" =>
mnemonic_v := MN_SKMBZ;
 
-- Mnemonic SKT ---------------------------------------------------------
when "01000001" =>
if not t41x_type_v then
mnemonic_v := MN_SKT;
end if;
 
-- Mnemonic XAS ---------------------------------------------------------
when "01001111" =>
mnemonic_v := MN_XAS;
 
-- Mnemonic EXT ---------------------------------------------------------
when "00110011" =>
mnemonic_v := MN_EXT;
multi_byte_v := true;
 
 
when others =>
null;
end case;
 
result_v.mnemonic := mnemonic_v;
result_v.multi_byte := multi_byte_v;
 
return result_v;
end;
 
end t400_mnemonic_pack;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_pack-p.vhd
0,0 → 1,135
-------------------------------------------------------------------------------
--
-- $Id: t400_pack-p.vhd,v 1.4 2008-05-01 19:51:47 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
package t400_pack is
 
-- Byte ---------------------------------------------------------------------
subtype byte_t is std_logic_vector(7 downto 0);
 
-- Data word ----------------------------------------------------------------
subtype dw_t is std_logic_vector(3 downto 0);
 
-- Misc ranges --------------------------------------------------------------
subtype dw_range_t is natural range dw_t'range;
subtype b_range_t is natural range 5 downto 0;
subtype br_range_t is natural range 5 downto 4;
subtype bd_range_t is natural range 3 downto 0;
 
-- B address ----------------------------------------------------------------
subtype b_t is std_logic_vector(b_range_t);
subtype br_t is std_logic_vector(br_range_t);
subtype bd_t is std_logic_vector(bd_range_t);
 
 
-- Program counter ----------------------------------------------------------
subtype pc_t is unsigned(9 downto 0);
 
-- Data memory address vector -----------------------------------------------
subtype dm_addr_t is std_logic_vector(5 downto 0);
 
-- Decoder data -------------------------------------------------------------
subtype dec_data_t is std_logic_vector(pc_t'range);
 
-- Program counter operations -----------------------------------------------
type pc_op_t is (PC_NONE,
PC_INC_PC,
PC_LOAD_6, PC_LOAD_7, PC_LOAD_8, PC_LOAD,
PC_POP,
PC_LOAD_A_M,
PC_INT);
 
-- Data memory controller operations ----------------------------------------
type dmem_op_t is (DMEM_RB,
DMEM_WB_SRC_Q, DMEM_WB_SRC_DEC, DMEM_WB_SRC_A,
DMEM_RDEC,
DMEM_WB_SET_BIT, DMEM_WB_RES_BIT,
DMEM_WDEC_SRC_A);
type b_op_t is (B_NONE,
B_SET_BD, B_SET_BR,
B_SET_B, B_SET_B_INC,
B_XOR_BR,
B_INC_BD,
B_DEC_BD);
 
-- Stack operations ---------------------------------------------------------
type stack_op_t is (STACK_NONE,
STACK_PUSH,
STACK_POP);
 
-- ALU operations -----------------------------------------------------------
type alu_op_t is (ALU_NONE,
ALU_CLRA,
ALU_LOAD_M,
ALU_LOAD_Q, ALU_LOAD_G, ALU_LOAD_IN, ALU_LOAD_IL,
ALU_LOAD_BR, ALU_LOAD_BD,
ALU_LOAD_SIO,
ALU_ADD, ALU_ADD_10, ALU_ADD_C, ALU_ADD_DEC,
ALU_COMP,
ALU_RC, ALU_SC,
ALU_XOR);
 
-- Skip operations ----------------------------------------------------------
type skip_op_t is (SKIP_NONE,
SKIP_UPDATE,
SKIP_NOW,
SKIP_CARRY, SKIP_C,
SKIP_BD_UFLOW, SKIP_BD_OFLOW,
SKIP_LBI,
SKIP_A_M,
SKIP_G_ZERO, SKIP_G_BIT,
SKIP_M_BIT,
SKIP_TIMER,
SKIP_PUSH, SKIP_POP);
 
-- IO L port operations -----------------------------------------------------
type io_l_op_t is (IOL_NONE,
IOL_LOAD_AM, IOL_LOAD_PM,
IOL_OUTPUT_L,
IOL_OUTPUT_Q);
 
-- IO D port operations -----------------------------------------------------
type io_d_op_t is (IOD_NONE,
IOD_LOAD);
 
-- IO G port operations -----------------------------------------------------
type io_g_op_t is (IOG_NONE,
IOG_LOAD_M,
IOG_LOAD_DEC);
 
-- IO IN port operations ----------------------------------------------------
type io_in_op_t is (IOIN_NONE,
IOIN_INIL,
IOIN_INTACK);
 
-- SIO operations -----------------------------------------------------------
type sio_op_t is (SIO_NONE,
SIO_LOAD);
 
end t400_pack;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.3 2006/05/27 19:16:52 arniml
-- interrupt functionality added
--
-- Revision 1.2 2006/05/22 00:01:21 arniml
-- operations for IN port added
--
-- Revision 1.1.1.1 2006/05/06 01:56:45 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_core.vhd
0,0 → 1,563
-------------------------------------------------------------------------------
--
-- T400 Microcontroller Core
--
-- $Id: t400_core.vhd,v 1.11 2008-05-01 19:51:12 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
entity t400_core is
 
generic (
opt_type_g : integer := t400_opt_type_420_c;
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
por_n_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
pm_addr_o : out std_logic_vector(9 downto 0);
pm_data_i : in std_logic_vector(7 downto 0);
dm_addr_o : out std_logic_vector(5 downto 0);
dm_we_o : out std_logic;
dm_data_o : out std_logic_vector(3 downto 0);
dm_data_i : in std_logic_vector(3 downto 0);
io_l_i : in std_logic_vector(7 downto 0);
io_l_o : out std_logic_vector(7 downto 0);
io_l_en_o : out std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_d_en_o : out std_logic_vector(3 downto 0);
io_g_i : in std_logic_vector(3 downto 0);
io_g_o : out std_logic_vector(3 downto 0);
io_g_en_o : out std_logic_vector(3 downto 0);
io_in_i : in std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
so_en_o : out std_logic;
sk_o : out std_logic;
sk_en_o : out std_logic
);
 
end t400_core;
 
 
use work.t400_pack.all;
use work.t400_comp_pack.all;
 
architecture struct of t400_core is
 
signal ck_en_s : boolean;
signal por_s : boolean;
signal res_s : boolean;
 
signal phi1_s : std_logic;
signal out_en_s : boolean;
signal in_en_s : boolean;
signal icyc_en_s : boolean;
 
signal pm_addr_s : pc_t;
 
signal a_s : dw_t;
signal dec_data_s : dec_data_t;
 
signal pc_to_stack_s,
pc_from_stack_s : pc_t;
 
signal q_s : byte_t;
signal b_s : b_t;
 
signal c_s,
carry_s : std_logic;
 
signal sio_s : dw_t;
 
signal pc_op_s : pc_op_t;
signal stack_op_s : stack_op_t;
signal dmem_op_s : dmem_op_t;
signal b_op_s : b_op_t;
signal skip_op_s : skip_op_t;
signal alu_op_s : alu_op_t;
signal io_l_op_s : io_l_op_t;
signal io_d_op_s : io_d_op_t;
signal io_g_op_s : io_g_op_t;
signal io_in_op_s : io_in_op_t;
signal sio_op_s : sio_op_t;
signal is_lbi_s : boolean;
signal en_s : dw_t;
 
signal skip_s,
skip_lbi_s : boolean;
signal tim_c_s : boolean;
 
signal in_s : dw_t;
signal int_s : boolean;
 
signal io_g_s : std_logic_vector(io_g_i'range);
 
signal cs_n_s,
rd_n_s,
wr_n_s : std_logic;
 
begin
 
ck_en_s <= ck_en_i = '1';
por_s <= por_n_i = '0';
 
io_g_s <= to_X01(io_g_i);
 
-----------------------------------------------------------------------------
-- Clock generator
-----------------------------------------------------------------------------
clkgen_b : t400_clkgen
generic map (
opt_ck_div_g => opt_ck_div_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
phi1_o => phi1_s,
out_en_o => out_en_s,
in_en_o => in_en_s,
icyc_en_o => icyc_en_s
);
 
 
-----------------------------------------------------------------------------
-- Reset module
-----------------------------------------------------------------------------
reset_b : t400_reset
port map (
ck_i => ck_i,
icyc_en_i => icyc_en_s,
por_i => por_s,
reset_n_i => reset_n_i,
res_o => res_s
);
 
 
-----------------------------------------------------------------------------
-- Program memory controller
-----------------------------------------------------------------------------
pmem_ctrl_b : t400_pmem_ctrl
generic map (
opt_type_g => opt_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
res_i => res_s,
a_i => a_s,
m_i => dm_data_i,
op_i => pc_op_s,
dec_data_i => dec_data_s,
pc_o => pc_to_stack_s,
pc_i => pc_from_stack_s,
pm_addr_o => pm_addr_s
);
--
pm_addr_o <= std_logic_vector(pm_addr_s);
 
 
-----------------------------------------------------------------------------
-- Data memory controller
-----------------------------------------------------------------------------
dmem_ctrl_b : t400_dmem_ctrl
generic map (
opt_type_g => opt_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
res_i => res_s,
dmem_op_i => dmem_op_s,
b_op_i => b_op_s,
dec_data_i => dec_data_s,
a_i => a_s,
q_high_i => q_s(7 downto 4),
b_o => b_s,
dm_addr_o => dm_addr_o,
dm_data_i => dm_data_i,
dm_data_o => dm_data_o,
dm_we_o => dm_we_o
);
 
 
-----------------------------------------------------------------------------
-- Decoder
-----------------------------------------------------------------------------
decoder_b : t400_decoder
generic map (
opt_type_g => opt_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
res_i => res_s,
out_en_i => out_en_s,
in_en_i => in_en_s,
icyc_en_i => icyc_en_s,
pc_op_o => pc_op_s,
stack_op_o => stack_op_s,
dmem_op_o => dmem_op_s,
b_op_o => b_op_s,
skip_op_o => skip_op_s,
alu_op_o => alu_op_s,
io_l_op_o => io_l_op_s,
io_d_op_o => io_d_op_s,
io_g_op_o => io_g_op_s,
io_in_op_o => io_in_op_s,
sio_op_o => sio_op_s,
dec_data_o => dec_data_s,
en_o => en_s,
skip_i => skip_s,
skip_lbi_i => skip_lbi_s,
is_lbi_o => is_lbi_s,
int_i => int_s,
pm_addr_i => pm_addr_s,
pm_data_i => pm_data_i
);
 
 
-----------------------------------------------------------------------------
-- Skip logic
-----------------------------------------------------------------------------
skip_b : t400_skip
generic map (
opt_type_g => opt_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
res_i => res_s,
op_i => skip_op_s,
dec_data_i => dec_data_s,
carry_i => carry_s,
c_i => c_s,
bd_i => b_s(bd_range_t),
is_lbi_i => is_lbi_s,
skip_o => skip_s,
skip_lbi_o => skip_lbi_s,
a_i => a_s,
m_i => dm_data_i,
g_i => io_g_s,
tim_c_i => tim_c_s
);
 
 
-----------------------------------------------------------------------------
-- ALU
-----------------------------------------------------------------------------
alu_b : t400_alu
generic map (
opt_cko_g => opt_cko_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
res_i => res_s,
cko_i => cko_i,
op_i => alu_op_s,
m_i => dm_data_i,
dec_data_i => dec_data_s,
q_low_i => q_s(3 downto 0),
b_i => b_s,
g_i => io_g_s,
in_i => in_s,
sio_i => sio_s,
a_o => a_s,
carry_o => carry_s,
c_o => c_s
);
 
 
-----------------------------------------------------------------------------
-- Stack module
-----------------------------------------------------------------------------
stack_b : t400_stack
generic map (
opt_type_g => opt_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
op_i => stack_op_s,
pc_i => pc_to_stack_s,
pc_o => pc_from_stack_s
);
 
 
-----------------------------------------------------------------------------
-- IO L module
-----------------------------------------------------------------------------
cs_n_s <= io_in_i(2);
rd_n_s <= io_in_i(1);
wr_n_s <= io_in_i(3);
--
io_l_b : t400_io_l
generic map (
opt_out_type_7_g => opt_l_out_type_7_g,
opt_out_type_6_g => opt_l_out_type_6_g,
opt_out_type_5_g => opt_l_out_type_5_g,
opt_out_type_4_g => opt_l_out_type_4_g,
opt_out_type_3_g => opt_l_out_type_3_g,
opt_out_type_2_g => opt_l_out_type_2_g,
opt_out_type_1_g => opt_l_out_type_1_g,
opt_out_type_0_g => opt_l_out_type_0_g,
opt_microbus_g => opt_microbus_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
in_en_i => in_en_s,
op_i => io_l_op_s,
en2_i => en_s(2),
m_i => dm_data_i,
a_i => a_s,
pm_data_i => pm_data_i,
q_o => q_s,
cs_n_i => cs_n_s,
rd_n_i => rd_n_s,
wr_n_i => wr_n_s,
io_l_i => io_l_i,
io_l_o => io_l_o,
io_l_en_o => io_l_en_o
);
 
 
-----------------------------------------------------------------------------
-- IO D module
-----------------------------------------------------------------------------
io_d_b : t400_io_d
generic map (
opt_out_type_3_g => opt_d_out_type_3_g,
opt_out_type_2_g => opt_d_out_type_2_g,
opt_out_type_1_g => opt_d_out_type_1_g,
opt_out_type_0_g => opt_d_out_type_0_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
res_i => res_s,
op_i => io_d_op_s,
bd_i => b_s(bd_range_t),
io_d_o => io_d_o,
io_d_en_o => io_d_en_o
);
 
 
-----------------------------------------------------------------------------
-- IO G module
-----------------------------------------------------------------------------
io_g_b : t400_io_g
generic map (
opt_out_type_3_g => opt_g_out_type_3_g,
opt_out_type_2_g => opt_g_out_type_2_g,
opt_out_type_1_g => opt_g_out_type_1_g,
opt_out_type_0_g => opt_g_out_type_0_g,
opt_microbus_g => opt_microbus_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
res_i => res_s,
cs_n_i => cs_n_s,
wr_n_i => wr_n_s,
op_i => io_g_op_s,
m_i => dm_data_i,
dec_data_i => dec_data_s,
io_g_o => io_g_o,
io_g_en_o => io_g_en_o
);
 
 
-----------------------------------------------------------------------------
-- IO IN module
-----------------------------------------------------------------------------
use_in: if opt_type_g = t400_opt_type_420_c generate
io_in_b : t400_io_in
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
icyc_en_i => icyc_en_s,
in_en_i => in_en_s,
op_i => io_in_op_s,
en1_i => en_s(1),
io_in_i => io_in_i,
in_o => in_s,
int_o => int_s
);
end generate;
 
no_in: if opt_type_g /= t400_opt_type_420_c generate
in_s <= (others => '0');
int_s <= false;
end generate;
 
 
-----------------------------------------------------------------------------
-- SIO module
-----------------------------------------------------------------------------
sio_b : t400_sio
generic map (
opt_so_output_type_g => opt_so_output_type_g,
opt_sk_output_type_g => opt_sk_output_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
res_i => res_s,
phi1_i => phi1_s,
out_en_i => out_en_s,
in_en_i => in_en_s,
op_i => sio_op_s,
en0_i => en_s(0),
en3_i => en_s(3),
a_i => a_s,
c_i => c_s,
sio_o => sio_s,
si_i => si_i,
so_o => so_o,
so_en_o => so_en_o,
sk_o => sk_o,
sk_en_o => sk_en_o
);
 
 
-----------------------------------------------------------------------------
-- Timer module
-----------------------------------------------------------------------------
use_tim: if opt_type_g = t400_opt_type_420_c or
opt_type_g = t400_opt_type_421_c generate
timer_b : t400_timer
port map (
ck_i => ck_i,
ck_en_i => ck_en_s,
por_i => por_s,
icyc_en_i => icyc_en_s,
op_i => skip_op_s,
c_o => tim_c_s
);
end generate;
 
notim: if opt_type_g /= t400_opt_type_420_c and
opt_type_g /= t400_opt_type_421_c generate
tim_c_s <= false;
end generate;
 
end struct;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.10 2006/06/11 13:34:39 arniml
-- Fix bug:
-- "Timer skipped in T421 configuration"
-- The generate block that instantiates the timer module considers
-- now t400_opt_type_421_x as well.
--
-- Revision 1.9 2006/06/06 00:33:56 arniml
-- remove note about limitations
--
-- Revision 1.8 2006/06/05 20:34:21 arniml
-- use dedicated microbus cs/rd/wr strobes
--
-- Revision 1.7 2006/06/05 14:19:15 arniml
-- connect microbus control signals to IO L
--
-- Revision 1.6 2006/05/27 19:11:33 arniml
-- updates for interrupt support
--
-- Revision 1.5 2006/05/23 01:13:56 arniml
-- use to_X01 for G input
--
-- Revision 1.4 2006/05/22 00:03:29 arniml
-- io_in added
--
-- Revision 1.3 2006/05/21 21:47:40 arniml
-- route cko to ALU for INIL instruction
--
-- Revision 1.2 2006/05/20 02:48:17 arniml
-- timer module included
--
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_decoder-c.vhd
0,0 → 1,29
-------------------------------------------------------------------------------
--
-- The decoder unit.
-- Implements the instruction opcodes and controls all units of the T400 core.
--
-- $Id: t400_decoder-c.vhd,v 1.2 2008-05-01 19:49:55 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_decoder_rtl_c0 of t400_decoder is
 
for rtl
end for;
 
end t400_decoder_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_comp_pack-p.vhd
0,0 → 1,379
-------------------------------------------------------------------------------
--
-- $Id: t400_comp_pack-p.vhd,v 1.8 2008-05-01 19:49:55 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
package t400_comp_pack is
 
component t400_clkgen
generic (
opt_ck_div_g : integer := t400_opt_ck_div_16_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
-- Clock Interface ------------------------------------------------------
phi1_o : out std_logic;
out_en_o : out boolean;
in_en_o : out boolean;
icyc_en_o : out boolean
);
end component;
 
component t400_reset
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
icyc_en_i : in boolean;
-- Reset Interface ------------------------------------------------------
por_i : in boolean;
reset_n_i : in std_logic;
res_o : out boolean
);
end component;
 
component t400_stack
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
-- Stack Control Interface ----------------------------------------------
op_i : in stack_op_t;
-- Program Counter Interface --------------------------------------------
pc_i : in pc_t;
pc_o : out pc_t
);
end component;
 
component t400_pmem_ctrl
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
a_i : in dw_t;
m_i : in dw_t;
-- Control Interface ----------------------------------------------------
op_i : in pc_op_t;
dec_data_i : in dec_data_t;
-- Stack Interface ------------------------------------------------------
pc_o : out pc_t;
pc_i : in pc_t;
-- Program Memory Interface ---------------------------------------------
pm_addr_o : out pc_t
);
end component;
 
component t400_alu
generic (
opt_cko_g : integer := t400_opt_cko_crystal_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
cko_i : in std_logic;
-- Control Interface ----------------------------------------------------
op_i : in alu_op_t;
-- Data Interface -------------------------------------------------------
m_i : in dw_t;
dec_data_i : in dec_data_t;
q_low_i : in dw_t;
b_i : in b_t;
g_i : in dw_t;
in_i : in dw_t;
sio_i : in dw_t;
a_o : out dw_t;
carry_o : out std_logic;
c_o : out std_logic
);
end component;
 
component t400_dmem_ctrl
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
-- Control Interface ----------------------------------------------------
dmem_op_i : in dmem_op_t;
b_op_i : in b_op_t;
dec_data_i : in dec_data_t;
a_i : in dw_t;
q_high_i : in dw_t;
b_o : out b_t;
-- Data Memory Interface ------------------------------------------------
dm_addr_o : out dm_addr_t;
dm_data_i : in dw_t;
dm_data_o : out dw_t;
dm_we_o : out std_logic
);
end component;
 
component t400_decoder
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
out_en_i : in boolean;
in_en_i : in boolean;
icyc_en_i : in boolean;
-- Module Control Interface ---------------------------------------------
pc_op_o : out pc_op_t;
stack_op_o : out stack_op_t;
dmem_op_o : out dmem_op_t;
b_op_o : out b_op_t;
skip_op_o : out skip_op_t;
alu_op_o : out alu_op_t;
io_l_op_o : out io_l_op_t;
io_d_op_o : out io_d_op_t;
io_g_op_o : out io_g_op_t;
io_in_op_o : out io_in_op_t;
sio_op_o : out sio_op_t;
dec_data_o : out dec_data_t;
en_o : out dw_t;
-- Skip Interface -------------------------------------------------------
skip_i : in boolean;
skip_lbi_i : in boolean;
is_lbi_o : out boolean;
int_i : in boolean;
-- Program Memory Interface ---------------------------------------------
pm_addr_i : in pc_t;
pm_data_i : in byte_t
);
end component;
 
component t400_skip
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
-- Control Interface ----------------------------------------------------
op_i : in skip_op_t;
dec_data_i : in dec_data_t;
carry_i : in std_logic;
c_i : in std_logic;
bd_i : in dw_t;
is_lbi_i : in boolean;
skip_o : out boolean;
skip_lbi_o : out boolean;
-- Data Interface -------------------------------------------------------
a_i : in dw_t;
m_i : in dw_t;
g_i : in dw_t;
tim_c_i : in boolean
);
end component;
 
component t400_io_l
generic (
opt_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
in_en_i : in boolean;
-- Control Interface ----------------------------------------------------
op_i : in io_l_op_t;
en2_i : in std_logic;
m_i : in dw_t;
a_i : in dw_t;
pm_data_i : in byte_t;
q_o : out byte_t;
-- Microbus Interface ---------------------------------------------------
cs_n_i : in std_logic;
rd_n_i : in std_logic;
wr_n_i : in std_logic;
-- Port L Interface -----------------------------------------------------
io_l_i : in byte_t;
io_l_o : out byte_t;
io_l_en_o : out byte_t
);
end component;
 
component t400_io_d
generic (
opt_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_out_type_0_g : integer := t400_opt_out_type_std_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
-- Control Interface ----------------------------------------------------
op_i : in io_d_op_t;
bd_i : in bd_t;
-- Port D Interface -----------------------------------------------------
io_d_o : out dw_t;
io_d_en_o : out dw_t
);
end component;
 
component t400_io_g
generic (
opt_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
cs_n_i : in std_logic;
wr_n_i : in std_logic;
-- Control Interface ----------------------------------------------------
op_i : in io_g_op_t;
m_i : in dw_t;
dec_data_i : in dec_data_t;
-- Port G Interface -----------------------------------------------------
io_g_o : out dw_t;
io_g_en_o : out dw_t
);
end component;
 
component t400_io_in
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
icyc_en_i : in boolean;
in_en_i : in boolean;
-- Control Interface ----------------------------------------------------
op_i : in io_in_op_t;
en1_i : in std_logic;
-- Port Interface -------------------------------------------------------
io_in_i : in dw_t;
in_o : out dw_t;
int_o : out boolean
);
end component;
 
component t400_sio
generic (
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
phi1_i : in std_logic;
out_en_i : in boolean;
in_en_i : in boolean;
-- Control Interface ----------------------------------------------------
op_i : in sio_op_t;
en0_i : in std_logic;
en3_i : in std_logic;
-- SIO Interface --------------------------------------------------------
a_i : in dw_t;
c_i : in std_logic;
sio_o : out dw_t;
-- Pad Interface --------------------------------------------------------
si_i : in std_logic;
so_o : out std_logic;
so_en_o : out std_logic;
sk_o : out std_logic;
sk_en_o : out std_logic
);
end component;
 
component t400_timer
port (
-- System Interface -----------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
icyc_en_i : in boolean;
-- Skip Interface -------------------------------------------------------
op_i : in skip_op_t;
c_o : out boolean
);
end component;
 
end t400_comp_pack;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.7 2006/06/05 20:31:56 arniml
-- microbus support for IO G added
--
-- Revision 1.6 2006/06/05 14:20:34 arniml
-- interface comments added
--
-- Revision 1.5 2006/05/27 19:11:33 arniml
-- updates for interrupt support
--
-- Revision 1.4 2006/05/22 00:03:08 arniml
-- io_in added
--
-- Revision 1.3 2006/05/21 21:47:40 arniml
-- route cko to ALU for INIL instruction
--
-- Revision 1.2 2006/05/20 02:48:17 arniml
-- timer module included
--
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_decoder.vhd
0,0 → 1,883
-------------------------------------------------------------------------------
--
-- The decoder unit.
-- Implements the instruction opcodes and controls all units of the T400 core.
--
-- $Id: t400_decoder.vhd,v 1.7 2008-05-01 19:49:55 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
entity t400_decoder is
 
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
out_en_i : in boolean;
in_en_i : in boolean;
icyc_en_i : in boolean;
-- Module Control Interface -----------------------------------------------
pc_op_o : out pc_op_t;
stack_op_o : out stack_op_t;
dmem_op_o : out dmem_op_t;
b_op_o : out b_op_t;
skip_op_o : out skip_op_t;
alu_op_o : out alu_op_t;
io_l_op_o : out io_l_op_t;
io_d_op_o : out io_d_op_t;
io_g_op_o : out io_g_op_t;
io_in_op_o : out io_in_op_t;
sio_op_o : out sio_op_t;
dec_data_o : out dec_data_t;
en_o : out dw_t;
-- Skip Interface ---------------------------------------------------------
skip_i : in boolean;
skip_lbi_i : in boolean;
is_lbi_o : out boolean;
int_i : in boolean;
-- Program Memory Interface -----------------------------------------------
pm_addr_i : in pc_t;
pm_data_i : in byte_t
);
 
end t400_decoder;
 
 
library ieee;
use ieee.numeric_std.all;
 
use work.t400_mnemonic_pack.all;
 
architecture rtl of t400_decoder is
 
signal cyc_cnt_q : unsigned(2 downto 0);
signal ibyte1_q,
ibyte2_q : byte_t;
 
signal opcode_s : byte_t;
signal second_cyc_q : boolean;
signal mnemonic_rec_s : mnemonic_rec_t;
signal mnemonic_s,
mnemonic_q : mnemonic_t;
signal multi_byte_s,
multi_byte_q : boolean;
signal last_cycle_s : boolean;
signal force_mc_s : boolean;
 
signal en_q : dw_t;
signal set_en_s : boolean;
signal ack_int_s : boolean;
 
begin
 
-----------------------------------------------------------------------------
-- Theory of operation:
--
-- a) One instruction cycle lasts at least 4 ck_i cycles.
-- b) PC for instruction/parameter fetch must be valid during cycle 2.
-- => cycle 2 is the opcode fetch cycle
-- c) Cycle 3 is the opcode decode cycle.
-- => opcode_s is valid with cycle 3
-- d) mnemonic_q is then valid with cycle 0 until end of instruction.
-- So is ibyte1_q.
-- e) PC for is incremented during last instruction cycle.
-- => fetch of either new instruction or second instruction byte
-- f) Second instruction byte is saved in ibyte2_q for cycle 0.
-- Valid until end of instruction.
--
-- Constraints:
--
-- a) PC of next instruction must be pushed in cycle 0 or 1.
-- b) PC for next instruction must be poped latest in cycle 1.
-- c) PC for next instruction can only be calculated latest in cycle 1.
-- d) IO output is enabled by out_en_i
-- e) IO inputs are sampled with in_en_i
--
-- d) and e) are required for proper timing in relation to phi1
-- (SK clock/sync output).
--
-- Conventions:
--
-- a) ALU operations take place in cycle 1.
--
-----------------------------------------------------------------------------
 
last_cycle_s <= (not multi_byte_q and
not second_cyc_q and not force_mc_s)
or
second_cyc_q;
 
 
-----------------------------------------------------------------------------
-- Process seq
--
-- Purpose:
-- Implements the various sequential elements.
-- Cycle counter:
-- It identifies the execution cycle of the
-- current instruction.
-- Instruction registers:
-- They save the first and second byte of an instruction for
-- further processing.
-- New instruction flag:
-- Indicates when a new instruction is fetched from the program
-- memory. Implemented as a flip-flop to control the multiplexer
-- which saves power by gating the combinational opcode decoder.
-- Mnemonic register:
-- Latches the decoded mnemonic of the current instruction.
-- Multi byte flag:
-- Latches the decoded multi byte status information.
--
seq: process (ck_i, por_i)
begin
if por_i then
cyc_cnt_q <= to_unsigned(1, cyc_cnt_q'length);
second_cyc_q <= false;
ibyte1_q <= (others => '0');
ibyte2_q <= (others => '0');
mnemonic_q <= MN_CLRA;
multi_byte_q <= false;
en_q <= (others => '0');
 
elsif ck_i'event and ck_i = '1' then
if res_i then
-- synchronous reset upon external reset event
mnemonic_q <= MN_CLRA;
multi_byte_q <= false;
cyc_cnt_q <= (others => '0');
en_q <= (others => '0');
 
elsif ck_en_i then
-- cycle counter ------------------------------------------------------
if icyc_en_i then
-- new instruction cycle started
cyc_cnt_q <= (others => '0');
elsif cyc_cnt_q /= 4 then
cyc_cnt_q <= cyc_cnt_q + 1;
end if;
 
-- second cycle flag --------------------------------------------------
if icyc_en_i then
if not last_cycle_s then
second_cyc_q <= true;
else
second_cyc_q <= false;
end if;
end if;
 
-- instruction byte 1 and mnemonic info -------------------------------
if icyc_en_i and last_cycle_s then
if not ack_int_s then
-- update instruction descriptors in normal mode
ibyte1_q <= pm_data_i;
mnemonic_q <= mnemonic_s;
multi_byte_q <= multi_byte_s;
else
-- force NOP instruction when vectoring to interrupt routine
ibyte1_q <= "01000100";
mnemonic_q <= MN_NOP;
multi_byte_q <= false;
end if;
end if;
 
-- instruction byte 2 -------------------------------------------------
if icyc_en_i and not last_cycle_s then
ibyte2_q <= pm_data_i;
end if;
 
-- EN register --------------------------------------------------------
if set_en_s then
en_q <= ibyte2_q(dw_range_t);
elsif ack_int_s then
-- reset interrupt enable when INT has been acknowledged
en_q(1) <= '0';
end if;
 
end if;
end if;
end process seq;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Opcode multiplexer
-----------------------------------------------------------------------------
opcode_s <= pm_data_i
when icyc_en_i else
ibyte1_q;
 
-----------------------------------------------------------------------------
-- Opcode decoder table
--
mnemonic_rec_s <= decode_opcode_f(opcode => opcode_s,
opt_type => opt_type_g);
--
mnemonic_s <= mnemonic_rec_s.mnemonic;
multi_byte_s <= mnemonic_rec_s.multi_byte;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Process decoder_ctrl
--
-- Purpose:
-- Implements the controlling logic of the decoder module.
--
decoder_ctrl: process (icyc_en_i,
out_en_i, in_en_i,
cyc_cnt_q,
mnemonic_q, second_cyc_q, last_cycle_s,
ibyte1_q, ibyte2_q,
skip_i, skip_lbi_i,
en_q, int_i,
pm_addr_i, pm_data_i)
variable cyc_v : natural range 0 to 4;
variable t41x_type_v,
t420_type_v : boolean;
variable en_int_v : boolean;
begin
-- default assignments
pc_op_o <= PC_NONE;
stack_op_o <= STACK_NONE;
dmem_op_o <= DMEM_RB; -- default is read via B
b_op_o <= B_NONE;
skip_op_o <= SKIP_NONE;
alu_op_o <= ALU_NONE;
io_l_op_o <= IOL_NONE;
io_d_op_o <= IOD_NONE;
io_g_op_o <= IOG_NONE;
io_in_op_o <= IOIN_NONE;
sio_op_o <= SIO_NONE;
dec_data_o <= (others => '0');
is_lbi_o <= false;
set_en_s <= false;
force_mc_s <= false;
en_int_v := true;
ack_int_s <= false;
cyc_v := to_integer(cyc_cnt_q);
-- determine type
t41x_type_v := opt_type_g = t400_opt_type_410_c;
t420_type_v := opt_type_g = t400_opt_type_420_c;
 
if icyc_en_i then
-- immediately increment program counter
-- this happens at two occasions:
-- a) right before new mnemonic becomes valid
-- b) before the second instruction cycle begins
pc_op_o <= PC_INC_PC;
end if;
 
if icyc_en_i and last_cycle_s then
-- update skip state when last instruction cycle ends
skip_op_o <= SKIP_UPDATE;
end if;
 
-- skip instruction execution
if not skip_i then
-- implement instruction control
case mnemonic_q is
-- Mnemonic ASC -------------------------------------------------------
when MN_ASC =>
if cyc_v = 1 then
alu_op_o <= ALU_ADD_C;
skip_op_o <= SKIP_CARRY;
end if;
 
-- Mnemonic ADD -------------------------------------------------------
when MN_ADD =>
if cyc_v = 1 then
alu_op_o <= ALU_ADD;
end if;
 
-- Mnemonic ADT -------------------------------------------------------
when MN_ADT =>
if cyc_v = 1 then
alu_op_o <= ALU_ADD_10;
end if;
 
-- Mnemonic AISC ------------------------------------------------------
when MN_AISC =>
dec_data_o(dw_range_t) <= ibyte1_q(dw_range_t);
if cyc_v = 1 then
alu_op_o <= ALU_ADD_DEC;
skip_op_o <= SKIP_CARRY;
end if;
 
-- Mnemonic CASC ------------------------------------------------------
when MN_CASC =>
case cyc_v is
when 0 =>
alu_op_o <= ALU_COMP;
when 1 =>
alu_op_o <= ALU_ADD_C;
skip_op_o <= SKIP_CARRY;
when others =>
null;
end case;
 
-- Mnemonic CLRA ------------------------------------------------------
when MN_CLRA =>
if cyc_v = 1 then
alu_op_o <= ALU_CLRA;
end if;
 
-- Mnemonic COMP ------------------------------------------------------
when MN_COMP =>
if cyc_v = 1 then
alu_op_o <= ALU_COMP;
end if;
 
-- Mnemonic NOP -------------------------------------------------------
when MN_NOP =>
-- do nothing
null;
 
-- Mnemonic C ---------------------------------------------------------
when MN_C =>
if cyc_v = 1 then
if ibyte1_q(4) = '1' then
alu_op_o <= ALU_RC;
else
alu_op_o <= ALU_SC;
end if;
end if;
 
-- Mnemonic XOR -------------------------------------------------------
when MN_XOR =>
if cyc_v = 1 then
alu_op_o <= ALU_XOR;
end if;
 
-- Mnemonic JID -------------------------------------------------------
when MN_JID =>
force_mc_s <= true;
en_int_v := false;
dec_data_o(byte_t'range) <= pm_data_i;
if cyc_v = 1 then
if not second_cyc_q then
-- first cycle: load PC from A and M
pc_op_o <= PC_LOAD_A_M;
else
-- second cycle: load PC from program memory
pc_op_o <= PC_LOAD_8;
end if;
end if;
 
if icyc_en_i and not second_cyc_q then
-- do not increment PC for second instruction cycle
pc_op_o <= PC_NONE;
end if;
 
-- Mnemonic JMP -------------------------------------------------------
when MN_JMP =>
en_int_v := false;
dec_data_o <= ibyte1_q(1) & ibyte1_q(0) & ibyte2_q;
if second_cyc_q and cyc_v = 1 then
pc_op_o <= PC_LOAD;
end if;
 
-- Mnemonic JP_JSRP ---------------------------------------------------
when MN_JP_JSRP =>
en_int_v := false;
-- universal decoder data
dec_data_o <= '0' & "01" & ibyte1_q(6 downto 0);
if cyc_v = 1 then
if pm_addr_i(9 downto 7) = "001" then
-- JP within pages 2 & 3
pc_op_o <= PC_LOAD_7;
elsif ibyte1_q(6) = '1' then
-- JP outside of pages 2 & 3
pc_op_o <= PC_LOAD_6;
else
-- JSRP to page 2
pc_op_o <= PC_LOAD;
stack_op_o <= STACK_PUSH;
end if;
end if;
 
-- Mnemonic JSR -------------------------------------------------------
when MN_JSR =>
en_int_v := false;
dec_data_o <= ibyte1_q(1) & ibyte1_q(0) & ibyte2_q;
if second_cyc_q and cyc_v = 1 then
pc_op_o <= PC_LOAD;
stack_op_o <= STACK_PUSH;
end if;
 
-- Mnemonic RET -------------------------------------------------------
when MN_RET =>
en_int_v := false;
if cyc_v = 1 then
pc_op_o <= PC_POP;
stack_op_o <= STACK_POP;
 
if t420_type_v then
-- always restore skip state in case this was an interrupt
skip_op_o <= SKIP_POP;
end if;
end if;
 
-- Mnemonic RETSK -----------------------------------------------------
when MN_RETSK =>
en_int_v := false;
if cyc_v = 1 then
pc_op_o <= PC_POP;
stack_op_o <= STACK_POP;
skip_op_o <= SKIP_NOW;
end if;
 
-- Mnemonic LD --------------------------------------------------------
when MN_LD =>
dec_data_o(br_range_t) <= ibyte1_q(br_range_t);
if cyc_v = 1 then
alu_op_o <= ALU_LOAD_M;
b_op_o <= B_XOR_BR;
end if;
 
-- Mnemonic LDD_XAD ---------------------------------------------------
when MN_LDD_XAD =>
-- preload decoder data
dec_data_o(b_range_t) <= ibyte2_q(b_range_t);
 
if second_cyc_q then
case ibyte2_q(7 downto 6) is
-- LDD
when "00" =>
if not t41x_type_v then
case cyc_v is
when 1 =>
dmem_op_o <= DMEM_RDEC;
when 2 =>
alu_op_o <= ALU_LOAD_M;
when others =>
null;
end case;
end if;
-- XAD
when "10" =>
if not t41x_type_v or
unsigned(ibyte2_q(b_range_t)) = 63 then
case cyc_v is
when 1 =>
dmem_op_o <= DMEM_RDEC;
when 2 =>
alu_op_o <= ALU_LOAD_M;
dmem_op_o <= DMEM_WDEC_SRC_A;
when others =>
null;
end case;
end if;
 
when others =>
null;
end case;
end if;
 
-- Mnemonic LQID ------------------------------------------------------
when MN_LQID =>
force_mc_s <= true;
en_int_v := false;
if not second_cyc_q then
-- first cycle: push PC and set PC from A/M,
-- read IOL from program memory
if cyc_v = 1 then
stack_op_o <= STACK_PUSH;
pc_op_o <= PC_LOAD_A_M;
end if;
 
if out_en_i then
io_l_op_o <= IOL_LOAD_PM;
end if;
else
if cyc_v = 1 then
-- second cycle: pop PC
stack_op_o <= STACK_POP;
pc_op_o <= PC_POP;
end if;
end if;
 
if icyc_en_i and not second_cyc_q then
-- do not increment PC for second instruction cycle
pc_op_o <= PC_NONE;
end if;
 
-- Mnemonic RMB -------------------------------------------------------
when MN_RMB =>
if cyc_v = 1 then
dmem_op_o <= DMEM_WB_RES_BIT;
-- select bit to be reset
case ibyte1_q(dw_range_t) is
when "1100" =>
dec_data_o(dw_range_t) <= "0001";
when "0101" =>
dec_data_o(dw_range_t) <= "0010";
when "0010" =>
dec_data_o(dw_range_t) <= "0100";
when "0011" =>
dec_data_o(dw_range_t) <= "1000";
when others =>
null;
end case;
end if;
 
-- Mnemonic SMB -------------------------------------------------------
when MN_SMB =>
if cyc_v = 1 then
dmem_op_o <= DMEM_WB_SET_BIT;
-- select bit to be set
case ibyte1_q(dw_range_t) is
when "1101" =>
dec_data_o(dw_range_t) <= "0001";
when "0111" =>
dec_data_o(dw_range_t) <= "0010";
when "0110" =>
dec_data_o(dw_range_t) <= "0100";
when "1011" =>
dec_data_o(dw_range_t) <= "1000";
when others =>
null;
end case;
end if;
 
-- Mnemonic STII ------------------------------------------------------
when MN_STII =>
dec_data_o(dw_range_t) <= ibyte1_q(dw_range_t);
if cyc_v = 1 then
dmem_op_o <= DMEM_WB_SRC_DEC;
b_op_o <= B_INC_BD;
end if;
 
-- Mnemonic X ---------------------------------------------------------
when MN_X =>
dec_data_o(br_range_t) <= ibyte1_q(br_range_t);
if cyc_v = 1 then
alu_op_o <= ALU_LOAD_M;
dmem_op_o <= DMEM_WB_SRC_A;
b_op_o <= B_XOR_BR;
end if;
 
-- Mnemonic XDS -------------------------------------------------------
when MN_XDS =>
dec_data_o(br_range_t) <= ibyte1_q(br_range_t);
case cyc_v is
when 1 =>
alu_op_o <= ALU_LOAD_M;
dmem_op_o <= DMEM_WB_SRC_A;
b_op_o <= B_DEC_BD;
when 2 =>
b_op_o <= B_XOR_BR;
skip_op_o <= SKIP_BD_UFLOW;
when others =>
null;
end case;
 
-- Mnemonic XIS -------------------------------------------------------
when MN_XIS =>
dec_data_o(br_range_t) <= ibyte1_q(br_range_t);
case cyc_v is
when 1 =>
alu_op_o <= ALU_LOAD_M;
dmem_op_o <= DMEM_WB_SRC_A;
b_op_o <= B_INC_BD;
when 2 =>
b_op_o <= B_XOR_BR;
skip_op_o <= SKIP_BD_OFLOW;
when others =>
null;
end case;
 
-- Mnemonic CAB -------------------------------------------------------
when MN_CAB =>
if cyc_v = 1 then
b_op_o <= B_SET_BD;
end if;
 
-- Mnemonic CBA -------------------------------------------------------
when MN_CBA =>
if cyc_v = 1 then
alu_op_o <= ALU_LOAD_BD;
end if;
 
-- Mnemonic LBI -------------------------------------------------------
when MN_LBI =>
is_lbi_o <= true;
en_int_v := false;
dec_data_o(br_range_t) <= ibyte1_q(br_range_t);
dec_data_o(bd_range_t) <= ibyte1_q(bd_range_t);
if cyc_v = 1 and not skip_lbi_i then
-- increment Bd by 1
b_op_o <= B_SET_B_INC;
skip_op_o <= SKIP_LBI;
end if;
 
-- Mnemonic XABR ------------------------------------------------------
when MN_XABR =>
if cyc_v = 1 then
alu_op_o <= ALU_LOAD_BR;
b_op_o <= B_SET_BR;
end if;
 
-- Mnemonic SKC -------------------------------------------------------
when MN_SKC =>
if cyc_v = 1 then
skip_op_o <= SKIP_C;
end if;
 
-- Mnemonic SKE -------------------------------------------------------
when MN_SKE =>
if cyc_v = 1 then
skip_op_o <= SKIP_A_M;
end if;
 
-- Mnemonic SKMBZ -----------------------------------------------------
when MN_SKMBZ =>
if cyc_v = 1 then
skip_op_o <= SKIP_M_BIT;
-- select bit to be checked
case ibyte1_q is
when "00000001" =>
dec_data_o(dw_range_t) <= "0001";
when "00010001" =>
dec_data_o(dw_range_t) <= "0010";
when "00000011" =>
dec_data_o(dw_range_t) <= "0100";
when "00010011" =>
dec_data_o(dw_range_t) <= "1000";
when others =>
null;
end case;
end if;
 
-- Mnemonic SKT -------------------------------------------------------
when MN_SKT =>
if cyc_v = 1 then
skip_op_o <= SKIP_TIMER;
end if;
 
-- Mnemonic XAS -------------------------------------------------------
when MN_XAS =>
if out_en_i then
sio_op_o <= SIO_LOAD;
alu_op_o <= ALU_LOAD_SIO;
end if;
 
-- Mnemonic EXT -------------------------------------------------------
when MN_EXT =>
if second_cyc_q then
case ibyte2_q is
-- CAMQ
when "00111100" =>
if out_en_i then
io_l_op_o <= IOL_LOAD_AM;
end if;
-- CQMA
when "00101100" =>
if not t41x_type_v and in_en_i then
io_l_op_o <= IOL_OUTPUT_Q;
alu_op_o <= ALU_LOAD_Q;
dmem_op_o <= DMEM_WB_SRC_Q;
end if;
-- SKGZ
when "00100001" =>
if in_en_i then
skip_op_o <= SKIP_G_ZERO;
end if;
-- SKGBZ
when "00000001" =>
if in_en_i then
skip_op_o <= SKIP_G_BIT;
dec_data_o(dw_range_t) <= "0001";
end if;
when "00010001" =>
if in_en_i then
skip_op_o <= SKIP_G_BIT;
dec_data_o(dw_range_t) <= "0010";
end if;
when "00000011" =>
if in_en_i then
skip_op_o <= SKIP_G_BIT;
dec_data_o(dw_range_t) <= "0100";
end if;
when "00010011" =>
if in_en_i then
skip_op_o <= SKIP_G_BIT;
dec_data_o(dw_range_t) <= "1000";
end if;
-- ING
when "00101010" =>
if cyc_v = 1 then
alu_op_o <= ALU_LOAD_G;
end if;
-- INL
when "00101110" =>
if in_en_i then
io_l_op_o <= IOL_OUTPUT_L;
alu_op_o <= ALU_LOAD_Q;
dmem_op_o <= DMEM_WB_SRC_Q;
end if;
-- ININ
when "00101000" =>
if not t41x_type_v and in_en_i then
alu_op_o <= ALU_LOAD_IN;
end if;
-- INIL
when "00101001" =>
if not t41x_type_v and in_en_i then
alu_op_o <= ALU_LOAD_IL;
io_in_op_o <= IOIN_INIL;
end if;
-- OBD
when "00111110" =>
if out_en_i then
io_d_op_o <= IOD_LOAD;
end if;
-- OMG
when "00111010" =>
if out_en_i then
io_g_op_o <= IOG_LOAD_M;
end if;
-- multiple codes
when others =>
-- apply default decoder output, largest required vector
dec_data_o(b_range_t) <= ibyte2_q(b_range_t);
-- LBI
if ibyte2_q(7 downto 6) = "10" and not t41x_type_v then
is_lbi_o <= true;
en_int_v := false;
if cyc_v > 0 and not skip_lbi_i then
b_op_o <= B_SET_B;
skip_op_o <= SKIP_LBI;
end if;
end if;
-- LEI
if ibyte2_q(7 downto 4) = "0110" and in_en_i then
-- dec_data_o applied by default
set_en_s <= true;
 
-- acknowledge pending interrupt when EN(1) is not
-- enabled - will clear them until interrupts are
-- enabled with EN(1) = '1'
if en_q(1) = '0' then
io_in_op_o <= IOIN_INTACK;
end if;
end if;
-- OGI
if ibyte2_q(7 downto 4) = "0101" and out_en_i and
not t41x_type_v then
-- dec_data_o applied by default
io_g_op_o <= IOG_LOAD_DEC;
end if;
end case;
end if;
 
when others =>
null;
end case;
end if;
 
 
-- Interrupt handling -----------------------------------------------------
if t420_type_v and
en_q(1) = '1' and int_i and en_int_v then
if last_cycle_s then
if cyc_v = 1 then
stack_op_o <= STACK_PUSH;
end if;
if icyc_en_i then
ack_int_s <= true;
io_in_op_o <= IOIN_INTACK;
pc_op_o <= PC_INT;
-- push skip state that was determined by current instruction
-- and will be valid for the next instruction which is delayed
-- by the interrupt
skip_op_o <= SKIP_PUSH;
end if;
end if;
end if;
 
end process decoder_ctrl;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
en_o <= en_q;
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.6 2006/06/05 14:20:34 arniml
-- interface comments added
--
-- Revision 1.5 2006/05/28 15:32:14 arniml
-- execute virtual NOP at location 0x0ff when vectoring to interrupt routine
--
-- Revision 1.4 2006/05/27 19:14:18 arniml
-- interrupt functionality added
--
-- Revision 1.3 2006/05/22 00:02:36 arniml
-- instructions ININ and INIL implemented
--
-- Revision 1.2 2006/05/07 02:24:16 arniml
-- fix sensitivity list
--
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t410-c.vhd
0,0 → 1,63
-------------------------------------------------------------------------------
--
-- T410 system toplevel.
--
-- $Id: t410-c.vhd,v 1.1 2006-06-11 22:18:28 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
configuration t410_struct_c0 of t410 is
 
for struct
 
for t410_notri_b: t410_notri
use configuration work.t410_notri_struct_c0;
end for;
 
end for;
 
end t410_struct_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t410.vhd
0,0 → 1,195
-------------------------------------------------------------------------------
--
-- T410 system toplevel.
--
-- $Id: t410.vhd,v 1.1 2006-06-11 22:18:28 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
entity t410 is
 
generic (
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
io_l_b : inout std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_g_b : inout std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
sk_o : out std_logic
);
 
end t410;
 
 
use work.t400_system_comp_pack.t410_notri;
 
architecture struct of t410 is
 
signal io_l_from_t410_s,
io_l_en_s : std_logic_vector(7 downto 0);
signal io_d_from_t410_s,
io_d_en_s : std_logic_vector(3 downto 0);
signal io_g_to_t410_s,
io_g_from_t410_s,
io_g_en_s : std_logic_vector(3 downto 0);
 
signal so_s,
so_en_s : std_logic;
signal sk_s,
sk_en_s : std_logic;
 
signal gnd_s : std_logic;
 
begin
 
gnd_s <= '0';
 
-----------------------------------------------------------------------------
-- T410 without tri-states
-----------------------------------------------------------------------------
t410_notri_b : t410_notri
generic map (
opt_ck_div_g => opt_ck_div_g,
opt_cko_g => t400_opt_cko_crystal_c,
opt_l_out_type_7_g => opt_l_out_type_7_g,
opt_l_out_type_6_g => opt_l_out_type_6_g,
opt_l_out_type_5_g => opt_l_out_type_5_g,
opt_l_out_type_4_g => opt_l_out_type_4_g,
opt_l_out_type_3_g => opt_l_out_type_3_g,
opt_l_out_type_2_g => opt_l_out_type_2_g,
opt_l_out_type_1_g => opt_l_out_type_1_g,
opt_l_out_type_0_g => opt_l_out_type_0_g,
opt_d_out_type_3_g => opt_d_out_type_3_g,
opt_d_out_type_2_g => opt_d_out_type_2_g,
opt_d_out_type_1_g => opt_d_out_type_1_g,
opt_d_out_type_0_g => opt_d_out_type_0_g,
opt_g_out_type_3_g => opt_g_out_type_3_g,
opt_g_out_type_2_g => opt_g_out_type_2_g,
opt_g_out_type_1_g => opt_g_out_type_1_g,
opt_g_out_type_0_g => opt_g_out_type_0_g,
opt_so_output_type_g => opt_so_output_type_g,
opt_sk_output_type_g => opt_sk_output_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_i,
reset_n_i => reset_n_i,
cko_i => gnd_s,
io_l_i => io_l_b,
io_l_o => io_l_from_t410_s,
io_l_en_o => io_l_en_s,
io_d_o => io_d_from_t410_s,
io_d_en_o => io_d_en_s,
io_g_i => io_g_b,
io_g_o => io_g_from_t410_s,
io_g_en_o => io_g_en_s,
si_i => si_i,
so_o => so_s,
so_en_o => so_en_s,
sk_o => sk_s,
sk_en_o => sk_en_s
);
 
 
-----------------------------------------------------------------------------
-- Tri-states for output drivers
-----------------------------------------------------------------------------
io_l_tri: for idx in 7 downto 0 generate
io_l_b(idx) <= io_l_from_t410_s(idx)
when io_l_en_s(idx) = '1' else
'Z';
end generate;
--
io_d_tri: for idx in 3 downto 0 generate
io_d_o(idx) <= io_d_from_t410_s(idx)
when io_d_en_s(idx) = '1' else
'Z';
end generate;
--
io_g_tri: for idx in 3 downto 0 generate
io_g_b(idx) <= io_g_from_t410_s(idx)
when io_g_en_s(idx) = '1' else
'Z';
end generate;
--
so_o <= so_s
when so_en_s = '1' else
'Z';
--
sk_o <= sk_s
when sk_en_s = '1' else
'Z';
 
end struct;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t400_system_comp_pack-p.vhd
0,0 → 1,275
-------------------------------------------------------------------------------
--
-- $Id: t400_system_comp_pack-p.vhd,v 1.6 2006-06-11 22:18:52 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
package t400_system_comp_pack is
 
component t410_notri
generic (
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
io_l_i : in std_logic_vector(7 downto 0);
io_l_o : out std_logic_vector(7 downto 0);
io_l_en_o : out std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_d_en_o : out std_logic_vector(3 downto 0);
io_g_i : in std_logic_vector(3 downto 0);
io_g_o : out std_logic_vector(3 downto 0);
io_g_en_o : out std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
so_en_o : out std_logic;
sk_o : out std_logic;
sk_en_o : out std_logic
);
end component;
 
component t410
generic (
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
io_l_b : inout std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_g_b : inout std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
sk_o : out std_logic
);
end component;
 
component t411
generic (
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
si_i : in std_logic;
so_o : out std_logic;
sk_o : out std_logic;
io_l_b : inout std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(1 downto 0);
io_g_b : inout std_logic_vector(2 downto 0)
);
end component;
 
component t420_notri
generic (
opt_type_g : integer := t400_opt_type_420_c;
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
io_l_i : in std_logic_vector(7 downto 0);
io_l_o : out std_logic_vector(7 downto 0);
io_l_en_o : out std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_d_en_o : out std_logic_vector(3 downto 0);
io_g_i : in std_logic_vector(3 downto 0);
io_g_o : out std_logic_vector(3 downto 0);
io_g_en_o : out std_logic_vector(3 downto 0);
io_in_i : in std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
so_en_o : out std_logic;
sk_o : out std_logic;
sk_en_o : out std_logic
);
end component;
 
component t420
generic (
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
io_l_b : inout std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_g_b : inout std_logic_vector(3 downto 0);
io_in_i : in std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
sk_o : out std_logic
);
end component;
 
component t421
generic (
opt_ck_div_g : integer := t400_opt_ck_div_8_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
io_l_b : inout std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_g_b : inout std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
sk_o : out std_logic
);
end component;
 
end t400_system_comp_pack;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.5 2006/06/11 13:48:13 arniml
-- * t421 added
-- * fixed generic list for t420 and t420_notri
--
-- Revision 1.4 2006/06/05 20:02:46 arniml
-- use microbus generic
--
-- Revision 1.3 2006/05/23 01:16:19 arniml
-- routi CKO to t400_core
--
-- Revision 1.2 2006/05/14 22:29:33 arniml
-- t420 hierarchies added
--
-- Revision 1.1.1.1 2006/05/06 01:56:45 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t421-c.vhd
0,0 → 1,63
-------------------------------------------------------------------------------
--
-- T421 system toplevel.
--
-- $Id: t421-c.vhd,v 1.1 2006-06-11 13:47:24 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
configuration t421_struct_c0 of t421 is
 
for struct
 
for t420_notri_b: t420_notri
use configuration work.t420_notri_struct_c0;
end for;
 
end for;
 
end t421_struct_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t421.vhd
0,0 → 1,199
-------------------------------------------------------------------------------
--
-- T421 system toplevel.
--
-- $Id: t421.vhd,v 1.1 2006-06-11 13:47:24 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
entity t421 is
 
generic (
opt_ck_div_g : integer := t400_opt_ck_div_8_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
io_l_b : inout std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_g_b : inout std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
sk_o : out std_logic
);
 
end t421;
 
 
use work.t400_system_comp_pack.t420_notri;
 
architecture struct of t421 is
 
signal io_l_from_t420_s,
io_l_en_s : std_logic_vector(7 downto 0);
signal io_d_from_t420_s,
io_d_en_s : std_logic_vector(3 downto 0);
signal io_g_from_t420_s,
io_g_en_s : std_logic_vector(3 downto 0);
 
signal so_s,
so_en_s : std_logic;
signal sk_s,
sk_en_s : std_logic;
 
signal vdd4_s : std_logic_vector(3 downto 0);
 
begin
 
vdd4_s <= (others => '1');
 
-----------------------------------------------------------------------------
-- T420 without tri-states in T421 configuration
-----------------------------------------------------------------------------
t420_notri_b : t420_notri
generic map (
opt_type_g => t400_opt_type_421_c,
opt_ck_div_g => opt_ck_div_g,
opt_cko_g => opt_cko_g,
opt_l_out_type_7_g => opt_l_out_type_7_g,
opt_l_out_type_6_g => opt_l_out_type_6_g,
opt_l_out_type_5_g => opt_l_out_type_5_g,
opt_l_out_type_4_g => opt_l_out_type_4_g,
opt_l_out_type_3_g => opt_l_out_type_3_g,
opt_l_out_type_2_g => opt_l_out_type_2_g,
opt_l_out_type_1_g => opt_l_out_type_1_g,
opt_l_out_type_0_g => opt_l_out_type_0_g,
opt_microbus_g => t400_opt_no_microbus_c,
opt_d_out_type_3_g => opt_d_out_type_3_g,
opt_d_out_type_2_g => opt_d_out_type_2_g,
opt_d_out_type_1_g => opt_d_out_type_1_g,
opt_d_out_type_0_g => opt_d_out_type_0_g,
opt_g_out_type_3_g => opt_g_out_type_3_g,
opt_g_out_type_2_g => opt_g_out_type_2_g,
opt_g_out_type_1_g => opt_g_out_type_1_g,
opt_g_out_type_0_g => opt_g_out_type_0_g,
opt_so_output_type_g => opt_so_output_type_g,
opt_sk_output_type_g => opt_sk_output_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_i,
reset_n_i => reset_n_i,
cko_i => cko_i,
io_l_i => io_l_b,
io_l_o => io_l_from_t420_s,
io_l_en_o => io_l_en_s,
io_d_o => io_d_from_t420_s,
io_d_en_o => io_d_en_s,
io_g_i => io_g_b,
io_g_o => io_g_from_t420_s,
io_g_en_o => io_g_en_s,
io_in_i => vdd4_s,
si_i => si_i,
so_o => so_s,
so_en_o => so_en_s,
sk_o => sk_s,
sk_en_o => sk_en_s
);
 
 
-----------------------------------------------------------------------------
-- Tri-states for output drivers
-----------------------------------------------------------------------------
io_l_tri: for idx in 7 downto 0 generate
io_l_b(idx) <= io_l_from_t420_s(idx)
when io_l_en_s(idx) = '1' else
'Z';
end generate;
--
io_d_tri: for idx in 3 downto 0 generate
io_d_o(idx) <= io_d_from_t420_s(idx)
when io_d_en_s(idx) = '1' else
'Z';
end generate;
--
io_g_tri: for idx in 3 downto 0 generate
io_g_b(idx) <= io_g_from_t420_s(idx)
when io_g_en_s(idx) = '1' else
'Z';
end generate;
--
so_o <= so_s
when so_en_s = '1' else
'Z';
--
sk_o <= sk_s
when sk_en_s = '1' else
'Z';
 
end struct;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t420.vhd
0,0 → 1,212
-------------------------------------------------------------------------------
--
-- T420 system toplevel.
--
-- $Id: t420.vhd,v 1.6 2006-06-11 13:49:18 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
entity t420 is
 
generic (
opt_ck_div_g : integer := t400_opt_ck_div_8_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
io_l_b : inout std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_g_b : inout std_logic_vector(3 downto 0);
io_in_i : in std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
sk_o : out std_logic
);
 
end t420;
 
 
use work.t400_system_comp_pack.t420_notri;
 
architecture struct of t420 is
 
signal io_l_from_t420_s,
io_l_en_s : std_logic_vector(7 downto 0);
signal io_d_from_t420_s,
io_d_en_s : std_logic_vector(3 downto 0);
signal io_g_from_t420_s,
io_g_en_s : std_logic_vector(3 downto 0);
 
signal so_s,
so_en_s : std_logic;
signal sk_s,
sk_en_s : std_logic;
 
begin
 
-----------------------------------------------------------------------------
-- T420 without tri-states
-----------------------------------------------------------------------------
t420_notri_b : t420_notri
generic map (
opt_type_g => t400_opt_type_420_c,
opt_ck_div_g => opt_ck_div_g,
opt_cko_g => opt_cko_g,
opt_l_out_type_7_g => opt_l_out_type_7_g,
opt_l_out_type_6_g => opt_l_out_type_6_g,
opt_l_out_type_5_g => opt_l_out_type_5_g,
opt_l_out_type_4_g => opt_l_out_type_4_g,
opt_l_out_type_3_g => opt_l_out_type_3_g,
opt_l_out_type_2_g => opt_l_out_type_2_g,
opt_l_out_type_1_g => opt_l_out_type_1_g,
opt_l_out_type_0_g => opt_l_out_type_0_g,
opt_microbus_g => opt_microbus_g,
opt_d_out_type_3_g => opt_d_out_type_3_g,
opt_d_out_type_2_g => opt_d_out_type_2_g,
opt_d_out_type_1_g => opt_d_out_type_1_g,
opt_d_out_type_0_g => opt_d_out_type_0_g,
opt_g_out_type_3_g => opt_g_out_type_3_g,
opt_g_out_type_2_g => opt_g_out_type_2_g,
opt_g_out_type_1_g => opt_g_out_type_1_g,
opt_g_out_type_0_g => opt_g_out_type_0_g,
opt_so_output_type_g => opt_so_output_type_g,
opt_sk_output_type_g => opt_sk_output_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_i,
reset_n_i => reset_n_i,
cko_i => cko_i,
io_l_i => io_l_b,
io_l_o => io_l_from_t420_s,
io_l_en_o => io_l_en_s,
io_d_o => io_d_from_t420_s,
io_d_en_o => io_d_en_s,
io_g_i => io_g_b,
io_g_o => io_g_from_t420_s,
io_g_en_o => io_g_en_s,
io_in_i => io_in_i,
si_i => si_i,
so_o => so_s,
so_en_o => so_en_s,
sk_o => sk_s,
sk_en_o => sk_en_s
);
 
 
-----------------------------------------------------------------------------
-- Tri-states for output drivers
-----------------------------------------------------------------------------
io_l_tri: for idx in 7 downto 0 generate
io_l_b(idx) <= io_l_from_t420_s(idx)
when io_l_en_s(idx) = '1' else
'Z';
end generate;
--
io_d_tri: for idx in 3 downto 0 generate
io_d_o(idx) <= io_d_from_t420_s(idx)
when io_d_en_s(idx) = '1' else
'Z';
end generate;
--
io_g_tri: for idx in 3 downto 0 generate
io_g_b(idx) <= io_g_from_t420_s(idx)
when io_g_en_s(idx) = '1' else
'Z';
end generate;
--
so_o <= so_s
when so_en_s = '1' else
'Z';
--
sk_o <= sk_s
when sk_en_s = '1' else
'Z';
 
end struct;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.5 2006/06/05 20:04:11 arniml
-- connect microbus generic
--
-- Revision 1.4 2006/05/23 01:16:05 arniml
-- routi CKO to t400_core
--
-- Revision 1.3 2006/05/20 02:49:04 arniml
-- select CK divide by 8
--
-- Revision 1.2 2006/05/17 00:38:31 arniml
-- connect missing input direction for IO G
--
-- Revision 1.1 2006/05/14 22:29:01 arniml
-- initial check-in
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t420_notri.vhd
0,0 → 1,239
-------------------------------------------------------------------------------
--
-- T420/421 controller toplevel without tri-states.
--
-- $Id: t420_notri.vhd,v 1.3 2006-06-11 13:48:43 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
entity t420_notri is
 
generic (
opt_type_g : integer := t400_opt_type_420_c;
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
io_l_i : in std_logic_vector(7 downto 0);
io_l_o : out std_logic_vector(7 downto 0);
io_l_en_o : out std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_d_en_o : out std_logic_vector(3 downto 0);
io_g_i : in std_logic_vector(3 downto 0);
io_g_o : out std_logic_vector(3 downto 0);
io_g_en_o : out std_logic_vector(3 downto 0);
io_in_i : in std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
so_en_o : out std_logic;
sk_o : out std_logic;
sk_en_o : out std_logic
);
 
end t420_notri;
 
 
use work.t400_core_comp_pack.t400_core;
use work.t400_tech_comp_pack.t400_por;
use work.t400_tech_comp_pack.generic_ram_ena;
 
architecture struct of t420_notri is
 
component t420_rom
port (
ck_i : in std_logic;
addr_i : in std_logic_vector(9 downto 0);
data_o : out std_logic_vector(7 downto 0)
);
end component;
 
signal por_n_s : std_logic;
 
signal pm_addr_s : std_logic_vector(9 downto 0);
signal pm_data_s : std_logic_vector(7 downto 0);
 
signal dm_addr_s : std_logic_vector(5 downto 0);
signal dm_we_s : std_logic;
signal dm_data_to_core_s,
dm_data_from_core_s : std_logic_vector(3 downto 0);
 
begin
 
-----------------------------------------------------------------------------
-- T400 core
-----------------------------------------------------------------------------
core_b : t400_core
generic map (
opt_type_g => opt_type_g,
opt_ck_div_g => opt_ck_div_g,
opt_cko_g => opt_cko_g,
opt_l_out_type_7_g => opt_l_out_type_7_g,
opt_l_out_type_6_g => opt_l_out_type_6_g,
opt_l_out_type_5_g => opt_l_out_type_5_g,
opt_l_out_type_4_g => opt_l_out_type_4_g,
opt_l_out_type_3_g => opt_l_out_type_3_g,
opt_l_out_type_2_g => opt_l_out_type_2_g,
opt_l_out_type_1_g => opt_l_out_type_1_g,
opt_l_out_type_0_g => opt_l_out_type_0_g,
opt_microbus_g => opt_microbus_g,
opt_d_out_type_3_g => opt_d_out_type_3_g,
opt_d_out_type_2_g => opt_d_out_type_2_g,
opt_d_out_type_1_g => opt_d_out_type_1_g,
opt_d_out_type_0_g => opt_d_out_type_0_g,
opt_g_out_type_3_g => opt_g_out_type_3_g,
opt_g_out_type_2_g => opt_g_out_type_2_g,
opt_g_out_type_1_g => opt_g_out_type_1_g,
opt_g_out_type_0_g => opt_g_out_type_0_g,
opt_so_output_type_g => opt_so_output_type_g,
opt_sk_output_type_g => opt_sk_output_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_i,
por_n_i => por_n_s,
reset_n_i => reset_n_i,
cko_i => cko_i,
pm_addr_o => pm_addr_s,
pm_data_i => pm_data_s,
dm_addr_o => dm_addr_s,
dm_we_o => dm_we_s,
dm_data_o => dm_data_from_core_s,
dm_data_i => dm_data_to_core_s,
io_l_i => io_l_i,
io_l_o => io_l_o,
io_l_en_o => io_l_en_o,
io_d_o => io_d_o,
io_d_en_o => io_d_en_o,
io_g_i => io_g_i,
io_g_o => io_g_o,
io_g_en_o => io_g_en_o,
io_in_i => io_in_i,
si_i => si_i,
so_o => so_o,
so_en_o => so_en_o,
sk_o => sk_o,
sk_en_o => sk_en_o
);
 
 
-----------------------------------------------------------------------------
-- Program memory
-----------------------------------------------------------------------------
pmem_b : t420_rom
port map (
ck_i => ck_i,
addr_i => pm_addr_s,
data_o => pm_data_s
);
 
 
-----------------------------------------------------------------------------
-- Data memory
-----------------------------------------------------------------------------
dmem_b : generic_ram_ena
generic map (
addr_width_g => 6,
data_width_g => 4
)
port map (
clk_i => ck_i,
a_i => dm_addr_s,
we_i => dm_we_s,
ena_i => ck_en_i,
d_i => dm_data_from_core_s,
d_o => dm_data_to_core_s
);
 
 
-----------------------------------------------------------------------------
-- Power-on reset circuit
-----------------------------------------------------------------------------
por_b : t400_por
generic map (
delay_g => 4,
cnt_width_g => 2
)
port map (
clk_i => ck_i,
por_n_o => por_n_s
);
 
end struct;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/06/05 20:03:52 arniml
-- connect microbus generic and include generic_ram_ena
--
-- Revision 1.1 2006/05/14 22:29:01 arniml
-- initial check-in
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t410_rom-struct-a.vhd
0,0 → 1,72
-------------------------------------------------------------------------------
--
-- T410/411 ROM.
--
-- $Id: t410_rom-struct-a.vhd,v 1.1 2006-06-05 22:44:29 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
architecture struct of t410_rom is
 
component rom_t41x
port(
Clk : in std_logic;
A : in std_logic_vector(8 downto 0);
D : out std_logic_vector(7 downto 0)
);
end component;
 
begin
 
rom_b : rom_t41x
port map (
Clk => ck_i,
A => addr_i,
D => data_o
);
 
end struct;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t420_rom-struct-a.vhd
0,0 → 1,72
-------------------------------------------------------------------------------
--
-- T420/421 ROM.
--
-- $Id: t420_rom-struct-a.vhd,v 1.1 2006-06-05 22:44:29 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
architecture struct of t420_rom is
 
component rom_t42x
port(
Clk : in std_logic;
A : in std_logic_vector(9 downto 0);
D : out std_logic_vector(7 downto 0)
);
end component;
 
begin
 
rom_b : rom_t42x
port map (
Clk => ck_i,
A => addr_i,
D => data_o
);
 
end struct;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t410_notri-c.vhd
0,0 → 1,48
-------------------------------------------------------------------------------
--
-- T410/411 controller toplevel without tri-states.
--
-- $Id: t410_notri-c.vhd,v 1.3 2006-06-05 20:03:11 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t410_notri_struct_c0 of t410_notri is
 
for struct
 
for core_b: t400_core
use configuration work.t400_core_struct_c0;
end for;
 
for pmem_b: t410_rom
use configuration work.t410_rom_struct_c0;
end for;
 
for dmem_b: generic_ram_ena
use configuration work.generic_ram_ena_rtl_c0;
end for;
 
for por_b: t400_por
use configuration work.t400_por_rtl_c0;
end for;
 
end for;
 
end t410_notri_struct_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/05/07 01:49:03 arniml
-- renamed t400_por configuration to rtl
--
-- Revision 1.1.1.1 2006/05/06 01:56:45 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t410_notri.vhd
0,0 → 1,240
-------------------------------------------------------------------------------
--
-- T410/411 controller toplevel without tri-states.
--
-- $Id: t410_notri.vhd,v 1.3 2006-06-05 20:03:11 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
entity t410_notri is
 
generic (
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
io_l_i : in std_logic_vector(7 downto 0);
io_l_o : out std_logic_vector(7 downto 0);
io_l_en_o : out std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_d_en_o : out std_logic_vector(3 downto 0);
io_g_i : in std_logic_vector(3 downto 0);
io_g_o : out std_logic_vector(3 downto 0);
io_g_en_o : out std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
so_en_o : out std_logic;
sk_o : out std_logic;
sk_en_o : out std_logic
);
 
end t410_notri;
 
 
use work.t400_core_comp_pack.t400_core;
use work.t400_tech_comp_pack.t400_por;
use work.t400_tech_comp_pack.generic_ram_ena;
 
architecture struct of t410_notri is
 
component t410_rom
port (
ck_i : in std_logic;
addr_i : in std_logic_vector(8 downto 0);
data_o : out std_logic_vector(7 downto 0)
);
end component;
 
signal por_n_s : std_logic;
 
signal pm_addr_s : std_logic_vector(9 downto 0);
signal pm_data_s : std_logic_vector(7 downto 0);
 
signal dm_addr_s : std_logic_vector(5 downto 0);
signal dm_we_s : std_logic;
signal dm_data_to_core_s,
dm_data_from_core_s : std_logic_vector(3 downto 0);
 
signal gnd4_s : std_logic_vector(3 downto 0);
 
begin
 
gnd4_s <= (others => '0');
 
-----------------------------------------------------------------------------
-- T400 core
-----------------------------------------------------------------------------
core_b : t400_core
generic map (
opt_type_g => t400_opt_type_410_c,
opt_ck_div_g => opt_ck_div_g,
opt_cko_g => opt_cko_g,
opt_l_out_type_7_g => opt_l_out_type_7_g,
opt_l_out_type_6_g => opt_l_out_type_6_g,
opt_l_out_type_5_g => opt_l_out_type_5_g,
opt_l_out_type_4_g => opt_l_out_type_4_g,
opt_l_out_type_3_g => opt_l_out_type_3_g,
opt_l_out_type_2_g => opt_l_out_type_2_g,
opt_l_out_type_1_g => opt_l_out_type_1_g,
opt_l_out_type_0_g => opt_l_out_type_0_g,
opt_microbus_g => t400_opt_no_microbus_c,
opt_d_out_type_3_g => opt_d_out_type_3_g,
opt_d_out_type_2_g => opt_d_out_type_2_g,
opt_d_out_type_1_g => opt_d_out_type_1_g,
opt_d_out_type_0_g => opt_d_out_type_0_g,
opt_g_out_type_3_g => opt_g_out_type_3_g,
opt_g_out_type_2_g => opt_g_out_type_2_g,
opt_g_out_type_1_g => opt_g_out_type_1_g,
opt_g_out_type_0_g => opt_g_out_type_0_g,
opt_so_output_type_g => opt_so_output_type_g,
opt_sk_output_type_g => opt_sk_output_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_i,
por_n_i => por_n_s,
reset_n_i => reset_n_i,
cko_i => cko_i,
pm_addr_o => pm_addr_s,
pm_data_i => pm_data_s,
dm_addr_o => dm_addr_s,
dm_we_o => dm_we_s,
dm_data_o => dm_data_from_core_s,
dm_data_i => dm_data_to_core_s,
io_l_i => io_l_i,
io_l_o => io_l_o,
io_l_en_o => io_l_en_o,
io_d_o => io_d_o,
io_d_en_o => io_d_en_o,
io_g_i => io_g_i,
io_g_o => io_g_o,
io_g_en_o => io_g_en_o,
io_in_i => gnd4_s,
si_i => si_i,
so_o => so_o,
so_en_o => so_en_o,
sk_o => sk_o,
sk_en_o => sk_en_o
);
 
 
-----------------------------------------------------------------------------
-- Program memory
-----------------------------------------------------------------------------
pmem_b : t410_rom
port map (
ck_i => ck_i,
addr_i => pm_addr_s(8 downto 0),
data_o => pm_data_s
);
 
 
-----------------------------------------------------------------------------
-- Data memory
-----------------------------------------------------------------------------
dmem_b : generic_ram_ena
generic map (
addr_width_g => 5,
data_width_g => 4
)
port map (
clk_i => ck_i,
a_i => dm_addr_s(4 downto 0),
we_i => dm_we_s,
ena_i => ck_en_i,
d_i => dm_data_from_core_s,
d_o => dm_data_to_core_s
);
 
 
-----------------------------------------------------------------------------
-- Power-on reset circuit
-----------------------------------------------------------------------------
por_b : t400_por
generic map (
delay_g => 4,
cnt_width_g => 2
)
port map (
clk_i => ck_i,
por_n_o => por_n_s
);
 
end struct;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/05/08 02:36:38 arniml
-- hand-down clock divider option
--
-- Revision 1.1.1.1 2006/05/06 01:56:45 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t420_notri-c.vhd
0,0 → 1,45
-------------------------------------------------------------------------------
--
-- T420/421 controller toplevel without tri-states.
--
-- $Id: t420_notri-c.vhd,v 1.2 2006-06-05 20:03:11 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t420_notri_struct_c0 of t420_notri is
 
for struct
 
for core_b: t400_core
use configuration work.t400_core_struct_c0;
end for;
 
for pmem_b: t420_rom
use configuration work.t420_rom_struct_c0;
end for;
 
for dmem_b: generic_ram_ena
use configuration work.generic_ram_ena_rtl_c0;
end for;
 
for por_b: t400_por
use configuration work.t400_por_rtl_c0;
end for;
 
end for;
 
end t420_notri_struct_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.1 2006/05/14 22:29:01 arniml
-- initial check-in
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t420_rom-e.vhd
0,0 → 1,64
-------------------------------------------------------------------------------
--
-- T420/421 ROM.
--
-- $Id: t420_rom-e.vhd,v 1.1 2006-05-14 22:29:01 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
entity t420_rom is
 
port (
ck_i : in std_logic;
addr_i : in std_logic_vector(9 downto 0);
data_o : out std_logic_vector(7 downto 0)
);
 
end t420_rom;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t420-c.vhd
0,0 → 1,63
-------------------------------------------------------------------------------
--
-- T420 system toplevel.
--
-- $Id: t420-c.vhd,v 1.1 2006-05-14 22:29:01 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
configuration t420_struct_c0 of t420 is
 
for struct
 
for t420_notri_b: t420_notri
use configuration work.t420_notri_struct_c0;
end for;
 
end for;
 
end t420_struct_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t410_rom-e.vhd
0,0 → 1,64
-------------------------------------------------------------------------------
--
-- T410/411 ROM.
--
-- $Id: t410_rom-e.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
entity t410_rom is
 
port (
ck_i : in std_logic;
addr_i : in std_logic_vector(8 downto 0);
data_o : out std_logic_vector(7 downto 0)
);
 
end t410_rom;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t411-c.vhd
0,0 → 1,63
-------------------------------------------------------------------------------
--
-- T411 system toplevel.
--
-- $Id: t411-c.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
configuration t411_struct_c0 of t411 is
 
for struct
 
for t410_notri_b: t410_notri
use configuration work.t410_notri_struct_c0;
end for;
 
end for;
 
end t411_struct_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/system/t411.vhd
0,0 → 1,193
-------------------------------------------------------------------------------
--
-- T411 system toplevel.
--
-- $Id: t411.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
entity t411 is
 
generic (
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
reset_n_i : in std_logic;
io_l_b : inout std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(1 downto 0);
io_g_b : inout std_logic_vector(2 downto 0);
si_i : in std_logic;
so_o : out std_logic;
sk_o : out std_logic
);
 
end t411;
 
 
use work.t400_system_comp_pack.t410_notri;
 
architecture struct of t411 is
 
signal io_l_from_t410_s,
io_l_en_s : std_logic_vector(7 downto 0);
signal io_d_from_t410_s,
io_d_en_s : std_logic_vector(3 downto 0);
signal io_g_to_t410_s,
io_g_from_t410_s,
io_g_en_s : std_logic_vector(3 downto 0);
 
signal so_s,
so_en_s : std_logic;
signal sk_s,
sk_en_s : std_logic;
 
signal gnd_s : std_logic;
 
begin
 
gnd_s <= '0';
 
-----------------------------------------------------------------------------
-- T411 without tri-states
-----------------------------------------------------------------------------
t410_notri_b : t410_notri
generic map (
opt_ck_div_g => opt_ck_div_g,
opt_cko_g => t400_opt_cko_crystal_c,
opt_l_out_type_7_g => opt_l_out_type_7_g,
opt_l_out_type_6_g => opt_l_out_type_6_g,
opt_l_out_type_5_g => opt_l_out_type_5_g,
opt_l_out_type_4_g => opt_l_out_type_4_g,
opt_l_out_type_3_g => opt_l_out_type_3_g,
opt_l_out_type_2_g => opt_l_out_type_2_g,
opt_l_out_type_1_g => opt_l_out_type_1_g,
opt_l_out_type_0_g => opt_l_out_type_0_g,
opt_d_out_type_3_g => t400_opt_out_type_std_c,
opt_d_out_type_2_g => t400_opt_out_type_std_c,
opt_d_out_type_1_g => opt_d_out_type_1_g,
opt_d_out_type_0_g => opt_d_out_type_0_g,
opt_g_out_type_3_g => t400_opt_out_type_std_c,
opt_g_out_type_2_g => opt_g_out_type_2_g,
opt_g_out_type_1_g => opt_g_out_type_1_g,
opt_g_out_type_0_g => opt_g_out_type_0_g,
opt_so_output_type_g => opt_so_output_type_g,
opt_sk_output_type_g => opt_sk_output_type_g
)
port map (
ck_i => ck_i,
ck_en_i => ck_en_i,
reset_n_i => reset_n_i,
cko_i => gnd_s,
io_l_i => io_l_b,
io_l_o => io_l_from_t410_s,
io_l_en_o => io_l_en_s,
io_d_o => io_d_from_t410_s,
io_d_en_o => io_d_en_s,
io_g_i => io_g_to_t410_s,
io_g_o => io_g_from_t410_s,
io_g_en_o => io_g_en_s,
si_i => si_i,
so_o => so_s,
so_en_o => so_en_s,
sk_o => sk_s,
sk_en_o => sk_en_s
);
 
 
-----------------------------------------------------------------------------
-- Tri-states for output drivers
-----------------------------------------------------------------------------
io_l_tri: for idx in 7 downto 0 generate
io_l_b(idx) <= io_l_from_t410_s(idx)
when io_l_en_s(idx) = '1' else
'Z';
end generate;
--
io_d_tri: for idx in 1 downto 0 generate
io_d_o(idx) <= io_d_from_t410_s(idx)
when io_d_en_s(idx) = '1' else
'Z';
end generate;
--
io_g_tri: for idx in 2 downto 0 generate
io_g_b(idx) <= io_g_from_t410_s(idx)
when io_g_en_s(idx) = '1' else
'Z';
end generate;
io_g_to_t410_s <= io_g_from_t410_s(3) & io_g_b;
--
so_o <= so_s
when so_en_s = '1' else
'Z';
--
sk_o <= sk_s
when sk_en_s = '1' else
'Z';
 
end struct;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_stack.vhd
0,0 → 1,155
-------------------------------------------------------------------------------
--
-- The stack unit.
--
-- $Id: t400_stack.vhd,v 1.3 2006-06-11 02:12:11 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
entity t400_stack is
 
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
-- Stack Control Interface ------------------------------------------------
op_i : in stack_op_t;
-- Program Counter Interface ----------------------------------------------
pc_i : in pc_t;
pc_o : out pc_t
);
 
end t400_stack;
 
 
-- pragma translate_off
use work.tb_pack.tb_sa_s;
-- pragma translate_on
 
architecture rtl of t400_stack is
 
signal sa_q,
sb_q,
sc_q : pc_t;
 
begin
 
-----------------------------------------------------------------------------
-- Process stack
--
-- Purpose:
-- Implements the stack consisting of SA, SB, SC.
-- SC is skipped when it's a 41xL.
--
stack: process (ck_i, por_i)
variable t41x_type_v : boolean;
begin
if por_i then
sa_q <= (others => '0');
sb_q <= (others => '0');
sc_q <= (others => '0');
 
elsif ck_i'event and ck_i = '1' then
-- determine type
t41x_type_v := opt_type_g = t400_opt_type_410_c;
 
if ck_en_i then
case op_i is
when STACK_PUSH =>
sa_q <= pc_i;
sb_q <= sa_q;
if not t41x_type_v then
sc_q <= sb_q;
else
sc_q <= (others => '0');
end if;
 
when STACK_POP =>
sa_q <= sb_q;
if not t41x_type_v then
sb_q <= sc_q;
end if;
 
when others =>
null;
 
end case;
end if;
end if;
end process stack;
--
-----------------------------------------------------------------------------
 
 
-- pragma translate_off
-- instrument interrupt testbench
tb_sa_s <= sa_q;
-- pragma translate_on
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
pc_o <= sa_q;
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/05/27 19:15:59 arniml
-- instrument testbench
--
-- Revision 1.1.1.1 2006/05/06 01:56:45 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_io_l.vhd
0,0 → 1,231
-------------------------------------------------------------------------------
--
-- The L port controller.
--
-- $Id: t400_io_l.vhd,v 1.4 2006-06-05 20:33:24 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
entity t400_io_l is
 
generic (
opt_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
in_en_i : in boolean;
-- Control Interface ------------------------------------------------------
op_i : in io_l_op_t;
en2_i : in std_logic;
m_i : in dw_t;
a_i : in dw_t;
pm_data_i : in byte_t;
q_o : out byte_t;
-- Microbus Interface -----------------------------------------------------
cs_n_i : in std_logic;
rd_n_i : in std_logic;
wr_n_i : in std_logic;
-- Port L Interface -------------------------------------------------------
io_l_i : in byte_t;
io_l_o : out byte_t;
io_l_en_o : out byte_t
);
 
end t400_io_l;
 
 
use work.t400_io_pack.all;
 
architecture rtl of t400_io_l is
 
signal q_q : byte_t;
 
signal en2_s : std_logic;
 
begin
 
-----------------------------------------------------------------------------
-- Process q_reg
--
-- Purpose:
-- Implements the Q register.
--
q_reg: process (ck_i, por_i)
begin
if por_i then
q_q <= (others => '0');
elsif ck_i'event and ck_i = '1' then
if ck_en_i then
case op_i is
-- Load Q from accumulator and data memory --------------------------
when IOL_LOAD_AM =>
q_q(7 downto 4) <= a_i;
q_q(3 downto 0) <= m_i;
 
-- Load Q from program memory ---------------------------------------
when IOL_LOAD_PM =>
q_q <= pm_data_i;
 
when others =>
null;
end case;
end if;
 
-- Microbus functionality
if opt_microbus_g = t400_opt_microbus_c and
cs_n_i = '0' and wr_n_i = '0' then
q_q <= to_X01(io_l_i);
end if;
end if;
end process q_reg;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Multiplexer providing read data to the system.
-----------------------------------------------------------------------------
q_o <= to_X01(io_l_i)
when op_i = IOL_OUTPUT_L else
q_q;
 
 
-----------------------------------------------------------------------------
-- Dedicated output enable when in Microbus mode
-----------------------------------------------------------------------------
en2_s <= cs_n_i nor rd_n_i
when opt_microbus_g = t400_opt_microbus_c else
en2_i;
 
-----------------------------------------------------------------------------
-- Process out_driver
--
-- Purpose:
-- Implements the output driver data and enable.
--
out_driver: process (en2_s,
q_q)
begin
-- bit 7
io_l_o(7) <= io_out_f(dat => q_q(7),
opt => opt_out_type_7_g);
io_l_en_o(7) <= io_en_f (en => en2_s, dat => q_q(7),
opt => opt_out_type_7_g);
 
-- bit 6
io_l_o(6) <= io_out_f(dat => q_q(6),
opt => opt_out_type_6_g);
io_l_en_o(6) <= io_en_f (en => en2_s, dat => q_q(6),
opt => opt_out_type_6_g);
 
-- bit 5
io_l_o(5) <= io_out_f(dat => q_q(5),
opt => opt_out_type_5_g);
io_l_en_o(5) <= io_en_f (en => en2_s, dat => q_q(5),
opt => opt_out_type_5_g);
 
-- bit 4
io_l_o(4) <= io_out_f(dat => q_q(4),
opt => opt_out_type_4_g);
io_l_en_o(4) <= io_en_f (en => en2_s, dat => q_q(4),
opt => opt_out_type_4_g);
 
-- bit 3
io_l_o(3) <= io_out_f(dat => q_q(3),
opt => opt_out_type_3_g);
io_l_en_o(3) <= io_en_f (en => en2_s, dat => q_q(3),
opt => opt_out_type_3_g);
 
-- bit 2
io_l_o(2) <= io_out_f(dat => q_q(2),
opt => opt_out_type_2_g);
io_l_en_o(2) <= io_en_f (en => en2_s, dat => q_q(2),
opt => opt_out_type_2_g);
 
-- bit 1
io_l_o(1) <= io_out_f(dat => q_q(1),
opt => opt_out_type_1_g);
io_l_en_o(1) <= io_en_f (en => en2_s, dat => q_q(1),
opt => opt_out_type_1_g);
 
-- bit 0
io_l_o(0) <= io_out_f(dat => q_q(0),
opt => opt_out_type_0_g);
io_l_en_o(0) <= io_en_f (en => en2_s, dat => q_q(0),
opt => opt_out_type_0_g);
 
end process out_driver;
--
-----------------------------------------------------------------------------
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.3 2006/06/05 14:21:21 arniml
-- latch io_l_i upon input enable trigger
--
-- Revision 1.2 2006/05/23 01:14:28 arniml
-- use to_X01 for primary input bus
--
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_io_g.vhd
0,0 → 1,182
-------------------------------------------------------------------------------
--
-- The G port controller.
--
-- $Id: t400_io_g.vhd,v 1.3 2006-06-05 20:32:34 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
entity t400_io_g is
 
generic (
opt_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
-- Control Interface ------------------------------------------------------
op_i : in io_g_op_t;
m_i : in dw_t;
dec_data_i : in dec_data_t;
cs_n_i : in std_logic;
wr_n_i : in std_logic;
-- Port G Interface -------------------------------------------------------
io_g_o : out dw_t;
io_g_en_o : out dw_t
);
 
end t400_io_g;
 
 
use work.t400_io_pack.all;
 
architecture rtl of t400_io_g is
 
signal g_q : dw_t;
 
signal vdd_s : std_logic;
 
begin
 
vdd_s <= '1';
 
-----------------------------------------------------------------------------
-- Process g_reg
--
-- Purpose:
-- Implements the G output register.
--
g_reg: process (ck_i, por_i)
begin
if por_i then
g_q <= (others => '0');
 
elsif ck_i'event and ck_i = '1' then
if res_i then
-- synchronous reset upon external reset event
g_q <= (others => '0');
 
elsif ck_en_i then
case op_i is
when IOG_LOAD_M =>
g_q <= m_i;
when IOG_LOAD_DEC =>
g_q <= dec_data_i(dw_range_t);
when others =>
null;
end case;
 
end if;
 
-- reset G(0) in MICROBUS operation upon write
if opt_microbus_g = t400_opt_microbus_c and
cs_n_i = '0' and wr_n_i = '0' then
g_q(0) <= '0';
end if;
end if;
end process g_reg;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Process out_driver
--
-- Purpose:
-- Implements the output driver data and enable.
--
out_driver: process (g_q,
vdd_s)
begin
-- bit 3
io_g_o(3) <= io_out_f(dat => g_q(3),
opt => opt_out_type_3_g);
io_g_en_o(3) <= io_en_f (en => vdd_s, dat => g_q(3),
opt => opt_out_type_3_g);
 
-- bit 2
io_g_o(2) <= io_out_f(dat => g_q(2),
opt => opt_out_type_2_g);
io_g_en_o(2) <= io_en_f (en => vdd_s, dat => g_q(2),
opt => opt_out_type_2_g);
 
-- bit 1
io_g_o(1) <= io_out_f(dat => g_q(1),
opt => opt_out_type_1_g);
io_g_en_o(1) <= io_en_f (en => vdd_s, dat => g_q(1),
opt => opt_out_type_1_g);
 
-- bit 0
io_g_o(0) <= io_out_f(dat => g_q(0),
opt => opt_out_type_0_g);
io_g_en_o(0) <= io_en_f (en => vdd_s, dat => g_q(0),
opt => opt_out_type_0_g);
 
end process out_driver;
--
-----------------------------------------------------------------------------
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/05/07 02:24:16 arniml
-- fix sensitivity list
--
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_skip.vhd
0,0 → 1,236
-------------------------------------------------------------------------------
--
-- The skip unit.
-- Skip conditions are checked here and communicated to the decoder unit.
--
-- $Id: t400_skip.vhd,v 1.5 2006-06-05 14:20:34 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
entity t400_skip is
 
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
-- Control Interface ------------------------------------------------------
op_i : in skip_op_t;
dec_data_i : in dec_data_t;
carry_i : in std_logic;
c_i : in std_logic;
bd_i : in dw_t;
is_lbi_i : in boolean;
skip_o : out boolean;
skip_lbi_o : out boolean;
-- Data Interface ---------------------------------------------------------
a_i : in dw_t;
m_i : in dw_t;
g_i : in dw_t;
tim_c_i : in boolean
);
 
end t400_skip;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture rtl of t400_skip is
 
signal skip_q,
skip_next_q : boolean;
signal skip_lbi_q : boolean;
 
signal skip_int_q : boolean;
 
begin
 
-----------------------------------------------------------------------------
-- Process skip
--
-- Purpose:
-- Implements the skip logic.
--
skip: process (ck_i, por_i)
variable t420_type_v : boolean;
begin
if por_i then
skip_next_q <= false;
skip_q <= false;
skip_lbi_q <= false;
skip_int_q <= false;
 
elsif ck_i'event and ck_i = '1' then
if res_i then
-- synchronous reset upon external reset event
skip_next_q <= false;
skip_q <= false;
skip_lbi_q <= false;
skip_int_q <= false;
 
elsif ck_en_i then
t420_type_v := opt_type_g = t400_opt_type_420_c;
 
if ck_en_i then
case op_i is
-- update skip information ----------------------------------------
when SKIP_UPDATE =>
skip_q <= skip_next_q;
-- also reset skip_next flag
skip_next_q <= false;
 
-- reset skip-on-lbi flag when this was not an LBI
if not is_lbi_i then
skip_lbi_q <= false;
end if;
 
-- skip always ----------------------------------------------------
when SKIP_NOW =>
skip_next_q <= true;
 
-- skip on carry --------------------------------------------------
when SKIP_CARRY =>
skip_next_q <= carry_i = '1';
 
-- skip on C ------------------------------------------------------
when SKIP_C =>
skip_next_q <= c_i = '1';
 
-- skip on BD underflow ------------------------------------------
when SKIP_BD_UFLOW =>
skip_next_q <= unsigned(bd_i) = 15;
 
-- skip on BD overflow -------------------------------------------
when SKIP_BD_OFLOW =>
skip_next_q <= unsigned(bd_i) = 0;
 
-- skip on LBI instruction ----------------------------------------
when SKIP_LBI =>
skip_lbi_q <= true;
 
-- skip on A and M equal ------------------------------------------
when SKIP_A_M =>
skip_next_q <= unsigned(a_i) = unsigned(m_i);
 
-- skip on G zero -------------------------------------------------
when SKIP_G_ZERO =>
skip_next_q <= unsigned(g_i) = 0;
 
-- skip on G bit --------------------------------------------------
when SKIP_G_BIT =>
skip_next_q <= unsigned(g_i and dec_data_i(dw_range_t)) = 0;
 
-- skip on M bit --------------------------------------------------
when SKIP_M_BIT =>
skip_next_q <= unsigned(m_i and dec_data_i(dw_range_t)) = 0;
 
-- skip on timer carry --------------------------------------------
when SKIP_TIMER =>
skip_next_q <= tim_c_i;
null;
 
-- push skip state when vectoring to interrupt routine ------------
when SKIP_PUSH =>
if t420_type_v then
-- save next skip flag
skip_int_q <= skip_next_q;
skip_next_q <= false;
-- never skip first instruction of interrupt routine
skip_q <= false;
end if;
 
-- pop skip state for RET from interrupt routine ------------------
when SKIP_POP =>
if t420_type_v then
-- push'ed info must be pop'ed to skip_next_q as pop'ing
-- happens during RET of interrupt routine
-- skip info is valid for next instruction
skip_next_q <= skip_int_q;
skip_int_q <= false;
end if;
 
when others =>
null;
end case;
end if;
end if;
end if;
end process skip;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
skip_o <= skip_q;
skip_lbi_o <= skip_lbi_q;
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.4 2006/05/28 15:35:33 arniml
-- fix pop'ing of skip flag
--
-- Revision 1.3 2006/05/27 19:16:52 arniml
-- interrupt functionality added
--
-- Revision 1.2 2006/05/20 02:47:52 arniml
-- skip-on-timer implemented
--
-- Revision 1.1.1.1 2006/05/06 01:56:45 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_pmem_ctrl.vhd
0,0 → 1,196
------------------------------------------------------------------------------
--
-- The Program memory controller.
--
-- $Id: t400_pmem_ctrl.vhd,v 1.3 2006-05-28 15:32:40 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
entity t400_pmem_ctrl is
 
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
a_i : in dw_t;
m_i : in dw_t;
-- Control Interface ------------------------------------------------------
op_i : in pc_op_t;
dec_data_i : in dec_data_t;
-- Stack Interface --------------------------------------------------------
pc_o : out pc_t;
pc_i : in pc_t;
-- Program Memory Interface -----------------------------------------------
pm_addr_o : out pc_t
);
 
end t400_pmem_ctrl;
 
 
library ieee;
use ieee.numeric_std.all;
 
-- pragma translate_off
use work.tb_pack.tb_pc_s;
-- pragma translate_on
 
architecture rtl of t400_pmem_ctrl is
 
signal pc_q : pc_t;
signal last_pc_s : pc_t;
 
begin
 
-----------------------------------------------------------------------------
-- Determine last program counter address
-----------------------------------------------------------------------------
last_pc_s <= to_unsigned(16#1ff#, pc_t'length)
when opt_type_g = t400_opt_type_410_c else
to_unsigned(16#3ff#, pc_t'length);
 
 
-----------------------------------------------------------------------------
-- Process pc
--
-- Purpose:
-- Implements the program counter.
--
pc: process (ck_i, por_i)
begin
if por_i then
pc_q <= (others => '0');
 
elsif ck_i'event and ck_i = '1' then
if res_i then
-- synchronous reset upon external reset event
pc_q <= (others => '0');
 
elsif ck_en_i then
-- determine PC update mode
case op_i is
-- increment program counter ----------------------------------------
when PC_INC_PC =>
if pc_q = last_pc_s then
-- roll over
pc_q <= (others => '0');
else
pc_q <= pc_q + 1;
end if;
 
-- Load lower 6 bits from program memory data -----------------------
when PC_LOAD_6 =>
pc_q(5 downto 0) <= unsigned(dec_data_i(5 downto 0));
 
-- Load lower 7 bits from program memory data -----------------------
when PC_LOAD_7 =>
pc_q(6 downto 0) <= unsigned(dec_data_i(6 downto 0));
 
-- Load lower 8 bits from program memory data -----------------------
when PC_LOAD_8 =>
pc_q(7 downto 0) <= unsigned(dec_data_i(7 downto 0));
 
-- Load all bits from program memory data ---------------------------
when PC_LOAD =>
pc_q <= unsigned(dec_data_i);
 
-- pop program counter from stack -----------------------------------
when PC_POP =>
pc_q <= pc_i;
 
-- update program counter for LQID instruction ----------------------
when PC_LOAD_A_M =>
pc_q(7 downto 4) <= unsigned(a_i);
pc_q(3 downto 0) <= unsigned(m_i);
 
-- load interrupt vector --------------------------------------------
when PC_INT =>
if opt_type_g = t400_opt_type_420_c then
-- load address 0x100, i.e. skip first instruction at
-- vector address 0x0ff which has to be a NOP :-)
pc_q <= (8 => '1', others => '0');
end if;
 
when others =>
null;
end case;
end if;
end if;
end process pc;
--
-----------------------------------------------------------------------------
 
 
-- pragma translate_off
-- instrument interrupt testbench
tb_pc_s <= pc_q;
-- pragma translate_on
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
pc_o <= pc_q;
pm_addr_o <= pc_q;
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/05/27 19:16:52 arniml
-- interrupt functionality added
--
-- Revision 1.1.1.1 2006/05/06 01:56:45 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_io_in.vhd
0,0 → 1,181
-------------------------------------------------------------------------------
--
-- The IN port controller.
--
-- $Id: t400_io_in.vhd,v 1.3 2006-05-27 19:14:18 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_pack.all;
 
entity t400_io_in is
 
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
icyc_en_i : in boolean;
in_en_i : in boolean;
-- Control Interface ------------------------------------------------------
op_i : in io_in_op_t;
en1_i : in std_logic;
-- Port Interface ---------------------------------------------------------
io_in_i : in dw_t;
in_o : out dw_t;
int_o : out boolean
);
 
end t400_io_in;
 
 
architecture rtl of t400_io_in is
 
constant idx_in3_c : natural := 2;
constant idx_in0_c : natural := 1;
constant idx_int_c : natural := 0;
 
type neg_edge_t is array (natural range 1 downto 0) of
std_logic_vector(2 downto 0);
signal neg_edge_q : neg_edge_t;
signal neg_edge_s : std_logic_vector(2 downto 0);
 
signal il_q : std_logic_vector(1 downto 0);
signal int_q,
int_icyc_q : boolean;
 
begin
 
-----------------------------------------------------------------------------
-- Process seq
--
-- Purpose:
-- Implements the sequential elements.
--
seq: process (ck_i, por_i)
variable neg_edge_v : std_logic_vector(2 downto 0);
begin
if por_i then
neg_edge_q <= (others => (others => '0'));
il_q <= (others => '0');
int_q <= false;
int_icyc_q <= false;
 
elsif ck_i'event and ck_i = '1' then
-- negative edge detector filp-flops ------------------------------------
neg_edge_v(idx_in3_c) := to_X01(io_in_i(3));
neg_edge_v(idx_in0_c) := to_X01(io_in_i(0));
neg_edge_v(idx_int_c) := to_X01(io_in_i(1));
 
if in_en_i then
neg_edge_q(0) <= neg_edge_v;
neg_edge_q(1) <= neg_edge_q(0) or neg_edge_v;
end if;
 
-- IL latches -----------------------------------------------------------
if in_en_i then
if neg_edge_q(1)(idx_in3_c) = '1' and
((neg_edge_q(0)(idx_in3_c) or neg_edge_v(idx_in3_c)) = '0') then
il_q(1) <= '1';
end if;
if neg_edge_q(1)(idx_in0_c) = '1' and
((neg_edge_q(0)(idx_in0_c) or neg_edge_v(idx_in0_c)) = '0') then
il_q(0) <= '1';
end if;
end if;
 
-- Interrupt trigger ----------------------------------------------------
if in_en_i then
if neg_edge_q(1)(idx_int_c) = '1' and
((neg_edge_q(0)(idx_int_c) or neg_edge_v(idx_int_c)) = '0') then
int_q <= true;
end if;
end if;
if icyc_en_i then
-- delay interrupt request until end of current instruction
-- this ensures that the interrupt is valid for a full instruction
-- (i.e. the next one)
int_icyc_q <= int_q;
end if;
 
if ck_en_i then
if op_i = IOIN_INIL then
il_q <= (others => '0');
end if;
 
if op_i = IOIN_INTACK then
int_q <= false;
int_icyc_q <= false;
end if;
end if;
 
end if;
end process seq;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
in_o <= il_q(1) & "00" & il_q(0)
when op_i = IOIN_INIL else
io_in_i;
int_o <= int_icyc_q;
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/05/23 01:13:28 arniml
-- + reset neg_edge flip-flops to '1'
-- -> after por, a 1-to-0 edge is required to trigger the latches initially
-- + use to_X01
--
-- Revision 1.1 2006/05/22 00:00:55 arniml
-- initial check-in
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_core-c.vhd
0,0 → 1,92
-------------------------------------------------------------------------------
--
-- T400 Microcontroller Core
--
-- $Id: t400_core-c.vhd,v 1.3 2006-05-22 00:03:29 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_core_struct_c0 of t400_core is
 
for struct
 
for clkgen_b: t400_clkgen
use configuration work.t400_clkgen_rtl_c0;
end for;
 
for reset_b: t400_reset
use configuration work.t400_reset_rtl_c0;
end for;
 
for pmem_ctrl_b: t400_pmem_ctrl
use configuration work.t400_pmem_ctrl_rtl_c0;
end for;
 
for dmem_ctrl_b: t400_dmem_ctrl
use configuration work.t400_dmem_ctrl_rtl_c0;
end for;
 
for decoder_b: t400_decoder
use configuration work.t400_decoder_rtl_c0;
end for;
 
for skip_b: t400_skip
use configuration work.t400_skip_rtl_c0;
end for;
 
for alu_b: t400_alu
use configuration work.t400_alu_rtl_c0;
end for;
 
for stack_b: t400_stack
use configuration work.t400_stack_rtl_c0;
end for;
 
for io_l_b: t400_io_l
use configuration work.t400_io_l_rtl_c0;
end for;
 
for io_d_b: t400_io_d
use configuration work.t400_io_d_rtl_c0;
end for;
 
for io_g_b: t400_io_g
use configuration work.t400_io_g_rtl_c0;
end for;
 
for use_in
for io_in_b: t400_io_in
use configuration work.t400_io_in_rtl_c0;
end for;
end for;
 
for sio_b: t400_sio
use configuration work.t400_sio_rtl_c0;
end for;
 
for use_tim
for timer_b: t400_timer
use configuration work.t400_timer_rtl_c0;
end for;
end for;
 
end for;
 
end t400_core_struct_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/05/20 02:48:17 arniml
-- timer module included
--
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_alu.vhd
0,0 → 1,263
-------------------------------------------------------------------------------
--
-- The Arithmetic Logic Unit (ALU).
-- It contains the accumulator and the C flag.
--
-- $Id: t400_alu.vhd,v 1.3 2006-05-22 00:01:56 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_pack.all;
use work.t400_opt_pack.all;
 
entity t400_alu is
 
generic (
opt_cko_g : integer := t400_opt_cko_crystal_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
cko_i : in std_logic;
-- Control Interface ------------------------------------------------------
op_i : in alu_op_t;
-- Data Interface ---------------------------------------------------------
m_i : in dw_t;
dec_data_i : in dec_data_t;
q_low_i : in dw_t;
b_i : in b_t;
g_i : in dw_t;
in_i : in dw_t;
sio_i : in dw_t;
a_o : out dw_t;
carry_o : out std_logic;
c_o : out std_logic
);
 
end t400_alu;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture rtl of t400_alu is
 
subtype alu_dw_t is unsigned(dw_t'high+1 downto 0);
signal alu_result_s : alu_dw_t;
 
signal a_q : dw_t;
signal c_q : std_logic;
 
begin
 
-----------------------------------------------------------------------------
-- Process regs
--
-- Purpose:
-- Implements the sequential registers of the ALU:
-- * A - accumulator
-- * C - carry flag
--
regs: process (ck_i, por_i)
begin
if por_i then
a_q <= (others => '0');
c_q <= '0';
 
elsif ck_i'event and ck_i = '1' then
if res_i then
-- synchronous reset upon external reset event
a_q <= (others => '0');
c_q <= '0';
 
elsif ck_en_i then
-- update accumulator
case op_i is
when ALU_CLRA |
ALU_ADD |
ALU_ADD_10 |
ALU_ADD_C |
ALU_ADD_DEC |
ALU_COMP |
ALU_XOR =>
a_q <= std_logic_vector(alu_result_s(dw_t'range));
when ALU_LOAD_M =>
a_q <= m_i;
when ALU_LOAD_Q =>
a_q <= q_low_i;
when ALU_LOAD_G =>
a_q <= g_i;
when ALU_LOAD_IN =>
a_q <= in_i;
when ALU_LOAD_IL =>
a_q(3) <= in_i(3);
if opt_cko_g = t400_opt_cko_gpi_c then
a_q(2) <= cko_i;
else
a_q(2) <= '1';
end if;
a_q(1) <= '0';
a_q(0) <= in_i(0);
when ALU_LOAD_BR =>
a_q(3 downto 2) <= (others => '0');
a_q(1 downto 0) <= b_i(br_range_t);
when ALU_LOAD_BD =>
a_q <= b_i(bd_range_t);
when ALU_LOAD_SIO =>
a_q <= sio_i;
when others =>
null;
end case;
 
-- update C flag upon the following instructions
case op_i is
-- carry result of addition -----------------------------------------
when ALU_ADD_C =>
c_q <= alu_result_s(alu_dw_t'high);
 
-- reset C flag -----------------------------------------------------
when ALU_RC =>
c_q <= '0';
 
-- set C flag -------------------------------------------------------
when ALU_SC =>
c_q <= '1';
 
when others =>
null;
end case;
end if;
end if;
end process regs;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Process dp
--
-- Purpose:
-- Implements the ALU's data path.
--
dp: process (op_i,
a_q,
m_i,
dec_data_i,
c_q)
variable in1_v,
in2_v,
in3_v,
add_v, xor_v : alu_dw_t;
begin
-- prepare adder
in1_v := '0' & unsigned(a_q);
if op_i = ALU_ADD_10 then
in2_v := to_unsigned(10, alu_dw_t'length);
elsif op_i = ALU_ADD_DEC then
in2_v := '0' & unsigned(dec_data_i(dw_t'range));
else
in2_v := '0' & unsigned(m_i);
end if;
if op_i = ALU_ADD_C then
in3_v := (others => '0');
in3_v(0) := c_q;
else
in3_v := (others => '0');
end if;
add_v := in1_v + in2_v + in3_v;
 
-- prepare exclusive or
xor_v := in1_v xor in2_v;
 
case op_i is
-- ALU operation: Clear accumulator -------------------------------------
when ALU_CLRA =>
alu_result_s <= (others => '0');
 
-- ALU operation: Add to accumulator ------------------------------------
when ALU_ADD |
ALU_ADD_10 |
ALU_ADD_C |
ALU_ADD_DEC =>
alu_result_s <= add_v;
 
-- ALU operation: Complement accumulator --------------------------------
when ALU_COMP =>
alu_result_s <= '0' & not unsigned(a_q);
 
-- ALU operation: XOR to accumulator ------------------------------------
when ALU_XOR =>
alu_result_s <= xor_v;
 
when others =>
alu_result_s <= (others => '-');
end case;
end process dp;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
a_o <= a_q;
carry_o <= alu_result_s(alu_dw_t'high);
c_o <= c_q;
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/05/21 21:47:40 arniml
-- route cko to ALU for INIL instruction
--
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_io_in-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The IN port controller.
--
-- $Id: t400_io_in-c.vhd,v 1.1 2006-05-22 00:00:55 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_io_in_rtl_c0 of t400_io_in is
 
for rtl
end for;
 
end t400_io_in_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_timer-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The timer unit.
--
-- $Id: t400_timer-c.vhd,v 1.1 2006-05-20 02:47:12 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_timer_rtl_c0 of t400_timer is
 
for rtl
end for;
 
end t400_timer_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_timer.vhd
0,0 → 1,122
-------------------------------------------------------------------------------
--
-- The timer unit.
--
-- $Id: t400_timer.vhd,v 1.1 2006-05-20 02:47:12 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_pack.all;
 
entity t400_timer is
 
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
icyc_en_i : in boolean;
-- Skip Interface ---------------------------------------------------------
op_i : in skip_op_t;
c_o : out boolean
);
 
end t400_timer;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture rtl of t400_timer is
 
signal cnt_q : unsigned(9 downto 0);
signal c_q : boolean;
 
begin
 
-----------------------------------------------------------------------------
-- Process seq
--
-- Purpose:
-- Implements the sequential elements:
-- * timer counter
-- * carry (underflow) marker flag
--
seq: process (ck_i, por_i)
begin
if por_i then
cnt_q <= (others => '1');
c_q <= false;
 
elsif ck_i'event and ck_i = '1' then
if icyc_en_i then
if cnt_q = 0 then
-- counter underflow:
-- * reload counter
-- * set marker flag
cnt_q <= (others => '1');
c_q <= true;
else
cnt_q <= cnt_q - 1;
end if;
end if;
 
if ck_en_i and op_i = SKIP_TIMER then
c_q <= false;
end if;
end if;
end process seq;
--
-----------------------------------------------------------------------------
 
 
c_o <= c_q;
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_sio.vhd
0,0 → 1,302
-------------------------------------------------------------------------------
--
-- The serial input/output unit.
--
-- $Id: t400_sio.vhd,v 1.3 2006-05-07 02:24:16 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_pack.all;
use work.t400_opt_pack.all;
 
entity t400_sio is
 
generic (
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
phi1_i : in std_logic;
out_en_i : in boolean;
in_en_i : in boolean;
-- Control Interface ------------------------------------------------------
op_i : in sio_op_t;
en0_i : in std_logic;
en3_i : in std_logic;
-- SIO Interface ----------------------------------------------------------
a_i : in dw_t;
c_i : in std_logic;
sio_o : out dw_t;
-- Pad Interface ----------------------------------------------------------
si_i : in std_logic;
so_o : out std_logic;
so_en_o : out std_logic;
sk_o : out std_logic;
sk_en_o : out std_logic
);
 
end t400_sio;
 
 
library ieee;
use ieee.numeric_std.all;
 
use work.t400_io_pack.all;
 
architecture rtl of t400_sio is
 
signal si_q : std_logic;
type si_flt_t is (SI_LOW_0, SI_LOW_1,
SI_HIGH_0, SI_HIGH_1);
signal si_flt_s,
si_flt_q : si_flt_t;
signal si_0_ok_s,
si_1_ok_s : boolean;
signal si_0_ok_q,
si_1_ok_q : boolean;
signal dec_sio_s : boolean;
 
signal new_sio_s,
sio_q : unsigned(dw_range_t);
signal skl_q : std_logic;
signal phi1_en_q : std_logic;
 
signal so_s,
sk_s : std_logic;
 
signal vdd_s : std_logic;
 
begin
 
vdd_s <= '1';
 
-----------------------------------------------------------------------------
-- Process seq
--
-- Purpose:
-- Implements the sequential elements.
--
seq: process (ck_i, por_i)
begin
if por_i then
sio_q <= (others => '0');
skl_q <= '1';
phi1_en_q <= '1';
si_q <= '1';
si_flt_q <= SI_LOW_0;
si_0_ok_q <= false;
si_1_ok_q <= false;
 
elsif ck_i'event and ck_i = '1' then
if res_i then
-- synchronous reset upon external reset event
skl_q <= '1';
phi1_en_q <= '1';
else
if in_en_i then
-- sample asynchronous SI input
si_q <= si_i;
end if;
 
if out_en_i then
-- SI filter FSM
si_flt_q <= si_flt_s;
-- SI low/high markers
si_0_ok_q <= si_0_ok_s;
si_1_ok_q <= si_1_ok_s;
end if;
 
-- SIO shift register / counter
if op_i = SIO_LOAD and ck_en_i then
-- parallel update has priority
sio_q <= unsigned(a_i);
skl_q <= c_i;
 
else
sio_q <= new_sio_s;
end if;
 
if ck_en_i then
-- delay enable of PHI1 by one clock cycle
-- this prevents glitches on sk_o when enabling/disabling
-- sk_o as a clock output
phi1_en_q <= skl_q;
end if;
 
end if;
end if;
end process seq;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Process new_sio
--
-- Purpose:
-- Calculates the new value of SIO.
-- Splitting this from the sequential process is required to deliver
-- the transient new value of SIO to sio_o upon reading SIO.
--
new_sio: process (out_en_i,
en0_i,
sio_q,
si_q,
dec_sio_s)
begin
-- default value
new_sio_s <= sio_q;
 
if out_en_i then
if en0_i = '0' then
-- shift register mode
new_sio_s(3 downto 1) <= sio_q(2 downto 0);
new_sio_s(0) <= si_q;
 
else
-- counter mode
if dec_sio_s then
new_sio_s <= sio_q - 1;
end if;
 
end if;
end if;
end process new_sio;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Process si_sample
--
-- Purpose:
-- Implements the low pass filter on SI for low and high levels.
--
si_sample: process (si_q,
si_flt_q,
si_0_ok_q, si_1_ok_q)
begin
-- default assignments
si_flt_s <= si_flt_q;
si_0_ok_s <= si_0_ok_q;
si_1_ok_s <= si_1_ok_q;
dec_sio_s <= false;
 
case si_flt_q is
when SI_LOW_0 =>
if si_q = '0' then
si_flt_s <= SI_LOW_1;
else
si_flt_s <= SI_HIGH_0;
end if;
 
when SI_LOW_1 =>
if si_q = '0' then
si_0_ok_s <= true; -- enough '0' on SI
 
if not si_0_ok_q and si_1_ok_q then
-- decrement counter if durations of high and low phases
-- were long enough
dec_sio_s <= true;
end if;
else
si_flt_s <= SI_HIGH_0;
si_1_ok_s <= false; -- restart measuring
end if;
 
when SI_HIGH_0 =>
si_1_ok_s <= false; -- restart marker
if si_q = '1' then
si_flt_s <= SI_HIGH_1;
else
si_flt_s <= SI_LOW_0;
end if;
 
when SI_HIGH_1 =>
if si_q = '1' then
si_1_ok_s <= true; -- enough '1' on SI
else
si_flt_s <= SI_LOW_0;
si_0_ok_s <= false; -- restart measuring
end if;
 
when others =>
null;
end case;
end process si_sample;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
sio_o <= std_logic_vector(new_sio_s);
so_s <= en3_i and (en0_i or sio_q(3));
sk_s <= phi1_en_q and (en0_i or phi1_i);
so_o <= io_out_f(dat => so_s, opt => opt_so_output_type_g);
so_en_o <= io_en_f (en => vdd_s,
dat => so_s, opt => opt_so_output_type_g);
sk_o <= io_out_f(dat => sk_s, opt => opt_sk_output_type_g);
sk_en_o <= io_en_f (en => vdd_s,
dat => sk_s, opt => opt_sk_output_type_g);
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.2 2006/05/06 13:34:58 arniml
-- phi1_en_q is dedicated enable for PHI1 clock to suppress glitches on sk_o
--
-- Revision 1.1.1.1 2006/05/06 01:56:45 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_io_d.vhd
0,0 → 1,164
-------------------------------------------------------------------------------
--
-- The D port controller.
--
-- $Id: t400_io_d.vhd,v 1.2 2006-05-07 02:24:16 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
entity t400_io_d is
 
generic (
opt_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_out_type_0_g : integer := t400_opt_out_type_std_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
-- Control Interface ------------------------------------------------------
op_i : in io_d_op_t;
bd_i : in bd_t;
-- Port D Interface -------------------------------------------------------
io_d_o : out dw_t;
io_d_en_o : out dw_t
);
 
end t400_io_d;
 
 
use work.t400_io_pack.all;
 
architecture rtl of t400_io_d is
 
signal d_q : dw_t;
 
signal vdd_s : std_logic;
 
begin
 
vdd_s <= '1';
 
-----------------------------------------------------------------------------
-- Process d_reg
--
-- Purpose:
-- Implements the D output register.
--
d_reg: process (ck_i, por_i)
begin
if por_i then
d_q <= (others => '0');
 
elsif ck_i'event and ck_i = '1' then
if res_i then
-- synchronous reset upon external reset event
d_q <= (others => '0');
 
elsif ck_en_i then
if op_i = IOD_LOAD then
d_q <= bd_i;
end if;
end if;
 
end if;
end process d_reg;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Process out_driver
--
-- Purpose:
-- Implements the output driver data and enable.
--
out_driver: process (d_q,
vdd_s)
begin
-- bit 3
io_d_o(3) <= io_out_f(dat => d_q(3),
opt => opt_out_type_3_g);
io_d_en_o(3) <= io_en_f (en => vdd_s, dat => d_q(3),
opt => opt_out_type_3_g);
 
-- bit 2
io_d_o(2) <= io_out_f(dat => d_q(2),
opt => opt_out_type_2_g);
io_d_en_o(2) <= io_en_f (en => vdd_s, dat => d_q(2),
opt => opt_out_type_2_g);
 
-- bit 1
io_d_o(1) <= io_out_f(dat => d_q(1),
opt => opt_out_type_1_g);
io_d_en_o(1) <= io_en_f (en => vdd_s, dat => d_q(1),
opt => opt_out_type_1_g);
 
-- bit 0
io_d_o(0) <= io_out_f(dat => d_q(0),
opt => opt_out_type_0_g);
io_d_en_o(0) <= io_en_f (en => vdd_s, dat => d_q(0),
opt => opt_out_type_0_g);
 
end process out_driver;
--
-----------------------------------------------------------------------------
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_core_comp_pack-p.vhd
0,0 → 1,79
-------------------------------------------------------------------------------
--
-- $Id: t400_core_comp_pack-p.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
package t400_core_comp_pack is
 
component t400_core
generic (
opt_type_g : integer := t400_opt_type_420_c;
opt_ck_div_g : integer := t400_opt_ck_div_16_c;
opt_cko_g : integer := t400_opt_cko_crystal_c;
opt_l_out_type_7_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_6_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_5_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_4_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_l_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_microbus_g : integer := t400_opt_no_microbus_c;
opt_d_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_d_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_3_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_2_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_1_g : integer := t400_opt_out_type_std_c;
opt_g_out_type_0_g : integer := t400_opt_out_type_std_c;
opt_so_output_type_g : integer := t400_opt_out_type_std_c;
opt_sk_output_type_g : integer := t400_opt_out_type_std_c
);
port (
ck_i : in std_logic;
ck_en_i : in std_logic;
por_n_i : in std_logic;
reset_n_i : in std_logic;
cko_i : in std_logic;
pm_addr_o : out std_logic_vector(9 downto 0);
pm_data_i : in std_logic_vector(7 downto 0);
dm_addr_o : out std_logic_vector(5 downto 0);
dm_we_o : out std_logic;
dm_data_o : out std_logic_vector(3 downto 0);
dm_data_i : in std_logic_vector(3 downto 0);
io_l_i : in std_logic_vector(7 downto 0);
io_l_o : out std_logic_vector(7 downto 0);
io_l_en_o : out std_logic_vector(7 downto 0);
io_d_o : out std_logic_vector(3 downto 0);
io_d_en_o : out std_logic_vector(3 downto 0);
io_g_i : in std_logic_vector(3 downto 0);
io_g_o : out std_logic_vector(3 downto 0);
io_g_en_o : out std_logic_vector(3 downto 0);
io_in_i : in std_logic_vector(3 downto 0);
si_i : in std_logic;
so_o : out std_logic;
so_en_o : out std_logic;
sk_o : out std_logic;
sk_en_o : out std_logic
);
end component;
 
end t400_core_comp_pack;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_reset-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The reset generation unit.
--
-- $Id: t400_reset-c.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_reset_rtl_c0 of t400_reset is
 
for rtl
end for;
 
end t400_reset_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_pmem_ctrl-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The Program memory controller.
--
-- $Id: t400_pmem_ctrl-c.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_pmem_ctrl_rtl_c0 of t400_pmem_ctrl is
 
for rtl
end for;
 
end t400_pmem_ctrl_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_io_pack-p.vhd
0,0 → 1,89
-------------------------------------------------------------------------------
--
-- $Id: t400_io_pack-p.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
package t400_io_pack is
 
function io_out_f(dat : in std_logic;
opt : in integer) return std_logic;
 
function io_en_f (en : in std_logic;
dat : in std_logic;
opt : in integer) return std_logic;
 
end t400_io_pack;
 
 
use work.t400_opt_pack.all;
 
package body t400_io_pack is
 
function io_out_f(dat : in std_logic;
opt : in integer) return std_logic is
variable result_v : std_logic;
begin
result_v := '-';
 
case opt is
-- Open drain type output drivers ---------------------------------------
when t400_opt_out_type_od_c =>
result_v := '0';
 
-- Push/pull type output drivers ----------------------------------------
when t400_opt_out_type_std_c |
t400_opt_out_type_led_c |
t400_opt_out_type_pp_c =>
result_v := dat;
 
when others =>
null;
end case;
 
return result_v;
end io_out_f;
 
 
function io_en_f (en : in std_logic;
dat : in std_logic;
opt : in integer) return std_logic is
variable result_v : std_logic;
begin
result_v := '0';
 
case opt is
-- Open drain type output drivers ---------------------------------------
when t400_opt_out_type_od_c =>
if en = '1' and dat = '0' then
result_v := '1';
end if;
 
-- Push/pull type output drivers ----------------------------------------
when t400_opt_out_type_std_c |
t400_opt_out_type_led_c |
t400_opt_out_type_pp_c =>
result_v := en;
 
when others =>
null;
end case;
 
return result_v;
end io_en_f;
 
end t400_io_pack;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_dmem_ctrl.vhd
0,0 → 1,251
-------------------------------------------------------------------------------
--
-- The Data memory controller.
--
-- $Id: t400_dmem_ctrl.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
entity t400_dmem_ctrl is
 
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
res_i : in boolean;
-- Control Interface ------------------------------------------------------
dmem_op_i : in dmem_op_t;
b_op_i : in b_op_t;
dec_data_i : in dec_data_t;
a_i : in dw_t;
q_high_i : in dw_t;
b_o : out b_t;
-- Data Memory Interface --------------------------------------------------
dm_addr_o : out dm_addr_t;
dm_data_i : in dw_t;
dm_data_o : out dw_t;
dm_we_o : out std_logic
);
 
end t400_dmem_ctrl;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture rtl of t400_dmem_ctrl is
 
signal br_q : unsigned(br_range_t);
signal bd_q : unsigned(bd_range_t);
 
begin
 
-----------------------------------------------------------------------------
-- Process b_reg
--
-- Purpose:
-- Implements the B register.
--
b_reg: process (ck_i, por_i)
begin
if por_i then
br_q <= (others => '0');
bd_q <= (others => '0');
 
elsif ck_i'event and ck_i = '1' then
if res_i then
-- synchronous reset upon external reset event
br_q <= (others => '0');
bd_q <= (others => '0');
 
elsif ck_en_i then
case b_op_i is
-- Set Bd from accumulator ------------------------------------------
when B_SET_BD =>
bd_q <= unsigned(a_i);
 
-- Set Br from accumulator ------------------------------------------
when B_SET_BR =>
br_q <= unsigned(a_i(1 downto 0));
 
-- Set Br and Bd from decoder data ----------------------------------
when B_SET_B =>
br_q <= unsigned(dec_data_i(br_range_t));
bd_q <= unsigned(dec_data_i(bd_range_t));
 
-- Set Br and Bd from decoder data, increment value for Bd ----------
when B_SET_B_INC =>
br_q <= unsigned(dec_data_i(br_range_t));
bd_q <= unsigned(dec_data_i(bd_range_t)) + 1;
 
-- XOR Br with decoder data -----------------------------------------
when B_XOR_BR =>
br_q <= br_q xor unsigned(dec_data_i(br_range_t));
 
-- Increment Bd -----------------------------------------------------
when B_INC_BD =>
bd_q <= bd_q + 1;
 
-- Increment Bd -----------------------------------------------------
when B_DEC_BD =>
bd_q <= bd_q - 1;
 
when others =>
null;
end case;
 
end if;
end if;
end process b_reg;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Process data_mux
--
-- Purpose:
-- Multiplexes the data for writing to the memory.
--
data_mux: process (dmem_op_i,
br_q, bd_q,
a_i,
q_high_i,
dec_data_i,
dm_data_i,
ck_en_i)
variable dm_addr_v : dm_addr_t;
variable dm_data_v : dw_t;
variable dm_we_v : std_logic;
variable bd_v : std_logic_vector(2 downto 0);
begin
-- default assignment
dm_addr_v(br_range_t) := std_logic_vector(br_q);
dm_addr_v(bd_range_t) := std_logic_vector(bd_q);
dm_data_v := (others => '0');
dm_we_v := '0';
 
case dmem_op_i is
-- Read data memory, indexed by B ---------------------------------------
when DMEM_RB =>
null;
 
-- Write data memory, indexed by B, source is Q -------------------------
when DMEM_WB_SRC_Q =>
dm_we_v := '1';
dm_data_v := q_high_i;
 
-- Write data memory, indexed by B, source is decoder data --------------
when DMEM_WB_SRC_DEC =>
dm_we_v := '1';
dm_data_v := dec_data_i(bd_range_t);
 
-- Write data memory, indexed by B, source is accumulator ---------------
when DMEM_WB_SRC_A =>
dm_we_v := '1';
dm_data_v := a_i;
 
-- Read data memory, indexed by decoder data ----------------------------
when DMEM_RDEC =>
dm_addr_v := dec_data_i(br_range_t'high downto 0);
 
-- Write data memory, indexed by decoder data, source is accumulator ----
when DMEM_WDEC_SRC_A =>
dm_we_v := '1';
dm_addr_v := dec_data_i(br_range_t'high downto 0);
dm_data_v := a_i;
 
-- Write data memory, indexed by B, set bit -----------------------------
when DMEM_WB_SET_BIT =>
dm_we_v := '1';
dm_data_v := dm_data_i or dec_data_i(dw_range_t);
 
-- Write data memory, indexed by B, reset bit ---------------------------
when DMEM_WB_RES_BIT =>
dm_we_v := '1';
dm_data_v := dm_data_i and not dec_data_i(dw_range_t);
 
when others =>
null;
end case;
 
-- adjust address vector for 41xL family members
if opt_type_g = t400_opt_type_410_c then
dm_addr_v := '0' & dm_addr_v(br_range_t) &
dm_addr_v(bd_range_t'high-1 downto 0);
end if;
 
dm_addr_o <= dm_addr_v;
 
if ck_en_i then
dm_we_o <= dm_we_v;
else
dm_we_o <= '0';
end if;
dm_data_o <= dm_data_v;
end process data_mux;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
b_o(br_range_t) <= std_logic_vector(br_q);
b_o(bd_range_t) <= std_logic_vector(bd_q);
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_opc_table-c.vhd
0,0 → 1,26
-------------------------------------------------------------------------------
--
-- The opcode decoder table.
-- Maps the binary opcodes to the mnemonic type.
--
-- $Id: t400_opc_table-c.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_opc_table_rtl_c0 of t400_opc_table is
 
for rtl
end for;
 
end t400_opc_table_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_sio-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The serial input/output unit.
--
-- $Id: t400_sio-c.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_sio_rtl_c0 of t400_sio is
 
for rtl
end for;
 
end t400_sio_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_reset.vhd
0,0 → 1,145
-------------------------------------------------------------------------------
--
-- The reset generation unit.
--
-- $Id: t400_reset.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
entity t400_reset is
 
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
icyc_en_i : in boolean;
por_i : in boolean;
-- Reset Interface --------------------------------------------------------
reset_n_i : in std_logic;
res_o : out boolean
);
 
end t400_reset;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture rtl of t400_reset is
 
type res_state_t is (IDLE,
RES1, RES2,
RES_ACTIVE);
signal res_state_q : res_state_t;
signal res_q : boolean;
 
begin
 
-----------------------------------------------------------------------------
-- Process res_fsm
--
-- Purpose:
-- Implements the reset timing/controlling FSM.
-- User's Guide chapter 2.3 requires that reset_n_i has to be low for
-- at least 3 instruction cycle times until it initializes the CPU.
--
res_fsm: process (ck_i, por_i)
begin
if por_i then
res_state_q <= IDLE;
res_q <= false;
 
elsif ck_i'event and ck_i = '1' then
res_q <= false;
if icyc_en_i then
case res_state_q is
when IDLE =>
if reset_n_i = '0' then
res_state_q <= RES1;
end if;
 
when RES1 =>
if reset_n_i = '0' then
res_state_q <= RES2;
else
res_state_q <= IDLE;
end if;
 
when RES2 =>
if reset_n_i = '0' then
res_state_q <= RES_ACTIVE;
else
res_state_q <= IDLE;
end if;
 
when RES_ACTIVE =>
res_q <= true;
if reset_n_i = '1' then
res_state_q <= IDLE;
end if;
 
when others =>
res_state_q <= IDLE;
 
end case;
 
end if;
 
end if;
end process res_fsm;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
res_o <= res_q;
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_clkgen-c.vhd
0,0 → 1,26
-------------------------------------------------------------------------------
--
-- The clock generation unit.
-- PHI1 clock and input/output clock enables are generated here.
--
-- $Id: t400_clkgen-c.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_clkgen_rtl_c0 of t400_clkgen is
 
for rtl
end for;
 
end t400_clkgen_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_stack-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The stack unit.
--
-- $Id: t400_stack-c.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_stack_rtl_c0 of t400_stack is
 
for rtl
end for;
 
end t400_stack_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_opc_table.vhd
0,0 → 1,299
-------------------------------------------------------------------------------
--
-- The opcode decoder table.
-- Maps the binary opcodes to the mnemonic type.
--
-- $Id: t400_opc_table.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
use work.t400_pack.all;
 
entity t400_opc_table is
 
generic (
opt_type_g : integer := t400_opt_type_420_c
);
port (
opcode_i : in byte_t;
mnemonic_o : out mnemonic_t;
multi_byte_o : out boolean
);
 
end t400_opc_table;
 
 
architecture rtl of t400_opc_table is
 
begin
 
-----------------------------------------------------------------------------
-- Process opc_decode
--
-- Purpose:
-- Decodes the opcode to the set of mnemonics.
--
opc_decode: process (opcode_i)
variable t41x_type_v : boolean;
begin
-- default assignment
mnemonic_o <= MN_NOP;
multi_byte_o <= false;
-- determine type
t41x_type_v := opt_type_g = t400_opt_type_410_c;
 
case opcode_i is
-- Mnemonic ASC----------------------------------------------------------
when "00110000" =>
mnemonic_o <= MN_ASC;
 
-- Mnemonic ADD ---------------------------------------------------------
when "00110001" =>
mnemonic_o <= MN_ADD;
 
-- Mnemonic ADT ---------------------------------------------------------
when "01001010" =>
if not t41x_type_v then
mnemonic_o <= MN_ADT;
end if;
 
-- Mnemonic AISC --------------------------------------------------------
when "01010001" | "01010010" | "01010011" |
"01010100" | "01010101" | "01010110" | "01010111" |
"01011000" | "01011001" | "01011010" | "01011011" |
"01011100" | "01011101" | "01011110" | "01011111" =>
mnemonic_o <= MN_AISC;
 
-- Mnemonic CASC --------------------------------------------------------
when "00010000" =>
if not t41x_type_v then
mnemonic_o <= MN_CASC;
end if;
 
-- Mnemonic CLRA --------------------------------------------------------
when "00000000" =>
mnemonic_o <= MN_CLRA;
 
-- Mnemonic COMP --------------------------------------------------------
when "01000000" =>
mnemonic_o <= MN_COMP;
 
-- Mnemonic NOP ---------------------------------------------------------
when "01000100" =>
mnemonic_o <= MN_NOP;
 
-- Mnemonic C -----------------------------------------------------------
when "00110010" | -- RC
"00100010" => -- SC
mnemonic_o <= MN_C;
 
-- Mnemonic XOR ---------------------------------------------------------
when "00000010" =>
mnemonic_o <= MN_XOR;
 
-- Mnemonic JID ---------------------------------------------------------
when "11111111" =>
mnemonic_o <= MN_JID;
 
-- Mnemonic JMP ---------------------------------------------------------
when "01100000" | "01100001" | "01100010" | "01100011" =>
mnemonic_o <= MN_JMP;
multi_byte_o <= true;
 
-- Mnemonic JP_JSRP -----------------------------------------------------
when "10000000" | "10000001" | "10000010" | "10000011" |
"10000100" | "10000101" | "10000110" | "10000111" |
"10001000" | "10001001" | "10001010" | "10001011" |
"10001100" | "10001101" | "10001110" | "10001111" |
"10010000" | "10010001" | "10010010" | "10010011" |
"10010100" | "10010101" | "10010110" | "10010111" |
"10011000" | "10011001" | "10011010" | "10011011" |
"10011100" | "10011101" | "10011110" | "10011111" |
"10100000" | "10100001" | "10100010" | "10100011" |
"10100100" | "10100101" | "10100110" | "10100111" |
"10101000" | "10101001" | "10101010" | "10101011" |
"10101100" | "10101101" | "10101110" | "10101111" |
"10110000" | "10110001" | "10110010" | "10110011" |
"10110100" | "10110101" | "10110110" | "10110111" |
"10111000" | "10111001" | "10111010" | "10111011" |
"10111100" | "10111101" | "10111110" |
"11000000" | "11000001" | "11000010" | "11000011" |
"11000100" | "11000101" | "11000110" | "11000111" |
"11001000" | "11001001" | "11001010" | "11001011" |
"11001100" | "11001101" | "11001110" | "11001111" |
"11010000" | "11010001" | "11010010" | "11010011" |
"11010100" | "11010101" | "11010110" | "11010111" |
"11011000" | "11011001" | "11011010" | "11011011" |
"11011100" | "11011101" | "11011110" | "11011111" |
"11100000" | "11100001" | "11100010" | "11100011" |
"11100100" | "11100101" | "11100110" | "11100111" |
"11101000" | "11101001" | "11101010" | "11101011" |
"11101100" | "11101101" | "11101110" | "11101111" |
"11110000" | "11110001" | "11110010" | "11110011" |
"11110100" | "11110101" | "11110110" | "11110111" |
"11111000" | "11111001" | "11111010" | "11111011" |
"11111100" | "11111101" | "11111110" =>
mnemonic_o <= MN_JP_JSRP;
 
-- Mnemonic JSR ---------------------------------------------------------
when "01101000" | "01101001" | "01101010" | "01101011" =>
mnemonic_o <= MN_JSR;
multi_byte_o <= true;
 
-- Mnemonic RET ---------------------------------------------------------
when "01001000" =>
mnemonic_o <= MN_RET;
 
-- Mnemonic RETSK -------------------------------------------------------
when "01001001" =>
mnemonic_o <= MN_RETSK;
 
-- Mnemonic LD ----------------------------------------------------------
when "00000101" | "00010101" | "00100101" | "00110101" =>
mnemonic_o <= MN_LD;
 
-- Mnemonic LDD_XAD -----------------------------------------------------
when "00100011" =>
mnemonic_o <= MN_LDD_XAD;
multi_byte_o <= true;
 
-- Mnemonic LQID --------------------------------------------------------
when "10111111" =>
mnemonic_o <= MN_LQID;
 
-- Mnemonic RMB ---------------------------------------------------------
when "01001100" | "01000101" | "01000010" | "01000011" =>
mnemonic_o <= MN_RMB;
 
-- Mnemonic SMB ---------------------------------------------------------
when "01001101" | "01000111" | "01000110" | "01001011" =>
mnemonic_o <= MN_SMB;
 
-- Mnemonic STII --------------------------------------------------------
when "01110000" | "01110001" | "01110010" | "01110011" |
"01110100" | "01110101" | "01110110" | "01110111" |
"01111000" | "01111001" | "01111010" | "01111011" |
"01111100" | "01111101" | "01111110" | "01111111" =>
mnemonic_o <= MN_STII;
 
-- Mnemonic X -----------------------------------------------------------
when "00000110" | "00010110" | "00100110" | "00110110" =>
mnemonic_o <= MN_X;
 
-- Mnemonic XDS ---------------------------------------------------------
when "00000111" | "00010111" | "00100111" | "00110111" =>
mnemonic_o <= MN_XDS;
 
-- Mnemonic XIS ---------------------------------------------------------
when "00000100" | "00010100" | "00100100" | "00110100" =>
mnemonic_o <= MN_XIS;
 
-- Mnemonic CAB ---------------------------------------------------------
when "01010000" =>
mnemonic_o <= MN_CAB;
 
-- Mnemonic CBA ---------------------------------------------------------
when "01001110" =>
mnemonic_o <= MN_CBA;
 
-- Mnemonic LBI ---------------------------------------------------------
when "00001000" | "00001001" | "00001010" | "00001011" |
"00001100" | "00001101" | "00001110" | "00001111" |
"00011000" | "00011001" | "00011010" | "00011011" |
"00011100" | "00011101" | "00011110" | "00011111" |
"00101000" | "00101001" | "00101010" | "00101011" |
"00101100" | "00101101" | "00101110" | "00101111" |
"00111000" | "00111001" | "00111010" | "00111011" |
"00111100" | "00111101" | "00111110" | "00111111" =>
mnemonic_o <= MN_LBI;
 
-- Mnemonic XABR --------------------------------------------------------
when "00010010" =>
if not t41x_type_v then
mnemonic_o <= MN_XABR;
end if;
 
-- Mnemonic SKC ---------------------------------------------------------
when "00100000" =>
mnemonic_o <= MN_SKC;
 
-- Mnemonic SKE ---------------------------------------------------------
when "00100001" =>
mnemonic_o <= MN_SKE;
 
-- Mnemonic SKMBZ -------------------------------------------------------
when "00000001" | "00010001" | "00000011" | "00010011" =>
mnemonic_o <= MN_SKMBZ;
 
-- Mnemonic SKT ---------------------------------------------------------
when "01000001" =>
if not t41x_type_v then
mnemonic_o <= MN_SKT;
end if;
 
-- Mnemonic XAS ---------------------------------------------------------
when "01001111" =>
mnemonic_o <= MN_XAS;
 
-- Mnemonic EXT ---------------------------------------------------------
when "00110011" =>
mnemonic_o <= MN_EXT;
multi_byte_o <= true;
 
 
when others =>
null;
end case;
end process opc_decode;
--
-----------------------------------------------------------------------------
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_io_d-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The D port controller.
--
-- $Id: t400_io_d-c.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_io_d_rtl_c0 of t400_io_d is
 
for rtl
end for;
 
end t400_io_d_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_io_g-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The G port controller.
--
-- $Id: t400_io_g-c.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_io_g_rtl_c0 of t400_io_g is
 
for rtl
end for;
 
end t400_io_g_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_opt_pack-p.vhd
0,0 → 1,45
-------------------------------------------------------------------------------
--
-- $Id: t400_opt_pack-p.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
package t400_opt_pack is
 
-- Chip type option ---------------------------------------------------------
constant t400_opt_type_420_c : integer := 0;
constant t400_opt_type_421_c : integer := 1;
constant t400_opt_type_410_c : integer := 2;
 
-- Clock divider option -----------------------------------------------------
constant t400_opt_ck_div_32_c : integer := 3;
constant t400_opt_ck_div_16_c : integer := 2;
constant t400_opt_ck_div_8_c : integer := 1;
constant t400_opt_ck_div_4_c : integer := 0;
 
-- CKO pin function option --------------------------------------------------
constant t400_opt_cko_crystal_c : integer := 0;
constant t400_opt_cko_gpi_c : integer := 1;
 
-- Output type option -------------------------------------------------------
constant t400_opt_out_type_std_c : integer := 0;
constant t400_opt_out_type_od_c : integer := 1;
constant t400_opt_out_type_led_c : integer := 2;
constant t400_opt_out_type_pp_c : integer := 3;
 
-- Microbus option ----------------------------------------------------------
constant t400_opt_no_microbus_c : integer := 0;
constant t400_opt_microbus_c : integer := 1;
 
end t400_opt_pack;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_alu-c.vhd
0,0 → 1,26
-------------------------------------------------------------------------------
--
-- The Arithmetic Logic Unit (ALU).
-- It contains the accumulator and the C flag.
--
-- $Id: t400_alu-c.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_alu_rtl_c0 of t400_alu is
 
for rtl
end for;
 
end t400_alu_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_io_l-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The L port controller.
--
-- $Id: t400_io_l-c.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_io_l_rtl_c0 of t400_io_l is
 
for rtl
end for;
 
end t400_io_l_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_clkgen.vhd
0,0 → 1,149
-------------------------------------------------------------------------------
--
-- The clock generation unit.
-- PHI1 clock and input/output clock enables are generated here.
--
-- $Id: t400_clkgen.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
use work.t400_opt_pack.all;
 
entity t400_clkgen is
 
generic (
opt_ck_div_g : integer := t400_opt_ck_div_16_c
);
port (
-- System Interface -------------------------------------------------------
ck_i : in std_logic;
ck_en_i : in boolean;
por_i : in boolean;
-- Clock Interface --------------------------------------------------------
phi1_o : out std_logic;
out_en_o : out boolean;
in_en_o : out boolean;
icyc_en_o : out boolean
);
 
end t400_clkgen;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture rtl of t400_clkgen is
 
subtype ck_div_t is unsigned(5 downto 0);
type ck_div_a_t is array(natural range t400_opt_ck_div_32_c
downto t400_opt_ck_div_4_c) of
ck_div_t;
-- reload values for the CK dividing counter
constant ck_div_a_c : ck_div_a_t := (
t400_opt_ck_div_32_c => to_unsigned(31, ck_div_t'length),
t400_opt_ck_div_16_c => to_unsigned(15, ck_div_t'length),
t400_opt_ck_div_8_c => to_unsigned( 7, ck_div_t'length),
t400_opt_ck_div_4_c => to_unsigned( 3, ck_div_t'length));
 
signal ck_div_cnt_q : ck_div_t;
signal ck_div_zero_s,
ck_div_half_s : boolean;
signal phi1_q : std_logic;
 
begin
 
-----------------------------------------------------------------------------
-- Process ck_div
--
-- Purpose:
-- Divide the incoming clock on ck_i and generate the derived clock
-- enable for the core.
--
ck_div: process (ck_i, por_i)
begin
if por_i then
ck_div_cnt_q <= ck_div_a_c(opt_ck_div_g);
phi1_q <= '0';
 
elsif ck_i'event and ck_i = '1' then
if ck_en_i then
if ck_div_zero_s then
ck_div_cnt_q <= ck_div_a_c(opt_ck_div_g);
phi1_q <= '0';
else
ck_div_cnt_q <= ck_div_cnt_q - 1;
 
if ck_div_half_s then
phi1_q <= '1';
end if;
end if;
end if;
end if;
 
end process ck_div;
--
ck_div_zero_s <= ck_div_cnt_q = 0;
ck_div_half_s <= ck_div_cnt_q = SHIFT_RIGHT(ck_div_a_c(opt_ck_div_g), 1) + 1;
--
-----------------------------------------------------------------------------
 
 
-----------------------------------------------------------------------------
-- Output mapping
-----------------------------------------------------------------------------
phi1_o <= phi1_q;
-- Instruction cycle enable
icyc_en_o <= ck_en_i and ck_div_zero_s;
-- Output update enable
out_en_o <= ck_en_i and ck_div_zero_s;
-- Input sample enable
in_en_o <= ck_en_i and ck_div_half_s;
 
end rtl;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_skip-c.vhd
0,0 → 1,26
-------------------------------------------------------------------------------
--
-- The skip unit.
-- Skip conditions are checked here and communicated to the decoder unit.
--
-- $Id: t400_skip-c.vhd,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_skip_rtl_c0 of t400_skip is
 
for rtl
end for;
 
end t400_skip_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/vhdl/t400_dmem_ctrl-c.vhd
0,0 → 1,25
-------------------------------------------------------------------------------
--
-- The Data memory controller.
--
-- $Id: t400_dmem_ctrl-c.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration t400_dmem_ctrl_rtl_c0 of t400_dmem_ctrl is
 
for rtl
end for;
 
end t400_dmem_ctrl_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/tech/generic/generic_ram.vhd
0,0 → 1,94
-------------------------------------------------------------------------------
--
-- Parametrizable, generic RAM.
--
-- $Id: generic_ram.vhd,v 1.3 2008-04-27 22:13:15 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
entity generic_ram is
 
generic (
addr_width_g : integer := 10;
data_width_g : integer := 8
);
port (
clk_i : in std_logic;
a_i : in std_logic_vector(addr_width_g-1 downto 0);
we_i : in std_logic;
d_i : in std_logic_vector(data_width_g-1 downto 0);
d_o : out std_logic_vector(data_width_g-1 downto 0)
);
 
end generic_ram;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture rtl of generic_ram is
 
type mem_t is array (natural range 0 to 2**addr_width_g-1) of
std_logic_vector(d_i'range);
signal mem_q : mem_t
-- pragma translate_off
:= (others => (others => '0'))
-- pragma translate_on
;
 
begin
 
mem: process (clk_i)
begin
 
if clk_i'event and clk_i = '1' then
if we_i = '1' then
mem_q(to_integer(unsigned(a_i))) <= d_i;
end if;
 
d_o <= mem_q(to_integer(unsigned(a_i)));
end if;
 
end process mem;
 
end rtl;
/tags/rel_1_1/rtl/tech/generic/generic_ram_ena.vhd
0,0 → 1,97
-------------------------------------------------------------------------------
--
-- Parametrizable, generic RAM with enable.
--
-- $Id: generic_ram_ena.vhd,v 1.3 2008-04-27 22:13:15 arniml Exp $
--
-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-- The latest version of this file can be found at:
-- http://www.opencores.org/cvsweb.shtml/t400/
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
entity generic_ram_ena is
 
generic (
addr_width_g : integer := 10;
data_width_g : integer := 8
);
port (
clk_i : in std_logic;
a_i : in std_logic_vector(addr_width_g-1 downto 0);
we_i : in std_logic;
ena_i : in std_logic;
d_i : in std_logic_vector(data_width_g-1 downto 0);
d_o : out std_logic_vector(data_width_g-1 downto 0)
);
 
end generic_ram_ena;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture rtl of generic_ram_ena is
 
type mem_t is array (natural range 0 to 2**addr_width_g-1) of
std_logic_vector(d_i'range);
signal mem_q : mem_t
-- pragma translate_off
:= (others => (others => '0'))
-- pragma translate_on
;
 
begin
 
mem: process (clk_i)
begin
 
if clk_i'event and clk_i = '1' then
if ena_i = '1' then
if we_i = '1' then
mem_q(to_integer(unsigned(a_i))) <= d_i;
end if;
 
d_o <= mem_q(to_integer(unsigned(a_i)));
end if;
 
end if;
end process mem;
 
end rtl;
/tags/rel_1_1/rtl/tech/generic/generic_ram_ena-c.vhd
0,0 → 1,18
-------------------------------------------------------------------------------
--
-- Parametrizable, generic RAM with enable.
--
-- $Id: generic_ram_ena-c.vhd,v 1.1 2006-06-05 20:01:05 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration generic_ram_ena_rtl_c0 of generic_ram_ena is
 
for rtl
end for;
 
end generic_ram_ena_rtl_c0;
/tags/rel_1_1/rtl/tech/generic/generic_ram-c.vhd
0,0 → 1,18
-------------------------------------------------------------------------------
--
-- Parametrizable, generic RAM.
--
-- $Id: generic_ram-c.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
configuration generic_ram_rtl_c0 of generic_ram is
 
for rtl
end for;
 
end generic_ram_rtl_c0;
/tags/rel_1_1/rtl/tech/t400_tech_comp_pack-p.vhd
0,0 → 1,67
-------------------------------------------------------------------------------
--
-- $Id: t400_tech_comp_pack-p.vhd,v 1.2 2006-06-05 20:31:00 arniml Exp $
--
-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
--
-- All rights reserved
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
package t400_tech_comp_pack is
 
component t400_por
generic (
delay_g : integer := 4;
cnt_width_g : integer := 2
);
port (
clk_i : in std_logic;
por_n_o : out std_logic
);
end component;
 
component generic_ram
generic (
addr_width_g : integer := 10;
data_width_g : integer := 8
);
port (
clk_i : in std_logic;
a_i : in std_logic_vector(addr_width_g-1 downto 0);
we_i : in std_logic;
d_i : in std_logic_vector(data_width_g-1 downto 0);
d_o : out std_logic_vector(data_width_g-1 downto 0)
);
end component;
 
component generic_ram_ena
generic (
addr_width_g : integer := 10;
data_width_g : integer := 8
);
port (
clk_i : in std_logic;
a_i : in std_logic_vector(addr_width_g-1 downto 0);
we_i : in std_logic;
ena_i : in std_logic;
d_i : in std_logic_vector(data_width_g-1 downto 0);
d_o : out std_logic_vector(data_width_g-1 downto 0)
);
end component;
 
 
end t400_tech_comp_pack;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/tech/cyclone/t400_por-c.vhd
0,0 → 1,20
-------------------------------------------------------------------------------
-- $Id: t400_por-c.vhd,v 1.2 2006-05-07 01:49:16 arniml Exp $
-------------------------------------------------------------------------------
 
configuration t400_por_rtl_c0 of t400_por is
 
for cyclone
end for;
 
end t400_por_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml
-- import from local CVS repository, LOC_CVS_0_1
--
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/tech/cyclone/t400_por.vhd
0,0 → 1,122
-------------------------------------------------------------------------------
--
-- T400 Core
--
-- $Id: t400_por.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $
--
-- Wrapper for technology dependent power-on reset circuitry.
--
-- Altera Cyclone flavor.
--
-- Generate a reset upon power-on for specified number of clocks.
--
-------------------------------------------------------------------------------
--
-- Copyright (c) 2006, Arnim Laeuger (arnim.laeuger@gmx.net)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
entity t400_por is
 
generic (
delay_g : integer := 4;
cnt_width_g : integer := 2
);
port (
clk_i : in std_logic;
por_n_o : out std_logic
);
 
end t400_por;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture cyclone of t400_por is
 
signal por_cnt_q : unsigned(cnt_width_g-1 downto 0)
-- pragma translate_off
-- initialize for simulation only
:= (others => '0')
-- pragma translate_on
;
signal por_n_q : std_logic
-- pragma translate_off
-- initialize for simulation only
:= '0'
-- pragma translate_on
;
 
-- Specify power-up level of por counter and por source.
-- Refer to "Quartus II Integrated Synthesis", section "Altera Attribute".
attribute altera_attribute : string;
attribute altera_attribute of por_cnt_q : signal is "-name POWER_UP_LEVEL LOW";
attribute altera_attribute of por_n_q : signal is "-name POWER_UP_LEVEL LOW";
 
begin
 
-----------------------------------------------------------------------------
-- Process por_cnt
--
-- Purpose:
-- Generate a power-on reset for the specifiec number of clocks.
--
por_cnt: process (clk_i)
begin
if clk_i'event and clk_i = '1' then
if por_cnt_q = delay_g-1 then
por_n_q <= '1';
else
por_cnt_q <= por_cnt_q + 1;
end if;
end if;
end process por_cnt;
--
-----------------------------------------------------------------------------
 
por_n_o <= por_n_q;
 
end cyclone;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/tech/spartan/t400_por-c.vhd
0,0 → 1,17
-------------------------------------------------------------------------------
-- $Id: t400_por-c.vhd,v 1.1 2006-05-07 01:47:51 arniml Exp $
-------------------------------------------------------------------------------
 
configuration t400_por_rtl_c0 of t400_por is
 
for spartan
end for;
 
end t400_por_rtl_c0;
 
 
-------------------------------------------------------------------------------
-- File History:
--
-- $Log: not supported by cvs2svn $
-------------------------------------------------------------------------------
/tags/rel_1_1/rtl/tech/spartan/t400_por.vhd
0,0 → 1,107
-------------------------------------------------------------------------------
--
-- T400 Core
--
-- $Id: t400_por.vhd,v 1.1 2006-05-07 01:47:51 arniml Exp $
--
-- Wrapper for technology dependent power-on reset circuitry.
--
-- Xilinx Spartan3 flavor.
--
-- Generate a reset upon power-on for specified number of clocks.
--
-------------------------------------------------------------------------------
--
-- Copyright (c) 2006, Arnim Laeuger (arnim.laeuger@gmx.net)
--
-- All rights reserved
--
-- Redistribution and use in source and synthezised forms, with or without
-- modification, are permitted provided that the following conditions are met:
--
-- Redistributions of source code must retain the above copyright notice,
-- this list of conditions and the following disclaimer.
--
-- Redistributions in synthesized form must reproduce the above copyright
-- notice, this list of conditions and the following disclaimer in the
-- documentation and/or other materials provided with the distribution.
--
-- Neither the name of the author nor the names of other contributors may
-- be used to endorse or promote products derived from this software without
-- specific prior written permission.
--
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-- POSSIBILITY OF SUCH DAMAGE.
--
-- Please report bugs to the author, but before you do so, please
-- make sure that this is not a derivative work and that
-- you have the latest version of this file.
--
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
 
entity t400_por is
 
generic (
delay_g : integer := 4;
cnt_width_g : integer := 2
);
port (
clk_i : in std_logic;
por_n_o : out std_logic
);
 
end t400_por;
 
 
library ieee;
use ieee.numeric_std.all;
 
architecture spartan of t400_por is
 
-----------------------------------------------------------------------------
-- According to
-- "XST User Guide", Chapter 6 "VHDL Language Support", "Initial Values"
-- XST honors the initial value assigned to a flip-flop. Simple :-)
--
signal por_cnt_q : unsigned(cnt_width_g-1 downto 0)
:= to_unsigned(delay_g, cnt_width_g);
signal por_n_q : std_logic := '0';
--
-----------------------------------------------------------------------------
 
begin
 
-----------------------------------------------------------------------------
-- Process por_cnt
--
-- Purpose:
-- Generate a power-on reset for the specified number of clocks.
--
por_cnt: process (clk_i)
begin
if clk_i'event and clk_i = '1' then
if por_cnt_q = 0 then
por_n_q <= '1';
else
por_cnt_q <= por_cnt_q - 1;
end if;
end if;
end process por_cnt;
--
-----------------------------------------------------------------------------
 
por_n_o <= por_n_q;
 
end spartan;
/tags/rel_1_1/COMPILE_LIST
0,0 → 1,91
rtl/vhdl/t400_opt_pack-p.vhd
rtl/vhdl/t400_clkgen.vhd
rtl/vhdl/t400_clkgen-c.vhd
rtl/vhdl/t400_reset.vhd
rtl/vhdl/t400_reset-c.vhd
rtl/vhdl/t400_pack-p.vhd
bench/vhdl/tb_pack-p.vhd
rtl/vhdl/t400_pmem_ctrl.vhd
rtl/vhdl/t400_pmem_ctrl-c.vhd
rtl/vhdl/t400_dmem_ctrl.vhd
rtl/vhdl/t400_dmem_ctrl-c.vhd
rtl/vhdl/t400_comp_pack-p.vhd
rtl/vhdl/t400_mnemonic_pack-p.vhd
rtl/vhdl/t400_decoder.vhd
rtl/vhdl/t400_decoder-c.vhd
rtl/vhdl/t400_skip.vhd
rtl/vhdl/t400_skip-c.vhd
rtl/vhdl/t400_alu.vhd
rtl/vhdl/t400_alu-c.vhd
rtl/vhdl/t400_stack.vhd
rtl/vhdl/t400_stack-c.vhd
rtl/vhdl/t400_io_pack-p.vhd
rtl/vhdl/t400_io_l.vhd
rtl/vhdl/t400_io_l-c.vhd
rtl/vhdl/t400_io_d.vhd
rtl/vhdl/t400_io_d-c.vhd
rtl/vhdl/t400_io_g.vhd
rtl/vhdl/t400_io_g-c.vhd
rtl/vhdl/t400_io_in.vhd
rtl/vhdl/t400_io_in-c.vhd
rtl/vhdl/t400_sio.vhd
rtl/vhdl/t400_sio-c.vhd
rtl/vhdl/t400_timer.vhd
rtl/vhdl/t400_timer-c.vhd
rtl/vhdl/t400_core.vhd
rtl/vhdl/t400_core-c.vhd
rtl/tech/generic/generic_ram_ena.vhd
rtl/tech/generic/generic_ram_ena-c.vhd
bench/vhdl/lpm_rom.vhd
rtl/vhdl/system/t410_rom-e.vhd
bench/vhdl/t410_rom-lpm-a.vhd
bench/vhdl/t410_rom-lpm-c.vhd
rtl/tech/cyclone/t400_por.vhd
rtl/tech/cyclone/t400_por-c.vhd
rtl/vhdl/t400_core_comp_pack-p.vhd
rtl/tech/t400_tech_comp_pack-p.vhd
rtl/vhdl/system/t410_notri.vhd
rtl/vhdl/system/t410_notri-c.vhd
rtl/vhdl/system/t400_system_comp_pack-p.vhd
rtl/vhdl/system/t410.vhd
rtl/vhdl/system/t410-c.vhd
bench/vhdl/tb_elems.vhd
bench/vhdl/tb_elems-c.vhd
bench/vhdl/tb_t410.vhd
bench/vhdl/tb_t410-c.vhd
Elaborate toplevel tb_t410_behav_c0.
 
rtl/vhdl/system/t411.vhd
rtl/vhdl/system/t411-c.vhd
bench/vhdl/tb_t411.vhd
bench/vhdl/tb_t411-c.vhd
Elaborate toplevel tb_t411_behav_c0.
 
rtl/vhdl/system/t420_rom-e.vhd
bench/vhdl/t420_rom-lpm-a.vhd
bench/vhdl/t420_rom-lpm-c.vhd
rtl/vhdl/system/t420_notri.vhd
rtl/vhdl/system/t420_notri-c.vhd
rtl/vhdl/system/t420.vhd
rtl/vhdl/system/t420-c.vhd
bench/vhdl/tb_t420.vhd
bench/vhdl/tb_t420-c.vhd
Elaborate toplevel tb_t420_behav_c0.
 
rtl/vhdl/system/t421.vhd
rtl/vhdl/system/t421-c.vhd
bench/vhdl/tb_t421.vhd
bench/vhdl/tb_t421-c.vhd
Elaborate toplevel tb_t421_behav_c0.
 
bench/vhdl/tb_int.vhd
bench/vhdl/tb_int-c.vhd
Elaborate toplevel tb_int_behav_c0.
 
bench/vhdl/tb_microbus.vhd
bench/vhdl/tb_microbus-c.vhd
Elaborate toplevel tb_microbus_behav_c0.
 
bench/vhdl/tb_prod.vhd
bench/vhdl/tb_prod-c.vhd
Elaborate toplevel tb_prod_behav_c0.
/tags/rel_1_1/sim/rtl_sim/Makefile
0,0 → 1,461
##############################################################################
#
# Makefile for the T400 Core project.
#
# $Id: Makefile,v 1.13 2008-05-01 19:50:34 arniml Exp $
#
# The dependencies for all VHDL source files are stored here.
#
# Copyright (c) 2006, Arnim Laeuger (arnim.laeuger@gmx.net)
#
# All rights reserved
#
##############################################################################
 
 
PROJECT_DIR = ../..
RTL_DIR = $(PROJECT_DIR)/rtl/vhdl
TECH_DIR = $(PROJECT_DIR)/rtl/tech/cyclone
GTECH_DIR = $(PROJECT_DIR)/rtl/tech/generic
SYSTEM_DIR = $(RTL_DIR)/system
BENCH_DIR = $(PROJECT_DIR)/bench/vhdl
 
ANALYZE=ghdl -a --std=87 --workdir=work
ELABORATE=ghdl -e -Wl,-s --std=87 --workdir=work
 
.PHONY: all
all: work elaborate
 
work:
mkdir work
 
 
##############################################################################
# Technology dependent parts
#
work/t400_tech_comp_pack-p.o: $(PROJECT_DIR)/rtl/tech/t400_tech_comp_pack-p.vhd
$(ANALYZE) $<
 
work/t400_por.o: $(TECH_DIR)/t400_por.vhd
$(ANALYZE) $<
work/t400_por-c.o: $(TECH_DIR)/t400_por-c.vhd \
work/t400_por.o
$(ANALYZE) $<
 
work/generic_ram.o: $(GTECH_DIR)/generic_ram.vhd
$(ANALYZE) $<
work/generic_ram-c.o: $(GTECH_DIR)/generic_ram-c.vhd \
work/generic_ram.o
$(ANALYZE) $<
 
work/generic_ram_ena.o: $(GTECH_DIR)/generic_ram_ena.vhd
$(ANALYZE) $<
work/generic_ram_ena-c.o: $(GTECH_DIR)/generic_ram_ena-c.vhd \
work/generic_ram_ena.o
$(ANALYZE) $<
#
##############################################################################
 
 
##############################################################################
# T400 Core
#
work/t400_opt_pack-p.o: $(RTL_DIR)/t400_opt_pack-p.vhd
$(ANALYZE) $<
 
work/t400_pack-p.o: $(RTL_DIR)/t400_pack-p.vhd
$(ANALYZE) $<
 
work/t400_comp_pack-p.o: $(RTL_DIR)/t400_comp_pack-p.vhd \
work/t400_opt_pack-p.o \
work/t400_pack-p.o
$(ANALYZE) $<
 
work/t400_io_pack-p.o: $(RTL_DIR)/t400_io_pack-p.vhd \
work/t400_opt_pack-p.o
$(ANALYZE) $<
 
work/t400_clkgen.o: $(RTL_DIR)/t400_clkgen.vhd \
work/t400_opt_pack-p.o
$(ANALYZE) $<
work/t400_clkgen-c.o: $(RTL_DIR)/t400_clkgen-c.vhd \
work/t400_clkgen.o
$(ANALYZE) $<
 
work/t400_reset.o: $(RTL_DIR)/t400_reset.vhd \
work/t400_opt_pack-p.o
$(ANALYZE) $<
work/t400_reset-c.o: $(RTL_DIR)/t400_reset-c.vhd \
work/t400_reset.o
$(ANALYZE) $<
 
work/t400_stack.o: $(RTL_DIR)/t400_stack.vhd \
work/t400_opt_pack-p.o \
work/t400_pack-p.o \
work/tb_pack-p.o
$(ANALYZE) $<
work/t400_stack-c.o: $(RTL_DIR)/t400_stack-c.vhd \
work/t400_stack.o
$(ANALYZE) $<
 
work/t400_pmem_ctrl.o: $(RTL_DIR)/t400_pmem_ctrl.vhd \
work/t400_opt_pack-p.o \
work/t400_pack-p.o \
work/tb_pack-p.o
$(ANALYZE) $<
work/t400_pmem_ctrl-c.o: $(RTL_DIR)/t400_pmem_ctrl-c.vhd \
work/t400_pmem_ctrl.o
$(ANALYZE) $<
 
work/t400_alu.o: $(RTL_DIR)/t400_alu.vhd \
work/t400_pack-p.o \
work/t400_opt_pack-p.o
$(ANALYZE) $<
work/t400_alu-c.o: $(RTL_DIR)/t400_alu-c.vhd \
work/t400_alu.o
$(ANALYZE) $<
 
work/t400_dmem_ctrl.o: $(RTL_DIR)/t400_dmem_ctrl.vhd \
work/t400_opt_pack-p.o \
work/t400_pack-p.o
$(ANALYZE) $<
work/t400_dmem_ctrl-c.o: $(RTL_DIR)/t400_dmem_ctrl-c.vhd \
work/t400_dmem_ctrl.o
$(ANALYZE) $<
 
work/t400_skip.o: $(RTL_DIR)/t400_skip.vhd \
work/t400_pack-p.o
$(ANALYZE) $<
work/t400_skip-c.o: $(RTL_DIR)/t400_skip-c.vhd \
work/t400_skip.o
$(ANALYZE) $<
 
work/t400_mnemonic_pack-p.o: $(RTL_DIR)/t400_mnemonic_pack-p.vhd \
work/t400_pack-p.o \
work/t400_opt_pack-p.o
$(ANALYZE) $<
 
work/t400_decoder.o: $(RTL_DIR)/t400_decoder.vhd \
work/t400_opt_pack-p.o \
work/t400_pack-p.o \
work/t400_mnemonic_pack-p.o
$(ANALYZE) $<
work/t400_decoder-c.o: $(RTL_DIR)/t400_decoder-c.vhd \
work/t400_decoder.o
$(ANALYZE) $<
 
work/t400_io_l.o: $(RTL_DIR)/t400_io_l.vhd \
work/t400_opt_pack-p.o \
work/t400_pack-p.o \
work/t400_io_pack-p.o
$(ANALYZE) $<
work/t400_io_l-c.o: $(RTL_DIR)/t400_io_l-c.vhd \
work/t400_io_l.o
$(ANALYZE) $<
 
work/t400_io_d.o: $(RTL_DIR)/t400_io_d.vhd \
work/t400_opt_pack-p.o \
work/t400_pack-p.o \
work/t400_io_pack-p.o
$(ANALYZE) $<
work/t400_io_d-c.o: $(RTL_DIR)/t400_io_d-c.vhd \
work/t400_io_d.o
$(ANALYZE) $<
 
work/t400_io_g.o: $(RTL_DIR)/t400_io_g.vhd \
work/t400_opt_pack-p.o \
work/t400_pack-p.o \
work/t400_io_pack-p.o
$(ANALYZE) $<
work/t400_io_g-c.o: $(RTL_DIR)/t400_io_g-c.vhd \
work/t400_io_g.o
$(ANALYZE) $<
 
work/t400_io_in.o: $(RTL_DIR)/t400_io_in.vhd \
work/t400_pack-p.o
$(ANALYZE) $<
work/t400_io_in-c.o: $(RTL_DIR)/t400_io_in-c.vhd \
work/t400_io_in.o
$(ANALYZE) $<
 
work/t400_sio.o: $(RTL_DIR)/t400_sio.vhd \
work/t400_pack-p.o \
work/t400_opt_pack-p.o
$(ANALYZE) $<
work/t400_sio-c.o: $(RTL_DIR)/t400_sio-c.vhd \
work/t400_sio.o
$(ANALYZE) $<
 
work/t400_timer.o: $(RTL_DIR)/t400_timer.vhd \
work/t400_pack-p.o
$(ANALYZE) $<
work/t400_timer-c.o: $(RTL_DIR)/t400_timer-c.vhd \
work/t400_timer.o
$(ANALYZE) $<
 
work/t400_core.o: $(RTL_DIR)/t400_core.vhd \
work/t400_opt_pack-p.o \
work/t400_pack-p.o \
work/t400_comp_pack-p.o
$(ANALYZE) $<
work/t400_core-c.o: $(RTL_DIR)/t400_core-c.vhd \
work/t400_clkgen-c.o \
work/t400_reset-c.o \
work/t400_pmem_ctrl-c.o \
work/t400_dmem_ctrl-c.o \
work/t400_decoder-c.o \
work/t400_skip-c.o \
work/t400_alu-c.o \
work/t400_stack-c.o \
work/t400_io_l-c.o \
work/t400_io_d-c.o \
work/t400_io_g-c.o \
work/t400_io_in-c.o \
work/t400_sio-c.o \
work/t400_timer-c.o \
work/t400_core.o
$(ANALYZE) $<
 
work/t400_core_comp_pack-p.o: $(RTL_DIR)/t400_core_comp_pack-p.vhd \
work/t400_opt_pack-p.o
$(ANALYZE) $<
#
##############################################################################
 
 
##############################################################################
# T400 Systems
#
work/t410_rom-e.o: $(SYSTEM_DIR)/t410_rom-e.vhd
$(ANALYZE) $<
work/t420_rom-e.o: $(SYSTEM_DIR)/t420_rom-e.vhd
$(ANALYZE) $<
 
work/t410_notri.o: $(SYSTEM_DIR)/t410_notri.vhd \
work/t400_opt_pack-p.o \
work/t400_core_comp_pack-p.o \
work/t400_tech_comp_pack-p.o
$(ANALYZE) $<
work/t410_notri-c.o: $(SYSTEM_DIR)/t410_notri-c.vhd \
work/t400_core-c.o \
work/generic_ram_ena-c.o \
work/t410_rom-lpm-c.o \
work/t400_por-c.o \
work/t410_notri.o
$(ANALYZE) $<
 
work/t420_notri.o: $(SYSTEM_DIR)/t420_notri.vhd \
work/t400_opt_pack-p.o \
work/t400_core_comp_pack-p.o \
work/t400_tech_comp_pack-p.o
$(ANALYZE) $<
work/t420_notri-c.o: $(SYSTEM_DIR)/t420_notri-c.vhd \
work/t400_core-c.o \
work/generic_ram_ena-c.o \
work/t420_rom-lpm-c.o \
work/t400_por-c.o \
work/t420_notri.o
$(ANALYZE) $<
 
work/t400_system_comp_pack-p.o: $(SYSTEM_DIR)/t400_system_comp_pack-p.vhd
$(ANALYZE) $<
 
work/t410.o: $(SYSTEM_DIR)/t410.vhd \
work/t400_opt_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/t410-c.o: $(SYSTEM_DIR)/t410-c.vhd \
work/t410_notri-c.o \
work/t410.o
$(ANALYZE) $<
 
work/t411.o: $(SYSTEM_DIR)/t411.vhd \
work/t400_opt_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/t411-c.o: $(SYSTEM_DIR)/t411-c.vhd \
work/t410_notri-c.o \
work/t411.o
$(ANALYZE) $<
 
work/t420.o: $(SYSTEM_DIR)/t420.vhd \
work/t400_opt_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/t420-c.o: $(SYSTEM_DIR)/t420-c.vhd \
work/t420_notri-c.o \
work/t420.o
$(ANALYZE) $<
 
work/t421.o: $(SYSTEM_DIR)/t421.vhd \
work/t400_opt_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/t421-c.o: $(SYSTEM_DIR)/t421-c.vhd \
work/t420_notri-c.o \
work/t421.o
$(ANALYZE) $<
#
##############################################################################
 
 
##############################################################################
# Testbenches
#
work/tb_pack-p.o: $(BENCH_DIR)/tb_pack-p.vhd \
work/t400_pack-p.o
$(ANALYZE) $<
 
work/lpm_rom.o: $(BENCH_DIR)/lpm_rom.vhd
$(ANALYZE) $<
 
work/lpm_ram_dq.o: $(BENCH_DIR)/lpm_ram_dq.vhd
$(ANALYZE) $<
 
work/t410_rom-lpm-a.o: $(BENCH_DIR)/t410_rom-lpm-a.vhd \
work/t410_rom-e.o
$(ANALYZE) $<
work/t410_rom-lpm-c.o: $(BENCH_DIR)/t410_rom-lpm-c.vhd \
work/lpm_rom.o \
work/t410_rom-lpm-a.o
$(ANALYZE) $<
 
work/t420_rom-lpm-a.o: $(BENCH_DIR)/t420_rom-lpm-a.vhd \
work/t420_rom-e.o
$(ANALYZE) $<
work/t420_rom-lpm-c.o: $(BENCH_DIR)/t420_rom-lpm-c.vhd \
work/lpm_rom.o \
work/t420_rom-lpm-a.o
$(ANALYZE) $<
 
work/tb_elems.o: $(BENCH_DIR)/tb_elems.vhd
$(ANALYZE) $<
work/tb_elems-c.o: $(BENCH_DIR)/tb_elems-c.vhd \
work/tb_elems.o
$(ANALYZE) $<
 
work/tb_t410.o: $(BENCH_DIR)/tb_t410.vhd \
work/t400_opt_pack-p.o \
work/tb_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/tb_t410-c.o: $(BENCH_DIR)/tb_t410-c.vhd \
work/t410-c.o \
work/tb_elems-c.o \
work/tb_t410.o
$(ANALYZE) $<
 
work/tb_t411.o: $(BENCH_DIR)/tb_t411.vhd \
work/t400_opt_pack-p.o \
work/tb_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/tb_t411-c.o: $(BENCH_DIR)/tb_t411-c.vhd \
work/t411-c.o \
work/tb_elems-c.o \
work/tb_t411.o
$(ANALYZE) $<
 
work/tb_t420.o: $(BENCH_DIR)/tb_t420.vhd \
work/t400_opt_pack-p.o \
work/tb_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/tb_t420-c.o: $(BENCH_DIR)/tb_t420-c.vhd \
work/t420-c.o \
work/tb_elems-c.o \
work/tb_t420.o
$(ANALYZE) $<
 
work/tb_t421.o: $(BENCH_DIR)/tb_t421.vhd \
work/t400_opt_pack-p.o \
work/tb_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/tb_t421-c.o: $(BENCH_DIR)/tb_t421-c.vhd \
work/t421-c.o \
work/tb_elems-c.o \
work/tb_t421.o
$(ANALYZE) $<
 
work/tb_int.o: $(BENCH_DIR)/tb_int.vhd \
work/t400_opt_pack-p.o \
work/tb_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/tb_int-c.o: $(BENCH_DIR)/tb_int-c.vhd \
work/t420-c.o \
work/tb_elems-c.o \
work/tb_int.o
$(ANALYZE) $<
 
work/tb_microbus.o: $(BENCH_DIR)/tb_microbus.vhd \
work/t400_opt_pack-p.o \
work/tb_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/tb_microbus-c.o: $(BENCH_DIR)/tb_microbus-c.vhd \
work/t420-c.o \
work/tb_elems-c.o \
work/tb_microbus.o
$(ANALYZE) $<
 
work/tb_prod.o: $(BENCH_DIR)/tb_prod.vhd \
work/t400_opt_pack-p.o \
work/tb_pack-p.o \
work/t400_system_comp_pack-p.o
$(ANALYZE) $<
work/tb_prod-c.o: $(BENCH_DIR)/tb_prod-c.vhd \
work/t420-c.o \
work/tb_elems-c.o \
work/tb_prod.o
$(ANALYZE) $<
#
##############################################################################
 
 
.PHONY: elaborate
elaborate: tb_t410_behav_c0 tb_t411_behav_c0 \
tb_t420_behav_c0 tb_t421_behav_c0 \
tb_int_behav_c0 tb_microbus_behav_c0 tb_prod_behav_c0
 
tb_t410_behav_c0: work/tb_t410-c.o
$(ELABORATE) $@
 
tb_t411_behav_c0: work/tb_t411-c.o
$(ELABORATE) $@
 
tb_t420_behav_c0: work/tb_t420-c.o
$(ELABORATE) $@
 
tb_t421_behav_c0: work/tb_t421-c.o
$(ELABORATE) $@
 
tb_int_behav_c0: work/tb_int-c.o
$(ELABORATE) $@
 
tb_microbus_behav_c0: work/tb_microbus-c.o
$(ELABORATE) $@
 
tb_prod_behav_c0: work/tb_prod-c.o
$(ELABORATE) $@
 
 
.PHONY: analyze
analyze: work \
work/tb_t410-c.o work/tb_t411-c.o \
work/tb_t420-c.o work/tb_t421-c.o \
work/tb_int-c.o work/tb_microbus-c.o work/tb_prod-c.o
 
 
.PHONY: clean
clean:
rm -rf *~ UNUSED *hex \
tb_t410_behav_c0 \
tb_t411_behav_c0 \
tb_t420_behav_c0 \
tb_t421_behav_c0 \
tb_int_behav_c0 \
tb_microbus_behav_c0 \
tb_prod_behav_c0 \
work
/tags/rel_1_1/README
0,0 → 1,337
 
README for the T400 uController project
=======================================
Version: $Date: 2008-04-27 22:28:06 $
 
 
Introduction
------------
 
 
microcontroller family architecture. It is intended to be used as a
replacement for the original chip in SOCs recreating legacy systems.
Its final target is to provide design variants that are compatible with the
COP420/421 and COP410L/411L family members. All of them derived from the
common t400_core design.
 
 
Download
--------
 
Download the latest stable release from the project homepage at OpenCores.org:
 
http://www.opencores.org/projects.cgi/web/t400/overview/
 
You can get the latest version of the design files from CVS:
 
http://www.opencores.org/pdownloads.cgi/list/t400
 
Please keep in mind that this is work in progress and might contain smaller or
bigger problems.
You should also check the Tracker for known bugs and see if they affect your
work.
 
 
Installation
------------
 
Once the directory structure is generated either by check-out from CVS or by
unpacking the tar-archive, the central project initialization file should be
set up. A template called init_project.template.sh is located in the sw
directory where a copy can be edited. Normally, only the definition for the
variable PROJECT_DIR has to be adjusted to the path where the directory
structure is located.
The commands for setting the necessary variables assume a bash/sh-like
shell. In case you run a different shell like csh or ksh, you should adjust
these commands as well.
 
The meaning of the variables is as follows:
 
* PROJECT_DIR
Points to the root of the project installation. All further references are
derived from its setting.
 
* MAKEFILES
Identifies the global Makefile for compilation of tests.
 
These variables must be properly set whenever scripts or makefiles of the T400
project are executed that are related to verification tasks. Otherwise, you
will most likely encounter error messages.
 
NOTE: The concepts of the mentioned shells require that the init_project.sh is
run in the context of the shell. I.e. you should 'source' the script
instead of executing it like a command. This will make sure that the
variable settings are really effective in the calling shell instance.
 
 
Directory Structure
-------------------
 
The project's directory structure follows the proposal of OpenCores.org.
 
t400
|
\--+-- rtl
| |
| +-- vhdl : VHDL code containing the RTL description
| | | of the core.
| | \-- system : RTL VHDL code of sample systems.
| |
| \-- tech : Technology specific files.
| |
| +-- cyclone : Cyclone technology flavor.
| |
| +-- spartan : Spartan technology flavor.
| |
| \-- generic : Generic RTL designs.
|
+-- bench
| |
| \-- vhdl : VHDL testbench code.
|
+-- sim
| |
| \-- rtl_sim : Directory for running simulations.
|
+-- syn
| |
| \-- t421 : T421 toplevel example synthesis.
| |
| +-- ep1c12 : for Altera Cyclone.
| |
| \-- xc3s1000 : for Xilinx Spartan3.
|
\-- sw : General purpose scripts and files.
|
\-- verif : The verification suite.
|
+-- include : Global includes and makefiles.
|
+-- black_box : Black-box verification tests.
|
+-- int : Interrupt verification tests.
|
\-- system : General system level tests.
 
 
Compiling the VHDL Code
-----------------------
 
VHDL compilation and simulation tasks take place inside in sim/rtl_sim
directory. The project setup supports only the batch mode of certain
simulators. However, there should be no problems to integrate the testbench
and RTL code into arbitrary simulation environments.
 
The main file for compilation is Makefile which contains all information
regarding the dependencies of the source files and their compilation
order.
 
Compilation is based on the make-utility, thus invocation looks like this:
 
$ make
 
This will call ghdl to analzye and elaborate the complete design hierarchy.
 
Tristan Gingold's GHDL simulator/compiler, a VHDL front-end for gcc.
http://ghdl.free.fr/
 
Make will analyze all VHDL files (RTL and testbench code) and elaborate all
testbench top-levels:
 
* tb_t410_behav_c0
Testbench for the T410 derivative.
It instantiates the T410 system toplevel and is intended to exectue all
verifcation tests tagged with 't41x'.
 
* tb_t411_behav_c0
Testbench for the T411 derivative.
It instantiates the T411 system toplevel and is intended to exectue all
verifcation tests tagged with 't41x'.
 
* tb_t420_behav_c0
The testbench for the T420 derivative.
It instantiates the T420 system toplevel and is intended to execute all
verification tests tagged with 't42x' and 't420'.
 
* tb_t421_behav_c0
The testbench for the T421 derivative.
It instantiates the T421 system toplevel and is intended to execute all
verification tests tagged with 't42x'.
 
* tb_int_behav_c0
The testbench for the interrupt verification suite.
It instantiates the T420 system topevel and is intended to execute all
verification tests tagged with 'int'.
 
* tb_microbus_behav_c0
The testbench for the microbus verification.
It instantiates the T420 system toplevel in microbus configuration and is
intended to execute all verifications tests tagged with 'mb'.
 
* tb_prod_behav_c0
The testbench for the production test.
It instantiates the T420 system toplevel an checks D and P output ports
for the patterns generated by the software as proposed in
"Testing of COP400 Familiy Devices"
National Semiconductor
COP Note 7
April 1991
 
The Makefile has a 'clean' target to delete all intermediate data:
 
$ make clean
 
The basic simple sequence list can be found in COMPILE_LIST. This can be
useful to quickly set up the analyze stage of any compiler or
synthesizer. Especially when synthesizing the code, you want to skip the VHDL
configurations in *-c.vhd and everything below the bench/ directory.
 
 
Preparation of the ROM Files
----------------------------
 
All testbenches listed above load the internal ROM of the controller from a
file in hex-format. Its existance is mandatory since it is referenced in the
VHDL code of the ROM model lpm_rom.vhd. In case it is missing, the
simulation will stop immediately after elaborating the design.
 
These files are:
 
* rom_41x.hex
Program ROM compiled for the T41x derivatives. Maximum size 512 bytes.
Referenced by the t410_notri system.
Enabled by the 't41x' tag.
 
* rom_42x.hex
Program ROM compiled for the T42x derivatives. Maximum size 1024 bytes.
Referenced by the t420_notri system.
Enabled by the 't42x', 't420', 'int', 'mb' and 'prod' tag.
 
The verification flow for the T400 project generates these two files
automatically from the assembler source files. Whenever the make process
locates one or more of the above tags, it assembles and links the source code
for the repsective derivative.
 
All regression tests and the general purpose software is organized in a cell
structure. Currently, this means that the software for a cell is contained in
a dedicated directory where the assembler run takes place. In the future,
there will be more aspects to a cell.
 
Assembling, linking and putting the hex-files in place is under the control of
the make-mechanism. E.g. to assemble the source code of a cell, issue the
following command:
 
$ make
 
The above mention environment variable MAKEFILES enables execution of the make
process from within any subdirectory in the verification tree. This generates
the linker file (test_41x.p and test_42x.p) and derives hex-files which are
placed into the simulation directory. So most likely, for running a test case
or any other software, you will want to issue:
 
The only supported assembler is Alfred Arnold's macroassembler AS. See
 
http://john.ccac.rwth-aachen.de:8000/as/
 
 
Verification Environment
------------------------
 
The verification environment consists of a number of test programs. They are
all self-checking. I.e. after testing the targeted functionality, they emit a
pass/fail information. This information is detected by the testbench which
stops the simulation and prints out the simulation result. This is the default
mechanism for stopping the VHDL simulation.
 
Pass/fail is signalled by a certain sequence of the L port contents:
(R denotes an optional value stored in A when calling the pass or fail
routines)
 
1) L outputs 0x0R
2) L outputs 0xaR
3) L outputs 0x5R
4) L outputs 0x0R -> Pass
L outputs 0xfR -> Fail
 
The detection is modelled like a state machine and in case the sequence is of
bytes inside the accumulator does not match, the detection process restarts
from the beginning. This mechanism is part of all verification tests except
for the interrupt testbench.
 
The complete regression suite can be executed with the run_regression.pl
script. For each test cell, it steps through the sequence
 
1) Assemble the source code
2) Run the compiled VHDL design (currently only GHDL)
 
It is highly recommended to redirect the output of run_regression.pl into a
file. Otherwise, analyzing the messages related to each test cell is almost
impossible.
 
 
Clocking System
---------------
 
The main clock is supplied at input ck_i. To ease system integration, ck_i can
accept integer multiples of the target clock frequency. Input ck_en_i is used
to qualify rising edges on ck_i as active clock edges. When ck_i is supplied
with the target frequency, ck_en_i can be kept high constantly.
 
 
Generic Parameters
------------------
 
Most generic parameters are provided to set the numerous I/O options. Thus
such options are exhibited on the toplevel designs.
All generics are implemented with integer types to enable analysis of the RTL
code without tool restrictions. The related constants are defined in
t400_opt_pack-p.vhd.
 
opt_type_g : Derivative type - T420, T421, T410, T411
opt_ck_div_g : Internal divider on CK
opt_cko_g : Enable CKO as general purpose input
opt_l_out_type_7_g : Output driver type L[7]
opt_l_out_type_6_g : Output driver type L[6]
opt_l_out_type_5_g : Output driver type L[5]
opt_l_out_type_4_g : Output driver type L[4]
opt_l_out_type_3_g : Output driver type L[3]
opt_l_out_type_2_g : Output driver type L[2]
opt_l_out_type_1_g : Output driver type L[1]
opt_l_out_type_0_g : Output driver type L[0]
opt_microbus_g : Enable MICROBUS interface
opt_d_out_type_3_g : Output driver type D[3]
opt_d_out_type_2_g : Output driver type D[2]
opt_d_out_type_1_g : Output driver type D[1]
opt_d_out_type_0_g : Output driver type D[0]
opt_g_out_type_3_g : Output driver type G[3]
opt_g_out_type_2_g : Output driver type G[2]
opt_g_out_type_1_g : Output driver type G[1]
opt_g_out_type_0_g : Output driver type G[0]
opt_so_output_type_g : Output driver type SO
opt_sk_output_type_g : Output driver type SK
 
 
FPGA Implementation
-------------------
 
All of the design files contain pure RTL code. This is true even for the
technology specific power-on reset module. Two flavors exist, each of them
implementing the desired behavior in a way that is understood by the design
tools. The RAM for the data memory is described by generic RTL code as
well. It should be translated automatically by the tool chain to a technology
specific RAM macro.
 
There is a generic method for the program memory ROM as well, although this
project uses a flow where hex-files are loaded by lpm_rom.vhd as the default
method. Convert the ROM image to an RTL VHDL file with one of the two
following commands (either from hex or bin format):
 
$ hex2rom -b [rom image file] rom_t41x 9l8s > rom_t41x.vhd
$ hex2rom -b [rom image file] rom_t42x 10l8s > rom_t42x.vhd
 
The option -b specifies that <rom image file> contains binary data. Skip this
option to process a file in hex format.
 
These resulting RTL representations are instantiated by t410_rom-struct-a.vhd
and t420_rom-struct-a.vhd. Altera and Xilinx design tools will detect and
extract the ROM and turn it into a memory macro.
/tags/rel_1_1/sw/hex2rom/hex2rom.cpp
0,0 → 1,960
//
// Binary and intel/motorola hex to VHDL ROM converter
//
// Version : 0244
//
// Copyright (c) 2001-2002 Daniel Wallner (jesus@opencores.org)
//
// All rights reserved
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
//
// Neither the name of the author nor the names of other contributors may
// be used to endorse or promote products derived from this software without
// specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Please report bugs to the author, but before you do so, please
// make sure that this is not a derivative work and that
// you have the latest version of this file.
//
// The latest version of this file can be found at:
// http://www.opencores.org/cvsweb.shtml/t51/
//
// Limitations :
// No support for wrapped intel segments
// Requires stl to compile
//
// File history :
//
// 0146 : Initial release
//
// 0150 : Added binary read
//
// 0208 : Changed some errors to warnings
//
// 0215 : Added support for synchronous ROM
//
// 0220 : Changed array ROM format, added support for Xilinx .UCF generation
//
// 0221 : Fixed small .UCF generation for small ROMs
//
// 0244 : Added Leonardo .UCF option
//
// 28-Apr-2008 : Generate D for synchronous ROM in clocked process.
//
 
#include <stdio.h>
#include <string>
#include <vector>
#include <iostream>
 
using namespace std;
 
#if !(defined(max)) && _MSC_VER
// VC fix
#define max __max
#endif
 
class MemBlock
{
public:
unsigned long m_startAddress;
vector<unsigned char> m_bytes;
};
 
class File
{
public:
explicit File(const char *fileName, const char *mode)
{
m_file = fopen(fileName, mode);
if (m_file != NULL)
{
return;
}
string errorStr = "Error opening ";
errorStr += fileName;
errorStr += "\n";
throw errorStr;
}
 
~File()
{
fclose(m_file);
}
 
// Read binary file
void ReadBin(unsigned long limit)
{
m_top = 0;
 
m_chunks.push_back(MemBlock());
m_chunks.back().m_startAddress = 0;
 
cerr << "Reading binary file\n";
 
int tmp = fgetc(m_file);
 
while (!feof(m_file))
{
m_chunks.back().m_bytes.push_back(tmp);
 
if (m_chunks.back().m_bytes.size() > limit + 1)
{
m_chunks.back().m_bytes.pop_back();
m_top = m_chunks.back().m_bytes.size() - 1;
cerr << "Ignoring data above address space!\n";
cerr << " Limit: " << limit << "\n";
return;
}
 
tmp = fgetc(m_file);
}
 
m_top = m_chunks.back().m_bytes.size() - 1;
 
if (!m_chunks.back().m_bytes.size())
{
cerr << "No data!\n";
 
m_chunks.pop_back();
}
}
 
// Read hex file
void ReadHex(unsigned long limit)
{
char szLine[1024];
bool formatDetected = false;
bool intel;
bool endSeen = false;
bool linear = true; // Only used for intel hex
unsigned long addressBase = 0; // Only used for intel hex
unsigned long dataRecords = 0; // Only used for s-record
while (!feof(m_file))
{
if (fgets(szLine, 1024, m_file) == 0)
{
if (ferror(m_file))
{
throw "Error reading input!\n";
}
continue;
}
 
if (szLine[strlen(szLine) - 1] == 0xA || szLine[strlen(szLine) - 1] == 0xD)
{
szLine[strlen(szLine) - 1] = 0;
}
 
if (szLine[strlen(szLine) - 1] == 0xA || szLine[strlen(szLine) - 1] == 0xD)
{
szLine[strlen(szLine) - 1] = 0;
}
 
if (strlen(szLine) == 1023)
{
throw "Hex file lines to long!\n";
}
// Ignore blank lines
if (szLine[0] == '\n')
{
continue;
}
// Detect format and warn if garbage lines are found
if (!formatDetected)
{
if (szLine[0] != ':' && szLine[0] != 'S')
{
cerr << "Ignoring garbage line!\n";
continue;
}
if (szLine[0] == 'S')
{
intel = false;
cerr << "Detected S-Record\n";
}
else
{
intel = true;
cerr << "Detected intel hex file\n";
}
formatDetected = true;
}
else if ((intel && szLine[0] != ':') ||
(!intel && szLine[0] != 'S'))
{
cerr << "Ignoring garbage line!\n";
continue;
}
 
if (endSeen)
{
throw "Hex line after end of file record!\n";
}
 
if (intel)
{
unsigned long dataBytes;
unsigned long startAddress;
unsigned long type;
if (sscanf(&szLine[1], "%2lx%4lx%2lx", &dataBytes, &startAddress, &type) != 3)
{
throw "Hex line beginning corrupt!\n";
}
// Check line length
if (szLine[11 + dataBytes * 2] != '\n' && szLine[11 + dataBytes * 2] != 0)
{
throw "Hex line length incorrect!\n";
}
// Check line checksum
unsigned char checkSum = 0;
unsigned long tmp;
for (unsigned int i = 0; i <= dataBytes + 4; ++i)
{
if (sscanf(&szLine[1 + i * 2], "%2lx", &tmp) != 1)
{
throw "Hex line data corrupt!\n";
}
checkSum += tmp;
}
if (checkSum != 0)
{
throw "Hex line checksum error!\n";
}
 
switch (type)
{
case 0:
// Data record
if (!linear)
{
// Segmented
unsigned long test = startAddress;
test += dataBytes;
if (test > 0xffff)
{
throw "Can't handle wrapped segments!\n";
}
}
if (!m_chunks.size() ||
m_chunks.back().m_startAddress + m_chunks.back().m_bytes.size() !=
addressBase + startAddress)
{
m_chunks.push_back(MemBlock());
m_chunks.back().m_startAddress = addressBase + startAddress;
}
{
unsigned char i = 0;
for (i = 0; i < dataBytes; ++i)
{
sscanf(&szLine[9 + i * 2], "%2lx", &tmp);
if (addressBase + startAddress + i > limit)
{
cerr << "Ignoring data above address space!\n";
cerr << "Data address: " << addressBase + startAddress + i;
cerr << " Limit: " << limit << "\n";
if (!m_chunks.back().m_bytes.size())
{
m_chunks.pop_back();
}
continue;
}
m_chunks.back().m_bytes.push_back(tmp);
}
}
break;
 
case 1:
// End-of-file record
if (dataBytes != 0)
{
cerr << "Warning: End of file record not zero length!\n";
}
if (startAddress != 0)
{
cerr << "Warning: End of file record address not zero!\n";
}
endSeen = true;
break;
 
case 2:
// Extended segment address record
if (dataBytes != 2)
{
throw "Length field must be 2 in extended segment address record!\n";
}
if (startAddress != 0)
{
throw "Address field must be zero in extended segment address record!\n";
}
sscanf(&szLine[9], "%4lx", &startAddress);
addressBase = startAddress << 4;
linear = false;
break;
 
case 3:
// Start segment address record
if (dataBytes != 4)
{
cerr << "Warning: Length field must be 4 in start segment address record!\n";
}
if (startAddress != 0)
{
cerr << "Warning: Address field must be zero in start segment address record!\n";
}
if (dataBytes == 4)
{
unsigned long ssa;
char ssaStr[16];
sscanf(&szLine[9], "%8lx", &ssa);
sprintf(ssaStr, "%08X\n", ssa);
cerr << "Segment start address (CS/IP): ";
cerr << ssaStr;
}
break;
 
case 4:
// Extended linear address record
if (dataBytes != 2)
{
throw "Length field must be 2 in extended linear address record!\n";
}
if (startAddress != 0)
{
throw "Address field must be zero in extended linear address record!\n";
}
sscanf(&szLine[9], "%4lx", &startAddress);
addressBase = ((unsigned long)startAddress) << 16;
linear = true;
break;
 
case 5:
// Start linear address record
if (dataBytes != 4)
{
cerr << "Warning: Length field must be 4 in start linear address record!\n";
}
if (startAddress != 0)
{
cerr << "Warning: Address field must be zero in start linear address record!\n";
}
if (dataBytes == 4)
{
unsigned long lsa;
char lsaStr[16];
sscanf(&szLine[9], "%8lx", &lsa);
sprintf(lsaStr, "%08X\n", lsa);
cerr << "Linear start address: ";
cerr << lsaStr;
}
break;
 
default:
cerr << "Waring: Unknown record found!\n";
}
}
else
{
// S-record
unsigned long count;
char type;
if (sscanf(&szLine[1], "%c%2lx", &type, &count) != 2)
{
throw "Hex line beginning corrupt!\n";
}
// Check line length
if (szLine[4 + count * 2] != '\n' && szLine[4 + count * 2] != 0)
{
throw "Hex line length incorrect!\n";
}
// Check line checksum
unsigned char checkSum = 0;
unsigned long tmp;
for (unsigned int i = 0; i < count + 1; ++i)
{
if (sscanf(&szLine[2 + i * 2], "%2lx", &tmp) != 1)
{
throw "Hex line data corrupt!\n";
}
checkSum += tmp;
}
if (checkSum != 255)
{
throw "Hex line checksum error!\n";
}
 
switch (type)
{
case '0':
// Header record
{
char header[256];
unsigned char i = 0;
for (i = 0; i + 3 < count; ++i)
{
sscanf(&szLine[8 + i * 2], "%2lx", &tmp);
header[i] = tmp;
}
header[i] = 0;
if (i > 0)
{
cerr << "Module name: " << header << "\n";
}
}
break;
 
case '1':
case '2':
case '3':
// Data record
{
dataRecords++;
unsigned long startAddress;
if (type == '1')
{
sscanf(&szLine[4], "%4lx", &startAddress);
}
else if (type == '2')
{
sscanf(&szLine[4], "%6lx", &startAddress);
}
else
{
sscanf(&szLine[4], "%8lx", &startAddress);
}
 
if (!m_chunks.size() ||
m_chunks.back().m_startAddress + m_chunks.back().m_bytes.size() !=
startAddress)
{
m_chunks.push_back(MemBlock());
m_chunks.back().m_startAddress = startAddress;
}
unsigned char i = 0;
for (i = (type - '1'); i + 3 < count; ++i)
{
sscanf(&szLine[8 + i * 2], "%2lx", &tmp);
if (startAddress + i > limit)
{
cerr << "Ignoring data above address space!\n";
cerr << "Data address: " << startAddress + i;
cerr << " Limit: " << limit << "\n";
if (!m_chunks.back().m_bytes.size())
{
m_chunks.pop_back();
}
continue;
}
m_chunks.back().m_bytes.push_back(tmp);
}
}
break;
 
case '5':
// Count record
{
unsigned long address;
sscanf(&szLine[4], "%4lx", &address);
if (address != dataRecords)
{
throw "Wrong number of data records!\n";
}
}
break;
 
case '7':
case '8':
case '9':
// Start address record
cerr << "Ignoring start address record!\n";
break;
 
default:
cerr << "Unknown record found!\n";
}
}
}
if (intel && !endSeen)
{
cerr << "No end of file record!\n";
}
if (!m_chunks.size())
{
throw "No data in file!\n";
}
vector<MemBlock>::iterator vi;
m_top = 0;
for (vi = m_chunks.begin(); vi < m_chunks.end(); vi++)
{
m_top = max(m_top, vi->m_startAddress + vi->m_bytes.size() - 1);
}
}
 
// Rather inefficient this one, fix sometime
bool GetByte(const unsigned long address, unsigned char &chr)
{
vector<MemBlock>::iterator vi;
 
for (vi = m_chunks.begin(); vi < m_chunks.end(); vi++)
{
if (vi->m_startAddress + vi->m_bytes.size() > address && vi->m_startAddress <= address)
{
break;
}
}
if (vi == m_chunks.end())
{
return false;
}
chr = vi->m_bytes[address - vi->m_startAddress];
return true;
}
 
bool BitString(const unsigned long address, const unsigned char bits, const bool lEndian, string &str)
{
bool ok = false;
long i;
unsigned char chr;
unsigned long data = 0;
unsigned long tmp;
 
if (lEndian)
{
for (i = 0; i < (bits + 7) / 8; ++i)
{
ok |= GetByte(address + i, chr);
tmp = chr;
data |= tmp << (8 * i);
}
}
else
{
for (i = 0; i < (bits + 7) / 8; ++i)
{
ok |= GetByte(address + i, chr);
tmp = chr;
data |= tmp << (8 * ((bits + 7) / 8 - i - 1));
}
}
 
if (!ok)
{
return false;
}
 
unsigned long mask = 1;
 
str = "";
for (i = 0; i < bits; i++)
{
if (data & mask)
{
str.insert(0,"1");
}
else
{
str.insert(0,"0");
}
mask <<= 1;
}
return true;
}
 
FILE *Handle() { return m_file; };
vector<MemBlock> m_chunks;
unsigned long m_top;
private:
FILE *m_file;
};
 
 
int main (int argc, char *argv[])
{
cerr << "Hex to VHDL ROM converter by Daniel Wallner. Version 0244\n";
 
try
{
unsigned long aWidth;
unsigned long dWidth;
char endian;
char O = 0;
 
if (!(argc == 4 || argc == 5))
{
cerr << "\nUsage: hex2rom [-b] <input file> <entity name> <format>\n";
cerr << "\nIf the -b option is specified the file is read as a binary file\n";
cerr << "Hex input files must be intel hex or motorola s-record\n";
cerr << "\nThe format string has the format AEDOS where:\n";
cerr << " A = Address bits\n";
cerr << " E = Endianness, l or b\n";
cerr << " D = Data bits\n";
cerr << " O = ROM type: (one optional character)\n";
cerr << " z for tri-state output\n";
cerr << " a for array ROM\n";
cerr << " s for synchronous ROM\n";
cerr << " u for XST ucf\n";
cerr << " l for Leonardo ucf\n";
cerr << " S = SelectRAM usage in 1/16 parts (only used when O = u)\n";
cerr << "\nExample:\n";
cerr << " hex2rom test.hex Test_ROM 18b16z\n\n";
return -1;
}
 
string inFileName;
string outFileName;
 
unsigned long bytes;
unsigned long select = 0;
 
if (argc == 5)
{
if (strcmp(argv[1], "-b"))
{
throw "Error in arguments!\n";
}
}
 
int result;
 
result = sscanf(argv[argc - 1], "%lu%c%lu%c%lu", &aWidth, &endian, &dWidth, &O, &select);
if (result < 3)
{
throw "Error in output format argument!\n";
}
 
if (aWidth > 32 || (endian != 'l' && endian != 'b') || dWidth > 32 || (result > 3 && O != 'z' && O != 'a' && O != 's' && O != 'u' && O != 'l'))
{
throw "Error in output format argument!\n";
}
inFileName = argv[argc - 3];
outFileName = argv[argc - 2];
 
bytes = (dWidth + 7) / 8;
 
File inFile(inFileName.c_str(), "rb");
 
if (argc == 4)
{
inFile.ReadHex((1UL << aWidth) * bytes - 1);
}
else
{
inFile.ReadBin((1UL << aWidth) * bytes - 1);
}
 
string line;
 
unsigned long words = 1;
unsigned long i = inFile.m_top;
i /= bytes;
 
while (i != 0)
{
i >>= 1;
words <<= 1;
}
 
if (O != 'u' && O != 'l')
{
printf("-- This file was generated with hex2rom written by Daniel Wallner\n");
printf("\nlibrary IEEE;");
printf("\nuse IEEE.std_logic_1164.all;");
printf("\nuse IEEE.numeric_std.all;");
printf("\n\nentity %s is", outFileName.c_str());
printf("\n\tport(");
if (O == 'z')
{
printf("\n\t\tCE_n\t: in std_logic;", dWidth - 1);
printf("\n\t\tOE_n\t: in std_logic;", dWidth - 1);
}
if (O == 's')
{
printf("\n\t\tClk\t: in std_logic;", dWidth - 1);
}
printf("\n\t\tA\t: in std_logic_vector(%d downto 0);", aWidth - 1);
printf("\n\t\tD\t: out std_logic_vector(%d downto 0)", dWidth - 1);
printf("\n\t);");
printf("\nend %s;", outFileName.c_str());
printf("\n\narchitecture rtl of %s is", outFileName.c_str());
if (!O)
{
printf("\nbegin");
printf("\n\tprocess (A)");
printf("\n\tbegin");
printf("\n\t\tcase to_integer(unsigned(A)) is");
}
else if (O == 's')
{
printf("\nbegin");
printf("\n\tprocess (Clk)");
printf("\n\tbegin");
printf("\n\t\tif Clk'event and Clk = '1' then");
printf("\n\t\tcase to_integer(unsigned(A)) is");
}
else
{
printf("\n\tsubtype ROM_WORD is std_logic_vector(%d downto 0);", dWidth - 1);
printf("\n\ttype ROM_TABLE is array(0 to %d) of ROM_WORD;", words - 1);
printf("\n\tconstant ROM: ROM_TABLE := ROM_TABLE'(");
}
 
string str;
string strDC;
for (i = 0; i < dWidth; i++)
{
strDC.insert(0, "-");
}
for (i = 0; i < words; i++)
{
if (!inFile.BitString(i * bytes, dWidth, endian == 'l', str))
{
str = strDC;
}
if (!O || O == 's')
{
if (inFile.m_top / bytes >= i)
{
printf("\n\t\twhen %06d => D <= \"%s\";",i, str.c_str());
printf("\t-- 0x%04X", i * bytes);
}
}
else
{
printf("\n\t\t\"%s", str.c_str());
if (i != words - 1)
{
printf("\",");
}
else
{
printf("\");");
}
printf("\t-- 0x%04X", i * bytes);
}
}
 
if (!O || O == 's')
{
printf("\n\t\twhen others => D <= \"%s\";", strDC.c_str());
printf("\n\t\tend case;");
if (O == 's')
printf("\n\tend if;");
printf("\n\tend process;");
}
else
{
printf("\nbegin");
if (O == 'z')
{
printf("\n\tD <= ROM(to_integer(unsigned(A))) when CE_n = '0' and OE_n = '0' else (others => 'Z');");
}
else
{
printf("\n\tD <= ROM(to_integer(unsigned(A)));");
}
}
printf("\nend;\n");
}
else
{
unsigned long selectIter = 0;
unsigned long blockIter = 0;
 
if (!select)
{
blockIter = ((1UL << aWidth) + 511) / 512;
}
else if (select == 16)
{
selectIter = ((1UL << aWidth) + 15) / 16;
}
else
{
blockIter = ((1UL << aWidth) * (16 - select) / 16 + 511) / 512;
selectIter = ((1UL << aWidth) - blockIter * 512 + 15) / 16;
}
 
cerr << "Creating .ucf file with " << selectIter * bytes;
cerr << " LUTs and " << blockIter * bytes << " block RAMs\n";
 
unsigned long blockTotal = ((1UL << aWidth) + 511) / 512;
 
printf("# This file was generated with hex2rom written by Daniel Wallner\n");
 
for (i = 0; i < selectIter; i++)
{
unsigned long base = i * 16 * bytes;
unsigned long j;
unsigned char c;
unsigned long pos;
 
// Check that there is any actual data in segment
bool init = false;
for (pos = 0; pos < bytes * 16; pos++)
{
init = inFile.GetByte(base + pos, c);
if (init)
{
break;
}
}
 
if (init)
{
for (j = 0; j < dWidth; j++)
{
unsigned long bitMask = 1;
unsigned long bits = 0;
 
for (pos = 0; pos < 16; pos++)
{
unsigned long addr;
 
if (endian = 'l')
{
addr = base + bytes * pos + j / 8;
}
else
{
addr = base + bytes * pos + bytes - j / 8 - 1;
}
 
c = 0;
inFile.GetByte(addr, c);
if (c & (1 << (j % 8)))
{
bits |= bitMask;
}
bitMask <<= 1;
}
 
if (O == 'u')
{
if (selectIter == 1)
{
printf("\nINST *s%s%d INIT = %04X;", outFileName.c_str(), j, bits);
}
else
{
printf("\nINST *s%s%d%d INIT = %04X;", outFileName.c_str(), i, j, bits);
}
}
else
{
if (selectIter == 1)
{
printf("\nINST *sG1_%d_S%s INIT = %04X;", j, outFileName.c_str(), bits);
}
else
{
printf("\nINST *sG1_%d_sG2_%d_S%s INIT = %04X;", i, j, outFileName.c_str(), bits);
}
}
}
}
}
 
for (i = blockTotal - blockIter; i < blockTotal; i++)
{
unsigned long j;
for (j = 0; j < bytes; j++)
{
unsigned long k;
for (k = 0; k < 16; k++)
{
unsigned long base = i * 512 * bytes + k * 32 * bytes;
unsigned char c;
unsigned long pos;
 
// Check that there is any actual data in segment
bool init = false;
for (pos = 0; pos < 32; pos++)
{
init = inFile.GetByte(base + bytes * pos + j, c);
if (init)
{
break;
}
}
 
if (init)
{
if (O == 'u')
{
if (blockIter == 1)
{
printf("\nINST *b%s%d INIT_%02X = ", outFileName.c_str(), j, k);
}
else
{
printf("\nINST *b%s%d%d INIT_%02X = ", outFileName.c_str(), i, j, k);
}
}
else
{
if (blockIter == 1)
{
printf("\nINST *bG1_%d_B%s INIT_%02X = ", j, outFileName.c_str(), k);
}
else
{
printf("\nINST *bG1_%d_bG2_%d_B%s INIT_%02X = ", i, j, outFileName.c_str(), k);
}
}
for (pos = 0; pos < 32; pos++)
{
unsigned long addr;
 
if (endian = 'l')
{
addr = base + bytes * (31 - pos) + j;
}
else
{
addr = base + bytes * (31 - pos) + bytes - j - 1;
}
 
c = 0;
inFile.GetByte(addr, c);
printf("%02X", c);
}
printf(";");
}
}
}
}
printf("\n");
}
return 0;
}
catch (string error)
{
cerr << "Fatal: " << error;
}
catch (const char *error)
{
cerr << "Fatal: " << error;
}
return -1;
}
/tags/rel_1_1/sw/verif/include/Makefile.core
0,0 → 1,45
 
SIM_DIR = $(PROJECT_DIR)/sim/rtl_sim
VERIF_DIR = $(PROJECT_DIR)/sw/verif
 
# determine allowed targets
TARGETS = $(wildcard t4* int mb prod)
 
.PHONY: all
all: $(TARGETS)
 
.PHONY: t41x
t41x: $(SIM_DIR)/rom_41x.hex
 
.PHONY: t42x
t42x: $(SIM_DIR)/rom_42x.hex
 
.PHONY: t420
t420: t42x
 
.PHONY: int
int: t42x
 
.PHONY: mb
mb: t42x
 
.PHONY: prod
prod: t42x
 
$(SIM_DIR)/rom_41x.hex: $(MODULE)_41x.p
p2hex $< $@
 
$(SIM_DIR)/rom_42x.hex: $(MODULE)_42x.p
p2hex $< $@
 
$(MODULE)_41x.p: $(MODULE).asm
asl -i $(VERIF_DIR)/include -cpu COP410 -L \
-o $(MODULE)_41x.p -olist $(MODULE)_41x.lst $<
 
$(MODULE)_42x.p: $(MODULE).asm
asl -i $(VERIF_DIR)/include -cpu COP420 -L \
-o $(MODULE)_42x.p -olist $(MODULE)_42x.lst $<
 
.PHONY: clean
clean:
rm -f *.p *~ *.lst
/tags/rel_1_1/sw/verif/include/int_macros.inc
0,0 → 1,110
;; *******************************************************************
;; $Id: int_macros.inc,v 1.4 2006-05-28 15:26:33 arniml Exp $
;;
;; Defines macros for interrupt tests.
;;
 
;; -------------------------------------------------------------------
;; Save current A, M and C to M(3,15), M(3,14) and M(3,13).
;;
save_a_m_c MACRO
xad 3, 15 ; save A to M(3,15)
 
x 0 ; save current M
xad 3, 14 ; to M(3,14)
 
smb 0x0 ; save C
skc ; to M(3,13)
rmb 0x0 ;
x 0 ;
xad 3, 13 ;
ENDM
 
 
;; -------------------------------------------------------------------
;; Check SA against specified address
;;
check_sa MACRO addr
;; request nibble 0 of SA
ogi 0x0
inl
;; check this nibble
x 0
clra
IF addr & 0xf <> 0
aisc addr & 0xf
ENDIF
ske
jmp fail
 
;; request nibble 1 of SA
ogi 0x1
inl
;; check this nibble
x 0
clra
IF addr & 0x0f0 <> 0
aisc (addr >> 4) & 0xf
ENDIF
ske
jmp fail
 
;; request nibble 2 of SA
ogi 0x2
inl
;; check this nibble
x 0
clra
IF addr & 0xf00 <> 0
aisc (addr >> 8) & 0xf
ENDIF
ske
jmp fail
 
ENDM
 
 
;; -------------------------------------------------------------------
;; Restore C, M and A from M(3,13), M(3,14) and M(3,15)
;;
restore_c_m_a MACRO
xad 3, 13 ; restore C
x 0 ; from M(3,13)
rc ;
skmbz 0x0 ;
sc ;
 
xad 3, 14 ; restore current M
x 0 ; from M(3,14)
 
xad 3, 15 ; restore A
ENDM
 
 
;; -------------------------------------------------------------------
;; Flag that interrupt occured in M(3,12).1
;;
int_flag_set MACRO
clra
aisc 0x1
xad 3, 12
ENDM
 
;; -------------------------------------------------------------------
;; Clear 'interrupt occured' flag
;;
int_flag_clear MACRO
clra
xad 3, 12
ENDM
 
;; -------------------------------------------------------------------
;; Check interrupt occurence
;;
int_flag_check MACRO
lbi 3, 12
skmbz 0x0
jp +
jmp fail ; no interrupt!
+ lbi 0, 0
ENDM
/tags/rel_1_1/sw/verif/include/int_pass_fail.asm
0,0 → 1,53
;; *******************************************************************
;; $Id: int_pass_fail.asm,v 1.1 2006-05-27 19:06:37 arniml Exp $
;;
;; Provides pass/fail signalling via port D for interrupt tests.
;;
;; Signalling on D:
;; 0x1
;; 0x2
;; 0x4
;; 0x8
;; 0xf -> pass
;; 0x0 -> fail
;;
 
;; catch spurious code execution
jmp fail
 
PROLOGUE MACRO
;; output 0x1 on D
clra
aisc 0x1
cab
obd
;; output 0x2 on D
aisc 0x1
cab
obd
;; output 0x4 on D
aisc 0x2
cab
obd
;; output 0x8 on D
aisc 0x4
cab
obd
ENDM
 
 
pass:
PROLOGUE
;; output 0xf to D
aisc 0x7
cab
obd
jp .
 
fail:
PROLOGUE
;; output 0x0 to D
clra
cab
obd
jp .
/tags/rel_1_1/sw/verif/include/pass_fail.asm
0,0 → 1,56
;; *******************************************************************
;; $Id: pass_fail.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Provides pass/fail signalling via port L.
;;
;; Result value is expected in accumuator.
;;
;; Signalling on L:
;; 0x0R
;; 0xaR
;; 0x5R
;; 0x0R -> pass
;; 0xfR -> fail
;;
 
;; catch spurious code execution
jmp fail
 
pass:
lei 0x4
;; save result to M
x 0x0
;; output 0x0R to Q
clra
camq
;; output 0xaR to Q
aisc 0xa
camq
;; output 0x5R to Q
clra
aisc 0x5
camq
;; output 0x0R to Q
clra
camq
jp .
 
fail:
lei 0x4
;; save result to M
x 0x0
;; output 0x0R to Q
clra
camq
;; output 0xaR to Q
aisc 0xa
camq
;; output 0x5R to Q
clra
aisc 0x5
camq
;; output 0xfR to Q
clra
aisc 0xf
camq
jp .
/tags/rel_1_1/sw/verif/include/Makefile
0,0 → 1,3
MODULE = test
 
include $(PROJECT_DIR)/sw/verif/include/Makefile.core
/tags/rel_1_1/sw/verif/black_box/inil/t420 --- tags/rel_1_1/sw/verif/black_box/inil/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/black_box/inil/test.asm (revision 172) @@ -0,0 +1,107 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.2 2006-05-24 00:48:04 arniml Exp $ + ;; + ;; Checks the INIL instruction. + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + clra + + ;; check reset level of latches + inil + x 0 + skmbz 3 + jmp fail + skmbz 2 ; CKO + jmp fail + skmbz 0 + jmp fail + + + ;; set IN to 0xf and recheck levels + ogi 0xf + nop + nop + inil + x 0 + skmbz 3 + jmp fail + skmbz 2 ; CKO + jp + + jmp fail ++ skmbz 0 + jmp fail + + + ;; set IN0 to 0 and check that IL0 triggered + ogi 0xe + nop + inil + x 0 + skmbz 3 + jmp fail + skmbz 2 ; CKO + jp + + jmp fail ++ skmbz 0 + jp + + jmp fail ++ + + jmp page_1 + org 0x040 +page_1: + + ;; set IN3 to 0 and check that IL1 triggered + ogi 0x6 + nop + inil + x 0 + skmbz 3 + jp + + jmp fail ++ skmbz 2 ; CKO + jp + + jmp fail ++ skmbz 0 + jmp fail + + + ;; reload IN3 to trigger both IL latches + ogi 0x9 + ogi 0x0 + nop + inil + x 0 + skmbz 3 + jp + + jmp fail ++ skmbz 2 ; CKO + jmp fail + skmbz 0 + jp + + jmp fail ++ + + + ;; check that INIL prevents setting of IL latches + ;; when both events occur at the same cycle + ogi 0x9 + ogi 0x0 + inil + x 0 + skmbz 3 + jmp fail + skmbz 2 ; CKO + jmp fail + skmbz 0 + jmp fail + + + jmp pass + + + org 0x100 + include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/inin/t420 --- tags/rel_1_1/sw/verif/black_box/inin/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/black_box/inin/test.asm (revision 172) @@ -0,0 +1,71 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-05-22 23:17:59 arniml Exp $ + ;; + ;; Checks the ININ instruction. + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + clra + + ;; preload reference data + stii 0x0 + stii 0x1 + stii 0x2 + stii 0x3 + stii 0x4 + stii 0x5 + stii 0x6 + stii 0x7 + stii 0x8 + stii 0x9 + stii 0xa + stii 0xb + stii 0xc + stii 0xd + stii 0xe + stii 0xf + + ;; output 0 on G and check + ogi 0x0 + inin + lbi 0, 0 + ske + jmp fail + + ;; output 8 on G and check + ogi 0x8 + inin + lbi 0, 8 + ske + jmp fail + + ;; output 1 on G and check + ogi 0x1 + inin + lbi 0, 1 + ske + jmp fail + + ;; output 4 on G and check + ogi 0x4 + inin + lbi 0, 4 + ske + jmp fail + + ;; output 15 on G and check + ogi 0xf + inin + lbi 0, 15 + ske + jmp fail + + + + jmp pass + + + org 0x100 + include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/xas/test.asm
0,0 → 1,217
;; *******************************************************************
;; $Id: test.asm,v 1.2 2006-05-27 22:46:29 arniml Exp $
;;
;; Checks the XAS instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; *******************************************************************
;; Test counter functionality
;;
lei 0x5
;; enable counter
clra
camq
 
;; clear SKL
xas
nop ; spend some time to let effect of SKL
nop ; falling edge pass by
nop ;
 
;; -------------------------------------------------------------------
;; step 1
;; decrement counter from 1 to 0
;; test SO by controlling SI via SO
;;
;; load 0x1 to counter
clra
aisc 0x1
xas
;; decrement via SO
lei 0xd
nop ; ensure minimum '1' duration
lei 0x5
nop ;
nop ; ensure minimum '0' duration
nop ;
xas
;; check for 0x0
xad 3, 15
clra
x 0
xad 3, 15
ske
jmp fail
 
;; -------------------------------------------------------------------
;; step 2
;; decrement counter from 0 to 0xf
;; test SKL by controlling SI via SK
;;
;; set SKL to '1'
sc ; SKL = '1'
xas
;; load 0x0 to counter, decrement via SK
clra
rc
xas
nop ;
nop ; ensure minimum '0' duration
nop ;
xas
;; check for 0xf
xad 3, 15
clra
aisc 0xf
x 0
xad 3, 15
ske
jmp fail
 
 
;; -------------------------------------------------------------------
;; step 3
;; check minimum high time on SI
;;
;; load 0x0 to counter
clra
xas
;; clock on SI
lei 0xd
lei 0x5 ; high time too short
nop ;
nop ; ensure minimum '0' duration
nop ;
xas
;; check for 0x0
xad 3, 15
clra
x 0
xad 3, 15
ske
jmp fail
 
;; -------------------------------------------------------------------
;; step 4
;; check minimum low time on SI
;;
;; load 0x0 to counter
clra
xas
;; clock on SI
lei 0xd
nop ; ensure minimum '1' duration
lei 0x5
lei 0xd ; low time too short
xas
;; check for 0x0
xad 3, 15
clra
x 0
xad 3, 15
ske
jmp fail
 
 
;; *******************************************************************
;; Test shift register functionality
;;
lei 0xc ; SO = SIO output
;; enable shift register
aisc 0x1
camq
 
;; shift out 0x5
aisc 0x4
sc
xas
;;
nop ;
nop ; shift for four clocks on SK
rc ;
xas ; stop SK
;; check for 0x2
xad 3, 15
clra
aisc 0x2
x 0
xad 3, 15
ske
jmp fail
 
;; shift out 0x0
clra
sc
xas
;;
nop ;
nop ; shift for four clocks on SK
rc ;
xas ; stop SK
;; check for 0x8
xad 3, 15
clra
aisc 0x8
x 0
xad 3, 15
ske
jmp fail
 
;; now disable SO and check that only '0' is shifted in
lei 0x4 ; SO = '0'
;; shift out 0xf
clra
aisc 0xf
sc
xas
;;
nop ;
nop ; shift for four clocks on SK
rc ;
xas ; stop SK
;; check for 0x0
xad 3, 15
clra
x 0
xad 3, 15
ske
jmp fail
 
;; enable SO
lei 0xc
;; shift out 0x1 to force SI to '1' via SO
clra
aisc 0x1
sc
xas
;;
nop ;
nop ; shift for four clocks on SK
rc ;
xas ; stop SK
;; shift out 0x0 with disabled SK
clra
xas
;;
nop ;
nop ; shift for four clocks on SK
nop ;
xas
;; check for 0xf
xad 3, 15
clra
aisc 0xf
x 0
xad 3, 15
ske
jmp fail
 
jmp pass
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/lqid/test.asm
0,0 → 1,329
;; *******************************************************************
;; $Id: test.asm,v 1.2 2006-05-21 17:30:32 arniml Exp $
;;
;; Checks the LQID and INL instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload reference data
lbi 0, 0
stii 0x0
lbi 0, 9
stii 0x1
stii 0x2
stii 0x3
stii 0x4
stii 0x5
stii 0x6
stii 0x7
 
lbi 1, 0
stii 0x8
lbi 1, 9
stii 0x9
stii 0xa
stii 0xb
stii 0xc
stii 0xd
stii 0xe
stii 0xf
 
 
load MACRO addr, noadd
lbi 2, 0
stii addr & 0x0f
clra
IF noadd <> 1
aisc (addr >> 4) & 0x0f
ENDIF
lbi 2, 0
lqid
inl
ENDM
 
;; enable Q output to L
lei 0x4
 
;;
load read_block_0_55, 0
lbi 0, 8 + 5
ske
jmp fail
lbi 2, 0
ske
jmp fail
 
;;
load read_block_0_aa, 0
lbi 1, 0xa
ske
jmp fail
lbi 2, 0
ske
jmp fail
 
;;
load read_block_0_0f, 0
lbi 1, 0xf
ske
jmp fail
lbi 2, 0
clra
ske
jmp fail
 
;;
load read_block_0_f0, 0
lbi 0, 0
ske
jmp fail
lbi 2, 0
clra
aisc 0xf
ske
jmp fail
 
jmp block_1
 
;; -------------------------------------------------------------------
;; Block 0 testdata
;;
org 0x064
read_block_0_55:
db 0x55
 
org 0x071
read_block_0_aa:
db 0xaa
 
org 0x0a9
read_block_0_0f:
db 0x0f
 
org 0x0ff
read_block_0_f0:
db 0xf0
 
 
;; -------------------------------------------------------------------
;; Block 1 testdata
;;
org 0x105
read_block_1_68:
db 0x68
 
org 0x120
read_block_1_b1:
db 0xb1
 
org 0x17e
read_block_1_04:
db 0x04
 
org 0x1c2
read_block_1_db:
db 0xdb
 
 
org 0x128
block_1:
;;
load read_block_1_68, 1
lbi 1, 0
ske
jmp fail
lbi 2, 0
clra
aisc 0x6
ske
jmp fail
 
;;
load read_block_1_b1, 0
lbi 0, 8 + 1
ske
jmp fail
lbi 2, 0
clra
aisc 0xb
ske
jmp fail
 
;;
load read_block_1_04, 0
lbi 0, 8 + 4
ske
jmp fail
lbi 2, 0
clra
ske
jmp fail
 
;;
load read_block_1_db, 0
lbi 1, 0xb
ske
jmp fail
lbi 2, 0
clra
aisc 0xd
ske
jmp fail
 
 
IF MOMCPUNAME <> "COP420"
jmp pass
ELSEIF
jmp block_2
ENDIF
 
 
org 0x180
include "pass_fail.asm"
 
 
IF MOMCPUNAME = "COP420"
 
;; -------------------------------------------------------------------
;; Block 2 testdata
;;
org 0x211
read_block_2_34:
db 0x34
 
org 0x237
read_block_2_91:
db 0x91
 
org 0x254
read_block_2_89:
db 0x89
 
org 0x296
read_block_2_3c:
db 0x3c
 
org 0x2b0
block_2:
;;
load read_block_2_34, 0
lbi 0, 8 + 4
ske
jmp fail
lbi 2, 0
clra
aisc 0x3
ske
jmp fail
 
;;
load read_block_2_91, 0
lbi 0, 8 + 1
ske
jmp fail
lbi 2, 0
clra
aisc 0x9
ske
jmp fail
 
;;
load read_block_2_89, 0
lbi 1, 9
ske
jmp fail
lbi 2, 0
clra
aisc 0x8
ske
jmp fail
 
;;
load read_block_2_3c, 0
lbi 1, 0xc
ske
jmp fail
lbi 2, 0
clra
aisc 0x3
ske
jmp fail
 
jmp block_3
 
 
;; -------------------------------------------------------------------
;; Block 3 testdata
;;
org 0x300
read_block_3_76:
db 0x76
 
org 0x34b
read_block_3_33:
db 0x33
 
org 0x3a4
read_block_3_e9:
db 0xe9
 
org 0x3e0
read_block_3_9d:
db 0x9d
 
org 0x350
block_3:
;;
load read_block_3_76, 1
lbi 0, 8 + 6
ske
jmp fail
lbi 2, 0
clra
aisc 0x7
ske
jmp fail
 
;;
load read_block_3_33, 0
lbi 0, 8 + 3
ske
jmp fail
lbi 2, 0
clra
aisc 0x3
ske
jmp fail
 
;;
load read_block_3_e9, 0
lbi 1, 9
ske
jmp fail
lbi 2, 0
clra
aisc 0xe
ske
jmp fail
 
;;
load read_block_3_9d, 0
lbi 1, 0xd
ske
jmp fail
lbi 2, 0
clra
aisc 0x9
ske
jmp fail
 
jmp pass
ENDIF
/tags/rel_1_1/sw/verif/black_box/ldd/t42x --- tags/rel_1_1/sw/verif/black_box/ldd/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/black_box/ldd/test.asm (revision 172) @@ -0,0 +1,149 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-05-20 17:56:22 arniml Exp $ + ;; + ;; Checks the LDD instruction. + ;; + + ;; the cpu type is defined on asl's command line + + ;; macro for checking a digit +check_d MACRO reg, digit + lbi (reg ! 3), ~digit & 0xf ; select inverse digit + ldd reg, digit + lbi reg, digit + ske + jmp fail + ENDM + + + ;; macro for checking LDD on a complete register +check_r MACRO reg + check_d reg, 0 + check_d reg, 1 + check_d reg, 2 + check_d reg, 3 + check_d reg, 4 + check_d reg, 5 + check_d reg, 6 + check_d reg, 7 + check_d reg, 8 + check_d reg, 9 + check_d reg, 10 + check_d reg, 11 + check_d reg, 12 + check_d reg, 13 + check_d reg, 14 + check_d reg, 15 + ENDM + + + org 0x00 + clra + + + ;; prepare other registers + ;; register 1 + lbi 1, 0 + jsr clear_reg + ;; register 2 + lbi 2, 0 + jsr clear_reg + ;; register 3 + lbi 3, 0 + jsr clear_reg + + + ;; ******************************************************************* + ;; Test LDD on register 0 + ;; + lbi 0, 0 + jsr init_reg + ;; + check_r 0 + + + ;; ******************************************************************* + ;; Test LDD on register 1 + ;; + lbi 0, 0 + jsr clear_reg + lbi 1, 0 + jsr init_reg + ;; + check_r 1 + + + ;; ******************************************************************* + ;; Test LDD on register 2 + ;; + lbi 1, 0 + jsr clear_reg + lbi 2, 0 + jsr init_reg + ;; + check_r 2 + + ;; ******************************************************************* + ;; Test LDD on register 3 + ;; + lbi 2, 0 + jsr clear_reg + lbi 3, 0 + jsr init_reg + ;; + check_r 3 + + + jmp pass + + + + ;; initialize current register with proper values + ;; +init_reg: + clra + cab + stii 0x0 + stii 0x1 + stii 0x2 + stii 0x3 + stii 0x4 + stii 0x5 + stii 0x6 + stii 0x7 + stii 0x8 + stii 0x9 + stii 0xa + stii 0xb + stii 0xc + stii 0xd + stii 0xe + stii 0xf + ret + + ;; + ;; clear current register + ;; +clear_reg: + clra + cab + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + ret + + org 0x380 + include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/skt/t42x --- tags/rel_1_1/sw/verif/black_box/skt/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/black_box/skt/test.asm (revision 172) @@ -0,0 +1,69 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-05-20 02:46:20 arniml Exp $ + ;; + ;; Checks the SKT instruction. + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + clra + + ;; timer not elapsed right after power-on reset + skt + jp ok_1 + jmp fail +ok_1: + + + ;; preload timeout value + stii 0x4 + stii 0x0 + stii 0x0 + + ;; ******************************************************************* + ;; Poll for timer flag with and time out after a while. + ;; +poll_loop: + ;; decrement timeout counter + lbi 0, 2 + sc + clra + aisc 0x1 + casc ; M(0, 2) - 1 + jp proc_digit_1 + x 0 + jp dec_finished + +proc_digit_1: + xds 0 ; A loads 0 from M + sc + aisc 0x1 + casc ; M(0, 1) - 1 + jp proc_digit_0 + x 0 + jp dec_finished + +proc_digit_0: + xds 0 ; A loads 0 from M + sc + aisc 0x1 + casc ; M(0, 0) - 1 + jmp fail ; TIMEOUT! + x 0 +dec_finished: + + ;; poll timer flag + skt + jp poll_loop + + ;; check that last skt cleared the flag + skt + jp ok_2 + jmp fail +ok_2: + + + jmp pass + + include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/xabr/t42x --- tags/rel_1_1/sw/verif/black_box/xabr/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/black_box/xabr/test.asm (revision 172) @@ -0,0 +1,103 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-05-20 01:53:06 arniml Exp $ + ;; + ;; Checks the XABR instruction. + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + clra + + ;; preload digit 0 of all registers with different data + lbi 0, 0 + stii 0x4 + stii 0x0 ; register number + lbi 1, 0 + stii 0x5 + stii 0x1 ; register number + lbi 2, 0 + stii 0x6 + stii 0x2 ; register number + lbi 3, 0 + stii 0x7 + stii 0x3 ; register number + + + ;; ******************************************************************* + ;; check Br -> A path of XABR + ;; + lbi 0, 0 + xabr + lbi 0, 1 + ske ; check against preloaded register number + jmp fail + ;; + lbi 1, 0 + xabr + lbi 1, 1 + ske ; check against preloaded register number + jmp fail + ;; + lbi 2, 0 + xabr + lbi 2, 1 + ske ; check against preloaded register number + jmp fail + ;; + lbi 3, 0 + xabr + lbi 3, 1 + ske ; check against preloaded register number + jmp fail + + + ;; ******************************************************************* + ;; check A -> Br path of XABR + ;; + lbi 0, 0 ; set Bd + + ;; check for Br = 3 + clra + aisc 0x3 + xabr + ;; expect 0x7 @ 3, 0 + clra + aisc 0x7 + ske + jmp fail + + ;; check for Br = 2 + clra + aisc 0x2 + xabr + ;; expect 0x6 @ 2, 0 + clra + aisc 0x6 + ske + jmp fail + + ;; check for Br = 1 + clra + aisc 0x1 + xabr + ;; expect 0x5 @ 1, 0 + clra + aisc 0x5 + ske + jmp fail + + ;; check for Br = 0 + clra + xabr + ;; expect 0x4 @ 0, 0 + clra + aisc 0x4 + ske + jmp fail + + + jmp pass + + + include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/xad/test.asm
0,0 → 1,254
;; *******************************************************************
;; $Id: test.asm,v 1.1 2006-05-19 00:56:03 arniml Exp $
;;
;; Checks the XAD instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; *******************************************************************
;; Dedicated test for XAD 3, 15
;;
lbi 0, 9
stii 0x02
stii 0x03
 
aisc 0x2
xad 3, 15
clra
aisc 0x3
 
xad 3, 15
;; expect 0x2
lbi 0, 9
ske
jmp fail
 
xad 3, 15
;; expect 0x3
lbi 0, 10
ske
jmp fail
 
IF MOMCPUNAME = "COP410"
jmp pass
ELSEIF
 
 
;; macro for checking XAD on a complete register
check MACRO register
lbi register, 0
ld 0
xad register, 1
xad register, 2
xad register, 3
xad register, 4
xad register, 5
xad register, 6
xad register, 7
xad register, 8
xad register, 9
xad register, 10
xad register, 11
xad register, 12
xad register, 13
xad register, 14
xad register, 15
xad register, 0
 
clra
lbi register, 1
ske ; expect 0 in digit 1
jmp fail
;;
aisc 0x1
lbi register, 2
ske ; expect 1 in digit 2
jmp fail
;;
aisc 0x1
lbi register, 3
ske ; expect 2 in digit 3
jmp fail
;;
aisc 0x1
lbi register, 4
ske ; expect 3 in digit 4
jmp fail
;;
aisc 0x1
lbi register, 5
ske ; expect 4 in digit 5
jmp fail
;;
aisc 0x1
lbi register, 6
ske ; expect 5 in digit 6
jmp fail
;;
aisc 0x1
lbi register, 7
ske ; expect 6 in digit 7
jmp fail
;;
aisc 0x1
lbi register, 8
ske ; expect 7 in digit 8
jmp fail
;;
aisc 0x1
lbi register, 9
ske ; expect 8 in digit 9
jmp fail
;;
aisc 0x1
lbi register, 10
ske ; expect 9 in digit 10
jmp fail
;;
aisc 0x1
lbi register, 11
ske ; expect 10 in digit 11
jmp fail
;;
aisc 0x1
lbi register, 12
ske ; expect 11 in digit 12
jmp fail
;;
aisc 0x1
lbi register, 13
ske ; expect 12 in digit 13
jmp fail
;;
aisc 0x1
lbi register, 14
ske ; expect 13 in digit 14
jmp fail
;;
aisc 0x1
lbi register, 15
ske ; expect 14 in digit 15
jmp fail
;;
aisc 0x1
lbi register, 0
ske ; expect 15 in digit 0
jmp fail
ENDM
 
;; prepare other registers
;; register 1
lbi 1, 0
jsr clear_reg
;; register 2
lbi 2, 0
jsr clear_reg
;; register 3
lbi 3, 0
jsr clear_reg
 
;; *******************************************************************
;; Test XAD on register 0
;;
lbi 0, 0
jsr init_reg
;;
check 0
 
;; *******************************************************************
;; Test XAD on register 1
;;
lbi 0, 0
jsr clear_reg
lbi 1, 0
jsr init_reg
;;
check 1
 
;; *******************************************************************
;; Test XAD on register 2
;;
lbi 1, 0
jsr clear_reg
lbi 2, 0
jsr init_reg
;;
check 2
 
;; *******************************************************************
;; Test XAD on register 3
;;
lbi 2, 0
jsr clear_reg
lbi 3, 0
jsr init_reg
;;
check 3
 
jmp pass
 
 
;;
;; initialize current register with proper values
;;
init_reg:
clra
cab
stii 0x0
stii 0x1
stii 0x2
stii 0x3
stii 0x4
stii 0x5
stii 0x6
stii 0x7
stii 0x8
stii 0x9
stii 0xa
stii 0xb
stii 0xc
stii 0xd
stii 0xe
stii 0xf
ret
 
;;
;; clear current register
;;
clear_reg:
clra
cab
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
stii 0x0
ret
 
ENDIF
 
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/lbi_long/t42x --- tags/rel_1_1/sw/verif/black_box/lbi_long/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/black_box/lbi_long/test.asm (revision 172) @@ -0,0 +1,535 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-05-18 01:17:12 arniml Exp $ + ;; + ;; Checks the LBI instruction (two byte). + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + clra + + ;; register 0 + ld 0x0 + jsr clear_reg + ;; register 1 + ld 0x1 + jsr clear_reg + ;; register 2 + ld 0x3 + jsr clear_reg + ;; register 3 + ld 0x1 + jsr clear_reg + + jmp test_code + + + ;; subroutines for combined long LBI + org 0x010 +lbi_call_reg0: + db 0x33, 0x80 ; lbi 0, 0 + db 0x33, 0x81 ; lbi 0, 1 + db 0x33, 0x82 ; lbi 0, 2 + db 0x33, 0x83 ; lbi 0, 3 + db 0x33, 0x84 ; lbi 0, 4 + db 0x33, 0x85 ; lbi 0, 5 + db 0x33, 0x86 ; lbi 0, 6 + db 0x33, 0x87 ; lbi 0, 7 + db 0x33, 0x88 ; lbi 0, 8 + db 0x33, 0x89 ; lbi 0, 9 + db 0x33, 0x8a ; lbi 0, 10 + db 0x33, 0x8b ; lbi 0, 11 + db 0x33, 0x8c ; lbi 0, 12 + db 0x33, 0x8d ; lbi 0, 13 + db 0x33, 0x8e ; lbi 0, 14 + db 0x33, 0x8f ; lbi 0, 15 + ret + jmp fail ; catch me if you can +lbi_call_reg1: + db 0x33, 0x90 ; lbi 1, 0 + db 0x33, 0x91 ; lbi 1, 1 + db 0x33, 0x92 ; lbi 1, 2 + db 0x33, 0x93 ; lbi 1, 3 + db 0x33, 0x94 ; lbi 1, 4 + db 0x33, 0x95 ; lbi 1, 5 + db 0x33, 0x96 ; lbi 1, 6 + db 0x33, 0x97 ; lbi 1, 7 + db 0x33, 0x98 ; lbi 1, 8 + db 0x33, 0x99 ; lbi 1, 9 + db 0x33, 0x9a ; lbi 1, 10 + db 0x33, 0x9b ; lbi 1, 11 + db 0x33, 0x9c ; lbi 1, 12 + db 0x33, 0x9d ; lbi 1, 13 + db 0x33, 0x9e ; lbi 1, 14 + db 0x33, 0x9f ; lbi 1, 15 + ret + jmp fail ; catch me if you can +lbi_call_reg2: + db 0x33, 0xa0 ; lbi 2, 0 + db 0x33, 0xa1 ; lbi 2, 1 + db 0x33, 0xa2 ; lbi 2, 2 + db 0x33, 0xa3 ; lbi 2, 3 + db 0x33, 0xa4 ; lbi 2, 4 + db 0x33, 0xa5 ; lbi 2, 5 + db 0x33, 0xa6 ; lbi 2, 6 + db 0x33, 0xa7 ; lbi 2, 7 + db 0x33, 0xa8 ; lbi 2, 8 + db 0x33, 0xa9 ; lbi 2, 9 + db 0x33, 0xaa ; lbi 2, 10 + db 0x33, 0xab ; lbi 2, 11 + db 0x33, 0xac ; lbi 2, 12 + db 0x33, 0xad ; lbi 2, 13 + db 0x33, 0xae ; lbi 2, 14 + db 0x33, 0xaf ; lbi 2, 15 + ret + jmp fail ; catch me if you can +lbi_call_reg3: + db 0x33, 0xb0 ; lbi 3, 0 + db 0x33, 0xb1 ; lbi 3, 1 + db 0x33, 0xb2 ; lbi 3, 2 + db 0x33, 0xb3 ; lbi 3, 3 + db 0x33, 0xb4 ; lbi 3, 4 + db 0x33, 0xb5 ; lbi 3, 5 + db 0x33, 0xb6 ; lbi 3, 6 + db 0x33, 0xb7 ; lbi 3, 7 + db 0x33, 0xb8 ; lbi 3, 8 + db 0x33, 0xb9 ; lbi 3, 9 + db 0x33, 0xba ; lbi 3, 10 + db 0x33, 0xbb ; lbi 3, 11 + db 0x33, 0xbc ; lbi 3, 12 + db 0x33, 0xbd ; lbi 3, 13 + db 0x33, 0xbe ; lbi 3, 14 + db 0x33, 0xbf ; lbi 3, 15 + ret + jmp fail ; catch me if you can + + + ;; + ;; now test each register digit + ;; +test_code: + + ;; ******************************************************************* + ;; register 0 + ;; + ;; initialize all digits of register + ;; + ld 0x3 ; r: 3 -> 0 + jsr init_reg + + + ;; digit 0 + clra + jsr lbi_call_reg0 + 0 * 2 + ske + jmp fail + ;; digit 1 + aisc 0x1 + jsr lbi_call_reg0 + 1 * 2 + ske + jmp fail + ;; digit 2 + aisc 0x1 + jsr lbi_call_reg0 + 2 * 2 + ske + jmp fail + ;; digit 3 + aisc 0x1 + jsr lbi_call_reg0 + 3 * 2 + ske + jmp fail + ;; digit 4 + aisc 0x1 + jsr lbi_call_reg0 + 4 * 2 + ske + jmp fail + ;; digit 5 + aisc 0x1 + jsr lbi_call_reg0 + 5 * 2 + ske + jmp fail + ;; digit 6 + aisc 0x1 + jsr lbi_call_reg0 + 6 * 2 + ske + jmp fail + ;; digit 7 + aisc 0x1 + jsr lbi_call_reg0 + 7 * 2 + ske + jmp fail + ;; digit 8 + aisc 0x1 + jsr lbi_call_reg0 + 8 * 2 + ske + jmp fail + ;; digit 9 + aisc 0x1 + jsr lbi_call_reg0 + 9 * 2 + ske + jmp fail + ;; digit 10 + aisc 0x1 + jsr lbi_call_reg0 + 10 * 2 + ske + jmp fail + ;; digit 11 + aisc 0x1 + jsr lbi_call_reg0 + 11 * 2 + ske + jmp fail + ;; digit 12 + aisc 0x1 + jsr lbi_call_reg0 + 12 * 2 + ske + jmp fail + ;; digit 13 + aisc 0x1 + jsr lbi_call_reg0 + 13 * 2 + ske + jmp fail + ;; digit 14 + aisc 0x1 + jsr lbi_call_reg0 + 14 * 2 + ske + jmp fail + ;; digit 15 + aisc 0x1 + jsr lbi_call_reg0 + 15 * 2 + ske + jmp fail + + + ;; ******************************************************************* + ;; register 1 + ;; + ;; initialize all digits of register + ;; + ld 0x0 ; r: 0 -> 0 + jsr clear_reg + ld 0x1 ; r: 0 -> 1 + jsr init_reg + + + ;; digit 0 + clra + jsr lbi_call_reg1 + 0 * 2 + ske + jmp fail + ;; digit 1 + aisc 0x1 + jsr lbi_call_reg1 + 1 * 2 + ske + jmp fail + ;; digit 2 + aisc 0x1 + jsr lbi_call_reg1 + 2 * 2 + ske + jmp fail + ;; digit 3 + aisc 0x1 + jsr lbi_call_reg1 + 3 * 2 + ske + jmp fail + ;; digit 4 + aisc 0x1 + jsr lbi_call_reg1 + 4 * 2 + ske + jmp fail + ;; digit 5 + aisc 0x1 + jsr lbi_call_reg1 + 5 * 2 + ske + jmp fail + ;; digit 6 + aisc 0x1 + jsr lbi_call_reg1 + 6 * 2 + ske + jmp fail + ;; digit 7 + aisc 0x1 + jsr lbi_call_reg1 + 7 * 2 + ske + jmp fail + ;; digit 8 + aisc 0x1 + jsr lbi_call_reg1 + 8 * 2 + ske + jmp fail + ;; digit 9 + aisc 0x1 + jsr lbi_call_reg1 + 9 * 2 + ske + jmp fail + ;; digit 10 + aisc 0x1 + jsr lbi_call_reg1 + 10 * 2 + ske + jmp fail + ;; digit 11 + aisc 0x1 + jsr lbi_call_reg1 + 11 * 2 + ske + jmp fail + ;; digit 12 + aisc 0x1 + jsr lbi_call_reg1 + 12 * 2 + ske + jmp fail + ;; digit 13 + aisc 0x1 + jsr lbi_call_reg1 + 13 * 2 + ske + jmp fail + ;; digit 14 + aisc 0x1 + jsr lbi_call_reg1 + 14 * 2 + ske + jmp fail + ;; digit 15 + aisc 0x1 + jsr lbi_call_reg1 + 15 * 2 + ske + jmp fail + + + ;; ******************************************************************* + ;; register 2 + ;; + ;; initialize all digits of register + ;; + ld 0x0 ; r: 1 -> 1 + jsr clear_reg + ld 0x3 ; r: 1 -> 2 + jsr init_reg + + + ;; digit 0 + clra + jsr lbi_call_reg2 + 0 * 2 + ske + jmp fail + ;; digit 1 + aisc 0x1 + jsr lbi_call_reg2 + 1 * 2 + ske + jmp fail + ;; digit 2 + aisc 0x1 + jsr lbi_call_reg2 + 2 * 2 + ske + jmp fail + ;; digit 3 + aisc 0x1 + jsr lbi_call_reg2 + 3 * 2 + ske + jmp fail + ;; digit 4 + aisc 0x1 + jsr lbi_call_reg2 + 4 * 2 + ske + jmp fail + ;; digit 5 + aisc 0x1 + jsr lbi_call_reg2 + 5 * 2 + ske + jmp fail + ;; digit 6 + aisc 0x1 + jsr lbi_call_reg2 + 6 * 2 + ske + jmp fail + ;; digit 7 + aisc 0x1 + jsr lbi_call_reg2 + 7 * 2 + ske + jmp fail + ;; digit 8 + aisc 0x1 + jsr lbi_call_reg2 + 8 * 2 + ske + jmp fail + ;; digit 9 + aisc 0x1 + jsr lbi_call_reg2 + 9 * 2 + ske + jmp fail + ;; digit 10 + aisc 0x1 + jsr lbi_call_reg2 + 10 * 2 + ske + jmp fail + ;; digit 11 + aisc 0x1 + jsr lbi_call_reg2 + 11 * 2 + ske + jmp fail + ;; digit 12 + aisc 0x1 + jsr lbi_call_reg2 + 12 * 2 + ske + jmp fail + ;; digit 13 + aisc 0x1 + jsr lbi_call_reg2 + 13 * 2 + ske + jmp fail + ;; digit 14 + aisc 0x1 + jsr lbi_call_reg2 + 14 * 2 + ske + jmp fail + ;; digit 15 + aisc 0x1 + jsr lbi_call_reg2 + 15 * 2 + ske + jmp fail + + + ;; ******************************************************************* + ;; register 3 + ;; + ;; initialize all digits of register + ;; + ld 0x0 ; r: 2 -> 2 + jsr clear_reg + ld 0x1 ; r: 2 -> 3 + jsr init_reg + + + ;; digit 0 + clra + jsr lbi_call_reg3 + 0 * 2 + ske + jmp fail + ;; digit 1 + aisc 0x1 + jsr lbi_call_reg3 + 1 * 2 + ske + jmp fail + ;; digit 2 + aisc 0x1 + jsr lbi_call_reg3 + 2 * 2 + ske + jmp fail + ;; digit 3 + aisc 0x1 + jsr lbi_call_reg3 + 3 * 2 + ske + jmp fail + ;; digit 4 + aisc 0x1 + jsr lbi_call_reg3 + 4 * 2 + ske + jmp fail + ;; digit 5 + aisc 0x1 + jsr lbi_call_reg3 + 5 * 2 + ske + jmp fail + ;; digit 6 + aisc 0x1 + jsr lbi_call_reg3 + 6 * 2 + ske + jmp fail + ;; digit 7 + aisc 0x1 + jsr lbi_call_reg3 + 7 * 2 + ske + jmp fail + ;; digit 8 + aisc 0x1 + jsr lbi_call_reg3 + 8 * 2 + ske + jmp fail + ;; digit 9 + aisc 0x1 + jsr lbi_call_reg3 + 9 * 2 + ske + jmp fail + ;; digit 10 + aisc 0x1 + jsr lbi_call_reg3 + 10 * 2 + ske + jmp fail + ;; digit 11 + aisc 0x1 + jsr lbi_call_reg3 + 11 * 2 + ske + jmp fail + ;; digit 12 + aisc 0x1 + jsr lbi_call_reg3 + 12 * 2 + ske + jmp fail + ;; digit 13 + aisc 0x1 + jsr lbi_call_reg3 + 13 * 2 + ske + jmp fail + ;; digit 14 + aisc 0x1 + jsr lbi_call_reg3 + 14 * 2 + ske + jmp fail + ;; digit 15 + aisc 0x1 + jsr lbi_call_reg3 + 15 * 2 + ske + jmp fail + + + + jmp pass + + + ;; + ;; initialize current register with proper values + ;; +init_reg: + clra + cab + stii 0x0 + stii 0x1 + stii 0x2 + stii 0x3 + stii 0x4 + stii 0x5 + stii 0x6 + stii 0x7 + stii 0x8 + stii 0x9 + stii 0xa + stii 0xb + stii 0xc + stii 0xd + stii 0xe + stii 0xf + ret + + ;; + ;; clear current register + ;; +clear_reg: + clra + cab + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + stii 0x0 + ret + + include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/obd/test.asm
0,0 → 1,41
;; *******************************************************************
;; $Id: test.asm,v 1.2 2006-05-18 00:22:43 arniml Exp $
;;
;; Checks the OBD instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; output 1 on D
aisc 0x1
cab
obd
 
;; output 2 on D
aisc 0x1
cab
obd
 
;; output 4 on D
;; note: last action on COP411L
aisc 0x2
cab
obd
 
;; output 8 on D
aisc 0x4
cab
obd
 
;; output 0xf on D
aisc 0x7
cab
obd
 
jmp fail
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/omg_ing/test.asm
0,0 → 1,71
;; *******************************************************************
;; $Id: test.asm,v 1.2 2006-05-17 00:39:13 arniml Exp $
;;
;; Checks the OMG and ING instructions.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; output 0 on G and check
;; note: this is done before actually starting the
;; sequence because 0 will end the sequence for
;; the T411L flavour.
x 0x0
omg
clra
comp
ing
ske
jmp fail
 
;; output 1 on G
clra
aisc 0x1
x 0x0
omg
ing
ske
jmp fail
 
;; output 2 on G
clra
aisc 0x2
x 0x0
omg
ing
ske
jmp fail
 
;; output 4 on G
clra
aisc 0x4
x 0x0
omg
ing
ske
jmp fail
 
;; output 8 on G
;; note: last action on COP411L
clra
aisc 0x8
x 0x0
omg
ing
ske
jmp fail
 
;; output 0xf on G
clra
aisc 0xf
x 0x0
omg
ing
ske
jmp fail
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/jp/test.asm
0,0 → 1,217
;; *******************************************************************
;; $Id: test.asm,v 1.2 2006-05-17 00:29:52 arniml Exp $
;;
;; Checks the JP instruction.
;; Both for pages 2,3 and other pages.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
jmp page_0
jmp fail
 
org 0x030 - 2
jmp fail
page_0:
jp page_0_loc
jmp fail
page_0_loc:
jmp page_1
jmp fail
 
org 0x048 - 2
jmp fail
page_1:
jp page_1_loc
jmp fail
page_1_loc:
jmp page_4
jmp fail
 
 
;; *******************************************************************
;;
org 0x080 - 2
jmp fail
page_2:
jp page_3_1
jmp fail
 
org 0x08a - 2
jmp fail
page_2_2:
jp page_3_3
jmp fail
 
org 0x093 - 2
jmp fail
page_2_4:
jp page_3_5
jmp fail
 
org 0x09b - 2
jmp fail
page_2_6:
jp page_3_7
jmp fail
 
org 0x0b9 - 2
jmp fail
page_2_8:
jp page_3_9
jmp fail
 
 
org 0x0c5 - 2
jmp fail
page_3_1:
jp page_2_2
jmp fail
 
org 0x0cd - 2
jmp fail
page_3_3:
jp page_2_4
jmp fail
 
org 0x0d1 - 2
jmp fail
page_3_5:
jp page_2_6
jmp fail
 
org 0x0da - 2
jmp fail
page_3_7:
jp page_2_8
jmp fail
 
org 0x0e5 - 2
jmp fail
page_3_9:
jmp pass
jmp fail
 
 
org 0x115 - 2
jmp fail
page_4:
jp page_4_loc
jmp fail
page_4_loc:
jmp page_5
jmp fail
 
include "pass_fail.asm"
 
 
org 0x15c - 2
jmp fail
page_5:
jp page_5_loc
jmp fail
page_5_loc:
jmp page_6
jmp fail
 
org 0x1a1 - 2
jmp fail
page_6:
jp page_6_loc
jmp fail
page_6_loc:
jmp page_7
jmp fail
 
org 0x1c9 - 2
jmp fail
page_7:
jp page_7_loc
jmp fail
page_7_loc:
IF MOMCPUNAME <> "COP410"
jmp page_8
ELSEIF
jmp page_2
ENDIF
jmp fail
 
 
IF MOMCPUNAME <> "COP410"
 
org 0x21e - 2
jmp fail
page_8:
jp page_8_loc
jmp fail
page_8_loc:
jmp page_9
jmp fail
 
org 0x263 - 2
jmp fail
page_9:
jp page_9_loc
jmp fail
page_9_loc:
jmp page_10
jmp fail
 
org 0x2a8 - 2
jmp fail
page_10:
jp page_10_loc
jmp fail
page_10_loc:
jmp page_11
jmp fail
 
org 0x2fa - 2
jmp fail
page_11:
jp page_11_loc
jmp fail
page_11_loc:
jmp page_12
jmp fail
 
org 0x327 - 2
jmp fail
page_12:
jp page_12_loc
jmp fail
page_12_loc:
jmp page_13
jmp fail
 
org 0x370 - 2
jmp fail
page_13:
jp page_13_loc
jmp fail
page_13_loc:
jmp page_14
jmp fail
 
org 0x3bb - 2
jmp fail
page_14:
jp page_14_loc
jmp fail
page_14_loc:
jmp page_15
jmp fail
 
org 0x3e9 - 2
jmp fail
page_15:
jp page_15_loc
jmp fail
page_15_loc:
jmp page_2
jmp fail
 
ENDIF
/tags/rel_1_1/sw/verif/black_box/asc/test.asm
0,0 → 1,189
;; *******************************************************************
;; $Id: test.asm,v 1.2 2006-05-16 23:43:45 arniml Exp $
;;
;; Checks the ASC instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload M with 0x5
rmb 0x3
smb 0x2
rmb 0x1
smb 0x0
 
clra
rc
;; test a0 + m5 + c0
asc
jmp ok_a0_m5_c0_carry
jmp fail
ok_a0_m5_c0_carry:
skc
jmp ok_a0_m5_c0_c
jmp fail
ok_a0_m5_c0_c:
ske
jmp fail
 
;; test a5 + m5 + c0
asc
jmp ok_a5_m5_c0_carry
jmp fail
ok_a5_m5_c0_carry:
skc
jmp ok_a5_m5_c0_c
jmp fail
ok_a5_m5_c0_c:
aisc 16+5 - 10
nop
ske
jmp fail
 
rc
asc
;; test a10 + m5 + c0
asc
jmp ok_a10_m5_c0_carry
jmp fail
ok_a10_m5_c0_carry:
skc
jmp ok_a10_m5_c0_c
jmp fail
ok_a10_m5_c0_c:
aisc 16+5 - 15
nop
ske
jmp fail
 
rc
asc
asc
;; test a15 + m5 + c0
asc
jmp fail
skc
jmp fail
rc
aisc 16+5 - 20
nop
ske
jmp fail
 
sc
clra
;; test a0 + m5 + c1
asc
jmp ok_a0_m5_c1_carry
jmp fail
ok_a0_m5_c1_carry:
skc
jmp ok_a0_m5_c1_c
jmp fail
ok_a0_m5_c1_c:
aisc 16+5 - 6
nop
ske
jmp fail
 
sc
;; test a5 + m5 + c1
asc
jmp ok_a5_m5_c1_carry
jmp fail
ok_a5_m5_c1_carry:
skc
jmp ok_a5_m5_c1_c
jmp fail
ok_a5_m5_c1_c:
aisc 16+5 - 11
nop
ske
jmp fail
 
rc
asc
sc
;; test a10 + m5 + c1
asc
jmp fail
skc
jmp fail
aisc 16+5 - 16
nop
ske
jmp fail
 
rc
asc
asc
sc
;; test a15 + m5 + c1
asc
jmp fail
skc
jmp fail
;; aisc 16+5 - 21
nop
ske
jmp fail
 
 
rc
aisc 0xa
x 0x0
clra
;; test a0 + m15 + c0
asc
jmp ok_a0_m15_c0_carry
jmp fail
ok_a0_m15_c0_carry:
skc
jmp ok_a0_m15_c0_c
jmp fail
ok_a0_m15_c0_c:
ske
jmp fail
 
rc
;; test a15 + m15 + c0
asc
jmp fail
skc
jmp fail
aisc 16+15 - 30
nop
ske
jmp fail
 
sc
clra
;; test a0 + m15 + c1
asc
jmp fail
skc
jmp fail
aisc 16+15 - 16
nop
ske
jmp fail
 
sc
;; test a15 + m15 + c1
asc
jmp fail
skc
jmp fail
;; aisc 16+15 - 31
nop
ske
jmp fail
 
 
jmp pass
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/ogi/test.asm
0,0 → 1,30
;; *******************************************************************
;; $Id: test.asm,v 1.2 2006-05-16 22:54:07 arniml Exp $
;;
;; Checks the OGI instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; output 1 on G
ogi 0x1
 
;; output 2 on G
ogi 0x2
 
;; output 4 on G
ogi 0x4
 
;; output 8 on G
ogi 0x8
 
;; output f on G
ogi 0xf
 
jmp fail
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/ogi/t42x --- tags/rel_1_1/sw/verif/black_box/casc/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/black_box/casc/test.asm (revision 172) @@ -0,0 +1,91 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.2 2006-05-16 07:57:23 arniml Exp $ + ;; + ;; Checks the CASC instruction. + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + clra + + ;; preload M0 with 0x5 + rmb 0x3 + smb 0x2 + rmb 0x1 + smb 0x0 + + rc + aisc 0xf + ;; test /(a15) + m5 + c0 + casc + jmp ok_a15_m5_c0_carry + jmp fail +ok_a15_m5_c0_carry: + skc + jmp ok_a15_m5_c0_c + jmp fail +ok_a15_m5_c0_c: + ;; expect 0x5 as result + ske + jmp fail + + sc + clra + aisc 0xa + ;; test /(a10) + m5 + c1 + casc + jmp ok_a10_m5_c1_carry + jmp fail +ok_a10_m5_c1_carry: + skc + jmp ok_a10_m5_c1_c + jmp fail +ok_a10_m5_c1_c: + ;; expect 0xb as result + aisc 0xa + nop + ske + jmp fail + + ;; preload M0 with 0xa + smb 0x3 + rmb 0x2 + smb 0x1 + rmb 0x0 + ;; + rc + clra + aisc 0x5 + ;; test /(a5) + m10 + c0 + casc + jmp fail + skc + jmp fail + ;; expect 0x4 as result + aisc 0x6 + ske + jmp fail + + ;; preload M0 with 0xf + smb 0x3 + smb 0x2 + smb 0x1 + smb 0x0 + ;; + sc + clra + ;; test /(a0) + m15 + c1 + casc + jmp fail + skc + jmp fail + ;; expect 0xf as result + ske + jmp fail + + + jmp pass + + org 0x100 + include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/casc/t42x --- tags/rel_1_1/sw/verif/black_box/adt/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/black_box/adt/test.asm (revision 172) @@ -0,0 +1,38 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.2 2006-05-15 23:36:16 arniml Exp $ + ;; + ;; Checks the ADT instruction. + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + clra + + ;; preload M0 with 0xa + smb 0x3 + rmb 0x2 + smb 0x1 + rmb 0x0 + + ;; test 0 + 10 + adt + ske + jmp fail + + ;; preload M0 with 0x4 + rmb 0x3 + smb 0x2 + rmb 0x1 + rmb 0x0 + + ;; test 0xa + 10 + adt + ske + jmp fail + + + jmp pass + + org 0x100 + include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/adt/t42x --- tags/rel_1_1/sw/verif/black_box/pass/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/black_box/pass/test.asm (revision 172) @@ -0,0 +1,17 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.2 2006-05-14 22:32:37 arniml Exp $ + ;; + ;; Pass test. + ;; Always finds the pass mark. + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + clra + + jmp pass + + + org 0x0c0 + include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/skgbz/test.asm
0,0 → 1,115
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the SKGBZ instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; output 0x0 on G
x 0x0
omg
;; check G0
skgbz 0x0
jmp fail
;; check G1
skgbz 0x1
jmp fail
;; check G2
skgbz 0x2
jmp fail
;; check G3
skgbz 0x3
jmp fail
 
;; output 0x1 on G
clra
aisc 0x1
x 0x0
omg
;; check G0
skgbz 0x0
jmp ok_0
jmp fail
ok_0:
;; check G1
skgbz 0x1
jmp fail
;; check G2
skgbz 0x2
jmp fail
;; check G3
skgbz 0x3
jmp fail
 
;; output 0x2 on G
clra
aisc 0x2
x 0x0
omg
;; check G0
skgbz 0x0
jmp fail
;; check G1
skgbz 0x1
jmp ok_1
jmp fail
ok_1:
;; check G2
skgbz 0x2
jmp fail
;; check G3
skgbz 0x3
jmp fail
 
;; output 0x4 on G
clra
aisc 0x4
x 0x0
omg
;; check G0
skgbz 0x0
jmp fail
;; check G1
skgbz 0x1
jmp fail
;; check G2
skgbz 0x2
jmp ok_2
jmp fail
ok_2:
;; check G3
skgbz 0x3
jmp fail
 
;; output 0x1 on G to break monitoring sequence
;; on T411L
clra
aisc 0x1
x 0x0
omg
 
;; output 0x8 on G
clra
aisc 0x8
x 0x0
omg
;; check G0
skgbz 0x0
jmp fail
;; check G1
skgbz 0x1
jmp fail
;; check G2
skgbz 0x2
jmp fail
;; check G3
skgbz 0x3
jmp pass
jmp fail
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/rmb_smb/test.asm
0,0 → 1,90
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the RMB and SMB instructions.
;; Starting with 0 in M, all bits are set and then reset.
;; All intermediate values are checked.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
 
;; *******************************************************************
;; Set bits
;;
 
;; clear M
X 0x0
clra
 
;; set bit 0
smb 0x0
aisc 0x1
ske
jmp fail
 
;; set bit 1
smb 0x1
aisc 0x2
ske
jmp fail
 
;; set bit 2
smb 0x2
aisc 0x4
ske
jmp fail
 
;; set bit 3
smb 0x3
aisc 0x8
ske
jmp fail
 
 
;; *******************************************************************
;; Reset bits
;;
 
;; reset bit 0
rmb 0x0
comp
aisc 0x1
comp
ske
jmp fail
 
;; reset bit 1
rmb 0x1
comp
aisc 0x2
comp
ske
jmp fail
 
;; reset bit 2
rmb 0x2
comp
aisc 0x4
comp
ske
jmp fail
 
;; reset bit 3
rmb 0x3
comp
aisc 0x8
comp
ske
jmp fail
 
 
;; test passed
jmp pass
 
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/clra/test.asm
0,0 → 1,31
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the CLRA instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload M0 with 0x0
rmb 0x3
rmb 0x2
rmb 0x1
rmb 0x0
 
;; test for initial 0 in a
ske
jmp fail
 
;; test for clearing all bits in a
aisc 0xf
clra
ske
jmp fail
 
jmp pass
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/skmbz/test.asm
0,0 → 1,51
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the SKGMZ instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload two ram digits with test data
lbi 0, 0
stii 0x5
lbi 0, 9
stii 0xa
 
;; check SKBMZs on 0x5
lbi 0, 0
skmbz 0
jp ok_5_0
jmp fail
ok_5_0:
skmbz 1
jmp fail
skmbz 2
jp ok_5_2
jmp fail
ok_5_2:
skmbz 3
jmp fail
 
;; check SKMBZ on 0xa
lbi 0, 9
skmbz 0
jmp fail
skmbz 1
jp ok_a_1
jmp fail
ok_a_1:
skmbz 2
jmp fail
skmbz 3
jp ok_a_3
jmp fail
ok_a_3:
 
jmp pass
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/rc_sc/test.asm
0,0 → 1,46
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the RC and SC instructions.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload M with 0x8
smb 0x3
rmb 0x2
rmb 0x1
rmb 0x0
 
;; check initial value of C
skc
jmp ok_res
jmp fail
ok_res:
 
sc
skc
jmp fail
 
rc
skc
jmp ok_rc
jmp fail
ok_rc:
 
asc
asc
nop
skc
jmp fail
 
rc
skc
jmp pass
jmp fail
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/xds/test.asm
0,0 → 1,530
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the XDS instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
 
;; *******************************************************************
;; XOR 0
jsr init_ram
 
;; xor 0 in digit 0
lbi 0, 0
jsr init_bd
;;
xds 0 ; 0, 3 = 0x3
;;
cba
xds 0 ; 0, 2 = 0x2
;;
cba
xds 0 ; 0, 1 = 0x1
;;
cba
xds 0 ; 0, 0 = 0x0
jmp fail
 
;; xor 0 in digit 1
lbi 1, 0
jsr init_bd
;;
aisc 1 << 2
xds 0 ; 1, 3 = 0x7
;;
cba
aisc 1 << 2
xds 0 ; 1, 2 = 0x6
;;
cba
aisc 1 << 2
xds 0 ; 1, 1 = 0x5
;;
cba
aisc 1 << 2
xds 0 ; 1, 0 = 0x4
jmp fail
 
;; xor 0 in digit 2
lbi 2, 0
jsr init_bd
;;
aisc 2 << 2
xds 0 ; 2, 3 = 0xb
;;
cba
aisc 2 << 2
xds 0 ; 2, 2 = 0xa
;;
cba
aisc 2 << 2
xds 0 ; 2, 1 = 0x9
;;
cba
aisc 2 << 2
xds 0 ; 2, 0 = 0x8
jmp fail
 
;; xor 0 in digit 3
lbi 3, 0
jsr init_bd
;;
aisc 3 << 2
xds 0 ; 3, 3 = 0xf
;;
cba
aisc 3 << 2
xds 0 ; 3, 2 = 0xe
;;
cba
aisc 3 << 2
xds 0 ; 3, 1 = 0xd
;;
cba
aisc 3 << 2
xds 0 ; 3, 0 = 0xc
jmp fail
;; check remaining Br == 3
clra
cab
aisc 0xc
ske
jmp fail
 
jsr check_ram
 
 
;; *******************************************************************
;; XOR 1
jsr init_ram
 
;;
;; xor 1 in digit 0 & 1
;;
lbi 0, 0
jsr init_bd
;;
xds 1 ; 0, 3 = 0x3
;;
cba
aisc 1 << 2
xds 1 ; 1, 2 = 0x6
;;
cba
xds 1 ; 0, 1 = 0x1
;;
cba
aisc 1 << 2
xds 1 ; 1, 0 = 0x4
jmp fail
;; check remaining Br == 0
clra
cab
aisc 0xf ; RAM init value
ske
jmp fail
;; reload to Br = 1
lbi 1, 0
jsr init_bd
;;
aisc 1 << 2
xds 1 ; 1, 3 = 0x7
;;
cba
xds 1 ; 0, 2 = 0x2
;;
cba
aisc 1 << 2
xds 1 ; 1, 1 = 0x5
;;
cba
xds 1 ; 0, 0 = 0x0
jmp fail
;; check remaining Br == 1
clra
cab
aisc 0x4
ske
jmp fail
 
;;
;; xor 1 in digit 2 & 3
;;
lbi 2, 0
jsr init_bd
;;
aisc 2 << 2
xds 1 ; 2, 3 = 0xb
;;
cba
aisc 3 << 2
xds 1 ; 3, 2 = 0xe
;;
cba
aisc 2 << 2
xds 1 ; 2, 1 = 0x9
;;
cba
aisc 3 << 2
xds 1 ; 3, 0 = 0xc
jmp fail
;; check remaining Br == 2
clra
cab
aisc 0x7 ; RAM init value
ske
jmp fail
;; reload to Br = 3
lbi 3, 0
jsr init_bd
;;
aisc 3 << 2
xds 1 ; 3, 3 = 0xf
;;
cba
aisc 2 << 2
xds 1 ; 2, 2 = 0xa
;;
cba
aisc 3 << 2
xds 1 ; 3, 1 = 0xd
;;
cba
aisc 2 << 2
xds 1 ; 2, 0 = 0x8
jmp fail
;; check remaining Br == 3
clra
cab
aisc 0xc
ske
jmp fail
 
jsr check_ram
 
 
;; *******************************************************************
;; XOR 2
jsr init_ram
 
;;
;; xor 2 in digit 0 & 2
;;
lbi 0, 0
jsr init_bd
;;
xds 2 ; 0, 3 = 0x3
;;
cba
aisc 2 << 2
xds 2 ; 2, 2 = 0xa
;;
cba
xds 2 ; 0, 1 = 0x1
;;
cba
aisc 2 << 2
xds 2 ; 2, 0 = 0x8
jmp fail
;; check remainig Br == 0
clra
cab
aisc 0xf ; RAM init value
ske
jmp fail
;; reload to Br == 2
lbi 2, 0
jsr init_bd
;;
aisc 2 << 2
xds 2 ; 2, 3 = 0xb
;;
cba
xds 2 ; 0, 2 = 0x2
;;
cba
aisc 2 << 2
xds 2 ; 2, 1 = 0x9
;;
cba
xds 2 ; 0, 0 = 0x0
jmp fail
;; check remainig Br == 2
clra
cab
aisc 0x8
ske
jmp fail
 
;;
;; xor 2 in digit 1 & 3
;;
lbi 1, 0
jsr init_bd
;;
aisc 1 << 2
xds 2 ; 1, 3 = 0x7
;;
cba
aisc 3 << 2
xds 2 ; 3, 2 = 0xe
;;
cba
aisc 1 << 2
xds 2 ; 1, 1 = 0x5
;;
cba
aisc 3 << 2
xds 2 ; 3, 0 = 0xc
jmp fail
;; check remaining Br == 1
clra
cab
aisc 0xc ; RAM init value
ske
jmp fail
;; reload to Br = 3
lbi 3, 0
jsr init_bd
;;
aisc 3 << 2
xds 2 ; 3, 3 = 0xf
;;
cba
aisc 1 << 2
xds 2 ; 1, 2 = 0x6
;;
cba
aisc 3 << 2
xds 2 ; 3, 1 = 0xd
;;
cba
aisc 1 << 2
xds 2 ; 1, 0 = 0x4
jmp fail
;; check remaining Br == 3
clra
cab
aisc 0xc
ske
jmp fail
 
jsr check_ram
;; *******************************************************************
;; XOR 3
jsr init_ram
 
;;
;; xor 3 in digit 0 & 3
;;
lbi 0, 0
jsr init_bd
;;
xds 3 ; 0, 3 = 0x3
;;
cba
aisc 3 << 2
xds 3 ; 3, 2 = 0xe
;;
cba
xds 3 ; 0, 1 = 0x1
;;
cba
aisc 3 << 2
xds 3 ; 3, 0 = 0xc
jmp fail
;; check remaining BR == 0
clra
cab
aisc 0xf ; RAM init value
ske
jmp fail
;; reload BR = 3
lbi 3, 0
jsr init_bd
;;
aisc 3 << 2
xds 3 ; 3, 3 = 0xf
;;
cba
xds 3 ; 0, 2 = 0x2
;;
cba
aisc 3 << 2
xds 3 ; 3, 1 = 0xb
;;
cba
xds 3 ; 0, 0 = 0x0
jmp fail
;; check remaining BR == 3
clra
cab
aisc 0xc
ske
jmp fail
 
;;
;; xor 3 in digit 1 & 2
;;
lbi 1, 0
jsr init_bd
;;
aisc 1 << 2
xds 3 ; 1, 3 = 0x7
;;
cba
aisc 2 << 2
xds 3 ; 2, 2 = 0xa
;;
cba
aisc 1 << 2
xds 3 ; 1, 1 = 0x5
;;
cba
aisc 2 << 2
xds 3 ; 2, 0 = 0x8
jmp fail
;; check remaining BR == 1
clra
cab
aisc 0xc ; RAM init value
ske
jmp fail
;; reload BR = 2
lbi 2, 0
jsr init_bd
;;
aisc 2 << 2
xds 3 ; 2, 3 = 0xb
;;
cba
aisc 1 << 2
xds 3 ; 1, 2 = 0x6
;;
cba
aisc 2 << 2
xds 3 ; 2, 1 = 0x9
;;
cba
aisc 1 << 2
xds 3 ; 1, 0 = 0x5
jmp fail
;; check remaining BR == 2
clra
cab
aisc 0x8
ske
jmp fail
 
jsr check_ram
 
 
jmp pass
 
org 0x158
 
;; initializes Bd to 3
init_bd:
clra
aisc 0x3
cab
ret
 
 
;; preload digits of each data register
init_ram:
;; Br = 0
lbi 0, 0
stii 0xf
stii 0xe
stii 0xd
stii 0xb
;; Br = 1
lbi 1, 0
stii 0xc
stii 0xa
stii 0x9
stii 0x8
;; Br = 2
lbi 2, 0
stii 0x7
stii 0x6
stii 0x5
stii 0x4
;; Br = 3
lbi 3, 0
stii 0x3
stii 0x2
stii 0x1
stii 0x0
ret
 
 
check MACRO dig
;; check dig, 0
clra
IF dig > 0
aisc dig << 2
ENDIF
ske
jmp fail
;; check 0, 1
clra
aisc 0x1
cab
IF dig > 0
aisc dig << 2
ENDIF
ske
jmp fail
;; check 0, 2
clra
aisc 0x2
cab
IF dig > 0
aisc dig << 2
ENDIF
ske
jmp fail
;; check 0, 3
clra
aisc 0x3
cab
IF dig > 0
aisc dig << 2
ENDIF
ske
jmp fail
ENDM
 
;; check contents of RAM entries
check_ram:
;; check digit 0
lbi 0, 0
check 0
 
;; check digit 1
lbi 1, 0
check 1
 
;; check digit 2
lbi 2, 0
check 2
 
;; check digit 3
lbi 3, 0
check 3
 
ret
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/ld/test.asm
0,0 → 1,256
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the LD instruction.
;; Br can't be observed directly via XABR on COP41x.
;; Therefore, Br address os observed indirectly via memory content.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload for digit of each data register
;; Br = 0 -> data = 0x1
lbi 0x0, 0x0
stii 0x1
;; Br = 1 -> data = 0x2
lbi 0x1, 0x0
stii 0x2
;; Br = 2 -> data = 0x3
lbi 0x2, 0x0
stii 0x3
;; Br = 3 -> data = 0x4
lbi 0x3, 0x0
stii 0x4
 
;; *******************************************************************
;; XOR 0
;;
;; Br(0) xor 0
lbi 0x0, 0x0
ld 0x0
ske ; expect no change of Br
jmp fail
 
;; Br(1) xor 0
lbi 0x1, 0x0
ld 0x0
ske ; expect no change of Br
jmp fail
 
;; Br(2) xor 0
lbi 0x2, 0x0
ld 0x0
ske ; expect no change of Br
jmp fail
 
;; Br(3) xor 0
lbi 0x3, 0x0
ld 0x0
ske ; expect no change of Br
jmp fail
 
 
;; *******************************************************************
;; XOR 1
;;
;; Br(0) xor 1
lbi 0x0, 0x0
ld 0x1
xad 3, 15 ; save load data
;; expect 0x2 at current Br
clra
aisc 0x2
ske
jmp fail
;; expect 0x1 in accumulator
xad 3, 15 ; restore load data
aisc 0x1
ske
jmp fail
 
;; Br(1) xor 1
lbi 0x1, 0x0
ld 0x1
xad 3, 15 ; save load data
;; expect 0x1 at current Br
clra
aisc 0x1
ske
jmp fail
;; expect 0x2 in accumulator
xad 3, 15 ; restore load data
aisc 0xf
nop
ske
jmp fail
 
;; Br(2) xor 1
lbi 0x2, 0x0
ld 0x1
xad 3, 15 ; save load data
;; expect 0x4 at current Br
clra
aisc 0x4
ske
jmp fail
;; expect 0x3 in accumulator
xad 3, 15 ; restore load data
aisc 0x1
nop
ske
jmp fail
 
;; Br(3) xor 1
lbi 0x3, 0x0
ld 0x1
xad 3, 15 ; save load data
;; expect 0x3 at current Br
clra
aisc 0x3
ske
jmp fail
;; expect 0x4 in accumulator
xad 3, 15 ; restore load data
aisc 0xf
nop
ske
jmp fail
 
;; *******************************************************************
;; XOR 2
;;
;; Br(0) xor 2
lbi 0x0, 0x0
ld 0x2
xad 3, 15 ; save load data
;; expect 0x3 at current Br
clra
aisc 0x3
ske
jmp fail
;; expect 0x1 in accumulator
xad 3, 15 ; restore load data
aisc 0x2
ske
jmp fail
 
;; Br(1) xor 2
lbi 0x1, 0x0
ld 0x2
xad 3, 15 ; save load data
;; expect 0x4 at current Br
clra
aisc 0x4
ske
jmp fail
;; expect 0x2 in accumulator
xad 3, 15 ; restore load data
aisc 0x2
ske
jmp fail
 
;; Br(2) xor 2
lbi 0x2, 0x0
ld 0x2
xad 3, 15 ; save load data
;; expect 0x1 at current Br
clra
aisc 0x1
ske
jmp fail
;; expect 0x3 in accumulator
xad 3, 15 ; restore load data
aisc 0xe
nop
ske
jmp fail
 
;; Br(3) xor 2
lbi 0x3, 0x0
ld 0x2
xad 3, 15 ; save load data
;; expect 0x2 at current Br
clra
aisc 0x2
ske
jmp fail
;; expect 0x4 in accumulator
xad 3, 15 ; restore load data
aisc 0xe
nop
ske
jmp fail
 
;; *******************************************************************
;; XOR 3
;;
;; Br(0) xor 3
lbi 0x0, 0x0
ld 0x3
xad 3, 15 ; save load data
;; expect 0x4 at current Br
clra
aisc 0x4
ske
jmp fail
;; expect 0x1 in accumulator
xad 3, 15 ; restore load data
aisc 0x3
ske
jmp fail
 
;; Br(1) xor 3
lbi 0x1, 0x0
ld 0x3
xad 3, 15 ; save load data
;; expect 0x3 at current Br
clra
aisc 0x3
ske
jmp fail
;; expect 0x2 in accumulator
xad 3, 15 ; restore load data
aisc 0x1
ske
jmp fail
 
;; Br(2) xor 3
lbi 0x2, 0x0
ld 0x3
xad 3, 15 ; save load data
;; expect 0x2 at current Br
clra
aisc 0x2
ske
jmp fail
;; expect 0x3 in accumulator
xad 3, 15 ; restore load data
aisc 0xf
nop
ske
jmp fail
 
;; Br(3) xor 3
lbi 0x3, 0x0
ld 0x3
xad 3, 15 ; save load data
;; expect 0x1 at current Br
clra
aisc 0x1
ske
jmp fail
;; expect 0x4 in accumulator
xad 3, 15 ; restore load data
aisc 0xd
nop
ske
jmp fail
 
 
jmp pass
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/jid/test.asm
0,0 → 1,84
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the JID instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
aisc 0x6
x 0x0
clra
aisc 0x8
jid
jmp fail
 
goon_1:
x 0x0
aisc 0x4
nop
x 0x0
jid
jmp fail
 
goon_2:
x 0x0
aisc 0x2
x 0x0
jid
jmp fail
goon_3:
x 0x0
aisc 0x1
x 0x0
jid
jmp fail
 
goon_4:
 
jmp pass
 
 
loc_fail:
jmp fail
 
org 0x080
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db goon_1
db loc_fail
db loc_fail
db loc_fail
db goon_2
db loc_fail
db goon_3
db goon_4
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
db loc_fail
 
jmp fail
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/skc/test.asm
0,0 → 1,25
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the SKC instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
skc
jmp ok_no_c
jmp fail
 
ok_no_c:
sc
skc
jmp fail
 
jmp pass
 
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/ske/test.asm
0,0 → 1,60
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the SKE instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; test 0 == 0
x 0x0
clra
ske
jmp fail
 
;; test 5 == 5
clra
aisc 0x5
x 0x0
ld 0x0
ske
jmp fail
 
;; test a == a
clra
aisc 0xa
x 0x0
ld 0x0
ske
jmp fail
 
;; test f == f
clra
aisc 0xf
x 0x0
ld 0x0
ske
jmp fail
 
;; test 0 == f
clra
ske
jmp ok_0_ne_f
jmp fail
 
ok_0_ne_f:
;; test f == 0
x 0x0
ske
jmp ok_f_ne_0
jmp fail
 
ok_f_ne_0:
jmp pass
 
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/lbi_short/test.asm
0,0 → 1,299
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the LBI instruction (single byte).
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;;
;; initialize 4 x 8 RAM digits
;;
 
;; register 0
stii 0x0
aisc 0x9
cab
stii 0x1
stii 0x2
stii 0x3
stii 0x4
stii 0x5
stii 0x6
stii 0x7
 
;; register 1
ld 0x1
stii 0x4
cba
aisc 0x8
cab
stii 0x5
stii 0x6
stii 0x7
stii 0x8
stii 0x9
stii 0xa
stii 0xb
 
;; register 2
ld 0x3
stii 0x8
cba
aisc 0x8
cab
stii 0x9
stii 0xa
stii 0xb
stii 0xc
stii 0xd
stii 0xe
stii 0xf
 
;; register 3
ld 0x1
stii 0xc
cba
aisc 0x8
cab
stii 0xd
stii 0xe
stii 0xf
stii 0x0
stii 0x1
stii 0x2
stii 0x3
 
jmp test_code
 
 
;; subroutine page 2
org 0x80
lbi_call_reg0:
lbi 0, 0
lbi 0, 9
lbi 0, 10
lbi 0, 11
lbi 0, 12
lbi 0, 13
lbi 0, 14
lbi 0, 15
ret
lbi_call_reg1:
lbi 1, 0
lbi 1, 9
lbi 1, 10
lbi 1, 11
lbi 1, 12
lbi 1, 13
lbi 1, 14
lbi 1, 15
ret
lbi_call_reg2:
lbi 2, 0
lbi 2, 9
lbi 2, 10
lbi 2, 11
lbi 2, 12
lbi 2, 13
lbi 2, 14
lbi 2, 15
ret
lbi_call_reg3:
lbi 3, 0
lbi 3, 9
lbi 3, 10
lbi 3, 11
lbi 3, 12
lbi 3, 13
lbi 3, 14
lbi 3, 15
ret
 
 
org 0x100
 
;;
;; now test each register digit
;;
test_code:
 
;; register 0
;; digit 0
clra
jsrp lbi_call_reg0 + 0
ske
jmp fail
;; digit 9
aisc 0x1
jsrp lbi_call_reg0 + 1
ske
jmp fail
;; digit 10
aisc 0x1
jsrp lbi_call_reg0 + 2
ske
jmp fail
;; digit 11
aisc 0x1
jsrp lbi_call_reg0 + 3
ske
jmp fail
;; digit 12
aisc 0x1
jsrp lbi_call_reg0 + 4
ske
jmp fail
;; digit 13
aisc 0x1
jsrp lbi_call_reg0 + 5
ske
jmp fail
;; digit 14
aisc 0x1
jsrp lbi_call_reg0 + 6
ske
jmp fail
;; digit 15
aisc 0x1
jsrp lbi_call_reg0 + 7
ske
jmp fail
 
;; register 1
;; digit 0
clra
aisc 0x4
jsrp lbi_call_reg1 + 0
ske
jmp fail
;; digit 9
aisc 0x1
jsrp lbi_call_reg1 + 1
ske
jmp fail
;; digit 10
aisc 0x1
jsrp lbi_call_reg1 + 2
ske
jmp fail
;; digit 11
aisc 0x1
jsrp lbi_call_reg1 + 3
ske
jmp fail
;; digit 12
aisc 0x1
jsrp lbi_call_reg1 + 4
ske
jmp fail
;; digit 13
aisc 0x1
jsrp lbi_call_reg1 + 5
ske
jmp fail
;; digit 14
aisc 0x1
jsrp lbi_call_reg1 + 6
ske
jmp fail
;; digit 15
aisc 0x1
jsrp lbi_call_reg1 + 7
ske
jmp fail
 
;; register 2
;; digit 0
clra
aisc 0x8
jsrp lbi_call_reg2 + 0
ske
jmp fail
;; digit 9
aisc 0x1
jsrp lbi_call_reg2 + 1
ske
jmp fail
;; digit 10
aisc 0x1
jsrp lbi_call_reg2 + 2
ske
jmp fail
;; digit 11
aisc 0x1
jsrp lbi_call_reg2 + 3
ske
jmp fail
;; digit 12
aisc 0x1
jsrp lbi_call_reg2 + 4
ske
jmp fail
;; digit 13
aisc 0x1
jsrp lbi_call_reg2 + 5
ske
jmp fail
;; digit 14
aisc 0x1
jsrp lbi_call_reg2 + 6
ske
jmp fail
;; digit 15
aisc 0x1
jsrp lbi_call_reg2 + 7
ske
jmp fail
 
;; register 3
;; digit 0
clra
aisc 0xc
jsrp lbi_call_reg3 + 0
ske
jmp fail
;; digit 9
aisc 0x1
jsrp lbi_call_reg3 + 1
ske
jmp fail
;; digit 10
aisc 0x1
jsrp lbi_call_reg3 + 2
ske
jmp fail
;; digit 11
aisc 0x1
jsrp lbi_call_reg3 + 3
ske
jmp fail
;; digit 12
aisc 0x1
nop
jsrp lbi_call_reg3 + 4
ske
jmp fail
;; digit 13
aisc 0x1
jsrp lbi_call_reg3 + 5
ske
jmp fail
;; digit 14
aisc 0x1
jsrp lbi_call_reg3 + 6
ske
jmp fail
;; digit 15
aisc 0x1
jsrp lbi_call_reg3 + 7
ske
jmp fail
 
 
jmp pass
 
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/jmp/test.asm
0,0 → 1,49
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the JMP instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
jmp block_0
 
 
org 0x00d
jmp fail
block_0:
jmp block_1
jmp fail
 
org 0x10f
jmp fail
block_1:
IF MOMCPUNAME <> "COP410"
jmp block_2
ELSEIF
jmp pass
ENDIF
jmp fail
 
org 0x120
include "pass_fail.asm"
 
 
IF MOMCPUNAME <> "COP410"
 
org 0x21f
jmp fail
block_2:
jmp block_3
jmp fail
 
org 0x32f
jmp fail
block_3:
jmp pass
jmp fail
 
ENDIF
/tags/rel_1_1/sw/verif/black_box/add/test.asm
0,0 → 1,146
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the ADD instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload M0 with 0x1
rmb 0x3
rmb 0x2
rmb 0x1
smb 0x0
 
;; test a0 + m1
add
ske
jmp fail
 
;; test a1 + m1
add
aisc 16+1 - 2
nop
ske
jmp fail
 
aisc 2-1
;; test a2 + m1
add
aisc 16+1 - 3
nop
ske
jmp fail
 
aisc 3-1
;; test a3 + m1
add
aisc 16+1 - 4
nop
ske
jmp fail
 
aisc 4-1
;; test a4 + m1
add
aisc 16+1 - 5
nop
ske
jmp fail
 
aisc 5-1
;; test a5 + m1
add
aisc 16+1 - 6
nop
ske
jmp fail
 
aisc 6-1
;; test a6 + m1
add
aisc 16+1 - 7
nop
ske
jmp fail
 
aisc 7-1
;; test a7 + m1
add
aisc 16+1 - 8
nop
ske
jmp fail
 
aisc 8-1
;; test a8 + m1
add
aisc 16+1 - 9
nop
ske
jmp fail
 
aisc 9-1
;; test a9 + m1
add
aisc 16+1 - 10
nop
ske
jmp fail
 
aisc 10-1
;; test a10 + m1
add
aisc 16+1 - 11
nop
ske
jmp fail
 
aisc 11-1
;; test a11 + m1
add
aisc 16+1 - 12
nop
ske
jmp fail
 
aisc 12-1
;; test a12 + m1
add
aisc 16+1 - 13
nop
ske
jmp fail
 
aisc 13-1
;; test a13 + m1
add
aisc 16+1 - 14
nop
ske
jmp fail
 
aisc 14-1
;; test a14 + m1
add
aisc 16+1 - 15
nop
ske
jmp fail
 
aisc 15-1
;; test a15 + m1
add
aisc 16+1 - 16
nop
ske
jmp fail
 
 
jmp pass
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/retsk/test.asm
0,0 → 1,142
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the RETSK instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
page_0:
jsr target
jmp fail
jmp page_1
 
org 0x045 - 2
jmp fail
page_1:
jsr target
jmp fail
jmp page_2
 
org 0x09a - 2
jmp fail
page_2:
jsr target
jmp fail
jmp page_3
 
org 0x0dd - 2
jmp fail
page_3:
jsr target
jmp fail
jmp page_4
 
org 0x130 - 2
jmp fail
page_4:
jsr target
jmp fail
jmp page_5
 
org 0x164 - 2
jmp fail
page_5:
jsr target
jmp fail
jmp page_6
 
org 0x1ac - 2
jmp fail
page_6:
jsr target
jmp fail
jmp page_7
 
org 0x1e1 - 2
jmp fail
page_7:
jsr target
jmp fail
IF MOMCPUNAME <> "COP410"
jmp page_8
ELSEIF
jmp pass
ENDIF
 
 
;; *******************************************************************
;; Subroutine target, execute RET
;;
org 0x012 - 2
jmp fail
target:
retsk
;;
;; *******************************************************************
 
include "pass_fail.asm"
 
 
IF MOMCPUNAME <> "COP410"
 
org 0x205 - 2
jmp fail
page_8:
jsr target
jmp fail
jmp page_9
 
org 0x246 - 2
jmp fail
page_9:
jsr target
jmp fail
jmp page_a
 
org 0x270 - 2
jmp fail
page_a:
jsr target
jmp fail
jmp page_b
 
org 0x2f0 - 2
jmp fail
page_b:
jsr target
jmp fail
jmp page_c
 
org 0x311 - 2
jmp fail
page_c:
jsr target
jmp fail
jmp page_d
 
org 0x35c - 2
jmp fail
page_d:
jsr target
jmp fail
jmp page_e
 
org 0x3b3 - 2
jmp fail
page_e:
jsr target
jmp fail
jmp page_f
 
org 0x3c8 - 2
jmp fail
page_f:
jsr target
jmp fail
jmp pass
 
ENDIF
/tags/rel_1_1/sw/verif/black_box/cab_cba/test.asm
0,0 → 1,192
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the CAB & CBA instructions.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload data memory with mismtach values
stii 0xf
stii 0xe
stii 0xd
stii 0xc
stii 0xb
stii 0xa
stii 0x9
stii 0x8
stii 0x7
stii 0x6
stii 0x5
stii 0x4
stii 0x3
stii 0x2
stii 0x1
stii 0x0
 
;; test value 0
cab
x 0x0
cba
ske
jmp fail
 
;; test value 1
clra
aisc 0x1
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 2
clra
aisc 0x2
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 3
clra
aisc 0x3
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 4
clra
aisc 0x4
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 5
clra
aisc 0x5
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 6
clra
aisc 0x6
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 7
clra
aisc 0x7
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 8
clra
aisc 0x8
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 9
clra
aisc 0x9
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 10
clra
aisc 0xa
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 11
clra
aisc 0xb
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 12
clra
aisc 0xc
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 13
clra
aisc 0xd
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 14
clra
aisc 0xe
nop
cab
x 0x0
cba
ske
jmp fail
 
;; test value 15
clra
aisc 0xf
nop
cab
x 0x0
cba
ske
jmp fail
 
 
jmp pass
 
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/ret/test.asm
0,0 → 1,126
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the RET instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
page_0:
jsr target
jmp page_1
 
org 0x045 - 2
jmp fail
page_1:
jsr target
jmp page_2
 
org 0x09a - 2
jmp fail
page_2:
jsr target
jmp page_3
 
org 0x0dd - 2
jmp fail
page_3:
jsr target
jmp page_4
 
org 0x130 - 2
jmp fail
page_4:
jsr target
jmp page_5
 
org 0x164 - 2
jmp fail
page_5:
jsr target
jmp page_6
 
org 0x1ac - 2
jmp fail
page_6:
jsr target
jmp page_7
 
org 0x1e1 - 2
jmp fail
page_7:
jsr target
IF MOMCPUNAME <> "COP410"
jmp page_8
ELSEIF
jmp pass
ENDIF
 
 
;; *******************************************************************
;; Subroutine target, execute RET
;;
org 0x012 - 2
jmp fail
target:
ret
;;
;; *******************************************************************
 
include "pass_fail.asm"
 
 
IF MOMCPUNAME <> "COP410"
 
org 0x205 - 2
jmp fail
page_8:
jsr target
jmp page_9
 
org 0x246 - 2
jmp fail
page_9:
jsr target
jmp page_a
 
org 0x270 - 2
jmp fail
page_a:
jsr target
jmp page_b
 
org 0x2f0 - 2
jmp fail
page_b:
jsr target
jmp page_c
 
org 0x311 - 2
jmp fail
page_c:
jsr target
jmp page_d
 
org 0x35c - 2
jmp fail
page_d:
jsr target
jmp page_e
 
org 0x3b3 - 2
jmp fail
page_e:
jsr target
jmp page_f
 
org 0x3c8 - 2
jmp fail
page_f:
jsr target
jmp pass
 
ENDIF
/tags/rel_1_1/sw/verif/black_box/jsr/test.asm
0,0 → 1,130
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the JSR instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload data memory with jsr target values
stii 0x0
stii 0x1
stii 0x2
stii 0x3
stii 0x4
stii 0x5
stii 0x6
stii 0x7
 
cab
jsr target_0
;;
aisc 0x1
cab
clra
jsr target_1
;;
aisc 0x2
cab
clra
jsr target_2
;;
aisc 0x3
cab
clra
jsr target_3
;;
IF MOMCPUNAME <> "COP410"
aisc 0x4
cab
clra
jsr target_4
;;
aisc 0x5
cab
clra
jsr target_5
;;
aisc 0x6
cab
clra
jsr target_6
;;
aisc 0x7
cab
clra
jsr target_7
ENDIF
 
jmp pass
 
;; subroutine targets
org 0x06f
target_0:
ske
jmp fail
ret
;;
org 0x09e
target_1:
aisc 0x1
ske
jmp fail
clra
ret
;;
org 0x12d
target_2:
aisc 0x2
ske
jmp fail
clra
ret
;;
org 0x13c
target_3:
aisc 0x3
ske
jmp fail
clra
ret
;;
IF MOMCPUNAME <> "COP410"
org 0x24b
target_4:
aisc 0x4
ske
jmp fail
clra
ret
;;
org 0x2da
target_5:
aisc 0x5
ske
jmp fail
clra
ret
;;
org 0x369
target_6:
aisc 0x6
ske
jmp fail
clra
ret
;;
org 0x378
target_7:
aisc 0x7
ske
jmp fail
clra
ret
ENDIF
 
org 0x1d0
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/comp/test.asm
0,0 → 1,32
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the COMP instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload M0 with 0x8
smb 0x3
rmb 0x2
rmb 0x1
rmb 0x0
 
ld 0x0
;; test for 8 in a
ske
jmp fail
 
;; test for complementing all bits in a
comp
aisc 0x1
ske
jmp fail
 
jmp pass
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/xis/test.asm
0,0 → 1,411
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the XIS instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
 
;; *******************************************************************
;; XOR 0
jsr init_ram
 
;; xor 0 in digit 0
lbi 0, 14
;;
cba
comp
xis 0 ; 0, 0xe = 0x1
;;
cba
comp
xis 0 ; 0, 0xf = 0x0
jmp fail
 
;; xor 0 in digit 1
lbi 1, 14
;;
cba
comp
aisc 1 << 2
xis 0 ; 1, 0xe = 0x5
;;
cba
comp
aisc 1 << 2
xis 0 ; 1, 0xf = 0x4
jmp fail
 
;; xor 0 in digit 2
lbi 2, 14
;;
cba
comp
aisc 2 << 2
xis 0 ; 2, 0xe = 0x9
;;
cba
comp
aisc 2 << 2
xis 0 ; 2, 0xf = 0x8
jmp fail
 
;; xor 0 in digit 3
lbi 3, 14
;;
cba
comp
aisc 3 << 2
xis 0 ; 3, 0xe = 0xd
;;
cba
comp
aisc 3 << 2
xis 0 ; 3, 0xf = 0xc
jmp fail
 
jsr check_ram
 
 
;; *******************************************************************
;; XOR 1
jsr init_ram
 
;;
;; xor 1 in digit 0 & 1
;;
lbi 0, 14
;;
cba
comp
xis 1 ; 0, 0xe = 0x1
;;
cba
comp
aisc 1 << 2
xis 1 ; 1, 0xf = 0x4
jmp fail
;; check remaining Br == 0
clra
cab
aisc 0x3 ; marker value
ske
jmp fail
;; reload to Br = 1
lbi 1, 14
;;
cba
comp
aisc 1 << 2
xis 1 ; 1, 0xe = 0x5
;;
cba
comp
xis 1 ; 0, 0xf = 0x0
jmp fail
;; check remaining Br == 1
clra
cab
aisc 0x7 ; marker value
ske
jmp fail
jmp pass
 
;;
;; xor 1 in digit 2 & 3
;;
lbi 2, 14
;;
cba
comp
aisc 2 << 2
xis 1 ; 2, 0xe = 0x9
;;
cba
comp
aisc 3 << 2
xis 1 ; 3, 0xf = 0xc
jmp fail
;; check remaining Br == 2
clra
cab
aisc 0xb ; marker value
ske
jmp fail
;; reload to Br = 3
lbi 3, 14
;;
cba
comp
aisc 3 << 2
xis 1 ; 3, 0xe = 0xc
;;
cba
comp
aisc 2 << 2
xis 1 ; 2, 0xf = 0x8
jmp fail
;; check remaining BR == 3
clra
cab
aisc 0xf ; marker value
ske
jmp fail
 
jsr check_ram
 
 
;; *******************************************************************
;; XOR 2
jsr init_ram
 
;;
;; xor 2 in digit 0 & 2
;;
lbi 0, 14
;;
cba
comp
xis 2 ; 0, 0xe = 0x1
;;
cba
comp
aisc 2 << 2
xis 2 ; 2, 0xf = 0x8
jmp fail
;; check remainig Br == 0
clra
cab
aisc 0xb ; marker value
ske
jmp fail
;; reload to Br == 2
lbi 2, 14
;;
cba
comp
aisc 2 << 2
xis 2 ; 2, 0xe = 0x9
;;
cba
comp
xis 2 ; 0, 0xf = 0x0
jmp fail
;; check remainig Br == 2
clra
cab
aisc 0x3 ; marker value
ske
jmp fail
 
;;
;; xor 2 in digit 1 & 3
;;
lbi 1, 14
;;
cba
comp
aisc 1 << 2
xis 2 ; 1, 0xe = 0x5
;;
cba
comp
aisc 3 << 2
xis 2 ; 3, 0xf = 0xc
jmp fail
;; check remaining Br == 1
clra
cab
aisc 0x7 ; marker value
ske
jmp fail
;; reload to Br = 3
lbi 3, 14
;;
cba
comp
aisc 3 << 2
xis 2 ; 3, 0xe = 0xd
;;
cba
comp
aisc 1 << 2
xis 2 ; 1, 0xf = 0x4
jmp fail
;; check remaining Br == 3
clra
cab
aisc 0xf ; marker value
ske
jmp fail
 
jsr check_ram
;; *******************************************************************
;; XOR 3
jsr init_ram
 
;;
;; xor 3 in digit 0 & 3
;;
lbi 0, 14
;;
cba
comp
xis 3 ; 0, 0xe = 0x1
;;
cba
comp
aisc 3 << 2
xis 3 ; 3, 0xf = 0xc
jmp fail
;; check remaining BR == 0
clra
cab
aisc 0x3 ; marker value
ske
jmp fail
;; reload BR = 3
lbi 3, 14
;;
cba
comp
aisc 3 << 2
xis 3 ; 3, 0xe = 0xd
;;
cba
comp
xis 3 ; 0, 0xf = 0x0
jmp fail
;; check remaining BR == 3
clra
cab
aisc 0xf ; marker value
ske
jmp fail
 
;;
;; xor 3 in digit 1 & 2
;;
lbi 1, 14
;;
cba
comp
aisc 1 << 2
xis 3 ; 1, 0xe = 0x5
;;
cba
comp
aisc 2 << 2
xis 3 ; 2, 0xf = 0x8
jmp fail
;; check remaining BR == 1
clra
cab
aisc 0x7 ; marker value
ske
jmp fail
;; reload BR = 2
lbi 2, 14
;;
cba
comp
aisc 2 << 2
xis 3 ; 2, 0xe = 0x9
;;
cba
comp
aisc 1 << 2
xis 3 ; 1, 0xf = 0x4
jmp fail
;; check remaining BR == 2
clra
cab
aisc 0xb ; marker value
ske
jmp fail
 
jsr check_ram
 
 
jmp pass
 
org 0x150
 
;; preload digits of each data register
init_ram:
;; Br = 0
lbi 0, 14
stii 0x3
stii 0x2
stii 0x3 ; marker value
;; Br = 1
lbi 1, 14
stii 0x7
stii 0x6
stii 0x7 ; marker value
;; Br = 2
lbi 2, 14
stii 0xb
stii 0xa
stii 0xb ; marker value
;; Br = 3
lbi 3, 14
stii 0xf
stii 0xe
stii 0xf ; marker value
ret
 
 
check MACRO dig
;; check dig, 14
clra
aisc 0xe
cab
comp
IF dig > 0
aisc dig << 2
ENDIF
ske
jmp fail
;; check 0, 15
clra
aisc 0xf
cab
comp
IF dig > 0
aisc dig << 2
ENDIF
ske
jmp fail
ENDM
 
;; check contents of RAM entries
check_ram:
;; check digit 0
lbi 0, 0
check 0
 
;; check digit 1
lbi 1, 0
check 1
 
;; check digit 2
lbi 2, 0
check 2
 
;; check digit 3
lbi 3, 0
check 3
 
ret
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/x/test.asm
0,0 → 1,379
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the X instruction.
;; Br can't be observed directly via XABR on COP41x.
;; Therefore, Br address is observed indirectly via memory content.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload a digit of each data register
;; Br = 0 -> data = 0x1
lbi 0, 0
stii 0x1
;; Br = 1 -> data = 0x2
lbi 1, 0
stii 0x2
;; Br = 2 -> data = 0x3
lbi 2, 0
stii 0x3
;; Br = 3 -> data = 0x4
lbi 3, 0
stii 0x4
 
 
;; *******************************************************************
;; XOR 0
;;
;; Br(0) xor 0
clra
aisc 0xf
lbi 0, 0
x 0x0
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x0
;; expect 0x1 in M
clra
aisc 0x1
ske
jmp fail
 
;; Br(1) xor 0
clra
aisc 0xf
lbi 1, 0
x 0x0
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x0
;; expect 0x2 in M
clra
aisc 0x2
ske
jmp fail
 
;; Br(2) xor 0
clra
aisc 0xf
lbi 2, 0
x 0x0
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x0
;; expect 0x3 in M
clra
aisc 0x3
ske
jmp fail
 
;; Br(3) xor 0
clra
aisc 0xf
lbi 3, 0
x 0x0
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x0
;; expect 0x4 in M
clra
aisc 0x4
ske
jmp fail
 
 
clra
aisc 0xf
;; *******************************************************************
;; XOR 1
;;
;; Br(0) & Br(1) xor 1
lbi 0, 0
x 0x1 ; Br(0)=0xf, A=0x1, now Br(1)
xad 3, 15 ; save A
;; expect 0x2 in M
clra
aisc 0x2
ske
jmp fail
xad 3, 15 ; restore A
x 0x1 ; Br(1)=0x1, A=0x2, now Br(0)
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x1 ; Br(0)=0x2, A=0xf, now Br(1)
xad 3, 15 ; save A
;; expect 0x1 in M
clra
aisc 0x1
ske
jmp fail
xad 3, 15 ; restore A
;; swap all back
x 0x1 ; Br(1)=0xf, A=0x1, now Br(0)
x 0x1 ; Br(0)=0x1, A=0x2, now Br(1)
x 0x1 ; Br(1)=0x2, A=0xf, now Br(0)
;; same memory & accumulator content as before
 
;; Br(2) & Br(3) xor 1
lbi 2, 0
x 0x1 ; Br(2)=0xf, A=0x3, now Br(3)
xad 3, 15 ; save A
;; expect 0x4 in M
clra
aisc 0x4
ske
jmp fail
xad 3, 15 ; restore A
x 0x1 ; Br(3)=0x3, A=0x4, now Br(2)
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x1 ; Br(2)=0x4, A=0xf, now Br(3)
xad 3, 15 ; save A
;; expect 0x3 in M
clra
aisc 0x3
ske
jmp fail
xad 3, 15 ; restore A
;; swap all back
x 0x1 ; Br(3)=0xf, A=0x3, now Br(2)
x 0x1 ; Br(2)=0x3, A=0x4, now Br(3)
x 0x1 ; Br(3)=0x4, A=0xf, now Br(2)
;; same memory & accumulator content as before
 
;; now check that all
clra
lbi 0, 0
aisc 0x1
ske ; Br(0) == 1 ?
jmp fail
lbi 1, 0
aisc 0x1
ske ; Br(1) == 2 ?
jmp fail
lbi 2, 0
aisc 0x1
ske ; Br(2) == 3 ?
jmp fail
lbi 3, 0
aisc 0x1
ske ; Br(3) == 4 ?
jmp fail
 
 
clra
aisc 0xf
;; *******************************************************************
;; XOR 2
;;
;; Br(0) & Br(2) xor 2
lbi 0x0, 0x0
x 0x2 ; Br(0)=0xf, A=0x1, now Br(2)
xad 3, 15 ; save A
;; expect 0x3 in M
clra
aisc 0x3
ske
jmp fail
xad 3, 15 ; restore A
x 0x2 ; Br(2)=0x1, A=0x3, now Br(0)
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x2 ; Br(0)=0x3, A=0xf, now Br(2)
xad 3, 15 ; save A
;; expect 0x1 in M
clra
aisc 0x1
ske
jmp fail
xad 3, 15 ; restore A
;; swap all back
x 0x2 ; Br(2)=0xf, A=0x1, now Br(0)
x 0x2 ; Br(0)=0x1, A=0x3, now Br(2)
x 0x2 ; Br(2)=0x3, A=0xf, now Br(0)
;; same memory & accumulator content as before
 
;; Br(1) & Br(3) xor 2
lbi 0x1, 0x0
x 0x2 ; Br(1)=0xf, A=0x2, now Br(3)
xad 3, 15 ; save A
;; expect 0x4 in M
clra
aisc 0x4
ske
jmp fail
xad 3, 15 ; restore A
x 0x2 ; Br(3)=0x2, A=0x4, now Br(1)
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x2 ; Br(1)=0x4, A=0xf, now Br(3)
xad 3, 15 ; save A
;; expect 0x2 in M
clra
aisc 0x2
ske
jmp fail
xad 3, 15 ; restore A
;; swap all back
x 0x2 ; Br(3)=0xf, A=0x2, now Br(1)
x 0x2 ; Br(1)=0x2, A=0x4, now Br(3)
x 0x2 ; Br(3)=0x4, A=0xf, now Br(1)
;; same memory & accumulator content as before
 
;; now check that all
clra
lbi 0, 0
aisc 0x1
ske ; Br(0) == 1 ?
jmp fail
lbi 1, 0
aisc 0x1
ske ; Br(1) == 2 ?
jmp fail
lbi 2, 0
aisc 0x1
ske ; Br(2) == 3 ?
jmp fail
lbi 3, 0
aisc 0x1
ske ; Br(3) == 4 ?
jmp fail
 
 
clra
aisc 0xf
;; *******************************************************************
;; XOR 3
;;
;; Br(0) & Br(3) xor 3
lbi 0x0, 0x0
x 0x3 ; Br(0)=0xf, A=0x1, now Br(3)
xad 3, 15 ; save A
;; expect 0x4 in M
clra
aisc 0x4
ske
jmp fail
xad 3, 15 ; restore A
x 0x3 ; Br(3)=0x1, A=0x4, now Br(0)
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x3 ; Br(0)=0x4, A=0xf, now Br(3)
xad 3, 15 ; save A
;; expect 0x1 in M
clra
aisc 0x1
ske
jmp fail
xad 3, 15 ; restore A
;; swap all back
x 0x3 ; Br(3)=0xf, A=0x1, now Br(0)
x 0x3 ; Br(0)=0x1, A=0x4, now Br(3)
x 0x3 ; Br(3)=0x4, A=0xf, now Br(0)
;; same memory & accumulator content as before
 
;; Br(1) & Br(2) xor 3
lbi 0x1, 0x0
x 0x3 ; Br(1)=0xf, A=0x2, now Br(2)
xad 3, 15 ; save A
;; expect 0x3 in M
clra
aisc 0x3
ske
jmp fail
xad 3, 15 ; restore A
x 0x3 ; Br(2)=0x2, A=0x3, now Br(1)
xad 3, 15 ; save A
;; expect 0xf in M
clra
aisc 0xf
ske
jmp fail
xad 3, 15 ; restore A
x 0x3 ; Br(1)=0x3, A=0xf, now Br(2)
xad 3, 15 ; save A
;; expect 0x2 in M
clra
aisc 0x2
ske
jmp fail
xad 3, 15 ; restore A
;; swap all back
x 0x3 ; Br(2)=0xf, A=0x2, now Br(1)
x 0x3 ; Br(1)=0x2, A=0x3, now Br(2)
x 0x3 ; Br(2)=0x3, A=0xf, now Br(1)
;; same memory & accumulator content as before
 
;; now check that all
clra
lbi 0, 0
aisc 0x1
ske ; Br(0) == 1 ?
jmp fail
lbi 1, 0
aisc 0x1
ske ; Br(1) == 2 ?
jmp fail
lbi 2, 0
aisc 0x1
ske ; Br(2) == 3 ?
jmp fail
lbi 3, 0
aisc 0x1
ske ; Br(3) == 4 ?
jmp fail
 
jmp pass
org 0x1c0
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/xor/test.asm
0,0 → 1,64
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the XOR instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload M with 5
aisc 0x5
x 0x0
;; preload A with 10
clra
aisc 0xa
;; test a10 xor m5
xor
x 0x0
clra
aisc 0xf
ske
jmp fail
 
;; preload M with 10
clra
aisc 0xa
x 0x0
;; preload A with 5
clra
aisc 0x5
;; test a5 xor m10
xor
x 0x0
clra
aisc 0xf
ske
jmp fail
 
;; M has 15
;; preload A with 0
clra
;; test a0 xor m15
xor
ske
jmp fail
 
;; preload M with 0
clra
x 0x0
;; A now has 15
;; test a15 xor m0
xor
x 0x0
clra
aisc 0xf
ske
jmp fail
 
jmp pass
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/stii/test.asm
0,0 → 1,75
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the STII instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload data memory with jsrp target values
stii 0x0
stii 0x1
stii 0x2
stii 0x3
stii 0x4
stii 0x5
stii 0x6
stii 0x7
 
;; now scan through all 8 locations and check the contents
;; check location 0, data 0
clra
cab
ske
jmp fail
 
;; check location 1, data 1
aisc 0x1
cab
ske
jmp fail
 
;; check location 2, data 2
aisc 0x1
cab
ske
jmp fail
 
;; check location 3, data 3
aisc 0x1
cab
ske
jmp fail
 
;; check location 4, data 4
aisc 0x1
cab
ske
jmp fail
 
;; check location 5, data 5
aisc 0x1
cab
ske
jmp fail
 
;; check location 6, data 6
aisc 0x1
cab
ske
jmp fail
 
;; check location 7, data 7
aisc 0x1
cab
ske
jmp fail
 
 
jmp pass
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/skgz/test.asm
0,0 → 1,72
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the SKGZ instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; output 0x1 on G
aisc 0x1
x 0x0
omg
;; check no skip on 0x1
skgz
jmp ok_1
jmp fail
ok_1:
 
;; output 0x2 on G
clra
aisc 0x2
x 0x0
omg
;; check no skip on 0x2
skgz
jmp ok_2
jmp fail
ok_2:
 
;; output 0x4 on G
clra
aisc 0x4
x 0x0
omg
;; check no skip on 0x4
skgz
jmp ok_4
jmp fail
ok_4:
 
;; output 0x1 on G to break G monitoring sequence
clra
aisc 0x1
x 0x0
omg
 
;; output 0x8 on G
clra
aisc 0x8
x 0x0
omg
;; check no skip on 0x8
skgz
jmp ok_8
jmp fail
ok_8:
 
 
;; output 0x0 on G
clra
x 0x0
omg
;; check skip on 0x0
skgz
jmp fail
jmp pass
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/black_box/jsrp/test.asm
0,0 → 1,128
;; *******************************************************************
;; $Id: test.asm,v 1.1.1.1 2006-05-06 01:56:45 arniml Exp $
;;
;; Checks the JSRP instruction.
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
;; preload data memory with jsrp target values
stii 0x0
stii 0x1
stii 0x2
stii 0x3
stii 0x4
stii 0x5
stii 0x6
stii 0x7
 
cab
jsrp target_0
;;
aisc 0x1
cab
clra
jsrp target_1
;;
aisc 0x2
cab
clra
jsrp target_2
;;
aisc 0x3
cab
clra
jsrp target_3
;;
aisc 0x4
cab
clra
jsrp target_4
;;
aisc 0x5
cab
clra
jsrp target_5
;;
aisc 0x6
cab
clra
jsrp target_6
;;
aisc 0x7
cab
clra
jsrp target_7
 
jmp pass
 
;; subroutine targets in page 2 & 3
org 0x080
target_0:
ske
jmp fail
ret
;;
org 0x088
target_1:
aisc 0x1
ske
jmp fail
clra
ret
;;
org 0x090
target_2:
aisc 0x2
ske
jmp fail
clra
ret
;;
org 0x098
target_3:
aisc 0x3
ske
jmp fail
clra
ret
;;
org 0x0a0
target_4:
aisc 0x4
ske
jmp fail
clra
ret
;;
org 0x0a8
target_5:
aisc 0x5
ske
jmp fail
clra
ret
;;
org 0x0b0
target_6:
aisc 0x6
ske
jmp fail
clra
ret
;;
org 0x0b8
target_7:
aisc 0x7
ske
jmp fail
clra
ret
 
jmp fail
 
org 0x100
include "pass_fail.asm"
/tags/rel_1_1/sw/verif/system/production_test/prod --- tags/rel_1_1/sw/verif/system/production_test/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/system/production_test/test.asm (revision 172) @@ -0,0 +1,504 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-06-10 18:49:47 arniml Exp $ + ;; + ;; Production test as proposed by + ;; "Testing of COP400 Familiy Devices" + ;; National Semiconductor + ;; COP Note 7 + ;; April 1991 + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + +; INSTRUCTION RESULT COMMENTS + + NOP ; NO CHANGE CHECK NOP & ALLOW TRANSIENT + ; CYCLE FOR MODE + OGI 9 ; G(0 > 9) NOT FOR 410L/411L + OGI 6 ; G(9 > 6) REVERSE ALL G STATES + STII 8 ; SET UP 0,0 FOR FUTURE + LBI 3, 13 ; B TO NEW POSITION (3, 13) + OBD ; D(0 > 13) CHECK D + CLRA ; MAKE SURE A = 0 + XABR ; 3 > A;0 > Br + CAB ; MOVE 3 to Bd + OBD ; D(13 > 3) CHECK XABR CAB & D CHANGE + CLRA ; ! + AISC 2 ; !FORCE A > 2 + CAB ; 2 > Bd + OBD ; D(3 > 2) VERIFY 2 FROM A > Bd + STII 7 ; 7 > 0,2 & Bd > 3 + OBD ; D(2 > 3) STII INCREMENTS Bd + CAB ; SEE THAT A STILL THE SAME + OMG ; G(6 > 7) OMB & RAM CHECK + CLRA + CAB ; B(0,0) + OMG ; G(7 > 8) TIE IN RAM, A & G OPERATION + SMB 0 ; SMB INST. CHECK + OMG ; G(8 > 9) : + SMB 1 ; : + OMG ; G(9 > 11) : + RMB 0 ; : + RMB 3 ; : + LD 0 ; :2 > A (modified AL) + CAB ; A = 2 > B + OMG ; G(11 > 7) OUTPUT M(0,2) + LD 1 ; M(0,2) > A; B > 1,2 + XAD 0,0 ; A(7) < => M(0,0) 2 + AISC 15 ; AISC CHECK; A = 1 + LDD 0,0 ; CHECK SKIP OF 2 BYTE INST. + X 0 ; STORE 1 + OMG ; G(7 > 1) VERIFY + LD 0 ; COPY1,2 BACK TO A + ADT ; ADD TEN + XDS 0 ; LEAVE 11 IN 1,2;GO 1, 1 WITH 1 + XDS 0 ; LEAVE 1 IN 1,1;GO 1,0 W ? + OBD ; D(2 > 0) CHECK Bd MOVEMENT + STII 5 ; 5 > 1,0;Bd TO 1,1 + CBA ; CHECK B > A + AISC 3 ; AISC CHECK 4 >A + +; INSTRUCTION RESULT COMMENTS + + XDS 0 ; 1 > A; 4 > 1,1 + OMG ; G(1 > 5) FROM 1,0 + XDS 0 ; 5 > A; 1 > 1,0; Bd < 15 SKIP + LDD 0,0 ; SKIPPED ! + OBD ; D(0 > 15) + AISC 4 ; 9 > A + X 0 ; 9 > 15 + OMG ; G(5 > 9) + CLRA + COMP ; ONES TO A + XOR ; FLIP MEMORY + XIS 0 ; 6 > 1,15; 9 > A; Bd > 1,0 + LDD 0,0 ; SKIP + AISC 8 ; A > 1 (added AL) + LDD 0,0 ; SKIP (added AL) + SKE + LBI 1,2 ; SKIP 2 WORD LBI (NOT IN 410) + OBD ; D(15 > 0) VERIFY WORD + SKE ; 11 NOT = 9 + LBI 1,0 ; BACK TO 1,0 + SMB 2 ; : + SKE ; : + RMB 2 ; : + SKE ; :CHECK BIT + SMB 3 ; :MANIPULATIONS + SKE ; : + LDD 0,0 ; : + X 3 ; Bd > 2,0 + XAD 1,1 ; 9 > 1,1; 4 > A + XIS 1 ; 4 > 2,0; Bd > 3,1 + ING ; INPUT G PORT + X 0 ; STORE + +; INSTRUCTION RESULT COMMENTS + + CLRA + ASC ; CHECK ADD WITH CARRY + SC ; CHECK SET CARRY + SKC ; CHECK SKIP ON CARRY + LDD 0,0 + X 0 ; STORE A + OMG ; G = 9 NO CHANGE + CLRA + ASC + X 0 + OMG ; G(9 > 10) CARRY ADDS ONE TO MEMORY + CAMQ ; STORE A & M IN Q; 10,9 + XDS 0 ; 9 > 3,1; 10 > A; Bd > 3,0 + CQMA ; STORE 9 IN 3,0 (added AL) + OMG ; G(10 > 9) + LD 2 ; 9 > A; Bd > 1,0 + +; INSTRUCTION RESULT COMMENTS + + OMG ; G(9 > 1) + LD 3 ; 1 > A; Bd > 2,0 + OMG ; G(1 > 4) (result corrected AL) + ADD ; ADD WITHOUT CARRY + X 0 ; STORE 3 IN 2,0 + SC + LDD 0,0 ; 7 > A + CASC ; CHECK CASC + SKC + X 0 ; STORE 12 + OMG ; G(4 > 14) (prev and current result corrected AL) + CLRA ; : + AISC 3 ; : + X 0 ; : + SC ; :CHECK + SKC ; :SKC/SC + X 0 ; : + OMG ; G(14 > 3) (prev result corrected AL) + RC ; : + SKC ; :CHECK + X 0 ; :RC + OMG ; G(3 > 14) : + LBI 0,0 ; :CHECK + LBI 1,15 ; ;SEQUENTIAL LBI'S + LBI 2,7 ; ALSO SKIPPED (LBI 2,7 NOT IN 410) + OMG ; G(14 > 7) + CQMA ; LOAD CONSTANTS FROM Q + OMG ; G(7 > 9) CHECK + X 0 ; : + OMG ; G(9 > 10) : + LEI 1 + XAS ; STORE A - > S (9) + CLRA + AISC 7 ; : + SKGBZ 0 ; : + X 0 ; :CHECK + OMG ; : + SKGBZ 1 ; : + X 0 ; ;G BIT + OMG ; G (10 > 7) : + SKGBZ 2 ; : + X 0 ; : + OMG ; G(7 > 10) :TESTS + SKGBZ 3 ; : + X 0 ; : + OMG ; G(10 > 7) : + +; INSTRUCTION RESULT COMMENTS + + SKGZ + X 0 ; :CHECK + OMG ; G(7 > 10) : + OGI 0 ; G(10 > 0) :G TEST + SKGZ ; : + X 0 ; : + OMG ; G(0 > 10) : + SKMBZ 0 + X 0 ; CHECK MEMORY BIT TESTS + OMG ; NO CHANGE + SKMBZ 1 + +; INSTRUCTION RESULT COMMENTS + + X 0 + OMG ; G(10 > 7) NO SKIP + SKMBZ 2 + X 0 ; WON'T SKIP + OMG ; G(7 > 10) + INIL ; SEE THAT L LATCHES RESET + ININ ; ASSUME G - > I + SKE + X 1 ; Br > 1 + OMG ; SHOULD BE EQUAL + INIL ; : + X 0 ; : + SKMBZ 3 ; : + OBD ; D(15 > 0) :INIL TEST + OGI 1 ; G(10 > 1) :(result added AL) + LBI 3,11 ; : + OGI 0 ; G(1 > 0) :(result added AL) + NOP ; (NOP added AL) + INIL ; : + X 0 ; : + SKMBZ 0 ; : + OBD ; D(0 > 11) : + NOP + XAS ; : + X 0 ; :XAS TEST + OMG ; G(10 > 9) : + +; INSTRUCTION RESULT COMMENTS + + LBI 0,0 ; LOAD RAM WITH + STII 7 ; CONSTANTS USING + STII 14 ; STII + STII 5 + STII 12 + STII 3 + STII 10 + STII 1 + STII 8 + STII 15 + STII 6 + STII 13 + STII 4 + STII 11 + STII 2 + STII 9 + STII 0 + LBI 1,0 + STII 7 + STII 14 + STII 5 + STII 12 + STII 3 + STII 10 + STII 1 + STII 8 + STII 15 + STII 6 + STII 13 + STII 4 + STII 11 + STII 2 + STII 9 + STII 0 + LBI 2,0 + STII 7 + STII 14 + STII 5 + STII 12 + STII 3 + STII 10 + STII 1 + STII 8 + STII 15 + STII 6 + STII 13 + +; INSTRUCTION RESULT COMMENTS + + STII 4 + STII 11 + +; INSTRUCTION RESULT COMMENTS + + STII 2 + STII 9 + STII 0 + LBI 3,0 + STII 7 + STII 14 + STII 5 + STII 12 + STII 3 + STII 10 + STII 1 + STII 8 + STII 15 + STII 6 + STII 13 + STII 4 + STII 11 + STII 2 + STII 9 + STII 0 + +; INSTRUCTION RESULT COMMENTS + + LBI 0,0 ; CHECK FOR RAM DATA + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + NOP + +; INSTRUCTION RESULT COMMENTS + + LBI 1,0 ; CHECK FOR RAM DATA + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + +; INSTRUCTION RESULT COMMENTS + + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + NOP + +; INSTRUCTION RESULT COMMENTS + + LBI 2,0 ; CHECK FOR RAM DATA + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + +; INSTRUCTION RESULT COMMENTS + + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + NOP + +; INSTRUCTION RESULT COMMENTS + + LBI 3,0 ; CHECK FOR RAM DATA + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + OMG ; OUTPUT DATA + LD 0 ; : + XIS 0 ; :MOVE TO NEXT DIGIT + NOP + + jmp .
/tags/rel_1_1/sw/verif/system/microbus/mb --- tags/rel_1_1/sw/verif/system/microbus/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/system/microbus/test.asm (revision 172) @@ -0,0 +1,71 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-06-05 21:03:44 arniml Exp $ + ;; + ;; Test the MICROBUS functionality. + ;; + + ;; the cpu type is defined on asl's command line + + org 0x00 + clra + + ;; init counter with 0 + xad 3, 15 + + + ;; + ;; microbus data is written to RAM register 0&1, digits 0-11 + ;; + +read_next_char: + ;; request data + ogi 0x1 +poll_write: + skgbz 0 + jp poll_write + + ;; read posted data + cqma + x 1 ; put A to R0, Q[3:0] + x 1 ; put M to R1, Q[7:4] + + ;; check increment + ldd 3, 15 + aisc 0x1 + cab ; set new Bd + xad 3, 15 + aisc 0x5 ; check for old Bd == 0xb + jmp read_next_char + + + ;; + ;; output received string + ;; + + ;; init counter with 0 + clra + cab + xad 3, 15 + +write_next_char: + ld 1 + ld 1 ; load A from R1, Q[7:4] + ; present M from R0, Q[3:0] + camq + + ;; request read + ogi 0x1 +poll_read: + skgbz 0 + jp poll_read + + ;; check increment + ldd 3, 15 + aisc 0x1 + cab ; set new Bd + xad 3, 15 + aisc 0x5 ; check for old Bd == 0xb + jmp write_next_char + + + jmp .
/tags/rel_1_1/sw/verif/int/skip_tci/int --- tags/rel_1_1/sw/verif/int/skip_tci/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/int/skip_tci/test.asm (revision 172) @@ -0,0 +1,51 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-06-05 02:12:36 arniml Exp $ + ;; + ;; Checks interrupt on a skipped "transfer of control" instruction. + ;; + + ;; the cpu type is defined on asl's command line + + include "int_macros.inc" + + org 0x00 + clra + + int_flag_clear + lei 0x02 + jp int_mark + + org 0x030 +int_mark: + nop + nop +int_instr: + jsr jsr_target + jmp fail ; this one is skipped, but interrupted +ret_instr: + int_flag_check + jmp pass + + + org 0x080 +jsr_target: + retsk + + + + ;; ******************************************************************* + ;; Interrupt routine + ;; + org 0x0fd + jmp fail +int_routine: + nop + save_a_m_c + int_flag_set + check_sa ret_instr + restore_c_m_a + ret + + + org 0x200 + include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/sequence/int --- tags/rel_1_1/sw/verif/int/sequence/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/int/sequence/test.asm (revision 172) @@ -0,0 +1,58 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-06-05 02:12:19 arniml Exp $ + ;; + ;; Checks interrupt on a sequence of "transfer of control" + ;; instructions. + ;; + + ;; the cpu type is defined on asl's command line + + include "int_macros.inc" + + org 0x00 + clra + + int_flag_clear + lei 0x02 + jp int_mark + + org 0x030 +int_mark: + nop + nop +int_instr: + jmp + ++ jp + ++ jsrp jsrp_target + jsr jsrp_target + lqid + nop +ret_instr: + jmp + + org 0x040 ++ int_flag_check + jmp pass + + + org 0x080 +jsrp_target: + ret + + + + ;; ******************************************************************* + ;; Interrupt routine + ;; + org 0x0fd + jmp fail +int_routine: + nop + save_a_m_c + int_flag_set + check_sa ret_instr + restore_c_m_a + ret + + + org 0x200 + include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/skmbz/int --- tags/rel_1_1/sw/verif/int/skmbz/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/int/skmbz/test.asm (revision 172) @@ -0,0 +1,170 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-06-01 00:36:16 arniml Exp $ + ;; + ;; Checks interrupt on SKMBZ. + ;; AISC is interrupted twice: + ;; 1) no carry, thus no skip + ;; 2) carry, skip after interrupt completion + ;; + + ;; the cpu type is defined on asl's command line + + include "int_macros.inc" + + org 0x00 + clra + + int_flag_clear + ;; write return instruction identifier to current M + ;; ret_instr_030 = 0x01 + clra + aisc 0x1 + x 0 + + lei 0x02 + jp int_mark_030 + + org 0x030 +int_mark_030: + nop + nop +int_instr_030: + skmbz 0x1 +ret_instr_030: + jmp fail ; must be skipped! + + ;; check whether interrupt really occured + int_flag_check + + ;; + ;; prepare next interrupt + ;; + int_flag_clear + ;; write return instruction identifier to current M + ;; ret_instr_0b0 = 0x2 + clra + aisc 0x2 + x 0 + + lei 0x02 + jmp int_mark_0b0 + + org 0x0ae + jmp fail + org 0x0b0 +int_mark_0b0: + nop + nop +int_instr_0b0: + skmbz 0x1 +ret_instr_0b0: + jp + ; must not be skipped! + jmp fail ; must be skipped! ++ + + ;; check whether interrupt really occured + int_flag_check + + ;; + ;; prepare next interrupt + ;; + int_flag_clear + ;; write return instruction identifier to current M + ;; ret_instr_230 = 0x4 + clra + aisc 0x4 + x 0 + + lei 0x02 + jmp int_mark_230 + + org 0x22e + jmp fail + org 0x230 +int_mark_230: + nop + skmbz 0x3 +int_instr_230: + jmp fail ; must be skipped +ret_instr_230: + + ;; check whether interrupt really occured + int_flag_check + + ;; + ;; prepare next interrupt + ;; + int_flag_clear + ;; write return instruction identifier to current M + ;; ret_instr_330 = 0x8 + clra + aisc 0x8 + x 0 + + lei 0x02 + jmp int_mark_330 + + org 0x32e + jmp fail + org 0x330 +int_mark_330: + nop + skmbz 0x3 +int_instr_330: + jp + ; must not be skipped! + jmp fail ++ + nop +ret_instr_330: + + ;; check whether interrupt really occured + int_flag_check + + jmp pass + + + ;; ******************************************************************* + ;; Interrupt routine + ;; + org 0x0fd + jmp fail +int_routine: + nop + save_a_m_c + + int_flag_set + + ;; access current M of main program + ldd 3, 14 + x 0 + skmbz 0x0 + jp check_sa_030 + skmbz 0x1 + jp check_sa_0b0 + skmbz 0x2 + jmp check_sa_230 + skmbz 0x3 + jmp check_sa_330 + jmp fail + +check_sa_030: + check_sa ret_instr_030 + jmp int_finished +check_sa_0b0: + check_sa ret_instr_0b0 + jmp int_finished +check_sa_230: + check_sa ret_instr_230 + jmp int_finished +check_sa_330: + check_sa ret_instr_330 + +int_finished: + restore_c_m_a + ret + ;; + ;; ******************************************************************* + + + org 0x200 + include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/lbi/int --- tags/rel_1_1/sw/verif/int/lbi/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/int/lbi/test.asm (revision 172) @@ -0,0 +1,128 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-05-31 00:55:32 arniml Exp $ + ;; + ;; Checks interrupt on LBI. + ;; LBI is interrupted twice: + ;; 1) short, 1 byte instruction + ;; 2) long, 2 byte instruction + ;; + + ;; the cpu type is defined on asl's command line + + include "int_macros.inc" + + org 0x00 + clra + + ;; prepare RAM digits + lbi 0, 3 + stii 0x3 + lbi 0, 9 + stii 0x9 + lbi 0, 0 ; default RAM location + + int_flag_clear + ;; write return instruction identifier to current M + ;; ret_instr_030 = 0x01 + clra + aisc 0x1 + x 0 + + lei 0x02 + jp int_mark_030 + + org 0x030 +int_mark_030: + nop + nop +int_instr_030: + lbi 0, 9 ; short LBI + nop +ret_instr_030: + nop + + ;; check whether interrupt really occured + int_flag_check + + ;; + ;; prepare next interrupt + ;; + int_flag_clear + ;; write return instruction identifier to current M + ;; ret_instr_0b0 = 0x2 + clra + aisc 0x2 + x 0 + + lei 0x02 + jmp int_mark_0b0 + + org 0x0ae + jmp fail + org 0x0b0 +int_mark_0b0: + nop + nop +int_instr_0b0: + lbi 0, 3 ; long LBI + nop +ret_instr_0b0: + nop + + ;; check whether interrupt really occured + int_flag_check + jmp pass + + + ;; ******************************************************************* + ;; Interrupt routine + ;; + org 0x0fd + jmp fail +int_routine: + nop + save_a_m_c + + int_flag_set + + ;; read interrupt location selector + lbi 0, 0 + ldd 0, 0 + x 0 + skmbz 0x0 + jp check_sa_030 + skmbz 0x1 + jmp check_sa_0b0 + jmp fail + +check_sa_030: + check_sa ret_instr_030 + ;; check saved contents of 'current M' + ;; expect 0x9 + lbi 3, 14 + clra + aisc 0x9 + ske + jmp fail + jmp int_finished + +check_sa_0b0: + check_sa ret_instr_0b0 + ;; check saved contents of 'current M' + ;; expect 0x3 + lbi 3, 14 + clra + aisc 0x3 + ske + jmp fail + +int_finished: + lbi 0, 0 + restore_c_m_a + ret + ;; + ;; ******************************************************************* + + + org 0x200 + include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/lqid/int --- tags/rel_1_1/sw/verif/int/lqid/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/int/lqid/test.asm (revision 172) @@ -0,0 +1,74 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-05-28 23:07:31 arniml Exp $ + ;; + ;; Checks interrupt on LQID. + ;; + + ;; the cpu type is defined on asl's command line + + include "int_macros.inc" + + org 0x00 + clra + + int_flag_clear + + ;; prepare LQID + clra + comp + x 0 + ld 0 + camq + clra + x 0 + clra + aisc 0x5 + + lei 0x06 ; also enable L output drivers + jp int_mark + + org 0x030 +int_mark: + nop + nop +int_instr: + lqid + inl ; read data from LQID + ; lower nibble is OD from DUT +ret_instr: + ;; disable L output drivers + lei 0x0 + ;; and check for 0x5 in M + clra + aisc 0x5 + ske + jmp fail + + nop + int_flag_check + jmp pass + + + ;; ------------------------------------------------------------------- + ;; LQID table + ;; + org 0x050 + db 0x05f ; keep low nibble OD inactive + + + ;; ******************************************************************* + ;; Interrupt routine + ;; + org 0x0fd + jmp fail +int_routine: + nop + save_a_m_c + int_flag_set + check_sa ret_instr + restore_c_m_a + ret + + + org 0x200 + include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/jid/int --- tags/rel_1_1/sw/verif/int/jid/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/int/jid/test.asm (revision 172) @@ -0,0 +1,64 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.1 2006-05-28 21:59:08 arniml Exp $ + ;; + ;; Checks interrupt on JID. + ;; + + ;; the cpu type is defined on asl's command line + + include "int_macros.inc" + + org 0x00 + clra + + int_flag_clear + lei 0x02 + + ;; prepare JID + clra + x 0 + clra + aisc 0x4 + + jp int_mark + + org 0x030 +int_mark: + nop + nop +int_instr: + jid + + + ;; ------------------------------------------------------------------- + ;; JID table + ;; + org 0x040 + db 0x060 + + + org 0x05e + jmp fail + org 0x060 + nop +ret_instr: + int_flag_check + jmp pass + + + ;; ******************************************************************* + ;; Interrupt routine + ;; + org 0x0fd + jmp fail +int_routine: + nop + save_a_m_c + int_flag_set + check_sa ret_instr + restore_c_m_a + ret + + + org 0x200 + include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/aisc/test.asm
0,0 → 1,117
;; *******************************************************************
;; $Id: test.asm,v 1.2 2006-05-28 19:22:11 arniml Exp $
;;
;; Checks interrupt on AISC.
;; AISC is interrupted twice:
;; 1) no carry, thus no skip
;; 2) carry, skip after interrupt completion
;;
 
;; the cpu type is defined on asl's command line
 
include "int_macros.inc"
 
org 0x00
clra
 
int_flag_clear
;; write return instruction identifier to current M
;; ret_instr_030 = 0x01
clra
aisc 0x1
x 0
 
lei 0x02
jp int_mark_030
 
org 0x030
int_mark_030:
nop
nop
int_instr_030:
aisc 0xf
ret_instr_030:
jp + ; must not be skipped!
jmp fail
+
;; check result of AISC
xad 3, 0
clra
aisc 0xf
x 0
xad 3, 0
ske
jmp fail
;; check whether interrupt really occured
int_flag_check
 
;;
;; prepare next interrupt
;;
int_flag_clear
;; write return instruction identifier to current M
;; ret_instr_0b0 = 0x2
clra
aisc 0x2
x 0
 
lei 0x02
jmp int_mark_0b0
 
org 0x0ae
jmp fail
org 0x0b0
int_mark_0b0:
nop
nop
int_instr_0b0:
aisc 0x1
ret_instr_0b0:
jmp fail ; must be skipped!
;; check result of AISC
xad 3, 0
clra
x 0
xad 3, 0
ske
jmp fail
;; check whether interrupt really occured
int_flag_check
jmp pass
 
;; *******************************************************************
;; Interrupt routine
;;
org 0x0fd
jmp fail
int_routine:
nop
save_a_m_c
 
int_flag_set
 
;; access current M of main program
ldd 3, 14
x 0
skmbz 0x0
jp check_sa_030
skmbz 0x1
jp check_sa_0b0
jmp fail
 
check_sa_030:
check_sa ret_instr_030
jmp int_finished
check_sa_0b0:
check_sa ret_instr_0b0
 
int_finished:
restore_c_m_a
ret
;;
;; *******************************************************************
 
 
org 0x200
include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/aisc/int --- tags/rel_1_1/sw/verif/int/jsr_ret/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/int/jsr_ret/test.asm (revision 172) @@ -0,0 +1,104 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.2 2006-05-28 19:22:35 arniml Exp $ + ;; + ;; Checks interrupt on JSR and RET. + ;; + + ;; the cpu type is defined on asl's command line + + include "int_macros.inc" + + org 0x00 + clra + + int_flag_clear + ;; write return instruction identifier to current M + ;; ret_instr_230 = 0x01 + clra + aisc 0x1 + x 0 + + lei 0x02 + jmp int_mark_230 + + org 0x230 +int_mark_230: + nop + nop +int_instr_230: + jsr prep_2b0 + nop +ret_instr_2b0: + ;; check whether interrupt really occured + int_flag_check + + jmp pass + + + org 0x290 + jmp fail + org 0x292 +prep_2b0: + nop +ret_instr_230: + ;; check whether interrupt really occured + int_flag_check + + ;; + ;; prepare next interrupt + ;; + int_flag_clear + ;; write return instruction identifier to current M + ;; ret_instr_2b0 = 0x2 + clra + aisc 0x2 + x 0 + + lei 0x02 + jp int_mark_2b0 + + org 0x2ae + jmp fail + org 0x2b0 +int_mark_2b0: + nop + nop +int_instr_2b0: + ret + + + ;; ******************************************************************* + ;; Interrupt routine + ;; + org 0x0fd + jmp fail +int_routine: + nop + save_a_m_c + + int_flag_set + + ;; access current M of main program + ldd 3, 14 + x 0 + skmbz 0x0 + jp check_sa_230 + skmbz 0x1 + jp check_sa_2b0 + jmp fail + +check_sa_230: + check_sa ret_instr_230 + jmp int_finished +check_sa_2b0: + check_sa ret_instr_2b0 + +int_finished: + restore_c_m_a + ret + ;; + ;; ******************************************************************* + + + org 0x200 + include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/jsrp_retsk/test.asm
0,0 → 1,109
;; *******************************************************************
;; $Id: test.asm,v 1.1 2006-05-28 19:21:13 arniml Exp $
;;
;; Checks interrupt on JSRP and RETSK.
;;
 
;; the cpu type is defined on asl's command line
 
include "int_macros.inc"
 
org 0x00
clra
 
int_flag_clear
;; write return instruction identifier to current M
;; ret_instr_1b0 = 0x01
clra
aisc 0x1
x 0
 
lei 0x02
jmp int_mark_1b0
 
org 0x1b0
int_mark_1b0:
nop
nop
int_instr_1b0:
jsrp prep_0b0
aisc 0x1 ; to be skipped by retsk
ret_instr_0b0:
;; check whether aisc has been skipped
x 0
clra
ske
jmp fail
;; check whether interrupt really occured
int_flag_check
 
jmp pass
 
 
org 0x090
jmp fail
org 0x092
prep_0b0:
nop
ret_instr_1b0:
;; check whether interrupt really occured
int_flag_check
 
;;
;; prepare next interrupt
;;
int_flag_clear
;; write return instruction identifier to current M
;; ret_instr_0b0 = 0x2
clra
aisc 0x2
x 0
 
lei 0x02
jp int_mark_0b0
 
org 0x0ae
jmp fail
org 0x0b0
int_mark_0b0:
nop
clra
int_instr_0b0:
retsk
 
;; *******************************************************************
;; Interrupt routine
;;
org 0x0fd
jmp fail
int_routine:
nop
save_a_m_c
 
int_flag_set
 
;; access current M of main program
ldd 3, 14
x 0
skmbz 0x0
jp check_sa_1b0
skmbz 0x1
jp check_sa_0b0
jmp fail
 
check_sa_1b0:
check_sa ret_instr_1b0
jmp int_finished
check_sa_0b0:
check_sa ret_instr_0b0
 
int_finished:
restore_c_m_a
ret
;;
;; *******************************************************************
 
 
org 0x200
include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/jmp/test.asm
0,0 → 1,47
;; *******************************************************************
;; $Id: test.asm,v 1.3 2006-05-28 15:28:30 arniml Exp $
;;
;; Checks interrupt on JMP.
;;
 
;; the cpu type is defined on asl's command line
 
include "int_macros.inc"
 
org 0x00
clra
 
int_flag_clear
lei 0x02
jp int_mark
 
org 0x030
int_mark:
nop
nop
int_instr:
jmp +
 
 
org 0x03d
jmp fail
org 0x03f
+ aisc 0xf
ret_instr:
int_flag_check
jmp pass
 
 
org 0x0fd
jmp fail
int_routine:
nop
save_a_m_c
int_flag_set
check_sa ret_instr
restore_c_m_a
ret
 
 
org 0x200
include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/jmp/int --- tags/rel_1_1/sw/verif/int/jp/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/int/jp/test.asm (revision 172) @@ -0,0 +1,47 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.4 2006-05-28 15:29:19 arniml Exp $ + ;; + ;; Checks interrupt on JP. + ;; + + ;; the cpu type is defined on asl's command line + + include "int_macros.inc" + + org 0x00 + clra + + int_flag_clear + lei 0x02 + jp int_mark + + org 0x030 +int_mark: + nop + nop +int_instr: + jp + + + + org 0x3c + jmp fail + org 0x3e ++ aisc 0xf +ret_instr: + int_flag_check + jmp pass + + + org 0x0fd + jmp fail +int_routine: + nop + save_a_m_c + int_flag_set + check_sa ret_instr + restore_c_m_a + ret + + + org 0x200 + include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/jp/int --- tags/rel_1_1/sw/verif/int/nop/test.asm (nonexistent) +++ tags/rel_1_1/sw/verif/int/nop/test.asm (revision 172) @@ -0,0 +1,41 @@ + ;; ******************************************************************* + ;; $Id: test.asm,v 1.3 2006-05-28 15:30:06 arniml Exp $ + ;; + ;; Checks interrupt on NOP. + ;; + + ;; the cpu type is defined on asl's command line + + include "int_macros.inc" + + org 0x00 + clra + + int_flag_clear + lei 0x02 + jp int_mark + + org 0x030 +int_mark: + nop + nop +int_instr: + nop +ret_instr: + int_flag_check + jmp pass + + + org 0x0fd + jmp fail +int_routine: + nop + save_a_m_c + int_flag_set + check_sa ret_instr + restore_c_m_a + ret + + + org 0x200 + include "int_pass_fail.asm"
/tags/rel_1_1/sw/verif/int/pass/test.asm
0,0 → 1,30
;; *******************************************************************
;; $Id: test.asm,v 1.1 2006-05-27 19:05:42 arniml Exp $
;;
;; Pass interrupt test.
;; Always finds the pass mark when there's an interrupt
;;
 
;; the cpu type is defined on asl's command line
 
org 0x00
clra
 
lei 0x02
jp int_mark
 
org 0x030
int_mark:
nop
nop
nop
jmp fail
 
 
org 0x0ff
nop
jmp pass
 
 
org 0x200
include "int_pass_fail.asm"
/tags/rel_1_1/sw/run_regression.pl
0,0 → 1,102
#!/usr/bin/perl -w
#
##############################################################################
#
# run_regression.pl
#
# $Id: run_regression.pl,v 1.6 2006-06-11 22:20:45 arniml Exp $
#
# Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org)
#
# All rights reserved
#
# ############################################################################
#
# Purpose:
# ========
#
# Runs regression suite over all testcells found in $PROJECT_DIR/sw/verif.
#
# The testcells are identified by searching for the testbench identifiers
# as defined below for %testbenches.
# Then each testcell is built and executed with the specified testcells.
#
 
use strict;
 
 
my $project_dir = $ENV{'PROJECT_DIR'};
my $verif_dir = $project_dir.'/sw/verif';
my $sim_dir = $project_dir.'/sim/rtl_sim';
 
# the testbenches and their identifiers
my %testbenches = ('t41x' => ['./tb_t410_behav_c0', './tb_t411_behav_c0'],
't42x' => ['./tb_t420_behav_c0', './tb_t421_behav_c0'],
't420' => ['./tb_t420_behav_c0'],
'int' => ['./tb_int_behav_c0'],
'mb' => ['./tb_microbus_behav_c0'],
'prod' => ['./tb_prod_behav_c0']);
my ($tb_name, $tb_exec);
 
# identify the directories below $verif_dir containing test classes
my @classes_dirs = ('black_box', 'int', 'system');
 
my $dir;
my %testdirs;
 
# common GHDL options
my $ghdl_options = '--assert-level=error';
 
 
##############################################################################
# find all test directories for all the testbenches
#
foreach $dir (@classes_dirs) {
$dir = $verif_dir.'/'.$dir;
 
while (($tb_name, $tb_exec) = each(%testbenches)) {
my $elem;
my @dirs = `find $dir -type f -name $tb_name`;
 
foreach $elem (@dirs) {
$elem =~ s/\/[^\/]+$//;
$testdirs{$elem} = 1;
}
}
}
 
 
##############################################################################
# run through all tests and execute the enabled testbenches
#
chdir($sim_dir);
while (($dir, $tb_exec) = each(%testdirs)) {
# remove all previous hex files
system('rm -f *.hex');
 
chdir($dir);
print("Building $dir\n");
if (system('make all clean') == 0) {
my @execute_tbs;
 
# collect the testbenches to be executed
while (($tb_name, $tb_exec) = each(%testbenches)) {
if (-f $tb_name) {
push(@execute_tbs, $tb_name);
}
}
 
# and finally execute them
chdir($sim_dir);
foreach $tb_name (@execute_tbs) {
print("Executing for $tb_name\n");
 
foreach $tb_exec (@{$testbenches{$tb_name}}) {
print("Executing testbench $tb_exec\n");
system("$tb_exec $ghdl_options");
}
}
} else {
print("Build failed\n");
}
}
tags/rel_1_1/sw/run_regression.pl Property changes : Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Index: tags/rel_1_1/sw/init_project.template.sh =================================================================== --- tags/rel_1_1/sw/init_project.template.sh (nonexistent) +++ tags/rel_1_1/sw/init_project.template.sh (revision 172) @@ -0,0 +1,14 @@ +############################################################################## +# +# Template script to set up all project-specific environemt variables. +# +# Copy this script to init_project.sh and fill in your local information. +# +# This script has to be sourced from the command line! +# Do not run it as a 'usual' program, as this does not set the variables +# in the current shell process. +# +############################################################################## + +export PROJECT_DIR=/t400 +export MAKEFILES=$PROJECT_DIR/sw/verif/include/Makefile Index: tags/rel_1_1/bench/vhdl/tb_t410.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_t410.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_t410.vhd (revision 172) @@ -0,0 +1,151 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the T410 system toplevel. +-- +-- $Id: tb_t410.vhd,v 1.1 2006-06-11 22:19:32 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +entity tb_t410 is + +end tb_t410; + + +library ieee; +use ieee.std_logic_1164.all; + +use work.t400_system_comp_pack.t410; +use work.tb_pack.tb_elems; +use work.t400_opt_pack.all; + +architecture behav of tb_t410 is + + -- 210.4 kHz clock + constant period_c : time := 4.75 us; + signal ck_s : std_logic; + + signal reset_n_s : std_logic; + + signal io_l_s : std_logic_vector(7 downto 0); + signal io_d_s : std_logic_vector(3 downto 0); + signal io_g_s : std_logic_vector(3 downto 0); + + signal si_s, + so_s, + sk_s : std_logic; + + signal vdd_s : std_logic; + +begin + + + vdd_s <= '1'; + reset_n_s <= '1'; + + ----------------------------------------------------------------------------- + -- DUT + ----------------------------------------------------------------------------- + t410_b : t410 + generic map ( + opt_ck_div_g => t400_opt_ck_div_8_c + ) + port map ( + ck_i => ck_s, + ck_en_i => vdd_s, + reset_n_i => reset_n_s, + si_i => si_s, + so_o => so_s, + sk_o => sk_s, + io_l_b => io_l_s, + io_d_o => io_d_s, + io_g_b => io_g_s + ); + + io_l_s <= (others => 'H'); + io_d_s <= (others => 'H'); + io_g_s <= (others => 'H'); + + + ----------------------------------------------------------------------------- + -- Testbench elements + ----------------------------------------------------------------------------- + tb_elems_b : tb_elems + generic map ( + period_g => period_c, + d_width_g => 4, + g_width_g => 4 + ) + port map ( + io_l_i => io_l_s, + io_d_i => io_d_s, + io_g_i => io_g_s, + io_in_o => open, + so_i => so_s, + si_o => si_s, + sk_i => sk_s, + ck_o => ck_s + ); + +end behav; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +-- Revision 1.6 2006/06/05 18:50:45 arniml +-- remove obsolete en_clk_s +-- +-- Revision 1.5 2006/05/27 19:10:12 arniml +-- explicitly select clock divider 8 +-- +-- Revision 1.4 2006/05/23 01:18:26 arniml +-- consider IN port +-- +-- Revision 1.3 2006/05/15 21:56:02 arniml +-- moved elements to separate design unit tb_elems +-- +-- Revision 1.2 2006/05/06 13:34:25 arniml +-- remove delta cycle filter on sk_s +-- +-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml +-- import from local CVS repository, LOC_CVS_0_1 +-- +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_t410-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_t410-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_t410-c.vhd (revision 172) @@ -0,0 +1,34 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the T410 system toplevel. +-- +-- $Id: tb_t410-c.vhd,v 1.1 2006-06-11 22:19:32 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration tb_t410_behav_c0 of tb_t410 is + + for behav + + for t410_b: t410 + use configuration work.t410_struct_c0; + end for; + + for tb_elems_b: tb_elems + use configuration work.tb_elems_behav_c0; + end for; + + end for; + +end tb_t410_behav_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_t421-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_t421-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_t421-c.vhd (revision 172) @@ -0,0 +1,34 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the T421 system toplevel. +-- +-- $Id: tb_t421-c.vhd,v 1.1 2006-06-11 13:49:50 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration tb_t421_behav_c0 of tb_t421 is + + for behav + + for t421_b: t421 + use configuration work.t421_struct_c0; + end for; + + for tb_elems_b: tb_elems + use configuration work.tb_elems_behav_c0; + end for; + + end for; + +end tb_t421_behav_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_t421.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_t421.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_t421.vhd (revision 172) @@ -0,0 +1,137 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the T421 system toplevel. +-- +-- $Id: tb_t421.vhd,v 1.1 2006-06-11 13:49:50 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +entity tb_t421 is + +end tb_t421; + + +library ieee; +use ieee.std_logic_1164.all; + +use work.t400_system_comp_pack.t421; +use work.tb_pack.tb_elems; +use work.t400_opt_pack.all; + +architecture behav of tb_t421 is + + -- 210.4 kHz clock + constant period_c : time := 4.75 us; + signal ck_s : std_logic; + + signal reset_n_s : std_logic; + + signal io_l_s : std_logic_vector(7 downto 0); + signal io_d_s : std_logic_vector(3 downto 0); + signal io_g_s : std_logic_vector(3 downto 0); + signal io_in_s : std_logic_vector(3 downto 0); + + signal si_s, + so_s, + sk_s : std_logic; + + signal vdd_s : std_logic; + +begin + + + vdd_s <= '1'; + reset_n_s <= '1'; + + ----------------------------------------------------------------------------- + -- DUT + ----------------------------------------------------------------------------- + t421_b : t421 + generic map ( + opt_ck_div_g => t400_opt_ck_div_4_c, + opt_cko_g => t400_opt_cko_gpi_c + ) + port map ( + ck_i => ck_s, + ck_en_i => vdd_s, + reset_n_i => reset_n_s, + cko_i => io_in_s(2), + si_i => si_s, + so_o => so_s, + sk_o => sk_s, + io_l_b => io_l_s, + io_d_o => io_d_s, + io_g_b => io_g_s + ); + + io_l_s <= (others => 'H'); + io_d_s <= (others => 'H'); + io_g_s <= (others => 'H'); + io_in_s <= (others => 'H'); + + + ----------------------------------------------------------------------------- + -- Testbench elements + ----------------------------------------------------------------------------- + tb_elems_b : tb_elems + generic map ( + period_g => period_c, + d_width_g => 4, + g_width_g => 4 + ) + port map ( + io_l_i => io_l_s, + io_d_i => io_d_s, + io_g_i => io_g_s, + io_in_o => io_in_s, + so_i => so_s, + si_o => si_s, + sk_i => sk_s, + ck_o => ck_s + ); + +end behav; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_prod-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_prod-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_prod-c.vhd (revision 172) @@ -0,0 +1,34 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the production test. +-- +-- $Id: tb_prod-c.vhd,v 1.1 2006-06-10 18:50:51 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration tb_prod_behav_c0 of tb_prod is + + for behav + + for t420_b: t420 + use configuration work.t420_struct_c0; + end for; + + for tb_elems_b: tb_elems + use configuration work.tb_elems_behav_c0; + end for; + + end for; + +end tb_prod_behav_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_prod.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_prod.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_prod.vhd (revision 172) @@ -0,0 +1,451 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the production test as proposed by +-- "Testing of COP400 Familiy Devices" +-- National Semiconductor +-- COP Note 7 +-- April 1991 +-- +-- $Id: tb_prod.vhd,v 1.1 2006-06-10 18:50:51 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +entity tb_prod is + +end tb_prod; + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.t400_system_comp_pack.t420; +use work.tb_pack.all; +use work.t400_opt_pack.all; + +architecture behav of tb_prod is + + -- 5 MHz clock + constant period_c : time := 200 ns; + signal ck_s : std_logic; + signal en_ck_s : std_logic := '0'; + + signal reset_n_s : std_logic; + + signal io_l_s : std_logic_vector(7 downto 0); + signal io_d_s, + d_s : std_logic_vector(3 downto 0); + signal exp_d_s : std_logic_vector(3 downto 0) := "0000"; + signal io_g_s, + g_s : std_logic_vector(3 downto 0); + signal exp_g_s : std_logic_vector(3 downto 0) := "0000"; + signal io_in_s : std_logic_vector(3 downto 0); + + signal si_s, + so_s, + sk_s : std_logic; + + signal cs_n_s, + rd_n_s, + wr_n_s : std_logic; + + signal tb_io_l_s : std_logic_vector(7 downto 0); + signal disable_s : boolean := true; + signal pass_s : std_logic := 'L'; + signal fail_s : std_logic := 'L'; + + signal vdd4_s : std_logic_vector(3 downto 0); + +begin + + vdd4_s <= (others => '1'); + reset_n_s <= '1'; + + ----------------------------------------------------------------------------- + -- DUT + ----------------------------------------------------------------------------- + t420_b : t420 + generic map ( + opt_ck_div_g => t400_opt_ck_div_4_c + ) + port map ( + ck_i => ck_s, + ck_en_i => en_ck_s, + reset_n_i => reset_n_s, + cko_i => io_in_s(2), + si_i => si_s, + so_o => so_s, + sk_o => sk_s, + io_l_b => io_l_s, + io_d_o => io_d_s, + io_g_b => io_g_s, + io_in_i => io_in_s + ); + + io_l_s <= (others => 'H'); + io_d_s <= (others => 'L'); + io_g_s <= (others => 'L'); + io_in_s <= (others => 'H'); + + io_in_s <= io_g_s; -- feedthrough for production test + + d_s <= to_X01(io_d_s); + g_s <= to_X01(io_g_s); + + + ----------------------------------------------------------------------------- + -- Testbench elements + ----------------------------------------------------------------------------- + tb_elems_b : tb_elems + generic map ( + period_g => period_c, + d_width_g => 4, + g_width_g => 4 + ) + port map ( + io_l_i => tb_io_l_s, + io_d_i => vdd4_s, + io_g_i => vdd4_s, + io_in_o => open, + so_i => so_s, + si_o => si_s, + sk_i => sk_s, + ck_o => ck_s + ); + + + ----------------------------------------------------------------------------- + -- Process ck_div + -- + -- Purpose: + -- Generates the en_ck_s signal from the high frequency clock. + -- + ck_div: process (ck_s) + variable cnt_v : natural := 0; + begin + if ck_s'event and ck_s = '1' then + en_ck_s <= '0'; + + if cnt_v = 25 then + cnt_v := 0; + en_ck_s <= '1'; + else + cnt_v := cnt_v + 1; + end if; + end if; + end process ck_div; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process exp + -- + -- Purpose: + -- Sets the expected values for D and G ports. + -- + exp: process + procedure w_p(signal sig : in std_logic_vector) is + begin + wait until sig'event; + end; + + procedure exp_d_p(exp : in natural) is + begin + w_p(d_s); + exp_d_s <= std_logic_vector(to_unsigned(exp, 4)); + end; + + procedure exp_g_p(exp : in natural) is + begin + w_p(g_s); + exp_g_s <= std_logic_vector(to_unsigned(exp, 4)); + end; + + begin + -- default settings + pass_s <= 'L'; + exp_d_s <= (others => '0'); + exp_g_s <= (others => '0'); + + wait for 1 us; + disable_s <= false; + + -- G(0 > 9) + exp_g_p(9); + + -- G(9 > 6) + exp_g_p(6); + + -- D(0 > 13) + exp_d_p(13); + + -- D(13 > 3) + exp_d_p(3); + + -- D(3 > 2) + exp_d_p(2); + + -- D(2 > 3) + exp_d_p(3); + + -- G(6 > 7) + exp_g_p(7); + + -- G(7 > 8) + exp_g_p(8); + + -- G(8 > 9) + exp_g_p(9); + + -- G(9 > 11) + exp_g_p(11); + + -- G(11 > 7) + exp_g_p(7); + + -- G(7 > 1) + exp_g_p(1); + + -- D(2 > 0) + exp_d_p(0); + + -- G(1 > 5) + exp_g_p(5); + + -- D(0 > 15) + exp_d_p(15); + + -- G(5 > 9) + exp_g_p(9); + + -- D(15 > 0) + exp_d_p(0); + + -- G(9 > 10) + exp_g_p(10); + + -- G(10 > 9) + exp_g_p(9); + + -- G(9 > 1) + exp_g_p(1); + + -- G(1 > 4) + exp_g_p(4); + + -- G(4 > 14) + exp_g_p(14); + + -- G(14 > 3) + exp_g_p(3); + + -- G(3 > 14) + exp_g_p(14); + + -- G(14 > 7) + exp_g_p(7); + + -- G(7 > 9) + exp_g_p(9); + + -- G(9 > 10) + exp_g_p(10); + + -- G (10 > 7) + exp_g_p(7); + + -- G(7 > 10) + exp_g_p(10); + + -- G(10 > 7) + exp_g_p(7); + + -- G(7 > 10) + exp_g_p(10); + + -- G(10 > 0) + exp_g_p(0); + + -- G(0 > 10) + exp_g_p(10); + + -- G(10 > 7) + exp_g_p(7); + + -- G(7 > 10) + exp_g_p(10); + + -- D was at 15 before +-- -- D(15 > 0) +-- exp_d_p(0); + + -- G(10 > 1) + exp_g_p(1); + + -- G(1 > 0) + exp_g_p(0); + + -- D(0 > 11) + exp_d_p(11); + + -- G(10 > 9) + exp_g_p(9); + + --------------------------------------------------------------------------- + -- RAM tests + -- + for reg in 0 to 3 loop + exp_g_p(7); + exp_g_p(14); + exp_g_p(5); + exp_g_p(12); + exp_g_p(3); + exp_g_p(10); + exp_g_p(1); + exp_g_p(8); + exp_g_p(15); + exp_g_p(6); + exp_g_p(13); + exp_g_p(4); + exp_g_p(11); + exp_g_p(2); + exp_g_p(9); + exp_g_p(0); + end loop; + + wait for 1 us; + if fail_s /= '1' then + pass_s <= '1'; + end if; + wait; + end process exp; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process exp_d + -- + -- Purpose: + -- Checks the expected value for the D port. + -- + exp_d: process (ck_s) + begin + if disable_s then + fail_s <= 'L'; + elsif ck_s'event and ck_s = '0' then + if d_s /= exp_d_s then + fail_s <= '1'; + end if; + end if; + end process exp_d; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process exp_g + -- + -- Purpose: + -- Checks the expected value for the G port. + -- + exp_g: process (ck_s) + begin + if disable_s then + fail_s <= 'L'; + elsif ck_s'event and ck_s = '0' then + if g_s /= exp_g_s then + fail_s <= '1'; + end if; + end if; + end process exp_g; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process pass_fail + -- + -- Purpose: + -- Collects the pass/fail signal and generates the respective sequence + -- on tb_io_l_s. + -- + pass_fail: process + procedure tb_pass_fail(pass : in boolean) is + begin + tb_io_l_s <= "00000000"; + wait for 1 us; + tb_io_l_s <= "10100000"; + wait for 1 us; + tb_io_l_s <= "01010000"; + wait for 1 us; + + if pass then + tb_io_l_s <= "00000000"; + else + tb_io_l_s <= "11110000"; + end if; + wait for 1 us; + end; + + begin + tb_io_l_s <= (others => '0'); + + loop + wait until pass_s'event or fail_s'event; + if fail_s = '1' then + tb_pass_fail(pass => false); + elsif pass_s = '1' then + tb_pass_fail(pass => true); + end if; + end loop; + end process pass_fail; + -- + ----------------------------------------------------------------------------- + +end behav; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_microbus.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_microbus.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_microbus.vhd (revision 172) @@ -0,0 +1,271 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for MICROBUS evaluation. +-- +-- $Id: tb_microbus.vhd,v 1.1 2006-06-05 21:04:52 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +entity tb_microbus is + +end tb_microbus; + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.t400_system_comp_pack.t420; +use work.tb_pack.all; +use work.t400_opt_pack.all; + +architecture behav of tb_microbus is + + -- 5 MHz clock + constant period_c : time := 200 ns; + signal ck_s : std_logic; + signal en_ck_s : std_logic := '0'; + + signal reset_n_s : std_logic; + + signal io_l_s : std_logic_vector(7 downto 0); + signal io_d_s : std_logic_vector(3 downto 0); + signal io_g_s : std_logic_vector(3 downto 0); + signal io_in_s : std_logic_vector(3 downto 0); + + signal si_s, + so_s, + sk_s : std_logic; + + signal cs_n_s, + rd_n_s, + wr_n_s : std_logic; + + signal tb_io_l_s : std_logic_vector(7 downto 0); + +begin + + + reset_n_s <= '1'; + + ----------------------------------------------------------------------------- + -- DUT + ----------------------------------------------------------------------------- + t420_b : t420 + generic map ( + opt_ck_div_g => t400_opt_ck_div_4_c, + opt_microbus_g => t400_opt_microbus_c + ) + port map ( + ck_i => ck_s, + ck_en_i => en_ck_s, + reset_n_i => reset_n_s, + cko_i => io_in_s(2), + si_i => si_s, + so_o => so_s, + sk_o => sk_s, + io_l_b => io_l_s, + io_d_o => io_d_s, + io_g_b => io_g_s, + io_in_i => io_in_s + ); + + io_l_s <= (others => 'H'); + io_d_s <= (others => 'H'); + io_g_s <= (others => 'H'); + io_in_s <= (others => 'H'); + + + ----------------------------------------------------------------------------- + -- Testbench elements + ----------------------------------------------------------------------------- + tb_elems_b : tb_elems + generic map ( + period_g => period_c, + d_width_g => 4, + g_width_g => 4 + ) + port map ( + io_l_i => tb_io_l_s, + io_d_i => io_d_s, + io_g_i => io_g_s, + io_in_o => open, + so_i => so_s, + si_o => si_s, + sk_i => sk_s, + ck_o => ck_s + ); + + + ----------------------------------------------------------------------------- + -- Process ck_div + -- + -- Purpose: + -- Generates the en_ck_s signal from the high frequency clock. + -- + ck_div: process (ck_s) + variable cnt_v : natural := 0; + begin + if ck_s'event and ck_s = '1' then + en_ck_s <= '0'; + + if cnt_v = 25 then + cnt_v := 0; + en_ck_s <= '1'; + else + cnt_v := cnt_v + 1; + end if; + end if; + end process ck_div; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- Process microbus + -- + -- Purpose: + -- Implements the microbus testbench element. + -- a) sends twelve bytes of data to the DUT + -- HELLO WORLD! + -- b) reads twelve bytes from the DUT and compares them against + -- the original sequence + -- + microbus: process + procedure tb_pass_fail(pass : in boolean) is + begin + tb_io_l_s <= "00000000"; + wait for 1 us; + tb_io_l_s <= "10100000"; + wait for 1 us; + tb_io_l_s <= "01010000"; + wait for 1 us; + + if pass then + tb_io_l_s <= "00000000"; + else + tb_io_l_s <= "11110000"; + end if; + wait for 1 us; + end; + + constant msg_c : string := string'("HELLO WORLD!"); + begin + -- default settings + cs_n_s <= '1'; + rd_n_s <= '1'; + wr_n_s <= '1'; + io_l_s <= (others => 'H'); + tb_io_l_s <= (others => '0'); + + -- + -- send the message string + -- + for idx in msg_c'range loop + wait until io_g_s(0)'event and io_g_s(0) = '1'; + if idx mod 2 = 0 then + -- short wait for even positions + wait for 1 us; + else + -- long wait for odd positions + wait for 1 ms; + end if; + + io_l_s <= std_logic_vector(to_unsigned(character'pos(msg_c(idx)), 8)); + wait for 10 ns; + cs_n_s <= '0'; + wr_n_s <= '0'; + wait for 400 ns; + cs_n_s <= '1'; + wr_n_s <= '1'; + wait for 10 ns; + io_l_s <= (others => 'H'); + end loop; + + -- + -- and receive it again + -- + for idx in msg_c'range loop + wait until io_g_s(0)'event and io_g_s(0) = '1'; + if idx mod 2 = 0 then + -- short wait for even positions + wait for 1 us; + else + -- long wait for odd positions + wait for 1 ms; + end if; + + cs_n_s <= '0'; + rd_n_s <= '0'; + wait for 400 ns; + if character'pos(msg_c(idx)) /= to_integer(unsigned(io_l_s)) then + tb_pass_fail(pass => false); + end if; + cs_n_s <= '1'; + rd_n_s <= '1'; + + -- ack with dummy write + wait for 1 us; + cs_n_s <= '0'; + wr_n_s <= '0'; + wait for 400 ns; + cs_n_s <= '1'; + wr_n_s <= '1'; + end loop; + + tb_pass_fail(pass => true); + wait; + end process microbus; + -- + io_in_s(1) <= rd_n_s; + io_in_s(2) <= cs_n_s; + io_in_s(3) <= wr_n_s; + -- + ----------------------------------------------------------------------------- + + +end behav; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_microbus-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_microbus-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_microbus-c.vhd (revision 172) @@ -0,0 +1,34 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for MICROBUS evaluation. +-- +-- $Id: tb_microbus-c.vhd,v 1.1 2006-06-05 21:04:52 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration tb_microbus_behav_c0 of tb_microbus is + + for behav + + for t420_b: t420 + use configuration work.t420_struct_c0; + end for; + + for tb_elems_b: tb_elems + use configuration work.tb_elems_behav_c0; + end for; + + end for; + +end tb_microbus_behav_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_int.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_int.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_int.vhd (revision 172) @@ -0,0 +1,210 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for interrupt evaluation. +-- +-- $Id: tb_int.vhd,v 1.5 2006-06-05 18:50:45 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +entity tb_int is + +end tb_int; + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.t400_system_comp_pack.t420; +use work.tb_pack.all; +use work.t400_opt_pack.all; + +architecture behav of tb_int is + + -- 210.4 kHz clock + constant period_c : time := 4.75 us; + signal ck_s : std_logic; + + signal reset_n_s : std_logic; + + signal io_l_s : std_logic_vector(7 downto 0); + signal io_d_s : std_logic_vector(3 downto 0); + signal io_g_s : std_logic_vector(3 downto 0); + signal io_in_s : std_logic_vector(3 downto 0); + + signal si_s, + so_s, + sk_s : std_logic; + + signal vdd_8_s : std_logic_vector(7 downto 0); + +begin + + + vdd_8_s <= (others => '1'); + reset_n_s <= '1'; + + ----------------------------------------------------------------------------- + -- DUT + ----------------------------------------------------------------------------- + t420_b : t420 + generic map ( + opt_ck_div_g => t400_opt_ck_div_4_c, + opt_l_out_type_3_g => t400_opt_out_type_od_c, + opt_l_out_type_2_g => t400_opt_out_type_od_c, + opt_l_out_type_1_g => t400_opt_out_type_od_c, + opt_l_out_type_0_g => t400_opt_out_type_od_c + ) + port map ( + ck_i => ck_s, + ck_en_i => vdd_8_s(0), + reset_n_i => reset_n_s, + cko_i => io_in_s(2), + si_i => si_s, + so_o => so_s, + sk_o => sk_s, + io_l_b => io_l_s, + io_d_o => io_d_s, + io_g_b => io_g_s, + io_in_i => io_in_s + ); + + io_l_s <= (others => 'H'); + io_d_s <= (others => 'H'); + io_g_s <= (others => 'H'); + io_in_s <= (others => 'H'); + + + ----------------------------------------------------------------------------- + -- Testbench elements + ----------------------------------------------------------------------------- + tb_elems_b : tb_elems + generic map ( + period_g => period_c, + d_width_g => 4, + g_width_g => 4 + ) + port map ( + io_l_i => vdd_8_s, + io_d_i => io_d_s, + io_g_i => vdd_8_s(3 downto 0), + io_in_o => open, + so_i => so_s, + si_o => si_s, + sk_i => sk_s, + ck_o => ck_s + ); + + + ----------------------------------------------------------------------------- + -- Process int + -- + -- Purpose: + -- Generates interrupts based on current PC. + -- + int: process + variable int_v : std_logic; + begin + loop + wait until tb_pc_s'event; + -- see if we need to generate an interrupt + case to_integer(tb_pc_s) is + when 16#030# => + int_v := '0'; + when 16#0b0# => + int_v := '0'; + when 16#1b0# => + int_v := '0'; + when 16#230# => + int_v := '0'; + when 16#2b0# => + int_v := '0'; + when 16#330# => + int_v := '0'; + when 16#3b0# => + int_v := '0'; + when others => + int_v := 'H'; + end case; + + io_in_s(1) <= int_v; + + if int_v = '0' then + -- wait for appropriate interrupt active time + wait for period_c * 4 * 3; -- three instruction cycles + io_in_s(1) <= 'H'; + end if; + end loop; + end process int; + -- + ----------------------------------------------------------------------------- + + + ----------------------------------------------------------------------------- + -- MUX the nibbles of SA to L + ----------------------------------------------------------------------------- + io_l_s(3 downto 0) <= std_logic_vector(tb_sa_s(3 downto 0)) + when io_g_s(1 downto 0) = "00" else + std_logic_vector(tb_sa_s(7 downto 4)) + when io_g_s(1 downto 0) = "01" else + '0' & '0' & std_logic_vector(tb_sa_s(9 downto 8)) + when io_g_s(1 downto 0) = "10" else + (others => 'H'); + +end behav; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +-- Revision 1.4 2006/05/28 23:09:20 arniml +-- lower nibble is OD to prevent contention with testbench +-- +-- Revision 1.3 2006/05/28 15:36:59 arniml +-- don't generate interrupt when in interrupt routine around 0x100 +-- +-- Revision 1.2 2006/05/28 02:53:47 arniml +-- provide SA at L port +-- +-- Revision 1.1 2006/05/27 19:08:21 arniml +-- initial check-in +-- +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_t411.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_t411.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_t411.vhd (revision 172) @@ -0,0 +1,148 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the T411 system toplevel. +-- +-- $Id: tb_t411.vhd,v 1.6 2006-06-05 18:50:45 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +entity tb_t411 is + +end tb_t411; + + +library ieee; +use ieee.std_logic_1164.all; + +use work.t400_system_comp_pack.t411; +use work.tb_pack.tb_elems; +use work.t400_opt_pack.all; + +architecture behav of tb_t411 is + + -- 210.4 kHz clock + constant period_c : time := 4.75 us; + signal ck_s : std_logic; + + signal reset_n_s : std_logic; + + signal io_l_s : std_logic_vector(7 downto 0); + signal io_d_s : std_logic_vector(1 downto 0); + signal io_g_s : std_logic_vector(2 downto 0); + + signal si_s, + so_s, + sk_s : std_logic; + + signal vdd_s : std_logic; + +begin + + + vdd_s <= '1'; + reset_n_s <= '1'; + + ----------------------------------------------------------------------------- + -- DUT + ----------------------------------------------------------------------------- + t411_b : t411 + generic map ( + opt_ck_div_g => t400_opt_ck_div_8_c + ) + port map ( + ck_i => ck_s, + ck_en_i => vdd_s, + reset_n_i => reset_n_s, + si_i => si_s, + so_o => so_s, + sk_o => sk_s, + io_l_b => io_l_s, + io_d_o => io_d_s, + io_g_b => io_g_s + ); + + io_l_s <= (others => 'H'); + io_d_s <= (others => 'H'); + io_g_s <= (others => 'H'); + + + ----------------------------------------------------------------------------- + -- Testbench elements + ----------------------------------------------------------------------------- + tb_elems_b : tb_elems + generic map ( + period_g => period_c, + d_width_g => 2, + g_width_g => 3 + ) + port map ( + io_l_i => io_l_s, + io_d_i => io_d_s, + io_g_i => io_g_s, + io_in_o => open, + so_i => so_s, + si_o => si_s, + sk_i => sk_s, + ck_o => ck_s + ); + +end behav; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +-- Revision 1.5 2006/05/27 19:10:12 arniml +-- explicitly select clock divider 8 +-- +-- Revision 1.4 2006/05/23 01:18:26 arniml +-- consider IN port +-- +-- Revision 1.3 2006/05/15 21:56:02 arniml +-- moved elements to separate design unit tb_elems +-- +-- Revision 1.2 2006/05/06 13:34:25 arniml +-- remove delta cycle filter on sk_s +-- +-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml +-- import from local CVS repository, LOC_CVS_0_1 +-- +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_t420.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_t420.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_t420.vhd (revision 172) @@ -0,0 +1,150 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the T420 system toplevel. +-- +-- $Id: tb_t420.vhd,v 1.5 2006-06-05 18:50:45 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +entity tb_t420 is + +end tb_t420; + + +library ieee; +use ieee.std_logic_1164.all; + +use work.t400_system_comp_pack.t420; +use work.tb_pack.tb_elems; +use work.t400_opt_pack.all; + +architecture behav of tb_t420 is + + -- 210.4 kHz clock + constant period_c : time := 4.75 us; + signal ck_s : std_logic; + + signal reset_n_s : std_logic; + + signal io_l_s : std_logic_vector(7 downto 0); + signal io_d_s : std_logic_vector(3 downto 0); + signal io_g_s : std_logic_vector(3 downto 0); + signal io_in_s : std_logic_vector(3 downto 0); + + signal si_s, + so_s, + sk_s : std_logic; + + signal vdd_s : std_logic; + +begin + + + vdd_s <= '1'; + reset_n_s <= '1'; + + ----------------------------------------------------------------------------- + -- DUT + ----------------------------------------------------------------------------- + t420_b : t420 + generic map ( + opt_ck_div_g => t400_opt_ck_div_4_c, + opt_cko_g => t400_opt_cko_gpi_c + ) + port map ( + ck_i => ck_s, + ck_en_i => vdd_s, + reset_n_i => reset_n_s, + cko_i => io_in_s(2), + si_i => si_s, + so_o => so_s, + sk_o => sk_s, + io_l_b => io_l_s, + io_d_o => io_d_s, + io_g_b => io_g_s, + io_in_i => io_in_s + ); + + io_l_s <= (others => 'H'); + io_d_s <= (others => 'H'); + io_g_s <= (others => 'H'); + io_in_s <= (others => 'H'); + + + ----------------------------------------------------------------------------- + -- Testbench elements + ----------------------------------------------------------------------------- + tb_elems_b : tb_elems + generic map ( + period_g => period_c, + d_width_g => 4, + g_width_g => 4 + ) + port map ( + io_l_i => io_l_s, + io_d_i => io_d_s, + io_g_i => io_g_s, + io_in_o => io_in_s, + so_i => so_s, + si_o => si_s, + sk_i => sk_s, + ck_o => ck_s + ); + +end behav; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +-- Revision 1.4 2006/05/27 19:10:20 arniml +-- explicitly select clock divider 4 +-- +-- Revision 1.3 2006/05/24 00:48:49 arniml +-- connect cko_i to bit 2 of IN bus +-- +-- Revision 1.2 2006/05/23 01:18:10 arniml +-- consider CKO and IN port +-- +-- Revision 1.1 2006/05/15 22:21:59 arniml +-- initial check-in +-- +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_int-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_int-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_int-c.vhd (revision 172) @@ -0,0 +1,37 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for interrupt evaluation. +-- +-- $Id: tb_int-c.vhd,v 1.2 2006-06-05 14:42:50 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration tb_int_behav_c0 of tb_int is + + for behav + + for t420_b: t420 + use configuration work.t420_struct_c0; + end for; + + for tb_elems_b: tb_elems + use configuration work.tb_elems_behav_c0; + end for; + + end for; + +end tb_int_behav_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +-- Revision 1.1 2006/05/27 19:08:21 arniml +-- initial check-in +-- +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_elems.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_elems.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_elems.vhd (revision 172) @@ -0,0 +1,328 @@ +------------------------------------------------------------------------------- +-- +-- Generic testbench elements +-- +-- $Id: tb_elems.vhd,v 1.6 2006-05-27 22:48:00 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity tb_elems is + + generic ( + period_g : time := 4.75 us; + d_width_g : integer := 4; + g_width_g : integer := 4 + ); + port ( + io_l_i : in std_logic_vector(7 downto 0); + io_d_i : in std_logic_vector(d_width_g-1 downto 0); + io_g_i : in std_logic_vector(g_width_g-1 downto 0); + io_in_o : out std_logic_vector(g_width_g-1 downto 0); + so_i : in std_logic; + si_o : out std_logic; + sk_i : in std_logic; + ck_o : out std_logic + ); + +end tb_elems; + + +library ieee; +use ieee.numeric_std.all; + +architecture behav of tb_elems is + + signal en_ck_s : std_logic; + +begin + + en_ck_s <= 'H'; + + ----------------------------------------------------------------------------- + -- Pass/fail catcher + ----------------------------------------------------------------------------- + pass_fail: process (io_l_i) + type pass_fail_t is (IDLE, + GOT_0, GOT_A, GOT_5); + variable state_v : pass_fail_t := IDLE; + variable sig_v : std_logic_vector(3 downto 0); + begin + sig_v := to_X01(io_l_i(7 downto 4)); + + case state_v is + when IDLE => + en_ck_s <= 'Z'; + if sig_v = "0000" then + state_v := GOT_0; + end if; + when GOT_0 => + if sig_v = "1010" then + state_v := GOT_A; + elsif sig_v /= "0000" then + state_v := IDLE; + end if; + when GOT_A => + if sig_v = "0101" then + state_v := GOT_5; + elsif sig_v /= "1010" then + state_v := IDLE; + end if; + when GOT_5 => + if sig_v = "0000" then + en_ck_s <= '0'; + assert false + report "Simulation finished with PASS." + severity note; + elsif sig_v = "1111" then + en_ck_s <= '0'; + assert false + report "Simulation finished with FAIL." + severity note; + elsif sig_v /= "0101" then + state_v := IDLE; + end if; + end case; + end process pass_fail; + + + ----------------------------------------------------------------------------- + -- D monitor + ----------------------------------------------------------------------------- + d_moni: process (io_d_i) + type d_moni_t is (IDLE, + STEP_1, STEP_2, + STEP_3, STEP_4); + variable state_v : d_moni_t := IDLE; + variable sig_v : unsigned(3 downto 0); + begin + sig_v := (others => '0'); + sig_v(io_d_i'range) := unsigned(to_X01(io_d_i)); + + case state_v is + when IDLE => + en_ck_s <= 'Z'; + if sig_v = 1 then + state_v := STEP_1; + end if; + when STEP_1 => + if sig_v = 2 then + state_v := STEP_2; + else + state_v := IDLE; + end if; + when STEP_2 => + if sig_v = 4 then + state_v := STEP_3; + elsif sig_v /= 0 then + state_v := IDLE; + else + -- sim finished for 2-bit D ports + en_ck_s <= '0'; + assert false + report "Simulation finished with PASS (D-Port 2 bit)." + severity note; + end if; + when STEP_3 => + if sig_v = 8 then + state_v := STEP_4; + elsif sig_v /= 0 then + state_v := IDLE; + else + -- sim finished for 3-bit D ports + en_ck_s <= '0'; + assert false + report "Simulation finished with PASS (D-Port 3 bit)." + severity note; + end if; + when STEP_4 => + if sig_v = 15 then + -- sim finished pass for 4-bit D ports + en_ck_s <= '0'; + assert false + report "Simulation finished with PASS (D-Port 4 bit)." + severity note; + elsif sig_v = 0 then + -- sim finished fail for 4-bit D ports + en_ck_s <= '0'; + assert false + report "Simulation finished with FAIL (D-Port 4 bit)." + severity note; + else + state_v := IDLE; + end if; + + when others => + null; + end case; + + end process d_moni; + + + ----------------------------------------------------------------------------- + -- G monitor + ----------------------------------------------------------------------------- + g_moni: process (io_g_i) + type d_moni_t is (IDLE, + STEP_1, STEP_2, STEP_3, + STEP_4); + variable state_v : d_moni_t := IDLE; + variable sig_v : unsigned(3 downto 0); + begin + sig_v := (others => '0'); + sig_v(io_g_i'range) := unsigned(to_X01(io_g_i)); + + case state_v is + when IDLE => + en_ck_s <= 'Z'; + if sig_v = 1 then + state_v := STEP_1; + end if; + when STEP_1 => + if sig_v = 2 then + state_v := STEP_2; + else + state_v := IDLE; + end if; + when STEP_2 => + if sig_v = 4 then + state_v := STEP_3; + else + state_v := IDLE; + end if; + when STEP_3 => + if sig_v = 8 then + state_v := STEP_4; + elsif sig_v /= 0 then + state_v := IDLE; + else + -- sim finished for 3-bit G ports + en_ck_s <= '0'; + assert false + report "Simulation finished with PASS (G-Port 3 bit)." + severity note; + end if; + when STEP_4 => + if sig_v /= 15 then + state_v := IDLE; + else + -- sim finished for 4-bit G ports + en_ck_s <= '0'; + assert false + report "Simulation finished with PASS (G-Port 4 bit)." + severity note; + end if; + + when others => + null; + end case; + + end process g_moni; + + + -- feed back G on IN + io_in_o <= io_g_i; + + + ----------------------------------------------------------------------------- + -- SIO peer + ----------------------------------------------------------------------------- + sio_peer: process + begin + si_o <= '0'; + + wait until io_l_i(4) = '0'; + + while io_l_i(4) = '0' loop + si_o <= so_i xor sk_i after 10 us; + + wait until io_l_i'event or so_i'event or sk_i'event; + end loop; + + -- now feed SO back to SI upon SK edge + loop + wait until sk_i'event and sk_i = '1'; + si_o <= so_i after 10 us; + end loop; + + wait; + end process sio_peer; + + + ----------------------------------------------------------------------------- + -- Clock generator + ----------------------------------------------------------------------------- + clk: process + begin + ck_o <= '0'; + wait for period_g / 2; + ck_o <= '1'; + wait for period_g / 2; + + if to_X01(en_ck_s) /= '1' then + wait; + end if; + end process clk; + +end behav; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +-- Revision 1.5 2006/05/27 19:08:53 arniml +-- add fail reporting for port d +-- +-- Revision 1.4 2006/05/23 01:17:25 arniml +-- drive IN port +-- +-- Revision 1.3 2006/05/18 00:24:18 arniml +-- extend D-port checks +-- +-- Revision 1.2 2006/05/17 00:47:45 arniml +-- enhance G-port check for T420 +-- +-- Revision 1.1 2006/05/15 21:55:27 arniml +-- initial check-in +-- +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_pack-p.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_pack-p.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_pack-p.vhd (revision 172) @@ -0,0 +1,52 @@ +------------------------------------------------------------------------------- +-- +-- $Id: tb_pack-p.vhd,v 1.3 2006-05-27 19:09:29 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +use work.t400_pack.pc_t; + +package tb_pack is + + component tb_elems + generic ( + period_g : time := 4.75 us; + d_width_g : integer := 4; + g_width_g : integer := 4 + ); + port ( + io_l_i : in std_logic_vector(7 downto 0); + io_d_i : in std_logic_vector(d_width_g-1 downto 0); + io_g_i : in std_logic_vector(g_width_g-1 downto 0); + io_in_o : out std_logic_vector(g_width_g-1 downto 0); + so_i : in std_logic; + si_o : out std_logic; + sk_i : in std_logic; + ck_o : out std_logic + ); + end component; + + signal tb_pc_s : pc_t; + signal tb_sa_s : pc_t; + +end tb_pack; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +-- Revision 1.2 2006/05/23 01:17:25 arniml +-- drive IN port +-- +-- Revision 1.1 2006/05/15 21:55:27 arniml +-- initial check-in +-- +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_t420-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_t420-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_t420-c.vhd (revision 172) @@ -0,0 +1,34 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the T420 system toplevel. +-- +-- $Id: tb_t420-c.vhd,v 1.1 2006-05-15 22:21:59 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration tb_t420_behav_c0 of tb_t420 is + + for behav + + for t420_b: t420 + use configuration work.t420_struct_c0; + end for; + + for tb_elems_b: tb_elems + use configuration work.tb_elems_behav_c0; + end for; + + end for; + +end tb_t420_behav_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_t411-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_t411-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_t411-c.vhd (revision 172) @@ -0,0 +1,37 @@ +------------------------------------------------------------------------------- +-- +-- Testbench for the T411 system toplevel. +-- +-- $Id: tb_t411-c.vhd,v 1.2 2006-05-15 21:56:02 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration tb_t411_behav_c0 of tb_t411 is + + for behav + + for t411_b: t411 + use configuration work.t411_struct_c0; + end for; + + for tb_elems_b: tb_elems + use configuration work.tb_elems_behav_c0; + end for; + + end for; + +end tb_t411_behav_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +-- Revision 1.1.1.1 2006/05/06 01:56:44 arniml +-- import from local CVS repository, LOC_CVS_0_1 +-- +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/tb_elems-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/tb_elems-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/tb_elems-c.vhd (revision 172) @@ -0,0 +1,25 @@ +------------------------------------------------------------------------------- +-- +-- Generic testbench elements +-- +-- $Id: tb_elems-c.vhd,v 1.1 2006-05-15 21:55:27 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration tb_elems_behav_c0 of tb_elems is + + for behav + end for; + +end tb_elems_behav_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/t420_rom-lpm-a.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/t420_rom-lpm-a.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/t420_rom-lpm-a.vhd (revision 172) @@ -0,0 +1,96 @@ +------------------------------------------------------------------------------- +-- +-- T420 ROM wrapper for lpm_rom. +-- +-- $Id: t420_rom-lpm-a.vhd,v 1.1 2006-05-14 22:31:08 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +architecture lpm of t420_rom is + + component lpm_rom + generic ( + LPM_WIDTH : positive; + LPM_WIDTHAD : positive; + LPM_NUMWORDS : natural := 0; + LPM_ADDRESS_CONTROL : string := "REGISTERED"; + LPM_OUTDATA : string := "REGISTERED"; + LPM_FILE : string; + LPM_TYPE : string := "LPM_ROM"; + LPM_HINT : string := "UNUSED" + ); + port ( + ADDRESS : in STD_LOGIC_VECTOR(LPM_WIDTHAD-1 downto 0); + INCLOCK : in STD_LOGIC := '0'; + OUTCLOCK : in STD_LOGIC := '0'; + MEMENAB : in STD_LOGIC := '1'; + Q : out STD_LOGIC_VECTOR(LPM_WIDTH-1 downto 0) + ); + end component; + + signal vdd_s : std_logic; + +begin + + vdd_s <= '1'; + + rom_b : lpm_rom + generic map ( + LPM_WIDTH => 8, + LPM_WIDTHAD => 10, + LPM_OUTDATA => "UNREGISTERED", + LPM_FILE => "rom_42x.hex" + ) + port map ( + ADDRESS => addr_i, + INCLOCK => ck_i, + OUTCLOCK => ck_i, + MEMENAB => vdd_s, + Q => data_o + ); + +end lpm; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/t420_rom-lpm-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/t420_rom-lpm-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/t420_rom-lpm-c.vhd (revision 172) @@ -0,0 +1,30 @@ +------------------------------------------------------------------------------- +-- +-- T420 ROM wrapper for lpm_rom. +-- +-- $Id: t420_rom-lpm-c.vhd,v 1.1 2006-05-14 22:31:08 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration t420_rom_struct_c0 of t420_rom is + + for lpm + + for rom_b: lpm_rom + use configuration work.lpm_rom_c0; + end for; + + end for; + +end t420_rom_struct_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/lpm_rom.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/lpm_rom.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/lpm_rom.vhd (revision 172) @@ -0,0 +1,437 @@ +-------------------------------------------------------------------------- +-- This VHDL file was developed by Altera Corporation. It may be +-- freely copied and/or distributed at no cost. Any persons using this +-- file for any purpose do so at their own risk, and are responsible for +-- the results of such use. Altera Corporation does not guarantee that +-- this file is complete, correct, or fit for any particular purpose. +-- NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. This notice must +-- accompany any copy of this file. +-- +-------------------------------------------------------------------------- +-- LPM Synthesizable Models (Support string type generic) +-------------------------------------------------------------------------- +-- Version 2.0 (lpm 220) Date 01/04/00 +-- +-- 1. Fixed LPM_RAM_DQ, LPM_RAM_DP, LPM_RAM_IO and LPM_ROM to correctly +-- read in values from LPM_FILE (*.hex) when the DATA width is greater +-- than 16 bits. +-- 2. Explicit sign conversions are added to standard logic vector +-- comparisons in LPM_RAM_DQ, LPM_RAM_DP, LPM_RAM_IO, LPM_ROM, and +-- LPM_COMPARE. +-- 3. LPM_FIFO_DC is rewritten to have correct outputs. +-- 4. LPM_FIFO outputs zeros when nothing has been read from it, and +-- outputs LPM_NUMWORDS mod exp(2, LPM_WIDTHU) when it is full. +-- 5. Fixed LPM_DIVIDE to divide correctly. +-------------------------------------------------------------------------- +-- Version 1.9 (lpm 220) Date 11/30/99 +-- +-- 1. Fixed UNUSED file not found problem and initialization problem +-- with LPM_RAM_DP, LPM_RAM_DQ, and LPM_RAM_IO. +-- 2. Fixed LPM_MULT when SUM port is not used. +-- 3. Fixed LPM_FIFO_DC to enable read when rdclock and wrclock rise +-- at the same time. +-- 4. Fixed LPM_COUNTER comparison problem when signed library is loaded +-- and counter is incrementing. +-- 5. Got rid of "Illegal Character" error message at time = 0 ns when +-- simulating LPM_COUNTER. +-------------------------------------------------------------------------- +-- Version 1.8 (lpm 220) Date 10/25/99 +-- +-- 1. Some LPM_PVALUE implementations were missing, and now implemented. +-- 2. Fixed LPM_COUNTER to count correctly without conversion overflow, +-- that is, when LPM_MODULUS = 2 ** LPM_WIDTH. +-- 3. Fixed LPM_RAM_DP sync process sensitivity list to detect wraddress +-- changes. +-------------------------------------------------------------------------- +-- Version 1.7 (lpm 220) Date 07/13/99 +-- +-- Changed LPM_RAM_IO so that it can be used to simulate both MP2 and +-- Quartus behaviour and LPM220-compliant behaviour. +-------------------------------------------------------------------------- +-- Version 1.6 (lpm 220) Date 06/15/99 +-- +-- 1. Fixed LPM_ADD_SUB sign extension problem and subtraction bug. +-- 2. Fixed LPM_COUNTER to use LPM_MODULUS value. +-- 3. Added CIN and COUT port, and discarded EQ port in LPM_COUNTER to +-- comply with the specfication. +-- 4. Included LPM_RAM_DP, LPM_RAM_DQ, LPM_RAM_IO, LPM_ROM, LPM_FIFO, and +-- LPM_FIFO_DC; they are all initialized to 0's. +-------------------------------------------------------------------------- +-- Version 1.5 (lpm 220) Date 05/10/99 +-- +-- Changed LPM_MODULUS from string type to integer. +-------------------------------------------------------------------------- +-- Version 1.4 (lpm 220) Date 02/05/99 +-- +-- 1. Added LPM_DIVIDE module. +-- 2. Added CLKEN port to LPM_MUX, LPM_DECODE, LPM_ADD_SUB, LPM_MULT +-- and LPM_COMPARE +-- 3. Replaced the constants holding string with the actual string. +-------------------------------------------------------------------------- +-- Version 1.3 Date 07/30/96 +-- +-- Modification History +-- +-- 1. Changed the DEFAULT value to "UNUSED" for LPM_SVALUE, LPM_AVALUE, +-- LPM_MODULUS, and LPM_NUMWORDS, LPM_HINT,LPM_STRENGTH, LPM_DIRECTION, +-- and LPM_PVALUE +-- +-- 2. Added the two dimentional port components (AND, OR, XOR, and MUX). +-------------------------------------------------------------------------- +-- Excluded Functions: +-- +-- LPM_FSM and LPM_TTABLE +-- +-------------------------------------------------------------------------- +-- Assumptions: +-- +-- 1. All ports and signal types are std_logic or std_logic_vector +-- from IEEE 1164 package. +-- 2. Synopsys std_logic_arith, std_logic_unsigned, and std_logic_signed +-- package are assumed to be accessible from IEEE library. +-- 3. lpm_component_package must be accessible from library work. +-- 4. The default value of LPM_SVALUE, LPM_AVALUE, LPM_MODULUS, LPM_HINT, +-- LPM_NUMWORDS, LPM_STRENGTH, LPM_DIRECTION, and LPM_PVALUE is +-- string "UNUSED". +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +--use work.LPM_COMPONENTS.all; +use std.textio.all; + +entity LPM_ROM is + generic (LPM_WIDTH : positive; + LPM_WIDTHAD : positive; + LPM_NUMWORDS : natural := 0; + LPM_ADDRESS_CONTROL : string := "REGISTERED"; + LPM_OUTDATA : string := "REGISTERED"; + LPM_FILE : string; + LPM_TYPE : string := "LPM_ROM"; + LPM_HINT : string := "UNUSED"); + port (ADDRESS : in STD_LOGIC_VECTOR(LPM_WIDTHAD-1 downto 0); + INCLOCK : in STD_LOGIC := '0'; + OUTCLOCK : in STD_LOGIC := '0'; + MEMENAB : in STD_LOGIC := '1'; + Q : out STD_LOGIC_VECTOR(LPM_WIDTH-1 downto 0)); + + function int_to_str( value : integer ) return string is + variable ivalue,index : integer; + variable digit : integer; + variable line_no: string(8 downto 1) := " "; + begin + ivalue := value; + index := 1; + while (ivalue > 0 ) loop + digit := ivalue MOD 10; + ivalue := ivalue/10; + case digit is + when 0 => + line_no(index) := '0'; + when 1 => + line_no(index) := '1'; + when 2 => + line_no(index) := '2'; + when 3 => + line_no(index) := '3'; + when 4 => + line_no(index) := '4'; + when 5 => + line_no(index) := '5'; + when 6 => + line_no(index) := '6'; + when 7 => + line_no(index) := '7'; + when 8 => + line_no(index) := '8'; + when 9 => + line_no(index) := '9'; + when others => + ASSERT FALSE + REPORT "Illegal number!" + SEVERITY ERROR; + end case; + index := index + 1; + end loop; + return line_no; + end; + + function hex_str_to_int( str : string ) return integer is + variable len : integer := str'length; + variable ivalue : integer := 0; + variable digit : integer; + begin + for i in len downto 1 loop + case str(i) is + when '0' => + digit := 0; + when '1' => + digit := 1; + when '2' => + digit := 2; + when '3' => + digit := 3; + when '4' => + digit := 4; + when '5' => + digit := 5; + when '6' => + digit := 6; + when '7' => + digit := 7; + when '8' => + digit := 8; + when '9' => + digit := 9; + when 'A' => + digit := 10; + when 'a' => + digit := 10; + when 'B' => + digit := 11; + when 'b' => + digit := 11; + when 'C' => + digit := 12; + when 'c' => + digit := 12; + when 'D' => + digit := 13; + when 'd' => + digit := 13; + when 'E' => + digit := 14; + when 'e' => + digit := 14; + when 'F' => + digit := 15; + when 'f' => + digit := 15; + when others => + ASSERT FALSE + REPORT "Illegal character "& str(i) & "in Intel Hex File! " + SEVERITY ERROR; + end case; + ivalue := ivalue * 16 + digit; + end loop; + return ivalue; + end; + + procedure Shrink_line(L : inout LINE; pos : in integer) is + subtype nstring is string(1 to pos); + variable stmp : nstring; + begin + if pos >= 1 then + read(l, stmp); + end if; + end; + +end LPM_ROM; + +architecture LPM_SYN of lpm_rom is + +--type lpm_memory is array(lpm_numwords-1 downto 0) of std_logic_vector(lpm_width-1 downto 0); +type lpm_memory is array(integer range (2**lpm_widthad)-1 downto 0) of std_logic_vector(lpm_width-1 downto 0); + +signal q2, q_tmp, q_reg : std_logic_vector(lpm_width-1 downto 0); +signal address_tmp, address_reg : std_logic_vector(lpm_widthad-1 downto 0); + +begin + + enable_mem: process(memenab, q2) + begin + if (memenab = '1') then + q <= q2; + else + q <= (OTHERS => 'Z'); + end if; + end process; + + sync: process(address, address_reg, q_tmp, q_reg) + begin + if (lpm_address_control = "REGISTERED") then + address_tmp <= address_reg; + else + address_tmp <= address; + end if; + if (lpm_outdata = "REGISTERED") then + q2 <= q_reg; + else + q2 <= q_tmp; + end if; + end process; + + input_reg: process (inclock) + begin + if inclock'event and inclock = '1' then + address_reg <= address; + end if; + end process; + + output_reg: process (outclock) + begin + if outclock'event and outclock = '1' then + q_reg <= q_tmp; + end if; + end process; + + memory: process(memenab, address_tmp) + variable mem_data : lpm_memory; + variable mem_data_tmp : integer := 0; + variable mem_init: boolean := false; + variable i, j, k, lineno : integer := 0; + variable buf: line ; + variable booval: boolean ; + FILE mem_data_file: TEXT IS IN LPM_FILE; + variable base, byte, rec_type, datain, addr, checksum: string(2 downto 1); + variable startadd: string(4 downto 1); + variable ibase: integer := 0; + variable ibyte: integer := 0; + variable istartadd: integer := 0; + variable check_sum_vec, check_sum_vec_tmp: unsigned(7 downto 0); + begin + -- INITIALIZE -- + if NOT(mem_init) then + -- INITIALIZE TO 0 -- + for i in mem_data'LOW to mem_data'HIGH loop + mem_data(i) := (OTHERS => '0'); + end loop; + + if (LPM_FILE = "UNUSED") then + ASSERT FALSE + REPORT "Initialization file not found!" + SEVERITY ERROR; + else + WHILE NOT ENDFILE(mem_data_file) loop + booval := true; + READLINE(mem_data_file, buf); + lineno := lineno + 1; + check_sum_vec := (OTHERS => '0'); + if (buf(buf'LOW) = ':') then + i := 1; + shrink_line(buf, i); + READ(L=>buf, VALUE=>byte, good=>booval); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format!" + SEVERITY ERROR; + end if; + ibyte := hex_str_to_int(byte); + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(ibyte, 8); + READ(L=>buf, VALUE=>startadd, good=>booval); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + istartadd := hex_str_to_int(startadd); + addr(2) := startadd(4); + addr(1) := startadd(3); + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(addr), check_sum_vec'length); + addr(2) := startadd(2); + addr(1) := startadd(1); + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(addr), check_sum_vec'length); + READ(L=>buf, VALUE=>rec_type, good=>booval); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(rec_type), check_sum_vec'length); + else + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + case rec_type is + when "00"=> -- Data record + i := 0; + k := lpm_width / 8; + if ((lpm_width MOD 8) /= 0) then + k := k + 1; + end if; + -- k = no. of bytes per CAM entry. + while (i < ibyte) loop + mem_data_tmp := 0; + for j in 1 to k loop + READ(L=>buf, VALUE=>datain,good=>booval); -- read in data a byte (2 hex chars) at a time. + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(datain), check_sum_vec'length); + mem_data_tmp := mem_data_tmp * 256 + hex_str_to_int(datain); + end loop; + i := i + k; + mem_data(ibase + istartadd) := STD_LOGIC_VECTOR(to_unsigned(mem_data_tmp, lpm_width)); + istartadd := istartadd + 1; + end loop; + when "01"=> + exit; + when "02"=> + ibase := 0; + if (ibyte /= 2) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format for record type 02! " + SEVERITY ERROR; + end if; + for i in 0 to (ibyte-1) loop + READ(L=>buf, VALUE=>base,good=>booval); + ibase := ibase * 256 + hex_str_to_int(base); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(base), check_sum_vec'length); + end loop; + ibase := ibase * 16; + when OTHERS => + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal record type in Intel Hex File! " + SEVERITY ERROR; + end case; + READ(L=>buf, VALUE=>checksum,good=>booval); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Checksum is missing! " + SEVERITY ERROR; + end if; + + check_sum_vec := unsigned(not (check_sum_vec)) + 1 ; + check_sum_vec_tmp := to_unsigned(hex_str_to_int(checksum),8); + + if (unsigned(check_sum_vec) /= unsigned(check_sum_vec_tmp)) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Incorrect checksum!" + SEVERITY ERROR; + end if; + end loop; + end if; + mem_init := TRUE; + end if; + + -- MEMORY FUNCTION -- + --if memenab = '1' then + q_tmp <= mem_data(to_integer(UNSIGNED(address_tmp))); + --else + -- q_tmp <= (OTHERS => 'Z'); + --end if; + end process; + +end LPM_SYN; + + +--------------------------------------------------------------------------- + + +-- pragma translate_off +configuration lpm_rom_c0 of lpm_rom is + + for lpm_syn + end for; + +end lpm_rom_c0; +-- pragma translate_on Index: tags/rel_1_1/bench/vhdl/t410_rom-lpm-a.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/t410_rom-lpm-a.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/t410_rom-lpm-a.vhd (revision 172) @@ -0,0 +1,96 @@ +------------------------------------------------------------------------------- +-- +-- T410 ROM wrapper for lpm_rom. +-- +-- $Id: t410_rom-lpm-a.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $ +-- +-- Copyright (c) 2006 Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +-- Redistribution and use in source and synthezised forms, with or without +-- modification, are permitted provided that the following conditions are met: +-- +-- Redistributions of source code must retain the above copyright notice, +-- this list of conditions and the following disclaimer. +-- +-- Redistributions in synthesized form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in the +-- documentation and/or other materials provided with the distribution. +-- +-- Neither the name of the author nor the names of other contributors may +-- be used to endorse or promote products derived from this software without +-- specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +-- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +-- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +-- PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE +-- LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +-- CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +-- SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +-- INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +-- CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +-- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +-- POSSIBILITY OF SUCH DAMAGE. +-- +-- Please report bugs to the author, but before you do so, please +-- make sure that this is not a derivative work and that +-- you have the latest version of this file. +-- +-- The latest version of this file can be found at: +-- http://www.opencores.org/cvsweb.shtml/t400/ +-- +------------------------------------------------------------------------------- + +architecture lpm of t410_rom is + + component lpm_rom + generic ( + LPM_WIDTH : positive; + LPM_WIDTHAD : positive; + LPM_NUMWORDS : natural := 0; + LPM_ADDRESS_CONTROL : string := "REGISTERED"; + LPM_OUTDATA : string := "REGISTERED"; + LPM_FILE : string; + LPM_TYPE : string := "LPM_ROM"; + LPM_HINT : string := "UNUSED" + ); + port ( + ADDRESS : in STD_LOGIC_VECTOR(LPM_WIDTHAD-1 downto 0); + INCLOCK : in STD_LOGIC := '0'; + OUTCLOCK : in STD_LOGIC := '0'; + MEMENAB : in STD_LOGIC := '1'; + Q : out STD_LOGIC_VECTOR(LPM_WIDTH-1 downto 0) + ); + end component; + + signal vdd_s : std_logic; + +begin + + vdd_s <= '1'; + + rom_b : lpm_rom + generic map ( + LPM_WIDTH => 8, + LPM_WIDTHAD => 9, + LPM_OUTDATA => "UNREGISTERED", + LPM_FILE => "rom_41x.hex" + ) + port map ( + ADDRESS => addr_i, + INCLOCK => ck_i, + OUTCLOCK => ck_i, + MEMENAB => vdd_s, + Q => data_o + ); + +end lpm; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/bench/vhdl/lpm_ram_dq.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/lpm_ram_dq.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/lpm_ram_dq.vhd (revision 172) @@ -0,0 +1,439 @@ +-------------------------------------------------------------------------- +-- This VHDL file was developed by Altera Corporation. It may be +-- freely copied and/or distributed at no cost. Any persons using this +-- file for any purpose do so at their own risk, and are responsible for +-- the results of such use. Altera Corporation does not guarantee that +-- this file is complete, correct, or fit for any particular purpose. +-- NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED. This notice must +-- accompany any copy of this file. +-- +-------------------------------------------------------------------------- +-- LPM Synthesizable Models (Support string type generic) +-------------------------------------------------------------------------- +-- Version 2.0 (lpm 220) Date 01/04/00 +-- +-- 1. Fixed LPM_RAM_DQ, LPM_RAM_DP, LPM_RAM_IO and LPM_ROM to correctly +-- read in values from LPM_FILE (*.hex) when the DATA width is greater +-- than 16 bits. +-- 2. Explicit sign conversions are added to standard logic vector +-- comparisons in LPM_RAM_DQ, LPM_RAM_DP, LPM_RAM_IO, LPM_ROM, and +-- LPM_COMPARE. +-- 3. LPM_FIFO_DC is rewritten to have correct outputs. +-- 4. LPM_FIFO outputs zeros when nothing has been read from it, and +-- outputs LPM_NUMWORDS mod exp(2, LPM_WIDTHU) when it is full. +-- 5. Fixed LPM_DIVIDE to divide correctly. +-------------------------------------------------------------------------- +-- Version 1.9 (lpm 220) Date 11/30/99 +-- +-- 1. Fixed UNUSED file not found problem and initialization problem +-- with LPM_RAM_DP, LPM_RAM_DQ, and LPM_RAM_IO. +-- 2. Fixed LPM_MULT when SUM port is not used. +-- 3. Fixed LPM_FIFO_DC to enable read when rdclock and wrclock rise +-- at the same time. +-- 4. Fixed LPM_COUNTER comparison problem when signed library is loaded +-- and counter is incrementing. +-- 5. Got rid of "Illegal Character" error message at time = 0 ns when +-- simulating LPM_COUNTER. +-------------------------------------------------------------------------- +-- Version 1.8 (lpm 220) Date 10/25/99 +-- +-- 1. Some LPM_PVALUE implementations were missing, and now implemented. +-- 2. Fixed LPM_COUNTER to count correctly without conversion overflow, +-- that is, when LPM_MODULUS = 2 ** LPM_WIDTH. +-- 3. Fixed LPM_RAM_DP sync process sensitivity list to detect wraddress +-- changes. +-------------------------------------------------------------------------- +-- Version 1.7 (lpm 220) Date 07/13/99 +-- +-- Changed LPM_RAM_IO so that it can be used to simulate both MP2 and +-- Quartus behaviour and LPM220-compliant behaviour. +-------------------------------------------------------------------------- +-- Version 1.6 (lpm 220) Date 06/15/99 +-- +-- 1. Fixed LPM_ADD_SUB sign extension problem and subtraction bug. +-- 2. Fixed LPM_COUNTER to use LPM_MODULUS value. +-- 3. Added CIN and COUT port, and discarded EQ port in LPM_COUNTER to +-- comply with the specfication. +-- 4. Included LPM_RAM_DP, LPM_RAM_DQ, LPM_RAM_IO, LPM_ROM, LPM_FIFO, and +-- LPM_FIFO_DC; they are all initialized to 0's. +-------------------------------------------------------------------------- +-- Version 1.5 (lpm 220) Date 05/10/99 +-- +-- Changed LPM_MODULUS from string type to integer. +-------------------------------------------------------------------------- +-- Version 1.4 (lpm 220) Date 02/05/99 +-- +-- 1. Added LPM_DIVIDE module. +-- 2. Added CLKEN port to LPM_MUX, LPM_DECODE, LPM_ADD_SUB, LPM_MULT +-- and LPM_COMPARE +-- 3. Replaced the constants holding string with the actual string. +-------------------------------------------------------------------------- +-- Version 1.3 Date 07/30/96 +-- +-- Modification History +-- +-- 1. Changed the DEFAULT value to "UNUSED" for LPM_SVALUE, LPM_AVALUE, +-- LPM_MODULUS, and LPM_NUMWORDS, LPM_HINT,LPM_STRENGTH, LPM_DIRECTION, +-- and LPM_PVALUE +-- +-- 2. Added the two dimentional port components (AND, OR, XOR, and MUX). +-------------------------------------------------------------------------- +-- Excluded Functions: +-- +-- LPM_FSM and LPM_TTABLE +-- +-------------------------------------------------------------------------- +-- Assumptions: +-- +-- 1. All ports and signal types are std_logic or std_logic_vector +-- from IEEE 1164 package. +-- 2. Synopsys std_logic_arith, std_logic_unsigned, and std_logic_signed +-- package are assumed to be accessible from IEEE library. +-- 3. lpm_component_package must be accessible from library work. +-- 4. The default value of LPM_SVALUE, LPM_AVALUE, LPM_MODULUS, LPM_HINT, +-- LPM_NUMWORDS, LPM_STRENGTH, LPM_DIRECTION, and LPM_PVALUE is +-- string "UNUSED". +-------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; +--use IEEE.std_logic_unsigned.all; +use std.textio.all; + +entity LPM_RAM_DQ is + generic (LPM_WIDTH : positive; + LPM_WIDTHAD : positive; + LPM_NUMWORDS : natural := 0; + LPM_INDATA : string := "REGISTERED"; + LPM_ADDRESS_CONTROL: string := "REGISTERED"; + LPM_OUTDATA : string := "REGISTERED"; + LPM_FILE : string := "UNUSED"; + LPM_TYPE : string := "LPM_RAM_DQ"; + LPM_HINT : string := "UNUSED"); + port (DATA : in std_logic_vector(LPM_WIDTH-1 downto 0); + ADDRESS : in std_logic_vector(LPM_WIDTHAD-1 downto 0); + INCLOCK : in std_logic := '0'; + OUTCLOCK : in std_logic := '0'; + WE : in std_logic; + Q : out std_logic_vector(LPM_WIDTH-1 downto 0)); + + function int_to_str( value : integer ) return string is + variable ivalue,index : integer; + variable digit : integer; + variable line_no: string(8 downto 1) := " "; + begin + ivalue := value; + index := 1; + while (ivalue > 0) loop + digit := ivalue MOD 10; + ivalue := ivalue/10; + case digit is + when 0 => + line_no(index) := '0'; + when 1 => + line_no(index) := '1'; + when 2 => + line_no(index) := '2'; + when 3 => + line_no(index) := '3'; + when 4 => + line_no(index) := '4'; + when 5 => + line_no(index) := '5'; + when 6 => + line_no(index) := '6'; + when 7 => + line_no(index) := '7'; + when 8 => + line_no(index) := '8'; + when 9 => + line_no(index) := '9'; + when others => + ASSERT FALSE + REPORT "Illegal number!" + SEVERITY ERROR; + end case; + index := index + 1; + end loop; + return line_no; + end; + + function hex_str_to_int( str : string ) return integer is + variable len : integer := str'length; + variable ivalue : integer := 0; + variable digit : integer; + begin + for i in len downto 1 loop + case str(i) is + when '0' => + digit := 0; + when '1' => + digit := 1; + when '2' => + digit := 2; + when '3' => + digit := 3; + when '4' => + digit := 4; + when '5' => + digit := 5; + when '6' => + digit := 6; + when '7' => + digit := 7; + when '8' => + digit := 8; + when '9' => + digit := 9; + when 'A' => + digit := 10; + when 'a' => + digit := 10; + when 'B' => + digit := 11; + when 'b' => + digit := 11; + when 'C' => + digit := 12; + when 'c' => + digit := 12; + when 'D' => + digit := 13; + when 'd' => + digit := 13; + when 'E' => + digit := 14; + when 'e' => + digit := 14; + when 'F' => + digit := 15; + when 'f' => + digit := 15; + when others => + ASSERT FALSE + REPORT "Illegal character "& str(i) & "in Intel Hex File! " + SEVERITY ERROR; + end case; + ivalue := ivalue * 16 + digit; + end loop; + return ivalue; + end; + + procedure Shrink_line(L : inout LINE; pos : in integer) is + subtype nstring is string(1 to pos); + variable stmp : nstring; + begin + if pos >= 1 then + read(l, stmp); + end if; + end; + +end LPM_RAM_DQ; + +architecture LPM_SYN of lpm_ram_dq is + +--type lpm_memory is array(lpm_numwords-1 downto 0) of std_logic_vector(lpm_width-1 downto 0); +type lpm_memory is array(integer range (2**lpm_widthad)-1 downto 0) of std_logic_vector(lpm_width-1 downto 0); + +signal data_tmp, data_reg : std_logic_vector(lpm_width-1 downto 0); +signal q_tmp, q_reg : std_logic_vector(lpm_width-1 downto 0) := (others => '0'); +signal address_tmp, address_reg : std_logic_vector(lpm_widthad-1 downto 0); +signal we_tmp, we_reg : std_logic; + +begin + + sync: process(data, data_reg, address, address_reg, + we, we_reg, q_tmp, q_reg) + begin + if (lpm_address_control = "REGISTERED") then + address_tmp <= address_reg; + we_tmp <= we_reg; + else + address_tmp <= address; + we_tmp <= we; + end if; + if (lpm_indata = "REGISTERED") then + data_tmp <= data_reg; + else + data_tmp <= data; + end if; + if (lpm_outdata = "REGISTERED") then + q <= q_reg; + else + q <= q_tmp; + end if; + end process; + + input_reg: process (inclock) + begin + if inclock'event and inclock = '1' then + data_reg <= data; + address_reg <= address; + we_reg <= we; + end if; + end process; + + output_reg: process (outclock) + begin + if outclock'event and outclock = '1' then + q_reg <= q_tmp; + end if; + end process; + + memory: process(data_tmp, we_tmp, address_tmp) + variable mem_data : lpm_memory; + variable mem_data_tmp : integer := 0; + variable mem_init: boolean := false; + variable i,j,k,lineno: integer := 0; + variable buf: line ; + variable booval: boolean ; + FILE unused_file: TEXT IS OUT "UNUSED"; + FILE mem_data_file: TEXT IS IN LPM_FILE; + variable base, byte, rec_type, datain, addr, checksum: string(2 downto 1); + variable startadd: string(4 downto 1); + variable ibase: integer := 0; + variable ibyte: integer := 0; + variable istartadd: integer := 0; + variable check_sum_vec, check_sum_vec_tmp: unsigned(7 downto 0); + begin + -- INITIALIZE -- + if NOT(mem_init) then + -- INITIALIZE TO 0 -- + for i in mem_data'LOW to mem_data'HIGH loop + mem_data(i) := (OTHERS => '0'); + end loop; + + if (LPM_FILE = "UNUSED") then + ASSERT FALSE + REPORT "Initialization file not found!" + SEVERITY WARNING; + else + WHILE NOT ENDFILE(mem_data_file) loop + booval := true; + READLINE(mem_data_file, buf); + lineno := lineno + 1; + check_sum_vec := (OTHERS => '0'); + if (buf(buf'LOW) = ':') then + i := 1; + shrink_line(buf, i); + READ(L=>buf, VALUE=>byte, good=>booval); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format!" + SEVERITY ERROR; + end if; + ibyte := hex_str_to_int(byte); + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(ibyte, check_sum_vec'length); + READ(L=>buf, VALUE=>startadd, good=>booval); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + istartadd := hex_str_to_int(startadd); + addr(2) := startadd(4); + addr(1) := startadd(3); + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(addr), check_sum_vec'length); + addr(2) := startadd(2); + addr(1) := startadd(1); + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(addr), check_sum_vec'length); + READ(L=>buf, VALUE=>rec_type, good=>booval); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(rec_type), check_sum_vec'length); + else + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + case rec_type is + when "00"=> -- Data record + i := 0; + k := lpm_width / 8; + if ((lpm_width MOD 8) /= 0) then + k := k + 1; + end if; + -- k = no. of bytes per CAM entry. + while (i < ibyte) loop + mem_data_tmp := 0; + for j in 1 to k loop + READ(L=>buf, VALUE=>datain,good=>booval); -- read in data a byte (2 hex chars) at a time. + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(datain), check_sum_vec'length); + mem_data_tmp := mem_data_tmp * 256 + hex_str_to_int(datain); + end loop; + i := i + k; + mem_data(ibase + istartadd) := STD_LOGIC_VECTOR(to_unsigned(mem_data_tmp, lpm_width)); + istartadd := istartadd + 1; + end loop; + when "01"=> + exit; + when "02"=> + ibase := 0; + if (ibyte /= 2) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format for record type 02! " + SEVERITY ERROR; + end if; + for i in 0 to (ibyte-1) loop + READ(L=>buf, VALUE=>base,good=>booval); + ibase := ibase * 256 + hex_str_to_int(base); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal Intel Hex Format! " + SEVERITY ERROR; + end if; + check_sum_vec := unsigned(check_sum_vec) + to_unsigned(hex_str_to_int(base), check_sum_vec'length); + end loop; + ibase := ibase * 16; + when OTHERS => + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Illegal record type in Intel Hex File! " + SEVERITY ERROR; + end case; + READ(L=>buf, VALUE=>checksum,good=>booval); + if not (booval) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Checksum is missing! " + SEVERITY ERROR; + end if; + + check_sum_vec := unsigned(not (check_sum_vec)) + 1 ; + check_sum_vec_tmp := to_unsigned(hex_str_to_int(checksum), check_sum_vec_tmp'length); + + if (unsigned(check_sum_vec) /= unsigned(check_sum_vec_tmp)) then + ASSERT FALSE + REPORT "[Line "& int_to_str(lineno) & "]:Incorrect checksum!" + SEVERITY ERROR; + end if; + end loop; + end if; + mem_init := TRUE; + end if; + + -- MEMORY FUNCTION -- + if we_tmp = '1' then + mem_data (to_integer(unsigned(address_tmp))) := data_tmp; + end if; + q_tmp <= mem_data(to_integer(unsigned(address_tmp))); + end process; + +end LPM_SYN; + + +-- pragma translate_off +configuration lpm_ram_dq_c0 of lpm_ram_dq is + + for lpm_syn + end for; + +end lpm_ram_dq_c0; +-- pragma translate_on Index: tags/rel_1_1/bench/vhdl/t410_rom-lpm-c.vhd =================================================================== --- tags/rel_1_1/bench/vhdl/t410_rom-lpm-c.vhd (nonexistent) +++ tags/rel_1_1/bench/vhdl/t410_rom-lpm-c.vhd (revision 172) @@ -0,0 +1,30 @@ +------------------------------------------------------------------------------- +-- +-- T410 ROM wrapper for lpm_rom. +-- +-- $Id: t410_rom-lpm-c.vhd,v 1.1.1.1 2006-05-06 01:56:44 arniml Exp $ +-- +-- Copyright (c) 2006, Arnim Laeuger (arniml@opencores.org) +-- +-- All rights reserved +-- +------------------------------------------------------------------------------- + +configuration t410_rom_struct_c0 of t410_rom is + + for lpm + + for rom_b: lpm_rom + use configuration work.lpm_rom_c0; + end for; + + end for; + +end t410_rom_struct_c0; + + +------------------------------------------------------------------------------- +-- File History: +-- +-- $Log: not supported by cvs2svn $ +------------------------------------------------------------------------------- Index: tags/rel_1_1/KNOWN_BUGS =================================================================== --- tags/rel_1_1/KNOWN_BUGS (nonexistent) +++ tags/rel_1_1/KNOWN_BUGS (revision 172) @@ -0,0 +1,19 @@ + +Known bugs of the T400 uController core +======================================= +Version: $Date: 2006-06-11 13:38:16 $ + + +Release 0.1 BETA +---------------- + +******************************************************************************* +Timer skipped in T421 configuration + +When the generic opt_type_g is set to t400_opt_type_421_c inside t400_core, +the timer module is not included in the core. This is wrong because the COP421 +chip contains this timer. + +Fixed in: +t400_core.vhd 1.10 +Fix will be included in next release. Index: tags/rel_1_1/COPYING =================================================================== --- tags/rel_1_1/COPYING (nonexistent) +++ tags/rel_1_1/COPYING (revision 172) @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) 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 +this service 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 make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. 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. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +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 +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the 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 a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE 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. + + 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 +convey 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) 19yy + + 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19yy name of author + Gnomovision 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, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This 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 Library General +Public License instead of this License.

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.