forth-cpu
/
makefile
280 строк · 7.1 Кб
1#
2# Makefile to simulate and synthesize VHDL designs
3#
4# @Author Marc Eberhard/Richard Howe
5# @Copyright Copyright 2013 Marc Eberhard, 2016,2020 Richard Howe
6# @License LGPL
7#
8# This makefile can build the toolchain, simulators, and the bit
9# file for the FPGA. Type "make help" at the command line for a
10# list of options
11#
12
13NETLIST=top14CFLAGS=-Wall -Wextra -O2 -g -pedantic15CC=gcc16TIME=17#TIME=time -p
18
19OS_FLAGS =20# From: https://stackoverflow.com/questions/714100/os-detecting-makefile
21ifeq ($(OS),Windows_NT)22GUI_LDFLAGS = -lfreeglut -lopengl32 -lm23DF=24EXE=.exe25
26.PHONY: h2 gui text block27
28h2: h2.exe29gui: gui.exe30text: text.exe31block: block.exe32
33else # assume unixen34GUI_LDFLAGS = -lglut -lGL -lm35DF=./36EXE=37endif
38
39.PHONY: simulation viewer synthesis bitfile upload clean run gui-run40
41## Remember to update the synthesis section as well
42SOURCES = \43util.vhd \
44timer.vhd \
45uart.vhd \
46kbd.vhd \
47vga.vhd \
48h2.vhd \
49ram.vhd \
50core.vhd
51
52OBJECTS = ${SOURCES:.vhd=.o}53
54all:55@echo ""56@echo "Simulation:"57@echo ""58@echo "make simulation - simulate VHDL design"59@echo "make viewer - start waveform viewer for simulation results"60@echo "make documentation - build the PDF and HTML documentation"61@echo "make h2${EXE} - build C based CLI emulator for the VHDL SoC"62@echo "make gui${EXE} - build C based GUI emulator for the Nexys3 board"63@echo "make run - run the C CLI emulator on h2.fth"64@echo "make gui-run - run the GUI emulator on ${EFORTH}"65@echo ""66@echo "Synthesis:"67@echo ""68@echo "make synthesis - synthesize design"69@echo "make implementation - implement design"70@echo "make bitfile - generate bitfile"71@echo ""72@echo "Upload:"73@echo ""74@echo "make upload - upload design to FPGA"75@echo ""76@echo "Cleanup:"77@echo ""78@echo "make clean - delete temporary files and cleanup directory"79@echo ""80
81## Documentation ===========================================================
82
83documentation: readme.pdf readme.htm84
85%.pdf: %.md86pandoc -V geometry:margin=0.5in --toc $< -o $@87
88%.htm: %.md89pandoc --toc --self-contained $^ -o $@90
91## Assembler, Virtual Machine and UART communications ======================
92
93EFORTH=h2.hex94
95h2${EXE}: h2.c h2.h96${CC} ${CFLAGS} -std=c99 $< -o $@97
98embed${EXE}: embed.c99${CC} ${CFLAGS} -std=c99 $< -o $@100
101${EFORTH}: embed${EXE} embed.blk embed.fth102${DF}embed${EXE} embed.blk $@ embed.fth103
104block${EXE}: block.c105${CC} ${CFLAGS} -std=c99 $< -o $@106
107nvram.blk: nvram.txt block${EXE}108${DF}block${EXE} < nvram.txt > $@109
110run: h2${EXE} ${EFORTH} text.hex nvram.blk111${DF}h2 -H -r ${EFORTH}112
113h2nomain.o: h2.c h2.h114${CC} ${CFLAGS} -std=c99 -DNO_MAIN $< -c -o $@115
116gui.o: gui.c h2.h117${CC} ${CFLAGS} -std=gnu99 $< -c -o $@118
119gui${EXE}: h2nomain.o gui.o120${CC} ${CFLAGS} $^ ${GUI_LDFLAGS} -o $@121
122gui-run: gui${EXE} ${EFORTH} nvram.blk text.hex123${DF}$< ${EFORTH}124
125text${EXE}: text.c126${CC} ${CFLAGS} -std=c99 $< -o $@127
128text.hex: text${EXE}129${DF}$< -g > $@130
131## Simulation ==============================================================
132
133%.o: %.vhd134ghdl -a -g $<135
136ram.o: util.o137kbd.o: util.o kbd.vhd138vga.o: util.o vga.vhd text.hex font.bin139core.o: util.o h2.o core.vhd ${EFORTH}140uart.o: util.o uart.vhd141timer.o: util.o142top.o: util.o timer.o core.o uart.o vga.o kbd.o ram.o top.vhd143tb.o: top.o util.o tb.vhd144
145tb: ${OBJECTS} tb.o146ghdl -e tb
147
148# max stack alloc needed for GHDL >0.35
149# ghdl -r $< --wave=$<.ghw --max-stack-alloc=16384 --unbuffered --ieee-asserts=disable
150%.ghw: % %.cfg151ghdl -r $< --wave=$<.ghw --max-stack-alloc=16384 --ieee-asserts=disable --unbuffered152
153simulation: tb.ghw h2${EXE}154
155## Simulation ==============================================================
156
157ifeq ($(OS),Windows_NT)158viewer: simulation signals.tcl159gtkwave -S signals.tcl -f tb.ghw
160else
161viewer: simulation signals.tcl162gtkwave -S signals.tcl -f tb.ghw &> /dev/null&
163endif
164
165USB?=/dev/ttyUSB0166BAUD?=115200167#BAUD?=9600
168
169talk:170picocom --omap delbs -e b -b ${BAUD} ${USB}171
172bitfile: design.bit173
174reports:175@[ -d reports ] || mkdir reports176tmp:177@[ -d tmp ] || mkdir tmp178tmp/_xmsgs:179@[ -d tmp/_xmsgs ] || mkdir tmp/_xmsgs180
181tmp/top.prj: tmp182@rm -f tmp/top.prj183@( \184for f in $(SOURCES); do \185echo "vhdl work \"$$f\""; \186done; \187echo "vhdl work \"top.vhd\"" \188) > tmp/top.prj189
190tmp/top.lso: tmp191@echo "work" > tmp/top.lso192
193tmp/top.xst: tmp tmp/_xmsgs tmp/top.lso tmp/top.lso194@( \195echo "set -tmpdir \"tmp\""; \196echo "set -xsthdpdir \"tmp\""; \197echo "run"; \198echo "-lso tmp/top.lso"; \199echo "-ifn tmp/top.prj"; \200echo "-ofn top"; \201echo "-p xc6slx16-csg324-3"; \202echo "-top top"; \203echo "-opt_mode speed"; \204echo "-opt_level 2" \205) > tmp/top.xst206
207synthesis: ${EFORTH} text.hex reports tmp tmp/_xmsgs tmp/top.prj tmp/top.xst208@echo "Synthesis running..."209@${TIME} xst -intstyle silent -ifn tmp/top.xst -ofn reports/xst.log210@mv _xmsgs/* tmp/_xmsgs211@rmdir _xmsgs212@mv top_xst.xrpt tmp213@grep "ERROR\|WARNING" reports/xst.log | \214grep -v "WARNING.*has a constant value.*This FF/Latch will be trimmed during the optimization process." | \215cat
216@grep ns reports/xst.log | grep 'Clock period'217
218implementation: reports tmp219@echo "Implementation running..."220
221@[ -d tmp/xlnx_auto_0_xdb ] || mkdir tmp/xlnx_auto_0_xdb222
223@${TIME} ngdbuild -intstyle silent -quiet -dd tmp -uc top.ucf -p xc6slx16-csg324-3 top.ngc top.ngd224@mv top.bld reports/ngdbuild.log225@mv _xmsgs/* tmp/_xmsgs226@rmdir _xmsgs227@mv xlnx_auto_0_xdb/* tmp228@rmdir xlnx_auto_0_xdb229@mv top_ngdbuild.xrpt tmp230
231@${TIME} map -intstyle silent -detail -p xc6slx16-csg324-3 -pr b -c 100 -w -o top_map.ncd top.ngd top.pcf232@mv top_map.mrp reports/map.log233@mv _xmsgs/* tmp/_xmsgs234@rmdir _xmsgs235@mv top_usage.xml top_summary.xml top_map.map top_map.xrpt tmp236
237@${TIME} par -intstyle silent -w -ol std top_map.ncd top.ncd top.pcf238@mv top.par reports/par.log239@mv top_pad.txt reports/par_pad.txt240@mv _xmsgs/* tmp/_xmsgs241@rmdir _xmsgs242@mv par_usage_statistics.html top.ptwx top.pad top_pad.csv top.unroutes top.xpi top_par.xrpt tmp243
244@#trce -intstyle silent -v 3 -s 3 -n 3 -fastpaths -xml top.twx top.ncd -o top.twr top.pcf -ucf top.ucf245@#mv top.twr reports/trce.log246@#mv _xmsgs/* tmp/_xmsgs247@#rmdir _xmsgs248@#mv top.twx tmp249
250@#netgen -intstyle silent -ofmt vhdl -sim -w top.ngc top_xsim.vhd251@#netgen -intstyle silent -ofmt vhdl -sim -w -pcf top.pcf top.ncd top_tsim.vhd252@#mv _xmsgs/* tmp/_xmsgs253@#rmdir _xmsgs254@#mv top_xsim.nlf top_tsim.nlf tmp255
256
257design.bit: reports tmp/_xmsgs258@echo "Generate bitfile running..."259@touch webtalk.log260@${TIME} bitgen -intstyle silent -w top.ncd261@mv top.bit design.bit262@mv top.bgn reports/bitgen.log263@mv _xmsgs/* tmp/_xmsgs264@rmdir _xmsgs265@sleep 5266@mv top.drc top_bitgen.xwbt top_usage.xml top_summary.xml webtalk.log tmp267@grep -i '\(warning\|clock period\)' reports/xst.log268
269upload:270djtgcfg prog -d Nexys3 -i 0 -f design.bit
271
272design: clean simulation synthesis implementation bitfile273
274postsyn:275@netgen -w -ofmt vhdl -sim ${NETLIST}.ngc post_synthesis.vhd276@netgen -w -ofmt vhdl -sim ${NETLIST}.ngd post_translate.vhd277@netgen -pcf ${NETLIST}.pcf -w -ofmt vhdl -sim ${NETLIST}.ncd post_map.vhd278
279clean:280git clean -dffx
281
282