写在前面
承接本系列上文。整理一些简单的根据时序图编写Verilog代码的实例,帮助新手学习,老手巩固。每次更新两题,根据难度会挑选一些进行讲解。
本次两个题目相似,注意计时器的计数停止位数即可
题目 03
题目 03答案
always @
(posedge clk or negedge rst_n
)begin
if(!rst_n
)begin
cnt
<= 0;
end
else if(add_cnt
)begin
if(end_cnt
)
cnt
<= 0;
else
cnt
<= cnt
+ 1;
end
end
assign add_cnt
= flag
== 1;
assign end_cnt
= add_cnt
&& cnt
== 5-1;
assign high_flag
= add_cnt
&& cnt
== 4-1;
always @
(posedge clk or negedge rst_n
)begin
if(rst_n
== 1'b0
)begin
flag
<= 0;
end
else if(en
==1)begin
flag
<= 1;
end
else if(end_cnt
==1)begin
flag
<= 0;
end
end
always @
(posedge clk or negedge rst_n
)begin
if(rst_n
== 1'b0
)begin
dout
<= 0;
end
else if(high_flag
==1)begin
dout
<= 1;
end
else if(end_cnt
==1)begin
dout
<= 0;
end
end
题目 04
题目 04答案
always @
(posedge clk or negedge rst_n
)begin
if(!rst_n
)begin
cnt
<= 0;
end
else if(add_cnt
)begin
if(end_cnt
)
cnt
<= 0;
else
cnt
<= cnt
+ 1;
end
end
assign add_cnt
= flag
== 1;
assign end_cnt
= add_cnt
&& cnt
== 6-1;
assign high_flag
= add_cnt
&& cnt
== 3-1;
always @
(posedge clk or negedge rst_n
)begin
if(rst_n
== 1'b0
)begin
flag
<= 0;
end
else if(en
==1)begin
flag
<= 1;
end
else if(end_cnt
==1)begin
flag
<= 0;
end
end
always @
(posedge clk or negedge rst_n
)begin
if(rst_n
== 1'b0
)begin
dout
<= 0;
end
else if(high_flag
==1)begin
dout
<= 1;
end
else if(end_cnt
==1)begin
dout
<= 0;
end
end