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

Subversion Repositories wb4pb

[/] [wb4pb/] [trunk/] [asm/] [pbwbuart.psm] - Blame information for rev 22

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 11 ste.fis
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;; This sourcecode is released under BSD license.
3
;; Please see http://www.opensource.org/licenses/bsd-license.php for details!
4
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5
;;
6
;; Copyright (c) 2010, Stefan Fischer 
7
;; All rights reserved.
8
;;
9
;; Redistribution and use in source and binary forms, with or without
10
;; modification, are permitted provided that the following conditions are met:
11
;;
12
;;  * Redistributions of source code must retain the above copyright notice,
13
;;    this list of conditions and the following disclaimer.
14
;;  * Redistributions in binary form must reproduce the above copyright notice,
15
;;    this list of conditions and the following disclaimer in the documentation
16
;;    and/or other materials provided with the distribution.
17
;;  * Neither the name of the author nor the names of his contributors may be
18
;;    used to endorse or promote products derived from this software without
19
;;    specific prior written permission.
20
;;
21
;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
;; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
;; ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25
;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26
;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
;; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
;; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
;; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
;; POSSIBILITY OF SUCH DAMAGE.
32
;;
33
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
34
;; filename: pbwbuart.psm
35
;; description: uart example, demonstrating access to wishbone peripherals
36
;; todo4user: modify main program and uart code as needed, i. e. non-blocking
37
;;            read and write transactions or data burst transfers
38
;; version: 0.0.0
39
;; changelog: - 0.0.0, initial release
40
;;            - ...
41
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
42
 
43
 
44
; wishbone variables
45
NAMEREG sF , wb_addr
46
NAMEREG sE , wb_data ; also used as tmp-reg for status polling
47
 
48
; uart variables
49
NAMEREG sD , uart_data
50
 
51
 
52
ADDRESS 000
53
 
54
; main entry point
55
;;;;;;;;;;;;;;;;;;
56
 
57
DISABLE INTERRUPT
58
 
59
CALL uart_init
60
 
61
; obligatory "Hello World!" message
62
 
63
; new line
64
LOAD uart_data , ASCII_CR_CHAR
65
CALL uart_wr_byte
66
LOAD uart_data , ASCII_LF_CHAR
67
CALL uart_wr_byte
68
; H
69
LOAD uart_data , ASCII_H_UC
70
CALL uart_wr_byte
71
; e
72
LOAD uart_data , ASCII_E_LC
73
CALL uart_wr_byte
74
; l
75
LOAD uart_data , ASCII_L_LC
76
CALL uart_wr_byte
77
; l
78
LOAD uart_data , ASCII_L_LC
79
CALL uart_wr_byte
80
; o
81
LOAD uart_data , ASCII_O_LC
82
CALL uart_wr_byte
83
; space
84
LOAD uart_data , ASCII_SP_CHAR
85
CALL uart_wr_byte
86
; W
87
LOAD uart_data , ASCII_W_UC
88
CALL uart_wr_byte
89
; o
90
LOAD uart_data , ASCII_O_LC
91
CALL uart_wr_byte
92
; r
93
LOAD uart_data , ASCII_R_LC
94
CALL uart_wr_byte
95
; l
96
LOAD uart_data , ASCII_L_LC
97
CALL uart_wr_byte
98
; d
99
LOAD uart_data , ASCII_D_LC
100
CALL uart_wr_byte
101
; !
102
LOAD uart_data , ASCII_EXCLAMATION_MARK_SIGN
103
CALL uart_wr_byte
104
; new line
105
LOAD uart_data , ASCII_CR_CHAR
106
CALL uart_wr_byte
107
LOAD uart_data , ASCII_LF_CHAR
108
CALL uart_wr_byte
109
 
110
; simple loopback of uart data
111
mainloop:
112
  CALL uart_rd_byte
113
  CALL uart_wr_byte
114
  JUMP mainloop
115
 
116
 
117
; wbs_uart module subroutines and settings
118
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
119
 
120
; usage:
121
; 1. set baud rate in uart_init subroutine
122
; 2. call uart_init subroutine to configure wbs_uart module for operation
123
; 3. use uart_wr_byte and uart_rd_byte subroutines to access uart transceiver,
124
;    all accesses are blocking, subroutines do not return, if wbs_uart tx buffer
125
;    is full or rx buffer is empty
126
;    uart write code =>
127
;    LOAD uart_data ,  ; setting up data
128
;    CALL uart_wr_byte ; writing data to uart module
129
;    
130
;    uart read code =>
131
;    CALL uart_rd_byte ; reading data from uart module
132
;    LOAD  , uart_data ; uart_data is updated now
133
;    
134
; 4. uart_clr_buff subroutine can be used to discard wbs_uart rx buffer contents
135
;    during software runtime
136
 
137
; uart start-up configuration, i. e. baudrate
138
uart_init:
139
  ; setting baud rate
140
  LOAD wb_addr , UART_BAUD_LO_ADDR
141
  LOAD wb_data , UART_BAUD_LO_115200_VALUE
142
  CALL wb_wr
143
  LOAD wb_addr , UART_BAUD_HI_ADDR
144
  LOAD wb_data , UART_BAUD_HI_115200_VALUE
145
  CALL wb_wr
146
  ; clear uart receive buffer, after power up and change of baud rate, there is
147
  ; maybe invalid data in it
148
  CALL uart_clr_buff
149
RETURN
150
 
151
; blocking write byte to uart
152
uart_wr_byte:
153
  LOAD wb_addr , UART_RXTX_ADDR
154
  LOAD wb_data , uart_data
155
  CALL wb_wr
156
RETURN
157
 
158
; blocking read byte from uart
159
uart_rd_byte:
160
  LOAD wb_addr , UART_RXTX_ADDR
161
  CALL wb_rd
162
  LOAD uart_data , wb_data
163
RETURN
164
 
165
; uart rx buffer clear
166
uart_clr_buff:
167
  ; uart receive buffer software reset, checking status register for level and
168
  ; reading out all available data
169
  LOAD wb_addr , UART_SR_ADDR ; setting status register address
170
  CALL wb_rd
171
  ; checking data present flag
172
  TEST wb_data , UART_SR_RX_DP_FLAG
173
  ; if flag is not set, returning immediately
174 22 ste.fis
  RETURN Z
175 11 ste.fis
  ; else reading out next byte and checking flag again
176 22 ste.fis
  CALL uart_rd_byte
177
  JUMP uart_clr_buff
178 11 ste.fis
 
179
; register and flag addressing
180
CONSTANT UART_RXTX_ADDR , 00 ; receive/transmit data pipe
181
CONSTANT UART_SR_ADDR , 01 ; status register
182
CONSTANT UART_SR_RX_F_FLAG , 01 ; status rx full
183
CONSTANT UART_SR_RX_HF_FLAG , 02 ; status rx half full
184
CONSTANT UART_SR_RX_DP_FLAG , 04 ; status rx data present
185
CONSTANT UART_SR_TX_F_FLAG , 10 ; status tx full
186
CONSTANT UART_SR_TX_HF_FLAG , 20 ; status tx half full
187
CONSTANT UART_BAUD_LO_ADDR , 02 ; baud rate cfg. register / low byte
188
CONSTANT UART_BAUD_HI_ADDR , 03 ; baud rate cfg. register / high byte
189
 
190
; baud rate configuration:
191
; baud_limit = round( system clock frequency / (16 * baud rate) ) - 1
192
; i. e. 9600 baud at 50 MHz system clock =>
193
; baud_limit = round( 50.0E6 / (16 * 9600) ) - 1 = 325 = 0x0145
194
 
195
; WARNING, baud rate error should not exceed 1.0 % for reliable operation!
196
 
197
; baud rate settings for 50.0E6 Hz system reference clock
198
; max. 3125000.0 baud
199
; min. 48.0 baud (16 bit baud timer)
200
CONSTANT UART_BAUD_LO_300_VALUE , B0 ; actual baud rate 299.99
201
CONSTANT UART_BAUD_HI_300_VALUE , 28 ; => baud rate error 0.003 %
202
CONSTANT UART_BAUD_LO_600_VALUE , 57 ; actual baud rate 600.04
203
CONSTANT UART_BAUD_HI_600_VALUE , 14 ; => baud rate error 0.006 %
204
CONSTANT UART_BAUD_LO_1200_VALUE , 2B ; actual baud rate 1200.08
205
CONSTANT UART_BAUD_HI_1200_VALUE , 0A ; => baud rate error 0.006 %
206
CONSTANT UART_BAUD_LO_2400_VALUE , 15 ; actual baud rate 2400.15
207
CONSTANT UART_BAUD_HI_2400_VALUE , 05 ; => baud rate error 0.006 %
208
CONSTANT UART_BAUD_LO_4800_VALUE , 8A ; actual baud rate 4800.31
209
CONSTANT UART_BAUD_HI_4800_VALUE , 02 ; => baud rate error 0.006 %
210
CONSTANT UART_BAUD_LO_9600_VALUE , 45 ; actual baud rate 9585.89
211
CONSTANT UART_BAUD_HI_9600_VALUE , 01 ; => baud rate error 0.147 %
212
CONSTANT UART_BAUD_LO_19200_VALUE , A2 ; actual baud rate 19171.78
213
CONSTANT UART_BAUD_HI_19200_VALUE , 00 ; => baud rate error 0.147 %
214
CONSTANT UART_BAUD_LO_38400_VALUE , 50 ; actual baud rate 38580.25
215
CONSTANT UART_BAUD_HI_38400_VALUE , 00 ; => baud rate error 0.467 %
216
CONSTANT UART_BAUD_LO_57600_VALUE , 35 ; actual baud rate 57870.37
217
CONSTANT UART_BAUD_HI_57600_VALUE , 00 ; => baud rate error 0.467 %
218
CONSTANT UART_BAUD_LO_115200_VALUE , 1A ; actual baud rate 115740.74
219
CONSTANT UART_BAUD_HI_115200_VALUE , 00 ; => baud rate error 0.467 %
220
;CONSTANT UART_BAUD_LO_230400_VALUE , 0D ; actual baud rate 223214.29
221
;CONSTANT UART_BAUD_HI_230400_VALUE , 00 ; => baud rate error 3.219 %
222
;CONSTANT UART_BAUD_LO_460800_VALUE , 06 ; actual baud rate 446428.57
223
;CONSTANT UART_BAUD_HI_460800_VALUE , 00 ; => baud rate error 3.219 %
224
;CONSTANT UART_BAUD_LO_921600_VALUE , 02 ; actual baud rate 1041666.67
225
;CONSTANT UART_BAUD_HI_921600_VALUE , 00 ; => baud rate error 11.526 %
226
 
227
 
228
; wbm_picoblaze module subroutines and settings
229
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
230
 
231
; subroutines wb_wr and wb_rd are working together with external wbm_picoblaze
232
; wishbone adapter module and therefore should not be modified. wb_wait_on_ack
233
; is a supporting subroutine, which should not be called directly
234
;
235
; transfer principle wishbone write:
236
; 1. OUTPUT cycle to set up wishbone address, data and control signals from
237
;    PORT_ID, OUT_PORT and WRITE_STROBE
238
; 2. INPUT cycle(s) to poll wishbone peripheral acknowledgement using IN_PORT
239
; => at least one OUTPUT and one INPUT cycle for a write
240
;
241
; transfer principle wishbone read:
242
; 1. INPUT cycle to set up wishbone address and control signals from PORT_ID
243
;    and READ_STROBE
244
; 2. INPUT cycle(s) to poll wishbone peripheral acknowledgement using IN_PORT
245
; 3. the very next INPUT cycle after acknowledgement contains valid wishbone
246
;    data from IN_PORT
247
; => at least three INPUT cycles for a read
248
;
249
; calling examples:
250
;
251
; wishbone write code =>
252
;
253
; LOAD wb_addr ,  ; setting up address
254
; LOAD wb_data ,  ; setting up data
255
; CALL wb_wr ; starting wishbone write cycle
256
;  ; wishbone cycle finished
257
;
258
; wishbone read code =>
259
;
260
; LOAD wb_addr ,  ; setting up address
261
; CALL wb_rd ; starting wishbone read cycle
262
; LOAD  , wb_data ; wb_data is updated now
263
;  ; wishbone cycle finished
264
 
265
; wishbone write access
266
wb_wr:
267
  OUTPUT wb_data , (wb_addr)
268
  CALL wb_wait_on_ack
269
RETURN
270
 
271
; wishbone read access
272
wb_rd:
273
  CALL wb_wait_on_ack
274
  INPUT wb_data , (wb_addr)
275
RETURN
276
 
277
; waiting on wishbone cycle to complete
278
wb_wait_on_ack:
279
  INPUT wb_data , (wb_addr)
280
  TEST wb_data , WB_ACK_FLAG
281
  JUMP Z , wb_wait_on_ack
282
RETURN
283
 
284
CONSTANT WB_ACK_FLAG , 01
285
 
286
 
287
; interrupt subroutines and settings
288
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
289
 
290
; IMPORTANT NOTICE!
291
; be carefull, if using interrupts. wishbone cycles must be atomar, as any
292
; other processor local bus cycles are normally be. interrupting wishbone
293
; access may cause a crash of external wishbone master fsm, especially, if
294
; program flow through isr leads to another wishbone cycle!
295
 
296
; interrupt handling template, if needed
297
isr:
298
RETURNI DISABLE
299
ADDRESS 3FF
300
JUMP isr
301
 
302
 
303
; ascii table
304
;;;;;;;;;;;;;
305
 
306
CONSTANT ASCII_NUL_CHAR , 00 ; NUL
307
CONSTANT ASCII_SOH_CHAR , 01 ; SOH
308
CONSTANT ASCII_STX_CHAR , 02 ; STX
309
CONSTANT ASCII_ETX_CHAR , 03 ; ETX
310
CONSTANT ASCII_EOT_CHAR , 04 ; EOT
311
CONSTANT ASCII_ENQ_CHAR , 05 ; ENQ
312
CONSTANT ASCII_ACK_CHAR , 06 ; ACK
313
CONSTANT ASCII_BEL_CHAR , 07 ; BEL
314
CONSTANT ASCII_BS_CHAR , 08 ; BS
315
CONSTANT ASCII_TAB_CHAR , 09 ; TAB
316
CONSTANT ASCII_LF_CHAR , 0A ; LF
317
CONSTANT ASCII_VT_CHAR , 0B ; VT
318
CONSTANT ASCII_FF_CHAR , 0C ; FF
319
CONSTANT ASCII_CR_CHAR , 0D ; CR
320
CONSTANT ASCII_SO_CHAR , 0E ; SO
321
CONSTANT ASCII_SI_CHAR , 0F ; SI
322
CONSTANT ASCII_DLE_CHAR , 10 ; DLE
323
CONSTANT ASCII_DC1_CHAR , 11 ; DC1
324
CONSTANT ASCII_DC2_CHAR , 12 ; DC2
325
CONSTANT ASCII_DC3_CHAR , 13 ; DC3
326
CONSTANT ASCII_DC4_CHAR , 14 ; DC4
327
CONSTANT ASCII_NAK_CHAR , 15 ; NAK
328
CONSTANT ASCII_SYN_CHAR , 16 ; SYN
329
CONSTANT ASCII_ETB_CHAR , 17 ; ETB
330
CONSTANT ASCII_CAN_CHAR , 18 ; CAN
331
CONSTANT ASCII_EM_CHAR , 19 ; EM
332
CONSTANT ASCII_SUB_CHAR , 1A ; SUB
333
CONSTANT ASCII_ESC_CHAR , 1B ; ESC
334
CONSTANT ASCII_FS_CHAR , 1C ; FS
335
CONSTANT ASCII_GS_CHAR , 1D ; GS
336
CONSTANT ASCII_RS_CHAR , 1E ; RS
337
CONSTANT ASCII_US_CHAR , 1F ; US
338
CONSTANT ASCII_SP_CHAR , 20 ; SP
339
CONSTANT ASCII_EXCLAMATION_MARK_SIGN , 21 ; !
340
CONSTANT ASCII_DOUBLE_QUOTE_SIGN , 22 ; "
341
CONSTANT ASCII_NUMBER_SIGN , 23 ; #
342
CONSTANT ASCII_DOLLAR_SIGN , 24 ; $
343
CONSTANT ASCII_PERCENT_SIGN , 25 ; %
344
CONSTANT ASCII_AMPERSAND_SIGN , 26 ; &
345
CONSTANT ASCII_SINGLE_QUOTE_SIGN , 27 ; '
346
CONSTANT ASCII_OPN_PARENTHESIS_SIGN , 28 ; (
347
CONSTANT ASCII_CLS_PARENTHESIS_SIGN , 29 ; )
348
CONSTANT ASCII_ASTERISK_SIGN , 2A ; *
349
CONSTANT ASCII_PLUS_SIGN , 2B ; +
350
CONSTANT ASCII_COMMA_SIGN , 2C ; ,
351
CONSTANT ASCII_MINUS_SIGN , 2D ; -
352
CONSTANT ASCII_DOT_SIGN , 2E ; .
353
CONSTANT ASCII_SLASH_SIGN , 2F ; /
354
CONSTANT ASCII_0_DIGIT , 30 ; 0
355
CONSTANT ASCII_1_DIGIT , 31 ; 1
356
CONSTANT ASCII_2_DIGIT , 32 ; 2
357
CONSTANT ASCII_3_DIGIT , 33 ; 3
358
CONSTANT ASCII_4_DIGIT , 34 ; 4
359
CONSTANT ASCII_5_DIGIT , 35 ; 5
360
CONSTANT ASCII_6_DIGIT , 36 ; 6
361
CONSTANT ASCII_7_DIGIT , 37 ; 7
362
CONSTANT ASCII_8_DIGIT , 38 ; 8
363
CONSTANT ASCII_9_DIGIT , 39 ; 9
364
CONSTANT ASCII_COLON_SIGN , 3A ; :
365
CONSTANT ASCII_SEMICOLON_SIGN , 3B ; ;
366
CONSTANT ASCII_LESS_THAN_SIGN , 3C ; <
367
CONSTANT ASCII_EQUAL_SIGN , 3D ; =
368
CONSTANT ASCII_GREATER_THAN_SIGN , 3E ; >
369
CONSTANT ASCII_QUESTION_MARK_SIGN , 3F ; ?
370
CONSTANT ASCII_AT_SIGN , 40 ; @
371
CONSTANT ASCII_A_UC , 41 ; A
372
CONSTANT ASCII_B_UC , 42 ; B
373
CONSTANT ASCII_C_UC , 43 ; C
374
CONSTANT ASCII_D_UC , 44 ; D
375
CONSTANT ASCII_E_UC , 45 ; E
376
CONSTANT ASCII_F_UC , 46 ; F
377
CONSTANT ASCII_G_UC , 47 ; G
378
CONSTANT ASCII_H_UC , 48 ; H
379
CONSTANT ASCII_I_UC , 49 ; I
380
CONSTANT ASCII_J_UC , 4A ; J
381
CONSTANT ASCII_K_UC , 4B ; K
382
CONSTANT ASCII_L_UC , 4C ; L
383
CONSTANT ASCII_M_UC , 4D ; M
384
CONSTANT ASCII_N_UC , 4E ; N
385
CONSTANT ASCII_O_UC , 4F ; O
386
CONSTANT ASCII_P_UC , 50 ; P
387
CONSTANT ASCII_Q_UC , 51 ; Q
388
CONSTANT ASCII_R_UC , 52 ; R
389
CONSTANT ASCII_S_UC , 53 ; S
390
CONSTANT ASCII_T_UC , 54 ; T
391
CONSTANT ASCII_U_UC , 55 ; U
392
CONSTANT ASCII_V_UC , 56 ; V
393
CONSTANT ASCII_W_UC , 57 ; W
394
CONSTANT ASCII_X_UC , 58 ; X
395
CONSTANT ASCII_Y_UC , 59 ; Y
396
CONSTANT ASCII_Z_UC , 5A ; Z
397
CONSTANT ASCII_OPN_BRACKET_SIGN , 5B ; [
398
CONSTANT ASCII_BACKSLASH_SIGN , 5C ; \
399
CONSTANT ASCII_CLS_BRACKET_SIGN , 5D ; ]
400
CONSTANT ASCII_CARET_SIGN , 5E ; ^
401
CONSTANT ASCII_UNDERSCORE_SIGN , 5F ; _
402
CONSTANT ASCII_ACCENT_SIGN , 60 ; `
403
CONSTANT ASCII_A_LC , 61 ; a
404
CONSTANT ASCII_B_LC , 62 ; b
405
CONSTANT ASCII_C_LC , 63 ; c
406
CONSTANT ASCII_D_LC , 64 ; d
407
CONSTANT ASCII_E_LC , 65 ; e
408
CONSTANT ASCII_F_LC , 66 ; f
409
CONSTANT ASCII_G_LC , 67 ; g
410
CONSTANT ASCII_H_LC , 68 ; h
411
CONSTANT ASCII_I_LC , 69 ; i
412
CONSTANT ASCII_J_LC , 6A ; j
413
CONSTANT ASCII_K_LC , 6B ; k
414
CONSTANT ASCII_L_LC , 6C ; l
415
CONSTANT ASCII_M_LC , 6D ; m
416
CONSTANT ASCII_N_LC , 6E ; n
417
CONSTANT ASCII_O_LC , 6F ; o
418
CONSTANT ASCII_P_LC , 70 ; p
419
CONSTANT ASCII_Q_LC , 71 ; q
420
CONSTANT ASCII_R_LC , 72 ; r
421
CONSTANT ASCII_S_LC , 73 ; s
422
CONSTANT ASCII_T_LC , 74 ; t
423
CONSTANT ASCII_U_LC , 75 ; u
424
CONSTANT ASCII_V_LC , 76 ; v
425
CONSTANT ASCII_W_LC , 77 ; w
426
CONSTANT ASCII_X_LC , 78 ; x
427
CONSTANT ASCII_Y_LC , 79 ; y
428
CONSTANT ASCII_Z_LC , 7A ; z
429
CONSTANT ASCII_OPN_BRACE_SIGN , 7B ; {
430
CONSTANT ASCII_VERTICAL_BAR_SIGN , 7C ; |
431
CONSTANT ASCII_CLS_BRACE_SIGN , 7D ; }
432
CONSTANT ASCII_TILDE_SIGN , 7E ; ~
433
CONSTANT ASCII_DEL_CHAR , 7F ; DEL

powered by: WebSVN 2.1.0

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