写在前面
承接本系列上文。整理一些简单的根据时序图编写Verilog代码的实例,帮助新手学习,老手巩固。每次更新两题,根据难度会挑选一些进行讲解。
题目07
题目07答案
类似06的思路
module test07 (
input clk, // Clock
input en1, // Clock Enable
input rst_n, // Asynchronous reset active low
output reg dout
);
wire add_cnt;
wire end_cnt;
reg flag;
reg [3:0] cnt ;
assign add_cnt = flag ==1;
assign end_cnt = add_cnt && cnt== 9-1;
wire high_flag = add_cnt && (cnt== 3-1||cnt== 6-1||cnt== 9-1);
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
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
flag <=0;
end
else if(en1==1)begin
flag <=1;
end
else if(end_cnt==1)begin
flag <=0;
end
else begin
flag <=flag;
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
else begin
dout<= 0;
end
end
endmodule
测试激励和do文件同06,只需要改变实例化名字
题目08
题目08答案
这里只不过是把高低电位的flag给改变了,原理置位为高时候这时候置位为0,简单更改逻辑即可。测试同题。
module test08 (
input clk, // Clock
input en1, // Clock Enable
input rst_n, // Asynchronous reset active low
output reg dout
);
wire add_cnt;
wire end_cnt;
reg flag;
reg [3:0] cnt ;
assign add_cnt = flag ==1;
assign end_cnt = add_cnt && cnt== 14-1;
wire low_flag = add_cnt && (cnt== 1-1||cnt== 3-1||cnt== 6-1||cnt== 10-1);
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
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
flag <=0;
end
else if(en1==1)begin
flag <=1;
end
else if(end_cnt==1)begin
flag <=0;
end
else begin
flag <=flag;
end
end
always @(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)begin
dout<= 0;
end
else if(low_flag==1)begin
dout<= 0;
end
else if(add_cnt==1)begin
dout<= 1;
end
else begin
dout<= 0;
end
end
endmodule
另外一种解法