- •Содержание
- •1. Общая постановка задачи и техническое задание
- •1.1 Общая постановка задачи
- •1.2 Техническое задание на разработку
- •2. Разработка схемы цифрового узла и моделирование его работы в среде Quartus
- •3. Разработка цифрового узла на языкеVerilogHdl и моделирование его работы в среде Quartus
- •4. Обоснование выбора варианта реализации цифрового узла для программирования pld
- •5. Описание распределения портов цифрового узла по выводам микросхемы pld на макетной плате
- •Заключение
- •Список используемой литературы
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 Полученная схема