Что такое FPGA, как расшифровывается, принцип хранения конфигурации
Что такое CPLD, как расшифровывается, принцип программирования
Почему FPGA микросхемы нужно конфигурировать каждый раз после включения, а CPLD нет.
В чем состояло новшество компании Altera, когда они разработали CPLD
Мультиплексор, принцип работы, зачем применяется, как построить на логических элементах, как описать на VHDL
Сдвиговый регистр, как устроен, принцип работы, зачем применяется, как построить на логических элементах, как описать на VHDL
D-триггер, как работает, назвать назначение всех выводов
Регистр как устроен, принцип работы, зачем применяется, как описать на VHDL
Синхронные и асинхронные схемы, чем отличаются, почему предпочтение за синхронными схемами
Что такое конвейеризация, как и зачем применяется, к каким дополнительным эффектам приводит
Чем ограничена сверху максимальная тактовая частота сконфигурируемой ПЛИС
Что такое тактовая частота
Что такое speed grade
Что такое rising edge и falling edge
Сколько состояний у сигнала типа std_logic в VHDL, что это за состояния, каким физическим состояниям они соответствуют.
Z-состояние
Чем отличаются типы std_logic и std_ulogic
Какие языки программирования используются для ПЛИС? На каких уровнях работают.
Меандр
Почему для тактирования предпочтителен меандр
Если первая микросхема выставляет данные по высокому (низкому) фронту, то по какому фронту вторая должна их защелкивать?
Что такое времена Tsetup и Thold для триггера
Чем сигнал отличается от переменной
Что такое таблица истинности
Таблица истинности для логических функций and, or, xor, xnor, not
Для каких целей разрабатывались VHDL, Verilog
Как осуществляется подтягивание к напряжению питания, земле на цифровой линии
Какое физическое представление имеют состояния сигнала типа std_logic
Что такое LUT, DCM, КЛБ, блочная память
Что такое RAM и ROM память
Как передать данные из одного тактового домена в другой
Для каких целей в ПЛИС располагают DCM-модули
Для чего используется Z-состояние в ПЛИС
Создается ли под переменную регистр, под сигнал
В каких случаях предпочтительно использовать оператор case, а в каких if
Зачем для сигналов/переменных типа integer прописывают диапазон принимамых значений, какое максимальное (минимальное) значения может принимать сигнал типа integer
Как объявить сигнал в виде массива элементов типа integer (std_logic_vector)
Что такое банк выводов
Зачем выводы ПЛИС объединены в несколько банков
Для чего разные банки ПЛИС запитывают от разных напряжений
Почему тактовый сигнал надо подавать на специальные тактовые выводы ПЛИС
Что такое джиттер
Зачем применяется дублирование регистров
Какие две основные стратегии разводки используются компилятором
Почему питание кристаллов ПЛИС понижается от семейства к семейству
Какие режимы загрузки возможны для микросхем семейства Cyclone II
Зачем используется сжатие файла конфигурации
Из каких линий состоит интерфейс конфигурирования
Как выбирается частота конфигурирования в AS-режиме
Как ПЛИС сигнализирует о завершении состояния конфигурирования
Как ПЛИС сигнализирует о завершении состояния инициализации
Как заставить ПЛИС провести реконфигурацию
Что будет, если в процессе конфигурации произойдет ошибка
Что такое метастабильное состояние триггера
Почему нельзя рассчитывать на 100% использование ресурсов ПЛИС
Почему необходимо учитывать максимальную температуру окружающей среды проектируемого на ПЛИС устройства
Основные 3 ступени создания загрузочного файла ПЛИС, что на них происходит (Mapping, Placing and Routing, Bitstream Generation)
Что такое разрешающая таблица, для чего она используется, напишите разрешающую таблицу для типа std_logic
Зачем разные банки ввода/вывода иногда запитывают разным номинальным напряжением питания
Зачем в порты ввода/вывода встраивают подтягивающие резисторы
Зачем по питанию высокоскоростных микросхем ставят блокировочные конденсаторы
Почему блокировочные конденсаторы разного номинала
Какие основные правила размещения блокировочных конденсаторов
Достоинства и недостатки керамических конденсаторов
Достоинства и недостатки танталовых конденсаторов
Зачем по цепям питания устанавливают LC-фильтры и проходные фильтры
Какие два основных типа стабилизаторов питания существуют
Достоинства и недостатки линейных стабилизаторов
Достоинства и недостатки импульсных стабилизаторов
Почему сигнальные слои печатной платы обычно перемежают слоями земли
Почему сигнальные проводники на соседних слоях стараются делать взаимно перпендикулярными
Зачем на печатных платах применяют множество сплошных слоев земли и питания
Почему в настоящее время преобладают последовательные интерфейсы передачи данных, а не параллельные
Почему высокоскоростные линии должны иметь строго определенное номинальное волновое сопротивление
Что такое эквивалентный вентиль
Почему в новых разработках желательно применение новых семейств ПЛИС
Что такое метод троирования, как он помогает повысить радиационную стойкость
Каковы основные области применения ПЛИС
Почему вычислительная мощность ПЛИС в алгоритмах цифровой обработки значительно выше процессорной
Ниже приведены листинги программ на VHDL с заданиями к ним. Все ошибки, которые вы должны найти и поправить носят в большей или меньшей степени принципиальный характер. Это значит, что дело точно не в пропущенной точке с запятой, например.
Чем плох нижеприведенный код, как его можно улучшить:
signal data1, data2, data3 : std_logic_vector(3 downto 0);
…
process(clk)
begin
if rising_edge(clk) then
if (data1+data2+data3 = “000100”) then
…
end if;
end if;
end process;
Чем плох нижеприведенный код, как его можно улучшить:
signal data1, data2, data3 : std_logic_vector(3 downto 0);
…
process(clk)
variable result : std_logic_vector(5 downto 0);
begin
if rising_edge(clk) then
result := data1+data2+data3;
if (result = “001000”) then
…
end if;
end if;
end process;
Чем плох нижеприведенный код, как его можно улучшить:
signal data1, data2 : std_logic_vector(3 downto 0);
…
process(clk)
variable result : std_logic_vector(5 downto 0);
begin
if rising_edge(clk) then
result := data1+data2;
if (result = “000000”) then
…
end if;
end if;
end process;
Как можно упростить следующий код:
signal x1, x2 : std_logic;
…
process(clk)
begin
if rising_edge(clk) then
if (x1 = ‘0’) then
x2 <= ‘1’;
elsif ( x1 = ‘1’) then
x2 <= ‘0’;
end if;
end if;
end process;
Вася написал следующий код с целью получить максимальное быстродействие, почему он не достиг своей цели? помогите Васе:
signal data1, data2, data3, data4 : std_logic_vector(3 downto 0);
signal data_result : std_logic_vector(9 downto 0);
…
process(clk)
variable res1, res2 : std_logic_vector(4 downto 0);
variable result : std_logic_vector(9 downto 0);
begin
if rising_edge(clk) then
res1 := data1 + data2;
res2 := data3 + data4;
result := res1*res2;
data_result <= result;
end if;
end process;
Переделайте кривой код в нормальный:
signal counter : integer range 0 to 127;
process(clk)
begin
if rising_edge(clk) then
if (counter < 23) then
counter <= counter + 1;
else
counter <= 0;
end if;
…
end if;
end process;
Тут можно немного оптимизировать с целью уменьшения используемых ресурсов ПЛИС. Что?
process(clk)
variable integer;
begin
if rising_edge(clk) then
…
counter := counter + 1;
if (counter = 16) then
counter := 0;
end if;
…
end if;
end process;
Что скажет компилятор, увидев такой код? Почему он это скажет?
signal flag : std_logic;
signal counter integer range 0 to 127;
…
process(clk)
begin
if rising_edge(clk) then
counter <= counter + 1;
end if;
end process;
process(clk)
begin
if rising_edge(clk) then
flag <= '0';
if (counter = 127) then
counter <= 0;
flag <= '1';
end if;
…
end if;
end process;
Что скажет компилятор, увидев такой код? Почему он это скажет?
signal flag : std_logic;
…
process(clk)
variable counter integer range 0 to 127;
begin
if rising_edge(clk) then
counter := counter + 1;
if (counter = 127) then
counter := 0;
end if;
end if;
end process;
process(clk)
begin
if rising_edge(clk) then
flag <= '0';
if (counter = 127) then
flag <= '1';
end if;
…
end if;
end process;
Чем плох такой код с точки зрения быстродействия? Как его переписать?
signal a : std_logic_vector(2 downto 0);
…
process(clk)
begin
if rising_edge(clk) then
if (a = “110”) then
…
elsif (a = “101”) then
…
elsif (a = “100”) then
…
else
…
end if;
end if;
end process;
Попробуйте преобразовать код к более эффективному (подсказка: посмотрите двоичные значения чисел в условиях, можно изменить тип сигнала при необходимости)
signal a : integer range 0 to 63;
…
process(clk)
begin
if rising_edge(clk) then
if (a<=15) then -- <= знак меньше или равно, >= знак больше или равно
…
elsif (a > =16 and a<32) then
…
elsif (a > =32) then
…
end if;
end if;
end process;
signal a : std_logic_vector(2 downto 0);
…
Чему равно значение a в точке 2, если в точке 1 counter равен “000”?
signal counter : std_logic_vector(2 downto 0) :=”000”;
process(clk)
variable a : std_logic_vector(3 downto 0) := “000”;
begin
if rising_edge(clk) then
--точка 1
counter <= counter + 1;
case counter is
when “001” =>
a := “1100”;
when “010 =>
a := “1010”;
when others =>
a := “0110”
end case;
--точка 2
end if;
end process;
Чему равно значение a в точке 2, если в точке 1 counter равен “000”?
process(clk)
variable counter : std_logic_vector(2 downto 0) :=”000”;
variable a : std_logic_vector(3 downto 0) := “0000”;
begin
if rising_edge(clk) then
--точка 1
counter := counter + 1;
case counter is
when “001” =>
a := “1100”;
when “010 =>
a := “1010”;
when others =>
a := “0110”
end case;
--точка 2
end if;
end process;
Чему равно значение a в точке 2, если в точке 1 counter равен “001”?
ssignal a : std_logic_vector(3 downto 0) := “0000”;
process(clk)
variable counter : std_logic_vector(2 downto 0) :=”000”;
begin
if rising_edge(clk) then
--точка 1
counter := counter + 1;
case counter is
when “001” =>
a <= “1100”;
when “010 =>
a <= “1010”;
when others =>
a <= “0110”
end case;
--точка 2
end if;
end process;
Найдите ошибку в программе и исправьте
ENTITY dev is
PORT (
clk : in std_logic;
port1 : in std_logic_vector (3 downto 0);
port2 : out std_logic_vector (3 downto 0);
equ : out std_logic
);
END dev;
ARCHITECTURE Behavior OF dev IS
BEGIN
process(clk)
begin
if rising_edge(clk) then
port2 <= port1 xor “1100”;
if port2 = “0000” then
equ <= ‘1’;
else
equ <= ‘0’;
end if;
end if;
end process
END Behavior;
