verilog入门学习---D7---2020/3/24

一、跑马灯
功能描述:
设计一个4状态的走马灯(状态切换由开关SW0,SW1控制LED灯L0-L15):
S0(SW1、SW0=00B):点亮一盏LED灯由右往左逐个点亮,如此循环
S1(SW1、SW0=01B):点亮一盏LED灯由左往右逐个点亮,如此循环
S2(SW1、SW0=10B):点亮一盏LED灯由右往左隔1个点亮,如此循环
S3(SW1、SW0=11B):点亮一盏LED灯由左往右隔1个点亮,如此循环
代码实现:

module zoumadeng(
input clk,
input [1:0]sel,
output reg q0,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15
 );
 
reg [23:0]div; //分频
always@(posedge clk)
begin
div<=div+1;
end

initial begin		//初值
    {q0,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15}<=16'b0000000000000001;
end

always@(posedge div[23])
if(sel==2'b00)	//状态0
begin
q15 <=q14;
q14 <= q13;
q13 <= q12;
q12 <= q11;
q11 <= q10;
q10 <= q9;
q9 <= q8;
q8 <= q7;
q7 <= q6;
q6 <= q5;
q5 <= q4;
q4 <= q3;
q3 <= q2;
q2 <= q1;
q1 <= q0;
q0 <= q15;
end
else
if(sel==2'b01)	//状态1
begin
q15 <=q0;
q14 <= q15;
q13 <= q14;
q12 <= q13;
q11 <= q12;
q10 <= q11;
q9 <= q10;
q8 <= q9;
q7 <= q8;
q6 <= q7;
q5 <= q6;
q4 <= q5;
q3 <= q4;
q2 <= q3;
q1 <= q2;
q0 <= q1;
end
else
if(sel==2'b10)	//状态2
begin
q15 <=q13;
q14 <= q12;
q13 <= q11;
q12 <= q10;
q11 <= q9;
q10 <= q8;
q9 <= q7;
q8 <= q6;
q7 <= q5;
q6 <= q4;
q5 <= q3;
q4 <= q2;
q3 <= q1;
q2 <= q0;
q1 <= q15;
q0 <= q14;
end
else			//状态3
begin
q15 <=q1;
q14 <= q0;
q13 <= q15;
q12 <= q14;
q11 <= q13;
q10 <= q12;
q9 <= q11;
q8 <= q10;
q7 <= q9;
q6 <= q8;
q5 <= q7;
q4 <= q6;
q3 <= q5;
q2 <= q4;
q1 <= q3;
q0 <= q2;
end
endmodule

仿真程序:

module zoumadeng_tb;
reg clk;
reg [1:0]sel;
wire q0,q1,q2,q3,q4,q5,q6,q7,q8,q9,q10,q11,q12,q13,q14,q15;
zoumadeng uut(
.clk(clk),
.sel(sel),
.q0(q0),
.q1(q1),
.q2(q2),
.q3(q3),
.q4(q4),
.q5(q5),
.q6(q6),
.q7(q7),
.q8(q8),
.q9(q9),
.q10(q10),
.q11(q11),
.q12(q12),
.q13(q13),
.q14(q14),
.q15(q15));
//初始化
initial begin
clk=0;
#100;
sel<=2'b00;
#200;
end

parameter period = 10;
always begin
#(period/2)clk<=~clk;
end

always begin
sel<=2'b00;
#200;
sel<=2'b01;
#200;
sel<=2'b10;
#200;
sel<=2'b11;
#200;
end
endmodule

仿真结果:
在这里插入图片描述

延迟:(上升延时,下降延时,关断延时)
(最小延时:典型延时:最大延时)
在这里插入图片描述
延时例子:
原理图:
在这里插入图片描述
代码实现:利用specify

module M(out,a,b,c,d);
	input a,b,c,d;
	output out;
	wire e,f;
	assign out =(a&b)|(c&d));
	specify
		(a=>out)=9;
		(b=>out)=9;
		(c=>out)=11;
		(d=>out)=11;
	endspecify
endmodule

全连接方式:< 源域(如a,b) *> 目标域(如out) >

module M(out,a,b,c,d);
	input a,b,c,d;
	output out;
	wire e,f;
	assign out =(a&b)|(c&d));
	specify
		(a,b*>out)=9;
		(c,d*>out)=11;
	endspecify
endmodule

在specify中用specparam定义参数

module M(out,a,b,c,d);
	input a,b,c,d;
	output out;
	wire e,f;
	assign out =(a&b)|(c&d));
	specify
	specparam delay1=9;
	specparam delay2=11;
		(a,b*>out)=delay1;
		(c,d*>out)=delay2;
	endspecify
endmodule

宏定义:`define A 9

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

猜你喜欢

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