Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм»




НазваниеМетодические указания к выполнению курсовых работ по курсу «Схемотехника эвм»
страница3/7
Дата конвертации26.10.2012
Размер1.1 Mb.
ТипМетодические указания
1   2   3   4   5   6   7
VERILOG

Verilog, Verilog HDL (англ. Verilog Hardware Description Language) — это язык описания аппаратуры, используемый для описания и моделирования электронных систем. Verilog HDL, не следует путать с VHDL (конкурирующий язык), наиболее часто используется в проектирование, верификации и реализации (например, в виде СБИС) аналоговых, цифровых и смешанных электронных систем на различных уровнях абстракции.

Синтаксис Verilog очень похож на синтаксис языка C. Verilog имеет препроцессор, очень похожий на препроцессор языка C, и основные управляющие конструкции «if», «while» также подобны одноимённым конструкциям языка C. Соглашения по форматированию вывода также очень похожи.

Verilog поддерживает следующие «стандартные» типы данных: целое — integer (32-битовое со знаком) и real — число с плавающей точкой.

Для моделирования также используются time (время), специфический тип, применяемый встроенными функциями для моделирования времени, обычно 64-битовое целое; event (событие) — в языке существует ряд операторов и конструкций для работы с событиями.

Создавать свои типы данных - нельзя. При разработке синтезируемых моделей из перечисленных типов используется только integer.

Сигналы бывают двух основных типов: «цепи» и «регистры». Самые распространенные из них описываются ключевыми словами wire и reg соответственно. Однако следует помнить, что средство синтеза не всегда реализует reg в виде триггера. Отличие wire от reg состоит в том, что reg способен сохранять присвоенное значение (работает как переменная в языках программирования), а к wire требуется прилагать непрерывное воздействие (driver). То есть wire моделирует провод, который переходит в неопределенное состояние при отключении драйвера.

Идентификаторы в Verilog являются чувствительными к регистру написания и подчиняются обычным правилам: не могут начинаться с цифры или знака $ и могут содержать буквы, цифры, «$», «_». Существуют так называемые escaped-идентификаторы (в основном в структурных моделях, полученных после синтеза), которые начинаются с «\», содержат любые символы и заканчиваются пробелом или переводом строки.

Для описания шин или регистров неединичной ширины используются диапазоны (range) вида [n:m], где m и n — целые числа или параметры. В языке допускается как m>n, так и наоборот. Но это имеет значение в операциях, для которых важен порядок битов (например, сложение или присвоение целого). Поэтому принято располагать индексы в убывающем порядке.

Массивы в Verilog не поддерживаются, но существуют «памяти», собственно одномерный массив или модель памяти.

Всего существуют четыре типа значений, которые могут принимать сигналы «цепь» и «регистр»: 0, 1, z, x. Первые три соответствуют логическим уровням и состоянию с высоким импедансом. Четвертый (х) означает неопределенное состояние и используется при моделировании неинициализированных сигналов, конфликтов (два выхода с противоположными состояниями соединены вместе), метастабильных состояний триггеров (при нарушении временных соотношений между входами данных и тактовым входом), иными словами, во всех случаях, когда симулятор не может определить значение данного сигнала.

Для записи многоразрядных сигналов (констант) используются следующие конструкции: 1'bz — одноразрядный высокоимпедансный сигнал, 10'd1_000 — десятиразрядное число 1000, записанное в десятичной системе (символ «_» игнорируется), 4'bx01z — четырехразрядный сигнал с неопределенным старшим битом, высокоимпедансным младшим и вторым и третьим, равными 1 и 0 соответственно. То есть запись многоразрядного сигнала представляет собой разрядность, одинарную кавычку «'» (не путать с апострофом «`», использующимся в директивах), основание системы счисления (b, o, d, h) и цифры, использующиеся в данной системе счисления. В двоичной системе допустимо использование символов z и x. Символ подчеркивания служит для облегчения записи и игнорируется. Использование констант без указания разрядности не желательно, так как по умолчанию константа воспринимается с длиной 32 бита. Данные типа integer также могут присваиваться регистрам.

На рисунке 6 приведена функциональная схема устройства для работы с ЖКИ на языке Verilog, после чего для примера приведен листинг программы на данном языке.





Рис. 6. Функциональная схема устройства для работы с ЖКИ на языке Verilog

module lcd_main_verilog (

input CLK, //входной тактовый сигнал с частотой 40 МГц, и периодом 25 нс

input SBUSY, //сигнал о занятости подчиненного устройства

output reg [319:0] STR = 0, //строка для вывода значений пересылаемого символа, для записи во внутренний регистр хранения

output reg REFRESH = 0, //обновление строки в LCD DRAM

output reg [7:0] INSTR = 0, //инструкция LCD контроллеру

output reg [27:0] DELAY = 0,//задержка между инструкциями

output reg ONE_CYCLE = 0, //(1) 4-битная или (0) 8-битная команда (данные)

output reg WRITE_COMMAND = 0,//запуск процесса загрузки команды в LCD

output [3:0] INIT_STATE, //номер состояния инициализируещего автомата

output [3:0] EXEC_STATE,// номер состояния рабочего автомата

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

);


parameter str_high = " 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 "; //константа верхней строки

parameter str_low = {" PE",8'hA3,8'hA5,"M"," "," PE",8'hA3,8'hA5,"M"," "," PE",8'hA3,8'hA5,"M"," "}; //константа нижней строки


reg lcd_state = 0;//регистр для хранения состояний автомата переключающего устройство между режимами (инициализация - рабочий)

reg [3:0] init_state = 0;//регистр для хранения состояния автомата инициализация

reg [3:0] exec_state = 0;// регистр для хранения состояния, выполняющего освновные функции, устройства


assign INIT_STATE = ~init_state;

assign EXEC_STATE = ~exec_state;

assign LCD_STATE = ~lcd_state;


always @(posedge CLK)

begin

case (lcd_state)

0: // Инициализация дисплея

case (init_state)

0: begin

if (~SBUSY) begin

INSTR = 8'b0011_XXXX;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b1;

init_state <= 1;

end

end

1: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

init_state <= 2;

end

else WRITE_COMMAND = 1;

end

2: begin

if (~SBUSY) begin

INSTR = 8'b0011_XXXX;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b1;

init_state <= 3;

end

end

3: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

init_state <= 4;

end

else WRITE_COMMAND = 1;

end

4: begin

if (~SBUSY) begin

INSTR = 8'b0011_XXXX;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b1;

init_state <= 5;

end

end

5: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

init_state <= 6;

end

else WRITE_COMMAND = 1;

end

// Переключение в 4-битный режим

6: begin

if (~SBUSY) begin

INSTR = 8'b0010_XXXX;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b1;

init_state <= 7;

end

end

7: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

init_state <= 8;

end

else WRITE_COMMAND = 1;

end

// Определение количеств строк(2) и шрифта дисплея(5х8 точек)

8: begin

if (~SBUSY) begin

INSTR = 8'b0010_1000;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b0;

init_state <= 9;

end

end

9: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

init_state <= 10;

end

else WRITE_COMMAND = 1;

end

// Включение дисплея, выключение курсора и его мигание

10: begin

if (~SBUSY) begin

INSTR = 8'b0000_1100;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b0;

init_state <= 11;

end

end

11: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

init_state <= 12;

end

else WRITE_COMMAND = 1;

end

// Очищение дисплей

12: begin

if (~SBUSY) begin

INSTR = 8'b0000_0001;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b0;

init_state <= 13;

end

end

13: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

init_state <= 14;

end

else WRITE_COMMAND = 1;

end

// Выбор режима сдвига курсора вправо при записи/чтении из DDRAM

14: begin

if (~SBUSY) begin

INSTR = 8'b0000_0110;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b0;

init_state <= 15;

end

end

15: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

lcd_state <= 1;

end

else WRITE_COMMAND = 1;

end

default: init_state <= 0;

endcase

1: //Выполнение основных функций устройства

case (exec_state)

// Смещение указателя памяти DDRAM на верхнюю строку

0: begin

if (SBUSY) begin

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b0;

exec_state <= 1;

end

end

1: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

exec_state <= 2;

end

else WRITE_COMMAND = 1;

end

// Пересылка верхней строки через блок lcd_DRAM в память LCD контроллера

2: begin

if (~SBUSY) begin

INSTR[7:0] = 8'h00;

STR = str_high;

REFRESH = 1;

exec_state <= 3;

end

end

3: begin

if (SBUSY) begin

STR = str_high;

REFRESH = 0;

exec_state <= 4;

end

else REFRESH = 1;

end

// Смещение указателя памяти DDRAM на нижнюю строку

4: begin

if (~SBUSY) begin

INSTR = 8'b1100_0000;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b0;

exec_state <= 5;

end

end

5: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

exec_state <= 6;

end

else WRITE_COMMAND = 1;

end

// Пересылка нижней строки через блок lcd_DRAM в память LCD контроллера

6: begin

if (~SBUSY) begin

INSTR[7:0] = 8'h00;

STR =str_low;

REFRESH = 0;

exec_state <= 7;

end

end

7: begin

if (SBUSY) begin

STR = str_low;

REFRESH = 0;

exec_state <= 8;

end

else REFRESH = 1;

end

// Постоянное смещение окна вправо

8: begin

if (~SBUSY) begin

INSTR = 8'b0001_1000;

DELAY = 28'h2625A00;

ONE_CYCLE = 1'b0;

exec_state <= 9;

end

end

9: begin

if (SBUSY) begin

WRITE_COMMAND = 0;

exec_state <= 10;

end

else WRITE_COMMAND = 1;

end

10: begin

if (~SBUSY) begin

exec_state <= 9;

end

end

default: exec_state <= 0;

endcase

default: lcd_state <= 0;

endcase

end

endmodule


module lcd_DRAM_verilog (

input [319:0] STR, //строка для вывода значений пересылаемого символа, для записи во внутренний регистр хранения

input REFRESH, //обновление строки в LCD DRAM

input SBUSY, //сигнал о занятости подчиненного устройства

input CLK, //входной тактовый сигнал с частотой 40МГц и периодом 25нс

output reg START_ACTION = 0,//сигнал запуска lcd_loader

output reg [7:0] DATA = 0, //инструкция LCD контроллеру

output reg BUSY = 0, //сигнал о занятости текущего устройства (0 - свободен, 1-занят)

output reg REG_SELECT = 0, //флаг выбора регистра - переключает между записью команд и записью данных в память (0-чтение, 1-запись)

output reg ONE_CYCLE = 0 //(1) 4-битная или (0) 8-битная команда (данные)

);


//Автомат записи строк в память контроллера LCD

reg [319:0] str_temp = 0;//строка для временного хранения символов


reg [3:0] echo_state = 0;//временная строка для выполнения сдвигов при отправке данных по 8 бит

reg [1:0] load_state = 0;//переменная состояния автомата отправки данных

reg [6:0] char_cnt = 0;//переменная состояния автомата выбора и загрузки исходной строки

reg [20:0] echo_delay = 0;//счетчик колличества символов


always @(posedge CLK)

begin

case (echo_state)

0: begin

REG_SELECT = 0;

char_cnt = 0;

echo_delay = 0;

START_ACTION = 0;

DATA[7:0] = 8'h00;

if (REFRESH) echo_state <= 1;

end

1: begin

BUSY = 1;

REG_SELECT = 1;

str_temp = STR;

ONE_CYCLE = 0;

echo_state <= 2;

end

//Начало рабочего цикла

2: begin

DATA[7:0] = str_temp[319:312];

echo_delay = 0;

echo_state <= 3;

end

3: begin

if (~SBUSY) begin

START_ACTION = 1;

end

else begin

str_temp = {str_temp[311:0], str_temp[319:312]};

START_ACTION = 0;

echo_state <= 4;

end

end

4: begin

if (~SBUSY) begin

echo_delay = echo_delay + 1'b1;

if (echo_delay == 21'h1FFFFF) begin

if (char_cnt == 39) begin

BUSY = 0;

echo_state <= 0;

end

else begin

char_cnt = char_cnt + 1'b1;

echo_state <= 2;

end

end

end

end

default: echo_state <= 0;

endcase


end

endmodule


module lcd_command_verilog (

input CLK, //входной тактовый сигнал с частотой 40 МГц и периодом 25нс

input SBUSY, //сигнал о занятости подчиненного устройства (0 - свободен, 1 - занят)

input WRITE_COMMAND, //запуск процесса загрузки команды в LCD

input [27:0] DELAY, //задержка между инструкциями

output reg START_ACTION = 0,//сигнал запуска lcd_loader

output reg BUSY = 0, //сигнал о занятости текущего устройства (0 - свободен, 1-занят)

output reg REG_SELECT = 0 // флаг выбор регистра - переключает между записью команд и записью данных в память (0-чтение, 1-запись)

);


reg [2:0] command_state; //регистр для хранения команд

reg [27:0] delay_command; //регистр для хранения передачи команд


//Автомат задержки при отправке команд контроллеру LCD

always @(posedge CLK)

begin

case (command_state)

0: begin

BUSY = 0;

START_ACTION = 0;

delay_command = 0;

if (WRITE_COMMAND) command_state <= 1;

end

1: begin

BUSY = 1;

REG_SELECT = 0;

command_state <= 2;

end

2: begin

if (~SBUSY) begin

START_ACTION = 1;

end

else begin

START_ACTION = 0;

command_state <= 3;

end

end

3: begin

if (~SBUSY) begin

delay_command = delay_command + 1'b1;

if (delay_command == DELAY) command_state <= 0;

end

end

default: command_state <= 0;

endcase

end

endmodule


module lcd_loader_verilog (

input CLK, //входной тактовый сигнал с частотой 40МГц и периодом 25нс

input REG_SELECT, //флаг выбор регистра - переключает между записью команд и записью данных в память (0-чтение, 1-запись)

input START_ACTION, //сигнал запуска lcd_loader

input ONE_CYCLE, //(1) 4-битная или (0) 8-битная команда (данные)

input [7:0] INSTR_DATA, //инструкция/команда LCD контроллеру от вышестоящих устройств

inout reg [3:0] DATA_OUT, //4-х битный двунаправленный канал связи с контроллером LCD

output reg BUSY = 0, //запуск процесса загрузки команды в LCD

output reg RW = 0, //флаг чтения/записи из двунаправленного канала связи с контроллером LCD

output reg RS = 0, //флаг выбор регистра - переключает между записью команд и записью данных в память

output reg E = 0 //старт бит при пересылки команд и данных в контроллер

);


//блок lcd_loader

reg first_cycle; //флаг первого цикла - если 1, то идёт загрузка первой части команды (данных)

reg [5:0] epw = 6'h00; //задержка, организующая нужную длительность сигнала Е

reg [2:0] proc_state = 3'h0; //автомат - реализует логику работы блока

reg [5:0] delay_proc = 6'h00; //задержка, организующая ожидания установки данных на выходных контактах (RS, RW)

always @(posedge CLK) begin

case (proc_state)

0: begin

BUSY = 0;

RW = 1'b0;

epw = 6'h00;

RS = 0;

E = 0;

DATA_OUT = 4'bZZZZ;

delay_proc = 6'h00;

if (START_ACTION) proc_state <= 1;

end

1: begin

BUSY = 1;

first_cycle = 1;

RS = REG_SELECT;

proc_state <= 2;

end

2: begin

delay_proc = delay_proc + 1'b1;

if (delay_proc == 60) begin //задержка, организующая ожидания установки данных на выходных контактах (RS, RW)

proc_state <= 3;

end

end

3: begin

E = 1;

DATA_OUT[3:0] = (first_cycle) ? INSTR_DATA[7:4] : INSTR_DATA[3:0];

proc_state <= 4;

end

4: begin

//на данном этапе, выдерживается длительность высокого уровня сигнала Е = min 230 ns

epw = epw + 1'b1;

if (epw == 25) begin

epw = 0;

E = 0;

proc_state <= 5;

end

end

5: begin

//здесь, выдерживаем длительность низкого уровня сигнала Е = min 230 ns

epw = epw + 1'b1;

if (epw == 25) begin

epw = 0;

if ((ONE_CYCLE) || (~ONE_CYCLE && ~first_cycle)) proc_state <= 0;

else if (~ONE_CYCLE && first_cycle) begin

first_cycle = 0; //первая половина команды/данных отправлена

proc_state <= 3;

end

end

end

default: proc_state <= 0;

endcase

end

endmodule

1   2   3   4   5   6   7

Похожие:

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ
Методические указания по выполнению курсовых работ рассмотрены и утверждены на заседании кафедры «Экономика на предприятиях туризма...

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ
Методические указания по выполнению курсовых работ рассмотрены и утверждены на заседании кафедры «Маркетинг на предприятиях туризма...

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ
Методические указания по выполнению курсовых работ рассмотрены и утверждены на заседании кафедры «Экономика на предприятиях туризма...

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ
Методические указания по выполнению курсовых работ рассмотрены и утверждены на заседании кафедры «Экономика на предприятиях туризма...

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ
Абдуллина И. А., Глобов К. С. Методические указания по выполнению курсовых работ. – Казань: Познание 2009–26 с

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ
Методические указания по выполнению курсовых работ рассмотрены и утверждены на заседании кафедры психологии

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ
Методические указания по выполнению курсовых работ рассмотрены и утверждены на заседании кафедры «Менеджмент»

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ
Методические указания по выполнению курсовых работ рассмотрены и утверждены на заседании кафедры «Менеджмент»

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ 1,75
Организация производства и менеджмент в машиностроении: методические указания по выполнению курсовых работ

Методические указания к выполнению курсовых работ по курсу «Схемотехника эвм» iconМетодические указания по выполнению курсовых работ Красноярск 2004 ^ I. Цель и задачи курсовой работы
Криминалистика. Методика расследования отдельных видов преступлений: Методические указания по выполнению курсовых работ / Сост. И....


Разместите кнопку на своём сайте:
lib.convdocs.org


База данных защищена авторским правом ©lib.convdocs.org 2012
обратиться к администрации
lib.convdocs.org
Главная страница