比交通灯简单点,这是代码
当然这个代码不对,我写在一个模块里没错误,想写成状态机就不行了,主要就是不能在不同的模块里该同一变量赋值
用tir,要做个三态驱动吗,怎么做呢?
我所指的同步是在改变状态的同时有输出
还请大虾指点
module traffic1(CLK,LAMP,nrst,num);
output[7:0] num;
output[2:0] LAMP;
input CLK,nrst;
reg[7:0] num,numa;
reg[2:0] LAMP,CS,NS;
reg temp;
parameter[2:0] IDLE=3'b000, S1=3'b001, S2=3'b010,S3=3'b011;
parameter[7:0] red=8'd15,yellow=8'd10,bule=8'd5;
always @(posedge CLK )
if(!nrst)
CS<=IDLE;
else
CS<=NS;
always @(CS or temp )//三灯循环点亮,在变换状态的同时
begin
NS=3'bx;
case(CS)
IDLE: begin
if(temp) NS=IDLE;
if(!temp) NS=S1;
end
S1: begin
if(temp) NS=IDLE;
if(!temp) NS=S2;
end
S2: begin
if(temp) NS=IDLE;
if(!temp) NS=S3;
end
S3: begin
if(temp) NS=IDLE;
if(!temp) NS=S1;
end
default:NS=IDLE;
endcase
end
always @(posedge CLK )//三灯循环点亮,在变换状态的同时
//改变倒计时,时间
if(!nrst)
begin
LAMP<=3'b000;
end
else
begin
case(NS)
IDLE: begin
LAMP<=3'b000;
numa<=8'd0;
end
S1: begin
LAMP<=3'b001;
numa<=red;
end
S2: begin
LAMP<=3'b010;
numa<=yellow;
end
S3: begin
LAMP<=3'b100;
numa<=bule;
end
endcase
end
always @(posedge CLK ) //倒计时模块
if(!nrst)
num<=8'd0;
else
begin //想在倒计时到0时重新给倒计时赋值
num<=numa;//,因为不能在两个模块给同一变量赋值,
//这里没办法了我用一个中间变量(numa)传递
if(num>0)//最小情况为1
begin
if(num[3:0]==0)
begin
num[3:0]<=9;
num[7:4]<=num[7:4]-1;
end
else
num[3:0]<=num[3:0]-1;
if(num==1) temp<=0; //因为是非阻塞,全结束之前还是旧值,结束后才变为0,
//所以等与1时结束后就为0 ,这样理解行吗?
end
else
temp<=0; //到0时要改变状态
end
endmodule
谢谢关心我的人 |