Verilog小练习- 看时序写代码(05--06)

写在前面

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

题目05

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

题目05答案

这个题的思路挺像02和03(或者04)结合


wire add_cnt;
wire end_cnt;
reg [ :0] cnt ;
assign add_cnt = flag ==1;       
assign end_cnt = add_cnt && cnt== x-1; 
assign high_flag =  add_cnt && cnt== y-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||en2==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
end


always  @(*)begin
    if(rst_n==1'b0)begin
		x=0;
	end
	else if(en1==1)begin
		x=4;
	end
	else if(en2==1)begin
		x=2;
	end
	else begin
		x=x;
	end
end


always  @(*)begin
    if(rst_n==1'b0)begin
		y=0;
	end
	else if(en1==1)begin
		y=2;
	end
	else if(en2==1)begin
		y=1;
	end
	else begin
		y=y;
	end
end

题目06

每次触发后都是第一个波形,三个高电平
Verilog小练习- 看时序写代码(05--06)_第2张图片

题目06答案

佛系更新个可以验证的模块代码,使用的是modelsim。

module

module test06 (
	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== 6-1; 
wire high_flag =  add_cnt && (cnt== 2-1||cnt== 4-1||cnt== 6-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

测试激励

`timescale 1ns/1ps
module tb_my_logic;
	reg clk,en1,rst_n;
	wire dout;
	test06 u1(
	clk,    // Clock
	en1, // Clock Enable
	rst_n,  // Asynchronous reset active low
	dout
);
always #10 clk =!clk;
	initial begin
		clk = 1;
		rst_n=0;en1=0;
		#100;
		rst_n=1;
		#20 en1=1;
		#20 en1=0;
	end
endmodule

do文件

vlib work
vmap work
vlog  "test06.v"
vlog  "tb_my_logic.v"
vsim -voptargs=+acc -novopt work.tb_my_logic
add wave /tb_my_logic/*
run -all

仿真截图

验证波形一致。
Verilog小练习- 看时序写代码(05--06)_第3张图片

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