reg[23:0] data; wire[2:0] state; wire z,x;
assign x=data[23];
always #10 clk=~clk;
always@(posedge clk)
data={data[22:0],data[23]};
initial begin clk=0; rst=1; #2 rst=0; #30 rst=1;
data='b1001_1111_0111_1110; #500 $stop; end
seqdet m(x,z,clk,rst,state); endmodule
实验九 楼梯灯
实验目的
楼下到楼上依次有3个感应灯:灯1、灯2、灯3。当行人上下楼梯时,各个灯感应到后自动点亮,若在8s内感应信号消失,则点亮8s,若感应信号存在时间超过8s,则感应信号消失4s后灯自动关闭。
任务1:做出如上逻辑电路设计并仿真; 任务2:考虑去抖情况,对于感应信号到达存在毛刺(小于0.5s),设计合适逻辑并剔出。 任务3:若为节约能源,下一个灯点亮的同时将自动关闭上一个灯,做出如上逻辑设计并仿真(仅考虑一个人的情况)
实验仿真结果
实验代码
主程序
module light_All(clk10,rst,switch,light);
input clk10,rst; input[2:0]switch; output[2:0]light;
reg[2:0]state1,state2,state3; reg[7:0]count1,count2,count3; reg[2:0]count_1,count_2,count_3; reg[2:0]light;
parameter
state1_start=3'b000,state2_start=3'b000,state3_start=3'b000, state1_work=3'b001,state2_work=3'b001,state3_work=3'b001, state1_up=3'b010,state2_up=3'b010,state3_up=3'b010,
state1_down=3'b011,state2_down=3'b011,state3_down=3'b011, state1_other=3'b100,state2_other=3'b100,state3_other=3'b100;
always@(posedge clk10) if(!rst) begin
state1<=state1_start;
count1<=8'b0; count_1<=3'b0; end else
if(switch[0]=='b1&&count_1<4) count_1<=count_1+1; else
case(state1)
state1_start:
if(switch[0]=='b1) begin
state1<=state1_up; count1<=78; end else begin
state1<=state1_start; light[0]<='b0; end
state1_work: if(count1>0) begin
count1<=count1-1;
if(switch[0]=='b0&&(state2==3'b010||state3==3'b010)) begin
light[0]<='b0;
state1<=state1_down; end end else
if(switch[0]=='b0) begin
state1<=state1_down; end else begin
state1<=state1_other; count1<=39; end
state1_other:
if(switch[0]=='b1)
state1<=state1_other; else
if(count1>0) begin
count1<=count1-1;
if(switch[0]=='b0&&(state2==3'b010||state3==3'b010)) begin
light[0]<='b0;
state1<=state1_down; end end else
state1<=state1_down;
state1_down: begin
light[0]<='b0; count_1<=3'b0; state1<=state1_start; end
state1_up: begin
light[0]<='b1;
state1<=state1_work; end
default:
state1<=state1_start; endcase
always@(posedge clk10) if(!rst) begin
state2<=state2_start; count2<=8'b0; count_2<=3'b0; end else
if(switch[1]=='b1&&count_2<4) count_2<=count_2+1; else
case(state2)
state2_start:
if(switch[1]=='b1) begin
state2<=state2_up; count2<=78; end else begin
state2<=state2_start; light[1]<='b0; end
state2_work: if(count2>0) begin
count2<=count2-1;
if(switch[1]=='b0&&(state1==3'b010||state3==3'b010)) begin
light[1]<='b0;
state2<=state2_down; end end else
if(switch[1]=='b0) begin
state2<=state2_down; end else begin
state2<=state2_other; count2<=39; end
state2_other:
if(switch[1]=='b1)
state2<=state2_other; else
if(count2>0) begin
count2<=count2-1;
if(switch[1]=='b0&&(state1==3'b010||state3==3'b010)) begin