Основы проектирования систем на кристалле. Часть II
.pdfРис. 7. Диаграмма модели
6.Поменяйте параметры блоков Shift Arithmetic1 (установите величину сдвига равной -16) и Shift Arithmetic2 (установите величину сдвига равной -8).
7.Поменяйте индексы извлекаемых битов в параметрах блоков Extract Bits1 (установите индексы [4 10]), Extract Bits2 (установите индексы [11 12]), Extract Bits3 (установите индексы [13 20]), Extract Bits4 (установите индексы [21 31]).
8.Скомпилируйте модель. Для этого нажмите на кнопку Incremental build в
панели инструментов окна модели Теперь выполним проверку работы модели. Это наиболее удобно сделать, запустив
модель в пошаговом режиме, используя Simulink Debugger.
9.Запустите Simulink Debugger, нажав на кнопку Debug в панели инструментов окна модели.
10.На панели Break Points в поле Break at time установите значение 1 (рис. 15).
Рис. 15. Проверку работы модели наиболее удобно проводить в пошаговом режиме
спомощью Simulink Debugger
11.Нажмите на кнопку Start/Continue панели инструментов окна Simulink Debugger.
12.Нажимая на кнопку Go to first method at start of next time step, выполняйте
Simulation loop модели в пошаговом режиме.
Можно повысить информативность пошагового выполнения модели, если нажать на кнопку Show port values when hovering. Если эта кнопка нажата, то при наведении курсора «мыши» на какой-либо блок модели на экране отображаются значения сигналов на выходных портах данного блока. Для генерации HDL-кода по созданной модели необходимо объединить все блоки модели за исключением источника данных (блок Counter Free-Running) и блоков Display, обеспечивающих вывод значений на экран, в подсистему. После указания имени созданной подсистемы в поле Generate HDL for в окне диалога Configuration Parameters модели, можно выполнить генерацию VHDL-кода для созданного устройства и для тестирующей программы Testbench.
Перейдем к выполнению второй задачи.
1.Создайте на диске директорию Gate, запустите MatLab и укажите Gate в качестве рабочей директории (Current Directory).
2.Запустите Simulink Library Browser и создайте новую модель. Сохраните ее под именем Gate.
3.Настройте параметры модели, запустив в Command Window среды MatLab скрипт
hdlsetup
В таблице ниже приведены блоки с кратким описанием их функциональности, которые необходимо поместить в диаграмму модели из Simulink Library Browser.
Символ и название |
Категория в |
Функциональность |
|
|
|
Simulink |
|
|
|
Library |
|
|
|
Browser |
|
|
|
|
|
|
|
|
Источник байтового потока. В окне диалога Source |
|
|
Sources |
Block Parameters в поле Number of bits установите |
Counter |
Free- |
|
8. В поле Sample time установите 1. |
Running |
|
|
|
|
|
|
|
|
|
|
Источник управляющего сигнала. В окне диалога |
|
|
|
Source Block Parameters в списке Pulse type |
|
|
Sources |
выберите Sample based, в списке Time – Use |
|
|
simulation time. В поле Amplitude установите |
|
|
|
|
|
Pulse Generator |
|
значение 1, в поле Period – значение 10, в поле |
|
|
|
|
Pulse width – 5. |
|
|
|
|
|
|
Signal |
Осуществляет преобразование типа сигнала. В |
|
|
поле Output Data Type окна диалога Function Block |
|
|
|
Attributes |
|
Data Type |
|
Parameters установите boolean. |
|
|
|
||
Conversion |
|
|
|
|
|
|
|
|
|
|
Выполняет побитовую операцию (какую-либо) над |
|
|
Logic and Bit |
входными сигналами. В выпадающем списке |
|
|
Operations |
Operator окна диалога Function Block Parameters |
Bitwise Operator |
|
выберите NOT. |
|
|
|
|
|
|
|
|
Управляемый переключатель. Под управлением |
|
|
|
второго порта коммутирует на выход сигналы |
|
|
Signal Routing |
первого или третьего портов. В выпадающем |
Switch |
|
|
списке Format окна диалога Criteria for passing first |
|
|
input выберите u2~=0 |
|
|
|
|
|
|
|
|
|
|
|
|
Запоминает значение входного сигнала на один |
|
|
Discret |
такт. На выходе значения входного сигнала |
Unit Delay |
|
|
появляются с задержкой в один такт. |
|
|
|
|
|
|
|
|
|
|
Sinks |
Выводит на экран значения входного сигнала |
Display |
|
|
|
|
|
|
|
4.Разместите блоки в окне диаграммы модели и соедините их сигналами так, чтобы диаграмма выглядела как на рис. 16
Рис. 16. Диаграмма модели управляемого вентиля
5.Выполните проверку работы модели, используя Simulink Debugger
6.Выполните генерацию VHDL-кода, предварительно объединив в подсистему все блоки модели, кроме Counter Free-Running, Pulse Generator, Data Type
Conversion и Display.
Приведем примеры решения еще двух задач. Первая из них – преобразование параллельного кода в последовательный. Вторая – обратно. Объединим обе задачи в одной модели так, что на выходе модели при ее правильной работе мы должны иметь повторение входного сигнала.
1.Создайте на диске директорию Parallel2Serial, запустите MatLab и укажите
Parallel2Serial в качестве рабочей директории (Current Directory).
2.Запустите Simulink Library Browser и создайте новую модель. Сохраните ее под именем Prl2Srl.
3.Настройте параметры модели, запустив в Command Window среды MatLab скрипт
hdlsetup
В таблице ниже приведены блоки с кратким описанием их функциональности, которые необходимо поместить в диаграмму модели из Simulink Library Browser.
Символ и название |
Категория в |
Функциональность |
|
|
|
Simulink |
|
|
|
Library |
|
|
|
Browser |
|
|
|
|
|
|
|
|
Источник байтового потока. В окне диалога Source |
|
|
Sources |
Block Parameters в поле Number of bits установите |
Counter |
Free- |
|
8. В поле Sample time установите 8. |
Running |
|
|
|
|
|
|
|
Символ и название |
Категория в |
Функциональность |
|
|
|
Simulink |
|
|
|
|
Library |
|
|
|
|
Browser |
|
|
|
|
|
|
||
|
|
Выделяет из входного сигнала заданные разряды. В |
||
|
Logic and Bit |
выпадающем списке Bits to extract окна диалога |
||
|
Function Block Parameters выберите Range of bits. В |
|||
|
Operations |
|||
|
поле Bit indices установите [7 7]. В списке Output |
|||
Extract Bits |
|
|||
|
scaling mode выберите Treat bit field as an integer. |
|||
|
|
|||
|
|
|
||
|
|
Объединяет входные сигналы в единый векторный |
||
|
Signal Routing |
сигнал. В поле Number of inputs окна диалога |
||
Mux |
|
Function Block Parameters установите 8. |
|
|
|
|
|
|
|
|
|
|
||
|
|
Согласовывает скорости работы входного и |
||
|
|
выходного портов. В поле Initial Condition окна |
||
|
Signal |
диалога Function Block Parameters установите 0. В |
||
|
Attributes |
списке Output port sample time options выберите |
||
Rate Transition |
|
позицию Specify. В поле Output port sample time |
||
|
|
установите 1. |
|
|
|
|
|
||
|
|
Выбирает из векторного сигнала элементы, ин- |
||
|
|
дексы которых соответствую значению на |
||
|
Signal Routing |
управляющем порту, и отправляет их на выходной |
||
Index Vector |
|
порт. Отметьте поле Use zero-based indexing окна |
||
|
диалога Function Block Parameters. |
|
||
|
|
|
||
|
|
|
||
|
|
Накапливает значения входного сигнала заданное |
||
|
|
количество тактов. Выходной сигнал представляет |
||
|
|
собой вектор из накопленных значений. В поле |
||
|
Discrete |
Sample Time окна диалога Function Block |
||
Taped Delay |
|
Parameters установите -1. В поле Number of Delays |
||
|
установите 8. В выпадающем списке Order output |
|||
|
|
|||
|
|
vector starting with выберите позицию Oldest |
||
|
|
|
|
|
|
Signal |
Осуществляет преобразование |
типа |
сигнала. В |
|
поле Output Data Type окна диалога Function Block |
|||
|
Attributes |
|||
Data Type |
Parameters установите uint8. |
|
|
|
|
|
|
||
Conversion |
|
|
|
|
|
|
|
||
|
|
Разделяет векторный сигнал на отдельные |
||
|
Signal Routing |
скалярные значения. В поле |
Number |
of Outputs |
|
окна диалога Function Block Parameters установите |
|||
|
|
|||
Demux |
|
8. |
|
|
|
|
|
||
|
|
Осуществляет битовый сдвиг (умножение на |
||
|
Logic and Bit |
степень 2) входного сигнала. В поле Number of bits |
||
|
Operations |
to shift right окна диалога Function Block Parameters |
||
Shift Arithmetic |
|
установите -7. |
|
|
|
|
|
|
|
Символ и название |
Категория в |
|
|
Функциональность |
|
|
|
||
|
Simulink |
|
|
|
|
|
|
|
|
|
Library |
|
|
|
|
|
|
|
|
|
Browser |
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
Выполняет побитовую операцию (какую-либо) над |
|||||||
|
Logic and Bit |
входными |
сигналами. |
В |
выпадающем |
списке |
|||
|
Operator окна диалога Function Block |
Parameters |
|||||||
|
Operations |
||||||||
|
выберите |
OR. |
В поле |
Number |
of |
input ports |
|||
Bitwise Operator |
|
||||||||
|
установите 8. |
|
|
|
|
|
|
||
|
|
|
|
|
|
|
|
||
|
|
|
|||||||
|
Sinks |
Выводит на экран значения входного сигнала. |
|||||||
Display |
|
|
|
|
|
|
|
|
|
|
|
|
|||||||
|
|
Запоминает значение входного сигнала на нес- |
|||||||
|
|
колько тактов. На выходе значения входного |
|||||||
|
Discret |
сигнала появляются с задержкой в это количество |
|||||||
Integer Delay |
|
тактов. В |
поле |
Number |
of |
delays |
окна |
диалога |
|
|
Function Block Parameters установите 2. |
|
|
||||||
|
|
|
|
||||||
|
|
|
|
|
|
|
|
|
|
13.Размножьте необходимые блоки и соедините их сигналами так, чтобы диаграмма модели выглядела как на рис. 17.
Рис. 17. Левая часть диаграммы (последний блок слева направо – Index Vector) реализует преобразование параллельного кода в последовательный. Правая часть – обратное преобразование. Блок Display1 отображает задержанную версию входного сигнала, генерируемого блоком Counter Free-Running
14.В окне диалога Source Block Parameters блока Counter Free-Running1 установите в поле Number of bits значение 3.
15.Установите параметры блоков Extract Bits … Extract Bits7 для извлечения битов входного сигнала с 7-го по 0-вой.
16.Установите значения параметров Number of bits to shift right блоков Shift Arithmetic … Shift Aritmetic 6 в -7 … -1.
17.Установите значение параметра Output port sample time блока Rate Transition2
равным 8.
18.Проверьте работу модели, используя Simulink Debugger.
Перед генерацией кода объедините блоки, относящиеся к преобразованию параллельного кода в последовательный, в одну подсистему, блоки, относящиеся к преобразованию последовательного кода в параллельный, – в другую. Блоки созданных подсистем объедините в подсистему верхнего уровня, которая и будет представлять собой моделируемое устройство. После объединения в окружение моделируемого цифрового устройства должны войти только блоки Counter Free-Running, Integer Delay, Display, Display1 (рис. 18, 19).
Рис. 18. Диаграмма модели после объединения блоков в подсистемы
Рис. 19. Окончательный вид модели перед генерацией VHDL-кода
11.Выполните генерацию VHDL-кода модели и программы Testbench. Изучите сгенерированный код.
Блоки Embedded MatLab
Несмотря на то, что с Simulink поставляется богатый набор готовых блоков, которые можно использовать для моделирования цифровых устройств и совместимых с Simulink HDL Coder, в Simulink также предусмотрена возможность создания различных видов пользовательских (Custom) блоков. Функциональность таких блоков пользователь определяет сам. Из всех типов Custom блоков совместимы с HDL Coder только, так называемые, Embedded MatLab Function блоки. Функциональность таких блоков пользователь описывает, создавая программу на языке программирования Embedded MatLab.
Рассмотрим на примере создание модели с использованием Embedded MatLab Function блока. В модели реализуем счетчик, имеющий два двоичных управляющих сигнала: первый – rst, сбразывает счетчик в нулевое значение; второй – enable, разрешает или запрещает работу счетчика.
1.Создайте новую директорию, например Counter, и укажите ее в качестве Current Directory в программе MatLab.
2.Запустите Simulink и создайте новую модель. Сохраните ее под именем uint8_counter.
3.Выберите Embedded MatLab Function блок из раздела User-Defined Functions в Simulink Library Browser и поместите его в окно модели.
4.Откройте окно Embedded MatLab Editor двойным щелчком «мыши» по изображению блока на диаграмме модели.
5.Замените текст программы на следующий:
function y = counter(rst,enable) persistent counter;
if isempty(counter) counter=uint8(0);
end
if rst counter=uint8(0);
elseif enable counter=counter+1;
end y=counter;
6.Выберите блок Display из раздела Sinks в Simulink Library Browser и поместите его в окно модели.
7.Выберите блок Signal Builder из раздела Sources в Simulink Library Browser и
поместите его в окно модели. Двойным щелчком «мыши» откройте окно Signal Builder. Используя меню открывшегося окна создайте два сигнала так, чтобы редактор сигналов выглядел как на рис. 20.
Рис. 20. Создайте два сигнала и откорректируйте положение импульсов на временной оси
8.Вызовите окно диалога Simulation Options, выбрав в меню File позицию
Simulation Options. Из выпадающего списка Signal values after final time
выберите Hold filnal value. В поле Sample time установите значение 1. Закройте окно диалога Signal Builder.
9.В окне Configuration Parameters модели в «дереве» Select выберите Solver. В
поле Fixed step size установите значение 1.
10.Добавьте к диаграмме модели два блока Data Type Conversion из категории
Signal Attributes в Simulink Library Browser. В настройках этих блоков установите в поле Output Data Type в значение Boolean.
11.Соедините блоки сигналами так, чтобы диаграмма модели выглядела как на рис. 21.
Рис. 21. Вид диаграммы модели, использующей Embedded MatLab function блок 12. Проверьте правильность работы модели, используя Simulink Debugger.