Автор работы: Пользователь скрыл имя, 23 Сентября 2012 в 14:21, курсовая работа
Развитие электроники и автоматики привело к значительному расширению области применения интегральных схем различной степени интеграции. Сегодня многие сложные узлы радиоэлектронной аппаратуры, такие как отдельные блоки вычислительных машин и систем управления строятся с применением методов интегральной схемотехники.
Введение 3
Анализ исходных данных 3
Разработка структурной схемы системы 4
Выбор и обоснование не указанных в задании элементов 5
Анализ временных параметров системы 5
Разработка файла конфигурации системы (на AHDL) 6
Моделирование цифровой части системы 6
Разработка принципиальной схемы 9
Разработка печатной платы 9
Заключение 10
Список литературы 11
Приложение 1 12
Приложение 2 17
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=
WITH(LPM_WIDTH=9, LPM_MODULUS=312) RETURNS(.cout);
--д-триггер удаляющий возможные набеги и сдвигающий сигнал на пол такта
outDFF=DFF(.d=inDFF,.clk=!
--счетчик превращающий одиночные импулься в тактовый сигнал
clock_200KHz=lpm_counter(.
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(.
WITH(LPM_WIDTH=7, LPM_DIRECTION="LEFT") RETURNS(.q[]);
%счетчик, отсчитывающий количество бит в посылке и формирующий
Сигнал для взятия параллельных данных
%
cout_pre=lpm_counter(.clock=
WITH(LPM_WIDTH=3, LPM_MODULUS=7) RETURNS(.cout);
--д-триггер для очистки сигнала cout
cout=DFFE(.d=cout_pre,.clk=!
--набор д-триггеров для того чтобы по сигналу cout «отрезать» посылку
DATA_RAM[]=lpm_ff(.data[]=
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,.
we_pre=DFFE(.d=vcc,.clk=we_
--задерживаем сигнал cout_main на пол такта
clock_counter=DFF(.d=cout_
--счетчик генерирующий адреса
address_pre[8..0]=lpm_counter(
WITH(LPM_WIDTH=9, LPM_MODULUS=512) RETURNS(.q[]);
%задаем количество адресов (от 0 до 511),
По переполнении счетчика адреса генерируются заного с нуля
%
cout_words=lpm_counter(.clock=
WITH(LPM_WIDTH=9, LPM_MODULUS=512) RETURNS(.cout);
--сдвигаем сигнал cout_words на пол такта
sel_pre=DFF(.d=cout_words,.
%д-триггер дающий на выходе постоянную еденицу
По приходу импульсa на clk. Эта еденица идет на демультиплексоры
%
sel=DFF(.d=vcc,.clk=sel_pre);
%демультиплексор (ручной работы) переключающий стробы записи
С первой ОЗУ на вторую по сигналу Sel
%
we[1..0]=dmux1to2(.in=we_pre,.
%демультиплексор (ручной работы) переключающий шину адреса
с первой ОЗУ на вторую по сигналу Sel
%
1ADDRESS[]=dbusmux1to2(.in[]=
2ADDRESS[]=dbusmux1to2(.in[]=
%задаем общее количество адресов для двух каналов
По переполнении счетчика генерируется сигнал на переключение режима
(с записи на чтение)
%
cout_mode=lpm_counter(.clock=
WITH(LPM_WIDTH=11, LPM_MODULUS=15) RETURNS(.cout);
--сдвигаем сигнал cout_mode на пол такта
RESET=DFF(.d=cout_mode,.clk=!
%д-триггер дающий на выходе постоянную еденицу.
Эта еденица отключает режим записи
%
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=
WITH(LPM_WIDTH=7)
RETURNS(.q[6..2]);
--мультиплексоры, выбирающие частоту
MUX_F1=lpm_mux(.data[][]=DEL_
WITH (LPM_WIDTH=1, LPM_SIZE=5, LPM_WIDTHS=3)
RETURNS (.result[]);
MUX_F2=lpm_mux(.data[][]=DEL_
WITH (LPM_WIDTH=1, LPM_SIZE=5, LPM_WIDTHS=3)
RETURNS (.result[]);
--счетчики, обнуляющие адреса ОЗУ
RESET1=lpm_counter(.clock=MUX_
WITH(LPM_WIDTH=9,LPM_MODULUS=
RESET2=lpm_counter(.clock=MUX_
WITH(LPM_WIDTH=9,LPM_MODULUS=
--счетчики генерирующие адреса ОЗУ
RAM_ADD1[]=lpm_counter(.clock=
WITH(LPM_WIDTH=9)
RETURNS(.q[]);
RAM_ADD2[]=lpm_counter(.clock=
WITH(LPM_WIDTH=9)
RETURNS(.q[]);
end;
Схема электрическая принципиальная системы обработки данных