[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[microblaze-uclinux] ethernet + EMC



Hi folks,

Trying to bring up networking on uClinux, first step I've put a xilinx 
ethernet MAC core in my project (surprisingly enough called 
mbvanilla_net :).

Anyway I've found that when I include the MAC core, all of a sudden my 
EMC peripheral (which drives the flash and SRAM) doesn't work.  The low 
byte of all reads in the EMC address space returns 0xFF...the high 3 
bytes are fine...

I can query the ethernet MAC device ID register, and the BRAM and DDR 
memory are unaffected.

So, I can upload an image direct into DDR and execute it, no problems, 
however my bootloading process of reading from flash and so on can't 
work - all reads from flash are corrupted by this 0xFF byte.

Has anybody had any experiences, positive or negative, re: using the EMC 
and EMAC in the same target?  I've attached the mhs and ucf files for 
reference.

Any ideas of where to look would be greatly appreciated.

Thanks,

John
# Parameters
PARAMETER VERSION = 2.0.0

# Global Ports

PORT ext_clk = ext_clk, DIR = IN
PORT ddr_clk_fb = ddr_clk_fb, DIR = IN

PORT sys_rstn = sys_rstn, DIR = IN

PORT console_uart_rx = console_uart_rx, DIR = IN
PORT console_uart_tx = console_uart_tx, DIR = OUT

PORT debug_uart_rx = debug_uart_rx, DIR = IN
PORT debug_uart_tx = debug_uart_tx, DIR = OUT

PORT sram_cen = sram_cen , DIR = OUT, VEC = [0:1]
PORT sram_addr = sram_addr , DIR = OUT, VEC = [0:31]
PORT sram_ben = sram_ben , DIR = OUT, VEC = [0:3]
PORT sram_data = sram_data , DIR = INOUT, VEC = [0:31]
PORT sram_oen = sram_oen, DIR = OUT
PORT sram_wen = sram_wen, DIR = OUT
PORT sram_rst = sram_rst, DIR = OUT

PORT gpio = gpio, DIR = INOUT, VEC = [0:31]

PORT ddr_clk = ddr_clk, DIR = OUT
PORT ddr_clkn = ddr_clkn, DIR = OUT
PORT ddr_clke = ddr_clke, DIR = OUT
PORT ddr_csn = ddr_csn, DIR = OUT
PORT ddr_rasn = ddr_rasn, DIR = OUT
PORT ddr_casn = ddr_casn, DIR = OUT
PORT ddr_wen = ddr_wen, DIR = OUT
PORT ddr_dqm = ddr_dqm, DIR = OUT, VEC = [0:1]
PORT ddr_bankaddr = ddr_bankaddr, DIR = OUT, VEC = [0:1]
PORT ddr_addr = ddr_addr, DIR = OUT, VEC = [0:12]
PORT ddr_dq = ddr_dq, DIR = INOUT, VEC = [0:15]
PORT ddr_dqs = ddr_dqs, DIR = INOUT, VEC = [0:1]

PORT ETH_COL = ETH_COL, DIR = IN
PORT ETH_CRS = ETH_CRS, DIR = IN
PORT ETH_MDC = ETH_MDC, DIR = IN
PORT ETH_MDIO = ETH_MDIO, DIR = IN
PORT ETH_RXC = ETH_RXC, DIR = IN
PORT ETH_RXD = ETH_RXD, DIR = IN, VEC = [3:0]
PORT ETH_RXDV = ETH_RXDV, DIR = IN
PORT ETH_RXER = ETH_RXER, DIR = IN
PORT ETH_TXC = ETH_TXC, DIR = IN
PORT ETH_TXD = ETH_TXD, DIR = OUT, VEC = [3:0]
PORT ETH_TXEN = ETH_TXEN, DIR = OUT
PORT ETH_TXER = ETH_TXER, DIR = OUT
PORT PHY_RESETn = PHY_RESETn, DIR = OUT
# Sub Components
BEGIN microblaze
 PARAMETER INSTANCE = microblaze
 PARAMETER HW_VER = 2.00.a
 PORT CLK = sys_clk

 PARAMETER C_USE_BARREL = 1
 PARAMETER C_DEBUG_ENABLED = 0 #1
 PARAMETER C_NUMBER_OF_PC_BRK = 0 #2
 PARAMETER C_NUMBER_OF_RD_ADDR_BRK = 0 #2
 PARAMETER C_NUMBER_OF_WR_ADDR_BRK = 0 #2
 PARAMETER C_USE_DIV = 1

 PARAMETER C_USE_ICACHE = 0
 PARAMETER C_ICACHE_BASEADDR  = 0x80000000
 PARAMETER C_ICACHE_HIGHADDR  = 0x80FFFFFF
 PARAMETER C_CACHE_BYTE_SIZE  = 16384

 PARAMETER C_USE_DCACHE = 0
 PARAMETER C_DCACHE_BASEADDR  = 0x80000000
 PARAMETER C_DCACHE_HIGHADDR  = 0x80FFFFFF
 PARAMETER C_DCACHE_BYTE_SIZE = 16384

 PORT INTERRUPT = interrupt
 BUS_INTERFACE DLMB = d_lmb_v10
 BUS_INTERFACE ILMB = i_lmb_v10
 BUS_INTERFACE DOPB = d_opb_v20
 BUS_INTERFACE IOPB = d_opb_v20
END

# inverter to convert active low sys_rstn to active high sys_rst
BEGIN my_inverter
 PARAMETER INSTANCE = rst_inverter
 PORT I = sys_rstn
 PORT O = sys_rst
END

BEGIN ddr_clk_gen
 PARAMETER INSTANCE = my_ddr_clk_gen
 PARAMETER HW_VER = 1.00.a
 PARAMETER C_CLKIN_PERIOD_NS = 15.0     # 66mhz internal clock
 PORT CLK_IN = clk66mhz			# 66mhz "external" clock
 PORT CLK_RST = sys_rst             	# tie DCM reset to system reset (active low)
 PORT DDR_CLK_FB = ddr_clk_fb           # feedback from outside
 PORT CLK0 = sys_clk                    # drive system clock with this one
 PORT CLK90 = sys_clk_90                # 90 deg phase shifted system clock
 PORT DDR_CLK_90 = ddr_clk_90           # external feedback 90 deg phase shift
 #PORT CORE_DCM_LOCKED = core_dcm_locked
 #PORT DDR_DCM_LOCKED = ddr_dcm_locked
END

BEGIN opb_ddr
 PARAMETER INSTANCE = ddr_controller
 PARAMETER HW_VER = 1.00.b
 PARAMETER C_OPB_CLK_PERIOD_PS = 15000          # 100mhz clock
 PARAMETER C_INCLUDE_BURST_SUPPORT = 0
 PARAMETER C_DQS_PULLUPS = 1
 PARAMETER C_REG_DIMM = 0
 PARAMETER C_DDR_TMRD = 15000
 PARAMETER C_DDR_TWR = 15000
 PARAMETER C_DDR_TWTR = 1
 PARAMETER C_DDR_TRAS = 40000
 PARAMETER C_DDR_TRC = 65000
 PARAMETER C_DDR_TRFC = 75000
 PARAMETER C_DDR_TRCD = 20000
 PARAMETER C_DDR_TRRD = 15000
 PARAMETER C_DDR_TREFC = 70000000
 PARAMETER C_DDR_TREFI = 7800000
 PARAMETER C_DDR_TRP = 20000
 PARAMETER C_DDR_CAS_LAT = 2
 PARAMETER C_DDR_DWIDTH = 16
 PARAMETER C_DDR_AWIDTH = 13
 PARAMETER C_DDR_COL_AWIDTH = 9
 PARAMETER C_DDR_BANK_AWIDTH = 2
 PARAMETER C_BASEADDR = 0x80000000
 PARAMETER C_HIGHADDR = 0x80FFFFFF
 PORT OPB_Clk = sys_clk                         # system clock
 PORT Clk90_in = sys_clk_90                     # phase shifted sys_clk
 PORT DDR_Clk90_in = ddr_clk_90                 # phase shifted feedback clk
 PORT DDR_Clk = ddr_clk                         # output clocks
 PORT DDR_Clkn = ddr_clkn                       # inverted clock
 PORT DDR_CKE = ddr_clke
 PORT DDR_CSn = ddr_csn
 PORT DDR_RASn = ddr_rasn
 PORT DDR_CASn = ddr_casn
 PORT DDR_WEn = ddr_wen
 PORT DDR_DM = ddr_dqm
 PORT DDR_BankAddr = ddr_bankaddr
 PORT DDR_Addr = ddr_addr
 PORT DDR_DQ = ddr_dq
 PORT DDR_DQS = ddr_dqs
 BUS_INTERFACE SOPB = d_opb_v20
END

BEGIN opb_memcon
 PARAMETER INSTANCE = system_memcon
 PARAMETER HW_VER = 1.00.a
 PARAMETER C_OPB_CLOCK_PERIOD_PS = 15000
 PARAMETER C_NUM_BANKS_MEM = 2
 PARAMETER C_BASEADDR = 0xffff0000
 PARAMETER C_HIGHADDR = 0xffff00ff
 PARAMETER C_MEM0_BASEADDR = 0xffe00000
 PARAMETER C_MEM0_HIGHADDR = 0xffefffff
 PARAMETER C_MEM1_BASEADDR = 0xff000000
 PARAMETER C_MEM1_HIGHADDR = 0xff7fffff
 PORT Mem_CEN = sram_cen
 PORT Mem_A = sram_addr
 PORT Mem_BEN = sram_ben
 PORT Mem_DQ = sram_data
 PORT Mem_OEN = sram_oen
 PORT Mem_WEN = sram_wen
 PORT OPB_Clk = sys_clk
 PORT Mem_RPN = sram_rst
 PORT Mem_Status_Intrpt = 
 BUS_INTERFACE SOPB = d_opb_v20
END

BEGIN opb_uartlite
 PARAMETER INSTANCE = console_uart
 PARAMETER HW_VER = 1.00.b
 PARAMETER C_BAUDRATE = 57600
 PARAMETER C_DATA_BITS = 8
 PARAMETER C_USE_PARITY = 0
 PARAMETER C_ODD_PARITY = 0
 PARAMETER C_CLK_FREQ = 66_666_667
 PARAMETER C_BASEADDR = 0xFFFF2000
 PARAMETER C_HIGHADDR = 0xFFFF20FF
 PORT Interrupt = console_uart_interrupt
 PORT OPB_Clk = sys_clk
 PORT RX = console_uart_rx
 PORT TX = console_uart_tx
 BUS_INTERFACE SOPB = d_opb_v20
END

BEGIN opb_uartlite
 PARAMETER INSTANCE = debug_uart
 PARAMETER HW_VER = 1.00.b
 PARAMETER C_DATA_BITS = 8
 PARAMETER C_CLK_FREQ = 66_666_667
 PARAMETER C_BAUDRATE = 230400
 PARAMETER C_USE_PARITY = 0
 PARAMETER C_ODD_PARITY = 0
 PARAMETER C_BASEADDR = 0xFFFF4000
 PARAMETER C_HIGHADDR = 0xFFFF40FF
 PORT Interrupt = debug_uart_interrupt
 PORT OPB_Clk = sys_clk
 PORT RX = debug_uart_rx
 PORT TX = debug_uart_tx
 BUS_INTERFACE SOPB = d_opb_v20
END

BEGIN opb_intc
 PARAMETER INSTANCE = system_intc
 PARAMETER HW_VER = 1.00.c
 PARAMETER C_BASEADDR = 0xffff3000
 PARAMETER C_HIGHADDR = 0xffff30ff
 PORT Irq = interrupt 
 PORT OPB_Clk = sys_clk
 PORT Intr = ethernet_interrupt & debug_uart_interrupt & console_uart_interrupt & timer_interrupt 
 BUS_INTERFACE SOPB = d_opb_v20
END

BEGIN opb_timer
 PARAMETER INSTANCE = system_timer
 PARAMETER HW_VER = 1.00.b
 PARAMETER C_BASEADDR = 0xffff1000
 PARAMETER C_HIGHADDR = 0xffff10ff
 PORT OPB_Clk = sys_clk
 PORT Interrupt = timer_interrupt
 BUS_INTERFACE SOPB = d_opb_v20
END

BEGIN opb_gpio
 PARAMETER INSTANCE = system_gpio
 PARAMETER HW_VER = 1.00.a
 PARAMETER C_BASEADDR = 0xffff5000
 PARAMETER C_HIGHADDR = 0xffff50ff
 PORT GPIO_IO = gpio
 PORT OPB_Clk = sys_clk
 BUS_INTERFACE SOPB = d_opb_v20
END

BEGIN lmb_bram_if_cntlr
 PARAMETER INSTANCE = d_lmb_bram_if_cntlr
 PARAMETER HW_VER = 1.00.b
 PARAMETER C_BASEADDR = 0x00000000
 PARAMETER C_HIGHADDR = 0x00003FFF
 PORT LMB_Clk = sys_clk
 BUS_INTERFACE SLMB = d_lmb_v10
 BUS_INTERFACE BRAM_PORT = conn_0
END

BEGIN lmb_bram_if_cntlr
 PARAMETER INSTANCE = i_lmb_bram_if_cntlr
 PARAMETER HW_VER = 1.00.b
 PARAMETER C_BASEADDR = 0x00000000
 PARAMETER C_HIGHADDR = 0x00003FFF
 PORT LMB_Clk = sys_clk
 BUS_INTERFACE SLMB = i_lmb_v10
 BUS_INTERFACE BRAM_PORT = conn_1
END

BEGIN bram_block
 PARAMETER INSTANCE = bram
 PARAMETER HW_VER = 1.00.a
 PARAMETER C_MEMSIZE = 16384
 BUS_INTERFACE PORTA = conn_0
 BUS_INTERFACE PORTB = conn_1
END

BEGIN opb_v20
 PARAMETER INSTANCE = d_opb_v20
 PARAMETER HW_VER = 1.10.b
 PORT OPB_Clk = sys_clk
 PORT SYS_Rst = sys_rst
END

BEGIN lmb_v10
 PARAMETER INSTANCE = i_lmb_v10
 PARAMETER HW_VER = 1.00.a
 PORT LMB_Clk = sys_clk
 PORT SYS_Rst = sys_rst
END

BEGIN lmb_v10
 PARAMETER INSTANCE = d_lmb_v10
 PARAMETER HW_VER = 1.00.a
 PORT LMB_Clk = sys_clk
 PORT SYS_Rst = sys_rst
END

BEGIN my_dcm
 PARAMETER INSTANCE = system_dcm
 PARAMETER HW_VER = 1.00.a
 PARAMETER C_CLKIN_PERIOD_NS = 10.0
 PARAMETER C_DIVISOR = 3
 PARAMETER C_INBUFFER = TRUE
 PARAMETER C_MULTIPLIER = 2
 PARAMETER C_OUTBUFFER = TRUE
 PORT CLK_IN = ext_clk			# external clock input pin
 PORT CLK_RST = net_gnd
 PORT CLK_0 = clk_fb_o
 PORT CLK_FB = clk_fb_i
 PORT CLK_FX = clk66mhz			# input to ddr_clk_gen module
END

BEGIN my_bufg
 PARAMETER INSTANCE = dcm_feedback_bufg
 PORT I = clk_fb_o
 PORT O = clk_fb_i
END

# BEGIN opb_mdm
# PARAMETER INSTANCE = mdm
# PARAMETER HW_VER = 1.00.c
# PARAMETER C_BASEADDR = 0xffff7000
# PARAMETER C_HIGHADDR = 0xffff70ff
# PORT OPB_Clk = sys_clk
# BUS_INTERFACE SOPB = d_opb_v20
#END

BEGIN opb_ethernet
 PARAMETER INSTANCE = ether
 PARAMETER C_FAMILY = virtex2
 PARAMETER HW_VER = 1.00.k
 PARAMETER C_DMA_PRESENT = 1
 PARAMETER C_DMA_INTR_COALESCE = 1
 PARAMETER C_OPB_CLK_PERIOD_PS = 15000
 PARAMETER C_BASEADDR = 0xC0000000
 PARAMETER C_HIGHADDR = 0xC0003FFF
 PORT OPB_Clk = sys_clk
 PORT OPB_Rst = sys_rst
 PORT PHY_col = ETH_COL
 PORT PHY_crs = ETH_CRS
 PORT PHY_Mii_clk = ETH_MDC
 PORT PHY_Mii_data = ETH_MDIO
 PORT PHY_rx_clk = ETH_RXC
 PORT PHY_rx_data = ETH_RXD
 PORT PHY_dv = ETH_RXDV
 PORT PHY_rx_er = ETH_RXER
 PORT PHY_tx_clk = ETH_TXC
 PORT PHY_tx_data = ETH_TXD
 PORT PHY_tx_en = ETH_TXEN
 PORT PHY_tx_er = ETH_TXER
 PORT PHY_rst_n = PHY_RESETn
 PORT Freeze = net_gnd
 PORT IP2INTC_Irpt = ethernet_interrupt
 BUS_INTERFACE MSOPB = d_opb_v20
END
######################################################
# Clock Period Constraints
######################################################
NET "sys_clk" TNM_NET = "sys_clk";
TIMESPEC "TS_sys_clk" = PERIOD "sys_clk" 15 ns HIGH 50 %;
NET "sys_clk_90" TNM_NET = "sys_clk_90";
TIMESPEC "TS_CLK90" = PERIOD "sys_clk_90" 15 ns HIGH 50% ;
TIMESPEC "TSCLK2CLK90" = FROM "sys_clk" TO "sys_clk_90" 3 ns;
NET "ddr_clk_90" TNM_NET = "ddr_clk_90";
TIMESPEC "TS_ddr_clk_90" = PERIOD "ddr_clk_90" 15 ns HIGH 50 %;

######################################################
# IO Standards constraints
######################################################
NET "ddr_dqs<0>" IOSTANDARD=SSTL2_I;
NET "ddr_dqs<0>" PULLDOWN;
NET "ddr_dqs<1>" IOSTANDARD=SSTL2_I;
NET "ddr_dqs<1>" PULLDOWN;

NET "ddr_dq<0>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<1>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<2>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<3>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<4>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<5>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<6>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<7>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<8>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<9>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<10>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<11>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<12>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<13>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<14>" IOSTANDARD=SSTL2_I;
NET "ddr_dq<15>" IOSTANDARD=SSTL2_I;

NET "ddr_addr<0>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<1>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<2>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<3>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<4>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<5>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<6>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<7>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<8>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<9>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<10>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<11>" IOSTANDARD=SSTL2_I;
NET "ddr_addr<12>" IOSTANDARD=SSTL2_I;

NET "ddr_clk_fb" IOSTANDARD=SSTL2_I;
NET "ddr_clk" IOSTANDARD=SSTL2_I;
NET "ddr_clkn" IOSTANDARD=SSTL2_I;
NET "ddr_dqm<1>" IOSTANDARD=SSTL2_I;
NET "ddr_dqm<0>" IOSTANDARD=SSTL2_I;
NET "ddr_bankaddr<1>" IOSTANDARD=SSTL2_I;
NET "ddr_bankaddr<0>" IOSTANDARD=SSTL2_I;
NET "ddr_casn" IOSTANDARD=SSTL2_I;
NET "ddr_clke" IOSTANDARD=SSTL2_I;
NET "ddr_csn" IOSTANDARD=SSTL2_I;
NET "ddr_rasn" IOSTANDARD=SSTL2_I;
NET "ddr_wen" IOSTANDARD=SSTL2_I;

###############################################################################
# Pin Assignments
###############################################################################

# external 100MHz oscillator
NET "ext_clk" LOC = "B11";

# external reset pin (push 2).  Active low
NET "sys_rstn" LOC = "A6";

# stdio uart tx/rx goes to the main board RS232 driver
NET "console_uart_tx" LOC = "A7";
NET "console_uart_rx" LOC = "B7";

# debug uart tx/rx goes to P160 comms board RS232 driver
NET "debug_uart_tx" LOC = "H22";
NET "debug_uart_rx" LOC = "H21";

# sram/flash address pins

# put unused lines on harmless pins
NET "sram_addr<31>" LOC = "H2";
NET "sram_addr<30>" LOC = "H1";
NET "sram_addr<6>" LOC = "J2"; # A22
NET "sram_addr<5>" LOC = "J1"; # A22
NET "sram_addr<4>" LOC = "K1"; # A22
NET "sram_addr<3>" LOC = "K2"; # A22
NET "sram_addr<2>" LOC = "E4"; # A22
NET "sram_addr<1>" LOC = "E3"; # A22
NET "sram_addr<0>" LOC = "F4"; # A22
# now real pins
NET "sram_addr<29>" LOC = "W8";
NET "sram_addr<28>" LOC = "AB6";
NET "sram_addr<27>" LOC = "V8";
NET "sram_addr<26>" LOC = "W7";
NET "sram_addr<25>" LOC = "V9";
NET "sram_addr<24>" LOC = "AA6";
NET "sram_addr<23>" LOC = "V7";
NET "sram_addr<22>" LOC = "AB5";
NET "sram_addr<21>" LOC = "AB18";
NET "sram_addr<20>" LOC = "AA17";
NET "sram_addr<19>" LOC = "Y14";
NET "sram_addr<18>" LOC = "Y15";
NET "sram_addr<17>" LOC = "AB16";
NET "sram_addr<16>" LOC = "AB17";
NET "sram_addr<15>" LOC = "AB15";
NET "sram_addr<14>" LOC = "W14";
NET "sram_addr<13>" LOC = "W13";
NET "sram_addr<12>" LOC = "Y7";
NET "sram_addr<11>" LOC = "Y6";
NET "sram_addr<10>" LOC = "AA16";
NET "sram_addr<9>" LOC = "W6";
NET "sram_addr<8>" LOC = "AA15";
NET "sram_addr<7>" LOC = "W17"; # A22

# data pins
NET "sram_data<31>" LOC = "AA12";
NET "sram_data<30>" LOC = "U14";
NET "sram_data<29>" LOC = "W15";
NET "sram_data<28>" LOC = "Y12";
NET "sram_data<27>" LOC = "Y16";
NET "sram_data<26>" LOC = "AA13";
NET "sram_data<25>" LOC = "Y17";
NET "sram_data<24>" LOC = "W16";
NET "sram_data<23>" LOC = "V12";
NET "sram_data<22>" LOC = "AB13";
NET "sram_data<21>" LOC = "W12";
NET "sram_data<20>" LOC = "V16";
NET "sram_data<19>" LOC = "AB14";
NET "sram_data<18>" LOC = "Y13";
NET "sram_data<17>" LOC = "V13";
NET "sram_data<16>" LOC = "AA14";
NET "sram_data<15>" LOC = "Y8";
NET "sram_data<14>" LOC = "AA7";
NET "sram_data<13>" LOC = "W9";
NET "sram_data<12>" LOC = "U11";
NET "sram_data<11>" LOC = "Y9";
NET "sram_data<10>" LOC = "AB8";
NET "sram_data<9>" LOC = "AB9";
NET "sram_data<8>" LOC = "U13";
NET "sram_data<7>" LOC = "AB7";
NET "sram_data<6>" LOC = "U9";
NET "sram_data<5>" LOC = "U10";
NET "sram_data<4>" LOC = "AA8";
NET "sram_data<3>" LOC = "U12";
NET "sram_data<2>" LOC = "AA9";
NET "sram_data<1>" LOC = "W10";
NET "sram_data<0>" LOC = "Y10";

#and control signals
NET "sram_cen<0>" LOC = "AB12";
NET "sram_cen<1>" LOC = "V10";
NET "sram_wen" LOC = "AA5";
NET "sram_oen" LOC = "V14";
NET "sram_ben<0>" LOC = "G19";
NET "sram_ben<1>" LOC = "H20";
NET "sram_ben<2>" LOC = "G20";
NET "sram_ben<3>" LOC = "H19";
# NET "sram_STS"    LOC = "V6";
NET "sram_rst" LOC = "E18";


# DDR pins.  Watch for endian conversions
# Address first
# DDR Controller signal                   DDR chip pin
NET "ddr_addr<12>" LOC = "B18";         # DDR_A0
NET "ddr_addr<11>" LOC = "A18";
NET "ddr_addr<10>" LOC = "B17";
NET "ddr_addr<9>" LOC = "A17";
NET "ddr_addr<8>" LOC = "N17";
NET "ddr_addr<7>" LOC = "P18";
NET "ddr_addr<6>" LOC = "P17";
NET "ddr_addr<5>" LOC = "M18";
NET "ddr_addr<4>" LOC = "M19";
NET "ddr_addr<3>" LOC = "M20";
NET "ddr_addr<2>" LOC = "A19";
NET "ddr_addr<1>" LOC = "N18";
NET "ddr_addr<0>" LOC = "N20";          # DDR_A12

# data
NET "ddr_dq<15>" LOC = "Y21";           # DQ_0
NET "ddr_dq<14>" LOC = "Y22";
NET "ddr_dq<13>" LOC = "W21";
NET "ddr_dq<12>" LOC = "V21";
NET "ddr_dq<11>" LOC = "V22";
NET "ddr_dq<10>" LOC = "U21";
NET "ddr_dq<9>" LOC = "U22";
NET "ddr_dq<8>" LOC = "T21";
NET "ddr_dq<7>" LOC = "R20";
NET "ddr_dq<6>" LOC = "R19";
NET "ddr_dq<5>" LOC = "T20";
NET "ddr_dq<4>" LOC = "T19";
NET "ddr_dq<3>" LOC = "U19";
NET "ddr_dq<2>" LOC = "V20";
NET "ddr_dq<1>" LOC = "V19";
NET "ddr_dq<0>" LOC = "W20";            # DQ_15

NET "ddr_bankaddr<1>" LOC = "M21";      # BS_0
NET "ddr_bankaddr<0>" LOC = "B19";      # BS_1
NET "ddr_dqm<1>" LOC = "R21";            # LDM
NET "ddr_dqm<0>" LOC = "T22";            # UDM
NET "ddr_dqs<1>" LOC = "P20";           # LDQS
NET "ddr_dqs<0>" LOC = "P19";           # UDQS
NET "ddr_csn" LOC = "N22";
NET "ddr_rasn" LOC = "N21";
NET "ddr_casn" LOC = "P21";
NET "ddr_wen" LOC = "R22";
NET "ddr_clke" LOC = "N19";

NET "ddr_clk" LOC = "D12";
NET "ddr_clkn" LOC = "E12";
NET "ddr_clk_fb" LOC = "F13";

# gpio
# left LEDs
# No 8th segment, so left unconnected
NET "gpio<0>" LOC = "D9";
NET "gpio<1>" LOC = "C9";
NET "gpio<2>" LOC = "F11";
NET "gpio<3>" LOC = "F9";
NET "gpio<4>" LOC = "F10";
NET "gpio<5>" LOC = "D10";
NET "gpio<6>" LOC = "C10";

#right LEDs
# No 8th segment, so left unconnected
NET "gpio<8>" LOC = "B9";
NET "gpio<9>" LOC = "A8";
NET "gpio<10>" LOC = "B8";
NET "gpio<11>" LOC = "E7";
NET "gpio<12>" LOC = "E8";
NET "gpio<13>" LOC = "E10";
NET "gpio<14>" LOC = "E9";

# user LED, use as power indicator
NET "gpio<15>" LOC = "A9";

#DIP switches
NET "gpio<16>" LOC = "C6"; # sw 8
NET "gpio<17>" LOC = "D6"; # sw 7
NET "gpio<18>" LOC = "A5"; # ...
NET "gpio<19>" LOC = "B5";
NET "gpio<20>" LOC = "C5";
NET "gpio<21>" LOC = "C4";
NET "gpio<22>" LOC = "A4"; # sw 2
NET "gpio<23>" LOC = "B4"; # sw 1

# Ethernet Pin constraints
NET "ETH_TXC"    LOC = "C11";    #LIOA35(.2v5)
NET "ETH_RXC"    LOC = "D11";    #LIOA33(.2v5)
NET "ETH_CRS"    LOC = "J19";    #LIOB25
NET "ETH_RXDV"   LOC = "D22";     #LIOA17(.2v5)
NET "ETH_RXD<0>"    LOC = "E21"; #LIOB17
NET "ETH_RXD<1>"    LOC = "E22"; #LIOB16
NET "ETH_RXD<2>"    LOC = "F21"; #LIOA15
NET "ETH_RXD<3>"    LOC = "F22"; #LIOB15
NET "ETH_COL"    LOC = "J20";    #LIOB24
NET "ETH_RXER" LOC = "C22";      #LIOB19
NET "ETH_TXEN"   LOC = "L19";    #LIOB21
NET "ETH_TXER" LOC = "C21";       #LIOA19(.2v5)
NET "ETH_TXD<0>"    LOC = "L20"; #LIOA21(.2v5)
NET "ETH_TXD<1>"    LOC = "K18"; #LIOB22
NET "ETH_TXD<2>"    LOC = "K20"; #LIOB23
NET "ETH_TXD<3>"    LOC = "K19"; #LIOA23(.2v5)
NET "ETH_MDC" LOC = "G21";       #LIOB14
NET "PHY_RESETn" LOC = "K17";    #LIOB31
NET "ETH_MDIO" LOC = "G22";      #LIOA13