litex/examples/de0_nano/top.py

142 lines
3.8 KiB
Python
Raw Normal View History

2012-09-09 16:32:09 -04:00
################################################################################
# _____ _ ____ _ _ _ _
# | __|___ |_|___ _ _ | \|_|___|_| |_ ___| |
# | __| | | | . | | | | | | | . | | _| .'| |
# |_____|_|_|_| |___|_ | |____/|_|_ |_|_| |__,|_|
# |___| |___| |___|
#
# Copyright 2012 / Florent Kermarrec / florent@enjoy-digital.fr
#
# migScope Example on De0 Nano Board
# ----------------------------------
################################################################################
#
2012-09-09 17:46:26 -04:00
# In this example signals are generated in the FPGA.
# We will use migScope to record those signals and visualize them.
2012-09-09 16:32:09 -04:00
#
# Example architecture:
# ----------------------
2012-09-09 17:46:26 -04:00
# migScope Config --> Python Client (Host) --> Vcd Output
# & Trig |
2012-09-09 16:32:09 -04:00
# Arduino (Uart<-->Spi Bridge)
# |
# De0 Nano
# |
# +--------------------+-----------------------+
# migIo Signal Generator migLa
# Control of Signal Ramp, Sinus, Logic Analyzer
# generator Square, ...
###############################################################################
2012-09-09 15:18:09 -04:00
#==============================================================================
# I M P O R T
#==============================================================================
from migen.fhdl.structure import *
from migen.fhdl import verilog, autofragment
2012-09-09 16:32:09 -04:00
from migen.bus import csr
from migen.bus.transactions import *
from migen.bank import description, csrgen
from migen.bank.description import *
import sys
sys.path.append("../../")
2012-09-13 07:14:27 -04:00
from migScope import trigger, recorder, migIo
2012-09-09 16:32:09 -04:00
import spi2Csr
2012-09-09 15:18:09 -04:00
from timings import *
from constraints import Constraints
#==============================================================================
# P A R A M E T E R S
#==============================================================================
#Timings Param
clk_freq = 50*MHz
clk_period_ns = clk_freq*ns
n = t2n(clk_period_ns)
2012-09-09 16:32:09 -04:00
# Bus Width
trig_width = 16
dat_width = 16
# Record Size
record_size = 1024
# Csr Addr
2012-09-13 07:14:27 -04:00
MIGIO_ADDR = 0x0000
2012-09-09 16:32:09 -04:00
TRIGGER_ADDR = 0x0200
RECORDER_ADDR = 0x0400
2012-09-09 15:18:09 -04:00
#==============================================================================
2012-09-09 16:32:09 -04:00
# M I S C O P E E X A M P L E
2012-09-09 15:18:09 -04:00
#==============================================================================
2012-09-09 16:32:09 -04:00
def get():
2012-09-09 15:18:09 -04:00
2012-09-13 07:14:27 -04:00
# migIo
migIo0 = migIo.MigIo(MIGIO_ADDR, 8, "IO")
2012-09-09 16:32:09 -04:00
# Trigger
term0 = trigger.Term(trig_width)
trigger0 = trigger.Trigger(TRIGGER_ADDR, trig_width, dat_width, [term0])
2012-09-09 15:18:09 -04:00
2012-09-09 16:32:09 -04:00
# Recorder
recorder0 = recorder.Recorder(RECORDER_ADDR, dat_width, record_size)
2012-09-09 15:18:09 -04:00
2012-09-09 16:32:09 -04:00
# Spi2Csr
spi2csr0 = spi2Csr.Spi2Csr(16,8)
2012-09-13 07:14:27 -04:00
2012-09-09 16:32:09 -04:00
# Csr Interconnect
csrcon0 = csr.Interconnect(spi2csr0.csr,
[
2012-09-13 07:14:27 -04:00
migIo0.bank.interface,
2012-09-09 16:32:09 -04:00
trigger0.bank.interface,
recorder0.bank.interface
])
comb = []
sync = []
2012-09-09 15:18:09 -04:00
2012-09-09 16:32:09 -04:00
# Signal Generator
sig_gen = Signal(BV(trig_width))
sync += [
sig_gen.eq(sig_gen+1)
]
2012-09-09 15:18:09 -04:00
2012-09-09 17:27:51 -04:00
# Led
led0 = Signal(BV(8))
2012-09-13 07:14:27 -04:00
comb += [led0.eq(migIo0.o)]
2012-09-09 17:27:51 -04:00
2012-09-09 16:32:09 -04:00
# Dat / Trig Bus
comb += [
trigger0.in_trig.eq(sig_gen),
trigger0.in_dat.eq(sig_gen)
]
2012-09-09 15:18:09 -04:00
2012-09-09 16:32:09 -04:00
# Trigger --> Recorder
comb += [
recorder0.trig_dat.eq(trigger0.dat),
recorder0.trig_hit.eq(trigger0.hit)
]
2012-09-09 15:18:09 -04:00
# HouseKeeping
2012-09-09 17:27:51 -04:00
in_clk = Signal()
in_rst_n = Signal()
2012-09-09 17:27:51 -04:00
in_rst = Signal()
comb += [
in_rst.eq(~in_rst_n)
]
2012-09-09 16:32:09 -04:00
frag = autofragment.from_local()
frag += Fragment(sync=sync,comb=comb)
cst = Constraints(in_clk, in_rst_n, spi2csr0, led0)
2012-09-09 15:18:09 -04:00
src_verilog, vns = verilog.convert(frag,
cst.get_ios(),
2012-09-09 16:32:09 -04:00
name="de0_nano",
2012-09-09 17:27:51 -04:00
clk_signal = in_clk,
rst_signal = in_rst,
2012-09-09 15:18:09 -04:00
return_ns=True)
src_qsf = cst.get_qsf(vns)
return (src_verilog, src_qsf)