写在前面
承接本系列上文。整理一些简单的根据时序图编写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
仿真截图
验证波形一致。