Martin O. schrieb:
> @mfro
> Was machst Du denn mit TCL Scripten? Hast Du ein Beispiel? Wo finde ich
> die Beschreibung der möglichen TCL Kommandos in Quartus?
Im Handbuch ;)
https://www.intel.com/content/www/us/en/programmable/quartushelp/current/index.htm#tafs/tafs/tafs.htm
Leider hat der Umzug von Altera zu Intel dafür gesorgt, daß die meisten
Links zu den Handbüchern verschollen sind. Und Intel scheint's nicht auf
die Reihe zu kriegen, die in ihrer Website anständig zu verlinken.
Zum ersten Teil der Frage:
Damit kann man alles mögliche anstellen (z.B. auch externe Makefiles
aufrufen o.Ä.).
Beispiel: ich habe in eigentlich allen meiner FPGA-Projekte irgendwie
einen µC drin - entweder im FPGA oder extern angeflanscht. In dessen
Firmware möchte ich wissen, welche Config-Version eigentlich im FPGA
ist. Dazu habe ich ein Tcl-Script, das eine VHDL-Datei mit Datum und
Uhrzeit der Synthese erzeugt (irgendwo - vielleicht sogar hier -
geklaut):
1 | puts make_datetime.tcl
|
2 |
|
3 | # Make datetime.vhd package from Tcl script
|
4 |
|
5 | # Current date, time, and seconds since epoch
|
6 | # Array index 0 1 2 3 4 5 6
|
7 | set datetime_arr [clock format [clock seconds] -format {%Y %m %d %H %M %S %s}]
|
8 |
|
9 | # Write VHDL package
|
10 | set filename datetime.vhd
|
11 | set file [open $filename w]
|
12 | puts $file "library ieee;"
|
13 | puts $file "use ieee.std_logic_1164.all;"
|
14 | puts $file ""
|
15 | puts $file "package datetime is"
|
16 | puts $file " -- Date information"
|
17 | puts $file " constant YEAR_INT : integer := [lindex $datetime_arr 0];"
|
18 | puts $file " constant YEAR_HEX : std_ulogic_vector(15 downto 0) := X\"[lindex $datetime_arr 0]\";"
|
19 | puts $file " constant MONTH_INT : integer := [lindex $datetime_arr 1];"
|
20 | puts $file " constant MONTH_HEX : std_ulogic_vector(7 downto 0) := X\"[lindex $datetime_arr 1]\";"
|
21 | puts $file " constant DAY_INT : integer := [lindex $datetime_arr 2];"
|
22 | puts $file " constant DAY_HEX : std_ulogic_vector(7 downto 0) := X\"[lindex $datetime_arr 2]\";"
|
23 | puts $file " constant DATE_HEX : std_ulogic_vector(31 downto 0) := YEAR_HEX & MONTH_HEX & DAY_HEX;"
|
24 | puts $file " -- Time information"
|
25 | puts $file " constant HOUR_INT : integer := [lindex $datetime_arr 3];"
|
26 | puts $file " constant HOUR_HEX : std_ulogic_vector(7 downto 0) := X\"[lindex $datetime_arr 3]\";"
|
27 | puts $file " constant MINUTE_INT : integer := [lindex $datetime_arr 4];"
|
28 | puts $file " constant MINUTE_HEX : std_ulogic_vector(7 downto 0) := X\"[lindex $datetime_arr 4]\";"
|
29 | puts $file " constant SECOND_INT : integer := [lindex $datetime_arr 5];"
|
30 | puts $file " constant SECOND_HEX : std_ulogic_vector(7 downto 0) := X\"[lindex $datetime_arr 5]\";"
|
31 | puts $file " constant TIME_HEX : std_ulogic_vector(31 downto 0) := X\"00\" & HOUR_HEX & MINUTE_HEX & SECOND_HEX;"
|
32 | puts $file " -- Miscellaneous information"
|
33 | puts $file " constant EPOCH_INT : integer := [lindex $datetime_arr 6]; -- Seconds since 1970-01-01_00:00:00"
|
34 | puts $file "end package;"
|
35 | close $file
|
Das wird im FPGA mit einer Component an den µC-Bus angeschlossen und der
kann anschließend Synthesedatum und -Uhrzeit abfragen.
Damit ich nicht vergesse, die Datei bei jeder Synthese neu zu erzeugen,
steht in meiner .qsf-Datei das da:
1 | set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:precmd.tcl"
|
Das bewirkt, daß bei jedem Synthesestart aus Quartus heraus zuallererst
das precmd.tcl-Script abgearbeitet wird. In dem steht wiederum (z.B.)
das hier:
1 | set precmd_list { "embed_m68k.tcl" "make_datetime.tcl" }
|
2 |
|
3 | foreach item $precmd_list {
|
4 | post_message "execute $item"
|
5 | exec quartus_sh -t $item
|
6 | }
|
was bewirkt, daß alle .tcl Scripte in der Liste vor Synthesestart
abgearbeitet werden. Will ich eins dazu haben, brauche ich das nur in
precmd_list einzutragen. embed_m68k.tcl z.B. erzeugt aus einem
µC-Objectfile eine VHDL-Entity mit dem *.o-Inhalt als ROM.