Verilog小练习- 看时序写代码(07--08)

写在前面

承接本系列上文。整理一些简单的根据时序图编写Verilog代码的实例,帮助新手学习,老手巩固。每次更新两题,根据难度会挑选一些进行讲解。

题目07

Verilog小练习- 看时序写代码(07--08)_第1张图片

题目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,只需要改变实例化名字
Verilog小练习- 看时序写代码(07--08)_第2张图片

题目08

Verilog小练习- 看时序写代码(07--08)_第3张图片

题目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

Verilog小练习- 看时序写代码(07--08)_第4张图片
另外一种解法
Verilog小练习- 看时序写代码(07--08)_第5张图片

你可能感兴趣的:(#,Verilog知识专题)