Quartus® II Tcl の例: VHDL レジスターバンク内のバージョンナンバー

author-image

投稿者:

このプロシージャー例では、レジスターのバンクに 16 進数値を格納した VHDL ファイルを生成します。このプロシージャーでは、デザイン内のレジスターバンクに少量のデータ (リビジョンナンバーなど) を自動で書き込むことができます。

生成される VHDL ファイルの名前は version_reg.vhd です。レジスターバンクに格納する 16 進数を付けてプロシージャーを呼び出します。このページの下の方に、プロシージャーの呼び出し方法の例があります。

VHDL ファイルの作成に問題があった場合、プロシージャーはエラーを返すため、Tcl スクリプトでプロシージャーを呼び出す場合は、プロシージャーの呼び出しを catch ステートメントで囲む必要があります。エラーをキャッチして表示できます。

proc generate_vhdl { hex_value } {

    set num_digits [string length $hex_value]
    set bit_width [expr { 4 * $num_digits } ]
    set high_index [expr { $bit_width - 1 } ]
    set reset_value [string repeat "0" $num_digits]

    if { [catch {
        set fh [open "version_reg.vhd" w ]
        puts $fh "LIBRARY ieee;\nUSE ieee.std_logic_1164.ALL;"
        puts $fh "ENTITY version_reg IS"
        puts $fh "    PORT ("
        puts $fh "        clock: IN STD_LOGIC;"
        puts $fh "        reset: IN STD_LOGIC;"
        puts $fh "        data_out: OUT STD_LOGIC_VECTOR(${high_index} \
             downto 0)"
        puts $fh "    );"
        puts $fh "END version_reg;"
        puts $fh "ARCHITECTURE rtl OF version_reg IS"
        puts $fh "BEGIN"
        puts $fh "PROCESS (clock,reset)"
        puts $fh "    BEGIN"
        puts $fh "    IF (reset='0') THEN"
        puts $fh "        data_out <=X\"${reset_value}\""
        puts $fh "    ELSIF rising_edge (clock) THEN"
        puts $fh "        data_out <= X\"${hex_value}\""
        puts $fh "    END IF;"
        puts $fh "END PROCESS;"
        puts $fh "END rtl;"
        close $fh
    } res ] } {
        return -code error $res
    } else {
        return 1
    }
}

catch ステートメントの使用

上記のプロシージャーを呼び出し、エラーをキャッチする例を以下に示します。

set my_hex_number "A5"
if { [catch { generate_vhdl $my_hex_number } res] } {
    post_message -type error "Couldn't generate VHDL file\n$res"
}
# スクリプトがここまで来れば、エラーはありませんでした。