URL
https://opencores.org/ocsvn/neorv32/neorv32/trunk
Subversion Repositories neorv32
Compare Revisions
- This comparison shows the changes necessary to convert path
/neorv32/trunk/rtl/core
- from Rev 59 to Rev 60
- ↔ Reverse comparison
Rev 59 → Rev 60
/neorv32_cpu_cp_bitmanip.vhd
File deleted
/neorv32_application_image.vhd
1,4 → 1,4
-- The NEORV32 Processor by Stephan Nolting, https://github.com/stnolting/neorv32 |
-- The NEORV32 RISC-V Processor, https://github.com/stnolting/neorv32 |
-- Auto-generated memory init file (for APPLICATION) from source file <blink_led/main.bin> |
|
library ieee; |
6,7 → 6,7
|
package neorv32_application_image is |
|
type application_init_image_t is array (0 to 1066) of std_ulogic_vector(31 downto 0); |
type application_init_image_t is array (0 to 1062) of std_ulogic_vector(31 downto 0); |
constant application_init_image : application_init_image_t := ( |
00000000 => x"00000013", |
00000001 => x"00000093", |
25,7 → 25,7
00000014 => x"80000197", |
00000015 => x"7c818193", |
00000016 => x"00000517", |
00000017 => x"10050513", |
00000017 => x"0fc50513", |
00000018 => x"30551073", |
00000019 => x"34151073", |
00000020 => x"34301073", |
56,7 → 56,7
00000045 => x"00000f13", |
00000046 => x"00000f93", |
00000047 => x"00000417", |
00000048 => x"e4440413", |
00000048 => x"d4440413", |
00000049 => x"00000497", |
00000050 => x"f3c48493", |
00000051 => x"00042023", |
70,7 → 70,7
00000059 => x"00158593", |
00000060 => x"ff5ff06f", |
00000061 => x"00001597", |
00000062 => x"fb458593", |
00000062 => x"fa458593", |
00000063 => x"80000617", |
00000064 => x"f0460613", |
00000065 => x"80000697", |
83,997 → 83,993
00000072 => x"fedff06f", |
00000073 => x"00000513", |
00000074 => x"00000593", |
00000075 => x"060000ef", |
00000075 => x"05c000ef", |
00000076 => x"30047073", |
00000077 => x"00000013", |
00000078 => x"10500073", |
00000079 => x"0000006f", |
00000080 => x"ff810113", |
00000081 => x"00812023", |
00000082 => x"00912223", |
00000083 => x"34202473", |
00000084 => x"02044663", |
00000085 => x"34102473", |
00000086 => x"00041483", |
00000087 => x"0034f493", |
00000088 => x"00240413", |
00000089 => x"34141073", |
00000090 => x"00300413", |
00000091 => x"00941863", |
00000092 => x"34102473", |
00000093 => x"00240413", |
00000094 => x"34141073", |
00000095 => x"00012403", |
00000096 => x"00412483", |
00000097 => x"00810113", |
00000098 => x"30200073", |
00000099 => x"00005537", |
00000100 => x"ff010113", |
00000101 => x"00000613", |
00000102 => x"00000593", |
00000103 => x"b0050513", |
00000104 => x"00112623", |
00000105 => x"248000ef", |
00000106 => x"1e5000ef", |
00000107 => x"02050063", |
00000108 => x"135000ef", |
00000109 => x"00000513", |
00000110 => x"189000ef", |
00000111 => x"00001537", |
00000112 => x"d3050513", |
00000113 => x"298000ef", |
00000114 => x"020000ef", |
00000115 => x"00001537", |
00000116 => x"d0c50513", |
00000117 => x"288000ef", |
00000118 => x"00c12083", |
00000119 => x"00000513", |
00000120 => x"01010113", |
00000121 => x"00008067", |
00000122 => x"ff010113", |
00000123 => x"00000513", |
00000124 => x"00812423", |
00000125 => x"00112623", |
00000126 => x"00000413", |
00000127 => x"1a1000ef", |
00000128 => x"0ff47513", |
00000129 => x"199000ef", |
00000130 => x"0c800513", |
00000131 => x"420000ef", |
00000132 => x"00140413", |
00000133 => x"fedff06f", |
00000134 => x"fd010113", |
00000135 => x"02812423", |
00000136 => x"02912223", |
00000137 => x"03212023", |
00000138 => x"01312e23", |
00000139 => x"01412c23", |
00000140 => x"02112623", |
00000141 => x"01512a23", |
00000142 => x"00001a37", |
00000143 => x"00050493", |
00000144 => x"00058413", |
00000145 => x"00058523", |
00000146 => x"00000993", |
00000147 => x"00410913", |
00000148 => x"d4ca0a13", |
00000149 => x"00a00593", |
00000150 => x"00048513", |
00000151 => x"24d000ef", |
00000152 => x"00aa0533", |
00000153 => x"00054783", |
00000154 => x"01390ab3", |
00000155 => x"00048513", |
00000156 => x"00fa8023", |
00000157 => x"00a00593", |
00000158 => x"1e9000ef", |
00000159 => x"00198993", |
00000160 => x"00a00793", |
00000161 => x"00050493", |
00000162 => x"fcf996e3", |
00000163 => x"00090693", |
00000164 => x"00900713", |
00000165 => x"03000613", |
00000166 => x"0096c583", |
00000167 => x"00070793", |
00000168 => x"fff70713", |
00000169 => x"01071713", |
00000170 => x"01075713", |
00000171 => x"00c59a63", |
00000172 => x"000684a3", |
00000173 => x"fff68693", |
00000174 => x"fe0710e3", |
00000175 => x"00000793", |
00000176 => x"00f907b3", |
00000177 => x"00000593", |
00000178 => x"0007c703", |
00000179 => x"00070c63", |
00000180 => x"00158693", |
00000181 => x"00b405b3", |
00000182 => x"00e58023", |
00000183 => x"01069593", |
00000184 => x"0105d593", |
00000185 => x"fff78713", |
00000186 => x"02f91863", |
00000187 => x"00b40433", |
00000188 => x"00040023", |
00000189 => x"02c12083", |
00000190 => x"02812403", |
00000191 => x"02412483", |
00000192 => x"02012903", |
00000193 => x"01c12983", |
00000194 => x"01812a03", |
00000195 => x"01412a83", |
00000196 => x"03010113", |
00000197 => x"00008067", |
00000198 => x"00070793", |
00000199 => x"fadff06f", |
00000200 => x"00001637", |
00000201 => x"00758693", |
00000202 => x"00000713", |
00000203 => x"d5860613", |
00000204 => x"02000813", |
00000205 => x"00e557b3", |
00000206 => x"00f7f793", |
00000207 => x"00f607b3", |
00000208 => x"0007c783", |
00000209 => x"00470713", |
00000210 => x"fff68693", |
00000211 => x"00f680a3", |
00000212 => x"ff0712e3", |
00000213 => x"00058423", |
00000214 => x"00008067", |
00000215 => x"fa002023", |
00000216 => x"fe002703", |
00000217 => x"00151513", |
00000218 => x"00000793", |
00000219 => x"04a77463", |
00000220 => x"000016b7", |
00000221 => x"00000713", |
00000222 => x"ffe68693", |
00000223 => x"04f6e663", |
00000224 => x"00367613", |
00000225 => x"0035f593", |
00000226 => x"fff78793", |
00000227 => x"01461613", |
00000228 => x"00c7e7b3", |
00000229 => x"01659593", |
00000230 => x"01871713", |
00000231 => x"00b7e7b3", |
00000232 => x"00e7e7b3", |
00000233 => x"10000737", |
00000234 => x"00e7e7b3", |
00000235 => x"faf02023", |
00000236 => x"00008067", |
00000237 => x"00178793", |
00000238 => x"01079793", |
00000239 => x"40a70733", |
00000240 => x"0107d793", |
00000241 => x"fa9ff06f", |
00000242 => x"ffe70513", |
00000243 => x"0fd57513", |
00000244 => x"00051a63", |
00000245 => x"0037d793", |
00000246 => x"00170713", |
00000247 => x"0ff77713", |
00000248 => x"f9dff06f", |
00000249 => x"0017d793", |
00000250 => x"ff1ff06f", |
00000251 => x"f71ff06f", |
00000252 => x"fa002783", |
00000253 => x"fe07cee3", |
00000254 => x"faa02223", |
00000255 => x"00008067", |
00000256 => x"ff1ff06f", |
00000257 => x"ff010113", |
00000258 => x"00812423", |
00000259 => x"01212023", |
00000260 => x"00112623", |
00000261 => x"00912223", |
00000262 => x"00050413", |
00000263 => x"00a00913", |
00000264 => x"00044483", |
00000265 => x"00140413", |
00000266 => x"00049e63", |
00000267 => x"00c12083", |
00000268 => x"00812403", |
00000269 => x"00412483", |
00000270 => x"00012903", |
00000271 => x"01010113", |
00000272 => x"00008067", |
00000273 => x"01249663", |
00000274 => x"00d00513", |
00000275 => x"fa5ff0ef", |
00000276 => x"00048513", |
00000277 => x"f9dff0ef", |
00000278 => x"fc9ff06f", |
00000279 => x"fa9ff06f", |
00000280 => x"fa010113", |
00000281 => x"04f12a23", |
00000282 => x"04410793", |
00000283 => x"02812c23", |
00000284 => x"03212823", |
00000285 => x"03412423", |
00000286 => x"03512223", |
00000287 => x"03612023", |
00000288 => x"01712e23", |
00000289 => x"01812c23", |
00000290 => x"01912a23", |
00000291 => x"02112e23", |
00000292 => x"02912a23", |
00000293 => x"03312623", |
00000294 => x"00050413", |
00000295 => x"04b12223", |
00000296 => x"04c12423", |
00000297 => x"04d12623", |
00000298 => x"04e12823", |
00000299 => x"05012c23", |
00000300 => x"05112e23", |
00000301 => x"00f12023", |
00000302 => x"02500a13", |
00000303 => x"00a00a93", |
00000304 => x"07300913", |
00000305 => x"07500b13", |
00000306 => x"07800b93", |
00000307 => x"06300c13", |
00000308 => x"06900c93", |
00000309 => x"00044483", |
00000310 => x"02049c63", |
00000311 => x"03c12083", |
00000312 => x"03812403", |
00000313 => x"03412483", |
00000314 => x"03012903", |
00000315 => x"02c12983", |
00000316 => x"02812a03", |
00000317 => x"02412a83", |
00000318 => x"02012b03", |
00000319 => x"01c12b83", |
00000320 => x"01812c03", |
00000321 => x"01412c83", |
00000322 => x"06010113", |
00000323 => x"00008067", |
00000324 => x"0d449863", |
00000325 => x"00240993", |
00000326 => x"00144403", |
00000327 => x"05240263", |
00000328 => x"00896e63", |
00000329 => x"05840c63", |
00000330 => x"07940663", |
00000331 => x"02500513", |
00000332 => x"ec1ff0ef", |
00000333 => x"00040513", |
00000334 => x"0540006f", |
00000335 => x"09640663", |
00000336 => x"ff7416e3", |
00000337 => x"00012783", |
00000338 => x"00410593", |
00000339 => x"0007a503", |
00000340 => x"00478713", |
00000341 => x"00e12023", |
00000342 => x"dc9ff0ef", |
00000343 => x"0640006f", |
00000344 => x"00012783", |
00000345 => x"0007a503", |
00000346 => x"00478713", |
00000347 => x"00e12023", |
00000348 => x"e95ff0ef", |
00000349 => x"00098413", |
00000350 => x"f5dff06f", |
00000351 => x"00012783", |
00000352 => x"0007c503", |
00000353 => x"00478713", |
00000354 => x"00e12023", |
00000355 => x"e65ff0ef", |
00000356 => x"fe5ff06f", |
00000357 => x"00012783", |
00000358 => x"0007a403", |
00000359 => x"00478713", |
00000360 => x"00e12023", |
00000361 => x"00045863", |
00000362 => x"02d00513", |
00000363 => x"40800433", |
00000364 => x"e41ff0ef", |
00000365 => x"00410593", |
00000366 => x"00040513", |
00000367 => x"c5dff0ef", |
00000368 => x"00410513", |
00000369 => x"fadff06f", |
00000370 => x"00012783", |
00000371 => x"00410593", |
00000372 => x"00478713", |
00000373 => x"0007a503", |
00000374 => x"00e12023", |
00000375 => x"fe1ff06f", |
00000376 => x"01549663", |
00000377 => x"00d00513", |
00000378 => x"e09ff0ef", |
00000379 => x"00140993", |
00000380 => x"00048513", |
00000381 => x"f99ff06f", |
00000382 => x"fd010113", |
00000383 => x"00112623", |
00000384 => x"00b12a23", |
00000385 => x"00c12c23", |
00000386 => x"00d12e23", |
00000387 => x"02e12023", |
00000388 => x"02f12223", |
00000389 => x"03012423", |
00000390 => x"03112623", |
00000391 => x"e45ff0ef", |
00000392 => x"00c12083", |
00000393 => x"03010113", |
00000394 => x"00008067", |
00000395 => x"fe010113", |
00000396 => x"00112e23", |
00000397 => x"00050613", |
00000398 => x"00055863", |
00000399 => x"40a00633", |
00000400 => x"01061613", |
00000401 => x"41065613", |
00000402 => x"fe002503", |
00000403 => x"3e800593", |
00000404 => x"00c12623", |
00000405 => x"60c000ef", |
00000406 => x"00c12603", |
00000407 => x"00000593", |
00000408 => x"41f65693", |
00000409 => x"564000ef", |
00000410 => x"01c59593", |
00000411 => x"00455513", |
00000412 => x"00a5e533", |
00000413 => x"00050a63", |
00000414 => x"00050863", |
00000415 => x"fff50513", |
00000416 => x"00000013", |
00000417 => x"ff1ff06f", |
00000418 => x"01c12083", |
00000419 => x"02010113", |
00000420 => x"00008067", |
00000421 => x"00000000", |
00000422 => x"00000000", |
00000423 => x"00000000", |
00000424 => x"fc010113", |
00000425 => x"02112e23", |
00000426 => x"02512c23", |
00000427 => x"02612a23", |
00000428 => x"02712823", |
00000429 => x"02a12623", |
00000430 => x"02b12423", |
00000431 => x"02c12223", |
00000432 => x"02d12023", |
00000433 => x"00e12e23", |
00000434 => x"00f12c23", |
00000435 => x"01012a23", |
00000436 => x"01112823", |
00000437 => x"01c12623", |
00000438 => x"01d12423", |
00000439 => x"01e12223", |
00000440 => x"01f12023", |
00000441 => x"34102773", |
00000442 => x"34071073", |
00000443 => x"342027f3", |
00000444 => x"0807ca63", |
00000445 => x"00071683", |
00000446 => x"00300593", |
00000447 => x"0036f693", |
00000448 => x"00270613", |
00000449 => x"00b69463", |
00000450 => x"00470613", |
00000451 => x"34161073", |
00000452 => x"00b00713", |
00000453 => x"04f77c63", |
00000454 => x"000017b7", |
00000455 => x"91c78793", |
00000456 => x"000780e7", |
00000457 => x"03c12083", |
00000458 => x"03812283", |
00000459 => x"03412303", |
00000460 => x"03012383", |
00000461 => x"02c12503", |
00000462 => x"02812583", |
00000463 => x"02412603", |
00000464 => x"02012683", |
00000465 => x"01c12703", |
00000466 => x"01812783", |
00000467 => x"01412803", |
00000468 => x"01012883", |
00000469 => x"00c12e03", |
00000470 => x"00812e83", |
00000471 => x"00412f03", |
00000472 => x"00012f83", |
00000473 => x"04010113", |
00000474 => x"30200073", |
00000475 => x"00001737", |
00000476 => x"00279793", |
00000477 => x"d6c70713", |
00000077 => x"10500073", |
00000078 => x"ffdff06f", |
00000079 => x"ff810113", |
00000080 => x"00812023", |
00000081 => x"00912223", |
00000082 => x"34202473", |
00000083 => x"02044663", |
00000084 => x"34102473", |
00000085 => x"00041483", |
00000086 => x"0034f493", |
00000087 => x"00240413", |
00000088 => x"34141073", |
00000089 => x"00300413", |
00000090 => x"00941863", |
00000091 => x"34102473", |
00000092 => x"00240413", |
00000093 => x"34141073", |
00000094 => x"00012403", |
00000095 => x"00412483", |
00000096 => x"00810113", |
00000097 => x"30200073", |
00000098 => x"00005537", |
00000099 => x"ff010113", |
00000100 => x"00000613", |
00000101 => x"00000593", |
00000102 => x"b0050513", |
00000103 => x"00112623", |
00000104 => x"248000ef", |
00000105 => x"1d9000ef", |
00000106 => x"02050063", |
00000107 => x"129000ef", |
00000108 => x"00000513", |
00000109 => x"17d000ef", |
00000110 => x"00001537", |
00000111 => x"d2050513", |
00000112 => x"298000ef", |
00000113 => x"020000ef", |
00000114 => x"00001537", |
00000115 => x"cfc50513", |
00000116 => x"288000ef", |
00000117 => x"00c12083", |
00000118 => x"00000513", |
00000119 => x"01010113", |
00000120 => x"00008067", |
00000121 => x"ff010113", |
00000122 => x"00000513", |
00000123 => x"00812423", |
00000124 => x"00112623", |
00000125 => x"00000413", |
00000126 => x"195000ef", |
00000127 => x"0ff47513", |
00000128 => x"18d000ef", |
00000129 => x"0c800513", |
00000130 => x"420000ef", |
00000131 => x"00140413", |
00000132 => x"fedff06f", |
00000133 => x"fd010113", |
00000134 => x"02812423", |
00000135 => x"02912223", |
00000136 => x"03212023", |
00000137 => x"01312e23", |
00000138 => x"01412c23", |
00000139 => x"02112623", |
00000140 => x"01512a23", |
00000141 => x"00001a37", |
00000142 => x"00050493", |
00000143 => x"00058413", |
00000144 => x"00058523", |
00000145 => x"00000993", |
00000146 => x"00410913", |
00000147 => x"d3ca0a13", |
00000148 => x"00a00593", |
00000149 => x"00048513", |
00000150 => x"241000ef", |
00000151 => x"00aa0533", |
00000152 => x"00054783", |
00000153 => x"01390ab3", |
00000154 => x"00048513", |
00000155 => x"00fa8023", |
00000156 => x"00a00593", |
00000157 => x"1dd000ef", |
00000158 => x"00198993", |
00000159 => x"00a00793", |
00000160 => x"00050493", |
00000161 => x"fcf996e3", |
00000162 => x"00090693", |
00000163 => x"00900713", |
00000164 => x"03000613", |
00000165 => x"0096c583", |
00000166 => x"00070793", |
00000167 => x"fff70713", |
00000168 => x"01071713", |
00000169 => x"01075713", |
00000170 => x"00c59a63", |
00000171 => x"000684a3", |
00000172 => x"fff68693", |
00000173 => x"fe0710e3", |
00000174 => x"00000793", |
00000175 => x"00f907b3", |
00000176 => x"00000593", |
00000177 => x"0007c703", |
00000178 => x"00070c63", |
00000179 => x"00158693", |
00000180 => x"00b405b3", |
00000181 => x"00e58023", |
00000182 => x"01069593", |
00000183 => x"0105d593", |
00000184 => x"fff78713", |
00000185 => x"02f91863", |
00000186 => x"00b40433", |
00000187 => x"00040023", |
00000188 => x"02c12083", |
00000189 => x"02812403", |
00000190 => x"02412483", |
00000191 => x"02012903", |
00000192 => x"01c12983", |
00000193 => x"01812a03", |
00000194 => x"01412a83", |
00000195 => x"03010113", |
00000196 => x"00008067", |
00000197 => x"00070793", |
00000198 => x"fadff06f", |
00000199 => x"00001637", |
00000200 => x"00758693", |
00000201 => x"00000713", |
00000202 => x"d4860613", |
00000203 => x"02000813", |
00000204 => x"00e557b3", |
00000205 => x"00f7f793", |
00000206 => x"00f607b3", |
00000207 => x"0007c783", |
00000208 => x"00470713", |
00000209 => x"fff68693", |
00000210 => x"00f680a3", |
00000211 => x"ff0712e3", |
00000212 => x"00058423", |
00000213 => x"00008067", |
00000214 => x"fa002023", |
00000215 => x"fe002703", |
00000216 => x"00151513", |
00000217 => x"00000793", |
00000218 => x"04a77463", |
00000219 => x"000016b7", |
00000220 => x"00000713", |
00000221 => x"ffe68693", |
00000222 => x"04f6e663", |
00000223 => x"00367613", |
00000224 => x"0035f593", |
00000225 => x"fff78793", |
00000226 => x"01461613", |
00000227 => x"00c7e7b3", |
00000228 => x"01659593", |
00000229 => x"01871713", |
00000230 => x"00b7e7b3", |
00000231 => x"00e7e7b3", |
00000232 => x"10000737", |
00000233 => x"00e7e7b3", |
00000234 => x"faf02023", |
00000235 => x"00008067", |
00000236 => x"00178793", |
00000237 => x"01079793", |
00000238 => x"40a70733", |
00000239 => x"0107d793", |
00000240 => x"fa9ff06f", |
00000241 => x"ffe70513", |
00000242 => x"0fd57513", |
00000243 => x"00051a63", |
00000244 => x"0037d793", |
00000245 => x"00170713", |
00000246 => x"0ff77713", |
00000247 => x"f9dff06f", |
00000248 => x"0017d793", |
00000249 => x"ff1ff06f", |
00000250 => x"f71ff06f", |
00000251 => x"fa002783", |
00000252 => x"fe07cee3", |
00000253 => x"faa02223", |
00000254 => x"00008067", |
00000255 => x"ff1ff06f", |
00000256 => x"ff010113", |
00000257 => x"00812423", |
00000258 => x"01212023", |
00000259 => x"00112623", |
00000260 => x"00912223", |
00000261 => x"00050413", |
00000262 => x"00a00913", |
00000263 => x"00044483", |
00000264 => x"00140413", |
00000265 => x"00049e63", |
00000266 => x"00c12083", |
00000267 => x"00812403", |
00000268 => x"00412483", |
00000269 => x"00012903", |
00000270 => x"01010113", |
00000271 => x"00008067", |
00000272 => x"01249663", |
00000273 => x"00d00513", |
00000274 => x"fa5ff0ef", |
00000275 => x"00048513", |
00000276 => x"f9dff0ef", |
00000277 => x"fc9ff06f", |
00000278 => x"fa9ff06f", |
00000279 => x"fa010113", |
00000280 => x"04f12a23", |
00000281 => x"04410793", |
00000282 => x"02812c23", |
00000283 => x"03212823", |
00000284 => x"03412423", |
00000285 => x"03512223", |
00000286 => x"03612023", |
00000287 => x"01712e23", |
00000288 => x"01812c23", |
00000289 => x"01912a23", |
00000290 => x"02112e23", |
00000291 => x"02912a23", |
00000292 => x"03312623", |
00000293 => x"00050413", |
00000294 => x"04b12223", |
00000295 => x"04c12423", |
00000296 => x"04d12623", |
00000297 => x"04e12823", |
00000298 => x"05012c23", |
00000299 => x"05112e23", |
00000300 => x"00f12023", |
00000301 => x"02500a13", |
00000302 => x"00a00a93", |
00000303 => x"07300913", |
00000304 => x"07500b13", |
00000305 => x"07800b93", |
00000306 => x"06300c13", |
00000307 => x"06900c93", |
00000308 => x"00044483", |
00000309 => x"02049c63", |
00000310 => x"03c12083", |
00000311 => x"03812403", |
00000312 => x"03412483", |
00000313 => x"03012903", |
00000314 => x"02c12983", |
00000315 => x"02812a03", |
00000316 => x"02412a83", |
00000317 => x"02012b03", |
00000318 => x"01c12b83", |
00000319 => x"01812c03", |
00000320 => x"01412c83", |
00000321 => x"06010113", |
00000322 => x"00008067", |
00000323 => x"0d449863", |
00000324 => x"00240993", |
00000325 => x"00144403", |
00000326 => x"05240263", |
00000327 => x"00896e63", |
00000328 => x"05840c63", |
00000329 => x"07940663", |
00000330 => x"02500513", |
00000331 => x"ec1ff0ef", |
00000332 => x"00040513", |
00000333 => x"0540006f", |
00000334 => x"09640663", |
00000335 => x"ff7416e3", |
00000336 => x"00012783", |
00000337 => x"00410593", |
00000338 => x"0007a503", |
00000339 => x"00478713", |
00000340 => x"00e12023", |
00000341 => x"dc9ff0ef", |
00000342 => x"0640006f", |
00000343 => x"00012783", |
00000344 => x"0007a503", |
00000345 => x"00478713", |
00000346 => x"00e12023", |
00000347 => x"e95ff0ef", |
00000348 => x"00098413", |
00000349 => x"f5dff06f", |
00000350 => x"00012783", |
00000351 => x"0007c503", |
00000352 => x"00478713", |
00000353 => x"00e12023", |
00000354 => x"e65ff0ef", |
00000355 => x"fe5ff06f", |
00000356 => x"00012783", |
00000357 => x"0007a403", |
00000358 => x"00478713", |
00000359 => x"00e12023", |
00000360 => x"00045863", |
00000361 => x"02d00513", |
00000362 => x"40800433", |
00000363 => x"e41ff0ef", |
00000364 => x"00410593", |
00000365 => x"00040513", |
00000366 => x"c5dff0ef", |
00000367 => x"00410513", |
00000368 => x"fadff06f", |
00000369 => x"00012783", |
00000370 => x"00410593", |
00000371 => x"00478713", |
00000372 => x"0007a503", |
00000373 => x"00e12023", |
00000374 => x"fe1ff06f", |
00000375 => x"01549663", |
00000376 => x"00d00513", |
00000377 => x"e09ff0ef", |
00000378 => x"00140993", |
00000379 => x"00048513", |
00000380 => x"f99ff06f", |
00000381 => x"fd010113", |
00000382 => x"00112623", |
00000383 => x"00b12a23", |
00000384 => x"00c12c23", |
00000385 => x"00d12e23", |
00000386 => x"02e12023", |
00000387 => x"02f12223", |
00000388 => x"03012423", |
00000389 => x"03112623", |
00000390 => x"e45ff0ef", |
00000391 => x"00c12083", |
00000392 => x"03010113", |
00000393 => x"00008067", |
00000394 => x"fe010113", |
00000395 => x"00112e23", |
00000396 => x"00050613", |
00000397 => x"00055863", |
00000398 => x"40a00633", |
00000399 => x"01061613", |
00000400 => x"41065613", |
00000401 => x"fe002503", |
00000402 => x"3e800593", |
00000403 => x"00c12623", |
00000404 => x"600000ef", |
00000405 => x"00c12603", |
00000406 => x"00000593", |
00000407 => x"41f65693", |
00000408 => x"558000ef", |
00000409 => x"01c59593", |
00000410 => x"00455513", |
00000411 => x"00a5e533", |
00000412 => x"00050a63", |
00000413 => x"00050863", |
00000414 => x"fff50513", |
00000415 => x"00000013", |
00000416 => x"ff1ff06f", |
00000417 => x"01c12083", |
00000418 => x"02010113", |
00000419 => x"00008067", |
00000420 => x"fc010113", |
00000421 => x"02112e23", |
00000422 => x"02512c23", |
00000423 => x"02612a23", |
00000424 => x"02712823", |
00000425 => x"02a12623", |
00000426 => x"02b12423", |
00000427 => x"02c12223", |
00000428 => x"02d12023", |
00000429 => x"00e12e23", |
00000430 => x"00f12c23", |
00000431 => x"01012a23", |
00000432 => x"01112823", |
00000433 => x"01c12623", |
00000434 => x"01d12423", |
00000435 => x"01e12223", |
00000436 => x"01f12023", |
00000437 => x"34102773", |
00000438 => x"34071073", |
00000439 => x"342027f3", |
00000440 => x"0807ca63", |
00000441 => x"00071683", |
00000442 => x"00300593", |
00000443 => x"0036f693", |
00000444 => x"00270613", |
00000445 => x"00b69463", |
00000446 => x"00470613", |
00000447 => x"34161073", |
00000448 => x"00b00713", |
00000449 => x"04f77c63", |
00000450 => x"000017b7", |
00000451 => x"90c78793", |
00000452 => x"000780e7", |
00000453 => x"03c12083", |
00000454 => x"03812283", |
00000455 => x"03412303", |
00000456 => x"03012383", |
00000457 => x"02c12503", |
00000458 => x"02812583", |
00000459 => x"02412603", |
00000460 => x"02012683", |
00000461 => x"01c12703", |
00000462 => x"01812783", |
00000463 => x"01412803", |
00000464 => x"01012883", |
00000465 => x"00c12e03", |
00000466 => x"00812e83", |
00000467 => x"00412f03", |
00000468 => x"00012f83", |
00000469 => x"04010113", |
00000470 => x"30200073", |
00000471 => x"00001737", |
00000472 => x"00279793", |
00000473 => x"d5c70713", |
00000474 => x"00e787b3", |
00000475 => x"0007a783", |
00000476 => x"00078067", |
00000477 => x"80000737", |
00000478 => x"00e787b3", |
00000479 => x"0007a783", |
00000480 => x"00078067", |
00000481 => x"80000737", |
00000482 => x"00e787b3", |
00000483 => x"01f00713", |
00000484 => x"f8f764e3", |
00000485 => x"00001737", |
00000486 => x"00279793", |
00000487 => x"d9c70713", |
00000488 => x"00e787b3", |
00000489 => x"0007a783", |
00000490 => x"00078067", |
00000491 => x"800007b7", |
00000492 => x"0007a783", |
00000493 => x"f6dff06f", |
00000494 => x"800007b7", |
00000495 => x"0047a783", |
00000496 => x"f61ff06f", |
00000497 => x"800007b7", |
00000498 => x"0087a783", |
00000499 => x"f55ff06f", |
00000500 => x"800007b7", |
00000501 => x"00c7a783", |
00000502 => x"f49ff06f", |
00000503 => x"8101a783", |
00000504 => x"f41ff06f", |
00000505 => x"8141a783", |
00000506 => x"f39ff06f", |
00000507 => x"8181a783", |
00000508 => x"f31ff06f", |
00000509 => x"81c1a783", |
00000510 => x"f29ff06f", |
00000511 => x"8201a783", |
00000512 => x"f21ff06f", |
00000513 => x"8241a783", |
00000514 => x"f19ff06f", |
00000515 => x"8281a783", |
00000516 => x"f11ff06f", |
00000517 => x"82c1a783", |
00000518 => x"f09ff06f", |
00000519 => x"8301a783", |
00000520 => x"f01ff06f", |
00000521 => x"8341a783", |
00000522 => x"ef9ff06f", |
00000523 => x"8381a783", |
00000524 => x"ef1ff06f", |
00000525 => x"83c1a783", |
00000526 => x"ee9ff06f", |
00000527 => x"8401a783", |
00000528 => x"ee1ff06f", |
00000529 => x"8441a783", |
00000530 => x"ed9ff06f", |
00000531 => x"8481a783", |
00000532 => x"ed1ff06f", |
00000533 => x"84c1a783", |
00000534 => x"ec9ff06f", |
00000535 => x"8501a783", |
00000536 => x"ec1ff06f", |
00000537 => x"8541a783", |
00000538 => x"eb9ff06f", |
00000539 => x"8581a783", |
00000540 => x"eb1ff06f", |
00000541 => x"85c1a783", |
00000542 => x"ea9ff06f", |
00000543 => x"8601a783", |
00000544 => x"ea1ff06f", |
00000545 => x"8641a783", |
00000546 => x"e99ff06f", |
00000547 => x"8681a783", |
00000548 => x"e91ff06f", |
00000549 => x"86c1a783", |
00000550 => x"e89ff06f", |
00000551 => x"8701a783", |
00000552 => x"e81ff06f", |
00000553 => x"8741a783", |
00000554 => x"e79ff06f", |
00000555 => x"fe010113", |
00000556 => x"01212823", |
00000557 => x"00050913", |
00000558 => x"00001537", |
00000559 => x"00912a23", |
00000560 => x"e1c50513", |
00000561 => x"000014b7", |
00000562 => x"00812c23", |
00000563 => x"01312623", |
00000564 => x"00112e23", |
00000565 => x"01c00413", |
00000566 => x"b85ff0ef", |
00000567 => x"09848493", |
00000568 => x"ffc00993", |
00000569 => x"008957b3", |
00000570 => x"00f7f793", |
00000571 => x"00f487b3", |
00000572 => x"0007c503", |
00000573 => x"ffc40413", |
00000574 => x"b09ff0ef", |
00000575 => x"ff3414e3", |
00000576 => x"01c12083", |
00000577 => x"01812403", |
00000578 => x"01412483", |
00000579 => x"01012903", |
00000580 => x"00c12983", |
00000581 => x"02010113", |
00000582 => x"00008067", |
00000583 => x"00001537", |
00000584 => x"ff010113", |
00000585 => x"e2050513", |
00000586 => x"00112623", |
00000587 => x"00812423", |
00000588 => x"00912223", |
00000589 => x"b29ff0ef", |
00000590 => x"34202473", |
00000591 => x"00900713", |
00000592 => x"00f47793", |
00000593 => x"05778493", |
00000594 => x"00f76463", |
00000595 => x"03078493", |
00000596 => x"00b00793", |
00000597 => x"0087ee63", |
00000598 => x"00001737", |
00000599 => x"00241793", |
00000600 => x"fac70713", |
00000601 => x"00e787b3", |
00000602 => x"0007a783", |
00000603 => x"00078067", |
00000604 => x"800007b7", |
00000605 => x"00b78713", |
00000606 => x"12e40663", |
00000607 => x"02876663", |
00000608 => x"00378713", |
00000609 => x"10e40463", |
00000610 => x"00778793", |
00000611 => x"10f40663", |
00000612 => x"00001537", |
00000613 => x"f8050513", |
00000614 => x"ac5ff0ef", |
00000615 => x"00040513", |
00000616 => x"f0dff0ef", |
00000617 => x"0380006f", |
00000618 => x"ff07c793", |
00000619 => x"00f407b3", |
00000620 => x"00f00713", |
00000621 => x"fcf76ee3", |
00000622 => x"00001537", |
00000623 => x"f7050513", |
00000624 => x"a9dff0ef", |
00000625 => x"00048513", |
00000626 => x"a39ff0ef", |
00000627 => x"0100006f", |
00000628 => x"00001537", |
00000629 => x"e2850513", |
00000630 => x"a85ff0ef", |
00000631 => x"00001537", |
00000632 => x"f9850513", |
00000633 => x"a79ff0ef", |
00000634 => x"34002573", |
00000635 => x"ec1ff0ef", |
00000636 => x"00001537", |
00000637 => x"fa050513", |
00000638 => x"a65ff0ef", |
00000639 => x"34302573", |
00000640 => x"eadff0ef", |
00000641 => x"00812403", |
00000642 => x"00c12083", |
00000643 => x"00412483", |
00000479 => x"01f00713", |
00000480 => x"f8f764e3", |
00000481 => x"00001737", |
00000482 => x"00279793", |
00000483 => x"d8c70713", |
00000484 => x"00e787b3", |
00000485 => x"0007a783", |
00000486 => x"00078067", |
00000487 => x"800007b7", |
00000488 => x"0007a783", |
00000489 => x"f6dff06f", |
00000490 => x"800007b7", |
00000491 => x"0047a783", |
00000492 => x"f61ff06f", |
00000493 => x"800007b7", |
00000494 => x"0087a783", |
00000495 => x"f55ff06f", |
00000496 => x"800007b7", |
00000497 => x"00c7a783", |
00000498 => x"f49ff06f", |
00000499 => x"8101a783", |
00000500 => x"f41ff06f", |
00000501 => x"8141a783", |
00000502 => x"f39ff06f", |
00000503 => x"8181a783", |
00000504 => x"f31ff06f", |
00000505 => x"81c1a783", |
00000506 => x"f29ff06f", |
00000507 => x"8201a783", |
00000508 => x"f21ff06f", |
00000509 => x"8241a783", |
00000510 => x"f19ff06f", |
00000511 => x"8281a783", |
00000512 => x"f11ff06f", |
00000513 => x"82c1a783", |
00000514 => x"f09ff06f", |
00000515 => x"8301a783", |
00000516 => x"f01ff06f", |
00000517 => x"8341a783", |
00000518 => x"ef9ff06f", |
00000519 => x"8381a783", |
00000520 => x"ef1ff06f", |
00000521 => x"83c1a783", |
00000522 => x"ee9ff06f", |
00000523 => x"8401a783", |
00000524 => x"ee1ff06f", |
00000525 => x"8441a783", |
00000526 => x"ed9ff06f", |
00000527 => x"8481a783", |
00000528 => x"ed1ff06f", |
00000529 => x"84c1a783", |
00000530 => x"ec9ff06f", |
00000531 => x"8501a783", |
00000532 => x"ec1ff06f", |
00000533 => x"8541a783", |
00000534 => x"eb9ff06f", |
00000535 => x"8581a783", |
00000536 => x"eb1ff06f", |
00000537 => x"85c1a783", |
00000538 => x"ea9ff06f", |
00000539 => x"8601a783", |
00000540 => x"ea1ff06f", |
00000541 => x"8641a783", |
00000542 => x"e99ff06f", |
00000543 => x"8681a783", |
00000544 => x"e91ff06f", |
00000545 => x"86c1a783", |
00000546 => x"e89ff06f", |
00000547 => x"8701a783", |
00000548 => x"e81ff06f", |
00000549 => x"8741a783", |
00000550 => x"e79ff06f", |
00000551 => x"fe010113", |
00000552 => x"01212823", |
00000553 => x"00050913", |
00000554 => x"00001537", |
00000555 => x"00912a23", |
00000556 => x"e0c50513", |
00000557 => x"000014b7", |
00000558 => x"00812c23", |
00000559 => x"01312623", |
00000560 => x"00112e23", |
00000561 => x"01c00413", |
00000562 => x"b91ff0ef", |
00000563 => x"08848493", |
00000564 => x"ffc00993", |
00000565 => x"008957b3", |
00000566 => x"00f7f793", |
00000567 => x"00f487b3", |
00000568 => x"0007c503", |
00000569 => x"ffc40413", |
00000570 => x"b15ff0ef", |
00000571 => x"ff3414e3", |
00000572 => x"01c12083", |
00000573 => x"01812403", |
00000574 => x"01412483", |
00000575 => x"01012903", |
00000576 => x"00c12983", |
00000577 => x"02010113", |
00000578 => x"00008067", |
00000579 => x"00001537", |
00000580 => x"ff010113", |
00000581 => x"e1050513", |
00000582 => x"00112623", |
00000583 => x"00812423", |
00000584 => x"00912223", |
00000585 => x"b35ff0ef", |
00000586 => x"34202473", |
00000587 => x"00900713", |
00000588 => x"00f47793", |
00000589 => x"05778493", |
00000590 => x"00f76463", |
00000591 => x"03078493", |
00000592 => x"00b00793", |
00000593 => x"0087ee63", |
00000594 => x"00001737", |
00000595 => x"00241793", |
00000596 => x"f9c70713", |
00000597 => x"00e787b3", |
00000598 => x"0007a783", |
00000599 => x"00078067", |
00000600 => x"800007b7", |
00000601 => x"00b78713", |
00000602 => x"12e40663", |
00000603 => x"02876663", |
00000604 => x"00378713", |
00000605 => x"10e40463", |
00000606 => x"00778793", |
00000607 => x"10f40663", |
00000608 => x"00001537", |
00000609 => x"f7050513", |
00000610 => x"ad1ff0ef", |
00000611 => x"00040513", |
00000612 => x"f0dff0ef", |
00000613 => x"0380006f", |
00000614 => x"ff07c793", |
00000615 => x"00f407b3", |
00000616 => x"00f00713", |
00000617 => x"fcf76ee3", |
00000618 => x"00001537", |
00000619 => x"f6050513", |
00000620 => x"aa9ff0ef", |
00000621 => x"00048513", |
00000622 => x"a45ff0ef", |
00000623 => x"0100006f", |
00000624 => x"00001537", |
00000625 => x"e1850513", |
00000626 => x"a91ff0ef", |
00000627 => x"00001537", |
00000628 => x"f8850513", |
00000629 => x"a85ff0ef", |
00000630 => x"34002573", |
00000631 => x"ec1ff0ef", |
00000632 => x"00001537", |
00000633 => x"f9050513", |
00000634 => x"a71ff0ef", |
00000635 => x"34302573", |
00000636 => x"eadff0ef", |
00000637 => x"00812403", |
00000638 => x"00c12083", |
00000639 => x"00412483", |
00000640 => x"00001537", |
00000641 => x"ff850513", |
00000642 => x"01010113", |
00000643 => x"a4dff06f", |
00000644 => x"00001537", |
00000645 => x"00850513", |
00000646 => x"01010113", |
00000647 => x"a41ff06f", |
00000648 => x"00001537", |
00000649 => x"e4850513", |
00000650 => x"fb1ff06f", |
00000651 => x"00001537", |
00000652 => x"e6450513", |
00000653 => x"fa5ff06f", |
00000654 => x"00001537", |
00000655 => x"e7850513", |
00000656 => x"f99ff06f", |
00000657 => x"00001537", |
00000658 => x"e8450513", |
00000659 => x"f8dff06f", |
00000660 => x"00001537", |
00000661 => x"e9c50513", |
00000662 => x"f81ff06f", |
00000663 => x"00001537", |
00000664 => x"eb050513", |
00000665 => x"f75ff06f", |
00000666 => x"00001537", |
00000667 => x"ecc50513", |
00000668 => x"f69ff06f", |
00000669 => x"00001537", |
00000670 => x"ee050513", |
00000671 => x"f5dff06f", |
00000672 => x"00001537", |
00000673 => x"f0050513", |
00000674 => x"f51ff06f", |
00000675 => x"00001537", |
00000676 => x"f2050513", |
00000677 => x"f45ff06f", |
00000678 => x"00001537", |
00000679 => x"f3c50513", |
00000680 => x"f39ff06f", |
00000681 => x"00001537", |
00000682 => x"f5450513", |
00000683 => x"f2dff06f", |
00000684 => x"01f00793", |
00000685 => x"02a7e463", |
00000686 => x"800007b7", |
00000687 => x"00078793", |
00000688 => x"00251513", |
00000689 => x"00a78533", |
00000690 => x"000017b7", |
00000691 => x"91c78793", |
00000692 => x"00f52023", |
00000693 => x"00000513", |
00000694 => x"00008067", |
00000695 => x"00100513", |
00000696 => x"00008067", |
00000697 => x"ff010113", |
00000698 => x"00112623", |
00000699 => x"00812423", |
00000700 => x"00912223", |
00000701 => x"301027f3", |
00000702 => x"00079863", |
00000703 => x"00001537", |
00000704 => x"fdc50513", |
00000705 => x"959ff0ef", |
00000706 => x"6a000793", |
00000707 => x"30579073", |
00000708 => x"00000413", |
00000709 => x"01e00493", |
00000710 => x"00040513", |
00000711 => x"00140413", |
00000712 => x"0ff47413", |
00000713 => x"f8dff0ef", |
00000714 => x"fe9418e3", |
00000715 => x"00c12083", |
00000716 => x"00812403", |
00000717 => x"00412483", |
00000718 => x"01010113", |
00000719 => x"00008067", |
00000720 => x"ff010113", |
00000721 => x"00112623", |
00000722 => x"00812423", |
00000723 => x"30102673", |
00000724 => x"400005b7", |
00000725 => x"10058593", |
00000726 => x"00b677b3", |
00000727 => x"00000413", |
00000728 => x"00b78c63", |
00000729 => x"00100413", |
00000730 => x"00051863", |
00000731 => x"00001537", |
00000732 => x"01050513", |
00000733 => x"a85ff0ef", |
00000734 => x"00c12083", |
00000735 => x"00040513", |
00000736 => x"00812403", |
00000737 => x"01010113", |
00000645 => x"e3850513", |
00000646 => x"fb1ff06f", |
00000647 => x"00001537", |
00000648 => x"e5450513", |
00000649 => x"fa5ff06f", |
00000650 => x"00001537", |
00000651 => x"e6850513", |
00000652 => x"f99ff06f", |
00000653 => x"00001537", |
00000654 => x"e7450513", |
00000655 => x"f8dff06f", |
00000656 => x"00001537", |
00000657 => x"e8c50513", |
00000658 => x"f81ff06f", |
00000659 => x"00001537", |
00000660 => x"ea050513", |
00000661 => x"f75ff06f", |
00000662 => x"00001537", |
00000663 => x"ebc50513", |
00000664 => x"f69ff06f", |
00000665 => x"00001537", |
00000666 => x"ed050513", |
00000667 => x"f5dff06f", |
00000668 => x"00001537", |
00000669 => x"ef050513", |
00000670 => x"f51ff06f", |
00000671 => x"00001537", |
00000672 => x"f1050513", |
00000673 => x"f45ff06f", |
00000674 => x"00001537", |
00000675 => x"f2c50513", |
00000676 => x"f39ff06f", |
00000677 => x"00001537", |
00000678 => x"f4450513", |
00000679 => x"f2dff06f", |
00000680 => x"01f00793", |
00000681 => x"02a7e463", |
00000682 => x"800007b7", |
00000683 => x"00078793", |
00000684 => x"00251513", |
00000685 => x"00a78533", |
00000686 => x"000017b7", |
00000687 => x"90c78793", |
00000688 => x"00f52023", |
00000689 => x"00000513", |
00000690 => x"00008067", |
00000691 => x"00100513", |
00000692 => x"00008067", |
00000693 => x"ff010113", |
00000694 => x"00112623", |
00000695 => x"00812423", |
00000696 => x"00912223", |
00000697 => x"301027f3", |
00000698 => x"00079863", |
00000699 => x"00001537", |
00000700 => x"fcc50513", |
00000701 => x"965ff0ef", |
00000702 => x"69000793", |
00000703 => x"30579073", |
00000704 => x"00000413", |
00000705 => x"01e00493", |
00000706 => x"00040513", |
00000707 => x"00140413", |
00000708 => x"0ff47413", |
00000709 => x"f8dff0ef", |
00000710 => x"fe9418e3", |
00000711 => x"00c12083", |
00000712 => x"00812403", |
00000713 => x"00412483", |
00000714 => x"01010113", |
00000715 => x"00008067", |
00000716 => x"ff010113", |
00000717 => x"00112623", |
00000718 => x"00812423", |
00000719 => x"30102673", |
00000720 => x"400005b7", |
00000721 => x"10058593", |
00000722 => x"00b677b3", |
00000723 => x"00000413", |
00000724 => x"00b78c63", |
00000725 => x"00100413", |
00000726 => x"00051863", |
00000727 => x"00001537", |
00000728 => x"00050513", |
00000729 => x"a91ff0ef", |
00000730 => x"00c12083", |
00000731 => x"00040513", |
00000732 => x"00812403", |
00000733 => x"01010113", |
00000734 => x"00008067", |
00000735 => x"fe802503", |
00000736 => x"01055513", |
00000737 => x"00157513", |
00000738 => x"00008067", |
00000739 => x"fe802503", |
00000740 => x"01055513", |
00000741 => x"00157513", |
00000742 => x"00008067", |
00000743 => x"f8a02223", |
00000744 => x"00008067", |
00000745 => x"00050613", |
00000746 => x"00000513", |
00000747 => x"0015f693", |
00000748 => x"00068463", |
00000749 => x"00c50533", |
00000750 => x"0015d593", |
00000751 => x"00161613", |
00000752 => x"fe0596e3", |
00000753 => x"00008067", |
00000754 => x"00050313", |
00000755 => x"ff010113", |
00000756 => x"00060513", |
00000757 => x"00068893", |
00000758 => x"00112623", |
00000759 => x"00030613", |
00000760 => x"00050693", |
00000761 => x"00000713", |
00000762 => x"00000793", |
00000763 => x"00000813", |
00000764 => x"0016fe13", |
00000765 => x"00171e93", |
00000766 => x"000e0c63", |
00000767 => x"01060e33", |
00000768 => x"010e3833", |
00000769 => x"00e787b3", |
00000770 => x"00f807b3", |
00000771 => x"000e0813", |
00000772 => x"01f65713", |
00000773 => x"0016d693", |
00000774 => x"00eee733", |
00000775 => x"00161613", |
00000776 => x"fc0698e3", |
00000777 => x"00058663", |
00000778 => x"f7dff0ef", |
00000779 => x"00a787b3", |
00000780 => x"00088a63", |
00000781 => x"00030513", |
00000782 => x"00088593", |
00000783 => x"f69ff0ef", |
00000784 => x"00f507b3", |
00000785 => x"00c12083", |
00000786 => x"00080513", |
00000787 => x"00078593", |
00000788 => x"01010113", |
00000789 => x"00008067", |
00000790 => x"06054063", |
00000791 => x"0605c663", |
00000792 => x"00058613", |
00000793 => x"00050593", |
00000794 => x"fff00513", |
00000795 => x"02060c63", |
00000796 => x"00100693", |
00000797 => x"00b67a63", |
00000798 => x"00c05863", |
00000799 => x"00161613", |
00000800 => x"00169693", |
00000801 => x"feb66ae3", |
00000802 => x"00000513", |
00000803 => x"00c5e663", |
00000804 => x"40c585b3", |
00000805 => x"00d56533", |
00000806 => x"0016d693", |
00000807 => x"00165613", |
00000808 => x"fe0696e3", |
00000809 => x"00008067", |
00000810 => x"00008293", |
00000811 => x"fb5ff0ef", |
00000812 => x"00058513", |
00000813 => x"00028067", |
00000814 => x"40a00533", |
00000815 => x"00b04863", |
00000816 => x"40b005b3", |
00000817 => x"f9dff06f", |
00000818 => x"40b005b3", |
00000739 => x"f8a02223", |
00000740 => x"00008067", |
00000741 => x"00050613", |
00000742 => x"00000513", |
00000743 => x"0015f693", |
00000744 => x"00068463", |
00000745 => x"00c50533", |
00000746 => x"0015d593", |
00000747 => x"00161613", |
00000748 => x"fe0596e3", |
00000749 => x"00008067", |
00000750 => x"00050313", |
00000751 => x"ff010113", |
00000752 => x"00060513", |
00000753 => x"00068893", |
00000754 => x"00112623", |
00000755 => x"00030613", |
00000756 => x"00050693", |
00000757 => x"00000713", |
00000758 => x"00000793", |
00000759 => x"00000813", |
00000760 => x"0016fe13", |
00000761 => x"00171e93", |
00000762 => x"000e0c63", |
00000763 => x"01060e33", |
00000764 => x"010e3833", |
00000765 => x"00e787b3", |
00000766 => x"00f807b3", |
00000767 => x"000e0813", |
00000768 => x"01f65713", |
00000769 => x"0016d693", |
00000770 => x"00eee733", |
00000771 => x"00161613", |
00000772 => x"fc0698e3", |
00000773 => x"00058663", |
00000774 => x"f7dff0ef", |
00000775 => x"00a787b3", |
00000776 => x"00088a63", |
00000777 => x"00030513", |
00000778 => x"00088593", |
00000779 => x"f69ff0ef", |
00000780 => x"00f507b3", |
00000781 => x"00c12083", |
00000782 => x"00080513", |
00000783 => x"00078593", |
00000784 => x"01010113", |
00000785 => x"00008067", |
00000786 => x"06054063", |
00000787 => x"0605c663", |
00000788 => x"00058613", |
00000789 => x"00050593", |
00000790 => x"fff00513", |
00000791 => x"02060c63", |
00000792 => x"00100693", |
00000793 => x"00b67a63", |
00000794 => x"00c05863", |
00000795 => x"00161613", |
00000796 => x"00169693", |
00000797 => x"feb66ae3", |
00000798 => x"00000513", |
00000799 => x"00c5e663", |
00000800 => x"40c585b3", |
00000801 => x"00d56533", |
00000802 => x"0016d693", |
00000803 => x"00165613", |
00000804 => x"fe0696e3", |
00000805 => x"00008067", |
00000806 => x"00008293", |
00000807 => x"fb5ff0ef", |
00000808 => x"00058513", |
00000809 => x"00028067", |
00000810 => x"40a00533", |
00000811 => x"00b04863", |
00000812 => x"40b005b3", |
00000813 => x"f9dff06f", |
00000814 => x"40b005b3", |
00000815 => x"00008293", |
00000816 => x"f91ff0ef", |
00000817 => x"40a00533", |
00000818 => x"00028067", |
00000819 => x"00008293", |
00000820 => x"f91ff0ef", |
00000821 => x"40a00533", |
00000822 => x"00028067", |
00000823 => x"00008293", |
00000824 => x"0005ca63", |
00000825 => x"00054c63", |
00000826 => x"f79ff0ef", |
00000827 => x"00058513", |
00000828 => x"00028067", |
00000829 => x"40b005b3", |
00000830 => x"fe0558e3", |
00000831 => x"40a00533", |
00000832 => x"f61ff0ef", |
00000833 => x"40b00533", |
00000834 => x"00028067", |
00000835 => x"6f727245", |
00000836 => x"4e202172", |
00000837 => x"5047206f", |
00000838 => x"75204f49", |
00000839 => x"2074696e", |
00000840 => x"746e7973", |
00000841 => x"69736568", |
00000842 => x"2164657a", |
00000843 => x"0000000a", |
00000844 => x"6e696c42", |
00000845 => x"676e696b", |
00000846 => x"44454c20", |
00000847 => x"6d656420", |
00000848 => x"7270206f", |
00000849 => x"6172676f", |
00000850 => x"00000a6d", |
00000851 => x"33323130", |
00000852 => x"37363534", |
00000853 => x"00003938", |
00000854 => x"33323130", |
00000855 => x"37363534", |
00000856 => x"62613938", |
00000857 => x"66656463", |
00000858 => x"00000000", |
00000859 => x"000007ac", |
00000860 => x"000007b8", |
00000861 => x"000007c4", |
00000862 => x"000007d0", |
00000863 => x"000007dc", |
00000864 => x"000007e4", |
00000865 => x"000007ec", |
00000820 => x"0005ca63", |
00000821 => x"00054c63", |
00000822 => x"f79ff0ef", |
00000823 => x"00058513", |
00000824 => x"00028067", |
00000825 => x"40b005b3", |
00000826 => x"fe0558e3", |
00000827 => x"40a00533", |
00000828 => x"f61ff0ef", |
00000829 => x"40b00533", |
00000830 => x"00028067", |
00000831 => x"6f727245", |
00000832 => x"4e202172", |
00000833 => x"5047206f", |
00000834 => x"75204f49", |
00000835 => x"2074696e", |
00000836 => x"746e7973", |
00000837 => x"69736568", |
00000838 => x"2164657a", |
00000839 => x"0000000a", |
00000840 => x"6e696c42", |
00000841 => x"676e696b", |
00000842 => x"44454c20", |
00000843 => x"6d656420", |
00000844 => x"7270206f", |
00000845 => x"6172676f", |
00000846 => x"00000a6d", |
00000847 => x"33323130", |
00000848 => x"37363534", |
00000849 => x"00003938", |
00000850 => x"33323130", |
00000851 => x"37363534", |
00000852 => x"62613938", |
00000853 => x"66656463", |
00000854 => x"00000000", |
00000855 => x"0000079c", |
00000856 => x"000007a8", |
00000857 => x"000007b4", |
00000858 => x"000007c0", |
00000859 => x"000007cc", |
00000860 => x"000007d4", |
00000861 => x"000007dc", |
00000862 => x"000007e4", |
00000863 => x"000007ec", |
00000864 => x"00000708", |
00000865 => x"00000708", |
00000866 => x"000007f4", |
00000867 => x"000007fc", |
00000868 => x"00000718", |
00000869 => x"00000718", |
00000868 => x"00000708", |
00000869 => x"00000708", |
00000870 => x"00000804", |
00000871 => x"0000080c", |
00000872 => x"00000718", |
00000873 => x"00000718", |
00000874 => x"00000814", |
00000875 => x"00000718", |
00000876 => x"00000718", |
00000877 => x"00000718", |
00000878 => x"0000081c", |
00000879 => x"00000718", |
00000880 => x"00000718", |
00000881 => x"00000718", |
00000882 => x"00000824", |
00000883 => x"00000718", |
00000884 => x"00000718", |
00000885 => x"00000718", |
00000886 => x"00000718", |
00000887 => x"0000082c", |
00000888 => x"00000834", |
00000889 => x"0000083c", |
00000890 => x"00000844", |
00000891 => x"0000084c", |
00000892 => x"00000854", |
00000893 => x"0000085c", |
00000894 => x"00000864", |
00000895 => x"0000086c", |
00000896 => x"00000874", |
00000897 => x"0000087c", |
00000898 => x"00000884", |
00000899 => x"0000088c", |
00000900 => x"00000894", |
00000901 => x"0000089c", |
00000902 => x"000008a4", |
00000903 => x"00007830", |
00000904 => x"4554523c", |
00000905 => x"0000203e", |
00000906 => x"74736e49", |
00000907 => x"74637572", |
00000908 => x"206e6f69", |
00000909 => x"72646461", |
00000910 => x"20737365", |
00000911 => x"6173696d", |
00000912 => x"6e67696c", |
00000913 => x"00006465", |
00000914 => x"74736e49", |
00000915 => x"74637572", |
00000916 => x"206e6f69", |
00000917 => x"65636361", |
00000918 => x"66207373", |
00000919 => x"746c7561", |
00000920 => x"00000000", |
00000921 => x"656c6c49", |
00000922 => x"206c6167", |
00000923 => x"74736e69", |
00000924 => x"74637572", |
00000925 => x"006e6f69", |
00000926 => x"61657242", |
00000927 => x"696f706b", |
00000928 => x"0000746e", |
00000929 => x"64616f4c", |
00000930 => x"64646120", |
00000931 => x"73736572", |
00000932 => x"73696d20", |
00000933 => x"67696c61", |
00000934 => x"0064656e", |
00000935 => x"64616f4c", |
00000936 => x"63636120", |
00000937 => x"20737365", |
00000938 => x"6c756166", |
00000939 => x"00000074", |
00000940 => x"726f7453", |
00000941 => x"64612065", |
00000942 => x"73657264", |
00000943 => x"696d2073", |
00000944 => x"696c6173", |
00000945 => x"64656e67", |
00000946 => x"00000000", |
00000947 => x"726f7453", |
00000948 => x"63612065", |
00000949 => x"73736563", |
00000950 => x"75616620", |
00000951 => x"0000746c", |
00000952 => x"69766e45", |
00000953 => x"6d6e6f72", |
00000954 => x"20746e65", |
00000955 => x"6c6c6163", |
00000956 => x"6f726620", |
00000957 => x"2d55206d", |
00000958 => x"65646f6d", |
00000959 => x"00000000", |
00000960 => x"69766e45", |
00000961 => x"6d6e6f72", |
00000962 => x"20746e65", |
00000963 => x"6c6c6163", |
00000964 => x"6f726620", |
00000965 => x"2d4d206d", |
00000966 => x"65646f6d", |
00000967 => x"00000000", |
00000968 => x"6863614d", |
00000969 => x"20656e69", |
00000970 => x"74666f73", |
00000971 => x"65726177", |
00000972 => x"746e6920", |
00000973 => x"75727265", |
00000974 => x"00007470", |
00000975 => x"6863614d", |
00000976 => x"20656e69", |
00000977 => x"656d6974", |
00000978 => x"6e692072", |
00000979 => x"72726574", |
00000980 => x"00747075", |
00000981 => x"6863614d", |
00000982 => x"20656e69", |
00000983 => x"65747865", |
00000984 => x"6c616e72", |
00000871 => x"00000708", |
00000872 => x"00000708", |
00000873 => x"00000708", |
00000874 => x"0000080c", |
00000875 => x"00000708", |
00000876 => x"00000708", |
00000877 => x"00000708", |
00000878 => x"00000814", |
00000879 => x"00000708", |
00000880 => x"00000708", |
00000881 => x"00000708", |
00000882 => x"00000708", |
00000883 => x"0000081c", |
00000884 => x"00000824", |
00000885 => x"0000082c", |
00000886 => x"00000834", |
00000887 => x"0000083c", |
00000888 => x"00000844", |
00000889 => x"0000084c", |
00000890 => x"00000854", |
00000891 => x"0000085c", |
00000892 => x"00000864", |
00000893 => x"0000086c", |
00000894 => x"00000874", |
00000895 => x"0000087c", |
00000896 => x"00000884", |
00000897 => x"0000088c", |
00000898 => x"00000894", |
00000899 => x"00007830", |
00000900 => x"4554523c", |
00000901 => x"0000203e", |
00000902 => x"74736e49", |
00000903 => x"74637572", |
00000904 => x"206e6f69", |
00000905 => x"72646461", |
00000906 => x"20737365", |
00000907 => x"6173696d", |
00000908 => x"6e67696c", |
00000909 => x"00006465", |
00000910 => x"74736e49", |
00000911 => x"74637572", |
00000912 => x"206e6f69", |
00000913 => x"65636361", |
00000914 => x"66207373", |
00000915 => x"746c7561", |
00000916 => x"00000000", |
00000917 => x"656c6c49", |
00000918 => x"206c6167", |
00000919 => x"74736e69", |
00000920 => x"74637572", |
00000921 => x"006e6f69", |
00000922 => x"61657242", |
00000923 => x"696f706b", |
00000924 => x"0000746e", |
00000925 => x"64616f4c", |
00000926 => x"64646120", |
00000927 => x"73736572", |
00000928 => x"73696d20", |
00000929 => x"67696c61", |
00000930 => x"0064656e", |
00000931 => x"64616f4c", |
00000932 => x"63636120", |
00000933 => x"20737365", |
00000934 => x"6c756166", |
00000935 => x"00000074", |
00000936 => x"726f7453", |
00000937 => x"64612065", |
00000938 => x"73657264", |
00000939 => x"696d2073", |
00000940 => x"696c6173", |
00000941 => x"64656e67", |
00000942 => x"00000000", |
00000943 => x"726f7453", |
00000944 => x"63612065", |
00000945 => x"73736563", |
00000946 => x"75616620", |
00000947 => x"0000746c", |
00000948 => x"69766e45", |
00000949 => x"6d6e6f72", |
00000950 => x"20746e65", |
00000951 => x"6c6c6163", |
00000952 => x"6f726620", |
00000953 => x"2d55206d", |
00000954 => x"65646f6d", |
00000955 => x"00000000", |
00000956 => x"69766e45", |
00000957 => x"6d6e6f72", |
00000958 => x"20746e65", |
00000959 => x"6c6c6163", |
00000960 => x"6f726620", |
00000961 => x"2d4d206d", |
00000962 => x"65646f6d", |
00000963 => x"00000000", |
00000964 => x"6863614d", |
00000965 => x"20656e69", |
00000966 => x"74666f73", |
00000967 => x"65726177", |
00000968 => x"746e6920", |
00000969 => x"75727265", |
00000970 => x"00007470", |
00000971 => x"6863614d", |
00000972 => x"20656e69", |
00000973 => x"656d6974", |
00000974 => x"6e692072", |
00000975 => x"72726574", |
00000976 => x"00747075", |
00000977 => x"6863614d", |
00000978 => x"20656e69", |
00000979 => x"65747865", |
00000980 => x"6c616e72", |
00000981 => x"746e6920", |
00000982 => x"75727265", |
00000983 => x"00007470", |
00000984 => x"74736146", |
00000985 => x"746e6920", |
00000986 => x"75727265", |
00000987 => x"00007470", |
00000988 => x"74736146", |
00000989 => x"746e6920", |
00000990 => x"75727265", |
00000991 => x"00207470", |
00000992 => x"6e6b6e55", |
00000993 => x"206e776f", |
00000994 => x"70617274", |
00000995 => x"75616320", |
00000996 => x"203a6573", |
00000997 => x"00000000", |
00000998 => x"50204020", |
00000999 => x"00003d43", |
00001000 => x"544d202c", |
00001001 => x"3d4c4156", |
00001002 => x"00000000", |
00001003 => x"000009d0", |
00001004 => x"00000a20", |
00001005 => x"00000a2c", |
00001006 => x"00000a38", |
00001007 => x"00000a44", |
00001008 => x"00000a50", |
00001009 => x"00000a5c", |
00001010 => x"00000a68", |
00001011 => x"00000a74", |
00001012 => x"00000990", |
00001013 => x"00000990", |
00001014 => x"00000a80", |
00001015 => x"4554523c", |
00001016 => x"4157203e", |
00001017 => x"4e494e52", |
00001018 => x"43202147", |
00001019 => x"43205550", |
00001020 => x"73205253", |
00001021 => x"65747379", |
00001022 => x"6f6e206d", |
00001023 => x"76612074", |
00001024 => x"616c6961", |
00001025 => x"21656c62", |
00001026 => x"522f3c20", |
00001027 => x"003e4554", |
00001028 => x"5241570a", |
00001029 => x"474e494e", |
00001030 => x"57532021", |
00001031 => x"4153495f", |
00001032 => x"65662820", |
00001033 => x"72757461", |
00001034 => x"72207365", |
00001035 => x"69757165", |
00001036 => x"29646572", |
00001037 => x"20737620", |
00001038 => x"495f5748", |
00001039 => x"28204153", |
00001040 => x"74616566", |
00001041 => x"73657275", |
00001042 => x"61766120", |
00001043 => x"62616c69", |
00001044 => x"2029656c", |
00001045 => x"6d73696d", |
00001046 => x"68637461", |
00001047 => x"57530a21", |
00001048 => x"4153495f", |
00001049 => x"30203d20", |
00001050 => x"20782578", |
00001051 => x"6d6f6328", |
00001052 => x"656c6970", |
00001053 => x"6c662072", |
00001054 => x"29736761", |
00001055 => x"5f57480a", |
00001056 => x"20415349", |
00001057 => x"7830203d", |
00001058 => x"28207825", |
00001059 => x"6173696d", |
00001060 => x"72736320", |
00001061 => x"000a0a29", |
00001062 => x"33323130", |
00001063 => x"37363534", |
00001064 => x"42413938", |
00001065 => x"46454443", |
00000987 => x"00207470", |
00000988 => x"6e6b6e55", |
00000989 => x"206e776f", |
00000990 => x"70617274", |
00000991 => x"75616320", |
00000992 => x"203a6573", |
00000993 => x"00000000", |
00000994 => x"50204020", |
00000995 => x"00003d43", |
00000996 => x"544d202c", |
00000997 => x"3d4c4156", |
00000998 => x"00000000", |
00000999 => x"000009c0", |
00001000 => x"00000a10", |
00001001 => x"00000a1c", |
00001002 => x"00000a28", |
00001003 => x"00000a34", |
00001004 => x"00000a40", |
00001005 => x"00000a4c", |
00001006 => x"00000a58", |
00001007 => x"00000a64", |
00001008 => x"00000980", |
00001009 => x"00000980", |
00001010 => x"00000a70", |
00001011 => x"4554523c", |
00001012 => x"4157203e", |
00001013 => x"4e494e52", |
00001014 => x"43202147", |
00001015 => x"43205550", |
00001016 => x"73205253", |
00001017 => x"65747379", |
00001018 => x"6f6e206d", |
00001019 => x"76612074", |
00001020 => x"616c6961", |
00001021 => x"21656c62", |
00001022 => x"522f3c20", |
00001023 => x"003e4554", |
00001024 => x"5241570a", |
00001025 => x"474e494e", |
00001026 => x"57532021", |
00001027 => x"4153495f", |
00001028 => x"65662820", |
00001029 => x"72757461", |
00001030 => x"72207365", |
00001031 => x"69757165", |
00001032 => x"29646572", |
00001033 => x"20737620", |
00001034 => x"495f5748", |
00001035 => x"28204153", |
00001036 => x"74616566", |
00001037 => x"73657275", |
00001038 => x"61766120", |
00001039 => x"62616c69", |
00001040 => x"2029656c", |
00001041 => x"6d73696d", |
00001042 => x"68637461", |
00001043 => x"57530a21", |
00001044 => x"4153495f", |
00001045 => x"30203d20", |
00001046 => x"20782578", |
00001047 => x"6d6f6328", |
00001048 => x"656c6970", |
00001049 => x"6c662072", |
00001050 => x"29736761", |
00001051 => x"5f57480a", |
00001052 => x"20415349", |
00001053 => x"7830203d", |
00001054 => x"28207825", |
00001055 => x"6173696d", |
00001056 => x"72736320", |
00001057 => x"000a0a29", |
00001058 => x"33323130", |
00001059 => x"37363534", |
00001060 => x"42413938", |
00001061 => x"46454443", |
others => x"00000000" |
); |
|
/neorv32_bootloader_image.vhd
1,4 → 1,4
-- The NEORV32 Processor by Stephan Nolting, https://github.com/stnolting/neorv32 |
-- The NEORV32 RISC-V Processor, https://github.com/stnolting/neorv32 |
-- Auto-generated memory init file (for BOOTLOADER) from source file <bootloader/main.bin> |
|
library ieee; |
6,7 → 6,7
|
package neorv32_bootloader_image is |
|
type bootloader_init_image_t is array (0 to 1020) of std_ulogic_vector(31 downto 0); |
type bootloader_init_image_t is array (0 to 1019) of std_ulogic_vector(31 downto 0); |
constant bootloader_init_image : bootloader_init_image_t := ( |
00000000 => x"00000013", |
00000001 => x"00000093", |
25,7 → 25,7
00000014 => x"80010197", |
00000015 => x"7c818193", |
00000016 => x"00000517", |
00000017 => x"0c050513", |
00000017 => x"0bc50513", |
00000018 => x"30551073", |
00000019 => x"34151073", |
00000020 => x"34301073", |
40,7 → 40,7
00000029 => x"b0201073", |
00000030 => x"b8201073", |
00000031 => x"00010417", |
00000032 => x"e8440413", |
00000032 => x"d8440413", |
00000033 => x"00010497", |
00000034 => x"f7c48493", |
00000035 => x"00042023", |
54,7 → 54,7
00000043 => x"00158593", |
00000044 => x"ff5ff06f", |
00000045 => x"00001597", |
00000046 => x"f3c58593", |
00000046 => x"f3858593", |
00000047 => x"80010617", |
00000048 => x"f4460613", |
00000049 => x"80010697", |
67,967 → 67,966
00000056 => x"fedff06f", |
00000057 => x"00000513", |
00000058 => x"00000593", |
00000059 => x"060000ef", |
00000059 => x"05c000ef", |
00000060 => x"30047073", |
00000061 => x"00000013", |
00000062 => x"10500073", |
00000063 => x"0000006f", |
00000064 => x"ff810113", |
00000065 => x"00812023", |
00000066 => x"00912223", |
00000067 => x"34202473", |
00000068 => x"02044663", |
00000069 => x"34102473", |
00000070 => x"00041483", |
00000071 => x"0034f493", |
00000072 => x"00240413", |
00000073 => x"34141073", |
00000074 => x"00300413", |
00000075 => x"00941863", |
00000076 => x"34102473", |
00000077 => x"00240413", |
00000078 => x"34141073", |
00000079 => x"00012403", |
00000080 => x"00412483", |
00000081 => x"00810113", |
00000082 => x"30200073", |
00000083 => x"800007b7", |
00000084 => x"0007a023", |
00000085 => x"fd010113", |
00000086 => x"8001a223", |
00000087 => x"02812423", |
00000088 => x"fe002403", |
00000089 => x"026267b7", |
00000090 => x"02112623", |
00000091 => x"02912223", |
00000092 => x"03212023", |
00000093 => x"01312e23", |
00000094 => x"01412c23", |
00000095 => x"01512a23", |
00000096 => x"01612823", |
00000097 => x"01712623", |
00000098 => x"01812423", |
00000099 => x"9ff78793", |
00000100 => x"00000613", |
00000101 => x"00000593", |
00000102 => x"00200513", |
00000103 => x"0087f463", |
00000104 => x"00400513", |
00000105 => x"391000ef", |
00000106 => x"00100513", |
00000107 => x"431000ef", |
00000108 => x"00005537", |
00000109 => x"00000613", |
00000110 => x"00000593", |
00000111 => x"b0050513", |
00000112 => x"2bd000ef", |
00000113 => x"1c1000ef", |
00000114 => x"00245793", |
00000115 => x"00a78533", |
00000116 => x"00f537b3", |
00000117 => x"00b785b3", |
00000118 => x"1d9000ef", |
00000119 => x"ffff07b7", |
00000120 => x"4cc78793", |
00000121 => x"30579073", |
00000122 => x"08000793", |
00000123 => x"30479073", |
00000124 => x"30046073", |
00000061 => x"10500073", |
00000062 => x"ffdff06f", |
00000063 => x"ff810113", |
00000064 => x"00812023", |
00000065 => x"00912223", |
00000066 => x"34202473", |
00000067 => x"02044663", |
00000068 => x"34102473", |
00000069 => x"00041483", |
00000070 => x"0034f493", |
00000071 => x"00240413", |
00000072 => x"34141073", |
00000073 => x"00300413", |
00000074 => x"00941863", |
00000075 => x"34102473", |
00000076 => x"00240413", |
00000077 => x"34141073", |
00000078 => x"00012403", |
00000079 => x"00412483", |
00000080 => x"00810113", |
00000081 => x"30200073", |
00000082 => x"800007b7", |
00000083 => x"0007a023", |
00000084 => x"fd010113", |
00000085 => x"8001a223", |
00000086 => x"02812423", |
00000087 => x"fe002403", |
00000088 => x"026267b7", |
00000089 => x"02112623", |
00000090 => x"02912223", |
00000091 => x"03212023", |
00000092 => x"01312e23", |
00000093 => x"01412c23", |
00000094 => x"01512a23", |
00000095 => x"01612823", |
00000096 => x"01712623", |
00000097 => x"01812423", |
00000098 => x"9ff78793", |
00000099 => x"00000613", |
00000100 => x"00000593", |
00000101 => x"00200513", |
00000102 => x"0087f463", |
00000103 => x"00400513", |
00000104 => x"391000ef", |
00000105 => x"00100513", |
00000106 => x"431000ef", |
00000107 => x"00005537", |
00000108 => x"00000613", |
00000109 => x"00000593", |
00000110 => x"b0050513", |
00000111 => x"2bd000ef", |
00000112 => x"1c1000ef", |
00000113 => x"00245793", |
00000114 => x"00a78533", |
00000115 => x"00f537b3", |
00000116 => x"00b785b3", |
00000117 => x"1d9000ef", |
00000118 => x"ffff07b7", |
00000119 => x"4c878793", |
00000120 => x"30579073", |
00000121 => x"08000793", |
00000122 => x"30479073", |
00000123 => x"30046073", |
00000124 => x"00000013", |
00000125 => x"00000013", |
00000126 => x"00000013", |
00000127 => x"ffff1537", |
00000128 => x"f1850513", |
00000129 => x"31d000ef", |
00000130 => x"f1302573", |
00000131 => x"250000ef", |
00000132 => x"ffff1537", |
00000133 => x"f5050513", |
00000134 => x"309000ef", |
00000135 => x"fe002503", |
00000136 => x"23c000ef", |
00000137 => x"ffff1537", |
00000138 => x"f5850513", |
00000139 => x"2f5000ef", |
00000140 => x"fe402503", |
00000141 => x"228000ef", |
00000142 => x"ffff1537", |
00000143 => x"f6050513", |
00000144 => x"2e1000ef", |
00000145 => x"30102573", |
00000146 => x"214000ef", |
00000147 => x"ffff1537", |
00000148 => x"f6850513", |
00000149 => x"2cd000ef", |
00000150 => x"fc002573", |
00000151 => x"200000ef", |
00000152 => x"ffff1537", |
00000153 => x"f7050513", |
00000154 => x"2b9000ef", |
00000155 => x"fe802503", |
00000156 => x"ffff14b7", |
00000157 => x"00341413", |
00000158 => x"1e4000ef", |
00000159 => x"ffff1537", |
00000160 => x"f7850513", |
00000161 => x"29d000ef", |
00000162 => x"ff802503", |
00000163 => x"1d0000ef", |
00000164 => x"f8048513", |
00000165 => x"28d000ef", |
00000166 => x"ff002503", |
00000167 => x"1c0000ef", |
00000168 => x"ffff1537", |
00000169 => x"f8c50513", |
00000170 => x"279000ef", |
00000171 => x"ffc02503", |
00000172 => x"1ac000ef", |
00000173 => x"f8048513", |
00000174 => x"269000ef", |
00000175 => x"ff402503", |
00000176 => x"19c000ef", |
00000177 => x"ffff1537", |
00000178 => x"f9450513", |
00000179 => x"255000ef", |
00000180 => x"0b5000ef", |
00000181 => x"00a404b3", |
00000182 => x"0084b433", |
00000183 => x"00b40433", |
00000184 => x"1e5000ef", |
00000185 => x"02050263", |
00000186 => x"ffff1537", |
00000187 => x"fc050513", |
00000188 => x"231000ef", |
00000189 => x"0ed000ef", |
00000190 => x"02300793", |
00000191 => x"02f51263", |
00000192 => x"00000513", |
00000193 => x"0180006f", |
00000194 => x"07d000ef", |
00000195 => x"fc85eae3", |
00000196 => x"00b41463", |
00000197 => x"fc9566e3", |
00000198 => x"00100513", |
00000199 => x"5d8000ef", |
00000200 => x"0a4000ef", |
00000201 => x"ffff1937", |
00000202 => x"ffff19b7", |
00000203 => x"02300a13", |
00000204 => x"07200a93", |
00000205 => x"06800b13", |
00000206 => x"07500b93", |
00000207 => x"07300c13", |
00000208 => x"ffff14b7", |
00000209 => x"fcc90513", |
00000210 => x"1d9000ef", |
00000211 => x"169000ef", |
00000212 => x"00050413", |
00000213 => x"13d000ef", |
00000214 => x"ed098513", |
00000215 => x"1c5000ef", |
00000216 => x"fb4400e3", |
00000217 => x"01541863", |
00000218 => x"ffff02b7", |
00000219 => x"00028067", |
00000220 => x"fd5ff06f", |
00000221 => x"01641663", |
00000222 => x"04c000ef", |
00000223 => x"fc9ff06f", |
00000224 => x"00000513", |
00000225 => x"01740e63", |
00000226 => x"01841663", |
00000227 => x"67c000ef", |
00000228 => x"fb5ff06f", |
00000229 => x"06c00793", |
00000230 => x"00f41863", |
00000231 => x"00100513", |
00000232 => x"3f0000ef", |
00000233 => x"fa1ff06f", |
00000234 => x"06500793", |
00000235 => x"00f41663", |
00000236 => x"020000ef", |
00000237 => x"f91ff06f", |
00000238 => x"fd448513", |
00000239 => x"165000ef", |
00000240 => x"f85ff06f", |
00000241 => x"ffff1537", |
00000242 => x"de450513", |
00000243 => x"1550006f", |
00000244 => x"800007b7", |
00000245 => x"0007a783", |
00000246 => x"00079863", |
00000247 => x"ffff1537", |
00000248 => x"e4850513", |
00000249 => x"13d0006f", |
00000250 => x"ff010113", |
00000251 => x"00112623", |
00000252 => x"30047073", |
00000126 => x"ffff1537", |
00000127 => x"f1450513", |
00000128 => x"31d000ef", |
00000129 => x"f1302573", |
00000130 => x"250000ef", |
00000131 => x"ffff1537", |
00000132 => x"f4c50513", |
00000133 => x"309000ef", |
00000134 => x"fe002503", |
00000135 => x"23c000ef", |
00000136 => x"ffff1537", |
00000137 => x"f5450513", |
00000138 => x"2f5000ef", |
00000139 => x"fe402503", |
00000140 => x"228000ef", |
00000141 => x"ffff1537", |
00000142 => x"f5c50513", |
00000143 => x"2e1000ef", |
00000144 => x"30102573", |
00000145 => x"214000ef", |
00000146 => x"ffff1537", |
00000147 => x"f6450513", |
00000148 => x"2cd000ef", |
00000149 => x"fc002573", |
00000150 => x"200000ef", |
00000151 => x"ffff1537", |
00000152 => x"f6c50513", |
00000153 => x"2b9000ef", |
00000154 => x"fe802503", |
00000155 => x"ffff14b7", |
00000156 => x"00341413", |
00000157 => x"1e4000ef", |
00000158 => x"ffff1537", |
00000159 => x"f7450513", |
00000160 => x"29d000ef", |
00000161 => x"ff802503", |
00000162 => x"1d0000ef", |
00000163 => x"f7c48513", |
00000164 => x"28d000ef", |
00000165 => x"ff002503", |
00000166 => x"1c0000ef", |
00000167 => x"ffff1537", |
00000168 => x"f8850513", |
00000169 => x"279000ef", |
00000170 => x"ffc02503", |
00000171 => x"1ac000ef", |
00000172 => x"f7c48513", |
00000173 => x"269000ef", |
00000174 => x"ff402503", |
00000175 => x"19c000ef", |
00000176 => x"ffff1537", |
00000177 => x"f9050513", |
00000178 => x"255000ef", |
00000179 => x"0b5000ef", |
00000180 => x"00a404b3", |
00000181 => x"0084b433", |
00000182 => x"00b40433", |
00000183 => x"1e5000ef", |
00000184 => x"02050263", |
00000185 => x"ffff1537", |
00000186 => x"fbc50513", |
00000187 => x"231000ef", |
00000188 => x"0ed000ef", |
00000189 => x"02300793", |
00000190 => x"02f51263", |
00000191 => x"00000513", |
00000192 => x"0180006f", |
00000193 => x"07d000ef", |
00000194 => x"fc85eae3", |
00000195 => x"00b41463", |
00000196 => x"fc9566e3", |
00000197 => x"00100513", |
00000198 => x"5d8000ef", |
00000199 => x"0a4000ef", |
00000200 => x"ffff1937", |
00000201 => x"ffff19b7", |
00000202 => x"02300a13", |
00000203 => x"07200a93", |
00000204 => x"06800b13", |
00000205 => x"07500b93", |
00000206 => x"07300c13", |
00000207 => x"ffff14b7", |
00000208 => x"fc890513", |
00000209 => x"1d9000ef", |
00000210 => x"169000ef", |
00000211 => x"00050413", |
00000212 => x"13d000ef", |
00000213 => x"ecc98513", |
00000214 => x"1c5000ef", |
00000215 => x"fb4400e3", |
00000216 => x"01541863", |
00000217 => x"ffff02b7", |
00000218 => x"00028067", |
00000219 => x"fd5ff06f", |
00000220 => x"01641663", |
00000221 => x"04c000ef", |
00000222 => x"fc9ff06f", |
00000223 => x"00000513", |
00000224 => x"01740e63", |
00000225 => x"01841663", |
00000226 => x"67c000ef", |
00000227 => x"fb5ff06f", |
00000228 => x"06c00793", |
00000229 => x"00f41863", |
00000230 => x"00100513", |
00000231 => x"3f0000ef", |
00000232 => x"fa1ff06f", |
00000233 => x"06500793", |
00000234 => x"00f41663", |
00000235 => x"020000ef", |
00000236 => x"f91ff06f", |
00000237 => x"fd048513", |
00000238 => x"165000ef", |
00000239 => x"f85ff06f", |
00000240 => x"ffff1537", |
00000241 => x"de050513", |
00000242 => x"1550006f", |
00000243 => x"800007b7", |
00000244 => x"0007a783", |
00000245 => x"00079863", |
00000246 => x"ffff1537", |
00000247 => x"e4450513", |
00000248 => x"13d0006f", |
00000249 => x"ff010113", |
00000250 => x"00112623", |
00000251 => x"30047073", |
00000252 => x"00000013", |
00000253 => x"00000013", |
00000254 => x"00000013", |
00000255 => x"ffff1537", |
00000256 => x"e6450513", |
00000257 => x"11d000ef", |
00000258 => x"099000ef", |
00000259 => x"fe051ee3", |
00000260 => x"ff002783", |
00000261 => x"00078067", |
00000262 => x"0000006f", |
00000263 => x"ff010113", |
00000264 => x"00812423", |
00000265 => x"00050413", |
00000266 => x"ffff1537", |
00000267 => x"e7450513", |
00000268 => x"00112623", |
00000269 => x"0ed000ef", |
00000270 => x"03040513", |
00000271 => x"0ff57513", |
00000272 => x"051000ef", |
00000273 => x"30047073", |
00000254 => x"ffff1537", |
00000255 => x"e6050513", |
00000256 => x"11d000ef", |
00000257 => x"099000ef", |
00000258 => x"fe051ee3", |
00000259 => x"ff002783", |
00000260 => x"00078067", |
00000261 => x"0000006f", |
00000262 => x"ff010113", |
00000263 => x"00812423", |
00000264 => x"00050413", |
00000265 => x"ffff1537", |
00000266 => x"e7050513", |
00000267 => x"00112623", |
00000268 => x"0ed000ef", |
00000269 => x"03040513", |
00000270 => x"0ff57513", |
00000271 => x"051000ef", |
00000272 => x"30047073", |
00000273 => x"00000013", |
00000274 => x"00000013", |
00000275 => x"00000013", |
00000276 => x"00100513", |
00000277 => x"189000ef", |
00000278 => x"0000006f", |
00000279 => x"fe010113", |
00000280 => x"01212823", |
00000281 => x"00050913", |
00000282 => x"ffff1537", |
00000283 => x"00912a23", |
00000284 => x"e8050513", |
00000285 => x"ffff14b7", |
00000286 => x"00812c23", |
00000287 => x"01312623", |
00000288 => x"00112e23", |
00000289 => x"01c00413", |
00000290 => x"099000ef", |
00000291 => x"fe048493", |
00000292 => x"ffc00993", |
00000293 => x"008957b3", |
00000294 => x"00f7f793", |
00000295 => x"00f487b3", |
00000296 => x"0007c503", |
00000297 => x"ffc40413", |
00000298 => x"7e8000ef", |
00000299 => x"ff3414e3", |
00000300 => x"01c12083", |
00000301 => x"01812403", |
00000302 => x"01412483", |
00000303 => x"01012903", |
00000304 => x"00c12983", |
00000305 => x"02010113", |
00000306 => x"00008067", |
00000307 => x"fb010113", |
00000308 => x"04112623", |
00000309 => x"04512423", |
00000310 => x"04612223", |
00000311 => x"04712023", |
00000312 => x"02812e23", |
00000313 => x"02a12c23", |
00000314 => x"02b12a23", |
00000315 => x"02c12823", |
00000316 => x"02d12623", |
00000317 => x"02e12423", |
00000318 => x"02f12223", |
00000319 => x"03012023", |
00000320 => x"01112e23", |
00000321 => x"01c12c23", |
00000322 => x"01d12a23", |
00000323 => x"01e12823", |
00000324 => x"01f12623", |
00000325 => x"34202473", |
00000326 => x"800007b7", |
00000327 => x"00778793", |
00000328 => x"06f41a63", |
00000329 => x"00000513", |
00000330 => x"099000ef", |
00000331 => x"658000ef", |
00000332 => x"fe002783", |
00000333 => x"0027d793", |
00000334 => x"00a78533", |
00000335 => x"00f537b3", |
00000336 => x"00b785b3", |
00000337 => x"66c000ef", |
00000338 => x"03c12403", |
00000339 => x"04c12083", |
00000340 => x"04812283", |
00000341 => x"04412303", |
00000342 => x"04012383", |
00000343 => x"03812503", |
00000344 => x"03412583", |
00000345 => x"03012603", |
00000346 => x"02c12683", |
00000347 => x"02812703", |
00000348 => x"02412783", |
00000349 => x"02012803", |
00000350 => x"01c12883", |
00000351 => x"01812e03", |
00000352 => x"01412e83", |
00000353 => x"01012f03", |
00000354 => x"00c12f83", |
00000355 => x"05010113", |
00000356 => x"30200073", |
00000357 => x"00700793", |
00000358 => x"00f41863", |
00000359 => x"8041a783", |
00000360 => x"00100513", |
00000361 => x"02079863", |
00000362 => x"ffff1537", |
00000363 => x"e8450513", |
00000364 => x"770000ef", |
00000365 => x"00040513", |
00000366 => x"ea5ff0ef", |
00000367 => x"ffff1537", |
00000368 => x"e9850513", |
00000369 => x"75c000ef", |
00000370 => x"34102573", |
00000371 => x"e91ff0ef", |
00000372 => x"00500513", |
00000373 => x"e49ff0ef", |
00000374 => x"ff010113", |
00000375 => x"00000513", |
00000376 => x"00112623", |
00000377 => x"00812423", |
00000378 => x"780000ef", |
00000379 => x"09e00513", |
00000380 => x"7bc000ef", |
00000381 => x"00000513", |
00000382 => x"7b4000ef", |
00000383 => x"00050413", |
00000384 => x"00000513", |
00000385 => x"784000ef", |
00000386 => x"00c12083", |
00000387 => x"0ff47513", |
00000388 => x"00812403", |
00000389 => x"01010113", |
00000390 => x"00008067", |
00000391 => x"ff010113", |
00000392 => x"00112623", |
00000393 => x"00812423", |
00000394 => x"00000513", |
00000395 => x"73c000ef", |
00000396 => x"00500513", |
00000397 => x"778000ef", |
00000398 => x"00000513", |
00000399 => x"770000ef", |
00000400 => x"00050413", |
00000401 => x"00147413", |
00000402 => x"00000513", |
00000403 => x"73c000ef", |
00000404 => x"fc041ce3", |
00000405 => x"00c12083", |
00000406 => x"00812403", |
00000407 => x"01010113", |
00000408 => x"00008067", |
00000409 => x"ff010113", |
00000410 => x"00000513", |
00000411 => x"00112623", |
00000412 => x"6f8000ef", |
00000413 => x"00600513", |
00000414 => x"734000ef", |
00000415 => x"00c12083", |
00000416 => x"00000513", |
00000417 => x"01010113", |
00000418 => x"7000006f", |
00000419 => x"ff010113", |
00000420 => x"00812423", |
00000421 => x"00050413", |
00000422 => x"01055513", |
00000423 => x"0ff57513", |
00000424 => x"00112623", |
00000425 => x"708000ef", |
00000426 => x"00845513", |
00000427 => x"0ff57513", |
00000428 => x"6fc000ef", |
00000429 => x"0ff47513", |
00000430 => x"00812403", |
00000431 => x"00c12083", |
00000432 => x"01010113", |
00000433 => x"6e80006f", |
00000434 => x"ff010113", |
00000435 => x"00812423", |
00000436 => x"00050413", |
00000437 => x"00000513", |
00000438 => x"00112623", |
00000439 => x"68c000ef", |
00000440 => x"00300513", |
00000441 => x"6c8000ef", |
00000442 => x"00040513", |
00000443 => x"fa1ff0ef", |
00000444 => x"00000513", |
00000445 => x"6b8000ef", |
00000446 => x"00050413", |
00000447 => x"00000513", |
00000448 => x"688000ef", |
00000449 => x"00c12083", |
00000450 => x"0ff47513", |
00000451 => x"00812403", |
00000452 => x"01010113", |
00000453 => x"00008067", |
00000454 => x"fd010113", |
00000455 => x"02812423", |
00000456 => x"02912223", |
00000457 => x"03212023", |
00000458 => x"01312e23", |
00000459 => x"01412c23", |
00000460 => x"02112623", |
00000461 => x"00050913", |
00000462 => x"00058993", |
00000463 => x"00c10493", |
00000464 => x"00000413", |
00000465 => x"00400a13", |
00000466 => x"02091e63", |
00000467 => x"568000ef", |
00000468 => x"00a481a3", |
00000469 => x"00140413", |
00000470 => x"fff48493", |
00000471 => x"ff4416e3", |
00000472 => x"02c12083", |
00000473 => x"02812403", |
00000474 => x"00c12503", |
00000475 => x"02412483", |
00000476 => x"02012903", |
00000477 => x"01c12983", |
00000478 => x"01812a03", |
00000479 => x"03010113", |
00000480 => x"00008067", |
00000481 => x"00898533", |
00000482 => x"f41ff0ef", |
00000483 => x"fc5ff06f", |
00000484 => x"fd010113", |
00000485 => x"01412c23", |
00000486 => x"80418793", |
00000487 => x"02812423", |
00000488 => x"02112623", |
00000489 => x"02912223", |
00000490 => x"03212023", |
00000491 => x"01312e23", |
00000492 => x"01512a23", |
00000493 => x"01612823", |
00000494 => x"01712623", |
00000495 => x"01812423", |
00000496 => x"00100713", |
00000497 => x"00e7a023", |
00000498 => x"fe802783", |
00000499 => x"00050413", |
00000500 => x"80418a13", |
00000501 => x"0087f793", |
00000502 => x"00078a63", |
00000503 => x"fe802783", |
00000504 => x"00400513", |
00000505 => x"0047f793", |
00000506 => x"04079663", |
00000507 => x"02041863", |
00000508 => x"ffff1537", |
00000509 => x"ea050513", |
00000510 => x"528000ef", |
00000511 => x"008005b7", |
00000512 => x"00040513", |
00000513 => x"f15ff0ef", |
00000514 => x"4788d7b7", |
00000515 => x"afe78793", |
00000516 => x"02f50a63", |
00000517 => x"00000513", |
00000518 => x"01c0006f", |
00000519 => x"ffff1537", |
00000520 => x"ec050513", |
00000275 => x"00100513", |
00000276 => x"189000ef", |
00000277 => x"0000006f", |
00000278 => x"fe010113", |
00000279 => x"01212823", |
00000280 => x"00050913", |
00000281 => x"ffff1537", |
00000282 => x"00912a23", |
00000283 => x"e7c50513", |
00000284 => x"ffff14b7", |
00000285 => x"00812c23", |
00000286 => x"01312623", |
00000287 => x"00112e23", |
00000288 => x"01c00413", |
00000289 => x"099000ef", |
00000290 => x"fdc48493", |
00000291 => x"ffc00993", |
00000292 => x"008957b3", |
00000293 => x"00f7f793", |
00000294 => x"00f487b3", |
00000295 => x"0007c503", |
00000296 => x"ffc40413", |
00000297 => x"7e8000ef", |
00000298 => x"ff3414e3", |
00000299 => x"01c12083", |
00000300 => x"01812403", |
00000301 => x"01412483", |
00000302 => x"01012903", |
00000303 => x"00c12983", |
00000304 => x"02010113", |
00000305 => x"00008067", |
00000306 => x"fb010113", |
00000307 => x"04112623", |
00000308 => x"04512423", |
00000309 => x"04612223", |
00000310 => x"04712023", |
00000311 => x"02812e23", |
00000312 => x"02a12c23", |
00000313 => x"02b12a23", |
00000314 => x"02c12823", |
00000315 => x"02d12623", |
00000316 => x"02e12423", |
00000317 => x"02f12223", |
00000318 => x"03012023", |
00000319 => x"01112e23", |
00000320 => x"01c12c23", |
00000321 => x"01d12a23", |
00000322 => x"01e12823", |
00000323 => x"01f12623", |
00000324 => x"34202473", |
00000325 => x"800007b7", |
00000326 => x"00778793", |
00000327 => x"06f41a63", |
00000328 => x"00000513", |
00000329 => x"099000ef", |
00000330 => x"658000ef", |
00000331 => x"fe002783", |
00000332 => x"0027d793", |
00000333 => x"00a78533", |
00000334 => x"00f537b3", |
00000335 => x"00b785b3", |
00000336 => x"66c000ef", |
00000337 => x"03c12403", |
00000338 => x"04c12083", |
00000339 => x"04812283", |
00000340 => x"04412303", |
00000341 => x"04012383", |
00000342 => x"03812503", |
00000343 => x"03412583", |
00000344 => x"03012603", |
00000345 => x"02c12683", |
00000346 => x"02812703", |
00000347 => x"02412783", |
00000348 => x"02012803", |
00000349 => x"01c12883", |
00000350 => x"01812e03", |
00000351 => x"01412e83", |
00000352 => x"01012f03", |
00000353 => x"00c12f83", |
00000354 => x"05010113", |
00000355 => x"30200073", |
00000356 => x"00700793", |
00000357 => x"00f41863", |
00000358 => x"8041a783", |
00000359 => x"00100513", |
00000360 => x"02079863", |
00000361 => x"ffff1537", |
00000362 => x"e8050513", |
00000363 => x"770000ef", |
00000364 => x"00040513", |
00000365 => x"ea5ff0ef", |
00000366 => x"ffff1537", |
00000367 => x"e9450513", |
00000368 => x"75c000ef", |
00000369 => x"34102573", |
00000370 => x"e91ff0ef", |
00000371 => x"00500513", |
00000372 => x"e49ff0ef", |
00000373 => x"ff010113", |
00000374 => x"00000513", |
00000375 => x"00112623", |
00000376 => x"00812423", |
00000377 => x"780000ef", |
00000378 => x"09e00513", |
00000379 => x"7bc000ef", |
00000380 => x"00000513", |
00000381 => x"7b4000ef", |
00000382 => x"00050413", |
00000383 => x"00000513", |
00000384 => x"784000ef", |
00000385 => x"00c12083", |
00000386 => x"0ff47513", |
00000387 => x"00812403", |
00000388 => x"01010113", |
00000389 => x"00008067", |
00000390 => x"ff010113", |
00000391 => x"00112623", |
00000392 => x"00812423", |
00000393 => x"00000513", |
00000394 => x"73c000ef", |
00000395 => x"00500513", |
00000396 => x"778000ef", |
00000397 => x"00000513", |
00000398 => x"770000ef", |
00000399 => x"00050413", |
00000400 => x"00147413", |
00000401 => x"00000513", |
00000402 => x"73c000ef", |
00000403 => x"fc041ce3", |
00000404 => x"00c12083", |
00000405 => x"00812403", |
00000406 => x"01010113", |
00000407 => x"00008067", |
00000408 => x"ff010113", |
00000409 => x"00000513", |
00000410 => x"00112623", |
00000411 => x"6f8000ef", |
00000412 => x"00600513", |
00000413 => x"734000ef", |
00000414 => x"00c12083", |
00000415 => x"00000513", |
00000416 => x"01010113", |
00000417 => x"7000006f", |
00000418 => x"ff010113", |
00000419 => x"00812423", |
00000420 => x"00050413", |
00000421 => x"01055513", |
00000422 => x"0ff57513", |
00000423 => x"00112623", |
00000424 => x"708000ef", |
00000425 => x"00845513", |
00000426 => x"0ff57513", |
00000427 => x"6fc000ef", |
00000428 => x"0ff47513", |
00000429 => x"00812403", |
00000430 => x"00c12083", |
00000431 => x"01010113", |
00000432 => x"6e80006f", |
00000433 => x"ff010113", |
00000434 => x"00812423", |
00000435 => x"00050413", |
00000436 => x"00000513", |
00000437 => x"00112623", |
00000438 => x"68c000ef", |
00000439 => x"00300513", |
00000440 => x"6c8000ef", |
00000441 => x"00040513", |
00000442 => x"fa1ff0ef", |
00000443 => x"00000513", |
00000444 => x"6b8000ef", |
00000445 => x"00050413", |
00000446 => x"00000513", |
00000447 => x"688000ef", |
00000448 => x"00c12083", |
00000449 => x"0ff47513", |
00000450 => x"00812403", |
00000451 => x"01010113", |
00000452 => x"00008067", |
00000453 => x"fd010113", |
00000454 => x"02812423", |
00000455 => x"02912223", |
00000456 => x"03212023", |
00000457 => x"01312e23", |
00000458 => x"01412c23", |
00000459 => x"02112623", |
00000460 => x"00050913", |
00000461 => x"00058993", |
00000462 => x"00c10493", |
00000463 => x"00000413", |
00000464 => x"00400a13", |
00000465 => x"02091e63", |
00000466 => x"568000ef", |
00000467 => x"00a48023", |
00000468 => x"00140413", |
00000469 => x"00148493", |
00000470 => x"ff4416e3", |
00000471 => x"02c12083", |
00000472 => x"02812403", |
00000473 => x"00c12503", |
00000474 => x"02412483", |
00000475 => x"02012903", |
00000476 => x"01c12983", |
00000477 => x"01812a03", |
00000478 => x"03010113", |
00000479 => x"00008067", |
00000480 => x"00898533", |
00000481 => x"f41ff0ef", |
00000482 => x"fc5ff06f", |
00000483 => x"fd010113", |
00000484 => x"01412c23", |
00000485 => x"80418793", |
00000486 => x"02812423", |
00000487 => x"02112623", |
00000488 => x"02912223", |
00000489 => x"03212023", |
00000490 => x"01312e23", |
00000491 => x"01512a23", |
00000492 => x"01612823", |
00000493 => x"01712623", |
00000494 => x"01812423", |
00000495 => x"00100713", |
00000496 => x"00e7a023", |
00000497 => x"fe802783", |
00000498 => x"00050413", |
00000499 => x"80418a13", |
00000500 => x"0087f793", |
00000501 => x"00078a63", |
00000502 => x"fe802783", |
00000503 => x"00400513", |
00000504 => x"0047f793", |
00000505 => x"04079663", |
00000506 => x"02041863", |
00000507 => x"ffff1537", |
00000508 => x"e9c50513", |
00000509 => x"528000ef", |
00000510 => x"008005b7", |
00000511 => x"00040513", |
00000512 => x"f15ff0ef", |
00000513 => x"4788d7b7", |
00000514 => x"afe78793", |
00000515 => x"02f50a63", |
00000516 => x"00000513", |
00000517 => x"01c0006f", |
00000518 => x"ffff1537", |
00000519 => x"ebc50513", |
00000520 => x"4fc000ef", |
00000521 => x"4fc000ef", |
00000522 => x"4fc000ef", |
00000523 => x"00051663", |
00000524 => x"00300513", |
00000525 => x"be9ff0ef", |
00000526 => x"da1ff0ef", |
00000527 => x"fc0510e3", |
00000528 => x"ff1ff06f", |
00000529 => x"008009b7", |
00000530 => x"00498593", |
00000531 => x"00040513", |
00000532 => x"ec9ff0ef", |
00000533 => x"00050a93", |
00000534 => x"00898593", |
00000535 => x"00040513", |
00000536 => x"eb9ff0ef", |
00000537 => x"ff002c03", |
00000538 => x"00050b13", |
00000539 => x"ffcafb93", |
00000540 => x"00000913", |
00000541 => x"00000493", |
00000542 => x"00c98993", |
00000543 => x"013905b3", |
00000544 => x"052b9c63", |
00000545 => x"016484b3", |
00000546 => x"00200513", |
00000547 => x"fa0494e3", |
00000548 => x"ffff1537", |
00000549 => x"ecc50513", |
00000550 => x"488000ef", |
00000551 => x"02c12083", |
00000552 => x"02812403", |
00000553 => x"800007b7", |
00000554 => x"0157a023", |
00000555 => x"000a2023", |
00000556 => x"02412483", |
00000557 => x"02012903", |
00000558 => x"01c12983", |
00000559 => x"01812a03", |
00000560 => x"01412a83", |
00000561 => x"01012b03", |
00000562 => x"00c12b83", |
00000563 => x"00812c03", |
00000564 => x"03010113", |
00000565 => x"00008067", |
00000566 => x"00040513", |
00000567 => x"e3dff0ef", |
00000568 => x"012c07b3", |
00000569 => x"00a484b3", |
00000570 => x"00a7a023", |
00000571 => x"00490913", |
00000572 => x"f8dff06f", |
00000573 => x"ff010113", |
00000574 => x"00112623", |
00000575 => x"e95ff0ef", |
00000576 => x"ffff1537", |
00000577 => x"ed050513", |
00000578 => x"418000ef", |
00000579 => x"ac5ff0ef", |
00000580 => x"0000006f", |
00000581 => x"ff010113", |
00000582 => x"00112623", |
00000583 => x"00812423", |
00000584 => x"00912223", |
00000585 => x"00058413", |
00000586 => x"00050493", |
00000587 => x"d39ff0ef", |
00000588 => x"00000513", |
00000589 => x"434000ef", |
00000590 => x"00200513", |
00000591 => x"470000ef", |
00000592 => x"00048513", |
00000593 => x"d49ff0ef", |
00000594 => x"00040513", |
00000595 => x"460000ef", |
00000596 => x"00000513", |
00000597 => x"434000ef", |
00000598 => x"00812403", |
00000599 => x"00c12083", |
00000600 => x"00412483", |
00000601 => x"01010113", |
00000602 => x"cb5ff06f", |
00000603 => x"fe010113", |
00000604 => x"00812c23", |
00000605 => x"00912a23", |
00000606 => x"01212823", |
00000607 => x"00112e23", |
00000522 => x"00051663", |
00000523 => x"00300513", |
00000524 => x"be9ff0ef", |
00000525 => x"da1ff0ef", |
00000526 => x"fc0510e3", |
00000527 => x"ff1ff06f", |
00000528 => x"008009b7", |
00000529 => x"00498593", |
00000530 => x"00040513", |
00000531 => x"ec9ff0ef", |
00000532 => x"00050a93", |
00000533 => x"00898593", |
00000534 => x"00040513", |
00000535 => x"eb9ff0ef", |
00000536 => x"ff002c03", |
00000537 => x"00050b13", |
00000538 => x"ffcafb93", |
00000539 => x"00000913", |
00000540 => x"00000493", |
00000541 => x"00c98993", |
00000542 => x"013905b3", |
00000543 => x"052b9c63", |
00000544 => x"016484b3", |
00000545 => x"00200513", |
00000546 => x"fa0494e3", |
00000547 => x"ffff1537", |
00000548 => x"ec850513", |
00000549 => x"488000ef", |
00000550 => x"02c12083", |
00000551 => x"02812403", |
00000552 => x"800007b7", |
00000553 => x"0157a023", |
00000554 => x"000a2023", |
00000555 => x"02412483", |
00000556 => x"02012903", |
00000557 => x"01c12983", |
00000558 => x"01812a03", |
00000559 => x"01412a83", |
00000560 => x"01012b03", |
00000561 => x"00c12b83", |
00000562 => x"00812c03", |
00000563 => x"03010113", |
00000564 => x"00008067", |
00000565 => x"00040513", |
00000566 => x"e3dff0ef", |
00000567 => x"012c07b3", |
00000568 => x"00a484b3", |
00000569 => x"00a7a023", |
00000570 => x"00490913", |
00000571 => x"f8dff06f", |
00000572 => x"ff010113", |
00000573 => x"00112623", |
00000574 => x"e95ff0ef", |
00000575 => x"ffff1537", |
00000576 => x"ecc50513", |
00000577 => x"418000ef", |
00000578 => x"ac5ff0ef", |
00000579 => x"0000006f", |
00000580 => x"ff010113", |
00000581 => x"00112623", |
00000582 => x"00812423", |
00000583 => x"00912223", |
00000584 => x"00058413", |
00000585 => x"00050493", |
00000586 => x"d39ff0ef", |
00000587 => x"00000513", |
00000588 => x"434000ef", |
00000589 => x"00200513", |
00000590 => x"470000ef", |
00000591 => x"00048513", |
00000592 => x"d49ff0ef", |
00000593 => x"00040513", |
00000594 => x"460000ef", |
00000595 => x"00000513", |
00000596 => x"434000ef", |
00000597 => x"00812403", |
00000598 => x"00c12083", |
00000599 => x"00412483", |
00000600 => x"01010113", |
00000601 => x"cb5ff06f", |
00000602 => x"fe010113", |
00000603 => x"00812c23", |
00000604 => x"00912a23", |
00000605 => x"01212823", |
00000606 => x"00112e23", |
00000607 => x"00050493", |
00000608 => x"00b12623", |
00000609 => x"00300413", |
00000610 => x"00350493", |
00000611 => x"fff00913", |
00000612 => x"00c10793", |
00000613 => x"008787b3", |
00000614 => x"0007c583", |
00000615 => x"40848533", |
00000616 => x"fff40413", |
00000617 => x"f71ff0ef", |
00000618 => x"ff2414e3", |
00000619 => x"01c12083", |
00000620 => x"01812403", |
00000621 => x"01412483", |
00000622 => x"01012903", |
00000623 => x"02010113", |
00000624 => x"00008067", |
00000625 => x"ff010113", |
00000626 => x"00112623", |
00000627 => x"00812423", |
00000628 => x"00050413", |
00000629 => x"c91ff0ef", |
00000630 => x"00000513", |
00000631 => x"38c000ef", |
00000632 => x"0d800513", |
00000633 => x"3c8000ef", |
00000634 => x"00040513", |
00000635 => x"ca1ff0ef", |
00000636 => x"00000513", |
00000637 => x"394000ef", |
00000638 => x"00812403", |
00000639 => x"00c12083", |
00000640 => x"01010113", |
00000641 => x"c19ff06f", |
00000642 => x"fe010113", |
00000643 => x"800007b7", |
00000644 => x"00812c23", |
00000645 => x"0007a403", |
00000646 => x"00112e23", |
00000647 => x"00912a23", |
00000648 => x"01212823", |
00000649 => x"01312623", |
00000650 => x"01412423", |
00000651 => x"01512223", |
00000652 => x"02041863", |
00000653 => x"ffff1537", |
00000654 => x"e4850513", |
00000655 => x"01812403", |
00000656 => x"01c12083", |
00000657 => x"01412483", |
00000658 => x"01012903", |
00000659 => x"00c12983", |
00000660 => x"00812a03", |
00000661 => x"00412a83", |
00000662 => x"02010113", |
00000663 => x"2c40006f", |
00000664 => x"ffff1537", |
00000665 => x"ed450513", |
00000666 => x"2b8000ef", |
00000667 => x"00040513", |
00000668 => x"9edff0ef", |
00000669 => x"ffff1537", |
00000670 => x"ee050513", |
00000671 => x"2a4000ef", |
00000672 => x"00800537", |
00000673 => x"9d9ff0ef", |
00000674 => x"ffff1537", |
00000675 => x"efc50513", |
00000676 => x"290000ef", |
00000677 => x"220000ef", |
00000678 => x"00050493", |
00000679 => x"1f4000ef", |
00000680 => x"07900793", |
00000681 => x"0af49e63", |
00000682 => x"b31ff0ef", |
00000683 => x"00051663", |
00000684 => x"00300513", |
00000685 => x"969ff0ef", |
00000686 => x"ffff1537", |
00000687 => x"f0850513", |
00000688 => x"01045493", |
00000689 => x"25c000ef", |
00000690 => x"00148493", |
00000691 => x"00800937", |
00000692 => x"fff00993", |
00000693 => x"00010a37", |
00000694 => x"fff48493", |
00000695 => x"07349063", |
00000696 => x"4788d5b7", |
00000697 => x"afe58593", |
00000698 => x"00800537", |
00000699 => x"e81ff0ef", |
00000700 => x"00800537", |
00000701 => x"00040593", |
00000702 => x"00450513", |
00000703 => x"e71ff0ef", |
00000704 => x"ff002a03", |
00000705 => x"008009b7", |
00000706 => x"ffc47413", |
00000707 => x"00000493", |
00000708 => x"00000913", |
00000709 => x"00c98a93", |
00000710 => x"01548533", |
00000711 => x"009a07b3", |
00000712 => x"02849663", |
00000713 => x"00898513", |
00000714 => x"412005b3", |
00000715 => x"e41ff0ef", |
00000716 => x"ffff1537", |
00000717 => x"ecc50513", |
00000718 => x"f05ff06f", |
00000719 => x"00090513", |
00000720 => x"e85ff0ef", |
00000721 => x"01490933", |
00000722 => x"f91ff06f", |
00000723 => x"0007a583", |
00000724 => x"00448493", |
00000725 => x"00b90933", |
00000726 => x"e15ff0ef", |
00000727 => x"fbdff06f", |
00000728 => x"01c12083", |
00000729 => x"01812403", |
00000730 => x"01412483", |
00000731 => x"01012903", |
00000732 => x"00c12983", |
00000733 => x"00812a03", |
00000734 => x"00412a83", |
00000735 => x"02010113", |
00000736 => x"00008067", |
00000737 => x"ff010113", |
00000738 => x"f9402783", |
00000739 => x"f9002703", |
00000740 => x"f9402683", |
00000741 => x"fed79ae3", |
00000742 => x"00e12023", |
00000743 => x"00f12223", |
00000744 => x"00012503", |
00000745 => x"00412583", |
00000746 => x"01010113", |
00000747 => x"00008067", |
00000748 => x"ff010113", |
00000749 => x"00a12023", |
00000750 => x"00b12223", |
00000751 => x"f9800793", |
00000752 => x"fff00713", |
00000753 => x"00e7a023", |
00000754 => x"00412703", |
00000755 => x"f8e02e23", |
00000756 => x"00012703", |
00000757 => x"00e7a023", |
00000758 => x"01010113", |
00000759 => x"00008067", |
00000760 => x"fa402503", |
00000761 => x"0ff57513", |
00000762 => x"00008067", |
00000763 => x"fa002023", |
00000764 => x"fe002703", |
00000765 => x"00151513", |
00000766 => x"00000793", |
00000767 => x"04a77463", |
00000768 => x"000016b7", |
00000769 => x"00000713", |
00000770 => x"ffe68693", |
00000771 => x"04f6e663", |
00000772 => x"00367613", |
00000773 => x"0035f593", |
00000774 => x"fff78793", |
00000775 => x"01461613", |
00000776 => x"00c7e7b3", |
00000777 => x"01659593", |
00000778 => x"01871713", |
00000779 => x"00b7e7b3", |
00000780 => x"00e7e7b3", |
00000781 => x"10000737", |
00000782 => x"00e7e7b3", |
00000783 => x"faf02023", |
00000784 => x"00008067", |
00000785 => x"00178793", |
00000786 => x"01079793", |
00000787 => x"40a70733", |
00000788 => x"0107d793", |
00000789 => x"fa9ff06f", |
00000790 => x"ffe70513", |
00000791 => x"0fd57513", |
00000792 => x"00051a63", |
00000793 => x"0037d793", |
00000794 => x"00170713", |
00000795 => x"0ff77713", |
00000796 => x"f9dff06f", |
00000797 => x"0017d793", |
00000798 => x"ff1ff06f", |
00000799 => x"f71ff06f", |
00000800 => x"fa002783", |
00000801 => x"fe07cee3", |
00000802 => x"faa02223", |
00000803 => x"00008067", |
00000804 => x"ff1ff06f", |
00000805 => x"fa002503", |
00000806 => x"01f55513", |
00000807 => x"00008067", |
00000808 => x"ff5ff06f", |
00000809 => x"fa402503", |
00000810 => x"fe055ee3", |
00000811 => x"0ff57513", |
00000812 => x"00008067", |
00000813 => x"ff1ff06f", |
00000814 => x"fa402503", |
00000815 => x"01f55513", |
00000816 => x"00008067", |
00000817 => x"ff5ff06f", |
00000818 => x"ff010113", |
00000819 => x"00812423", |
00000820 => x"01212023", |
00000821 => x"00112623", |
00000822 => x"00912223", |
00000823 => x"00050413", |
00000824 => x"00a00913", |
00000825 => x"00044483", |
00000826 => x"00140413", |
00000827 => x"00049e63", |
00000828 => x"00c12083", |
00000829 => x"00812403", |
00000830 => x"00412483", |
00000831 => x"00012903", |
00000832 => x"01010113", |
00000833 => x"00008067", |
00000834 => x"01249663", |
00000835 => x"00d00513", |
00000836 => x"f71ff0ef", |
00000837 => x"00048513", |
00000838 => x"f69ff0ef", |
00000839 => x"fc9ff06f", |
00000840 => x"fa9ff06f", |
00000841 => x"fe802503", |
00000842 => x"01355513", |
00000843 => x"00157513", |
00000844 => x"00008067", |
00000845 => x"00757513", |
00000846 => x"00367613", |
00000847 => x"0015f593", |
00000848 => x"00a51513", |
00000849 => x"00d61613", |
00000850 => x"00c56533", |
00000851 => x"00959593", |
00000852 => x"fa800793", |
00000853 => x"00b56533", |
00000854 => x"0007a023", |
00000855 => x"10056513", |
00000856 => x"00a7a023", |
00000857 => x"00008067", |
00000858 => x"fa800713", |
00000859 => x"00072683", |
00000860 => x"00757793", |
00000861 => x"00100513", |
00000862 => x"00f51533", |
00000863 => x"00d56533", |
00000864 => x"00a72023", |
00000865 => x"00008067", |
00000866 => x"fa800713", |
00000867 => x"00072683", |
00000868 => x"00757513", |
00000869 => x"00100793", |
00000870 => x"00a797b3", |
00000871 => x"fff7c793", |
00000872 => x"00d7f7b3", |
00000873 => x"00f72023", |
00000874 => x"00008067", |
00000875 => x"faa02623", |
00000876 => x"fa802783", |
00000877 => x"fe07cee3", |
00000878 => x"fac02503", |
00000879 => x"00008067", |
00000880 => x"f8400713", |
00000881 => x"00072683", |
00000882 => x"00100793", |
00000883 => x"00a797b3", |
00000884 => x"00d7c7b3", |
00000885 => x"00f72023", |
00000886 => x"00008067", |
00000887 => x"f8a02223", |
00000888 => x"00008067", |
00000889 => x"69617641", |
00000890 => x"6c62616c", |
00000891 => x"4d432065", |
00000892 => x"0a3a7344", |
00000893 => x"203a6820", |
00000894 => x"706c6548", |
00000895 => x"3a72200a", |
00000896 => x"73655220", |
00000897 => x"74726174", |
00000898 => x"3a75200a", |
00000899 => x"6c705520", |
00000900 => x"0a64616f", |
00000901 => x"203a7320", |
00000902 => x"726f7453", |
00000903 => x"6f742065", |
00000904 => x"616c6620", |
00000905 => x"200a6873", |
00000906 => x"4c203a6c", |
00000907 => x"2064616f", |
00000908 => x"6d6f7266", |
00000909 => x"616c6620", |
00000910 => x"200a6873", |
00000911 => x"45203a65", |
00000912 => x"75636578", |
00000913 => x"00006574", |
00000914 => x"65206f4e", |
00000915 => x"75636578", |
00000916 => x"6c626174", |
00000917 => x"76612065", |
00000918 => x"616c6961", |
00000919 => x"2e656c62", |
00000920 => x"00000000", |
00000921 => x"746f6f42", |
00000922 => x"2e676e69", |
00000923 => x"0a0a2e2e", |
00000924 => x"00000000", |
00000925 => x"52450a07", |
00000926 => x"5f524f52", |
00000927 => x"00000000", |
00000928 => x"00007830", |
00000929 => x"58450a0a", |
00000930 => x"54504543", |
00000931 => x"204e4f49", |
00000932 => x"7561636d", |
00000933 => x"003d6573", |
00000934 => x"70204020", |
00000935 => x"00003d63", |
00000936 => x"69617741", |
00000937 => x"676e6974", |
00000938 => x"6f656e20", |
00000939 => x"32337672", |
00000940 => x"6578655f", |
00000941 => x"6e69622e", |
00000942 => x"202e2e2e", |
00000943 => x"00000000", |
00000944 => x"64616f4c", |
00000945 => x"2e676e69", |
00000946 => x"00202e2e", |
00000947 => x"00004b4f", |
00000948 => x"0000000a", |
00000949 => x"74697257", |
00000950 => x"78302065", |
00000951 => x"00000000", |
00000952 => x"74796220", |
00000953 => x"74207365", |
00000954 => x"5053206f", |
00000955 => x"6c662049", |
00000956 => x"20687361", |
00000957 => x"78302040", |
00000958 => x"00000000", |
00000959 => x"7928203f", |
00000960 => x"20296e2f", |
00000961 => x"00000000", |
00000962 => x"616c460a", |
00000963 => x"6e696873", |
00000964 => x"2e2e2e67", |
00000965 => x"00000020", |
00000966 => x"0a0a0a0a", |
00000967 => x"4e203c3c", |
00000968 => x"56524f45", |
00000969 => x"42203233", |
00000970 => x"6c746f6f", |
00000971 => x"6564616f", |
00000972 => x"3e3e2072", |
00000973 => x"4c420a0a", |
00000974 => x"203a5644", |
00000975 => x"2079614d", |
00000976 => x"32203232", |
00000977 => x"0a313230", |
00000978 => x"3a565748", |
00000979 => x"00002020", |
00000980 => x"4b4c430a", |
00000981 => x"0020203a", |
00000982 => x"4553550a", |
00000983 => x"00203a52", |
00000984 => x"53494d0a", |
00000985 => x"00203a41", |
00000986 => x"58455a0a", |
00000987 => x"00203a54", |
00000988 => x"4f52500a", |
00000989 => x"00203a43", |
00000990 => x"454d490a", |
00000991 => x"00203a4d", |
00000992 => x"74796220", |
00000993 => x"40207365", |
00000994 => x"00000020", |
00000995 => x"454d440a", |
00000996 => x"00203a4d", |
00000997 => x"75410a0a", |
00000998 => x"6f626f74", |
00000999 => x"6920746f", |
00001000 => x"3828206e", |
00001001 => x"202e7329", |
00001002 => x"73657250", |
00001003 => x"656b2073", |
00001004 => x"6f742079", |
00001005 => x"6f626120", |
00001006 => x"0a2e7472", |
00001007 => x"00000000", |
00001008 => x"726f6241", |
00001009 => x"2e646574", |
00001010 => x"00000a0a", |
00001011 => x"444d430a", |
00001012 => x"00203e3a", |
00001013 => x"61766e49", |
00001014 => x"2064696c", |
00001015 => x"00444d43", |
00001016 => x"33323130", |
00001017 => x"37363534", |
00001018 => x"62613938", |
00001019 => x"66656463", |
00000609 => x"00000413", |
00000610 => x"00400913", |
00000611 => x"00c10793", |
00000612 => x"008787b3", |
00000613 => x"0007c583", |
00000614 => x"00848533", |
00000615 => x"00140413", |
00000616 => x"f71ff0ef", |
00000617 => x"ff2414e3", |
00000618 => x"01c12083", |
00000619 => x"01812403", |
00000620 => x"01412483", |
00000621 => x"01012903", |
00000622 => x"02010113", |
00000623 => x"00008067", |
00000624 => x"ff010113", |
00000625 => x"00112623", |
00000626 => x"00812423", |
00000627 => x"00050413", |
00000628 => x"c91ff0ef", |
00000629 => x"00000513", |
00000630 => x"38c000ef", |
00000631 => x"0d800513", |
00000632 => x"3c8000ef", |
00000633 => x"00040513", |
00000634 => x"ca1ff0ef", |
00000635 => x"00000513", |
00000636 => x"394000ef", |
00000637 => x"00812403", |
00000638 => x"00c12083", |
00000639 => x"01010113", |
00000640 => x"c19ff06f", |
00000641 => x"fe010113", |
00000642 => x"800007b7", |
00000643 => x"00812c23", |
00000644 => x"0007a403", |
00000645 => x"00112e23", |
00000646 => x"00912a23", |
00000647 => x"01212823", |
00000648 => x"01312623", |
00000649 => x"01412423", |
00000650 => x"01512223", |
00000651 => x"02041863", |
00000652 => x"ffff1537", |
00000653 => x"e4450513", |
00000654 => x"01812403", |
00000655 => x"01c12083", |
00000656 => x"01412483", |
00000657 => x"01012903", |
00000658 => x"00c12983", |
00000659 => x"00812a03", |
00000660 => x"00412a83", |
00000661 => x"02010113", |
00000662 => x"2c40006f", |
00000663 => x"ffff1537", |
00000664 => x"ed050513", |
00000665 => x"2b8000ef", |
00000666 => x"00040513", |
00000667 => x"9edff0ef", |
00000668 => x"ffff1537", |
00000669 => x"edc50513", |
00000670 => x"2a4000ef", |
00000671 => x"00800537", |
00000672 => x"9d9ff0ef", |
00000673 => x"ffff1537", |
00000674 => x"ef850513", |
00000675 => x"290000ef", |
00000676 => x"220000ef", |
00000677 => x"00050493", |
00000678 => x"1f4000ef", |
00000679 => x"07900793", |
00000680 => x"0af49e63", |
00000681 => x"b31ff0ef", |
00000682 => x"00051663", |
00000683 => x"00300513", |
00000684 => x"969ff0ef", |
00000685 => x"ffff1537", |
00000686 => x"f0450513", |
00000687 => x"01045493", |
00000688 => x"25c000ef", |
00000689 => x"00148493", |
00000690 => x"00800937", |
00000691 => x"fff00993", |
00000692 => x"00010a37", |
00000693 => x"fff48493", |
00000694 => x"07349063", |
00000695 => x"4788d5b7", |
00000696 => x"afe58593", |
00000697 => x"00800537", |
00000698 => x"e81ff0ef", |
00000699 => x"00800537", |
00000700 => x"00040593", |
00000701 => x"00450513", |
00000702 => x"e71ff0ef", |
00000703 => x"ff002a03", |
00000704 => x"008009b7", |
00000705 => x"ffc47413", |
00000706 => x"00000493", |
00000707 => x"00000913", |
00000708 => x"00c98a93", |
00000709 => x"01548533", |
00000710 => x"009a07b3", |
00000711 => x"02849663", |
00000712 => x"00898513", |
00000713 => x"412005b3", |
00000714 => x"e41ff0ef", |
00000715 => x"ffff1537", |
00000716 => x"ec850513", |
00000717 => x"f05ff06f", |
00000718 => x"00090513", |
00000719 => x"e85ff0ef", |
00000720 => x"01490933", |
00000721 => x"f91ff06f", |
00000722 => x"0007a583", |
00000723 => x"00448493", |
00000724 => x"00b90933", |
00000725 => x"e15ff0ef", |
00000726 => x"fbdff06f", |
00000727 => x"01c12083", |
00000728 => x"01812403", |
00000729 => x"01412483", |
00000730 => x"01012903", |
00000731 => x"00c12983", |
00000732 => x"00812a03", |
00000733 => x"00412a83", |
00000734 => x"02010113", |
00000735 => x"00008067", |
00000736 => x"ff010113", |
00000737 => x"f9402783", |
00000738 => x"f9002703", |
00000739 => x"f9402683", |
00000740 => x"fed79ae3", |
00000741 => x"00e12023", |
00000742 => x"00f12223", |
00000743 => x"00012503", |
00000744 => x"00412583", |
00000745 => x"01010113", |
00000746 => x"00008067", |
00000747 => x"ff010113", |
00000748 => x"00a12023", |
00000749 => x"00b12223", |
00000750 => x"f9800793", |
00000751 => x"fff00713", |
00000752 => x"00e7a023", |
00000753 => x"00412703", |
00000754 => x"f8e02e23", |
00000755 => x"00012703", |
00000756 => x"00e7a023", |
00000757 => x"01010113", |
00000758 => x"00008067", |
00000759 => x"fa402503", |
00000760 => x"0ff57513", |
00000761 => x"00008067", |
00000762 => x"fa002023", |
00000763 => x"fe002703", |
00000764 => x"00151513", |
00000765 => x"00000793", |
00000766 => x"04a77463", |
00000767 => x"000016b7", |
00000768 => x"00000713", |
00000769 => x"ffe68693", |
00000770 => x"04f6e663", |
00000771 => x"00367613", |
00000772 => x"0035f593", |
00000773 => x"fff78793", |
00000774 => x"01461613", |
00000775 => x"00c7e7b3", |
00000776 => x"01659593", |
00000777 => x"01871713", |
00000778 => x"00b7e7b3", |
00000779 => x"00e7e7b3", |
00000780 => x"10000737", |
00000781 => x"00e7e7b3", |
00000782 => x"faf02023", |
00000783 => x"00008067", |
00000784 => x"00178793", |
00000785 => x"01079793", |
00000786 => x"40a70733", |
00000787 => x"0107d793", |
00000788 => x"fa9ff06f", |
00000789 => x"ffe70513", |
00000790 => x"0fd57513", |
00000791 => x"00051a63", |
00000792 => x"0037d793", |
00000793 => x"00170713", |
00000794 => x"0ff77713", |
00000795 => x"f9dff06f", |
00000796 => x"0017d793", |
00000797 => x"ff1ff06f", |
00000798 => x"f71ff06f", |
00000799 => x"fa002783", |
00000800 => x"fe07cee3", |
00000801 => x"faa02223", |
00000802 => x"00008067", |
00000803 => x"ff1ff06f", |
00000804 => x"fa002503", |
00000805 => x"01f55513", |
00000806 => x"00008067", |
00000807 => x"ff5ff06f", |
00000808 => x"fa402503", |
00000809 => x"fe055ee3", |
00000810 => x"0ff57513", |
00000811 => x"00008067", |
00000812 => x"ff1ff06f", |
00000813 => x"fa402503", |
00000814 => x"01f55513", |
00000815 => x"00008067", |
00000816 => x"ff5ff06f", |
00000817 => x"ff010113", |
00000818 => x"00812423", |
00000819 => x"01212023", |
00000820 => x"00112623", |
00000821 => x"00912223", |
00000822 => x"00050413", |
00000823 => x"00a00913", |
00000824 => x"00044483", |
00000825 => x"00140413", |
00000826 => x"00049e63", |
00000827 => x"00c12083", |
00000828 => x"00812403", |
00000829 => x"00412483", |
00000830 => x"00012903", |
00000831 => x"01010113", |
00000832 => x"00008067", |
00000833 => x"01249663", |
00000834 => x"00d00513", |
00000835 => x"f71ff0ef", |
00000836 => x"00048513", |
00000837 => x"f69ff0ef", |
00000838 => x"fc9ff06f", |
00000839 => x"fa9ff06f", |
00000840 => x"fe802503", |
00000841 => x"01355513", |
00000842 => x"00157513", |
00000843 => x"00008067", |
00000844 => x"00757513", |
00000845 => x"00367613", |
00000846 => x"0015f593", |
00000847 => x"00a51513", |
00000848 => x"00d61613", |
00000849 => x"00c56533", |
00000850 => x"00959593", |
00000851 => x"fa800793", |
00000852 => x"00b56533", |
00000853 => x"0007a023", |
00000854 => x"10056513", |
00000855 => x"00a7a023", |
00000856 => x"00008067", |
00000857 => x"fa800713", |
00000858 => x"00072683", |
00000859 => x"00757793", |
00000860 => x"00100513", |
00000861 => x"00f51533", |
00000862 => x"00d56533", |
00000863 => x"00a72023", |
00000864 => x"00008067", |
00000865 => x"fa800713", |
00000866 => x"00072683", |
00000867 => x"00757513", |
00000868 => x"00100793", |
00000869 => x"00a797b3", |
00000870 => x"fff7c793", |
00000871 => x"00d7f7b3", |
00000872 => x"00f72023", |
00000873 => x"00008067", |
00000874 => x"faa02623", |
00000875 => x"fa802783", |
00000876 => x"fe07cee3", |
00000877 => x"fac02503", |
00000878 => x"00008067", |
00000879 => x"f8400713", |
00000880 => x"00072683", |
00000881 => x"00100793", |
00000882 => x"00a797b3", |
00000883 => x"00d7c7b3", |
00000884 => x"00f72023", |
00000885 => x"00008067", |
00000886 => x"f8a02223", |
00000887 => x"00008067", |
00000888 => x"69617641", |
00000889 => x"6c62616c", |
00000890 => x"4d432065", |
00000891 => x"0a3a7344", |
00000892 => x"203a6820", |
00000893 => x"706c6548", |
00000894 => x"3a72200a", |
00000895 => x"73655220", |
00000896 => x"74726174", |
00000897 => x"3a75200a", |
00000898 => x"6c705520", |
00000899 => x"0a64616f", |
00000900 => x"203a7320", |
00000901 => x"726f7453", |
00000902 => x"6f742065", |
00000903 => x"616c6620", |
00000904 => x"200a6873", |
00000905 => x"4c203a6c", |
00000906 => x"2064616f", |
00000907 => x"6d6f7266", |
00000908 => x"616c6620", |
00000909 => x"200a6873", |
00000910 => x"45203a65", |
00000911 => x"75636578", |
00000912 => x"00006574", |
00000913 => x"65206f4e", |
00000914 => x"75636578", |
00000915 => x"6c626174", |
00000916 => x"76612065", |
00000917 => x"616c6961", |
00000918 => x"2e656c62", |
00000919 => x"00000000", |
00000920 => x"746f6f42", |
00000921 => x"2e676e69", |
00000922 => x"0a0a2e2e", |
00000923 => x"00000000", |
00000924 => x"52450a07", |
00000925 => x"5f524f52", |
00000926 => x"00000000", |
00000927 => x"00007830", |
00000928 => x"58450a0a", |
00000929 => x"54504543", |
00000930 => x"204e4f49", |
00000931 => x"7561636d", |
00000932 => x"003d6573", |
00000933 => x"70204020", |
00000934 => x"00003d63", |
00000935 => x"69617741", |
00000936 => x"676e6974", |
00000937 => x"6f656e20", |
00000938 => x"32337672", |
00000939 => x"6578655f", |
00000940 => x"6e69622e", |
00000941 => x"202e2e2e", |
00000942 => x"00000000", |
00000943 => x"64616f4c", |
00000944 => x"2e676e69", |
00000945 => x"00202e2e", |
00000946 => x"00004b4f", |
00000947 => x"0000000a", |
00000948 => x"74697257", |
00000949 => x"78302065", |
00000950 => x"00000000", |
00000951 => x"74796220", |
00000952 => x"74207365", |
00000953 => x"5053206f", |
00000954 => x"6c662049", |
00000955 => x"20687361", |
00000956 => x"78302040", |
00000957 => x"00000000", |
00000958 => x"7928203f", |
00000959 => x"20296e2f", |
00000960 => x"00000000", |
00000961 => x"616c460a", |
00000962 => x"6e696873", |
00000963 => x"2e2e2e67", |
00000964 => x"00000020", |
00000965 => x"0a0a0a0a", |
00000966 => x"4e203c3c", |
00000967 => x"56524f45", |
00000968 => x"42203233", |
00000969 => x"6c746f6f", |
00000970 => x"6564616f", |
00000971 => x"3e3e2072", |
00000972 => x"4c420a0a", |
00000973 => x"203a5644", |
00000974 => x"206e754a", |
00000975 => x"32203420", |
00000976 => x"0a313230", |
00000977 => x"3a565748", |
00000978 => x"00002020", |
00000979 => x"4b4c430a", |
00000980 => x"0020203a", |
00000981 => x"4553550a", |
00000982 => x"00203a52", |
00000983 => x"53494d0a", |
00000984 => x"00203a41", |
00000985 => x"58455a0a", |
00000986 => x"00203a54", |
00000987 => x"4f52500a", |
00000988 => x"00203a43", |
00000989 => x"454d490a", |
00000990 => x"00203a4d", |
00000991 => x"74796220", |
00000992 => x"40207365", |
00000993 => x"00000020", |
00000994 => x"454d440a", |
00000995 => x"00203a4d", |
00000996 => x"75410a0a", |
00000997 => x"6f626f74", |
00000998 => x"6920746f", |
00000999 => x"3828206e", |
00001000 => x"202e7329", |
00001001 => x"73657250", |
00001002 => x"656b2073", |
00001003 => x"6f742079", |
00001004 => x"6f626120", |
00001005 => x"0a2e7472", |
00001006 => x"00000000", |
00001007 => x"726f6241", |
00001008 => x"2e646574", |
00001009 => x"00000a0a", |
00001010 => x"444d430a", |
00001011 => x"00203e3a", |
00001012 => x"61766e49", |
00001013 => x"2064696c", |
00001014 => x"00444d43", |
00001015 => x"33323130", |
00001016 => x"37363534", |
00001017 => x"62613938", |
00001018 => x"66656463", |
others => x"00000000" |
); |
|
/neorv32_bus_keeper.vhd
129,7 → 129,7
else -- pending |
if (ack_i = '1') or (err_i = '1') then -- termination by bus system |
control.pending <= '0'; |
elsif (or_all_f(control.timeout) = '0') then -- timeout! terminate bus transfer |
elsif (or_reduce_f(control.timeout) = '0') then -- timeout! terminate bus transfer |
control.pending <= '0'; |
control.bus_err <= '1'; |
end if; |
/neorv32_cfs.vhd
124,7 → 124,7
-- Note that rstn_i can be asserted by an external reset and also by a watchdog-cause reset. |
-- |
-- Most default peripheral devices of the NEORV32 do NOT use a dedicated reset at all. Instead, these units are reset by writing ZERO |
-- to a specific "control register" located right at the beginning of the devices's address space (so this register is cleared at first). |
-- to a specific "control register" located right at the beginning of the device's address space (so this register is cleared at first). |
-- The crt0 start-up code write ZERO to every single address in the processor's IO space - including the CFS. |
-- Make sure that this clearing does not cause any unintended actions in the CFS. |
|
210,17 → 210,15
-- ack_o <= ... -- or define the ACK by yourself (example: some registers are read-only, some others can only be written, ...) |
|
-- write access -- |
for i in 0 to 3 loop |
if (wren = '1') then -- word-wide write-access only! |
case addr is -- make sure to use the internal 'addr' signal for the read/write interface |
when cfs_reg0_addr_c => cfs_reg_wr(0) <= data_i; -- for example: control register |
when cfs_reg1_addr_c => cfs_reg_wr(1) <= data_i; -- for example: data in/out fifo |
when cfs_reg2_addr_c => cfs_reg_wr(2) <= data_i; -- for example: command fifo |
when cfs_reg3_addr_c => cfs_reg_wr(3) <= data_i; -- for example: status register |
when others => NULL; |
end case; |
end if; |
end loop; -- i |
if (wren = '1') then -- word-wide write-access only! |
case addr is -- make sure to use the internal "addr" signal for the read/write interface |
when cfs_reg0_addr_c => cfs_reg_wr(0) <= data_i; -- for example: control register |
when cfs_reg1_addr_c => cfs_reg_wr(1) <= data_i; -- for example: data in/out fifo |
when cfs_reg2_addr_c => cfs_reg_wr(2) <= data_i; -- for example: command fifo |
when cfs_reg3_addr_c => cfs_reg_wr(3) <= data_i; -- for example: status register |
when others => NULL; |
end case; |
end if; |
|
-- read access -- |
data_o <= (others => '0'); -- the output has to be zero if there is no actual read access |
/neorv32_cpu.vhd
61,7 → 61,6
CPU_DEBUG_ADDR : std_ulogic_vector(31 downto 0) := x"00000000"; -- cpu debug mode start address |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension? |
CPU_EXTENSION_RISCV_B : boolean := false; -- implement bit manipulation extensions? |
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension? |
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension? |
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension? |
80,7 → 79,7
PMP_MIN_GRANULARITY : natural := 64*1024; -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes |
-- Hardware Performance Monitors (HPM) -- |
HPM_NUM_CNTS : natural := 0; -- number of implemented HPM counters (0..29) |
HPM_CNT_WIDTH : natural := 40 -- total size of HPM counters (1..64) |
HPM_CNT_WIDTH : natural := 40 -- total size of HPM counters (0..64) |
); |
port ( |
-- global control -- |
130,30 → 129,30
architecture neorv32_cpu_rtl of neorv32_cpu is |
|
-- local signals -- |
signal ctrl : std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus |
signal comparator : std_ulogic_vector(1 downto 0); -- comparator result |
signal imm : std_ulogic_vector(data_width_c-1 downto 0); -- immediate |
signal instr : std_ulogic_vector(data_width_c-1 downto 0); -- new instruction |
signal rs1, rs2 : std_ulogic_vector(data_width_c-1 downto 0); -- source registers |
signal alu_res : std_ulogic_vector(data_width_c-1 downto 0); -- alu result |
signal alu_add : std_ulogic_vector(data_width_c-1 downto 0); -- alu address result |
signal mem_rdata : std_ulogic_vector(data_width_c-1 downto 0); -- memory read data |
signal alu_wait : std_ulogic; -- alu is busy due to iterative unit |
signal bus_i_wait : std_ulogic; -- wait for current bus instruction fetch |
signal bus_d_wait : std_ulogic; -- wait for current bus data access |
signal csr_rdata : std_ulogic_vector(data_width_c-1 downto 0); -- csr read data |
signal mar : std_ulogic_vector(data_width_c-1 downto 0); -- current memory address register |
signal ma_instr : std_ulogic; -- misaligned instruction address |
signal ma_load : std_ulogic; -- misaligned load data address |
signal ma_store : std_ulogic; -- misaligned store data address |
signal excl_state : std_ulogic; -- atomic/exclusive access lock status |
signal be_instr : std_ulogic; -- bus error on instruction access |
signal be_load : std_ulogic; -- bus error on load data access |
signal be_store : std_ulogic; -- bus error on store data access |
signal fetch_pc : std_ulogic_vector(data_width_c-1 downto 0); -- pc for instruction fetch |
signal curr_pc : std_ulogic_vector(data_width_c-1 downto 0); -- current pc (for current executed instruction) |
signal fpu_rm : std_ulogic_vector(2 downto 0); -- FPU rounding mode |
signal fpu_flags : std_ulogic_vector(4 downto 0); -- FPU exception flags |
signal ctrl : std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus |
signal comparator : std_ulogic_vector(1 downto 0); -- comparator result |
signal imm : std_ulogic_vector(data_width_c-1 downto 0); -- immediate |
signal instr : std_ulogic_vector(data_width_c-1 downto 0); -- new instruction |
signal rs1, rs2 : std_ulogic_vector(data_width_c-1 downto 0); -- source registers |
signal alu_res : std_ulogic_vector(data_width_c-1 downto 0); -- alu result |
signal alu_add : std_ulogic_vector(data_width_c-1 downto 0); -- alu address result |
signal mem_rdata : std_ulogic_vector(data_width_c-1 downto 0); -- memory read data |
signal alu_wait : std_ulogic; -- alu is busy due to iterative unit |
signal bus_i_wait : std_ulogic; -- wait for current bus instruction fetch |
signal bus_d_wait : std_ulogic; -- wait for current bus data access |
signal csr_rdata : std_ulogic_vector(data_width_c-1 downto 0); -- csr read data |
signal mar : std_ulogic_vector(data_width_c-1 downto 0); -- current memory address register |
signal ma_instr : std_ulogic; -- misaligned instruction address |
signal ma_load : std_ulogic; -- misaligned load data address |
signal ma_store : std_ulogic; -- misaligned store data address |
signal excl_state : std_ulogic; -- atomic/exclusive access lock status |
signal be_instr : std_ulogic; -- bus error on instruction access |
signal be_load : std_ulogic; -- bus error on load data access |
signal be_store : std_ulogic; -- bus error on store data access |
signal fetch_pc : std_ulogic_vector(data_width_c-1 downto 0); -- pc for instruction fetch |
signal curr_pc : std_ulogic_vector(data_width_c-1 downto 0); -- current pc (for current executed instruction) |
signal fpu_rm : std_ulogic_vector(2 downto 0); -- FPU rounding mode |
signal fpu_flags : std_ulogic_vector(4 downto 0); -- FPU exception flags |
|
-- co-processor interface -- |
signal cp_start : std_ulogic_vector(7 downto 0); -- trigger co-processor i |
186,12 → 185,6
-- Instruction prefetch buffer size -- |
assert not (is_power_of_two_f(ipb_entries_c) = false) report "NEORV32 CPU CONFIG ERROR! Number of entries in instruction prefetch buffer <ipb_entries_c> has to be a power of two." severity error; |
|
-- A extension - only lr.w and sc.w are supported -- |
assert not (CPU_EXTENSION_RISCV_A = true) report "NEORV32 CPU CONFIG NOTE. Atomic operations extension (A) only supports <lr.w> and <sc.w> instructions." severity note; |
|
-- FIXME: Bit manipulation warning -- |
assert not (CPU_EXTENSION_RISCV_B = true) report "NEORV32 CPU CONFIG WARNING! Bit manipulation extension (B) is still EXPERIMENTAL (and spec. is not ratified yet)." severity warning; |
|
-- Co-processor timeout counter (for debugging only) -- |
assert not (cp_timeout_en_c = true) report "NEORV32 CPU CONFIG WARNING! Co-processor timeout counter enabled. This should be used for debugging/simulation only." severity warning; |
|
207,7 → 200,7
|
-- HPM counters check -- |
assert not (HPM_NUM_CNTS > 29) report "NEORV32 CPU CONFIG ERROR! Number of HPM counters <HPM_NUM_CNTS> out of valid range (0..29)." severity error; |
assert not ((HPM_CNT_WIDTH < 1) or (HPM_CNT_WIDTH > 64)) report "NEORV32 CPU CONFIG ERROR! HPM counter width <HPM_CNT_WIDTH> has to be 1..64 bit." severity error; |
assert not ((HPM_CNT_WIDTH < 0) or (HPM_CNT_WIDTH > 64)) report "NEORV32 CPU CONFIG ERROR! HPM counter width <HPM_CNT_WIDTH> has to be 0..64 bit." severity error; |
-- HPM counters notifier -- |
assert not (HPM_NUM_CNTS > 0) report "NEORV32 CPU CONFIG NOTE: Implementing " & integer'image(HPM_NUM_CNTS) & " HPM counters (each " & integer'image(HPM_CNT_WIDTH) & "-bit wide)." severity note; |
-- HPM CNT requires Zicsr extension -- |
216,8 → 209,6
-- Debug mode -- |
assert not (CPU_EXTENSION_RISCV_DEBUG = true) report "NEORV32 CPU CONFIG NOTE: Implementing RISC-V DEBUG MODE extension." severity note; |
assert not ((CPU_EXTENSION_RISCV_DEBUG = true) and (CPU_EXTENSION_RISCV_Zicsr = false)) report "NEORV32 CPU CONFIG ERROR! Debug mode requires <CPU_EXTENSION_RISCV_Zicsr> extension to be enabled." severity error; |
-- FIXME: debug mode extension warning -- |
assert not (CPU_EXTENSION_RISCV_DEBUG = true) report "NEORV32 CPU CONFIG WARNING! RISC-V DEBUG MODE extension <CPU_EXTENSION_RISCV_DEBUG> is still EXPERIMENTAL." severity warning; |
|
|
-- Control Unit --------------------------------------------------------------------------- |
230,7 → 221,6
CPU_DEBUG_ADDR => CPU_DEBUG_ADDR, -- cpu debug mode start address |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_A => CPU_EXTENSION_RISCV_A, -- implement atomic extension? |
CPU_EXTENSION_RISCV_B => CPU_EXTENSION_RISCV_B, -- implement bit manipulation extensions? |
CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension? |
CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, -- implement muld/div extension? |
CPU_EXTENSION_RISCV_U => CPU_EXTENSION_RISCV_U, -- implement user mode extension? |
388,34 → 378,12
end generate; |
|
|
-- Co-Processor 2: Bit Manipulation ('B' Extension) --------------------------------------- |
-- Co-Processor 2: reseverd --------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
neorv32_cpu_cp_bitmanip_inst_true: |
if (CPU_EXTENSION_RISCV_B = true) generate |
neorv32_cpu_cp_bitmanip_inst: neorv32_cpu_cp_bitmanip |
port map ( |
-- global control -- |
clk_i => clk_i, -- global clock, rising edge |
rstn_i => rstn_i, -- global reset, low-active, async |
ctrl_i => ctrl, -- main control bus |
start_i => cp_start(2), -- trigger operation |
-- data input -- |
cmp_i => comparator, -- comparator status |
rs1_i => rs1, -- rf source 1 |
rs2_i => rs2, -- rf source 2 |
-- result and status -- |
res_o => cp_result(2), -- operation result |
valid_o => cp_valid(2) -- data output valid |
); |
end generate; |
cp_result(2) <= (others => '0'); |
cp_valid(2) <= cp_start(2); -- to make sure CPU does not get stalled if there is an accidental access |
|
neorv32_cpu_cp_bitmanip_inst_false: |
if (CPU_EXTENSION_RISCV_B = false) generate |
cp_result(2) <= (others => '0'); |
cp_valid(2) <= cp_start(2); -- to make sure CPU does not get stalled if there is an accidental access |
end generate; |
|
|
-- Co-Processor 3: Single-Precision Floating-Point Unit ('Zfinx' Extension) --------------- |
-- ------------------------------------------------------------------------------------------- |
neorv32_cpu_cp_fpu_inst_true: |
/neorv32_cpu_alu.vhd
178,7 → 178,7
elsif (shifter.run = '1') then -- running shift |
-- coarse shift: multiples of 4 -- |
if (TINY_SHIFT_EN = false) and -- use coarse shifts first if TINY SHIFT option is NOT enabled |
(or_all_f(shifter.cnt(shifter.cnt'left downto 2)) = '1') then -- shift amount >= 4 |
(or_reduce_f(shifter.cnt(shifter.cnt'left downto 2)) = '1') then -- shift amount >= 4 |
shifter.cnt <= std_ulogic_vector(unsigned(shifter.cnt) - 4); |
if (ctrl_i(ctrl_alu_shift_dir_c) = '0') then -- SLL: shift left logical |
shifter.sreg <= shifter.sreg(shifter.sreg'left-4 downto 0) & "0000"; |
266,8 → 266,8
shifter.start <= '1' when (shifter.cmd = '1') and (shifter.cmd_ff = '0') else '0'; |
|
-- shift operation running? -- |
shifter.run <= '1' when (or_all_f(shifter.cnt) = '1') or (shifter.start = '1') else '0'; |
shifter.halt <= '1' when (or_all_f(shifter.cnt(shifter.cnt'left downto 1)) = '1') or (shifter.start = '1') else '0'; |
shifter.run <= '1' when (or_reduce_f(shifter.cnt) = '1') or (shifter.start = '1') else '0'; |
shifter.halt <= '1' when (or_reduce_f(shifter.cnt(shifter.cnt'left downto 1)) = '1') or (shifter.start = '1') else '0'; |
|
|
-- Co-Processor Arbiter ------------------------------------------------------------------- |
283,7 → 283,7
cp_ctrl.timeout <= (others => '0'); |
elsif rising_edge(clk_i) then |
cp_ctrl.cmd_ff <= cp_ctrl.cmd; |
if (or_all_f(cp_valid_i) = '1') then -- cp computation done? |
if (or_reduce_f(cp_valid_i) = '1') then -- cp computation done? |
cp_ctrl.busy <= '0'; |
elsif (cp_ctrl.timeout(cp_ctrl.timeout'left) = '1') and (cp_timeout_en_c = true) then -- timeout |
assert false report "NEORV32 CPU CO-PROCESSOR TIMEOUT ERROR!" severity warning; |
317,7 → 317,7
end process; |
|
-- co-processor operation (still) running? -- |
cp_ctrl.halt <= (cp_ctrl.busy and (not or_all_f(cp_valid_i))) or cp_ctrl.start; |
cp_ctrl.halt <= (cp_ctrl.busy and (not or_reduce_f(cp_valid_i))) or cp_ctrl.start; |
|
-- co-processor result - only the *actually selected* co-processor may output data != 0 -- |
cp_res <= cp_result_i(0) or cp_result_i(1) or cp_result_i(2) or cp_result_i(3) or |
/neorv32_cpu_bus.vhd
498,9 → 498,9
|
|
-- final PMP access fault signals -- |
if_pmp_fault <= or_all_f(pmp.if_fault) when (PMP_NUM_REGIONS > 0) else '0'; |
ld_pmp_fault <= or_all_f(pmp.ld_fault) when (PMP_NUM_REGIONS > 0) else '0'; |
st_pmp_fault <= or_all_f(pmp.st_fault) when (PMP_NUM_REGIONS > 0) else '0'; |
if_pmp_fault <= or_reduce_f(pmp.if_fault) when (PMP_NUM_REGIONS > 0) else '0'; |
ld_pmp_fault <= or_reduce_f(pmp.ld_fault) when (PMP_NUM_REGIONS > 0) else '0'; |
st_pmp_fault <= or_reduce_f(pmp.st_fault) when (PMP_NUM_REGIONS > 0) else '0'; |
|
|
end neorv32_cpu_bus_rtl; |
/neorv32_cpu_control.vhd
53,7 → 53,6
CPU_DEBUG_ADDR : std_ulogic_vector(31 downto 0) := x"00000000"; -- cpu debug mode start address |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension? |
CPU_EXTENSION_RISCV_B : boolean := false; -- implement bit manipulation extensions? |
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension? |
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension? |
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension? |
69,7 → 68,7
PMP_MIN_GRANULARITY : natural := 64*1024; -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes |
-- Hardware Performance Monitors (HPM) -- |
HPM_NUM_CNTS : natural := 0; -- number of implemented HPM counters (0..29) |
HPM_CNT_WIDTH : natural := 40 -- total size of HPM counters (1..64) |
HPM_CNT_WIDTH : natural := 40 -- total size of HPM counters (0..64) |
); |
port ( |
-- global control -- |
194,14 → 193,12
|
-- instruction decoding helper logic -- |
type decode_aux_t is record |
alu_immediate : std_ulogic; |
rs1_is_r0 : std_ulogic; |
is_atomic_lr : std_ulogic; |
is_atomic_sc : std_ulogic; |
is_bitmanip_imm : std_ulogic; |
is_bitmanip_reg : std_ulogic; |
is_float_op : std_ulogic; |
sys_env_cmd : std_ulogic_vector(11 downto 0); |
alu_immediate : std_ulogic; |
rs1_is_r0 : std_ulogic; |
is_atomic_lr : std_ulogic; |
is_atomic_sc : std_ulogic; |
is_float_op : std_ulogic; |
sys_env_cmd : std_ulogic_vector(11 downto 0); |
end record; |
signal decode_aux : decode_aux_t; |
|
320,11 → 317,14
mscratch : std_ulogic_vector(data_width_c-1 downto 0); -- mscratch: scratch register (R/W) |
-- |
mcycle : std_ulogic_vector(32 downto 0); -- mcycle (R/W), plus carry bit |
mcycle_msb : std_ulogic; -- counter low-to-high-word overflow |
mcycleh : std_ulogic_vector(31 downto 0); -- mcycleh (R/W) |
minstret : std_ulogic_vector(32 downto 0); -- minstret (R/W), plus carry bit |
mcycleh : std_ulogic_vector(31 downto 0); -- mcycleh (R/W) |
minstret_msb : std_ulogic; -- counter low-to-high-word overflow |
minstreth : std_ulogic_vector(31 downto 0); -- minstreth (R/W) |
-- |
mhpmcounter : mhpmcnt_t; -- mhpmcounter* (R/W), plus carry bit |
mhpmcounter_msb : std_ulogic_vector(HPM_NUM_CNTS-1 downto 0); -- counter low-to-high-word overflow |
mhpmcounterh : mhpmcnth_t; -- mhpmcounter*h (R/W) |
mhpmcounter_rd : mhpmcnt_rd_t; -- mhpmcounter* (R/W): actual read data |
mhpmcounterh_rd : mhpmcnth_rd_t; -- mhpmcounter*h (R/W): actual read data |
339,7 → 339,6
dcsr_ebreakm : std_ulogic; -- dcsr.ebreakm (R/W): behavior of ebreak instruction on m-mode |
dcsr_ebreaku : std_ulogic; -- dcsr.ebreaku (R/W): behavior of ebreak instruction on u-mode |
dcsr_step : std_ulogic; -- dcsr.step (R/W): single-step mode |
dcsr_stepie : std_ulogic; -- dcsr.stepie (R/W): enable IRQs in single-step mode |
dcsr_prv : std_ulogic_vector(01 downto 0); -- dcsr.prv (R/W): current privilege level when entering debug mode |
dcsr_cause : std_ulogic_vector(02 downto 0); -- dcsr.cause (R/-): why was debug mode entered |
dcsr_rd : std_ulogic_vector(data_width_c-1 downto 0); -- dcsr (R/(W)): debug mode control and status register |
366,11 → 365,6
end record; |
signal debug_ctrl : debug_ctrl_t; |
|
-- counter low-to-high-word carry -- |
signal mcycle_msb : std_ulogic; |
signal minstret_msb : std_ulogic; |
signal mhpmcounter_msb : std_ulogic_vector(HPM_NUM_CNTS-1 downto 0); |
|
-- (hpm) counter events -- |
signal cnt_event, cnt_event_nxt : std_ulogic_vector(hpmcnt_event_size_c-1 downto 0); |
signal hpmcnt_trigger : std_ulogic_vector(HPM_NUM_CNTS-1 downto 0); |
802,7 → 796,7
|
-- CPU Control Bus Output ----------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
ctrl_output: process(ctrl, fetch_engine, trap_ctrl, bus_fast_ir, execute_engine, csr) |
ctrl_output: process(ctrl, fetch_engine, trap_ctrl, bus_fast_ir, execute_engine, csr, debug_ctrl) |
begin |
-- signals from execute engine -- |
ctrl_o <= ctrl; |
828,8 → 822,8
ctrl_o(ctrl_ir_funct12_11_c downto ctrl_ir_funct12_0_c) <= execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c); |
ctrl_o(ctrl_ir_funct3_2_c downto ctrl_ir_funct3_0_c) <= execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c); |
-- cpu status -- |
ctrl_o(ctrl_sleep_c) <= execute_engine.sleep; -- cpu is in sleep mode |
ctrl_o(ctrl_trap_c) <= trap_ctrl.env_start_ack; -- cpu is starting a trap handler |
ctrl_o(ctrl_sleep_c) <= execute_engine.sleep; -- cpu is in sleep mode |
ctrl_o(ctrl_trap_c) <= trap_ctrl.env_start_ack; -- cpu is starting a trap handler |
if (CPU_EXTENSION_RISCV_DEBUG = true) then |
ctrl_o(ctrl_debug_running_c) <= debug_ctrl.running; -- cpu is currently in debug mode |
else |
844,19 → 838,17
variable sys_env_cmd_mask_v : std_ulogic_vector(11 downto 0); |
begin |
-- defaults -- |
decode_aux.alu_immediate <= '0'; |
decode_aux.rs1_is_r0 <= '0'; |
decode_aux.is_atomic_lr <= '0'; |
decode_aux.is_atomic_sc <= '0'; |
decode_aux.is_bitmanip_imm <= '0'; |
decode_aux.is_bitmanip_reg <= '0'; |
decode_aux.is_float_op <= '0'; |
decode_aux.alu_immediate <= '0'; |
decode_aux.rs1_is_r0 <= '0'; |
decode_aux.is_atomic_lr <= '0'; |
decode_aux.is_atomic_sc <= '0'; |
decode_aux.is_float_op <= '0'; |
|
-- is immediate ALU operation? -- |
decode_aux.alu_immediate <= not execute_engine.i_reg(instr_opcode_msb_c-1); |
|
-- is rs1 == r0? -- |
decode_aux.rs1_is_r0 <= not or_all_f(execute_engine.i_reg(instr_rs1_msb_c downto instr_rs1_lsb_c)); |
decode_aux.rs1_is_r0 <= not or_reduce_f(execute_engine.i_reg(instr_rs1_msb_c downto instr_rs1_lsb_c)); |
|
-- is atomic load-reservate/store-conditional? -- |
if (CPU_EXTENSION_RISCV_A = true) and (execute_engine.i_reg(instr_opcode_lsb_c+3 downto instr_opcode_lsb_c+2) = "11") then -- valid atomic sub-opcode |
864,53 → 856,6
decode_aux.is_atomic_sc <= execute_engine.i_reg(instr_funct5_lsb_c); |
end if; |
|
-- is BITMANIP instruction? -- |
-- pretty complex as we have to extract this from the ALU/ALUI instruction space -- |
-- immediate operation -- |
if ((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0110000") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "001") and |
( |
(execute_engine.i_reg(instr_funct12_lsb_c+4 downto instr_funct12_lsb_c) = "00000") or -- CLZ |
(execute_engine.i_reg(instr_funct12_lsb_c+4 downto instr_funct12_lsb_c) = "00001") or -- CTZ |
(execute_engine.i_reg(instr_funct12_lsb_c+4 downto instr_funct12_lsb_c) = "00010") or -- PCNT |
(execute_engine.i_reg(instr_funct12_lsb_c+4 downto instr_funct12_lsb_c) = "00100") or -- SEXT.B |
(execute_engine.i_reg(instr_funct12_lsb_c+4 downto instr_funct12_lsb_c) = "00101") -- SEXT.H |
) |
) or |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c+2) = "01001") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "001")) or -- SBCLRI |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c+2) = "00101") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "001")) or -- SBSETI |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c+2) = "01101") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "001")) or -- SBINVI |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c+2) = "01001") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "101")) or -- SBEXTI |
-- |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c+2) = "01100") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "101")) or -- RORI |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c+2) = "00101") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "101") and (execute_engine.i_reg(instr_imm12_lsb_c+6 downto instr_imm12_lsb_c) = "0000111")) or -- GORCI.b 7 (orc.b) |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c+2) = "01101") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "101") and (execute_engine.i_reg(instr_imm12_lsb_c+6 downto instr_imm12_lsb_c) = "0011000")) then -- GREVI.-8 (rev8) |
decode_aux.is_bitmanip_imm <= '1'; |
end if; |
-- register operation -- |
if ((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0110000") and (execute_engine.i_reg(instr_funct3_msb_c-1 downto instr_funct3_lsb_c) = "01")) or -- ROR / ROL |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0000101") and (execute_engine.i_reg(instr_funct3_msb_c) = '1')) or -- MIN[U] / MAX[U] |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0000100") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "100")) or -- PACK |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0100000") and |
( |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "111") or -- ANDN |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "110") or -- ORN |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "100") -- XORN |
) |
) or |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0010000") and |
( |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "010") or -- SH1ADD |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "100") or -- SH2ADD |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "110") -- SH3ADD |
) |
) or |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0100100") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "001")) or -- SBCLR |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0010100") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "001")) or -- SBSET |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0110100") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "001")) or -- SBINV |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) = "0100100") and (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = "101")) then -- SBSEXT |
decode_aux.is_bitmanip_reg <= '1'; |
end if; |
|
-- floating-point operations (Zfinx) -- |
if ((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c+3) = "0000")) or -- FADD.S / FSUB.S |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c+2) = "00010")) or -- FMUL.S |
925,7 → 870,7
|
-- system/environment instructions -- |
sys_env_cmd_mask_v := funct12_ecall_c or funct12_ebreak_c or funct12_mret_c or funct12_wfi_c or funct12_dret_c; -- sum-up set bits |
decode_aux.sys_env_cmd(11 downto 0) <= execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) and sys_env_cmd_mask_v; -- set unsued bits to always-zero |
decode_aux.sys_env_cmd <= execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) and sys_env_cmd_mask_v; -- set unused bits to always-zero |
end process decode_helper; |
|
|
1041,9 → 986,9
trap_ctrl.env_end <= '1'; |
execute_engine.state_nxt <= TRAP_EXECUTE; |
|
when TRAP_EXECUTE => -- Start trap environment - jump to TVEC / return from trap environment - jump to EPC |
when TRAP_EXECUTE => -- Start trap environment -> jump to TVEC / return from trap environment -> jump to EPC |
-- ------------------------------------------------------------ |
execute_engine.pc_mux_sel <= '0'; -- next PC (csr.mtvec) |
execute_engine.pc_mux_sel <= '0'; -- next_PC |
fetch_engine.reset <= '1'; |
execute_engine.pc_we <= '1'; |
execute_engine.sleep_nxt <= '0'; -- disable sleep mode |
1050,18 → 995,18
execute_engine.state_nxt <= SYS_WAIT; |
|
|
when EXECUTE => -- Decode and execute instruction (control has to be here for excatly 1 cyle in any case!) |
when EXECUTE => -- Decode and execute instruction (control has to be here for exactly 1 cycle in any case!) |
-- ------------------------------------------------------------ |
opcode_v := execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c+2) & "11"; -- save some bits here, LSBs are always 11 for rv32 |
case opcode_v is |
|
when opcode_alu_c | opcode_alui_c => -- (immediate) ALU operation |
when opcode_alu_c | opcode_alui_c => -- (register/immediate) ALU operation |
-- ------------------------------------------------------------ |
ctrl_nxt(ctrl_alu_opa_mux_c) <= '0'; -- use RS1 as ALU.OPA |
ctrl_nxt(ctrl_alu_opb_mux_c) <= decode_aux.alu_immediate; -- use IMM as ALU.OPB for immediate operations |
ctrl_nxt(ctrl_rf_in_mux_c) <= '0'; -- RF input = ALU result |
|
-- ALU arithmetic operation type and ADD/SUB -- |
-- ALU arithmetic operation type -- |
if (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_slt_c) or |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sltu_c) then |
ctrl_nxt(ctrl_alu_arith_c) <= alu_arith_cmd_slt_c; |
1090,13 → 1035,6
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_muldiv_c; -- use MULDIV CP |
execute_engine.is_cp_op_nxt <= '1'; -- this is a CP operation |
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_copro_c; |
-- co-processor bit manipulation operation? -- |
elsif (CPU_EXTENSION_RISCV_B = true) and |
(((execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alu_c(5)) and (decode_aux.is_bitmanip_reg = '1')) or -- register operation |
((execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alui_c(5)) and (decode_aux.is_bitmanip_imm = '1'))) then -- immediate operation |
ctrl_nxt(ctrl_cp_id_msb_c downto ctrl_cp_id_lsb_c) <= cp_sel_bitmanip_c; -- use BITMANIP CP |
execute_engine.is_cp_op_nxt <= '1'; -- this is a CP operation |
ctrl_nxt(ctrl_alu_func1_c downto ctrl_alu_func0_c) <= alu_func_cmd_copro_c; |
-- ALU operation, function select -- |
else |
execute_engine.is_cp_op_nxt <= '0'; -- no CP operation |
1110,10 → 1048,7
-- multi cycle ALU operation? -- |
if (execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sll_c) or -- SLL shift operation? |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sr_c) or -- SR shift operation? |
((CPU_EXTENSION_RISCV_M = true) and (execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alu_c(5)) and (execute_engine.i_reg(instr_funct7_lsb_c) = '1')) or -- MULDIV CP op? |
((CPU_EXTENSION_RISCV_B = true) and ( |
((execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alu_c(5)) and (decode_aux.is_bitmanip_reg = '1')) or -- BITMANIP CP register operation? |
((execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alui_c(5)) and (decode_aux.is_bitmanip_imm = '1'))) ) then -- BITMANIP CP immediate operation? |
((CPU_EXTENSION_RISCV_M = true) and (execute_engine.i_reg(instr_opcode_lsb_c+5) = opcode_alu_c(5)) and (execute_engine.i_reg(instr_funct7_lsb_c) = '1')) then -- MULDIV CP op? |
execute_engine.state_nxt <= ALU_WAIT; |
else -- single cycle ALU operation |
ctrl_nxt(ctrl_rf_wb_en_c) <= '1'; -- valid RF write-back |
1208,7 → 1143,7
when funct12_ecall_c => trap_ctrl.env_call <= '1'; -- ECALL |
when funct12_ebreak_c => trap_ctrl.break_point <= '1'; -- EBREAK |
when funct12_mret_c => execute_engine.state_nxt <= TRAP_EXIT; -- MRET |
when funct12_wfi_c => |
when funct12_wfi_c => -- WFI |
if (CPU_EXTENSION_RISCV_DEBUG = true) and (debug_ctrl.running = '1') then |
NULL; -- just a NOP when in debug mode |
else |
1221,7 → 1156,7
else |
NULL; |
end if; |
when others => NULL;-- undefined |
when others => NULL; -- undefined |
end case; |
|
|
1366,7 → 1301,7
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_csrrwi_c) then |
csr_wacc_v := '1'; -- always write CSR |
else -- clear/set |
csr_wacc_v := or_all_f(execute_engine.i_reg(instr_rs1_msb_c downto instr_rs1_lsb_c)); -- write allowed if rs1/uimm5 != 0 |
csr_wacc_v := or_reduce_f(execute_engine.i_reg(instr_rs1_msb_c downto instr_rs1_lsb_c)); -- write allowed if rs1/uimm5 != 0 |
end if; |
|
-- low privilege level access to hpm counters? -- |
1389,26 → 1324,13
NULL; |
end if; |
|
-- machine trap setup -- |
when csr_mstatus_c | csr_misa_c | csr_mie_c | csr_mtvec_c | csr_mcounteren_c | csr_mstatush_c => |
-- machine trap setup & handling -- |
when csr_mstatus_c | csr_misa_c | csr_mie_c | csr_mtvec_c | csr_mcounteren_c | csr_mscratch_c | csr_mepc_c | csr_mcause_c => |
csr_acc_valid <= csr.priv_m_mode; -- M-mode only, NOTE: MISA is read-only in the NEORV32 but we do not cause an exception here for compatibility |
|
-- machine trap handling -- |
when csr_mscratch_c | csr_mepc_c | csr_mcause_c | csr_mtval_c => |
csr_acc_valid <= csr.priv_m_mode; -- M-mode only |
when csr_mip_c => -- NOTE: MIP is read-only in the NEORV32 |
when csr_mip_c | csr_mtval_c => -- NOTE: MIP and MTVAL are read-only in the NEORV32! |
csr_acc_valid <= (not csr_wacc_v) and csr.priv_m_mode; -- M-mode only, read-only |
|
-- physical memory protection - configuration -- |
when csr_pmpcfg0_c | csr_pmpcfg1_c | csr_pmpcfg2_c | csr_pmpcfg3_c | csr_pmpcfg4_c | csr_pmpcfg5_c | csr_pmpcfg6_c | csr_pmpcfg7_c | |
csr_pmpcfg8_c | csr_pmpcfg9_c | csr_pmpcfg10_c | csr_pmpcfg11_c | csr_pmpcfg12_c | csr_pmpcfg13_c | csr_pmpcfg14_c | csr_pmpcfg15_c => |
if (PMP_NUM_REGIONS > 0) then |
csr_acc_valid <= csr.priv_m_mode; -- M-mode only |
else |
NULL; |
end if; |
|
-- physical memory protection - address -- |
-- physical memory protection - address & configuration -- |
when csr_pmpaddr0_c | csr_pmpaddr1_c | csr_pmpaddr2_c | csr_pmpaddr3_c | csr_pmpaddr4_c | csr_pmpaddr5_c | csr_pmpaddr6_c | csr_pmpaddr7_c | |
csr_pmpaddr8_c | csr_pmpaddr9_c | csr_pmpaddr10_c | csr_pmpaddr11_c | csr_pmpaddr12_c | csr_pmpaddr13_c | csr_pmpaddr14_c | csr_pmpaddr15_c | |
csr_pmpaddr16_c | csr_pmpaddr17_c | csr_pmpaddr18_c | csr_pmpaddr19_c | csr_pmpaddr20_c | csr_pmpaddr21_c | csr_pmpaddr22_c | csr_pmpaddr23_c | |
1416,7 → 1338,9
csr_pmpaddr32_c | csr_pmpaddr33_c | csr_pmpaddr34_c | csr_pmpaddr35_c | csr_pmpaddr36_c | csr_pmpaddr37_c | csr_pmpaddr38_c | csr_pmpaddr39_c | |
csr_pmpaddr40_c | csr_pmpaddr41_c | csr_pmpaddr42_c | csr_pmpaddr43_c | csr_pmpaddr44_c | csr_pmpaddr45_c | csr_pmpaddr46_c | csr_pmpaddr47_c | |
csr_pmpaddr48_c | csr_pmpaddr49_c | csr_pmpaddr50_c | csr_pmpaddr51_c | csr_pmpaddr52_c | csr_pmpaddr53_c | csr_pmpaddr54_c | csr_pmpaddr55_c | |
csr_pmpaddr56_c | csr_pmpaddr57_c | csr_pmpaddr58_c | csr_pmpaddr59_c | csr_pmpaddr60_c | csr_pmpaddr61_c | csr_pmpaddr62_c | csr_pmpaddr63_c => |
csr_pmpaddr56_c | csr_pmpaddr57_c | csr_pmpaddr58_c | csr_pmpaddr59_c | csr_pmpaddr60_c | csr_pmpaddr61_c | csr_pmpaddr62_c | csr_pmpaddr63_c | |
csr_pmpcfg0_c | csr_pmpcfg1_c | csr_pmpcfg2_c | csr_pmpcfg3_c | csr_pmpcfg4_c | csr_pmpcfg5_c | csr_pmpcfg6_c | csr_pmpcfg7_c | |
csr_pmpcfg8_c | csr_pmpcfg9_c | csr_pmpcfg10_c | csr_pmpcfg11_c | csr_pmpcfg12_c | csr_pmpcfg13_c | csr_pmpcfg14_c | csr_pmpcfg15_c => |
if (PMP_NUM_REGIONS > 0) then |
csr_acc_valid <= csr.priv_m_mode; -- M-mode only |
else |
1496,7 → 1420,7
-- debug mode CSRs -- |
when csr_dcsr_c | csr_dpc_c | csr_dscratch0_c => |
if (CPU_EXTENSION_RISCV_DEBUG = true) then |
csr_acc_valid <= debug_ctrl.running; -- DEBUG-mode only |
csr_acc_valid <= debug_ctrl.running; -- access in only in debug-mode |
else |
NULL; |
end if; |
1528,7 → 1452,7
end if; |
|
-- check instructions -- |
opcode_v := execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c+2) & "11"; |
opcode_v := execute_engine.i_reg(instr_opcode_msb_c downto instr_opcode_lsb_c+2) & "11"; -- save some bits here, LSBs are always 11 for rv32 |
case opcode_v is |
|
|
1546,10 → 1470,6
if (CPU_EXTENSION_RISCV_M = false) then -- not implemented |
illegal_instruction <= '1'; |
end if; |
elsif (decode_aux.is_bitmanip_reg = '1') then -- bit manipulation |
if (CPU_EXTENSION_RISCV_B = false) then -- not implemented |
illegal_instruction <= '1'; |
end if; |
elsif ((execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_subadd_c) or |
(execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sr_c)) and -- ADD/SUB or SRA/SRL check |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) /= "0000000") and |
1566,11 → 1486,7
|
when opcode_alui_c => -- check ALUI.funct7 |
-- ------------------------------------------------------------ |
if (decode_aux.is_bitmanip_imm = '1') then -- bit manipulation |
if (CPU_EXTENSION_RISCV_B = false) then -- not implemented |
illegal_instruction <= '1'; |
end if; |
elsif ((execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sll_c) and |
if ((execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sll_c) and |
(execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) /= "0000000")) or -- shift logical left |
((execute_engine.i_reg(instr_funct3_msb_c downto instr_funct3_lsb_c) = funct3_sr_c) and |
((execute_engine.i_reg(instr_funct7_msb_c downto instr_funct7_lsb_c) /= "0000000") and |
1677,13 → 1593,13
end if; |
end if; |
|
-- ecall, ebreak, mret, wfi -- |
-- ecall, ebreak, mret, wfi, dret -- |
elsif (execute_engine.i_reg(instr_rd_msb_c downto instr_rd_lsb_c) = "00000") and |
(execute_engine.i_reg(instr_rs1_msb_c downto instr_rs1_lsb_c) = "00000") then |
if (execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = funct12_ecall_c) or -- ECALL |
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = funct12_ebreak_c) or -- EBREAK |
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = funct12_mret_c) or -- MRET |
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = (funct12_dret_c)) and (CPU_EXTENSION_RISCV_DEBUG = true) and (debug_ctrl.running = '1')) or |
((execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = (funct12_dret_c)) and (CPU_EXTENSION_RISCV_DEBUG = true) and (debug_ctrl.running = '1')) or -- DRET |
(execute_engine.i_reg(instr_funct12_msb_c downto instr_funct12_lsb_c) = funct12_wfi_c) then -- WFI |
illegal_instruction <= '0'; |
else |
1821,13 → 1737,12
end process trap_controller; |
|
-- any exception/interrupt? -- |
trap_ctrl.exc_fire <= or_all_f(trap_ctrl.exc_buf); -- exceptions/faults CANNOT be masked |
trap_ctrl.irq_fire <= (or_all_f(trap_ctrl.irq_buf) and csr.mstatus_mie and trap_ctrl.db_irq_en) or trap_ctrl.db_irq_fire; -- interrupts CAN be masked |
trap_ctrl.exc_fire <= or_reduce_f(trap_ctrl.exc_buf); -- exceptions/faults CANNOT be masked |
trap_ctrl.irq_fire <= (or_reduce_f(trap_ctrl.irq_buf) and csr.mstatus_mie and trap_ctrl.db_irq_en) or trap_ctrl.db_irq_fire; -- interrupts CAN be masked |
|
-- debug mode (entry) interrupts -- |
trap_ctrl.db_irq_en <= '1' when (CPU_EXTENSION_RISCV_DEBUG = false) else |
'0' when (debug_ctrl.running = '1') else -- no interrupts when IN debug mode |
csr.dcsr_stepie when (csr.dcsr_step = '1') else '1'; -- allow IRQ in single-step mode when dcsr.stepie is set |
'0' when (debug_ctrl.running = '1') or (csr.dcsr_step = '1') else '1'; -- no interrupts when IN debug mode or IN single-step mode |
trap_ctrl.db_irq_fire <= (trap_ctrl.irq_buf(interrupt_db_step_c) or trap_ctrl.irq_buf(interrupt_db_halt_c)) when (CPU_EXTENSION_RISCV_DEBUG = true) else '0'; -- "NMI" for debug mode entry |
|
-- acknowledge mask output -- |
2098,7 → 2013,6
csr.dcsr_ebreakm <= '0'; |
csr.dcsr_ebreaku <= '0'; |
csr.dcsr_step <= '0'; |
csr.dcsr_stepie <= '0'; |
csr.dcsr_prv <= (others => def_rst_val_c); |
csr.dcsr_cause <= (others => def_rst_val_c); |
csr.dpc <= (others => def_rst_val_c); |
2185,10 → 2099,6
csr.mcause(csr.mcause'left) <= csr.wdata(31); -- 1: interrupt, 0: exception |
csr.mcause(4 downto 0) <= csr.wdata(4 downto 0); -- identifier |
end if; |
-- R/W: mtval - machine bad address/instruction -- |
if (csr.addr(3 downto 0) = csr_mtval_c(3 downto 0)) then |
csr.mtval <= csr.wdata; |
end if; |
end if; |
|
-- physical memory protection: R/W: pmpcfg* - PMP configuration registers -- |
2253,7 → 2163,6
-- R/W: dcsr - debug mode control and status register -- |
if (csr.addr(1 downto 0) = csr_dcsr_c(1 downto 0)) then |
csr.dcsr_ebreakm <= csr.wdata(15); |
csr.dcsr_stepie <= csr.wdata(2); |
csr.dcsr_step <= csr.wdata(2); |
if (CPU_EXTENSION_RISCV_U = true) then -- user mode implemented |
csr.dcsr_ebreaku <= csr.wdata(12); |
2364,17 → 2273,11
csr.mstatus_mpie <= '1'; |
if (CPU_EXTENSION_RISCV_U = true) then -- implement user mode |
csr.privilege <= csr.mstatus_mpp; -- go back to previous privilege mode |
csr.mstatus_mpp <= priv_mode_m_c; |
csr.mstatus_mpp <= (others => '0'); |
end if; |
end if; |
end if; |
|
-- user mode NOT implemented -- |
if (CPU_EXTENSION_RISCV_U = false) then |
csr.privilege <= priv_mode_m_c; |
csr.mstatus_mpp <= priv_mode_m_c; |
end if; |
|
end if; -- /hardware csr access |
end if; |
|
2391,6 → 2294,7
csr.mcounteren_ir <= '0'; |
csr.mcounteren_hpm <= (others => '0'); |
csr.dcsr_ebreaku <= '0'; |
csr.dcsr_prv <= priv_mode_m_c; |
end if; |
|
-- pmp disabled -- |
2425,8 → 2329,6
csr.dcsr_ebreakm <= '0'; |
csr.dcsr_ebreaku <= '0'; |
csr.dcsr_step <= '0'; |
csr.dcsr_stepie <= '0'; |
csr.dcsr_prv <= (others => '0'); |
csr.dcsr_cause <= (others => '0'); |
csr.dpc <= (others => '0'); |
csr.dscratch0 <= (others => '0'); |
2475,96 → 2377,100
begin |
-- Counter CSRs (each counter is split into two 32-bit counters - coupled via an MSB overflow detector) |
if (rstn_i = '0') then |
csr.mcycle <= (others => def_rst_val_c); |
mcycle_msb <= def_rst_val_c; |
csr.mcycleh <= (others => def_rst_val_c); |
csr.minstret <= (others => def_rst_val_c); |
minstret_msb <= def_rst_val_c; |
csr.minstreth <= (others => def_rst_val_c); |
csr.mhpmcounter <= (others => (others => def_rst_val_c)); |
mhpmcounter_msb <= (others => def_rst_val_c); |
csr.mhpmcounterh <= (others => (others => def_rst_val_c)); |
csr.mcycle <= (others => def_rst_val_c); |
csr.mcycle_msb <= def_rst_val_c; |
csr.mcycleh <= (others => def_rst_val_c); |
csr.minstret <= (others => def_rst_val_c); |
csr.minstret_msb <= def_rst_val_c; |
csr.minstreth <= (others => def_rst_val_c); |
csr.mhpmcounter <= (others => (others => def_rst_val_c)); |
csr.mhpmcounter_msb <= (others => def_rst_val_c); |
csr.mhpmcounterh <= (others => (others => def_rst_val_c)); |
elsif rising_edge(clk_i) then |
|
-- [m]cycle -- |
csr.mcycle(csr.mcycle'left downto cpu_cnt_lo_width_c+1) <= (others => '0'); -- set unused bits to zero |
if (cpu_cnt_lo_width_c = 0) then |
csr.mcycle <= (others => '0'); |
mcycle_msb <= '0'; |
elsif (csr.we = '1') and (csr.addr = csr_mcycle_c) then -- write access |
csr.mcycle(cpu_cnt_lo_width_c downto 0) <= '0' & csr.wdata(cpu_cnt_lo_width_c-1 downto 0); |
mcycle_msb <= '0'; |
elsif (csr.mcountinhibit_cy = '0') and (cnt_event(hpmcnt_event_cy_c) = '1') then -- non-inhibited automatic update |
csr.mcycle(cpu_cnt_lo_width_c downto 0) <= std_ulogic_vector(unsigned(csr.mcycle(cpu_cnt_lo_width_c downto 0)) + 1); |
mcycle_msb <= csr.mcycle(cpu_cnt_lo_width_c); |
if (cpu_cnt_lo_width_c > 0) then |
csr.mcycle_msb <= csr.mcycle(csr.mcycle'left); |
if (csr.we = '1') and (csr.addr = csr_mcycle_c) then -- write access |
csr.mcycle(cpu_cnt_lo_width_c downto 0) <= '0' & csr.wdata(cpu_cnt_lo_width_c-1 downto 0); |
elsif (csr.mcountinhibit_cy = '0') and (cnt_event(hpmcnt_event_cy_c) = '1') then -- non-inhibited automatic update |
csr.mcycle(cpu_cnt_lo_width_c downto 0) <= std_ulogic_vector(unsigned('0' & csr.mcycle(cpu_cnt_lo_width_c-1 downto 0)) + 1); |
end if; |
else |
csr.mcycle <= (others => '-'); |
csr.mcycle_msb <= '-'; |
end if; |
|
-- [m]cycleh -- |
csr.mcycleh(csr.mcycleh'left downto cpu_cnt_hi_width_c+1) <= (others => '0'); -- set unused bits to zero |
if (cpu_cnt_hi_width_c = 0) then |
csr.mcycleh <= (others => '0'); |
elsif (csr.we = '1') and (csr.addr = csr_mcycleh_c) then -- write access |
csr.mcycleh(cpu_cnt_hi_width_c-1 downto 0) <= csr.wdata(cpu_cnt_hi_width_c-1 downto 0); |
elsif ((mcycle_msb xor csr.mcycle(cpu_cnt_lo_width_c)) = '1') then -- automatic update (continued) |
csr.mcycleh(cpu_cnt_hi_width_c-1 downto 0) <= std_ulogic_vector(unsigned(csr.mcycleh(cpu_cnt_hi_width_c-1 downto 0)) + 1); |
if (cpu_cnt_hi_width_c > 0) then |
if (csr.we = '1') and (csr.addr = csr_mcycleh_c) then -- write access |
csr.mcycleh(cpu_cnt_hi_width_c-1 downto 0) <= csr.wdata(cpu_cnt_hi_width_c-1 downto 0); |
elsif (csr.mcycle_msb = '0') and (csr.mcycle(csr.mcycle'left) = '1') then -- automatic update (continued) |
csr.mcycleh(cpu_cnt_hi_width_c-1 downto 0) <= std_ulogic_vector(unsigned(csr.mcycleh(cpu_cnt_hi_width_c-1 downto 0)) + 1); |
end if; |
else |
csr.mcycleh <= (others => '-'); |
end if; |
|
|
-- [m]instret -- |
csr.minstret(csr.minstret'left downto cpu_cnt_lo_width_c+1) <= (others => '0'); -- set unused bits to zero |
if (cpu_cnt_lo_width_c = 0) then |
csr.minstret <= (others => '0'); |
minstret_msb <= '0'; |
elsif (csr.we = '1') and (csr.addr = csr_minstret_c) then -- write access |
csr.minstret(cpu_cnt_lo_width_c downto 0) <= '0' & csr.wdata(cpu_cnt_lo_width_c-1 downto 0); |
minstret_msb <= '0'; |
elsif (csr.mcountinhibit_ir = '0') and (cnt_event(hpmcnt_event_ir_c) = '1') then -- non-inhibited automatic update |
csr.minstret(cpu_cnt_lo_width_c downto 0) <= std_ulogic_vector(unsigned(csr.minstret(cpu_cnt_lo_width_c downto 0)) + 1); |
minstret_msb <= csr.minstret(csr.minstret'left); |
if (cpu_cnt_lo_width_c > 0) then |
csr.minstret_msb <= csr.minstret(csr.minstret'left); |
if (csr.we = '1') and (csr.addr = csr_minstret_c) then -- write access |
csr.minstret(cpu_cnt_lo_width_c downto 0) <= '0' & csr.wdata(cpu_cnt_lo_width_c-1 downto 0); |
elsif (csr.mcountinhibit_ir = '0') and (cnt_event(hpmcnt_event_ir_c) = '1') then -- non-inhibited automatic update |
csr.minstret(cpu_cnt_lo_width_c downto 0) <= std_ulogic_vector(unsigned('0' & csr.minstret(cpu_cnt_lo_width_c-1 downto 0)) + 1); |
end if; |
else |
csr.minstret <= (others => '-'); |
csr.minstret_msb <= '-'; |
end if; |
|
-- [m]instreth -- |
csr.minstreth(csr.minstreth'left downto cpu_cnt_hi_width_c+1) <= (others => '0'); -- set unsued bits to zero |
if (cpu_cnt_hi_width_c = 0) then |
csr.minstreth <= (others => '0'); |
elsif (csr.we = '1') and (csr.addr = csr_minstreth_c) then -- write access |
csr.minstreth(cpu_cnt_hi_width_c-1 downto 0) <= csr.wdata(cpu_cnt_hi_width_c-1 downto 0); |
elsif ((minstret_msb xor csr.minstret(cpu_cnt_lo_width_c)) = '1') then -- automatic update (continued) |
csr.minstreth(cpu_cnt_hi_width_c-1 downto 0) <= std_ulogic_vector(unsigned(csr.minstreth(cpu_cnt_hi_width_c-1 downto 0)) + 1); |
if (cpu_cnt_hi_width_c > 0) then |
if (csr.we = '1') and (csr.addr = csr_minstreth_c) then -- write access |
csr.minstreth(cpu_cnt_hi_width_c-1 downto 0) <= csr.wdata(cpu_cnt_hi_width_c-1 downto 0); |
elsif (csr.minstret_msb = '0') and (csr.minstret(csr.minstret'left) = '1') then -- automatic update (continued) |
csr.minstreth(cpu_cnt_hi_width_c-1 downto 0) <= std_ulogic_vector(unsigned(csr.minstreth(cpu_cnt_hi_width_c-1 downto 0)) + 1); |
end if; |
else |
csr.minstreth <= (others => '-'); |
end if; |
|
|
-- [machine] hardware performance monitors (counters) -- |
for i in 0 to HPM_NUM_CNTS-1 loop |
csr.mhpmcounter(i)(csr.mhpmcounter(i)'left downto hpm_cnt_lo_width_c+1) <= (others => '0'); -- set unused bits to zero |
if (hpm_cnt_lo_width_c = 0) then |
csr.mhpmcounter(i) <= (others => '0'); |
mhpmcounter_msb(i) <= '0'; |
else |
-- [m]hpmcounter* -- |
|
-- [m]hpmcounter* -- |
if (hpm_cnt_lo_width_c > 0) then |
csr.mhpmcounter_msb(i) <= csr.mhpmcounter(i)(csr.mhpmcounter(i)'left); |
if (csr.we = '1') and (csr.addr = std_ulogic_vector(unsigned(csr_mhpmcounter3_c) + i)) then -- write access |
csr.mhpmcounter(i)(hpm_cnt_lo_width_c downto 0) <= '0' & csr.wdata(hpm_cnt_lo_width_c-1 downto 0); |
mhpmcounter_msb(i) <= '0'; |
elsif (csr.mcountinhibit_hpm(i) = '0') and (hpmcnt_trigger(i) = '1') then -- non-inhibited automatic update |
csr.mhpmcounter(i)(hpm_cnt_lo_width_c downto 0) <= std_ulogic_vector(unsigned(csr.mhpmcounter(i)(hpm_cnt_lo_width_c downto 0)) + 1); |
mhpmcounter_msb(i) <= csr.mhpmcounter(i)(csr.mhpmcounter(i)'left); |
csr.mhpmcounter(i)(hpm_cnt_lo_width_c downto 0) <= std_ulogic_vector(unsigned('0' & csr.mhpmcounter(i)(hpm_cnt_lo_width_c-1 downto 0)) + 1); |
end if; |
else |
csr.mhpmcounter(i) <= (others => '-'); |
csr.mhpmcounter_msb(i) <= '-'; |
end if; |
|
-- [m]hpmcounter*h -- |
csr.mhpmcounterh(i)(csr.mhpmcounterh(i)'left downto hpm_cnt_hi_width_c+1) <= (others => '0'); -- set unused bits to zero |
if (hpm_cnt_hi_width_c = 0) then |
csr.mhpmcounterh(i) <= (others => '0'); |
else |
if (hpm_cnt_hi_width_c > 0) then |
if (csr.we = '1') and (csr.addr = std_ulogic_vector(unsigned(csr_mhpmcounter3h_c) + i)) then -- write access |
csr.mhpmcounterh(i)(hpm_cnt_hi_width_c-1 downto 0) <= csr.wdata(hpm_cnt_hi_width_c-1 downto 0); |
elsif ((mhpmcounter_msb(i) xor csr.mhpmcounter(i)(hpm_cnt_lo_width_c)) = '1') then -- automatic update (continued) |
elsif (csr.mhpmcounter_msb(i) = '0') and (csr.mhpmcounter(i)(csr.mhpmcounter(i)'left) = '1') then -- automatic update (continued) |
csr.mhpmcounterh(i)(hpm_cnt_hi_width_c-1 downto 0) <= std_ulogic_vector(unsigned(csr.mhpmcounterh(i)(hpm_cnt_hi_width_c-1 downto 0)) + 1); |
end if; |
else |
csr.mhpmcounterh(i) <= (others => '-'); |
end if; |
|
end loop; -- i |
|
end if; |
end process csr_counters; |
|
|
-- hpm counters read dummy -- |
hpm_rd_dummy: process(csr) |
begin |
2598,7 → 2504,7
hpmcnt_trigger <= (others => '0'); -- default |
if (HPM_NUM_CNTS /= 0) then |
for i in 0 to HPM_NUM_CNTS-1 loop |
hpmcnt_trigger(i) <= or_all_f(cnt_event and csr.mhpmevent(i)(cnt_event'left downto 0)); |
hpmcnt_trigger(i) <= or_reduce_f(cnt_event and csr.mhpmevent(i)(cnt_event'left downto 0)); |
end loop; -- i |
end if; |
end if; |
2653,15 → 2559,11
-- -------------------------------------------------------------------- |
when csr_mstatus_c => -- mstatus (r/w): machine status register |
csr.rdata(03) <= csr.mstatus_mie; -- MIE |
csr.rdata(06) <= '1' and bool_to_ulogic_f(CPU_EXTENSION_RISCV_U); -- UBE: CPU/Processor is BIG-ENDIAN (in user-mode) |
csr.rdata(07) <= csr.mstatus_mpie; -- MPIE |
csr.rdata(11) <= csr.mstatus_mpp(0); -- MPP: machine previous privilege mode low |
csr.rdata(12) <= csr.mstatus_mpp(1); -- MPP: machine previous privilege mode high |
when csr_mstatush_c => -- mstatush (r/-): machine status register - high part |
csr.rdata(05) <= '1'; -- MBE: CPU/Processor is BIG-ENDIAN (in machine-mode) |
when csr_misa_c => -- misa (r/-): ISA and extensions |
csr.rdata(00) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_A); -- A CPU extension |
csr.rdata(01) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_B); -- B CPU extension |
csr.rdata(02) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_C); -- C CPU extension |
csr.rdata(04) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- E CPU extension |
csr.rdata(08) <= not bool_to_ulogic_f(CPU_EXTENSION_RISCV_E); -- I CPU extension (if not E) |
2922,9 → 2824,6
when csr_mzext_c => -- mzext (r/-): available RISC-V Z* sub-extensions |
csr.rdata(0) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zicsr); -- Zicsr |
csr.rdata(1) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zifencei); -- Zifencei |
csr.rdata(2) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_B); -- Zbb (B) |
csr.rdata(3) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_B); -- Zbs (B) |
csr.rdata(4) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_B); -- Zba (B) |
csr.rdata(5) <= bool_to_ulogic_f(CPU_EXTENSION_RISCV_Zfinx); -- Zfinx ("F-alternative") |
if (CPU_CNT_WIDTH = 64) then |
csr.rdata(6) <= '0'; -- Zxscnt (custom) |
2949,7 → 2848,7
-- undefined/unavailable -- |
-- -------------------------------------------------------------------- |
when others => |
NULL; -- not implemented |
NULL; -- not implemented, read as zero if read access is granted |
|
end case; |
end if; |
3015,8 → 2914,8
|
-- entry debug mode triggers -- |
debug_ctrl.trig_break <= trap_ctrl.break_point and (debug_ctrl.running or -- we are in debug mode: re-enter debug mode |
(csr.priv_m_mode and csr.dcsr_ebreakm and (not debug_ctrl.running)) or -- enable goto-debug-mode in machine mode on "ebreak" |
(csr.priv_u_mode and csr.dcsr_ebreaku and (not debug_ctrl.running))); -- enable goto-debug-mode in user mode on "ebreak" |
(csr.priv_m_mode and csr.dcsr_ebreakm and (not debug_ctrl.running)) or -- enabled goto-debug-mode in machine mode on "ebreak" |
(csr.priv_u_mode and csr.dcsr_ebreaku and (not debug_ctrl.running))); -- enabled goto-debug-mode in user mode on "ebreak" |
debug_ctrl.trig_halt <= (not debug_ctrl.ext_halt_req(1)) and debug_ctrl.ext_halt_req(0) and (not debug_ctrl.running); -- rising edge detector from external halt request (if not halted already) |
debug_ctrl.trig_step <= csr.dcsr_step and (not debug_ctrl.running); -- single-step mode (trigger when NOT CURRENTLY in debug mode) |
|
3025,7 → 2924,7
-- ------------------------------------------------------------------------------------------- |
dcsr_readback_false: |
if (CPU_EXTENSION_RISCV_DEBUG = false) generate |
csr.dcsr_rd <= (others => '0'); |
csr.dcsr_rd <= (others => '-'); |
end generate; |
|
dcsr_readback_true: |
3036,10 → 2935,10
csr.dcsr_rd(14) <= '0'; -- ebreakh: not available |
csr.dcsr_rd(13) <= '0'; -- ebreaks: not available |
csr.dcsr_rd(12) <= csr.dcsr_ebreaku when (CPU_EXTENSION_RISCV_U = true) else '0'; -- ebreaku: what happens on ebreak in u-mode? (normal trap OR debug-enter) |
csr.dcsr_rd(11) <= csr.dcsr_stepie; -- stepie: interrupts enabled during single-stepping? |
csr.dcsr_rd(11) <= '0'; -- stepie: interrupts are disabled during single-stepping |
csr.dcsr_rd(10) <= '0'; -- stopcount: counters increment as usual FIXME ??? |
csr.dcsr_rd(09) <= '0'; -- stoptime: timers increment as usual FIXME ??? |
csr.dcsr_rd(08 downto 06) <= csr.dcsr_cause; -- cause |
csr.dcsr_rd(09) <= '0'; -- stoptime: timers increment as usual |
csr.dcsr_rd(08 downto 06) <= csr.dcsr_cause; -- debug mode entry cause |
csr.dcsr_rd(05) <= '0'; -- reserved |
csr.dcsr_rd(04) <= '0'; -- mprven: mstatus.mprv is ignored in debug mode |
csr.dcsr_rd(03) <= trap_ctrl.irq_buf(interrupt_nm_irq_c); -- nmip: pending non-maskable interrupt |
/neorv32_cpu_cp_fpu.vhd
313,9 → 313,9
begin |
for i in 0 to 1 loop -- for rs1 and rs2 inputs |
-- check for all-zero/all-one -- |
op_m_all_zero_v := not or_all_f(op_data(i)(22 downto 00)); |
op_e_all_zero_v := not or_all_f(op_data(i)(30 downto 23)); |
op_e_all_one_v := and_all_f(op_data(i)(30 downto 23)); |
op_m_all_zero_v := not or_reduce_f(op_data(i)(22 downto 00)); |
op_e_all_zero_v := not or_reduce_f(op_data(i)(30 downto 23)); |
op_e_all_one_v := and_reduce_f(op_data(i)(30 downto 23)); |
|
-- check special cases -- |
op_is_zero_v := op_e_all_zero_v and op_m_all_zero_v; -- zero |
1360,7 → 1360,7
sreg.lower <= mantissa_i(45 downto 23); |
sreg.ext_g <= mantissa_i(22); |
sreg.ext_r <= mantissa_i(21); |
sreg.ext_s <= or_all_f(mantissa_i(20 downto 0)); |
sreg.ext_s <= or_reduce_f(mantissa_i(20 downto 0)); |
-- check for special cases -- |
if ((ctrl.class(fp_class_snan_c) or ctrl.class(fp_class_qnan_c) or -- NaN |
ctrl.class(fp_class_neg_zero_c) or ctrl.class(fp_class_pos_zero_c) or -- zero |
1475,10 → 1475,10
end process ctrl_engine; |
|
-- stop shifting when normalized -- |
sreg.done <= (not or_all_f(sreg.upper(sreg.upper'left downto 1))) and sreg.upper(0); -- input is zero, hidden one is set |
sreg.done <= (not or_reduce_f(sreg.upper(sreg.upper'left downto 1))) and sreg.upper(0); -- input is zero, hidden one is set |
|
-- all-zero including hidden bit -- |
sreg.zero <= not or_all_f(sreg.upper); |
sreg.zero <= not or_reduce_f(sreg.upper); |
|
-- result -- |
result_o(31) <= ctrl.res_sgn; |
1717,8 → 1717,8
|
when S_NORMALIZE_BUSY => -- running normalization cycle |
-- ------------------------------------------------------------ |
sreg.ext_s <= sreg.ext_s or or_all_f(sreg.mant(sreg.mant'left-2 downto 0)); -- sticky bit |
if (or_all_f(ctrl.cnt(ctrl.cnt'left-1 downto 0)) = '0') then |
sreg.ext_s <= sreg.ext_s or or_reduce_f(sreg.mant(sreg.mant'left-2 downto 0)); -- sticky bit |
if (or_reduce_f(ctrl.cnt(ctrl.cnt'left-1 downto 0)) = '0') then |
if (ctrl.unsign = '0') then -- signed conversion |
ctrl.over <= ctrl.over or sreg.int(sreg.int'left); -- update overrun flag again to check for numerical overflow into sign bit |
end if; |
/neorv32_cpu_cp_muldiv.vhd
163,7 → 163,7
div_res_corr <= '0'; |
end if; |
-- divide by zero? -- |
opy_is_zero <= not or_all_f(rs2_i); -- set if rs2 = 0 |
opy_is_zero <= not or_reduce_f(rs2_i); -- set if rs2 = 0 |
-- abs(rs1) -- |
if ((rs1_i(rs1_i'left) and rs1_is_signed) = '1') then -- signed division? |
div_opx <= std_ulogic_vector(0 - unsigned(rs1_i)); -- make positive |
/neorv32_cpu_regfile.vhd
115,8 → 115,8
end process rf_access; |
|
-- check if we are writing to x0 -- |
rd_is_r0 <= not or_all_f(ctrl_i(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c)) when (CPU_EXTENSION_RISCV_E = false) else |
not or_all_f(ctrl_i(ctrl_rf_rd_adr3_c downto ctrl_rf_rd_adr0_c)); |
rd_is_r0 <= not or_reduce_f(ctrl_i(ctrl_rf_rd_adr4_c downto ctrl_rf_rd_adr0_c)) when (CPU_EXTENSION_RISCV_E = false) else |
not or_reduce_f(ctrl_i(ctrl_rf_rd_adr3_c downto ctrl_rf_rd_adr0_c)); |
|
-- valid RF write access? -- |
rf_we <= (ctrl_i(ctrl_rf_wb_en_c) and (not rd_is_r0)) or ctrl_i(ctrl_rf_r0_we_c); |
/neorv32_debug_dm.vhd
188,7 → 188,7
constant sreg_execute_ack_c : natural := 4; -- -/w: CPU starts to execute program buffer |
constant sreg_exception_ack_c : natural := 5; -- -/w: CPU has detected an exception |
|
-- code ROM for "park loop" -- |
-- code ROM containing "park loop" -- |
type code_rom_file_t is array (0 to 31) of std_ulogic_vector(31 downto 0); |
constant code_rom_file : code_rom_file_t := ( |
00000000 => x"0180006f", |
240,9 → 240,9
if rising_edge(clk_i) then |
if (dm_reg.dmcontrol_dmactive = '0') or (dmi_rstn_i = '0') then -- DM reset / DM disabled |
dm_ctrl.state <= CMD_IDLE; |
dm_ctrl.ldsw_progbuf <= instr_nop_c; |
dm_ctrl.ldsw_progbuf <= (others => '-'); |
dci.execute_req <= '0'; |
dm_ctrl.pbuf_en <= '0'; |
dm_ctrl.pbuf_en <= '-'; |
-- |
dm_ctrl.illegal_cmd <= '-'; |
dm_ctrl.illegal_state <= '-'; |
306,12 → 306,12
dm_ctrl.ldsw_progbuf(11 downto 07) <= dm_reg.command(4 downto 0); -- "regno" = destination register |
end if; |
else |
dm_ctrl.ldsw_progbuf <= instr_nop_c; |
dm_ctrl.ldsw_progbuf <= instr_nop_c; -- NOP - do nothing |
end if; |
-- |
if (dm_reg.command(18) = '1') then -- "postexec" - execute DMI program buffer |
if (dm_reg.command(18) = '1') then -- "postexec" - execute program buffer |
dm_ctrl.pbuf_en <= '1'; |
else -- empty program buffer, execute NOPs |
else -- execute all program buffer entries as NOPs |
dm_ctrl.pbuf_en <= '0'; |
end if; |
-- |
326,7 → 326,7
|
when CMD_EXE_BUSY => -- wait for CPU to finish |
-- ------------------------------------------------------------ |
if (dci.halt_ack = '1') then -- CPU is parked again -> execution done |
if (dci.halt_ack = '1') then -- CPU is parked (halted) again -> execution done |
dm_ctrl.state <= CMD_IDLE; |
end if; |
|
341,9 → 341,9
end case; |
|
|
-- error flag register -- |
-- error flags -- |
-- ------------------------------------------------------------ |
if (dm_ctrl.cmderr = "000") then |
if (dm_ctrl.cmderr = "000") then -- set new error |
if (dm_ctrl.illegal_state = '1') then -- cannot execute since hart is not in expected state |
dm_ctrl.cmderr <= "100"; |
elsif (dci.exception_ack = '1') then -- exception during execution |
544,7 → 544,7
-- debug module status register -- |
when addr_dmstatus_c => |
dmi_resp_data_o(31 downto 23) <= (others => '0'); -- reserved (r/-) |
dmi_resp_data_o(22) <= '1'; -- impebreak (r/-): there is an implicit ebreak instruction after the program visible buffer |
dmi_resp_data_o(22) <= '1'; -- impebreak (r/-): there is an implicit ebreak instruction after the visible program buffer |
dmi_resp_data_o(21 downto 20) <= (others => '0'); -- reserved (r/-) |
dmi_resp_data_o(19) <= dm_ctrl.hart_reset; -- allhavereset (r/-): there is only one hart that can be reset |
dmi_resp_data_o(18) <= dm_ctrl.hart_reset; -- anyhavereset (r/-): there is only one hart that can be reset |
623,9 → 623,9
when addr_progbuf1_c => |
dmi_resp_data_o <= dm_reg.progbuf(1); -- program buffer 1 |
|
-- system bus access control and status (r/-) -- |
when addr_sbcs_c => |
dmi_resp_data_o <= (others => '0'); -- bus access not implemented |
-- -- system bus access control and status (r/-) -- |
-- when addr_sbcs_c => |
-- dmi_resp_data_o <= (others => '0'); -- bus access not implemented |
|
-- halt summary 0 (r/-) -- |
when addr_haltsum0_c => |
669,7 → 669,7
-- Access Control ------------------------------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
acc_en <= '1' when (cpu_addr_i(hi_abb_c downto lo_abb_c) = dm_base_c(hi_abb_c downto lo_abb_c)) else '0'; |
maddr <= cpu_addr_i(lo_abb_c-1 downto lo_abb_c-2); |
maddr <= cpu_addr_i(lo_abb_c-1 downto lo_abb_c-2); -- (sub-)module select address |
rden <= acc_en and cpu_rden_i; |
wren <= acc_en and cpu_wren_i; |
|
711,7 → 711,7
cpu_ack_o <= rden or wren; |
cpu_data_o <= (others => '0'); |
if (rden = '1') then -- output gate |
case maddr is -- read data select |
case maddr is -- module select |
when "00" => -- code ROM |
cpu_data_o <= code_rom_file(to_integer(unsigned(cpu_addr_i(6 downto 2)))); |
when "01" => -- program buffer |
/neorv32_gpio.vhd
125,7 → 125,7
in_buf <= gpio_i; |
din <= in_buf; |
-- IRQ -- |
irq_o <= or_all_f((in_buf xor din) and irq_en); -- any enabled pin transition triggers an interrupt |
irq_o <= or_reduce_f((in_buf xor din) and irq_en); -- any enabled pin transition triggers an interrupt |
end if; |
end process irq_detector; |
|
/neorv32_icache.vhd
259,7 → 259,7
ctrl.state_nxt <= S_BUS_ERROR; |
elsif (bus_ack_i = '1') then -- ACK = write to cache and get next word |
cache.ctrl_we <= '1'; -- write to cache |
if (and_all_f(ctrl.addr_reg((2+cache_offset_size_c)-1 downto 2)) = '1') then -- block complete? |
if (and_reduce_f(ctrl.addr_reg((2+cache_offset_size_c)-1 downto 2)) = '1') then -- block complete? |
cache.ctrl_tag_we <= '1'; -- current block is valid now |
cache.ctrl_valid_we <= '1'; -- write tag of current address |
ctrl.state_nxt <= S_CACHE_RESYNC_0; |
475,7 → 475,7
history.re_ff <= host_re_i; |
if (invalidate_i = '1') then -- invalidate whole cache |
history.last_used_set <= (others => '1'); |
elsif (history.re_ff = '1') and (or_all_f(hit) = '1') and (ctrl_en_i = '0') then -- store last accessed set that caused a hit |
elsif (history.re_ff = '1') and (or_reduce_f(hit) = '1') and (ctrl_en_i = '0') then -- store last accessed set that caused a hit |
history.last_used_set(to_integer(unsigned(cache_index))) <= not hit(0); |
end if; |
history.to_be_replaced <= history.last_used_set(to_integer(unsigned(cache_index))); |
546,7 → 546,7
end process comparator; |
|
-- global hit -- |
hit_o <= or_all_f(hit); |
hit_o <= or_reduce_f(hit); |
|
|
-- Cache Data Memory ---------------------------------------------------------------------- |
/neorv32_mtime.vhd
45,18 → 45,17
entity neorv32_mtime is |
port ( |
-- host access -- |
clk_i : in std_ulogic; -- global clock line |
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async |
addr_i : in std_ulogic_vector(31 downto 0); -- address |
rden_i : in std_ulogic; -- read enable |
wren_i : in std_ulogic; -- write enable |
data_i : in std_ulogic_vector(31 downto 0); -- data in |
data_o : out std_ulogic_vector(31 downto 0); -- data out |
ack_o : out std_ulogic; -- transfer acknowledge |
clk_i : in std_ulogic; -- global clock line |
addr_i : in std_ulogic_vector(31 downto 0); -- address |
rden_i : in std_ulogic; -- read enable |
wren_i : in std_ulogic; -- write enable |
data_i : in std_ulogic_vector(31 downto 0); -- data in |
data_o : out std_ulogic_vector(31 downto 0); -- data out |
ack_o : out std_ulogic; -- transfer acknowledge |
-- time output for CPU -- |
time_o : out std_ulogic_vector(63 downto 0); -- current system time |
time_o : out std_ulogic_vector(63 downto 0); -- current system time |
-- interrupt -- |
irq_o : out std_ulogic -- interrupt request |
irq_o : out std_ulogic -- interrupt request |
); |
end neorv32_mtime; |
|
/neorv32_package.vhd
44,9 → 44,9
constant ispace_base_c : std_ulogic_vector(31 downto 0) := x"00000000"; -- default instruction memory address space base address |
constant dspace_base_c : std_ulogic_vector(31 downto 0) := x"80000000"; -- default data memory address space base address |
|
-- (external) bus interface -- |
constant wb_pipe_mode_c : boolean := false; -- *external* bus protocol: false=classic/standard wishbone mode (default), true=pipelined wishbone mode |
constant xbus_big_endian_c : boolean := true; -- external memory access byte order: true=big endian (default); false=little endian |
-- external bus interface -- |
constant wb_pipe_mode_c : boolean := false; -- external bus protocol: false=classic/standard wishbone mode (default), true=pipelined wishbone mode |
constant xbus_big_endian_c : boolean := false; -- external memory access byte order: true=big-endian, false=little-endian (default) |
|
-- CPU core -- |
constant ipb_entries_c : natural := 4; -- entries in CPU instruction prefetch buffer, has to be a power of 2, default=2 |
75,10 → 75,9
function cond_sel_stdulogic_f(cond : boolean; val_t : std_ulogic; val_f : std_ulogic) return std_ulogic; |
function cond_sel_string_f(cond : boolean; val_t : string; val_f : string) return string; |
function bool_to_ulogic_f(cond : boolean) return std_ulogic; |
function or_all_f(a : std_ulogic_vector) return std_ulogic; |
function and_all_f(a : std_ulogic_vector) return std_ulogic; |
function xor_all_f(a : std_ulogic_vector) return std_ulogic; |
function xnor_all_f(a : std_ulogic_vector) return std_ulogic; |
function or_reduce_f(a : std_ulogic_vector) return std_ulogic; |
function and_reduce_f(a : std_ulogic_vector) return std_ulogic; |
function xor_reduce_f(a : std_ulogic_vector) return std_ulogic; |
function to_hexchar_f(input : std_ulogic_vector(3 downto 0)) return character; |
function hexchar_to_stdulogicvector_f(input : character) return std_ulogic_vector; |
function bit_rev_f(input : std_ulogic_vector) return std_ulogic_vector; |
88,7 → 87,7
-- Architecture Constants (do not modify!) ------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
constant data_width_c : natural := 32; -- native data path width - do not change! |
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01050509"; -- no touchy! |
constant hw_version_c : std_ulogic_vector(31 downto 0) := x"01050605"; -- no touchy! |
constant archid_c : natural := 19; -- official NEORV32 architecture ID - hands off! |
constant rf_r0_is_reg_c : boolean := true; -- x0 is a *physical register* that has to be initialized to zero by the CPU |
constant def_rst_val_c : std_ulogic := cond_sel_stdulogic_f(dedicated_reset_c, '0', '-'); |
121,45 → 120,73
|
-- IO: Peripheral Devices ("IO") Area -- |
-- Control register(s) (including the device-enable) should be located at the base address of each device |
constant io_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff00"; |
constant io_size_c : natural := 64*4; -- module's address space in bytes, fixed! |
constant io_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe00"; |
constant io_size_c : natural := 512; -- module's address space in bytes, fixed! |
|
-- Custom Functions Subsystem (CFS) -- |
constant cfs_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff00"; -- base address |
constant cfs_size_c : natural := 32*4; -- module's address space in bytes |
constant cfs_reg0_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff00"; |
constant cfs_reg1_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff04"; |
constant cfs_reg2_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff08"; |
constant cfs_reg3_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff0c"; |
constant cfs_reg4_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff10"; |
constant cfs_reg5_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff14"; |
constant cfs_reg6_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff18"; |
constant cfs_reg7_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff1c"; |
constant cfs_reg8_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff20"; |
constant cfs_reg9_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff24"; |
constant cfs_reg10_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff28"; |
constant cfs_reg11_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff2c"; |
constant cfs_reg12_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff30"; |
constant cfs_reg13_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff34"; |
constant cfs_reg14_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff38"; |
constant cfs_reg15_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff3c"; |
constant cfs_reg16_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff40"; |
constant cfs_reg17_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff44"; |
constant cfs_reg18_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff48"; |
constant cfs_reg19_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff4c"; |
constant cfs_reg20_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff50"; |
constant cfs_reg21_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff54"; |
constant cfs_reg22_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff58"; |
constant cfs_reg23_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff5c"; |
constant cfs_reg24_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff60"; |
constant cfs_reg25_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff64"; |
constant cfs_reg26_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff68"; |
constant cfs_reg27_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff6c"; |
constant cfs_reg28_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff70"; |
constant cfs_reg29_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff74"; |
constant cfs_reg30_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff78"; |
constant cfs_reg31_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff7c"; |
constant cfs_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe00"; -- base address |
constant cfs_size_c : natural := 64*4; -- module's address space in bytes |
constant cfs_reg0_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe00"; |
constant cfs_reg1_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe04"; |
constant cfs_reg2_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe08"; |
constant cfs_reg3_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe0c"; |
constant cfs_reg4_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe10"; |
constant cfs_reg5_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe14"; |
constant cfs_reg6_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe18"; |
constant cfs_reg7_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe1c"; |
constant cfs_reg8_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe20"; |
constant cfs_reg9_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe24"; |
constant cfs_reg10_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe28"; |
constant cfs_reg11_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe2c"; |
constant cfs_reg12_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe30"; |
constant cfs_reg13_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe34"; |
constant cfs_reg14_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe38"; |
constant cfs_reg15_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe3c"; |
constant cfs_reg16_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe40"; |
constant cfs_reg17_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe44"; |
constant cfs_reg18_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe48"; |
constant cfs_reg19_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe4c"; |
constant cfs_reg20_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe50"; |
constant cfs_reg21_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe54"; |
constant cfs_reg22_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe58"; |
constant cfs_reg23_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe5c"; |
constant cfs_reg24_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe60"; |
constant cfs_reg25_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe64"; |
constant cfs_reg26_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe68"; |
constant cfs_reg27_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe6c"; |
constant cfs_reg28_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe70"; |
constant cfs_reg29_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe74"; |
constant cfs_reg30_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe78"; |
constant cfs_reg31_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe7c"; |
|
-- Pulse-Width Modulation Controller (PWM) -- |
constant pwm_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe80"; -- base address |
constant pwm_size_c : natural := 16*4; -- module's address space in bytes |
constant pwm_ctrl_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe80"; |
constant pwm_duty0_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe84"; |
constant pwm_duty1_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe88"; |
constant pwm_duty2_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe8c"; |
constant pwm_duty3_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe90"; |
constant pwm_duty4_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe94"; |
constant pwm_duty5_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe98"; |
constant pwm_duty6_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffe9c"; |
constant pwm_duty7_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffea0"; |
constant pwm_duty8_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffea4"; |
constant pwm_duty9_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffea8"; |
constant pwm_duty10_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffeac"; |
constant pwm_duty11_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffeb0"; |
constant pwm_duty12_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffeb4"; |
constant pwm_duty13_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffeb8"; |
constant pwm_duty14_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"fffffebc"; |
|
-- reserved -- |
--constant reserved_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffc0"; -- base address |
--constant reserved_size_c : natural := 16*4; -- module's address space in bytes |
|
-- reserved -- |
--constant reserved_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff00"; -- base address |
--constant reserved_size_c : natural := 32*4; -- module's address space in bytes |
|
-- General Purpose Input/Output Unit (GPIO) -- |
constant gpio_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffff80"; -- base address |
constant gpio_size_c : natural := 2*4; -- module's address space in bytes |
202,11 → 229,9
constant twi_ctrl_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb0"; |
constant twi_rtx_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb4"; |
|
-- Pulse-Width Modulation Controller (PWM) -- |
constant pwm_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb8"; -- base address |
constant pwm_size_c : natural := 2*4; -- module's address space in bytes |
constant pwm_ctrl_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb8"; |
constant pwm_duty_addr_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffbc"; |
-- reserved -- |
--constant reserved_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffb8"; -- base address |
--constant reserved_size_c : natural := 2*4; -- module's address space in bytes |
|
-- Numerically-Controlled Oscillator (NCO) -- |
constant nco_base_c : std_ulogic_vector(data_width_c-1 downto 0) := x"ffffffc0"; -- base address |
473,7 → 498,6
constant csr_mie_c : std_ulogic_vector(11 downto 0) := x"304"; |
constant csr_mtvec_c : std_ulogic_vector(11 downto 0) := x"305"; |
constant csr_mcounteren_c : std_ulogic_vector(11 downto 0) := x"306"; |
constant csr_mstatush_c : std_ulogic_vector(11 downto 0) := x"310"; |
-- machine counter setup -- |
constant csr_cnt_setup_c : std_ulogic_vector(06 downto 0) := x"3" & "001"; -- counter setup |
constant csr_mcountinhibit_c : std_ulogic_vector(11 downto 0) := x"320"; |
749,7 → 773,7
-- ------------------------------------------------------------------------------------------- |
constant cp_sel_csr_rd_c : std_ulogic_vector(2 downto 0) := "000"; -- CSR read access ('Zicsr' extension) |
constant cp_sel_muldiv_c : std_ulogic_vector(2 downto 0) := "001"; -- multiplication/division operations ('M' extension) |
constant cp_sel_bitmanip_c : std_ulogic_vector(2 downto 0) := "010"; -- bit manipulation ('B' extension) |
--constant cp_sel_bitmanip_c : std_ulogic_vector(2 downto 0) := "010"; -- bit manipulation ('B' extension) |
constant cp_sel_fpu_c : std_ulogic_vector(2 downto 0) := "011"; -- floating-point unit ('Zfinx' extension) |
--constant cp_sel_reserved_c : std_ulogic_vector(2 downto 0) := "100"; -- reserved |
--constant cp_sel_reserved_c : std_ulogic_vector(2 downto 0) := "101"; -- reserved |
769,12 → 793,12
-- function select (actual alu result) -- |
constant alu_func_cmd_arith_c : std_ulogic_vector(1 downto 0) := "00"; -- r <= r.arith |
constant alu_func_cmd_logic_c : std_ulogic_vector(1 downto 0) := "01"; -- r <= r.logic |
constant alu_func_cmd_shift_c : std_ulogic_vector(1 downto 0) := "10"; -- r <= A <</>> B (iterative) |
constant alu_func_cmd_copro_c : std_ulogic_vector(1 downto 0) := "11"; -- r <= CP result (iterative) |
constant alu_func_cmd_shift_c : std_ulogic_vector(1 downto 0) := "10"; -- r <= A <</>> B (multi-cycle) |
constant alu_func_cmd_copro_c : std_ulogic_vector(1 downto 0) := "11"; -- r <= CP result (multi-cycle) |
|
-- Trap ID Codes -------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
-- MSB : 1 = async exception (IRQ); 0 = sync exception (eg. ebreak) |
-- MSB : 1 = async exception (IRQ); 0 = sync exception (e.g. ebreak) |
-- MSB-1 : 1 = entry to debug mode; 0 = normal trapping |
-- RISC-V compliant sync. exceptions -- |
constant trap_ima_c : std_ulogic_vector(6 downto 0) := "0" & "0" & "00000"; -- 0.0: instruction misaligned |
907,7 → 931,6
ON_CHIP_DEBUGGER_EN : boolean := false; -- implement on-chip debugger |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension? |
CPU_EXTENSION_RISCV_B : boolean := false; -- implement bit manipulation extensions? |
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension? |
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension? |
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension? |
925,7 → 948,7
PMP_MIN_GRANULARITY : natural := 64*1024; -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes |
-- Hardware Performance Monitors (HPM) -- |
HPM_NUM_CNTS : natural := 0; -- number of implemented HPM counters (0..29) |
HPM_CNT_WIDTH : natural := 40; -- total size of HPM counters (1..64) |
HPM_CNT_WIDTH : natural := 40; -- total size of HPM counters (0..64) |
-- Internal Instruction memory -- |
MEM_INT_IMEM_EN : boolean := true; -- implement processor-internal instruction memory |
MEM_INT_IMEM_SIZE : natural := 16*1024; -- size of processor-internal instruction memory in bytes |
948,7 → 971,7
IO_UART1_EN : boolean := true; -- implement secondary universal asynchronous receiver/transmitter (UART1)? |
IO_SPI_EN : boolean := true; -- implement serial peripheral interface (SPI)? |
IO_TWI_EN : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_EN : boolean := true; -- implement pulse-width modulation unit (PWM)? |
IO_PWM_NUM_CH : natural := 4; -- number of PWM channels to implement (0..60); 0 = disabled |
IO_WDT_EN : boolean := true; -- implement watch dog timer (WDT)? |
IO_TRNG_EN : boolean := false; -- implement true random number generator (TRNG)? |
IO_CFS_EN : boolean := false; -- implement custom functions subsystem (CFS)? |
1004,8 → 1027,8
-- TWI (available if IO_TWI_EN = true) -- |
twi_sda_io : inout std_logic; -- twi serial data line |
twi_scl_io : inout std_logic; -- twi serial clock line |
-- PWM (available if IO_PWM_EN = true) -- |
pwm_o : out std_ulogic_vector(03 downto 0); -- pwm channels |
-- PWM (available if IO_PWM_NUM_CH > 0) -- |
pwm_o : out std_ulogic_vector(IO_PWM_NUM_CH-1 downto 0); -- pwm channels |
-- Custom Functions Subsystem IO -- |
cfs_in_i : in std_ulogic_vector(IO_CFS_IN_SIZE-1 downto 0); -- custom CFS inputs conduit |
cfs_out_o : out std_ulogic_vector(IO_CFS_OUT_SIZE-1 downto 0); -- custom CFS outputs conduit |
1035,7 → 1058,6
CPU_DEBUG_ADDR : std_ulogic_vector(31 downto 0) := x"00000000"; -- cpu debug mode start address |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension? |
CPU_EXTENSION_RISCV_B : boolean := false; -- implement bit manipulation extensions? |
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension? |
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension? |
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension? |
1054,7 → 1076,7
PMP_MIN_GRANULARITY : natural := 64*1024; -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes |
-- Hardware Performance Monitors (HPM) -- |
HPM_NUM_CNTS : natural := 0; -- number of implemented HPM counters (0..29) |
HPM_CNT_WIDTH : natural := 40 -- total size of HPM counters (1..64) |
HPM_CNT_WIDTH : natural := 40 -- total size of HPM counters (0..64) |
); |
port ( |
-- global control -- |
1111,7 → 1133,6
CPU_DEBUG_ADDR : std_ulogic_vector(31 downto 0) := x"00000000"; -- cpu debug mode start address |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension? |
CPU_EXTENSION_RISCV_B : boolean := false; -- implement bit manipulation extensions? |
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension? |
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension? |
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension? |
1127,7 → 1148,7
PMP_MIN_GRANULARITY : natural := 64*1024; -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes |
-- Hardware Performance Monitors (HPM) -- |
HPM_NUM_CNTS : natural := 0; -- number of implemented HPM counters (0..29) |
HPM_CNT_WIDTH : natural := 40 -- total size of HPM counters (1..64) |
HPM_CNT_WIDTH : natural := 40 -- total size of HPM counters (0..64) |
); |
port ( |
-- global control -- |
1250,25 → 1271,6
); |
end component; |
|
-- Component: CPU Co-Processor Bit Manipulation ('B' extension) --------------------------- |
-- ------------------------------------------------------------------------------------------- |
component neorv32_cpu_cp_bitmanip |
port ( |
-- global control -- |
clk_i : in std_ulogic; -- global clock, rising edge |
rstn_i : in std_ulogic; -- global reset, low-active, async |
ctrl_i : in std_ulogic_vector(ctrl_width_c-1 downto 0); -- main control bus |
start_i : in std_ulogic; -- trigger operation |
-- data input -- |
cmp_i : in std_ulogic_vector(1 downto 0); -- comparator status |
rs1_i : in std_ulogic_vector(data_width_c-1 downto 0); -- rf source 1 |
rs2_i : in std_ulogic_vector(data_width_c-1 downto 0); -- rf source 2 |
-- result and status -- |
res_o : out std_ulogic_vector(data_width_c-1 downto 0); -- operation result |
valid_o : out std_ulogic -- data output valid |
); |
end component; |
|
-- Component: CPU Co-Processor 32-bit FPU ('Zfinx' extension) ----------------------------- |
-- ------------------------------------------------------------------------------------------- |
component neorv32_cpu_cp_fpu |
1530,18 → 1532,17
component neorv32_mtime |
port ( |
-- host access -- |
clk_i : in std_ulogic; -- global clock line |
rstn_i : in std_ulogic := '0'; -- global reset, low-active, async |
addr_i : in std_ulogic_vector(31 downto 0); -- address |
rden_i : in std_ulogic; -- read enable |
wren_i : in std_ulogic; -- write enable |
data_i : in std_ulogic_vector(31 downto 0); -- data in |
data_o : out std_ulogic_vector(31 downto 0); -- data out |
ack_o : out std_ulogic; -- transfer acknowledge |
clk_i : in std_ulogic; -- global clock line |
addr_i : in std_ulogic_vector(31 downto 0); -- address |
rden_i : in std_ulogic; -- read enable |
wren_i : in std_ulogic; -- write enable |
data_i : in std_ulogic_vector(31 downto 0); -- data in |
data_o : out std_ulogic_vector(31 downto 0); -- data out |
ack_o : out std_ulogic; -- transfer acknowledge |
-- time output for CPU -- |
time_o : out std_ulogic_vector(63 downto 0); -- current system time |
time_o : out std_ulogic_vector(63 downto 0); -- current system time |
-- interrupt -- |
irq_o : out std_ulogic -- interrupt request |
irq_o : out std_ulogic -- interrupt request |
); |
end component; |
|
1668,6 → 1669,9
-- Component: Pulse-Width Modulation Controller (PWM) ------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
component neorv32_pwm |
generic ( |
NUM_CHANNELS : natural := 4 -- number of PWM channels (0..60) |
); |
port ( |
-- host access -- |
clk_i : in std_ulogic; -- global clock line |
1681,7 → 1685,7
clkgen_en_o : out std_ulogic; -- enable clock generator |
clkgen_i : in std_ulogic_vector(07 downto 0); |
-- pwm output channels -- |
pwm_o : out std_ulogic_vector(03 downto 0) |
pwm_o : out std_ulogic_vector(NUM_CHANNELS-1 downto 0) |
); |
end component; |
|
1850,7 → 1854,7
IO_UART1_EN : boolean := true; -- implement secondary universal asynchronous receiver/transmitter (UART1)? |
IO_SPI_EN : boolean := true; -- implement serial peripheral interface (SPI)? |
IO_TWI_EN : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_EN : boolean := true; -- implement pulse-width modulation unit (PWM)? |
IO_PWM_NUM_CH : natural := 4; -- number of PWM channels to implement |
IO_WDT_EN : boolean := true; -- implement watch dog timer (WDT)? |
IO_TRNG_EN : boolean := true; -- implement true random number generator (TRNG)? |
IO_CFS_EN : boolean := true; -- implement custom functions subsystem (CFS)? |
2012,9 → 2016,9
end if; |
end function bool_to_ulogic_f; |
|
-- Function: OR all bits ------------------------------------------------------------------ |
-- Function: OR-reduce all bits ----------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
function or_all_f(a : std_ulogic_vector) return std_ulogic is |
function or_reduce_f(a : std_ulogic_vector) return std_ulogic is |
variable tmp_v : std_ulogic; |
begin |
tmp_v := '0'; |
2024,11 → 2028,11
end loop; -- i |
end if; |
return tmp_v; |
end function or_all_f; |
end function or_reduce_f; |
|
-- Function: AND all bits ----------------------------------------------------------------- |
-- Function: AND-reduce all bits ---------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
function and_all_f(a : std_ulogic_vector) return std_ulogic is |
function and_reduce_f(a : std_ulogic_vector) return std_ulogic is |
variable tmp_v : std_ulogic; |
begin |
tmp_v := '1'; |
2038,11 → 2042,11
end loop; -- i |
end if; |
return tmp_v; |
end function and_all_f; |
end function and_reduce_f; |
|
-- Function: XOR all bits ----------------------------------------------------------------- |
-- Function: XOR-reduce all bits ---------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
function xor_all_f(a : std_ulogic_vector) return std_ulogic is |
function xor_reduce_f(a : std_ulogic_vector) return std_ulogic is |
variable tmp_v : std_ulogic; |
begin |
tmp_v := '0'; |
2052,22 → 2056,8
end loop; -- i |
end if; |
return tmp_v; |
end function xor_all_f; |
end function xor_reduce_f; |
|
-- Function: XNOR all bits ---------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
function xnor_all_f(a : std_ulogic_vector) return std_ulogic is |
variable tmp_v : std_ulogic; |
begin |
tmp_v := '1'; |
if (a'low < a'high) then -- not null range? |
for i in a'low to a'high loop |
tmp_v := tmp_v xnor a(i); |
end loop; -- i |
end if; |
return tmp_v; |
end function xnor_all_f; |
|
-- Function: Convert std_ulogic_vector to hex char ---------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
function to_hexchar_f(input : std_ulogic_vector(3 downto 0)) return character is |
/neorv32_pwm.vhd
1,12 → 1,12
-- ################################################################################################# |
-- # << NEORV32 - Pulse Width Modulation Controller (PWM) >> # |
-- # ********************************************************************************************* # |
-- # Simple 4-channel PWM controller with 8 bit resolution for the duty cycle and programmable # |
-- # clock. # |
-- # Simple PWM controller with 8 bit resolution for the duty cycle and programmable base # |
-- # frequency. The controller supports up to 60 PWM channels. # |
-- # ********************************************************************************************* # |
-- # BSD 3-Clause License # |
-- # # |
-- # Copyright (c) 2020, Stephan Nolting. All rights reserved. # |
-- # Copyright (c) 2021, Stephan Nolting. All rights reserved. # |
-- # # |
-- # Redistribution and use in source and binary forms, with or without modification, are # |
-- # permitted provided that the following conditions are met: # |
43,6 → 43,9
use neorv32.neorv32_package.all; |
|
entity neorv32_pwm is |
generic ( |
NUM_CHANNELS : natural := 4 -- number of PWM channels (0..60) |
); |
port ( |
-- host access -- |
clk_i : in std_ulogic; -- global clock line |
56,15 → 59,12
clkgen_en_o : out std_ulogic; -- enable clock generator |
clkgen_i : in std_ulogic_vector(07 downto 0); |
-- pwm output channels -- |
pwm_o : out std_ulogic_vector(03 downto 0) |
pwm_o : out std_ulogic_vector(NUM_CHANNELS-1 downto 0) |
); |
end neorv32_pwm; |
|
architecture neorv32_pwm_rtl of neorv32_pwm is |
|
-- internal configuration -- |
constant num_pwm_channels_c : natural := 4; -- number of PWM channels, fixed! |
|
-- IO space: module base address -- |
constant hi_abb_c : natural := index_size_f(io_size_c)-1; -- high address boundary bit |
constant lo_abb_c : natural := index_size_f(pwm_size_c); -- low address boundary bit |
82,11 → 82,14
signal rden : std_ulogic; -- read enable |
|
-- accessible regs -- |
type pwm_ch_t is array (0 to num_pwm_channels_c-1) of std_ulogic_vector(7 downto 0); |
type pwm_ch_t is array (0 to NUM_CHANNELS-1) of std_ulogic_vector(7 downto 0); |
signal pwm_ch : pwm_ch_t; -- duty cycle (r/w) |
signal enable : std_ulogic; -- enable unit (r/w) |
signal prsc : std_ulogic_vector(2 downto 0); -- clock prescaler (r/w) |
|
type pwm_ch_rd_t is array (0 to 60-1) of std_ulogic_vector(7 downto 0); |
signal pwm_ch_rd : pwm_ch_rd_t; -- duty cycle read-back |
|
-- prescaler clock generator -- |
signal prsc_tick : std_ulogic; |
|
95,6 → 98,11
|
begin |
|
-- Sanity Checks -------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
assert not (NUM_CHANNELS > 60) report "NEORV32 PROCESSOR CONFIG ERROR! <IO.PWM> invalid number of channels! Has to be 0..60.!" severity error; |
|
|
-- Access Control ------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
acc_en <= '1' when (addr_i(hi_abb_c downto lo_abb_c) = pwm_base_c(hi_abb_c downto lo_abb_c)) else '0'; |
109,34 → 117,57
begin |
if rising_edge(clk_i) then |
ack_o <= acc_en and (rden_i or wren_i); |
|
-- write access -- |
if (wren = '1') then |
if (addr = pwm_ctrl_addr_c) then -- control register |
-- control register -- |
if (addr = pwm_ctrl_addr_c) then |
enable <= data_i(ctrl_enable_c); |
prsc <= data_i(ctrl_prsc2_bit_c downto ctrl_prsc0_bit_c); |
end if; |
if (addr = pwm_duty_addr_c) then -- duty cycle register |
for i in 0 to 3 loop |
pwm_ch(i) <= data_i(7+i*8 downto 0+i*8); |
end loop; |
end if; |
-- duty cycle registers -- |
for i in 0 to NUM_CHANNELS-1 loop -- channel loop |
if (addr(5 downto 2) = std_ulogic_vector(to_unsigned((i/4)+1, 4))) then -- 4 channels per register; add ctrl reg offset |
pwm_ch(i) <= data_i((i mod 4)*8+7 downto (i mod 4)*8+0); |
end if; |
end loop; |
end if; |
|
-- read access -- |
data_o <= (others => '0'); |
if (rden = '1') then |
if (addr = pwm_ctrl_addr_c) then |
data_o(ctrl_enable_c) <= enable; |
data_o(ctrl_prsc2_bit_c downto ctrl_prsc0_bit_c) <= prsc; |
else -- pwm_duty_addr_c |
data_o(07 downto 00) <= pwm_ch(0); |
data_o(15 downto 08) <= pwm_ch(1); |
data_o(23 downto 16) <= pwm_ch(2); |
data_o(31 downto 24) <= pwm_ch(3); |
end if; |
case addr(5 downto 2) is |
when x"0" => data_o(ctrl_enable_c) <= enable; data_o(ctrl_prsc2_bit_c downto ctrl_prsc0_bit_c) <= prsc; |
when x"1" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(3) & pwm_ch_rd(2) & pwm_ch_rd(1) & pwm_ch_rd(0); else NULL; end if; |
when x"2" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(7) & pwm_ch_rd(6) & pwm_ch_rd(5) & pwm_ch_rd(4); else NULL; end if; |
when x"3" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(11) & pwm_ch_rd(10) & pwm_ch_rd(9) & pwm_ch_rd(8); else NULL; end if; |
when x"4" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(15) & pwm_ch_rd(14) & pwm_ch_rd(13) & pwm_ch_rd(12); else NULL; end if; |
when x"5" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(19) & pwm_ch_rd(18) & pwm_ch_rd(17) & pwm_ch_rd(16); else NULL; end if; |
when x"6" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(23) & pwm_ch_rd(22) & pwm_ch_rd(21) & pwm_ch_rd(20); else NULL; end if; |
when x"7" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(27) & pwm_ch_rd(26) & pwm_ch_rd(25) & pwm_ch_rd(24); else NULL; end if; |
when x"8" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(31) & pwm_ch_rd(30) & pwm_ch_rd(29) & pwm_ch_rd(28); else NULL; end if; |
when x"9" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(35) & pwm_ch_rd(34) & pwm_ch_rd(33) & pwm_ch_rd(32); else NULL; end if; |
when x"a" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(39) & pwm_ch_rd(38) & pwm_ch_rd(37) & pwm_ch_rd(36); else NULL; end if; |
when x"b" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(43) & pwm_ch_rd(42) & pwm_ch_rd(41) & pwm_ch_rd(40); else NULL; end if; |
when x"c" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(47) & pwm_ch_rd(46) & pwm_ch_rd(45) & pwm_ch_rd(44); else NULL; end if; |
when x"d" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(51) & pwm_ch_rd(50) & pwm_ch_rd(49) & pwm_ch_rd(48); else NULL; end if; |
when x"e" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(55) & pwm_ch_rd(54) & pwm_ch_rd(53) & pwm_ch_rd(52); else NULL; end if; |
when x"f" => if (NUM_CHANNELS > 0) then data_o <= pwm_ch_rd(59) & pwm_ch_rd(58) & pwm_ch_rd(57) & pwm_ch_rd(56); else NULL; end if; |
when others => NULL; |
end case; |
end if; |
end if; |
end process wr_access; |
|
-- duty cycle read-back -- |
pwm_dc_rd_gen: process(pwm_ch) |
begin |
pwm_ch_rd <= (others => (others => '0')); |
for i in 0 to NUM_CHANNELS-1 loop |
pwm_ch_rd(i) <= pwm_ch(i); |
end loop; |
end process pwm_dc_rd_gen; |
|
-- PWM clock select -- |
clkgen_en_o <= enable; -- enable clock generator |
prsc_tick <= clkgen_i(to_integer(unsigned(prsc))); |
147,20 → 178,26
pwm_core: process(clk_i) |
begin |
if rising_edge(clk_i) then |
-- pwm counter -- |
-- pwm base counter -- |
if (enable = '0') then |
pwm_cnt <= (others => '0'); |
elsif (prsc_tick = '1') then |
pwm_cnt <= std_ulogic_vector(unsigned(pwm_cnt) + 1); |
end if; |
|
-- channels -- |
for i in 0 to num_pwm_channels_c-1 loop |
for i in 0 to NUM_CHANNELS-1 loop |
--if (pwm_cnt = pwm_ch(i)) or (pwm_ch(i) = x"00") or (enable = '0') then |
-- pwm_o(i) <= '0'; |
--elsif (pwm_cnt = x"00") then |
-- pwm_o(i) <= '1'; |
--end if; |
if (unsigned(pwm_cnt) >= unsigned(pwm_ch(i))) or (enable = '0') then |
pwm_o(i) <= '0'; |
else |
pwm_o(i) <= '1'; |
end if; |
end loop; -- i, pwm channel |
end loop; |
end if; |
end process pwm_core; |
|
/neorv32_sysinfo.vhd
71,7 → 71,7
IO_UART1_EN : boolean := true; -- implement secondary universal asynchronous receiver/transmitter (UART1)? |
IO_SPI_EN : boolean := true; -- implement serial peripheral interface (SPI)? |
IO_TWI_EN : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_EN : boolean := true; -- implement pulse-width modulation unit (PWM)? |
IO_PWM_NUM_CH : natural := 4; -- number of PWM channels to implement |
IO_WDT_EN : boolean := true; -- implement watch dog timer (WDT)? |
IO_TRNG_EN : boolean := true; -- implement true random number generator (TRNG)? |
IO_CFS_EN : boolean := true; -- implement custom functions subsystem (CFS)? |
143,7 → 143,7
sysinfo_mem(2)(18) <= bool_to_ulogic_f(IO_UART0_EN); -- primary universal asynchronous receiver/transmitter (UART0) implemented? |
sysinfo_mem(2)(19) <= bool_to_ulogic_f(IO_SPI_EN); -- serial peripheral interface (SPI) implemented? |
sysinfo_mem(2)(20) <= bool_to_ulogic_f(IO_TWI_EN); -- two-wire interface (TWI) implemented? |
sysinfo_mem(2)(21) <= bool_to_ulogic_f(IO_PWM_EN); -- pulse-width modulation unit (PWM) implemented? |
sysinfo_mem(2)(21) <= bool_to_ulogic_f(boolean(IO_PWM_NUM_CH > 0)); -- pulse-width modulation unit (PWM) implemented? |
sysinfo_mem(2)(22) <= bool_to_ulogic_f(IO_WDT_EN); -- watch dog timer (WDT) implemented? |
sysinfo_mem(2)(23) <= bool_to_ulogic_f(IO_CFS_EN); -- custom functions subsystem (CFS) implemented? |
sysinfo_mem(2)(24) <= bool_to_ulogic_f(IO_TRNG_EN); -- true random number generator (TRNG) implemented? |
/neorv32_top.vhd
58,7 → 58,6
|
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_A : boolean := false; -- implement atomic extension? |
CPU_EXTENSION_RISCV_B : boolean := false; -- implement bit manipulation extensions? |
CPU_EXTENSION_RISCV_C : boolean := false; -- implement compressed extension? |
CPU_EXTENSION_RISCV_E : boolean := false; -- implement embedded RF extension? |
CPU_EXTENSION_RISCV_M : boolean := false; -- implement muld/div extension? |
79,7 → 78,7
|
-- Hardware Performance Monitors (HPM) -- |
HPM_NUM_CNTS : natural := 0; -- number of implemented HPM counters (0..29) |
HPM_CNT_WIDTH : natural := 40; -- total size of HPM counters (1..64) |
HPM_CNT_WIDTH : natural := 40; -- total size of HPM counters (0..64) |
|
-- Internal Instruction memory -- |
MEM_INT_IMEM_EN : boolean := true; -- implement processor-internal instruction memory |
107,7 → 106,7
IO_UART1_EN : boolean := true; -- implement secondary universal asynchronous receiver/transmitter (UART1)? |
IO_SPI_EN : boolean := true; -- implement serial peripheral interface (SPI)? |
IO_TWI_EN : boolean := true; -- implement two-wire interface (TWI)? |
IO_PWM_EN : boolean := true; -- implement pulse-width modulation unit (PWM)? |
IO_PWM_NUM_CH : natural := 4; -- number of PWM channels to implement (0..60); 0 = disabled |
IO_WDT_EN : boolean := true; -- implement watch dog timer (WDT)? |
IO_TRNG_EN : boolean := false; -- implement true random number generator (TRNG)? |
IO_CFS_EN : boolean := false; -- implement custom functions subsystem (CFS)? |
172,8 → 171,8
twi_sda_io : inout std_logic; -- twi serial data line |
twi_scl_io : inout std_logic; -- twi serial clock line |
|
-- PWM (available if IO_PWM_EN = true) -- |
pwm_o : out std_ulogic_vector(03 downto 0); -- pwm channels |
-- PWM (available if IO_PWM_NUM_CH > 0) -- |
pwm_o : out std_ulogic_vector(IO_PWM_NUM_CH-1 downto 0); -- pwm channels |
|
-- Custom Functions Subsystem IO (available if IO_CFS_EN = true) -- |
cfs_in_i : in std_ulogic_vector(IO_CFS_IN_SIZE-1 downto 0); -- custom CFS inputs conduit |
208,13 → 207,10
constant dmem_align_check_c : std_ulogic_vector(index_size_f(MEM_INT_DMEM_SIZE)-1 downto 0) := (others => '0'); |
|
-- reset generator -- |
signal rstn_i_sync0 : std_ulogic; |
signal rstn_i_sync1 : std_ulogic; |
signal rstn_i_sync2 : std_ulogic; |
signal rstn_gen : std_ulogic_vector(3 downto 0); |
signal ext_rstn : std_ulogic; |
signal sys_rstn : std_ulogic; |
signal wdt_rstn : std_ulogic; |
signal rstn_gen : std_ulogic_vector(7 downto 0); |
signal ext_rstn : std_ulogic; |
signal sys_rstn : std_ulogic; |
signal wdt_rstn : std_ulogic; |
|
-- clock generator -- |
signal clk_div : std_ulogic_vector(11 downto 0); |
273,52 → 269,26
signal io_rden : std_ulogic; |
signal io_wren : std_ulogic; |
|
-- read-back buses - |
signal imem_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal imem_ack : std_ulogic; |
signal dmem_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal dmem_ack : std_ulogic; |
signal bootrom_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal bootrom_ack : std_ulogic; |
signal wishbone_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal wishbone_ack : std_ulogic; |
signal wishbone_err : std_ulogic; |
signal gpio_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal gpio_ack : std_ulogic; |
signal mtime_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal mtime_ack : std_ulogic; |
signal uart0_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal uart0_ack : std_ulogic; |
signal uart1_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal uart1_ack : std_ulogic; |
signal spi_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal spi_ack : std_ulogic; |
signal twi_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal twi_ack : std_ulogic; |
signal pwm_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal pwm_ack : std_ulogic; |
signal wdt_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal wdt_ack : std_ulogic; |
signal trng_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal trng_ack : std_ulogic; |
signal cfs_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal cfs_ack : std_ulogic; |
signal nco_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal nco_ack : std_ulogic; |
signal neoled_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal neoled_ack : std_ulogic; |
signal sysinfo_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal sysinfo_ack : std_ulogic; |
signal bus_keeper_err : std_ulogic; |
signal dm_rdata : std_ulogic_vector(data_width_c-1 downto 0); |
signal dm_ack : std_ulogic; |
-- module response bus - entry type -- |
type resp_bus_entry_t is record |
rdata : std_ulogic_vector(data_width_c-1 downto 0); |
ack : std_ulogic; |
err : std_ulogic; |
end record; |
constant resp_bus_entry_terminate_c : resp_bus_entry_t := (rdata => (others => '0'), ack => '0', err => '0'); |
|
-- module response bus - device ID -- |
type resp_bus_id_t is (RESP_IMEM, RESP_DMEM, RESP_BOOTROM, RESP_WISHBONE, RESP_GPIO, RESP_MTIME, RESP_UART0, RESP_UART1, RESP_SPI, |
RESP_TWI, RESP_PWM, RESP_WDT, RESP_TRNG, RESP_CFS, RESP_NCO, RESP_NEOLED, RESP_SYSINFO, RESP_OCD); |
|
-- module response bus -- |
type resp_bus_t is array (resp_bus_id_t) of resp_bus_entry_t; |
signal resp_bus : resp_bus_t := (others => resp_bus_entry_terminate_c); |
|
-- IRQs -- |
signal mtime_irq : std_ulogic; |
-- |
signal fast_irq : std_ulogic_vector(15 downto 0); |
signal fast_irq_ack : std_ulogic_vector(15 downto 0); |
-- |
signal mtime_irq : std_ulogic; |
signal gpio_irq : std_ulogic; |
signal wdt_irq : std_ulogic; |
signal uart0_rxd_irq : std_ulogic; |
332,8 → 302,9
signal neoled_irq : std_ulogic; |
|
-- misc -- |
signal mtime_time : std_ulogic_vector(63 downto 0); -- current system time from MTIME |
signal cpu_sleep : std_ulogic; -- CPU is in sleep mode when set |
signal mtime_time : std_ulogic_vector(63 downto 0); -- current system time from MTIME |
signal cpu_sleep : std_ulogic; -- CPU is in sleep mode when set |
signal bus_keeper_err : std_ulogic; -- bus keeper: bus access timeout |
|
begin |
|
366,45 → 337,32
|
-- Reset Generator ------------------------------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
reset_generator_sync: process(clk_i) |
reset_generator: process(rstn_i, clk_i) |
begin |
-- make sure the external reset is free of metastability and has a minimal duration of 1 clock cycle |
if rising_edge(clk_i) then |
rstn_i_sync0 <= rstn_i; |
rstn_i_sync1 <= rstn_i_sync0; |
rstn_i_sync2 <= rstn_i_sync1; |
end if; |
end process reset_generator_sync; |
|
-- keep internal reset active for at least 4 clock cycles |
reset_generator: process(rstn_i_sync1, rstn_i_sync2, clk_i) |
begin |
if ((rstn_i_sync1 and rstn_i_sync2) = '0') then -- signal stable? |
if (rstn_i = '0') then |
rstn_gen <= (others => '0'); |
sys_rstn <= '0'; |
elsif rising_edge(clk_i) then |
-- keep internal reset active for at least <rstn_gen'size> clock cycles -- |
rstn_gen <= rstn_gen(rstn_gen'left-1 downto 0) & '1'; |
-- system reset: can also be triggered by watchdog and debug module -- |
sys_rstn <= ext_rstn and wdt_rstn and dci_ndmrstn; |
end if; |
end process reset_generator; |
|
ext_rstn <= rstn_gen(rstn_gen'left); -- the beautified external reset signal |
-- beautified external reset signal -- |
ext_rstn <= rstn_gen(rstn_gen'left); |
|
-- internal reset buffer -- |
soc_reset_generator: process(clk_i) |
begin |
if rising_edge(clk_i) then |
sys_rstn <= ext_rstn and wdt_rstn and dci_ndmrstn; -- system reset: can also be triggered by watchdog and debug module |
end if; |
end process soc_reset_generator; |
|
|
-- Clock Generator ------------------------------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
clock_generator: process(sys_rstn, clk_i) |
begin |
if (sys_rstn = '0') then |
clk_gen_en <= (others => '-'); |
clk_div <= (others => '0'); |
clk_div_ff <= (others => '0'); |
clk_gen_en <= (others => '0'); |
clk_div_ff <= (others => '-'); |
clk_gen <= (others => '-'); |
elsif rising_edge(clk_i) then |
-- fresh clocks anyone? -- |
clk_gen_en(0) <= wdt_cg_en; |
416,17 → 374,12
clk_gen_en(6) <= cfs_cg_en; |
clk_gen_en(7) <= nco_cg_en; |
clk_gen_en(8) <= neoled_cg_en; |
if (or_all_f(clk_gen_en) = '1') then |
-- actual clock generator -- |
if (or_reduce_f(clk_gen_en) = '1') then |
clk_div <= std_ulogic_vector(unsigned(clk_div) + 1); |
end if; |
-- clock enables: rising edge detectors -- |
clk_div_ff <= clk_div; |
end if; |
end process clock_generator; |
|
-- clock enables: rising edge detectors -- |
clock_generator_edge: process(clk_i) |
begin |
if rising_edge(clk_i) then |
clk_gen(clk_div2_c) <= clk_div(0) and (not clk_div_ff(0)); -- CLK/2 |
clk_gen(clk_div4_c) <= clk_div(1) and (not clk_div_ff(1)); -- CLK/4 |
clk_gen(clk_div8_c) <= clk_div(2) and (not clk_div_ff(2)); -- CLK/8 |
436,7 → 389,7
clk_gen(clk_div2048_c) <= clk_div(10) and (not clk_div_ff(10)); -- CLK/2048 |
clk_gen(clk_div4096_c) <= clk_div(11) and (not clk_div_ff(11)); -- CLK/4096 |
end if; |
end process clock_generator_edge; |
end process clock_generator; |
|
|
-- CPU Core ------------------------------------------------------------------------------- |
449,7 → 402,6
CPU_DEBUG_ADDR => dm_base_c, -- cpu debug mode start address |
-- RISC-V CPU Extensions -- |
CPU_EXTENSION_RISCV_A => CPU_EXTENSION_RISCV_A, -- implement atomic extension? |
CPU_EXTENSION_RISCV_B => CPU_EXTENSION_RISCV_B, -- implement bit manipulation extensions? |
CPU_EXTENSION_RISCV_C => CPU_EXTENSION_RISCV_C, -- implement compressed extension? |
CPU_EXTENSION_RISCV_E => CPU_EXTENSION_RISCV_E, -- implement embedded RF extension? |
CPU_EXTENSION_RISCV_M => CPU_EXTENSION_RISCV_M, -- implement muld/div extension? |
467,7 → 419,7
PMP_MIN_GRANULARITY => PMP_MIN_GRANULARITY, -- minimal region granularity in bytes, has to be a power of 2, min 8 bytes |
-- Hardware Performance Monitors (HPM) -- |
HPM_NUM_CNTS => HPM_NUM_CNTS, -- number of implemented HPM counters (0..29) |
HPM_CNT_WIDTH => HPM_CNT_WIDTH -- total size of HPM counters (1..64) |
HPM_CNT_WIDTH => HPM_CNT_WIDTH -- total size of HPM counters (0..64) |
) |
port map ( |
-- global control -- |
646,21 → 598,32
p_bus_err_i => p_bus.err -- bus transfer error |
); |
|
-- static signals -- |
p_bus.priv <= cpu_i.priv; -- current CPU privilege level: cpu_i.priv == cpu_d.priv |
-- current CPU privilege level -- |
p_bus.priv <= cpu_i.priv; -- note: cpu_i.priv == cpu_d.priv |
|
-- processor bus: CPU transfer data input -- |
p_bus.rdata <= (imem_rdata or dmem_rdata or bootrom_rdata) or wishbone_rdata or (gpio_rdata or mtime_rdata or uart0_rdata or uart1_rdata or |
spi_rdata or twi_rdata or pwm_rdata or wdt_rdata or trng_rdata or cfs_rdata or nco_rdata or neoled_rdata or sysinfo_rdata) or dm_rdata; |
-- fence operation (unused) -- |
p_bus.fence <= cpu_d.fence or cpu_i.fence; |
|
-- processor bus: CPU transfer ACK input -- |
p_bus.ack <= (imem_ack or dmem_ack or bootrom_ack) or wishbone_ack or (gpio_ack or mtime_ack or uart0_ack or uart1_ack or |
spi_ack or twi_ack or pwm_ack or wdt_ack or trng_ack or cfs_ack or nco_ack or neoled_ack or sysinfo_ack) or dm_ack; |
-- bus response -- |
bus_response: process(resp_bus, bus_keeper_err) |
variable rdata_v : std_ulogic_vector(data_width_c-1 downto 0); |
variable ack_v : std_ulogic; |
variable err_v : std_ulogic; |
begin |
rdata_v := (others => '0'); |
ack_v := '0'; |
err_v := '0'; |
for i in resp_bus'range loop |
rdata_v := rdata_v or resp_bus(i).rdata; -- read data |
ack_v := ack_v or resp_bus(i).ack; -- acknowledge |
err_v := err_v or resp_bus(i).err; -- error |
end loop; -- i |
p_bus.rdata <= rdata_v; -- processor bus: CPU transfer data input |
p_bus.ack <= ack_v; -- processor bus: CPU transfer ACK input |
p_bus.err <= err_v or bus_keeper_err; -- processor bus: CPU transfer data bus error input |
end process; |
|
-- processor bus: CPU transfer data bus error input -- |
p_bus.err <= bus_keeper_err or wishbone_err; |
|
|
-- Processor-Internal Bus Keeper (BUS_KEEPER) --------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
neorv32_bus_keeper_inst: neorv32_bus_keeper |
699,21 → 662,21
BOOTLOADER_EN => BOOTLOADER_EN -- implement and use bootloader? |
) |
port map ( |
clk_i => clk_i, -- global clock line |
rden_i => p_bus.re, -- read enable |
wren_i => p_bus.we, -- write enable |
ben_i => p_bus.ben, -- byte write enable |
addr_i => p_bus.addr, -- address |
data_i => p_bus.wdata, -- data in |
data_o => imem_rdata, -- data out |
ack_o => imem_ack -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
rden_i => p_bus.re, -- read enable |
wren_i => p_bus.we, -- write enable |
ben_i => p_bus.ben, -- byte write enable |
addr_i => p_bus.addr, -- address |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_IMEM).rdata, -- data out |
ack_o => resp_bus(RESP_IMEM).ack -- transfer acknowledge |
); |
resp_bus(RESP_IMEM).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_int_imem_inst_false: |
if (MEM_INT_IMEM_EN = false) generate |
imem_rdata <= (others => '0'); |
imem_ack <= '0'; |
resp_bus(RESP_IMEM) <= resp_bus_entry_terminate_c; |
end generate; |
|
|
727,21 → 690,21
DMEM_SIZE => MEM_INT_DMEM_SIZE -- processor-internal data memory size in bytes |
) |
port map ( |
clk_i => clk_i, -- global clock line |
rden_i => p_bus.re, -- read enable |
wren_i => p_bus.we, -- write enable |
ben_i => p_bus.ben, -- byte write enable |
addr_i => p_bus.addr, -- address |
data_i => p_bus.wdata, -- data in |
data_o => dmem_rdata, -- data out |
ack_o => dmem_ack -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
rden_i => p_bus.re, -- read enable |
wren_i => p_bus.we, -- write enable |
ben_i => p_bus.ben, -- byte write enable |
addr_i => p_bus.addr, -- address |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_DMEM).rdata, -- data out |
ack_o => resp_bus(RESP_DMEM).ack -- transfer acknowledge |
); |
resp_bus(RESP_DMEM).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_int_dmem_inst_false: |
if (MEM_INT_DMEM_EN = false) generate |
dmem_rdata <= (others => '0'); |
dmem_ack <= '0'; |
resp_bus(RESP_DMEM) <= resp_bus_entry_terminate_c; |
end generate; |
|
|
755,18 → 718,18
BOOTROM_SIZE => boot_rom_size_c -- processor-internal boot TOM memory size in bytes |
) |
port map ( |
clk_i => clk_i, -- global clock line |
rden_i => p_bus.re, -- read enable |
addr_i => p_bus.addr, -- address |
data_o => bootrom_rdata, -- data out |
ack_o => bootrom_ack -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
rden_i => p_bus.re, -- read enable |
addr_i => p_bus.addr, -- address |
data_o => resp_bus(RESP_BOOTROM).rdata, -- data out |
ack_o => resp_bus(RESP_BOOTROM).ack -- transfer acknowledge |
); |
resp_bus(RESP_BOOTROM).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_boot_rom_inst_false: |
if (BOOTLOADER_EN = false) generate |
bootrom_rdata <= (others => '0'); |
bootrom_ack <= '0'; |
resp_bus(RESP_BOOTROM) <= resp_bus_entry_terminate_c; |
end generate; |
|
|
788,48 → 751,47
) |
port map ( |
-- global control -- |
clk_i => clk_i, -- global clock line |
rstn_i => sys_rstn, -- global reset line, low-active |
clk_i => clk_i, -- global clock line |
rstn_i => sys_rstn, -- global reset line, low-active |
-- host access -- |
src_i => p_bus.src, -- access type (0: data, 1:instruction) |
addr_i => p_bus.addr, -- address |
rden_i => p_bus.re, -- read enable |
wren_i => p_bus.we, -- write enable |
ben_i => p_bus.ben, -- byte write enable |
data_i => p_bus.wdata, -- data in |
data_o => wishbone_rdata, -- data out |
lock_i => p_bus.lock, -- exclusive access request |
ack_o => wishbone_ack, -- transfer acknowledge |
err_o => wishbone_err, -- transfer error |
priv_i => p_bus.priv, -- current CPU privilege level |
src_i => p_bus.src, -- access type (0: data, 1:instruction) |
addr_i => p_bus.addr, -- address |
rden_i => p_bus.re, -- read enable |
wren_i => p_bus.we, -- write enable |
ben_i => p_bus.ben, -- byte write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_WISHBONE).rdata, -- data out |
lock_i => p_bus.lock, -- exclusive access request |
ack_o => resp_bus(RESP_WISHBONE).ack, -- transfer acknowledge |
err_o => resp_bus(RESP_WISHBONE).err, -- transfer error |
priv_i => p_bus.priv, -- current CPU privilege level |
-- wishbone interface -- |
wb_tag_o => wb_tag_o, -- request tag |
wb_adr_o => wb_adr_o, -- address |
wb_dat_i => wb_dat_i, -- read data |
wb_dat_o => wb_dat_o, -- write data |
wb_we_o => wb_we_o, -- read/write |
wb_sel_o => wb_sel_o, -- byte enable |
wb_stb_o => wb_stb_o, -- strobe |
wb_cyc_o => wb_cyc_o, -- valid cycle |
wb_lock_o => wb_lock_o, -- exclusive access request |
wb_ack_i => wb_ack_i, -- transfer acknowledge |
wb_err_i => wb_err_i -- transfer error |
wb_tag_o => wb_tag_o, -- request tag |
wb_adr_o => wb_adr_o, -- address |
wb_dat_i => wb_dat_i, -- read data |
wb_dat_o => wb_dat_o, -- write data |
wb_we_o => wb_we_o, -- read/write |
wb_sel_o => wb_sel_o, -- byte enable |
wb_stb_o => wb_stb_o, -- strobe |
wb_cyc_o => wb_cyc_o, -- valid cycle |
wb_lock_o => wb_lock_o, -- exclusive access request |
wb_ack_i => wb_ack_i, -- transfer acknowledge |
wb_err_i => wb_err_i -- transfer error |
); |
end generate; |
|
neorv32_wishbone_inst_false: |
if (MEM_EXT_EN = false) generate |
wishbone_rdata <= (others => '0'); |
wishbone_ack <= '0'; |
wishbone_err <= '0'; |
resp_bus(RESP_WISHBONE) <= resp_bus_entry_terminate_c; |
-- |
wb_adr_o <= (others => '0'); |
wb_dat_o <= (others => '0'); |
wb_we_o <= '0'; |
wb_sel_o <= (others => '0'); |
wb_stb_o <= '0'; |
wb_cyc_o <= '0'; |
wb_tag_o <= (others => '0'); |
wb_adr_o <= (others => '0'); |
wb_dat_o <= (others => '0'); |
wb_we_o <= '0'; |
wb_sel_o <= (others => '0'); |
wb_stb_o <= '0'; |
wb_cyc_o <= '0'; |
wb_lock_o <= '0'; |
wb_tag_o <= (others => '0'); |
end generate; |
|
|
838,7 → 800,7
io_acc <= '1' when (p_bus.addr(data_width_c-1 downto index_size_f(io_size_c)) = io_base_c(data_width_c-1 downto index_size_f(io_size_c))) else '0'; |
io_rden <= io_acc and p_bus.re and (not p_bus.src); -- PMA: no_execute for IO region |
-- the default NEORV32 peripheral/IO devices in the IO area can only be written in word mode (reduces HW complexity) |
io_wren <= io_acc and p_bus.we and and_all_f(p_bus.ben) and (not p_bus.src); -- PMA: write32 only, no_execute for IO region |
io_wren <= io_acc and p_bus.we and and_reduce_f(p_bus.ben) and (not p_bus.src); -- PMA: write32 only, no_execute for IO region |
|
|
-- Custom Functions Subsystem (CFS) ------------------------------------------------------- |
853,32 → 815,32
) |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
rstn_i => sys_rstn, -- global reset line, low-active, use as async |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- byte write enable |
data_i => p_bus.wdata, -- data in |
data_o => cfs_rdata, -- data out |
ack_o => cfs_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
rstn_i => sys_rstn, -- global reset line, low-active, use as async |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- byte write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_CFS).rdata, -- data out |
ack_o => resp_bus(RESP_CFS).ack, -- transfer acknowledge |
-- clock generator -- |
clkgen_en_o => cfs_cg_en, -- enable clock generator |
clkgen_i => clk_gen, -- "clock" inputs |
clkgen_en_o => cfs_cg_en, -- enable clock generator |
clkgen_i => clk_gen, -- "clock" inputs |
-- CPU state -- |
sleep_i => cpu_sleep, -- set if cpu is in sleep mode |
sleep_i => cpu_sleep, -- set if cpu is in sleep mode |
-- interrupt -- |
irq_o => cfs_irq, -- interrupt request |
irq_ack_i => cfs_irq_ack, -- interrupt acknowledge |
irq_o => cfs_irq, -- interrupt request |
irq_ack_i => cfs_irq_ack, -- interrupt acknowledge |
-- custom io (conduit) -- |
cfs_in_i => cfs_in_i, -- custom inputs |
cfs_out_o => cfs_out_o -- custom outputs |
cfs_in_i => cfs_in_i, -- custom inputs |
cfs_out_o => cfs_out_o -- custom outputs |
); |
resp_bus(RESP_CFS).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_cfs_inst_false: |
if (IO_CFS_EN = false) generate |
cfs_rdata <= (others => '0'); |
cfs_ack <= '0'; |
resp_bus(RESP_CFS) <= resp_bus_entry_terminate_c; |
cfs_cg_en <= '0'; |
cfs_irq <= '0'; |
cfs_out_o <= (others => '0'); |
892,27 → 854,27
neorv32_gpio_inst: neorv32_gpio |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => gpio_rdata, -- data out |
ack_o => gpio_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_GPIO).rdata, -- data out |
ack_o => resp_bus(RESP_GPIO).ack, -- transfer acknowledge |
-- parallel io -- |
gpio_o => gpio_o, |
gpio_i => gpio_i, |
-- interrupt -- |
irq_o => gpio_irq -- pin-change interrupt |
irq_o => gpio_irq -- pin-change interrupt |
); |
resp_bus(RESP_GPIO).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_gpio_inst_false: |
if (IO_GPIO_EN = false) generate |
gpio_rdata <= (others => '0'); |
gpio_ack <= '0'; |
gpio_o <= (others => '0'); |
gpio_irq <= '0'; |
resp_bus(RESP_GPIO) <= resp_bus_entry_terminate_c; |
gpio_o <= (others => '0'); |
gpio_irq <= '0'; |
end generate; |
|
|
923,27 → 885,27
neorv32_wdt_inst: neorv32_wdt |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
rstn_i => ext_rstn, -- global reset line, low-active |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
addr_i => p_bus.addr, -- address |
data_i => p_bus.wdata, -- data in |
data_o => wdt_rdata, -- data out |
ack_o => wdt_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
rstn_i => ext_rstn, -- global reset line, low-active |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
addr_i => p_bus.addr, -- address |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_WDT).rdata, -- data out |
ack_o => resp_bus(RESP_WDT).ack, -- transfer acknowledge |
-- clock generator -- |
clkgen_en_o => wdt_cg_en, -- enable clock generator |
clkgen_en_o => wdt_cg_en, -- enable clock generator |
clkgen_i => clk_gen, |
-- timeout event -- |
irq_o => wdt_irq, -- timeout IRQ |
rstn_o => wdt_rstn -- timeout reset, low_active, use it as async! |
irq_o => wdt_irq, -- timeout IRQ |
rstn_o => wdt_rstn -- timeout reset, low_active, use it as async! |
); |
resp_bus(RESP_WDT).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_wdt_inst_false: |
if (IO_WDT_EN = false) generate |
wdt_rdata <= (others => '0'); |
wdt_ack <= '0'; |
resp_bus(RESP_WDT) <= resp_bus_entry_terminate_c; |
wdt_irq <= '0'; |
wdt_rstn <= '1'; |
wdt_cg_en <= '0'; |
957,32 → 919,49
neorv32_mtime_inst: neorv32_mtime |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
rstn_i => sys_rstn, -- global reset, low-active, async |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => mtime_rdata, -- data out |
ack_o => mtime_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_MTIME).rdata, -- data out |
ack_o => resp_bus(RESP_MTIME).ack, -- transfer acknowledge |
-- time output for CPU -- |
time_o => mtime_time, -- current system time |
time_o => mtime_time, -- current system time |
-- interrupt -- |
irq_o => mtime_irq -- interrupt request |
irq_o => mtime_irq -- interrupt request |
); |
resp_bus(RESP_MTIME).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_mtime_inst_false: |
if (IO_MTIME_EN = false) generate |
mtime_rdata <= (others => '0'); |
mtime_time <= mtime_i; -- use external machine timer time signal |
mtime_ack <= '0'; |
mtime_irq <= mtime_irq_i; -- use external machine timer interrupt |
resp_bus(RESP_MTIME) <= resp_bus_entry_terminate_c; |
mtime_time <= mtime_i; -- use external machine timer time signal |
mtime_irq <= mtime_irq_i; -- use external machine timer interrupt |
end generate; |
|
mtime_o <= mtime_time when (IO_MTIME_EN = true) else (others => '0'); -- system time output |
|
-- system time output LO -- |
mtime_sync: process(clk_i) |
begin |
if rising_edge(clk_i) then |
-- buffer low word one clock cycle to compensate for MTIME's 1-cycle delay |
-- when overflowing from low-word to high-word -> only relevant for processor-external devices |
-- processor-internal devices (= the CPU) do not care about this delay offset as 64-bit MTIME.TIME |
-- cannot be accessed within a single cycle |
if (IO_MTIME_EN = true) then |
mtime_o(31 downto 0) <= mtime_time(31 downto 0); |
else |
mtime_o(31 downto 0) <= (others => '0'); |
end if; |
end if; |
end process mtime_sync; |
|
-- system time output HI -- |
mtime_o(63 downto 32) <= mtime_time(63 downto 32) when (IO_MTIME_EN = true) else (others => '0'); |
|
|
-- Primary Universal Asynchronous Receiver/Transmitter (UART0) ---------------------------- |
-- ------------------------------------------------------------------------------------------- |
neorv32_uart0_inst_true: |
993,32 → 972,32
) |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => uart0_rdata, -- data out |
ack_o => uart0_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_UART0).rdata, -- data out |
ack_o => resp_bus(RESP_UART0).ack, -- transfer acknowledge |
-- clock generator -- |
clkgen_en_o => uart0_cg_en, -- enable clock generator |
clkgen_en_o => uart0_cg_en, -- enable clock generator |
clkgen_i => clk_gen, |
-- com lines -- |
uart_txd_o => uart0_txd_o, |
uart_rxd_i => uart0_rxd_i, |
-- hardware flow control -- |
uart_rts_o => uart0_rts_o, -- UART.RX ready to receive ("RTR"), low-active, optional |
uart_cts_i => uart0_cts_i, -- UART.TX allowed to transmit, low-active, optional |
uart_rts_o => uart0_rts_o, -- UART.RX ready to receive ("RTR"), low-active, optional |
uart_cts_i => uart0_cts_i, -- UART.TX allowed to transmit, low-active, optional |
-- interrupts -- |
irq_rxd_o => uart0_rxd_irq, -- uart data received interrupt |
irq_txd_o => uart0_txd_irq -- uart transmission done interrupt |
irq_rxd_o => uart0_rxd_irq, -- uart data received interrupt |
irq_txd_o => uart0_txd_irq -- uart transmission done interrupt |
); |
resp_bus(RESP_UART0).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_uart0_inst_false: |
if (IO_UART0_EN = false) generate |
uart0_rdata <= (others => '0'); |
uart0_ack <= '0'; |
resp_bus(RESP_UART0) <= resp_bus_entry_terminate_c; |
uart0_txd_o <= '0'; |
uart0_rts_o <= '0'; |
uart0_cg_en <= '0'; |
1037,32 → 1016,32
) |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => uart1_rdata, -- data out |
ack_o => uart1_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_UART1).rdata, -- data out |
ack_o => resp_bus(RESP_UART1).ack, -- transfer acknowledge |
-- clock generator -- |
clkgen_en_o => uart1_cg_en, -- enable clock generator |
clkgen_en_o => uart1_cg_en, -- enable clock generator |
clkgen_i => clk_gen, |
-- com lines -- |
uart_txd_o => uart1_txd_o, |
uart_rxd_i => uart1_rxd_i, |
-- hardware flow control -- |
uart_rts_o => uart1_rts_o, -- UART.RX ready to receive ("RTR"), low-active, optional |
uart_cts_i => uart1_cts_i, -- UART.TX allowed to transmit, low-active, optional |
uart_rts_o => uart1_rts_o, -- UART.RX ready to receive ("RTR"), low-active, optional |
uart_cts_i => uart1_cts_i, -- UART.TX allowed to transmit, low-active, optional |
-- interrupts -- |
irq_rxd_o => uart1_rxd_irq, -- uart data received interrupt |
irq_txd_o => uart1_txd_irq -- uart transmission done interrupt |
irq_rxd_o => uart1_rxd_irq, -- uart data received interrupt |
irq_txd_o => uart1_txd_irq -- uart transmission done interrupt |
); |
resp_bus(RESP_UART1).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_uart1_inst_false: |
if (IO_UART1_EN = false) generate |
uart1_rdata <= (others => '0'); |
uart1_ack <= '0'; |
resp_bus(RESP_UART1) <= resp_bus_entry_terminate_c; |
uart1_txd_o <= '0'; |
uart1_rts_o <= '0'; |
uart1_cg_en <= '0'; |
1078,35 → 1057,35
neorv32_spi_inst: neorv32_spi |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => spi_rdata, -- data out |
ack_o => spi_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_SPI).rdata, -- data out |
ack_o => resp_bus(RESP_SPI).ack, -- transfer acknowledge |
-- clock generator -- |
clkgen_en_o => spi_cg_en, -- enable clock generator |
clkgen_en_o => spi_cg_en, -- enable clock generator |
clkgen_i => clk_gen, |
-- com lines -- |
spi_sck_o => spi_sck_o, -- SPI serial clock |
spi_sdo_o => spi_sdo_o, -- controller data out, peripheral data in |
spi_sdi_i => spi_sdi_i, -- controller data in, peripheral data out |
spi_csn_o => spi_csn_o, -- SPI CS |
spi_sck_o => spi_sck_o, -- SPI serial clock |
spi_sdo_o => spi_sdo_o, -- controller data out, peripheral data in |
spi_sdi_i => spi_sdi_i, -- controller data in, peripheral data out |
spi_csn_o => spi_csn_o, -- SPI CS |
-- interrupt -- |
irq_o => spi_irq -- transmission done interrupt |
irq_o => spi_irq -- transmission done interrupt |
); |
resp_bus(RESP_SPI).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_spi_inst_false: |
if (IO_SPI_EN = false) generate |
spi_rdata <= (others => '0'); |
spi_ack <= '0'; |
spi_sck_o <= '0'; |
spi_sdo_o <= '0'; |
spi_csn_o <= (others => '1'); -- CSn lines are low-active |
spi_cg_en <= '0'; |
spi_irq <= '0'; |
resp_bus(RESP_SPI) <= resp_bus_entry_terminate_c; |
spi_sck_o <= '0'; |
spi_sdo_o <= '0'; |
spi_csn_o <= (others => '1'); -- CSn lines are low-active |
spi_cg_en <= '0'; |
spi_irq <= '0'; |
end generate; |
|
|
1117,28 → 1096,28
neorv32_twi_inst: neorv32_twi |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => twi_rdata, -- data out |
ack_o => twi_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_TWI).rdata, -- data out |
ack_o => resp_bus(RESP_TWI).ack, -- transfer acknowledge |
-- clock generator -- |
clkgen_en_o => twi_cg_en, -- enable clock generator |
clkgen_en_o => twi_cg_en, -- enable clock generator |
clkgen_i => clk_gen, |
-- com lines -- |
twi_sda_io => twi_sda_io, -- serial data line |
twi_scl_io => twi_scl_io, -- serial clock line |
twi_sda_io => twi_sda_io, -- serial data line |
twi_scl_io => twi_scl_io, -- serial clock line |
-- interrupt -- |
irq_o => twi_irq -- transfer done IRQ |
irq_o => twi_irq -- transfer done IRQ |
); |
resp_bus(RESP_TWI).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_twi_inst_false: |
if (IO_TWI_EN = false) generate |
twi_rdata <= (others => '0'); |
twi_ack <= '0'; |
resp_bus(RESP_TWI) <= resp_bus_entry_terminate_c; |
-- twi_sda_io <= 'Z'; -- FIXME? |
-- twi_scl_io <= 'Z'; -- FIXME? |
twi_cg_en <= '0'; |
1149,29 → 1128,32
-- Pulse-Width Modulation Controller (PWM) ------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
neorv32_pwm_inst_true: |
if (IO_PWM_EN = true) generate |
if (IO_PWM_NUM_CH > 0) generate |
neorv32_pwm_inst: neorv32_pwm |
generic map ( |
NUM_CHANNELS => IO_PWM_NUM_CH -- number of PWM channels (0..60) |
) |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => pwm_rdata, -- data out |
ack_o => pwm_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_PWM).rdata, -- data out |
ack_o => resp_bus(RESP_PWM).ack, -- transfer acknowledge |
-- clock generator -- |
clkgen_en_o => pwm_cg_en, -- enable clock generator |
clkgen_en_o => pwm_cg_en, -- enable clock generator |
clkgen_i => clk_gen, |
-- pwm output channels -- |
pwm_o => pwm_o |
); |
resp_bus(RESP_PWM).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_pwm_inst_false: |
if (IO_PWM_EN = false) generate |
pwm_rdata <= (others => '0'); |
pwm_ack <= '0'; |
if (IO_PWM_NUM_CH = 0) generate |
resp_bus(RESP_PWM) <= resp_bus_entry_terminate_c; |
pwm_cg_en <= '0'; |
pwm_o <= (others => '0'); |
end generate; |
1184,25 → 1166,25
neorv32_nco_inst: neorv32_nco |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => nco_rdata, -- data out |
ack_o => nco_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_NCO).rdata, -- data out |
ack_o => resp_bus(RESP_NCO).ack, -- transfer acknowledge |
-- clock generator -- |
clkgen_en_o => nco_cg_en, -- enable clock generator |
clkgen_en_o => nco_cg_en, -- enable clock generator |
clkgen_i => clk_gen, |
-- NCO output -- |
nco_o => nco_o |
); |
resp_bus(RESP_NCO).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_nco_inst_false: |
if (IO_NCO_EN = false) generate |
nco_rdata <= (others => '0'); |
nco_ack <= '0'; |
resp_bus(RESP_NCO) <= resp_bus_entry_terminate_c; |
nco_cg_en <= '0'; |
nco_o <= (others => '0'); |
end generate; |
1215,20 → 1197,20
neorv32_trng_inst: neorv32_trng |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => trng_rdata, -- data out |
ack_o => trng_ack -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_TRNG).rdata, -- data out |
ack_o => resp_bus(RESP_TRNG).ack -- transfer acknowledge |
); |
resp_bus(RESP_TRNG).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_trng_inst_false: |
if (IO_TRNG_EN = false) generate |
trng_rdata <= (others => '0'); |
trng_ack <= '0'; |
resp_bus(RESP_TRNG) <= resp_bus_entry_terminate_c; |
end generate; |
|
|
1239,27 → 1221,27
neorv32_neoled_inst: neorv32_neoled |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => neoled_rdata, -- data out |
ack_o => neoled_ack, -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
wren_i => io_wren, -- write enable |
data_i => p_bus.wdata, -- data in |
data_o => resp_bus(RESP_NEOLED).rdata, -- data out |
ack_o => resp_bus(RESP_NEOLED).ack, -- transfer acknowledge |
-- clock generator -- |
clkgen_en_o => neoled_cg_en, -- enable clock generator |
clkgen_en_o => neoled_cg_en, -- enable clock generator |
clkgen_i => clk_gen, |
-- interrupt -- |
irq_o => neoled_irq, -- interrupt request |
irq_o => neoled_irq, -- interrupt request |
-- NEOLED output -- |
neoled_o => neoled_o -- serial async data line |
neoled_o => neoled_o -- serial async data line |
); |
resp_bus(RESP_NEOLED).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_neoled_inst_false: |
if (IO_NEOLED_EN = false) generate |
neoled_rdata <= (others => '0'); |
neoled_ack <= '0'; |
resp_bus(RESP_NEOLED) <= resp_bus_entry_terminate_c; |
neoled_cg_en <= '0'; |
neoled_irq <= '0'; |
neoled_o <= '0'; |
1297,7 → 1279,7
IO_UART1_EN => IO_UART1_EN, -- implement secondary universal asynchronous receiver/transmitter (UART1)? |
IO_SPI_EN => IO_SPI_EN, -- implement serial peripheral interface (SPI)? |
IO_TWI_EN => IO_TWI_EN, -- implement two-wire interface (TWI)? |
IO_PWM_EN => IO_PWM_EN, -- implement pulse-width modulation unit (PWM)? |
IO_PWM_NUM_CH => IO_PWM_NUM_CH, -- number of PWM channels to implement |
IO_WDT_EN => IO_WDT_EN, -- implement watch dog timer (WDT)? |
IO_TRNG_EN => IO_TRNG_EN, -- implement true random number generator (TRNG)? |
IO_CFS_EN => IO_CFS_EN, -- implement custom functions subsystem (CFS)? |
1306,14 → 1288,16
) |
port map ( |
-- host access -- |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
data_o => sysinfo_rdata, -- data out |
ack_o => sysinfo_ack -- transfer acknowledge |
clk_i => clk_i, -- global clock line |
addr_i => p_bus.addr, -- address |
rden_i => io_rden, -- read enable |
data_o => resp_bus(RESP_SYSINFO).rdata, -- data out |
ack_o => resp_bus(RESP_SYSINFO).ack -- transfer acknowledge |
); |
|
resp_bus(RESP_SYSINFO).err <= '0'; -- no access error possible |
|
|
-- ************************************************************************************************************************** |
-- On-Chip Debugger Complex |
-- ************************************************************************************************************************** |
1326,8 → 1310,8
neorv32_debug_dm_inst: neorv32_debug_dm |
port map ( |
-- global control -- |
clk_i => clk_i, -- global clock line |
rstn_i => ext_rstn, -- external reset, low-active |
clk_i => clk_i, -- global clock line |
rstn_i => ext_rstn, -- external reset, low-active |
-- debug module interface (DMI) -- |
dmi_rstn_i => dmi.rstn, |
dmi_req_valid_i => dmi.req_valid, |
1335,21 → 1319,22
dmi_req_addr_i => dmi.req_addr, |
dmi_req_op_i => dmi.req_op, |
dmi_req_data_i => dmi.req_data, |
dmi_resp_valid_o => dmi.resp_valid, -- response valid when set |
dmi_resp_ready_i => dmi.resp_ready, -- ready to receive respond |
dmi_resp_valid_o => dmi.resp_valid, -- response valid when set |
dmi_resp_ready_i => dmi.resp_ready, -- ready to receive respond |
dmi_resp_data_o => dmi.resp_data, |
dmi_resp_err_o => dmi.resp_err, -- 0=ok, 1=error |
dmi_resp_err_o => dmi.resp_err, -- 0=ok, 1=error |
-- CPU bus access -- |
cpu_addr_i => p_bus.addr, -- address |
cpu_rden_i => p_bus.re, -- read enable |
cpu_wren_i => p_bus.we, -- write enable |
cpu_data_i => p_bus.wdata, -- data in |
cpu_data_o => dm_rdata, -- data out |
cpu_ack_o => dm_ack, -- transfer acknowledge |
cpu_addr_i => p_bus.addr, -- address |
cpu_rden_i => p_bus.re, -- read enable |
cpu_wren_i => p_bus.we, -- write enable |
cpu_data_i => p_bus.wdata, -- data in |
cpu_data_o => resp_bus(RESP_OCD).rdata, -- data out |
cpu_ack_o => resp_bus(RESP_OCD).ack, -- transfer acknowledge |
-- CPU control -- |
cpu_ndmrstn_o => dci_ndmrstn, -- soc reset |
cpu_halt_req_o => dci_halt_req -- request hart to halt (enter debug mode) |
cpu_ndmrstn_o => dci_ndmrstn, -- soc reset |
cpu_halt_req_o => dci_halt_req -- request hart to halt (enter debug mode) |
); |
resp_bus(RESP_OCD).err <= '0'; -- no access error possible |
end generate; |
|
neorv32_debug_dm_false: |
1359,10 → 1344,9
dmi.resp_data <= (others => '0'); |
dmi.resp_err <= '0'; |
-- |
dci_ndmrstn <= '0'; |
dci_halt_req <= '0'; |
dm_rdata <= (others => '0'); |
dm_ack <= '0'; |
resp_bus(RESP_OCD) <= resp_bus_entry_terminate_c; |
dci_ndmrstn <= '1'; |
dci_halt_req <= '0'; |
end generate; |
|
|
/neorv32_trng.vhd
124,10 → 124,11
|
-- Sanity Checks -------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
assert not (num_roscs_c = 0) report "NEORV32 PROCESSOR CONFIG NOTE: TRNG - Total number of ring-oscillators has to be >0." severity error; |
assert not ((num_inv_start_c mod 2) = 0) report "NEORV32 PROCESSOR CONFIG NOTE: TRNG - Number of inverters in fisrt ring has to be odd." severity error; |
assert not ((num_inv_inc_c mod 2) /= 0) report "NEORV32 PROCESSOR CONFIG NOTE: TRNG - Number of inverters increment for each next ring has to be even." severity error; |
assert not (num_roscs_c = 0) report "NEORV32 PROCESSOR CONFIG ERROR: TRNG - Total number of ring-oscillators has to be >0." severity error; |
assert not ((num_inv_start_c mod 2) = 0) report "NEORV32 PROCESSOR CONFIG ERROR: TRNG - Number of inverters in fisrt ring has to be odd." severity error; |
assert not ((num_inv_inc_c mod 2) /= 0) report "NEORV32 PROCESSOR CONFIG ERROR: TRNG - Number of inverters increment for each next ring has to be even." severity error; |
|
|
-- Access Control ------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
acc_en <= '1' when (addr_i(hi_abb_c downto lo_abb_c) = trng_base_c(hi_abb_c downto lo_abb_c)) else '0'; |
190,7 → 191,7
neumann_debiasing_sync: process(clk_i) |
begin |
if rising_edge(clk_i) then |
debiasing.sreg <= debiasing.sreg(debiasing.sreg'left-1 downto 0) & xor_all_f(osc_array_data); |
debiasing.sreg <= debiasing.sreg(debiasing.sreg'left-1 downto 0) & xor_reduce_f(osc_array_data); |
debiasing.state <= (not debiasing.state) and osc_array_en_out(num_roscs_c-1); -- start toggling when last RO is enabled -> process in every second cycle |
end if; |
end process neumann_debiasing_sync; |
225,7 → 226,7
processing.cnt <= std_ulogic_vector(unsigned(processing.cnt) + 1); |
end if; |
if (lfsr_en_c = true) then -- LFSR post-processing |
processing.sreg <= processing.sreg(processing.sreg'left-1 downto 0) & (xnor_all_f(processing.sreg and lfsr_taps_c) xnor debiasing.data); |
processing.sreg <= processing.sreg(processing.sreg'left-1 downto 0) & ((not xor_reduce_f(processing.sreg and lfsr_taps_c)) xnor debiasing.data); |
else -- NO post-processing |
processing.sreg <= processing.sreg(processing.sreg'left-1 downto 0) & debiasing.data; |
end if; |
321,11 → 322,6
|
begin |
|
-- Sanity Checks -------------------------------------------------------------------------- |
-- ------------------------------------------------------------------------------------------- |
assert not ((NUM_INV mod 2) = 0) report "NEORV32 PROCESSOR CONFIG NOTE: TNRG.ring_oscillator - Number of inverters in ring has to be odd." severity error; |
|
|
-- Ring Oscillator ------------------------------------------------------------------------ |
-- ------------------------------------------------------------------------------------------- |
ring_osc: process(enable_i, enable_sreg, inv_chain) |
/neorv32_uart.vhd
241,8 → 241,8
data_o(ctrl_uart_tx_busy_c) <= uart_tx.busy; |
data_o(ctrl_uart_cts_c) <= uart_cts_ff(1); |
else -- uart_id_rtx_addr_c |
data_o(data_rx_avail_c) <= or_all_f(uart_rx.avail); |
data_o(data_rx_overr_c) <= and_all_f(uart_rx.avail); |
data_o(data_rx_avail_c) <= or_reduce_f(uart_rx.avail); |
data_o(data_rx_overr_c) <= and_reduce_f(uart_rx.avail); |
data_o(data_rx_ferr_c) <= uart_rx.ferr_rd; |
data_o(data_rx_perr_c) <= uart_rx.perr_rd; |
data_o(7 downto 0) <= uart_rx.data_rd; |
280,7 → 280,7
uart_tx.sreg(0) <= '1'; |
if (wr_en = '1') and (ctrl(ctrl_uart_en_c) = '1') and (addr = uart_id_rtx_addr_c) and (ctrl(ctrl_uart_sim_en_c) = '0') then -- write trigger and not in SIM mode |
if (ctrl(ctrl_uart_pmode1_c) = '1') then -- add parity flag |
uart_tx.sreg <= '1' & (xor_all_f(data_i(7 downto 0)) xor ctrl(ctrl_uart_pmode0_c)) & data_i(7 downto 0) & '0'; -- stopbit & parity bit & data & startbit |
uart_tx.sreg <= '1' & (xor_reduce_f(data_i(7 downto 0)) xor ctrl(ctrl_uart_pmode0_c)) & data_i(7 downto 0) & '0'; -- stopbit & parity bit & data & startbit |
else |
uart_tx.sreg <= '1' & '1' & data_i(7 downto 0) & '0'; -- (dummy fill-bit &) stopbit & data & startbit |
end if; |
344,7 → 344,7
if (uart_rx.bitcnt = "0000") then |
uart_rx.busy <= '0'; -- done |
-- data buffer (double buffering) -- |
uart_rx.perr(0) <= ctrl(ctrl_uart_pmode1_c) and (xor_all_f(uart_rx.sreg(8 downto 0)) xor ctrl(ctrl_uart_pmode0_c)); |
uart_rx.perr(0) <= ctrl(ctrl_uart_pmode1_c) and (xor_reduce_f(uart_rx.sreg(8 downto 0)) xor ctrl(ctrl_uart_pmode0_c)); |
uart_rx.ferr(0) <= not uart_rx.sreg(9); -- check stop bit (error if not set) |
if (ctrl(ctrl_uart_pmode1_c) = '1') then -- add parity flag |
uart_rx.data(0) <= uart_rx.sreg(7 downto 0); |
/neorv32_wishbone.vhd
193,12 → 193,12
-- buffer all outgoing signals -- |
ctrl.we <= wren_i or ctrl.wr_req; |
ctrl.adr <= addr_i; |
if (xbus_big_endian_c = true) then -- endianness conversion |
if (xbus_big_endian_c = true) then -- big-endian |
ctrl.wdat <= bswap32_f(data_i); |
ctrl.sel <= bit_rev_f(ben_i); |
else -- little-endian |
ctrl.wdat <= data_i; |
ctrl.sel <= ben_i; |
else |
ctrl.wdat <= bswap32_f(data_i); |
ctrl.sel <= bit_rev_f(ben_i); |
end if; |
ctrl.src <= src_i; |
ctrl.lock <= lock_i; |
217,7 → 217,7
elsif (wb_ack_i = '1') then -- normal bus termination |
ctrl.ack <= '1'; |
ctrl.state <= IDLE; |
elsif (timeout_en_c = true) and (or_all_f(ctrl.timeout) = '0') then -- valid timeout |
elsif (timeout_en_c = true) and (or_reduce_f(ctrl.timeout) = '0') then -- valid timeout |
ctrl.err <= '1'; |
ctrl.state <= IDLE; |
end if; |
243,7 → 243,7
end process bus_arbiter; |
|
-- host access -- |
data_o <= ctrl.rdat when (xbus_big_endian_c = true) else bswap32_f(ctrl.rdat); -- endianness conversion |
data_o <= ctrl.rdat when (xbus_big_endian_c = false) else bswap32_f(ctrl.rdat); -- endianness conversion |
ack_o <= ctrl.ack; |
err_o <= ctrl.err; |
|