Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Ответы экзамен ПЛИС

.pdf
Скачиваний:
17
Добавлен:
21.06.2024
Размер:
2.35 Mб
Скачать

Для использования элементов пакета в основной программе необходимо импортировать пакет. Для этого используется ключевое слово "use" и имя пакета. Например, чтобы использовать элементы пакета "my_package" в основной программе, необходимо написать

"use my_package;" в начале программы.

Пакеты могут содержать подпакеты, которые также являются модулями кода. Подпакеты могут быть вложены друг в друга, что позволяет создать иерархическую структуру кода. Использование пакетов позволяет уменьшить количество кода и улучшить его читаемость. Кроме того, это позволяет легко поддерживать и расширять проект в будущем, поскольку элементы пакета могут быть легко перемещены или изменены без необходимости изменения остальной части проекта.

Вот короткий пример использования пакета в VHDL-проекте: library IEEE; // подключаем стандартную библиотеку IEEE

use IEEE.STD_LOGIC_1164.all; // используем все элементы стандартной библиотеки IEEE

package my_package;

type my_type is array(0 to 10) of std_logic_vector(3 downto 0); // определяем тип my_type,

который является массивом строк 3x4

procedure my_procedure(signal my_signal : my_type); // объявляем процедуру my_procedure

с одним входным сигналом my_signal типа my_type

end package;

-- в основной программе можно использовать элементы пакета my_package, например: use my_package.my_type; // импортируем тип my_type из пакета my_package

signal my_sig : my_type(1 to 5); // создаем сигнал my_sig типа my_type и заполняем его

значениями

my_procedure(my_sig); // вызываем процедуру my_procedure, передавая ей сигнал my_sig в

качестве аргумента

29. Testbenches и их применение.

Testbenches (тесты) являются неотъемлемой частью разработки цифровых систем на языке VHDL. Они используются для проверки правильности работы спроектированных компонентов и модулей.

Testbench представляет собой набор тестовых сценариев, которые моделируют работу системы в различных условиях. Эти сценарии могут включать в себя различные входные данные, ошибки и нестандартные ситуации, которые необходимо проверить. Применение testbenches позволяет разработчикам убедиться в корректности работы системы на всех этапах проектирования. Благодаря этому, снижается риск обнаружения ошибок в работе системы после ее запуска.

Кроме того, использование testbenches помогает ускорить процесс разработки, так как позволяет проверять работу системы на ранних этапах проектирования, еще до ее физического воплощения.

Пример testbench для проверки работы модуля умножения двух чисел на языке VHDL может выглядеть следующим образом:

```vhdl

library IEEE;

use IEEE.STD_LOGIC_1164.All; entity mul_tb is

--parent entity declaration end mul_tb;

architecture tb of mul_tb is component mul

--child component declaration

end component;

signal a, b, c: std_logic_vector (31 downto 0); -- входные сигналы signal error_flag: std_logic; -- флаг ошибки

signal result: std_logic_vector (63 downto 0); -- выходное значение begin

uut: mul generic map ( a_width => 32, b_width => 32

)

port map ( clk => clk, rst => rst, a => a,

b => b, c => c,

error_flag => error_flag, result => result

); process

begin

wait for 10 ns; -- задержка для имитации работы системы assert not error_flag else

report "Error during multiplication" severity error; wait;

end process; end tb;

```

ПРАКТИЧЕСКАЯ ЧАСТЬ

1. Создание с использование языка VHDL конфигурационного файла, реализующего

функцию, соответствующую рисунку:

X1

library ieee;

X2 &

use ieee.std_logic_1164.all;

 

 

 

 

 

XOR

Y1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

entityX3

 

func is

 

 

 

 

 

NOT

 

 

 

port

(

 

 

 

 

 

 

 

 

 

 

x1, x2, x3: in std_logic;

y1: out std_logic

 

);

 

 

 

 

 

 

end entity func;

 

architecture rtl of func is begin

process (x1, x2, x3) begin

y1 <= (x1 and x2) xor (not x3); end process;

end architecture rtl;

2. Реализовать логическую функцию в Schematic. Например, Y=(A or B) and C.

Например, для реализации функции Y=(A or B) and C, вы можете использовать элементы OR и AND. Сначала соедините элементы A и B с элементом OR, а затем соедините выход OR с элементом AND вместе с элементом C. Выход AND будет соответствовать Y.

3. Реализовать делитель частоты на 2N в Schematic.

4. Реализовать сравнение двух 8 битных чисел в Schematic или VHDL.

library ieee;

use ieee.std_logic_1164.all; use ieee.numeric_std.all;

entity comparator is port (

A:in std_logic_vector(7 downto 0);

B:in std_logic_vector(7 downto 0); result: out std_logic

);

end comparator;

architecture behavioral of comparator is begin

process(A, B) begin

if unsigned(A) < unsigned(B) then result <= '1';

else

result <= '0'; end if;

end process;

end behavioral;

В этом примере мы используем библиотеку ieee.numeric_std, чтобы преобразовать входные векторы A и B в беззнаковые числа с помощью функции unsigned. Затем мы сравниваем эти числа и устанавливаем значение выходного сигнала result в '1', если A < B, и в '0' в противном случае.

Надеюсь, это поможет вам!

5. Измерение временного интервала.

library ieee;

time_interval.

use ieee.std_logic_1164.all; use ieee.numeric_std.all;

entity time_interval_counter is port (

clk: in std_logic; event_start: in std_logic; event_stop: in std_logic;

time_interval: out unsigned(31 downto 0)

);

end time_interval_counter;

architecture behavioral of time_interval_counter is

signal counter: unsigned(31 downto 0) := (others => '0'); signal counting: boolean := false;

begin process(clk) begin

if rising_edge(clk) then

if event_start = '1' then counting <= true;

counter <= (others => '0'); elsif event_stop = '1' then

counting <= false; time_interval <= counter;

elsif counting then

counter <= counter + 1; end if;

end if; end process;

end behavioral;

Копировать

В этом примере мы используем сигнал counter для подсчета количества тактов между событиями event_start и event_stop. Сигнал counting используется для управления процессом подсчета. Когда событие event_start происходит, счетчик обнуляется и начинает считать количество тактов. Когда событие event_stop происходит, счетчик

останавливается и значение счетчика передается на выход в виде сигнала

Надеюсь, это поможет вам! Либо (но я хз)

8.«Мигание» светодиодом с частотой 1 Гц в Schematic.

хз

9.«Мигание» светодиодом с частотой 1 Гц в VHDL.

library ieee;

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

blink_freq.
COUNT_MAX

entity led_blinker is generic (

clk_freq: natural := 50000000; -- clock frequency in Hz blink_freq: natural := 1 -- blink frequency in Hz

); port (

clk: in std_logic; rst: in std_logic; led: out std_logic

);

end led_blinker;

architecture behavioral of led_blinker is

constant COUNT_MAX: natural := clk_freq / (blink_freq * 2) - 1; signal counter: natural range 0 to COUNT_MAX := 0;

signal led_state: std_logic := '0'; begin

process(clk) begin

if rising_edge(clk) then if rst = '1' then

counter <= 0; led_state <= '0';

else

if counter = COUNT_MAX then counter <= 0;

led_state <= not led_state;

else

counter <= counter + 1; end if;

end if; end if;

end process;

led <= led_state;

end behavioral;

Копировать

В этом примере мы используем счетчик counter для подсчета количества тактов между

изменениями состояния светодиода. Когда счетчик достигает максимального значения , он обнуляется и состояние светодиода меняется на противоположное. Значение COUNT_MAX рассчитывается на основе частоты тактового сигнала clk_freq и

желаемой частоты мигания

10. Реализовать преобразователь из двоичного кода в код Грея.

Код testbench.vhd

-- Testbench for b2g_code

library IEEE;

use IEEE.std_logic_1164.all;

entity testbench is -- empty

end testbench;

architecture tb of testbench is -- DUT component

component b2g_code is port(

b : in std_logic_vector(3 downto 0); g : out std_logic_vector(3 downto 0)); end component;

signal b_in, g_out: std_logic_vector(3 downto 0);

begin

-- Connect DUT

DUT: b2g_code port map(b_in, g_out); process

begin

b_in <= "0000"; wait for 1 ns;

assert(g_out="0000") report "Fail 0/1" severity error;

b_in <= "0110"; wait for 1 ns;

assert(g_out="0101") report "Fail 0/1" severity error;

b_in <= "1101"; wait for 1 ns;

assert(g_out="1011") report "Fail 0/1" severity error;

b_in <= "1010"; wait for 1 ns;

assert(g_out="1111") report "Fail 0/1" severity error;

assert false report "Test done." severity note; wait;

end process;

end tb;

Код design.vhd library ieee;

use ieee.std_logic_1164.all;

entity b2g_code is

port (b : in std_logic_vector(3 downto 0);

g : out std_logic_vector(3 downto 0)); end b2g_code;

architecture b2g_arch of b2g_code is begin

g(3) <= b(3);

g(2) <= b(3) xor b(2);

g(1) <= b(2) xor b(1);

g(0) <= b(1) xor b(0);

end b2g_arch;В этом примере мы используем операцию XOR между старшим битом

исходного двоичного числа и следующим за ним битом, чтобы получить соответствующий бит в коде Грея. Затем мы повторяем этот процесс для каждого следующего бита.