一、跑马灯
功能描述:
设计一个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