Компоненты и технологии, № 5'2005 Софт
Генерация кодов на языке Си
и новые пользовательские библиотеки в SystemView
Иосиф Златин
[email protected] Сергей Кадышев
Генератор Си-кода
В SystemView имеется возможность генерировать исходный код на языке Си для отдельных элементов схемы, части схемы или полной схемы, используя встроенную утилиту C-Code Generator. Утилита C-Code Generator может быть использована также с Real-Time DSP Architect (RTDA) (связь с цифровыми сигнальными процессорами Texas Instruments) для обеспечения аппаратно-программного моделирования плат Evaluation Module (EVM) или DSP Starter Kit (DSK).
Генерируемый код полностью функционален, содержит команды для каждого из элементов SystemView, и при необходимости может включать в себя основную управляющую программу, которая осуществляет планирование работы системы и обработку данных, передаваемых от элемента к элементу. Создаваемые программы эффективны, учитывают установки параметров пользователя и имеют наглядные названия переменных.
Для создания исходного кода воспользуемся примером узкополосного модулятора GMSK (Gaussian Minimum Shift Keying — Гауссовская манипуляция с минимальным частотным сдвигом), построенного
Рис. 1. Пример узкополосного модулятора GMSK
(пунктиром выделены элементы, для которых создаются коды на языке Си)
с использованием элементов из библиотеки DSP. С помощью курсора выделим элементы, для которых мы хотим сгенерировать исходный код. После выделения интересующих элементов следует выбрать пункт Code Generator из меню Tools, или просто щелкнуть правой кнопкой мыши и выбрать Code Generator (рис. 1).
После этого появится показанное на рис. 2 диалоговое окно C-Code Generator, отображающее различные опции для создания исходного кода.
Данное диалоговое окно позволяет пользователю произвести организацию процесса генерации кода за З шагов:
1) выбрать заданный процессор;
2) выбрать тип оболочки для генерируемого кода;
3) установить размер буфера обработки;
4) выбрать элементы, исходный код которых следует поместить во внутреннюю часть программы управления;
З) выбрать директорию для размещения созданного кода.
На первом шаге задается тип процессора, на котором будет использоваться сгенерированный код. Имеются предварительно заданные опции для TI C6x и TI C5x, а также 32-разрядные конструкции Windows. Также обеспечиваются пользовательские настройки, в которых можно задать форматы представления данных для той базовой системы, которая будет использоваться. При использовании пользовательских опций генерация кода может быть выполнена для вычислительной машины практически любой конфигурации.
Если воспользоваться пользовательской опцией (Custom) и щелкнуть по кнопке Define, откроется диалоговое окно, с помощью которого задаются форматы данных, обеспечивающие совместимость с конфигурацией выбранной вычислительной машины (рис. 3).
После определения типа процессора следует указать, какая оболочка, если таковая вообще имеется,
Компоненты и технологии, № 5'2005
Custom Prucessor Deliiiitiun
Cusicm RecMer Length* (Bits)
Short Reg lie
IntReo |Э2
Long Reg |40
Float Reg
FVwtExp I®
Double f leg lei
ОоиЫс ЕЧ) I11
Chaocter Type IBfes] Reg |i
ChaiF Г Ch* It Urraigned
Рис. 3. Диалоговое окно Custom Processor Definition
требуется для функционирования генерируемого кода. От этого зависит, в каком виде он будет представлен. Code Generator позволяет создать три уровня кодов для выбранных элементов. Нижний уровень — код для отдельных элементов. Следующий уровень — это программа, которая управляет элементами и обменом данными между ними. Оболочка — высший уровень, который обеспечивает внешний интерфейс для управляющей программы. Пользователь имеет возможность выбрать одну из опций для оболочки, включая отсутствие оболочки, или создание стандартных программ для каждого элемента в отдельности без управляющей программы.
На третьем шаге в процессе генерации кода требуется выбрать минимальный размер буфера для обработки данных в выбранной подсистеме. Число, показанное в нижней части окна редактирования — это минимальное число входных отсчетов, которые могут быть обработаны созданной программой одновременно. Если у выбранного элемента имеется больше, чем один вход, число должно соответствовать размеру наименьшего входного буфера. Размеры других входных буферов будут изменены соответственно. Пользователь может увеличивать масштаб минимального размера буфера, задавая масштабный коэффициент в виде целого числа. Новый размер буфера будет отражен в созданном коде.
На четвертом шаге требуется указать, какие из выбранных элементов, если таковые вообще имеются, должны быть помещены во внутреннюю часть управляющей программы. Если щелкнуть по кнопке Select Inline в диалоговом окне C-Code Generator, откроется окно Inline Code Selection (рис. 4).
По умолчанию, для каждого отдельного элемента создается код, который помещается в от-
■A* inline Code Selection
И
Source code for checked tokens will be placed inline
□ 2 Operate* Gaussian
ZI3 DSP Cnst Mlply
✓ 4 DSP Integiator
✓ 5 DSPXtrac* Bits
□ 6 DSP Sin Cos
07 Source Step Fc(
HO Source Step Fct
Э DSP Sin Cos
OK.
Cancel
Рис. 4. Диалоговое окно Inline Code Selection
дельный файл. При наличии галочки, расположенной рядом с соответствующим элементом, код функционального элемента будет помещен внутри управляющей программы и отдельный файл для него создан не будет.
На пятом шаге в подготовке к созданию исходного кода выбирается директория, в которую он будет помещен. Как только директория будет выбрана, щелкните OK — генератор создаст необходимые файлы и поместит их в эту директорию.
Мы выберем элементы из нашей системы GMSK и создадим код для базовой системы Windows (x86), выбрав SystemView Custom Token как принятый тип оболочки. После выбора директории и щелчка по кнопке OK появится сообщение об успешном завершении процедуры генерации кода (рис. 5).
Рис. 5. Сообщение об успешном завершении генерации кодов
Информация о состоянии процесса создания программы после каждого шага записывается в системный журнал. Файл журнала помещается в директорию, куда производится запись генерируемого Си-кода, и имеет расширение .log.
Любые проблемы, которые возникают в процессе создания программы, могут быть исследованы при условии определения, в каком именно элементе произошел сбой. Директория (рис. 6) содержит перечень файлов, созданных генератором кода. Созданный для каждого элемента файл заголовка (header file) включает перечень, содержащий необходимые для элемента прототипы функций и определения структур.
В процессе генерации кода помимо файлов, содержащих исходный код для элемента (<эле-мент>.с), будут при необходимости созданы файлы, задающие начальные условия выполнения (<элемент>_тк.с) и файлы указателей (<элемент>_р^.с) для обмена данными, в случае, если данный элемент не был включен в основную управляющую программу.
Главная управляющая программа разделена на семь файлов. Каждый имеет в качестве
приставки название моделируемой схемы в SystemView (в нашем примере это «GMSK»). Заголовочные «GMSK» файлы содержат информацию о распределении динамической и постоянной памяти, необходимой для каждого элемента.
Ниже приведен листинг основной управляющей программы GMSK.C. /******************************************************************** Copyright© 2001-2004 by ELANIX, Inc.
5655 Lindero Canyon Road Suite 721
Westlake Village, CA 91362 Tel: 1.818.597.1414 Fax: 1.818.597.1427 E-mail: [email protected] WWW: http://www.elanix.com
Certain rights reserved under the U.S. Copyright Act.
This source code is for the exclusive use of the authorized SystemView by ELANIX Licensee, and may not be distributed to any other persons, organizations or entities without the expressed written consent of ELANIX, Inc.
#include «GMSK_Defs.h»
Void GMSK(Char nExtIn0,
Short *nExt0ut0,
Short *nExt0ut1,
struct GMSK_pRom *pRom,
struct GMSK_pMem *pMem)
{
/*
nExtIn0 is Input 0 From t1
nExtOut0 is Port 0 Out to t12 nExtOut! is Port 1 Out to t13
Int nExt0utInd0 = 0; Int nExt0utInd1 = 0;
while ((nExt0utInd0 < EXT_0UT_LEN_0)
II (nExt0utInd1 < EXT_0UT_LEN_1))
/* Token 2 — Gaussian */
if (!(pMem->b0utToggle_t2 л pMem->bInToggle_t2t3))
{
DspFIR(nExtIn0,
&(pMem->nFIRout_t2),
3,
&(pMem->DspFIR0bj_t2)); pMem->b0utToggle_t2 = !pMem->b0utToggle_t2;
if (pMem->b0utToggle_t2 л pMem->bInToggle_t2t3)
{
/* Token 3 — Cnst Mltply */
if (!(pMem->b0utToggle_t3 л pMem->bInToggle_t3t4))
{
DspGain(pMem->nFIRout_t2,
&(pMem->nGain_t3),
0x02b6);
pMem->bInToggle_t2t3 = pMem->b0utToggle_t2; pMem->b0utToggle_t3 = !pMem->b0utToggle_t3;
if (pMem->b0utToggle_t3 л pMem->bInToggle_t3t4)
{
/* Token 4 — Integrator */
if (!(pMem->b0utToggle_t4 л pMem->bInToggle_t4t5))
{
DspIntegrate(pMem->nGain_t3, pMem->bReset_t4, &(pMem->nIntg_t4)); pMem->bInToggle_t3t4 = pMem->b0utToggle_t3; pMem->b0utToggle_t4 = !pMem->b0utToggle_t4;
if (pMem->b0utToggle_t4 л pMem->bInToggle_t4t5)
{
*/
Компоненты и технологии, № 5'2005
Рис. 7. Сравнительное моделирование исходной схемы и пользовательского элемента созданного из кодов, которые были получены с помощью утилиты C-Code Generator
/* Token 5 — Xtract Bits */
if (!(pMem->b0utToggle_t5 л pMem->bInToggle_t5t6) && !(pMem->b0utToggle_t5 л pMem-
>bInToggle_t5t9))
{
&(pMem->n0ut_t5));
>b0utToggle_t4;
>b0utToggle_t5;
DspExtractBits22To14(pMem->nIntg_t4, pMem->bInToggle_t4t5 = pMem-pMem->b0utToggle_t5 = !pMem-
}
}
}
/* Token 7 — Step Fct */
if (!(pMem->b0utToggle_t7 л pMem->bInToggle_t7t6))
{
ConstSsrc(&(pMem->dSrc0^_t7)> &(pRcm->dAm.plitude_t7)); pMem->b0utToggle_t7 = !pMem->b0utToggle_t7;
if ((pMem->b0utToggle_t5 л pMem->bInToggle_t5t6)
&& (pMem->b0utToggle_t7 л pMem->bInToggle_t7t6))
/* Token 6 — Sin Cos */
pMem->bIsSin_t6 = (Int) pMem->dSrc0ut_t7;
CosLUT_Select(pMem->n0ut_t5,
pMem->bIsSin_t6,
&(pMem->nSinLUT0ut_t6),
512,
pRom->nSinLUT_t6); pMem->bInToggle_t5t6 = pMem->b0utToggle_t5; pMem->bInToggle_t7t6 = pMem->b0utToggle_t7;
/* Token 10 — Smpl Delay */
SampleDelay(pMem->nSinLUT0ut_t6,
&(pMem->nDelay0ut_t10),
&(pMem->nDelayBuf_t10));
nExt0utInd0++;
*nExt0ut0 = pMem->nDelay0ut_t10;
/* Token 8 — Step Fct */
if (!(pMem->b0utToggle_t8 л pMem->bInToggle_t8t9))
{
GonstSrcC&pMem^dSKDutjS), &(pRom->dAm.plitude_t8)); pMem->b0utToggle_t8 = !pMem->b0utToggle_t8;
if ((pMem->b0utToggle_t5 л pMem->bInToggle_t5t9)
&& (pMem->b0utToggle_t8 л pMem->bInToggle_t8t9))
/* Token 9 — Sin Cos */
pMem->bIsSin_t9 = (Int) pMem->dSrc0ut_t8;
CosLUT_Select(pMem->n0ut_t5,
pMem->bIsSin_t9,
&(pMem->nSinLUT0ut_t9),
512,
pRom->nSinLUT_t9); pMem->bInToggle_t5t9 = pMem->b0utToggle_t5; pMem->bInToggle_t8t9 = pMem->b0utToggle_t8;
/* Token 11 — Smpl Delay */
SampleDelay(pMem->nSinLUT0ut_t9,
&(pMem->nDelay0ut_t11),
&(pMem->nDelayBuf_t11));
nExt0utInd1++;
*nExt0ut1 = pMem->nDelay0ut_t11;
}
}
Папка NTSC (National Television Standart Code) содержит два элемента: Multi Burst и Color Bar для обработки видео.
MB ■ — источник, создающий сигнал ис-питательных частотных пакетов. Выходные данные нормированы к 1 В, то есть 1 В = -40 IRE-единиц (Institute of Radio Engineers — Институт радиоинженеров, ИРИ). Для выходных данных в единицах ИРИ устанавливаются Gain = -160 и Bias = 120. Параметры элемента MB приведены в таблице 1.
Таблица 1. Параметры элемента MB
В продолжение нашего примера, можно создать пользовательский элемент из сгенерированного кода для использования в SystemView. Более подробная информация о построении пользовательских элементов изложена в руководстве [10]. Сначала мы должны создать новый проект Win32 DLL с помощью Microsoft Visual C++. В Visual C++ просто выделите все файлы, созданные генератором кода в назначенной директории, и создайте DLL (динамически подключаемую библиотеку). Для создания пользовательских элементов никакие другие файлы не нужны. Созданная DLL может быть возвращена в SystemView, где будет выполнять совместное моделирование средствами SystemView. Элемент 16 в системе (рис. 7) является пользовательским элементом из библиотеки DLL, созданной с использованием кода, сгенерированного в нашем примере. Когда система моделируется, основной путь (элементы 2-9) моделируется средствами SystemView, в то время как второй путь моделируется при помощи нового пользовательского элемента. Анализаторы данных (12, 15) в реальном масштабе времени показывают эквивалентность созданного пользовательского элемента 16 элементам 2-9.
Пользовательские библиотеки, появившиеся в SystemView 6.0
Папка «C:\Program Files\SystemView\Extra Libraries» включает четыре новые пользовательские DLL-библиотеки SystemView 6.0: NTSC32, SoundCard, SpurChartMixer и Text0utputSink.
Параметр Определение
Gain Усиление
Bias, V Смещение, В
StartTime, sec Время запуска — определяет время начала строки развертки, с
СВ Щ — стандарт сигнала цветных полос (SMPTE ECR 1-1978, Society of Motion Picture and Television Engineering). Параметры элемента CB приведены в таблице 1. Схема проверки элементов MB и CB, а также выходные сигналы этих элементов приведены на рис. 8.
Библиотека SpurChartMixer содержит один элемент.
Mixer В — смеситель. Этому элементу требуется файл с таблицей интермодуляционных искажений. Параметры элемента Mixer приведены в таблице 2.
Таблица 2. Параметры элемента Mixer
Параметр Определение
Conv Loss (dB) Потери преобразования, дБ. Определяется как отношение мощности сигнала промежуточной частоты 11- Ю или 12+10 к входной мощности сигнала с частотой П.
DC Offset (V) Смещение постоянной составляющей, В
Harmonic intermodulation file Путь к файлу с таблицей интермодуляционных искажений
Смеситель имеет два входа: вход высокочастотного сигнала (RF) и сигнал гетеродина (L0), а также один выход сигнала промежуточной частоты (IF).
Пример схемы, использующей элемент Mixer, приведен на рис. 9, а результаты моделирования — на рис. 10.
Библиотека SoundCard (звуковая карта) обеспечивает элементы «источник» и «анализатор данных» для связи с указанными пользовательскими аудиоустройствами.
Компоненты и технологии, № 5'2GG5
Библиотека SVUSound включает в себя два элемента: Мауе1п — источник и МауеОШ: — анализатор данных.
\Уауе1п 9 — источник (прямой вход из аудиоустройства ПК). Параметры элемента Мауе1п приведены в таблице 3.
Таблица 3. Параметры элемента WаveIn
Таблица 4. Параметры элемента WaveOut
Параметр Определение
Audio Input Device Автоматически выбирается тип аудиоустройства
Playback length, sec Продолжительность воспроизведения, с
Параметр Определение
Audio Input Device Автоматически выбирается тип аудиоустройства
PCM Wave Format, Hz Формат аудиоданных, использующих PCM (pulse-code modulation — кодово-импульсная модуляция — способ кодирования аналогового сигнала, например речи, для передачи его в форме цифрового потока со скоростью 64 кбит/с)
Выбор типа аудиосигнала Моно или стерео
Разрядность сигнала, бит
Recording Length, sec Продолжительность записи, с
TextOut s — анализатор данных. Этот элемент обеспечивает вывод выходных данных элементов DSP библиотеки в текстовый файл в десятичном, шестнадцатеричном и двоичном форматах. В шестнадцатеричном и двоичном выходных форматах нулевой бит находится всегда справа. Параметры элемента Text0ut приведены в таблице 5.
Таблица 5. Параметры элемента TextOut
Элемент Мауе1п имеет два выхода: канал 0 и канал 1.
WаveOut — анализатор данных (прямой выход к аудиоустройству ПК). Параметры элемента МауеОШ: приведены в таблице 4.
Пример схемы, использующей элементы библиотеки SVUSound, и результаты моделирования приведены на рис. 11.
Библиотека ТехЮШ:рШЗтк включает в себя один элемент ТехЮи!
Параметр Определение
Выбор текстового формата 0 — десятичный (1234), 1 — шестнадцатеричный (1234х), 2 — двоичный формат (0101Ь)
File Name (.TXT) Определяет название выходного файла и путь к нему
Пример схемы вывода результатов моделирования в десятичном формате приведен на рис. 12. ЯШ
Литература
1. Разевиг В. Д., Лаврентьев Г. В., Златин И. Л. SystemView — средство системного проек-
тирования радиоэлектронных устройств / Под ред. В. Д. Разевига. М.: Горячая линия-Телеком. 2002.
2. Златин И. Новые возможности SystemView // Компоненты и технологии. 2003. № 1,
3. Разевиг В. Д. Златин И. Л. Новые возможности SystemView // EDA Express. 2003. № У,
4. Златин И. Пользовательские библиотеки (Custom Library) и многостанционный доступ с кодовым разделением каналов (CDMA) в SystemView // Компоненты и технологии. 2003. № 8.
З. Златин И. Пользовательская библиотека WNL 80211g в SystemView // Компоненты и технологии. 2003. № 9,
6. Златин И., Кадышев С. SystemView + Matlab + + Simulink // Компоненты и технологии, 2004. № 2.
У. Златин И. Еще раз о пользовательских библиотеках SystemView // Компоненты и технологии. 2004. № 3.
8. Златин И. Цифровое телевидение (DVB) и технология беспроводной сверхшироко-полосной связи (UWB) в SystemView // Компоненты и технологии. 2003. № 9.
9. Златин И. SystemView + Expressive = HDL Design Studio // Компоненты и технологии. 2004. № З.
10. SystemView User's Guide. Elanix, Inc. 2001.