Tools: Die Lattice Diamond V1.3 builds Mico8 on MachXO Control Developer Kit Von der Hardware zur Software in FPGAs mit Embedded Prozessoren. Stage: (1) the File: test.asm ################################################################## ;---BLINKi- Lattice MachX0 test ; Embed FPGA MCU Mico8 -IIII V1.0====------ ; PROGRAM PREPARE nop # SPACE IRQ VECTOR nop # nop # movi r15, LED_PORT_ADDR_40 ; movi r14, 0x00 ; ## OUTPUT --> movi r0, 0x03 ; ## WRITE ;================ ; MAIN_LOOP main_loop: export r0, 0x00 ;## reg_r0 STORE GPIO rol r0,r0 ;## rotate left reg0 ; insert delay call delay ; b main_loop ; ## go MAIN_LOOP delay: movi r1, 0x00 ; clear-Regs. movi r2, 0x00 movi r4, 0x00 outer_loop: addi r4,0x01 ; INC-R4 middle_loop: addi r1,0x01 ; INC-R1 inner_loop: addi r2, 0x01 ; INC-R2 cmpi r2, 0xFF ; ?Inner bzn inner_loop ; cmpi r1, 0xFF ; ?Middle bzn middle_loop ; cmpi r4, 0x20 ; ?Outer bzn outer_loop ; ret ; ENDE ASM
Mico8 Mico32 Embedded Processor ------------------------------------------------------------------------ ----- In Verilog *.v File is der ROM CODE somit indirekt der Synplify Synthese zu übergeben. Also braucht man ca. 6 bis 8 Tools und zwischenCode bis der Code in dem MachX0 als *.JED File per JTAG ins FPGA Flash->RAM geht. Und als EmbeddedApp. via FPGA Fabric Distribution ablaufen kann. Und Userfreundlich via FPGA-CPLD/@\ WishBoneBus <-(?)--> Command-User-Interface ein flexibles Plugin bereitstellt. Beispiel: ######################################################################## ## "prom_init.hex" File--> Einbinden der Mico8 @Engine -->Execute ROM CODE Name: "prom_init.hex" ######################################################################## ## A Verilog Code Sniplet(1): module isp8 ( //clock and reset clk , rst_n , ...... wire [7:0] ext_mem_din ; wire ext_mem_wr ; wire ext_mem_rd ; assign ext_addr = ext_addr_int; assign ext_io_dout = ext_dout; assign ext_mem_dout = ext_dout; isp8_core # ( "XO", "prom_init.hex", 8, ...... Hint: http://pbuchegger.at/download/_BaMICO8.pdf ######################################################################## Asm Tool: isp8asm_win.exe isp8asm_win.exe control_SoC_demo.asm -o prom_init.hex -s 1024 ######################################################################## ####################/*.lst Listfile ##########################*/ Loc Opcode Opcode Counter (Hex) (Bin) 0x0000 0x3309A 110011000010011010 b int_handler 0x0001 0x10000 010000000000000000 nop 0x0002 0x10000 010000000000000000 nop 0x0003 0x2C005 101100000000000101 seti 0x0004 0x10000 010000000000000000 nop 0x0005 0x10000 010000000000000000 nop 0x0006 0x33001 110011000000000001 b start 0x0007 start: 0x0007 0x3C529 111100010100101001 import R05,#5 0x0008 0x10628 010000011000101000 mov R06,R05 0x0009 0x165F0 010110010111110000 andi R05,0xF0 0x000A 0x10728 010000011100101000 mov R07,R05 0x000B 0x10530 010000010100110000 mov R05,R06 0x000C 0x1650F 010110010100001111 andi R05,0x0F 0x000D 0x11928 010001100100101000 mov R25,R05 0x000E 0x22710 100010011100010000 cmpi R07,0x10 0x000F 0x32004 110010000000000100 bz phase2 0x0010 0x22720 100010011100100000 cmpi R07,0x20 0x0011 0x32002 110010000000000010 bz phase2 0x0012 0x333F5 110011001111110101 b start 0x0013 phase2: Sythes Phase ######################################################################## /* synthesis INITVAL_00="0x3200422710119281650F1053010728165F0106283C5293300110000100 002C00510000100003309A" */ /* synthesis INITVAL_01="0x32002227203203822710333EC320022390432004239033200623902320 0823901333F53200222720" */ /* synthesis INITVAL_02="0x333FB323D922000370173C00002001327FC220100A0013701D3C000123 00122001210012000333E7" */ /* synthesis INITVAL_03="0x0BE0113D00327F623DFF0BD01100001000010000100001000010000100 00100001000013E0013D00" */ ************************************************************** Hint: 0x2C005 is Opcode seti ######################################################################## ###
MachXO Control Developer Kit mit REFDESIGNS als Source Code NV FPGA Derivat : Lattice MachXO LCMXO2280C control_SoC_demo.ldf --> Lattice Diamond Design-File ######################################################################## ## C:\B_CPLD2\Demo_MachXO_Control_SoC\source\imp Der uptime_wb.v Verilog Code habe ich via Project Manager gemoddet. *.syn import to Lattice Diamond V3.1.487 Project. -->> C:\B_CPLD2\Demo_MachXO_Control_SoC\project\control_SoC_demo.ldf ---------------------------------------------------------------- 2* uptime_wb.v ??? C:\B_CPLD2\Demo_MachXO_Control_SoC\source\uptime_wb.v C:\B_CPLD2\Demo_MachXO_Control_SoC\project\impl1\source\uptime_wb.v ---------------------------------------------------------------- C:\B_CPLD2\Demo_MachXO_Control_SoC\project\prom_init.hex -------------------------------------------##################### C:\B_CPLD2\Demo_MachXO_Control_SoC\project\ impl1\source\uptime_wb.v ######-------########### Path impl1 C:\B_CPLD2\Demo_MachXO_Control_SoC\project\ impl1\source\uptime_wb.v /* Fu-Knoten : A4-Definition*/ always@(posedge sec_clock or posedge rst_i) begin if (rst_i) begin /* Clear */ hours <= 0; /*Zero-HH:MM:SS $08_Bit_Spur*/ minutes <= 0; seconds <= 0; end else begin if (seconds[7:0] < 59) begin // seconds <= seconds + 1; end else begin minutes <= minutes + (1); // INC_Minutes seconds <= 0; if (minutes > 58) begin // 59?? minutes <= 0; hours <= hours + 1; end end end end endmodule /* ENDE */ Das Menue geht und ist Command Interface via WishBone Bus @Interface Prozessanschluss#$(00) <-->UART V24 --(Terminal)--USER-PC ####################################################################### Register Rules r0--- ######################################################################## ### ;Sub_1 UART-I/O-WishBone Bus .equ UART, 0x00 ; @!Base_Adress$(00) .equ ADC, 0x10 ; .equ SPI, 0xA0 ; 1010 0000 0000 0000 [0000 0000] - 1010 1111 ; 1111 1111 [1111 1111] (0xA00000-0xAFFFFF) .equ TIMER, 0xB0 ; ************************************************************************ *** ;!@UART REGISTERS .equ REG_UART_DATA, 0x00 ; NULL .equ REG_UART_IER, 0x01 .equ REG_UART_LCR, 0x03 .equ REG_UART_LSR, 0x05 ######################################################################## ### ----------------------- ;**Code Sniplet to do Mico8 WishBone u. Lattice Asm Syntax lernen ----------------------- Hint: Read import r5 ; via Reg$05 export ; UART, 0x00 .equ REG_UART_DATA, 0x00 get_char: movi r15,UART import r5, REG_UART_DATA ; Read from UART cmpi r5, 'm' bz init_menu cmpi r5, 't' callz read_uptime ..... ----------------------- ;---================------ ; PROGRAM PREPARE nop # SPACE IRQ VECTOR nop # nop # movi r15, LED_PORT_ADDR_40 ; movi r14, 0x00 ; ## OUTPUT --> movi r0, 0x03 ; ## WRITE ;================ ; MAIN_LOOP main_loop: export r0, 0x00 ;## reg_r0 STORE GPIO rol r0,r0 ;## rotate left reg0 ; insert delay call delay ; b main_loop ; ## go MAIN_LOOP ------------------------------------------- ########################################### SPI SNIPLET ; SOFT SPI CORE REGISTERS .equ REG_SPI_RXDATA, 0x00 .equ REG_SPI_TXDATA, 0x04 .equ REG_SPI_STATUS, 0x08 .equ REG_SPI_CONTROL,0x0C .equ REG_SPI_SSEL, 0x10 init_spi: movi r15, SPI ; $A0 b1010 reg15 movi r0, 0x01 ; SPI Select export r0, REG_SPI_SSEL ; $10 movi r3, 0x80 ; Turn on SSO bit export r3, REG_SPI_CONTROL ; $0C SPI Control ;---================------
http://pbuchegger.at/download/_BaMICO8.pdf > Zitat händisch move *.pl to cygin/bin Aber das denke ich nicht Fazit: makefile mit z.B lm8-deployer.pl sind auf einer make_File-Ebene . ############################## LatticeMico8 Development Tools User Guide ############################## ------------------------------ Hint: lm8_dev_tools_ug.pdf GNU-based Compiler Tools ------via-multible -RUN-CASCADE-STAGES---- ------PowerTools Force at make tool Hint: make Makefile make all ------------------------------------------- ******************************************* cygwin gtools ----> PATH ############################## --------------------------- tree ****************************************** PATH C:\LatticeMico8\gtools\bin ############################## Hint: makefile Home Base ??? *.pl *.pl means Perl Script files like C:\LatticeMico8\scripts\lm8-deployer.pl *.pl In same file-Folder as the Makefile resides -- *.pl File Hosted in ..\scripts\ lm8_linker.ld, lm8_linker_large.ld,lm8_linker_medium.ld,lm8_linker_small.ld ------------------------------------------------------------------------ ------- Ende 1
MachX0 Control Develop Kit Later i will use the new MachX02 with [{preengeneerd}] Embed. Stuff Fast State 10 case State Engine @2 clk Stoke --1Step.... @Lattice Semiconductor Corporation. Build Digital@+Analog FPGA inside ispPAC 30 Hint: Look in the owm Diamond IDE C:\lscc\LatticeMicoSystem\2.0\micosystem\components\gpio\drivers Hint: http://www.latticesemi.com/documents/MachXO%20PLDs%20in%20System%20Control%20Designs.pdf Hint: compile & run your own stuff Projects http://www.latticesemi.com/documents/LatticeMico8Tutorial.pdf # ------------------------------------------------------------------ ######################################################################## # ------------------------------------------------------------------------ - rem prom_init.hex" , "menue.hex" rem prom_init.v ------------------------------------------------------------------------ - "menue.hex" habe ich mit hex patch gemoddet. siehe Bild kommt aus ( EBR)? EmbededBlockRam via UART Print Routine. bingo> Das ist *.jed File (mit Bin..Stuff Fuse-Map drin. ) ######################################################################## # Hint: 0x2C005 is Opcode seti Thema(1) Hint: Da oben in co.asm ist der ProzessAnschluss# nich wie bei mir. Den co.asm muss ich also auch noch auf mein spezi. WishBone Modell modden. -------ACK:STACK_STUKTUR:----------------------------------------------- ------- assign wb_ack = { 1'b0, // Device #15 (UNUSED) ebr_ack, // Device #14 ACK (EBR)? EmbededBlockRam 1'b0, // Device #13 (UNUSED) sram_ack, // Device #12 ACK (SRAM) 1'b0, // Device #11 (UNUSED) spi_ack, // Device #10 ACK (SPI) 1'b0, // Device #9 (UNUSED) lcd_ack, // Device #8 ACK (LCD) 1'b0, // Device #7 (UNUSED) fan_ack, // Device #6 ACK (fan) 1'b0, // Device #5 (UNUSED) led_sw_ack, // Device #4 ACK (LED/Switches) i2c2_ack, // Device #3 ACK (PM I2C) i2c_ack, // Device #2 ACK (I2C) timer_ack, // Device #1 (TIMER) /*FU''#01*/ uart_ack // Device #0 ACK (UART) /*ProzessAnschluss_nummer FU-UART-AT'BASE_00*/ }; ######################################################################## ###### UART ProzessAnschluss# ist nicht 0 sondern Der Lattice MachXO WishBoneBus ist so einfach wie telefonieren. also File co.asm analysieren. Fazit: Prozess: Register Rules. and Procedure Steps +++++++++++++++++++++++++++ Reg R15 auf Uart_0 also erst mal in meinem "Daten_Modell" Null eintragen ................ ................ // movi r15, TIMER_1 // export r0, 0x00 ;; issue a 'write' to latch the current time value // import r4, 0x02 ;; wahl case hour byte of latched time value // .... call wait_for_uart_txrdy via r4 import kommt der StundenWert der als Addr_select 0x02 hat raus. >bigo nun noch das spezielle r4 Register als Param_werte auf ascii_BCD modden und an den UART mit respective des Timings(wait_for_uart_txrdy) ect. rausgeben. >Bingo. ######################################################################## #
Holger erster IRQ PseudoCode mit Eckdaten ## ResetMode> Mico8 PC =00000 org 00 ## store prog_conter absolut jmp start_m b startup_1 # jump ZILOG EZ8 ENCORE ??? ############################## ############################### org 02 ## vector irq trap int_handler: nop nop nop nop reti ## return from 'IRQ_? ##################################### ## ### #### ##---------------------------------- org 38 # like the ZILOG EZ8 ENCORE startup_1: # Label_1 seti # first set the program to be able to receive interrupt # and push nop nop if (irq_flg) ?? clear irq_flg ; nop nop b start_main_2 ## absolut JUMP ## free space ROM ################################### org 100 start_main_2: # main_2 loop Call App_Run_forever ## Call SubRoutine b start_main_2 # JMP back to start_main_2 org 120 ################################## App_Run_forever: nop nop ret ## Return from Sub ########################################## To do: Param mystic secret optons for Lattice MachX0 Embed MCU Check CallStack SratchPadMem IRQ Handling PUSH regs POP Regs like 80C535 Keil ICC Compiler
## Fibronacci asm as pdf. ##### Lattice Mico8 JMP $12 ######################### ##################################################### # Holgers *asm Design Pattern V1.0 'Reset--> PC=00000 ##################################################### b start ################################## Implementation b int_handler ## ROLC Rd, Rb nop nop # Hint: # 0x2C005 is Opcode seti # MasterIRqEnable seti # ghot-set the program to be able to receive MachXO -CPUinterrupt-enable nop nop b start ###'@execution' ## if irq_flg_hot? dont forget clri start: import r5, 5 ## mov r6, r5 andi r5, 0xf0 # masking r5 to decide type of program mov r7, r5 mov r5, r6 andi r5, 0x0f # masking r5 to get the speed mov r25, r5 cmpi r7, 0x10 bz phase2 cmpi r7, 0x20 bz phase2 #### b start # go back ####################### phase2: nop # waist time ###################### b start # go back ########################################################### ----------------------------------------------------------- int_handler: #''call save_reg # saving all registers into the #scratchpad ## holg_make a scratchPad via Params movi r0, 0xfe movi r1, 0xfd movi r2, 0xfb movi r3, 0xf7 movi r4, 0xef movi r5, 0xdf movi r6, 0xfe export r0, 0 call wait_extend ## ?? export r1, 1 call wait_extend export r2, 2 call wait_extend export r3, 3 call wait_extend export r4, 4 call wait_extend export r5, 5 call wait_extend export r6, 6 call wait_extend call load_reg # load the values from scratchpad back to registers ## last but not least if irq_flg_hot? dont ffforget clri ######################### iret ## end 'IRQ if irettuur ?? opcode instucion MCUdecoder ''IRQ_ACK #tick ### magic iret ################################################ ###### holg.Zilog<-Pop_Stack load_reg: lspi r31, r31 subi r31, 1 lspi r30, r31 nop ret ###### holgZilog->Push_Stack save_reg: movi r31, 0 sspi r0, r31 addi r31, 1 sspi r1, r31 ret ###############
troll schrieb: > Was soll das hier eigentlich werden wenn es fertig ist? Ich vermute mal eine psychotische Dekompensation... :-/
Das ist was gutes für den FPGA CPU (Synthesized). USER ###################################################### Hint: "Build from sratch via Bus Manager" http://www.origin.xilinx.com/csi/training/embedded-design-with-the-xilinx-embedded-developer-kit.htm So ist das im Xilinx MicroBlaze abgeleitet. [code] #include "xparameters.h" #include "xiomodule.h" int main() {u32 data; XIOModule gpi1; volatile int i = 0; // wegen data Cache ??? int g = 0; data = XIOModule_Initialize(&gpi1, XPAR_IOMODULE_0_DEVICE_ID); data = XIOModule_Start(&gpi1); xil_printf("-- Start of the Program --\r\n"); while (1) { data = XIOModule_DiscreteRead(&gpi1, 1); XIOModule_DiscreteWrite(&gpi1, 1, data); for (i=0; i<10000000; i++); g = g+1; xil_printf("-- run: %d --\r\n", g); } return 0; } [\code] ; HOLGER think FIXED ADDRES MAPPING UART 0x00,TIMER 0x10 .SPI. EBR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;; *** Utility Functions *** ;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; The "IoReadWord" and "IoWriteWord" are ; used to read/write the IO Bus. ; "XIOModule_DiscreteRead" and "XIOModule_DiscreteWrite" ; used in SIMPLEX FAST LINK as a local_Bus to the USER ; Custom Verilog_Sub_Modules as eg: uptime_wb.v defined [code] init_uart: ; : step_0 movi r15, UART ; IoWriteWord_IO PLB_periperal_local_Bus_sect Version (v46). ; : step_1 movi r0, 0x00 ; 'IER rx_tx_Interrupt ??? export r0, REG_UART_IER ; !XIOModule_DiscreteWrite ; : step_2 movi r0, 0x03 ; LCR rx+tx enable ??? export r0, REG_UART_LCR ; !XIOModule_DiscreteWrite ; : step_3 Return from Subroutine ret opcode ret [\code] ######################################################################## ####### [code] ; Hint: "WNR" means W-Rite NOT Read ___>___ issue a W-##Strobe-Bus-trigger event ; r4 runs via command "import r4,0x02" ; ... 02,01,00 as via a address_index on FAST SIPLEX BUS ; HH,MM,SS @R4 read_uptime: ;################################################################## movi r15, TIMER ; PLB (v46) select (trigger--export r0,0x00) export r0, 0x00 ;; issue a 'read_$00' to latch the current time value import r4, 0x02 ;;; hour byte of latched time value ; ################################################################## ...... call send_uart_data ;################################################################## movi r15, TIMER ; PLB (v46) select () import r4, 0x01 ;;; minute byte of time of latched time value ;################################################################## call int2asc10 ; takes r4 and converts to BCD in r8,r7,r6 mov r9, r7 call send_uart_data mov r9, r6 call send_uart_data movi r9, 'm' call send_uart_data ;################################################################## movi r15, TIMER ; PLB (v46) select () import r4, 0x00 ;;; seconds byte of time of latched time value ;################################################################## call int2asc10 ; takes r4 and converts to BCD in r8,r7,r6 mov r9, r7 call send_uart_data mov r9, r6 call send_uart_data movi r9, 's' call send_uart_data setz ; ????? SettZero what is that ret ; Return from Subroutine ;************{ENDE UPTIME_PROC:(01)]*************************** [\code] ; idcode now in r4 ; import as a Fetch and export as a Store, move r0 as a WNR ; Voacabulay: FORTH Language Parameter Stack r15********************r4,***,r0 ; First store a UART_TTY_0 in reg#15 ;
1 | ;################################################################## |
2 | movi r15, TIMER ; PLB (v46) select (trigger--export r0,0x00) |
3 | export r0, 0x00 ;; issue a 'read_$00' to latch the current time value |
4 | import r4, 0x02 ;;; hour byte of latched time value |
5 | ; ################################################################## |
6 | ......r0 bleibt auf 0, somit ist lesen aktiv LOW ! via Reg: r0 |
7 | ;################################################################## |
8 | movi r15, TIMER ; PLB (v46) select () |
9 | import r4, 0x01 ;;; minute byte of time of latched time value |
10 | |
11 | movi r15, TIMER ; PLB (v46) select () |
12 | import r4, 0x00 ;;; Sekunde byte of time of latched time value |
Fazit in Reg: "r4" steht die Address z.B (0x02,0x01,0x00) mit dem Befehl "import r4, 00" ist die Sekunde in Register r4 drin. Bingo>. Danach kann der Inhalt von r4 als 8Bit Wert convertiert zu BCD Routine. Danach kommt der Sekunden.Wert an der UART-Schnittstelle raus. Bingo>.
Wie genau ist die Haar-Trockenhaube oben links an den MicroBlaze-Core angeschlossen?
1 | ; Anhang: Für Lattice MachXO Control Developer Kit SOC |
2 | ; _Top Modul xo_control_soc_demo.v |
3 | ; MachXoMico8_reg1a.PNG |
4 | ; MachXoMico8_reg1b.PNG |
5 | ; Interprozess via bidir [WISHBONE-Interface] |
6 | ; PIPE UART <-->>TIMER-[Simplex-Sub_Bus_Addr]@Timer-Task# Diskrete:Read |
7 | ; Verilog code |
8 | (snip). |
9 | ; isp8_core # ( |
10 | ; "XO", |
11 | ; "prom_init.hex", // Import Verilog |
12 | ; (----snap--). |
13 | ; |
14 | ;###################################################################### |
15 | ; asm: export import Rules |
16 | |
17 | ; Register Rules r5,r9 |
18 | ; r0,r4 |
19 | ; Register r9 ist das MachxO_Tx >Register, via PIN# (F6) uart_tx |
20 | ; r5 ist das MachxO_Rx <|Register via PIN# (F5) uart_rx |
21 | ; |
22 | ; #### LOCATE COMP "uart_rx" SITE "F5" ; #pull up 10K. |
23 | ; #### LOCATE COMP "uart_tx" SITE "F6" ; |
24 | ;-------------------------------------------------------------- |
25 | ; UART Base ist 0x00000 via Mapping Build Order as Fixed Address. |
26 | ; LSR UART_Base +5 >LSR 0x0005 |
27 | ; (0x01) Maske Mach_RX 'bit_0 indicates "low" = Zeichen empf. |
28 | ; (0x20) Maske Mach_Tx 'bit_5 "high" = Zeichen tx_pendig go&wait |
29 | ;;;;;;;;;;;; Letzter Stand: 29/11/2012 14:43 ;;;;;;;;; |
30 | ; a_prom1.asm |
31 | ; prom_init.hex |
32 | ; PROGRAM PREPARE uart_tty_poll für Mico8 @Kernel V3.1 |
33 | ; R0 auf NULL setzen ->> "lesen" |
34 | ;;;prom 1024 ; laenge genau anpassen $400 1K 8KBit 2 * M4K Block |
35 | ;;;.org 0 |
36 | ;;; |
37 | ;================----================= |
38 | ; MAIN_UART_POLL 9600 |
39 | ; To_do: besser auf quick 115200 nur @TxHold-Reg, |
40 | ; Immer wieder der gleiche Fehler den die Kernel-Designer |
41 | ; machen kein TxShift-Reg ACK- |
42 | ; Das Shift-Register Empty ist Indikator fuer last |
43 | ; bit_emit bit as a Stop-Bit bingo> |
44 | ; --Zeichen sind bei 2400 deshalb nicht ok. siehe ZILOG eZ8 Encore |
45 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
46 | _start_up: ;;;;; Execute first Code at $0000:00000 |
47 | ;;;;;;;;;; |
48 | nop ;# _start_up SPACE IRQ VECTOR ! |
49 | nop ;# |
50 | nop ;# |
51 | start: ; clear all:Registers |
52 | ;;; .org 12 |
53 | ; <OPTION'Irq_Vector>@exec $0000< |
54 | ; seti ; CPU Interrupt enable !!!!!!! |
55 | |
56 | ; Hier geht es los |
57 | ;;;;__***********--------------------------------------- |
58 | b Main_Loop_1 ; >>Branch ## Main_Loop_1 |
59 | ;;;;_***********---------------------------------------- |
60 | |
61 | ;############[ init_uart ]######################### |
62 | init_uart: |
63 | ; IRQ Enable #EIR_1 --=)>(0x00) |
64 | ; $03 RX|TX ENABLE #LCR_3 --=)>(0x03) |
65 | ;----------------------------------- |
66 | ;*******************########************** |
67 | movi r15, 0x00 ; UART_sel_WishBone_Controller_Interface>Mux_BUS. |
68 | ;--------------------------------- |
69 | movi r0, 0x00 ; xor r0,r0 clear |
70 | export r0, 0x01 ; IE_Reg. NULL IRQ is disabled |
71 | ;------------------------------- |
72 | movi r0,0x03 ; |
73 | export r0,0x03 ; LCR (RX&TX) 0011 |
74 | ret ; |
75 | ;;;;; End of init_uart ;;;;;;;;;;;;; |
76 | ;############[ uart_rx_ready ]######################### |
77 | wait_for_uart_rx_ready: |
78 | movi r15, 0x00 ; #Uart_bus_sel.Readmode |
79 | uart_rx_rdy_loop: |
80 | import r1, 0x05 ; LSR |
81 | and r1,0x01 ; mask out |
82 | cmpi r1,0x01 ; <>0 |
83 | bnz uart_rx_rdy_loop |
84 | ret ; Return |
85 | ;;;;; wait_for_uart_rx_ready ;;;;;;;;;;;;; |
86 | |
87 | ;############[ uart_tx_ready ]######################### |
88 | wait_for_uart_tx_ready: |
89 | movi r15, 0x00 ; #Uart_bus_sel.Read |
90 | uart_tx_rdy_loop: |
91 | import r1, 0x05 ; LSR |
92 | and r1,0x20 ; mask out |
93 | cmpi r1,0x20 |
94 | bnz uart_tx_rdy_loop |
95 | ret ; Return |
96 | ;;;;; wait_for_uart_tx_ready ;;;;;;;;;;;;; |
97 | |
98 | ;############[ Sub_wait_uart_key ]################## |
99 | ; returns r5 with data |
100 | Sub_wait_uart_key: |
101 | call wait_for_uart_rx_ready ; |
102 | import r5, 0x00 ; REG_UART_DATA@ r5 ! |
103 | ret ; Return via r5 |
104 | ;;;;; Sub_wait_uart_key ;;;;;;;;;;;;; |
105 | |
106 | ;############[ Sub_Uart_Send_Data ]################ |
107 | ; movi r9, 0x41 -- A |
108 | Sub_Uart_Send_Data: |
109 | call wait_for_uart_tx_ready ; |
110 | export r9,0x00 ; r9@ Reg:UART_DATA ! | .machxO_tty.'emit ascii |
111 | ret ; |
112 | ;;;;; Sub_Uart_Send_Data ;;;;;;;;;;;;; |
113 | |
114 | ;--------------------------------------------------- |
115 | ; [<INIT STUFF>]#################################### |
116 | Main_Loop_1: |
117 | |
118 | call init_uart ; IRQ, EN_TX&RX -->MCU |
119 | |
120 | ;:::::::******************************************** |
121 | main_poll_1: ; RUN-APP_1 ">>>Launch" |
122 | ;################################### |
123 | ;########[Echo_Server_&Subs.]##### |
124 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
125 | ; call delay ; |
126 | call Sub_wait_uart_key ; key? (-- r5 ) |
127 | movi r9,r5 ; r5 @ r9 ! |
128 | call Sub_Uart_Send_Data ; ( r9 -- ) UART_DAT_§00 @ r5 ! |
129 | ; call delay ; |
130 | ;################################# |
131 | b main_poll_1 ; ## go back to main_poll_1 |
132 | ;::******'######################## |
133 | ; ***** END of a_prom1.asm *************** |
134 | ;############################################################## |
STOP
#################################################################### MachXoMico8_reg1b.PNG To do: Einstellen via Parameter: Ueber internal scratch Pad RAM, Call Stack Size . or nasty nested Calls via Return Adress ......Stack ... Zitat: I do remember the call/return capability was very useful as well as the internal scratch RAM. Debug could sometimes be a PITA due to having no internal visibility and being stuck with decoding adrs/data ports. They simulated well, too. <> Docu. http://link.brightcove.com/services/player/bcpid1384165827001?bckey=AQ~~,AAAABAHLGok~,a3rQal6KQNvidwRyNdKEnQiIAYU82O5J&bctid=1826273843001 Hint: Für SOC Design http://www.programmableplanet.com/author.asp?section_id=2030&doc_id=244784
WISHBONE_READ_CYCLE Der Befehl inport 0x02 , r4 holt die Stunden (HH ) via dat_o_reg4 Der Befehl inport 0x01 , r4 holt die Minuten (( MM )) ) via dat_o_reg4 Der Befehl inport 0x00 , r4 holt die Sekunden (((SS ))) ) via dat_o_reg4 Hint: W/NR --> Write not_Read --> @READ is AKTIV: @"Low" bingo> now Think: !AND && wb_stb && WB_cycle_i ; (! wb_we_i) && wb_stb_i && wb_cyc_i // <feed_Latch_Outregs via shaddow R to user WISHBONE SoC Architecture Specification, Revision B.3 http://cdn.opencores.org/downloads/wbspec_b3.pdf
c-declarations: auto accident; register voters; static electricity; struct by_lightning; void *where_prohibited; char broiled; short circuit; short changed; long johns; unsigned long letter; double entendre; double trouble; union organizer; float valve; short pants; union station; void check; unsigned check; struct dumb by[sizeof member];
// Switch Debounce Module // use your system clock for the clock input // to produce a synchronous, debounced output module debounce (reset, clock, noisy, clean); parameter DELAY = 270000; // .01 sec with a 27Mhz clock input reset, clock, noisy; output clean; reg [18:0] count; reg new, clean; always @(posedge clock or posedge reset) if (reset) begin count <= 0; new <= noisy; clean <= noisy; end else if (noisy != new) begin new <= noisy; count <= 0; end else if (count == DELAY) clean <= new; else count <= count+1; endmodule
Das MachXo2 Breakout Board ############################################################# http://www.latticesemi.com/documents/EB68.pdf http://de.mouser.com/new/latticesemi/latticeXO2plds/ http://www.latticesemi.com/documents/EB68.pdf http://www.latticesemi.com/lit/docs/technotes/tn1008.pdf ############################################################# Hint: IP latticesemi/IP IPExpress Tool Build via *.ipx File lpf = ucf *.s ist *.asm --------------------------------------------------------- *.ldf old *.sdf Project Import *.sty Strategie File. To do: Diamond 2.x install LCMXO2-1200ZE module Default_w_standby_t1top // : Default_w_standby_t1top (-- ) ( s_stdby_in,// #"69" stdby1, // #"38" oosc_clk, // #"40" led0 // #"97" ); //, led1_o); input s_stdby_in ; output stdby1, oosc_clk, // ; // output led0; //, led1_o; // oosc_clk#40 assign led1_o = s_stdby_in ? 1'b1 : ~ oosc_clk; // >><<<<<<<<<<<< //wire led1_o = osc_clk; ///* WIRE // osc_clk wire stby_flag ; reg [20:0] cnt ; /// assign clkout = clki ; /// assign rstout = rstn ; always @ (posedge oosc_clk or posedge s_stdby_in) begin begin : do_20bit_pp if (s_stdby_in) //begin : work_LED_20_bit cnt <= 0; //end else cnt <= (cnt + 1); end end ///* last assign wishes !!! assign led0 = s_stdby_in ? 1'b1 : cnt[20]; // // Internal Oscillator STUFF defparam OSCH_inst_1.NOM_FREQ = "2.08"; ///* This is the "default" frequency ! OSCH // create> OSCH_inst_1( .STDBY(stdby1 ), // 0=Enabled, 1=Disabled also Disabled with Bandgap=OFF .OSC(oosc_clk), .SEDSTDBY(/*empty_1*/) ); // this signal is not required if not using SED - see TN1199 for more details. pwr_cntrllr pcm1 ( .USERSTDBY( s_stdby_in ), .CLRFLAG(stby_flag ), .CFGSTDBY( 1'b0 ), // .STDBY( stdby1 ), .SFLAG( stby_flag ) ); endmodule
DUT outputs are Wires input are regs. *.lpf = Xilinx *.ucf // Beitrag "CPLD PROJECT MANAGER CLUSTER GRID" // Wie mache ich z.B eine LED_0[Vector] Group I/O [] // ALTERA DE1 FPGA board // Ben Krasnow ######################################################## BLOCK RESETPATHS ; BLOCK ASYNCPATHS ; FREQUENCY NET "oosc_clk_inferred_clock" 2.080000 MHz ; BANK 0 VCCIO 3.3 V; BANK 1 VCCIO 3.3 V; BANK 2 VCCIO 3.3 V; BANK 3 VCCIO 3.3 V; IOBUF ALLPORTS IO_TYPE=LVCMOS33 ; LOCATE COMP "oosc_clk" SITE "40" ;## LOCATE COMP "s_stdby_in" SITE "69" ; LOCATE COMP "stdby1" SITE "38" ; # LOCATE COMP "led0" SITE "97" ; LOCATE COMP "led1_o" SITE "98" ; #LOCATE COMP "led2" SITE "99" ; #LOCATE COMP "led3" SITE "100" ; #LOCATE COMP "led4" SITE "104" ; #LOCATE COMP "led5" SITE "105" ; #LOCATE COMP "led6" SITE "106" ; #LOCATE COMP "led7" SITE "107" ; IOBUF PORT "s_stdby_in" IO_TYPE=LVCMOS33 HYSTERESIS=SMALL PULLMODE=UP ; IOBUF PORT "stdby1" IO_TYPE=LVCMOS33 PULLMODE=UP ; IOBUF PORT "oosc_clk" IO_TYPE=LVCMOS33 PULLMODE=UP ; IOBUF PORT "led0" IO_TYPE=LVCMOS33 PULLMODE=UP ; USE PRIMARY NET "oosc_clk_inferred_clock" ; USE SECONDARY NET "s_stdby_in_c" ; ################################################################## // ?? Holg. stuff use lib Machxo2 all `timescale 1 ns / 1 ps module pwr_cntrllr (USERSTDBY, CLRFLAG, CFGSTDBY, STDBY, SFLAG); // wire i/o Port declarations input wire USERSTDBY; input wire CLRFLAG; input wire CFGSTDBY; output wire STDBY; output wire SFLAG; ///* < (#)WIRE > wire w_scuba_vlo; // WIRE VLO // create#1> scuba_vlo_inst (.Z(w_scuba_vlo)); defparam PCNTR_Inst0.BGOFF = "TRUE" ; defparam PCNTR_Inst0.POROFF = "TRUE" ; defparam PCNTR_Inst0.WAKEUP = "USER" ; defparam PCNTR_Inst0.TIMEOUT = "BYPASS" ; defparam PCNTR_Inst0.STDBYOPT = "USER_CFG" ;//?? PCNTR // create#2> PCNTR_Inst0 (.CLK(w_scuba_vlo), .USERTIMEOUT(w_scuba_vlo), .USERSTDBY(USERSTDBY), .CLRFLAG(CLRFLAG), .CFGWAKE(w_scuba_vlo), .CFGSTDBY(CFGSTDBY), .STDBY(STDBY), .STOP(/*EMPTY*/), .SFLAG(SFLAG)); // exemplar begin // exemplar end endmodule
///* Strategie damit das auch bei 2 modulen via Veriog geht: Project main_prj.xx Altera Design main_top.v = Verilog File module inside VERILOG File is a module main_t_top_1 Hint: Diamond Tool make a Top Module. via *.lpf File --like *.ucf in Xilinx ------------------------------------------- http://www.youtube.com/watch?v=If4iiz4I8Vk KEY[0] KEY[1] ------- Create> Vector NODES ---------------------- Konduction ueber Bus Bundel. Nios aufsetzen. Beitrag "NiosII Manuell aufsetzen" Gruss Holger
1 | // File: default_w_standby_top.v |
2 | // Letzter Stand: 24.12.2012 |
3 | module ///* Module-DEFINITIONS : Default_w_standby_top.v ( a_5 i/o Ports -- ) |
4 | Default_w_standby_t1top // |
5 | ( // Pinning: |
6 | s_stdby_in, // #"69" |
7 | stand_by_1, // #"38" |
8 | oosc_clk, // #"40" |
9 | led0, // #"97" |
10 | sram_addr_1 // #"100" |
11 | ); |
12 | ///*in_Inp: << |
13 | input s_stdby_in ; |
14 | ///*o_OUTp:>>====================== |
15 | output stand_by_1; |
16 | output oosc_clk; |
17 | output led0; |
18 | output sram_addr_1; |
19 | //########################################################### |
20 | // oosc_clk#40 |
21 | // via *.UCF *.lpf -->user constraint> bingo. |
22 | assign led1_o = s_stdby_in ? 1'b1 : ~ oosc_clk; // |
23 | // Bus-phi--Out to z.B atmega8 Chip |
24 | ///* 1 last <<< assign wish !!! |
25 | |
26 | |
27 | // assign sram_addr_1 = s_stdby_in ? 1'b1 : oosc_clk; |
28 | // >><<<<<<<<<<<< |
29 | //wire led1_o = osc_clk; ///* WIRE |
30 | |
31 | // osc_clk |
32 | wire w_STAND_BY_FLAG_1 = s_stdby_in; // ???? |
33 | // To do: |
34 | /// assign clkout = clki ; |
35 | /// assign rstout = rstn ; |
36 | // need a Register |
37 | reg [21:0] cnt ; // work reg. |
38 | // LED via "CLK_en Taster" als int.Chip_Clock Tester |
39 | // Achtung: Der Bus an SPI,IC2 ist damit auch totgelegt. |
40 | always @ (posedge oosc_clk or posedge s_stdby_in) begin // |
41 | begin : do_20bit_pp |
42 | if (s_stdby_in) //begin : work_LED_20_bit |
43 | cnt <= 0; |
44 | //end |
45 | else |
46 | cnt <= (cnt + 1); // Increment |
47 | end |
48 | end |
49 | ///* 3 last assign wishes !!! |
50 | assign sram_addr_1 = ~ cnt[20]; |
51 | assign sram_addr_0 = cnt[20]; |
52 | assign led0 = s_stdby_in ? 1'b1 : cnt[20]; |
53 | // Also mit TAB am Ende endmodule |
54 | //============================================================================================== |
55 | // Das ist der eingebaute interne Ring-Oszi. MachXO2 |
56 | ///* Internal Oscillator oscH-<> harness 'STUFF !!! |
57 | defparam OSCH_inst_1.NOM_FREQ = "2.08"; ///* This is the "default" frequency ! |
58 | OSCH ///*create_(1)> |
59 | OSCH_inst_1( .STDBY(stand_by_1 ), // 0=Enabled, 1=Disabled also Disabled with Bandgap=OFF |
60 | .OSC( oosc_clk), |
61 | .SEDSTDBY(/*SEDSTDBY*/ /*empty_1*/) ); |
62 | // this signal is not required if not using SED - see TN1199 for more details. |
63 | //=============================================================================================== |
64 | pwr_cntrllr ///*create_(2)> |
65 | pcm1 ( .USERSTDBY( s_stdby_in ), |
66 | .CLRFLAG( w_STAND_BY_FLAG_1 ), // via wire flag |
67 | .CFGSTDBY( 1'b0 ), // NULL via CFG |
68 | .STDBY( stand_by_1 ), // |
69 | .SFLAG( w_STAND_BY_FLAG_1 ) // via wire flag |
70 | ); // |
71 | //############################################## |
72 | |
73 | endmodule |
74 | // |
75 | // http://www.asic-world.com/examples/verilog/uart.html |
Diamond Reveal Hardware Debugger https://www.youtube.com/watch?v=OXxxLRRQmQ4&list=UU5Vv9B2edWD5x57B7mvUDXg&index=20 Damit werde ich mich noch befassen. Hiracical Browser habe ich bei Lattice Diamond, Source of signal map, Load of signal . Der findet somit das Signal via Browse go to Source Code. Aber das Code Patata Tool bringt da noch mehr. Ähnlich wie das Sigasi Tool. Vielleicht wäre das HDL Code Analyse Tool Kit eine Option für Dich? Gruss Holger.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.