Система обработки данных (ЦАП на ПЛИС)

Автор работы: Пользователь скрыл имя, 23 Сентября 2012 в 14:21, курсовая работа

Краткое описание

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

Содержание

Введение 3
Анализ исходных данных 3
Разработка структурной схемы системы 4
Выбор и обоснование не указанных в задании элементов 5
Анализ временных параметров системы 5
Разработка файла конфигурации системы (на AHDL) 6
Моделирование цифровой части системы 6
Разработка принципиальной схемы 9
Разработка печатной платы 9
Заключение 10
Список литературы 11
Приложение 1 12
Приложение 2 17

Прикрепленные файлы: 1 файл

Пояснительная записка.doc

— 555.50 Кб (Скачать документ)

 

end;

 

Фаилы конфигурации каждого блока в отдельности.

Делитель частоты интерфейса:

 

include "lpm_counter.inc";

subdesign del200KHz

(

--сигнал генератора

clock_125MHz:input;

--выход делителя с частотой 200КГц

clock_200KHz:output;

)

variable

inDFF:node;

outDFF:node;

begin

--счетчик производящий каждые 311 тактов сигнал о своем переполнении COUT

inDFF=lpm_counter(.clock=clock_125MHz)

WITH(LPM_WIDTH=9, LPM_MODULUS=312) RETURNS(.cout);

--д-триггер удаляющий возможные набеги и сдвигающий сигнал на пол такта

outDFF=DFF(.d=inDFF,.clk=!clock_125MHz);

--счетчик превращающий одиночные импулься в тактовый сигнал

clock_200KHz=lpm_counter(.clock=outDFF)

WITH(LPM_WIDTH=1) RETURNS(.q[]);

end;

 

Блок интерфейса:

 

include "lpm_shiftreg.inc";

include "lpm_counter.inc";

include "lpm_ff.inc";

subdesign interface_pack

(

--последовательные входные данные

serial_data:input;

--частота работы интерфейса

clock_interface:input;

--отключение интерфейса

ENA_DFF:input;

--выходная шина данных

DATA_RAM[6..0]:output;

--сигнал по которому берутся параллельные данные

cout:output;

)

 

variable

DATA_RAM_pre[6..0]:node;

cout_pre:node;

 

begin

 

%регистр сдвига превращающий последовательные даннные

В параллельные

%

DATA_RAM_pre[]=lpm_shiftreg(.shiftin=serial_data,.clock=clock_interface)

WITH(LPM_WIDTH=7, LPM_DIRECTION="LEFT") RETURNS(.q[]);

 

%счетчик, отсчитывающий количество бит в посылке и формирующий

Сигнал для взятия параллельных данных

%

cout_pre=lpm_counter(.clock=clock_interface)

WITH(LPM_WIDTH=3, LPM_MODULUS=7) RETURNS(.cout);

 

--д-триггер для очистки сигнала  cout

cout=DFFE(.d=cout_pre,.clk=!clock_interface,.ena=ENA_DFF);

 

--набор д-триггеров для того чтобы по сигналу cout «отрезать» посылку

DATA_RAM[]=lpm_ff(.data[]=DATA_RAM_pre[],.clock=cout)

WITH(LPM_WIDTH=7, LPM_FFTYPE="DFF") RETURNS(.q[]);

 

end;

 

Блок записи данных в ОЗУ:

 

include "lpm_counter.inc";

include "dmux1to2.inc";

include "dbusmux1to2.inc";

subdesign write_pack

(

cout_main:input;

clock_interface:input;

we[1..0]:output;

1ADDRESS[8..0]:output;

2ADDRESS[8..0]:output;

ENABLE:output;

N_ENABLE:output;

)

variable

clock_counter:node;

address_pre[8..0]:node;

cout_words:node;

cout_mode:node;

sel_pre:node;

we_strob:node;

we_pre:node;

RESET:node;

ENABLE:node;

N_ENABLE:node;

sel:node;

begin

--генерируем стробы для записи данных

we_strob=DFF(.d=cout_main,.clk=!clock_interface);

we_pre=DFFE(.d=vcc,.clk=we_strob,.ena=N_ENABLE,.clrn=!we_pre);

 

--задерживаем сигнал cout_main на пол такта

clock_counter=DFF(.d=cout_main,.clk=clock_interface);

 

--счетчик генерирующий адреса

address_pre[8..0]=lpm_counter(.clock=clock_counter,.aclr=cout_words)

WITH(LPM_WIDTH=9, LPM_MODULUS=512) RETURNS(.q[]);

 

%задаем количество адресов (от 0 до 511),

По переполнении счетчика адреса генерируются заного с нуля

%

cout_words=lpm_counter(.clock=cout_main)

WITH(LPM_WIDTH=9, LPM_MODULUS=512) RETURNS(.cout);

 

--сдвигаем сигнал cout_words на пол такта

sel_pre=DFF(.d=cout_words,.clk=!cout_main);

 

%д-триггер дающий на выходе постоянную еденицу

По приходу импульсa на clk. Эта еденица идет на демультиплексоры

%

sel=DFF(.d=vcc,.clk=sel_pre);

 

%демультиплексор (ручной работы) переключающий стробы записи

С первой ОЗУ на вторую по сигналу Sel

%

we[1..0]=dmux1to2(.in=we_pre,.sel=sel);

 

%демультиплексор (ручной работы) переключающий шину адреса

с первой ОЗУ на вторую по сигналу Sel

%

1ADDRESS[]=dbusmux1to2(.in[]=address_pre[8..0],.sel=sel) RETURNS(.dataa[]);

2ADDRESS[]=dbusmux1to2(.in[]=address_pre[8..0],.sel=sel) RETURNS(.datab[]);

 

%задаем общее количество адресов для двух каналов

По переполнении счетчика генерируется сигнал на переключение режима

(с записи на чтение)

%

cout_mode=lpm_counter(.clock=cout_main)

WITH(LPM_WIDTH=11, LPM_MODULUS=15) RETURNS(.cout);

 

--сдвигаем сигнал cout_mode на пол такта

RESET=DFF(.d=cout_mode,.clk=!cout_main);

 

%д-триггер дающий на выходе постоянную еденицу.

Эта еденица отключает режим записи

%

ENABLE=DFF(.d=vcc,.clk=RESET);

--N_ENABLE- выключает запись

--ENABLE – включает чтение

N_ENABLE=!ENABLE;

 

end;

 

Блок чтения данных из ОЗУ:

 

INCLUDE "lpm_counter.inc";

INCLUDE "lpm_mux.inc";

subdesign read_pack

(

GENER_125M, select1[2..0], select2[2..0],enable: INPUT;

RAM_ADD1[8..0], RAM_ADD2[8..0]: OUTPUT;

)

VARIABLE

DEL_125M[4..0] : node;

MUX_F1,MUX_F2: node;

RESET1,RESET2:node;

begin

 

-- счетчик, делящий частоту на 5 каналов (/8/16/32/64/128)

DEL_125M[]=lpm_counter(.clock=GENER_125M)

WITH(LPM_WIDTH=7)

RETURNS(.q[6..2]);

 

 

--мультиплексоры, выбирающие частоту

MUX_F1=lpm_mux(.data[][]=DEL_125M[], .sel[]=select1[])

WITH (LPM_WIDTH=1, LPM_SIZE=5, LPM_WIDTHS=3)

RETURNS (.result[]);

 

 

MUX_F2=lpm_mux(.data[][]=DEL_125M[], .sel[]=select2[])

WITH (LPM_WIDTH=1, LPM_SIZE=5, LPM_WIDTHS=3)

RETURNS (.result[]);

 

--счетчики, обнуляющие адреса ОЗУ

RESET1=lpm_counter(.clock=MUX_F1)

WITH(LPM_WIDTH=9,LPM_MODULUS=512) RETURNS(.cout);

 

RESET2=lpm_counter(.clock=MUX_F2)

WITH(LPM_WIDTH=9,LPM_MODULUS=512) RETURNS(.cout);

 

--счетчики генерирующие адреса ОЗУ

RAM_ADD1[]=lpm_counter(.clock=MUX_F1,.aclr=RESET1,.clk_en=enable)

WITH(LPM_WIDTH=9)

RETURNS(.q[]);

 

RAM_ADD2[]=lpm_counter(.clock=MUX_F2,.aclr=RESET2,.clk_en=enable)

WITH(LPM_WIDTH=9)

RETURNS(.q[]);

 

end;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Приложение 2

 

Схема электрическая принципиальная системы обработки данных

 

 

 

 

 

 

 

 

 

 



Информация о работе Система обработки данных (ЦАП на ПЛИС)