Jump to content

    

Добавление даты в проект

Коллеги,

 

проблема такая: на плате имеются семисегментники, очень хочется, что бы при каждой пересборке проекта на них выводилась дата-время или хотя бы некоторый постоянно увеличивающийся номер версии. В Квартусе, к сожалению, нет чего-то похожего на пункт "pre-build", как например в код композере, что бы запустить перед сборкой свою прогу. Верилоговские макросы с выдачей даты или времени, Квартус игнорирует. Пошли путём написания стартового tcl-скрипта, который бы находил в нужном файле предопределённый localparam и менял его, но чего-то не получается никак этот tcl'ник заставить искать нужную строку. Да и тогда запускать сборку проекта придётся не стандартной кнопкой "Start Compilation", а щёлкая по скрипту. Тоже весьма неудобно.

 

Короче говоря, может кто знает как эту задачу проще решить? Поделитесь, плиз, решением!

Share this post


Link to post
Share on other sites
В Квартусе, к сожалению, нет чего-то похожего на пункт "pre-build",
Есть это там, только называется оно PRE_FLOW_SCRIPT_FILE и предназначено для запуска tcl-скрипта. Вы его начали писать, и это правильно.

Короче говоря, может кто знает как эту задачу проще решить? Поделитесь, плиз, решением!

Я делал для vhdl.

Файл с версией version.vhd выглядит так (оставлен минимум):

   library IEEE;
   use IEEE.std_logic_1164.all;
   
   package version is
   
   -- Timestamp contains two fields:
   --   (31 downto 8) is a current date (yymmdd). This field is regenerated
   --     automatically before every new compilation.
   --   ( 7 downto 0) is a current build in the current date. This field is increased by 1
   --     automatically before every new compilation. I hope, 255 builds per day is enough :-)
   constant Timestamp     : std_logic_vector (31 downto 0) := x"12052900";
   
   end package version;

 

Скрипт update_version.tcl для обновления версии:

 # update info in the version.vhd file

 # the version update procedure consists of two parts:
 #  1) generate timestamp
 #  2) increment a build number for current timestamp

 #set version_file "[get_project_directory]../rtl/version.vhd"
 set version_file "../rtl/version.vhd"

 # generate timestamp function
 proc generate_timestamp { } {
     return [clock format [clock seconds] -format {%y%m%d}]
 }

 proc update_build_number { timestamp build_number } {
     set current_timestamp [generate_timestamp]
     set str_compare [string compare $timestamp $current_timestamp]

     if { $str_compare == 0 } {
         return [incr build_number 1]
     } else {
         return 1
     }
 }

 proc update_version { input_file output_file } {
     # if the input file can't be opened, return an error
     if { [catch {open $input_file} input] } {
         return -code error $input
     }

     # if the output file can't be opened, return an error
     if { [catch {open $output_file w} output] } {
         return -code error $output
     }

     # read through the input file a line at a time
     while { [gets $input line] != -1 } {
         # line with timestamp
         if { [regexp {^constant Timestamp.*([[:xdigit:]]{8})} $line match prev_timestamp] } {
             # split previous timestamp value to timestamp and build number
             set timestamp [string range $prev_timestamp 0 5]
             set build_number [string range $prev_timestamp 6 7]

             # convert the hexadecimal build_number to base ten
             scan $build_number "%x" new_build_number

             set new_build_number [update_build_number $timestamp $new_build_number]
             set build_number [format "%02X" $new_build_number]
             set timestamp [generate_timestamp]

             regsub $prev_timestamp $line "$timestamp$build_number" line

             post_message -type info "Version is: $timestamp$build_number"
         }

         # write out the line to the new file
         puts $output $line
     }

     close $input
     close $output
 }

 set new_version_file "${version_file}.tmp"

 if { [catch { update_version $version_file $new_version_file } res] } {
     post_message -type critical_warning "Could not update version number: $res"
 } else {
     if { [catch { file rename -force $new_version_file $version_file } res ] } {
         post_message -type critical_warning \
             "Could not update version number: $res"
     }
 }

 

В .qsf пишете:

   # update version number before the flow starts
   set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:update_version.tcl"

Share this post


Link to post
Share on other sites

для верилога и времени сборки использовал файл get_time.tcl

project_open -revision pdh_mp_prd_top pdh_mp_prd_top
set t [clock seconds]
set_parameter -name pCOMPILATION_TIME $t
export_assignments

в самом коде

`ifdef MODEL_TECH
  parameter int pCOMPILATION_TIME = 100;
`else
  parameter int pCOMPILATION_TIME;
`endif

 

Share this post


Link to post
Share on other sites

Вот для квартуса в .qsf можно воспользоваься PRE_FLOW_SCRIPT_FILE и POST_FLOW_SCRIPT_FILE, а как тот же фокус провернуть в ISE?

Share this post


Link to post
Share on other sites
для верилога и времени сборки использовал файл get_time.tcl

Зачем может понадобиться время сборки, сохраненное в переменной/прошивке?

 

 

UPD: вместо «в переменной» следует читать «в параметре».

Edited by x736C

Share this post


Link to post
Share on other sites

для идентификации версии, прибор может выводить ее куда то на индикатор...

Share this post


Link to post
Share on other sites

Я, видимо, сильно протупил. Подумал, что речь идет о длительности сборки, измеренной в секундах.

 

С датой и временем, когда была осуществлена сборка, всё ясно.

Share this post


Link to post
Share on other sites

В tclнике сделать параметр derived, во время генерации файлов, значению параметра присвоить время, после чего в виде параметра передать в исходник veriloga. А там уже просто вывести константу на индикатор.

Share this post


Link to post
Share on other sites
Вот для квартуса в .qsf можно воспользоваься PRE_FLOW_SCRIPT_FILE и POST_FLOW_SCRIPT_FILE, а как тот же фокус провернуть в ISE?
В исе такого нет, есть в Vivado. Мы для ИСЕ делали tcl-скрипт, в котором проделывались все нужные действия по подготовке даты, и затем скрипт сам запускал синтез (можно отдельно скрипт, затем вручную синтез, и имплементацию, но мы уменьшили ручную работу на 1 клик))) ). Чтобы скрипт выполнить, в ИСЕ открывали окно TCL console, там писали source synt.tcl, и таким образом выполняли всё это дело (т.е. не требовалось отдельно запускать процесс синтеза).

 

Share this post


Link to post
Share on other sites

Тоже когда-то делал tcl-скрипт, который изменяет константы в vhdl-файле (время сборки и номер версии) для Altera'-вского проекта.

Но столкнулся со следующей проблемой: если в проекте не было изменений в модуле, который использует эти константы, то при повторном синтезе проекта в Qaurtus константы в итоговой прошивке остаются старыми (я их вывожу на дисплей). При этом константы в vhdl файле изменяются на новые должным образом (здесь все верно).

Проблему решил так, что дополнительно в tcl-скрипте прописал удаление базы данных при каждом синтезе (папка db в проекте). Каких-то серьезных изменений в скорости компиляции не заметил.

Share this post


Link to post
Share on other sites

Да, тоже припоминаю, что для Xilinx ISE требовалось очищать проект, иначе всё старое бралось )))

Share this post


Link to post
Share on other sites

Для Xilinx есть еще такой вариант: на этапе bitgen добавить время в файл прошивки, а потом через специальный примитив USR_ACCESS получить к нему доступ из работающего проекта.

 

http://www.xilinx.com/support/documentatio..._usr_access.pdf

Share this post


Link to post
Share on other sites

Огромное спасибо! Это самый "кошерный" вариант. Остальные - самодельные костыли ))

Share this post


Link to post
Share on other sites

toshas, хорошее решение, жаль только для Virtex®-5, Virtex-6, and all 7 series FPGAs =(

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this