Добрый день уважаемые форумчане. Почитал я немного ветку по редакторам HDL описаний. И возник у меня насущный вопрос. А если ли какое "хитрое" средство, которое создано для ленивых. Поясню, что я имею ввиду.
Допустим у меня большой проект, где применяется куча самописных модулей/компонентов (в VHDL - Entity т.е сущностей).
Далее я на таком вот примитивном примере буду показывать, как я поступаю, работая с языком VHDL. В Verilog может быть по-другому.
Есть 3 модуля/компонента, где каждый - отдельный файл.
Первый компонент:
CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY TWO_INPUT_OR IS
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
Q : OUT STD_LOGIC
);
END ENTITY;
ARCHITECTURE TWO_INPUT_OR_arc OF TWO_INPUT_OR IS
BEGIN
Q <= A OR B;
END ARCHITECTURE;
Второй компонент.
CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY TWO_INPUT_AND IS
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
Q : OUT STD_LOGIC
);
END ENTITY;
ARCHITECTURE TWO_INPUT_AND_arc OF TWO_INPUT_AND IS
BEGIN
Q <= A AND B;
END ARCHITECTURE;
Третий компонент.
CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY TWO_INPUT_XOR IS
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
Q : OUT STD_LOGIC
);
END ENTITY;
ARCHITECTURE TWO_INPUT_XOR_arc OF TWO_INPUT_XOR IS
BEGIN
Q <= A XOR B;
END ARCHITECTURE;
Все вместе они реализуют такую логическую функцию:

Вот отдельный файл верхнего уровня схемы, где я соединяю все ранее созданные компоненты, для реализации нужной мне лог. функции.
CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY MY_PROJECT IS
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
C : IN STD_LOGIC;
D : IN STD_LOGIC;
F : OUT STD_LOGIC
);
END ENTITY;
ARCHITECTURE MY_PROJECT_arc OF MY_PROJECT IS
COMPONENT TWO_INPUT_OR IS -- Декларация компонента TWO_INPUT_OR
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
Q : OUT STD_LOGIC
);
END COMPONENT;
COMPONENT TWO_INPUT_AND IS -- Декларация компонента TWO_INPUT_AND
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
Q : OUT STD_LOGIC
);
END COMPONENT;
COMPONENT TWO_INPUT_XOR IS -- Декларация компонента TWO_INPUT_XOR
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
Q : OUT STD_LOGIC
);
END COMPONENT;
SIGNAL OR_OUT_TO_XOR :STD_LOGIC;
SIGNAL AND_OUT_TO_XOR :STD_LOGIC;
BEGIN
------------------------------------------
OR_COMP : TWO_INPUT_OR
PORT MAP
(
A => A,
B => B,
Q => OR_OUT_TO_XOR
);
------------------------------------------
AND_COMP : TWO_INPUT_AND
PORT MAP
(
A => C,
B => D,
Q => AND_OUT_TO_XOR
);
------------------------------------------
XOR_COMP : TWO_INPUT_XOR
PORT MAP
(
A => OR_OUT_TO_XOR,
B => AND_OUT_TO_XOR,
Q => F
);
END ARCHITECTURE;
Для того, чтобы в VHDL в одном компоненте применить другой компонент, ранее написанный, необходимо применяемый компонент объявить в архитектурном теле. Так-же в VHDL допускается не объявлять компонент в архитектурном теле, а объявить компонент в файле пакета (PACKAGE):
CODE
LIBRARY IEEE ;
USE IEEE.STD_LOGIC_1164.ALL ;
PACKAGE MY_PROJECT_PACK IS
COMPONENT TWO_INPUT_OR IS -- Декларация компонента TWO_INPUT_OR
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
Q : OUT STD_LOGIC
);
END COMPONENT;
COMPONENT TWO_INPUT_AND IS -- Декларация компонента TWO_INPUT_AND
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
Q : OUT STD_LOGIC
);
END COMPONENT;
COMPONENT TWO_INPUT_XOR IS -- Декларация компонента TWO_INPUT_XOR
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
Q : OUT STD_LOGIC
);
END COMPONENT;
END MY_PROJECT_PACK;
Это позволит несколько сократить количество строк модуля верхнего уровня, что повысит его читаемость. В модуле верхнего уровня достаточно будет объявить только декларацию пакета. И соединить порты модулей:
CODE
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE WORK.MY_PROJECT_PACK.ALL;
ENTITY MY_PROJECT IS
PORT
(
A : IN STD_LOGIC;
B : IN STD_LOGIC;
C : IN STD_LOGIC;
D : IN STD_LOGIC;
F : OUT STD_LOGIC
);
END ENTITY;
ARCHITECTURE MY_PROJECT_arc OF MY_PROJECT IS
SIGNAL OR_OUT_TO_XOR : STD_LOGIC;
SIGNAL AND_OUT_TO_XOR : STD_LOGIC;
BEGIN
------------------------------------------
OR_COMP : TWO_INPUT_OR
PORT MAP
(
A => A,
B => B,
Q => OR_OUT_TO_XOR
);
------------------------------------------
AND_COMP : TWO_INPUT_AND
PORT MAP
(
A => C,
B => D,
Q => AND_OUT_TO_XOR
);
------------------------------------------
XOR_COMP : TWO_INPUT_XOR
PORT MAP
(
A => OR_OUT_TO_XOR,
B => AND_OUT_TO_XOR,
Q => F
);
END ARCHITECTURE;
Вроде всё получается складно. Но проблемы появляться, когда может потребоваться внесение изменений в какой либо из ранее описанных компонентов. Например добавил ещё один порт в один из модулей, или изменил разрядность какой либо шины. Вот тут и появляется самое большое неудобство, поскольку для изменения одного компонента мне потребуется:
1. Изменить файл описания модуля.
2. Изменить файл пакета, где описываются порты изменяемого модуля.
3. В файле где применяется этот компонент добавить\изменить выходные\выходные порты.
Если честно это доставляет сильный дискомфорт. И хотелось бы, чтобы часть рутины на себя взяло программное обеспечение.
На данный момент я пользуюсь бесплатным редактором NOTEPAD ++ . Удобная вещь. Понимает кучу синтаксисов, большое количество настроек. Множество плагинов. Возможность создавать свои шаблоны (сниппеты). Но вот дальше продвинутого блокнота "для программистов" он не ушел. А хочется найти гибкий инструмент, заточенный под HDL, избавляющий от рутины, описанной выше.
Так-же мне очень не хватает проверки синтаксиса "на лету". Например я забыл поставить где-нибудь скобку, или точку с запятой, а редактор подсветил этот косяк.
Существуют ли подобные HDL- редакторы ? Ну и хотелось бы, чтобы у редактора были гибкие настройки подсветки синтаксиса. К сожалению не каждый редактор может этим похвастаться
Сообщение отредактировал Flip-fl0p - Nov 5 2016, 18:12