
lr6
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
Федеральное государственное бюджетное образовательное
учреждение высшего образования
«Санкт-Петербургский государственный университет телекоммуникаций
им. проф. М. А. Бонч-Бруевича»
___________________________________________________________________________
Кафедра программной инженерии и вычислительной техники.
Дисциплина «Микропроцессорные устройства»
Лабораторная работа № 6
«Исследование счётчиков»
Выполнили: ст. гр.
Проверил: ст.пр. Неелова О.Л.
_____________________
Санкт-Петербург
2024
Программа 6.1
4-разрядный счётчик-делитель частоты
module biba_count_div_vi
# (parameter N=3,M=3'd4)
(input wire clk, reset,
output reg sync=0,
output wire [N-1:0]q);
reg [N-1:0] cnt=0;
wire [N-1:0] cnt_next;
assign q=cnt;
assign cnt_next=cnt + 1;
always@(posedge clk, negedge reset)
begin
if(!reset)
cnt<=0;
else
begin
cnt<=cnt_next;
sync<=sync;
if(cnt==M-1)
begin
cnt<=0;
sync<=~sync;
end
end
end
endmodule
Testbench:
`timescale 1ns/100ps
module biba_count_div_vi_tb;
logic clk, reset;
logic sync=0;
logic [2:0] q;
biba_count_div_vi test (.clk(clk), .reset(reset), .sync(sync), .q(q));
initial begin
reset=1'b0;
clk=1'b0;
#10;
reset=1'b1;
clk=1'b1;
#10;
clk=1'b0;
repeat(16) begin
#10 clk=~clk;
end
end
endmodule
Рис.1 Симуляция работы 4-разрядный счётчик-делитель частоты
Программа 5.2
4-разрядный реверсивный счётчик с возможностью асинхронного и синхронного сброса
module count
# (parameter N=4)
(input wire clk, reset, res, ena, rev, load,
input [N-1:0]d,
output wire [N-1:0]q);
reg [N-1:0] cnt;
reg [N-1:0] cnt_next;
assign q=cnt;
always @(posedge clk, negedge reset)
if(!reset)
cnt<=0;
else
cnt<=cnt_next;
always@*
if(res)
cnt_next=0;
else if(load)
cnt_next=d;
else if(ena&!rev)
cnt_next=cnt+1;
else if(ena&rev)
cnt_next=cnt-1;
else
cnt_next=cnt:
endmodule
Testbench:
`timescale 1ns/100ps
module biba_count_tb;
logic clk, reset, res, ena, rev, load;
logic [3:0] d;
logic [3:0] q;
biba_count test (.clk(clk), .reset(reset), .res(res), .ena(ena), .rev(rev), .load(load), .d(d), .q(q));
initial begin
clk=1'b0;
reset=1'b0;
#5;
clk=1'b1;
#5;
reset=1'b1;
clk=1'b0;
#5
clk=1'b1;
#5;
clk=1'b0;
repeat(16) begin
#5 clk=~clk;
end
end
initial begin
res=1'b0; ena=1'b0; rev=1'b0; load=1'b1; d=4'd5;
repeat(2)@(negedge clk);
load=1'b0; ena=1'b1;
repeat(6)@(negedge clk);
rev=1'b1;
repeat(2)@(negedge clk);
ena=1'b1;
rev=1'b1;
repeat(2)@(negedge clk);
rev=1'b1;
repeat(2)@(negedge clk);
$stop;
end
endmodule
Рис.2 Симуляция работы 4-разрядного реверсивного счётчика с возможностью асинхронного и синхронного сброса