Verilog语言入门---项目导向D5---2020/3/22

1.代码实现:有限状态机

一、设计一个“111”的序列检测器,当输入3个或3个以上“1”时,电路输出1,否则输出0
(1)状态转移图方法:在这里插入图片描述
代码实现:

//设计一个“111”的序列检测器,当输入3个或3个以上“1”时,电路输出1,否则输出0
module checker(z,x,clk);
parameter s0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11;
output z;
input clk,x;
reg [1:0]state,next_state;
reg z;
always@(posedge clk)
	case(state)
		s0:if (x)
				begin
					next_state<=s1;
					z=0;
				end
			else 
				begin
					next_state<=s0;
					z=0;
				end
		s1:if (x)
				begin
					next_state<=s2;
					z=0;
				end
			else 
				begin
					next_state<=s0;
					z=0;
				end
		s2:if (x)
				begin
					next_state<=s3;
					z=1;
				end
			else 
				begin
					next_state<=s0;
					z=0;
				end
		s3:if (x)
				begin
					next_state<=s3;
					z=1;
				end
			else 
				begin
					next_state<=s0;
					z=0;
				end
	endcase
always@(posedge clk)
	state<=next_state;
endmodule

仿真代码:

`timescale 1ns / 1ps//定义仿真模块的单位时间和精度
//一般将待测试模块的输入设置为reg,输出设置为wire即可
module checker_111_tb();

reg clk;
reg x;
wire z;

//待测试模块例化 ,第一个名称为待测试模块名称,第二个名称符合命名规范随意设置一个名称即可    
//输入输出设置按如下形式设置,testbench中名称最好沿用待测试文件中名称,方便编写
checker checker_111_1(
.z(z),
.clk(clk),
.x(x)
);

//起始语句,只执行一次
//#10表示样式十个单位时间(本文一个单位时间设置为1ns)
initial 
begin
    clk<=0;
    x<=0;
    #10;
    #10	x = 1; 
    #10 x = 1;
    #10 x = 0;
    #10 x = 0;    
    #10 x = 1;
    #10 x = 1;
    #10 x = 1;
    #10 x = 1;
    #10 x = 0;
    #10 x = 0;
    #10 x = 0;     
end

//设置时钟
always #5 clk<=~clk;
endmodule

第五章 仿真验证与Testbench编写

一、验证阶段:
1.功能验证
2.综合后验证
3.时序验证
4.板级验证

二、Testbench示例:
//design RTL的module名叫TTF

module Tflipflop_tb;		//数据类型声明
reg clk,rst_n,T;			//一般输入用reg
wire data_out;				//一般输出用wire
TFF U1(						//被测模块实例化
.data_out(data_out),
.T(T),
.clk(clk),
.rst(rst)
);
//产生测试激励
always #5 clk<=~clk;

initial 
begin
	clk = 0;
	#3 rst_n = 0;
	#5 rst_n = 1;
	T = 1;
	#30 T=0;
	#20 T=1;
end

initial
begin 
	$monitor($time,"T=%b,clk=%b,data_out=%b",T,clk,rst_n,data_out);
end
endmodule

三、打印文本输出
在这里插入图片描述
四、关键字
$ display打印后自动换行,$write输出特定信号后不换行
$ monitor, 当参数列表中的变量或表达式变化时,输出
$ strobe:所有时间处理完后,以10进制格式输出格式化文本
$ strobeb:所有时间处理完后,以2进制格式输出格式化文本
$ strobeo:所有时间处理完后,以8进制格式输出格式化文本
$ strobeh:所有时间处理完后,以16进制格式输出格式化文本
$ finish:结束并跳出程序
$ stop:停止但不跳出程序
$time:得到系统时间
$realtime:得到实数型的时间

例子:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(4)延迟:
串行延时begin end(相对时间)和并行延时fork join(绝对时间)
阻塞赋值(相对时间)和非阻塞赋值(绝对时间)

发布了19 篇原创文章 · 获赞 0 · 访问量 295

猜你喜欢

转载自blog.csdn.net/m0_46493315/article/details/105032990