Verilog小練習- 看時序寫代碼(05--06)

寫在前面

承接本系列上文。整理一些簡單的根據時序圖編寫Verilog代碼的實例,幫助新手學習,老手鞏固。每次更新兩題,根據難度會挑選一些進行講解。

題目05

在這裏插入圖片描述

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

每次觸發後都是第一個波形,三個高電平
在這裏插入圖片描述

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

仿真截圖

驗證波形一致。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章