- PVSM.RU - https://www.pvsm.ru -
Редактор Sublime Text существенно экономит время при работе с vhdl и verilog файлами. Для тех, кто не работал с редакторами типа Sublime Text, Notepad++ и т.п. опишу основные полезные функции данных редакторов:
Для начала состыкуем САПР для работы с ПЛИС и редактор Sublime.
{C:Program FilesSublime Text 3sublime_text.exe} $1
C:Program FilesSublime Text 3sublime_text.exe [file name]
Различные плагины (packages) расширяют функциональность редактора. Packages можно
устанавливать как в онлайн так и оффлайн-режиме.
Для установки плагинов в офлайн-режиме нужно проделать нехитрые манипуляции:
SyncViewScroll [1] — плагин для синхронизации вертикальной и горизонтальной прокрутки при работе в нескольких окнах. Для работы плагина надо для каждого окна выбрать в меню View→ Sync Scroll.
Text Pastry [2] – плагин для автоматической множественной нумерации. Очень помогает при работе с большим количеством нумерованных сигналов/портов.
Sublime Verilog [3] — поддержка синтаксиса языка Verilog
Verilog Gadget [4] – набор функций и сниппетов для работы с Verilog файлами.
SmartVHDL [5] — поддержка синтаксиса языка VHDL. Также при наведении на сигнал или порт в коде появится окно с подсказкой о типе (количество бит) данного сигнала/порта. При наведении на сигнал в контекстном меню появится пункт “Goto Definishion” — переход к месту объявления сигнала.
VHDL Mode [6] – набор функций и сниппетов для работы с VHDL файлами. Основная часть функций запускается, например, сочетанием клавиш Atl+K, C, P, где C и P нажимаются поочередно. Основные функции:
По умолчанию редактор Sublime не у меет работать с ucf-файлами. Разметка ucf эквивалентна разметке языка tcl. Осталось только объяснить это редактору:
{"extensions" : ["ucf"]}Пусть нам надо вставить шаблон кода:
My_proc : Process(clk, rst, data_in)
begin
if(clk'event and clk = '1') then
if(rst = '1') then
else then -- rst = 0
end if; -- data_in
end if;--clk
end process My_proc;
Причем нам бы хотелось, чтобы после вставки текста по нажатию Tab курсор устанавливался на позиции My_proc, clk, rst, data_in, для быстрого изменения значений этих данных. Для этого создадим новый сниппет:Tools → Developer → New Snippet. Редактируем данные:
<snippet>
<description>process rst</description>
<content><![CDATA[
${1:<PROCESS_NAME>} : Process(${2:clk}, ${3:rst}, ${4:data_in})
begin
if($2'event and $2 = '1') then
if($3 = '1') then
${5}
else then -- $3 = 0
$0
end if; -- $4
end if;--$2
end process $1;
]]></content>
<tabTrigger>procrst</tabTrigger>
<scope>source.vhdl</scope>
</snippet>
Сохраняем данный сниппет. Теперь при написании ключевого слова procrst в текущую позицию курсора будет вставлен наш шаблон.
Подробнее о создании шаблонов читайте в статье «Как создать сниппет?» [7].
Подробно о создании функций (плагинов) описывалось в статьях «Как написать простой плагин» [8], «Как написать сложный плагин» [9].
Вставка сниппетов это, конечно хорошо, но хотелось бы, например, чтобы тот же шаблон создания процесса заполнялся автоматически в зависимости от входных сигналов, а также чтобы процесс модифицировался при наличии таких сигналов как rst и ce. Еще обычно после процесса идет присвоение внешним портам модуля значений внутренних сигналов, пусть тоже делается автоматически.
Для парсинга данных файла VHDL воспользуемся функциями плагина Vhdl mode.
Примерный алгоритм наших действий:
Для начала создадим новый сниппет:
<snippet>
<tabTrigger>procclk</tabTrigger>
<scope>source.vhdl</scope>
<content><![CDATA[
${DATAINPORTS}
${OUTPORTS}
]]></content>
<description>process clk</description>
</snippet>
Здесь ${DATAINPORTS} – метка, куда будет вставлено описание процесса,
${OUTPORTS} — метка, где будет присвоение внешним выходным портам значений внутренних сигналов.
Сохраним его под именем, например, test.sublime-snippet в папку VHDL Mode/Snippets.
Воспользуемся написанными функциями в папке VHDL Mode. Так как знания языка python у меня начальные, то будем модифицировать функции плагина, по аналогии с уже описанными в нем.
Создадим в файле vhdl_lang.py новые функции в классе Interface(), назовем их in_port и out_port:
def in_port(self):
"""
Generate Process depending on the input ports
"""
lines = []
bus_index = ""
max_data = ""
my_ports = ""
is_clk = False
is_ce = False
is_rst = False
if self.if_ports:
for port in self.if_ports:
if port.mode.lower() == 'in':
if port.name.lower() == ('clk'):
is_clk = True
my_ports = port.name
else:
if port.name.lower() == ('ce'):
is_ce = True
elif port.name.lower() == ('rst'):
is_rst = True
my_ports = my_ports + ", " + port.name
lines.append("Process("+ my_ports +')' )
lines.append("begin")
if is_clk:
lines.append(" if(clk'event and clk = '1') then")
lines.append("")
if is_rst and is_ce:
lines.append("if(rst = '1') then")
lines.append("")
lines.append("elsif (ce = '1') then")
lines.append("")
lines.append("end if; -- rst")
elif is_rst:
lines.append("if(rst = '1') then")
lines.append("")
lines.append("else -- working body ")
lines.append("")
lines.append("end if; -- rst")
elif is_ce:
lines.append("if (ce = '1') then")
lines.append("")
lines.append("end if; --
lines.append(" end if;--clk")
lines.append("end process;")
# lines.append(str(testind
indent_vhdl(lines, 1)
return 'n'.join(lines)
else:
return None
def out_port(self):
"""
Generate data after Process
"""
lines = []
if self.if_ports:
for port in self.if_ports:
if port.mode.lower() == 'out':
lines.append("{} <= {}_net;".format(port.name, port.name))
indent_vhdl(lines, 1)
return 'n'.join(lines)
else:
return None
Функция out_port вставляет за процессом строки, например:
data_out1 <= data_out1_net;
data_out2 <= data_out2_net;
Создадим в папке VHDL Mode новый файл, назовем его my_func.py, вставим текст:
import sublime
import sublime_plugin
from.import vhdl_interface as face
class PasteAsProcess(sublime_plugin.TextCommand):
def run(self, edit):
snippet_clk = "Packages/VHDL Mode/Snippets/test.sublime-snippet"
in_port_str = face._interface.in_port()
out_port_str = face._interface.out_port()
self.view.run_command("insert_snippet",
{
"name" : snippet_clk,
"DATAINPORTS" : in_port_str,
"OUTPORTS" : out_port_str
})
print('paste_as_process')
Осталось присвоить горячие клавиши. Так как наш класс называется PasteAsProcess, то команда должна называться paste_as_process (перед символами, кроме первого, написанными в верхнем регистре нужно поставить знак нижнего подчеркивания).
Идем Preferences → Key Bildings. Вставляем строку:
{"keys": ["alt+k", "p", "z"], "command": "paste_as_process", "context": [{"key": "selector", "operand": "source.vhdl"}] },
Теперь для работы нам надо сначала скопировать значения портов vhdl файла сочетанием клавиш «alt+k», «p», «w» (по умолчанию). Затем вызвать нашу функцию клавишами «alt+k», «p», «z».
Сниппеты и функции значительно упрощают работу с vhdl файлами.
Даже начальных знаний языка python достаточно для написания простых, но рабочих функций.
P.S.: Оставлю ссылку [10] на папку с моими настройками. Для работы, надо заменить папку Sublime Text 3 по адресу: C:UsersUserAppDataRoaming
Мои сниппеты:
Мои функции:
Автор: Skryp
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/278244
Ссылки в тексте:
[1] SyncViewScroll : https://github.com/zzjin/syncViewScroll
[2] Text Pastry : https://github.com/duydao/Text-Pastry
[3] Sublime Verilog : https://github.com/pro711/sublime-verilog
[4] Verilog Gadget : https://github.com/poucotm/Verilog-Gadget
[5] SmartVHDL: https://github.com/TheClams/SmartVHDL
[6] VHDL Mode: https://github.com/Remillard/VHDL-Mode
[7] «Как создать сниппет?»: https://habrahabr.ru/post/148324/
[8] «Как написать простой плагин»: https://habrahabr.ru/post/136529/
[9] «Как написать сложный плагин»: https://habrahabr.ru/post/148842/
[10] ссылку : https://github.com/Skryppy/SublimeSettingsForVHDL
[11] Источник: https://habrahabr.ru/post/353876/?utm_campaign=353876
Нажмите здесь для печати.