Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Савенко.doc
Скачиваний:
57
Добавлен:
02.04.2015
Размер:
378.37 Кб
Скачать

3. Разработка цифрового узла на языкеVerilogHdl и моделирование его работы в среде Quartus

Текст описания модуля на языке VerilogHDL:

module adimVer(input clk, izm_f, reset,

output reg [6:0]segments1,

output reg [6:0]segments10);

//счетчик периода счета частоты

reg[7:0]counter_p;

always @(posedge clk or posedge reset)

begin

if (reset)

counter_p <= 4'd0;

else if (counter_p != 100)

counter_p <= counter_p + 1'd1;

end

//счетчик едениц

wire cout;

reg [3:0]counter1;

always @(posedge izm_f or posedge reset)

begin

if(reset)

counter1 <= 4'd0;

else if(counter1==4'd9)

counter1 <= 4'd0;

else if (counter_p != 100)

counter1 <= counter1 + 1'd1;

end

assign cout = (counter1==4'd9);

//счетчик десятков

reg [3:0]counter10;

always @(posedge izm_f or posedge reset)

begin

if(reset)

counter10 <= 4'd0;

else if(counter10==4'd9)

counter10 <= 4'd0;

else if(cout)

counter10 <= counter10 + 1'd1;

end

//вывод на 7 сегментный индикатор единиц

always @*

begin

case(counter1)

4'd0: segments1 = 7'b0111111;

4'd1: segments1 = 7'b0000110;

4'd2: segments1 = 7'b1011011;

4'd3: segments1 = 7'b1001111;

4'd4: segments1 = 7'b1100110;

4'd5: segments1 = 7'b1101101;

4'd6: segments1 = 7'b1111101;

4'd7: segments1 = 7'b0000111;

4'd8: segments1 = 7'b1111111;

4'd9: segments1 = 7'b1101111;

default:

segments1 = 7'b1000000;

endcase

end

//вывод на 7 сегментный индикатор десятков

always @*

begin

case(counter10)

4'd0: segments10 = 7'b0111111;

4'd1: segments10 = 7'b0000110;

4'd2: segments10 = 7'b1011011;

4'd3: segments10 = 7'b1001111;

4'd4: segments10 = 7'b1100110;

4'd5: segments10 = 7'b1101101;

4'd6: segments10 = 7'b1111101;

4'd7: segments10 = 7'b0000111;

4'd8: segments10 = 7'b1111111;

4'd9: segments10 = 7'b1101111;

default:

segments10 = 7'b1000000;

endcase

end

endmodule

Результат симуляции показан на рисунке 3.1.

Рисунок 3.1- Временная диаграмма симуляции работы модуля

Входы: CLK – тактовый сигнал, ,

RESET – сброс счетчиков.

Выход: segments1[6..0]– выход единиц.

Segments2[6..0]– выход десятков.

4. Обоснование выбора варианта реализации цифрового узла для программирования pld

В данной работе для программирования PDLбыл выбран вариант реализации цифрового узла на языкеVerilogHDL.

На начальном этапе изучения среды Quartusреализация цифрового узла на языке VERILOG HDL оказалось более понятным и наглядным, так как ранее, были изучены языки программирования.

В Quartusразработан графический редактор, позволяющий определять правильность написания кода, что делает работу на языке VERILOG HDL более понятным

5. Описание распределения портов цифрового узла по выводам микросхемы pld на макетной плате

Для назначения и визуального контроля контактов и используется планировщик контактов (Pinplanner). Pin Planer - утилита, позволяющая назначать сигналы на физические выводы микросхемы. Их можно назначить как жестко привязанные, так и перебрасываемые по определенным правилам (в пределах банка) для улучшения результатов трассировки.

1) Назначим портам разработанного проекта фактические выводы PLD(рисунок 5.1).

Рисунок 5.1 Планировщик контактов

Рисунок 5.2 Планировщик контактов

Схема цифрового узла с внесенными изменениями для прошивки (рисунок 5.3).

Рисунок 5.3 – Схема узла

2) Завершив назначение контактов и скомпилировав проект, переходим в окно программатора и программируем PLDна макетной плате (рисунок 5.4).

Рисунок 5.4 – Окно программатора

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

module lab4

(

input clear,

input in_t1,

input syncro,

output Q1,

output Q2,

output d_y,

output d_r,

output d_g,

output d_b

);

reg [1:0] regim;//pult

reg [1:0] tick;

assign Q1 = !regim[0];

assign Q2 = !regim[1];

//deshifrator

wire regim1;

wire regim2;

wire regim3;

wire regim4;

assign regim1 = !regim[0] && !regim[1];

assign regim2 = regim[0] & ~regim[1];

assign regim3 = ~regim[0] & regim[1];

assign regim4 = regim[0] & regim[1];

//----

//diods

wire out1;//y

wire out2;//r

wire out3;//g

wire out4;//b

// ^ -- pobiotovii xor

assign out1 =! ((1 && regim1) || (syncro && regim2) || (syncro && regim3) || (!tick[1] && regim4));

assign out2 = !((1 && regim1) || (syncro && regim2) || (!syncro && regim3) || ((tick[1] ^ tick[0]) && regim4));

assign out3 = !((1 && regim1) || (syncro && regim2) || (syncro && regim3) || (tick[1] && regim4));

assign out4 = !((1 && regim1) || (syncro && regim2) || (!syncro && regim3) || ( (~(tick[1] ^ tick[0]))&& regim4));

assign d_y =out1;

assign d_r=out2;

assign d_g=out3;

assign d_b =out4;

//----

//T-triggers / counters

always @(posedge clear or posedge in_t1) begin

if (clear)

begin

regim = 0;

end

else if (in_t1)

begin

/*1-ii aeoiia aaie?iia ?enei (?ac?yaiinou+'\''+oi?ia_i?aanoaaeaiey+cia?aiea)*/

regim=regim+1;

end

end

always @(posedge clear or posedge syncro) begin

if (clear)

begin

tick=0;

end

else if (syncro)

tick=tick+1;

end

endmodule

Взглянем на итоговую схему, полученную в работе. Для этого в Quartus II жмем Tools => Netlist Viewers => RTL Viewer.(Рис.6.1).

Рис. 6.1 Полученная схема