急啊!困扰了一个多月的问题,麻烦大家帮帮忙为感!
时间:10-02
整理:3721RD
点击:
我想当装态机到达startcaping状态时开始让地址线增一,但是仿真却不行!麻烦各位给看看啊!急啊,兜一个月了!再搞不定就...唉!
`timescale 1ns/100ps
module capcard (we,nrd,addressbus,reset,CAPING,CAPSTR,ICLK,IDQ,IGPV,IGPH);
input CAPSTR,ICLK,IDQ,IGPH,IGPV,nrd,reset;
output CAPING,we;
output [17:0] addressbus;
reg we;
reg [17:0] addressbus;//18位地址线
regCAPING;
reg [2:0] state;
parameter idle=3'b000,startflag=3'b001,//状态机
wait_vstart =3'b010,wait_vend =3'b011,
wait_hstart =3'b100,wait_hend=3'b101,
startcaping=3'b110;
initial
begin
addressbus<=18'b00_0000_0000_0000_0000;//复位
we=1;
CAPING=1;
state=idle;
end
always @ (posedge ICLK)
begin
if(!reset)begin
we<=1;
CAPING<=1;
state<=idle;
end
else
case(state)
idle:
if(!CAPSTR)
state<=startflag;
startflag:
if(!IGPV)begin
state<=wait_vstart;
end
wait_vstart:
if(IGPV)begin
state<=wait_vend;
end
wait_vend:
if(!IGPH)begin
state<=wait_hstart;
end
wait_hstart:
if(IGPH)begin
state<=wait_hend;
end
wait_hend:
if(IDQ)begin
state<=startcaping;
end
startcaping:begin
addressbus=addressbus+1;
we<=0;
CAPING<=0;
if(!IGPV)state<=idle;
else state=startcaping;
end
default :state<=idle;
endcase
end
endmodule
`timescale 1ns/100ps
module capcard (we,nrd,addressbus,reset,CAPING,CAPSTR,ICLK,IDQ,IGPV,IGPH);
input CAPSTR,ICLK,IDQ,IGPH,IGPV,nrd,reset;
output CAPING,we;
output [17:0] addressbus;
reg we;
reg [17:0] addressbus;//18位地址线
regCAPING;
reg [2:0] state;
parameter idle=3'b000,startflag=3'b001,//状态机
wait_vstart =3'b010,wait_vend =3'b011,
wait_hstart =3'b100,wait_hend=3'b101,
startcaping=3'b110;
initial
begin
addressbus<=18'b00_0000_0000_0000_0000;//复位
we=1;
CAPING=1;
state=idle;
end
always @ (posedge ICLK)
begin
if(!reset)begin
we<=1;
CAPING<=1;
state<=idle;
end
else
case(state)
idle:
if(!CAPSTR)
state<=startflag;
startflag:
if(!IGPV)begin
state<=wait_vstart;
end
wait_vstart:
if(IGPV)begin
state<=wait_vend;
end
wait_vend:
if(!IGPH)begin
state<=wait_hstart;
end
wait_hstart:
if(IGPH)begin
state<=wait_hend;
end
wait_hend:
if(IDQ)begin
state<=startcaping;
end
startcaping:begin
addressbus=addressbus+1;
we<=0;
CAPING<=0;
if(!IGPV)state<=idle;
else state=startcaping;
end
default :state<=idle;
endcase
end
endmodule
仿真图
初步看了一下,感觉到你的状态机的风格不太好。
此外,从仿真波形上我看到state的波形?所以冲波形上我看不出、你的状态到底跑到哪里了?
那我应该从哪里下手呢?我现在就要求地址总线上出现递增就可以了啊!
问题应该挺简单的,但是你不把state信号dump出来,大家怎么看啊?
我觉得这个状态机本身还是比较简单的,你根据书上的两个always的结构把你的code重新整理一下,
注意阻塞付值和非阻塞复制,
以你现在的code,很可能仿真想办法调通了,到编译的时候又出问题了。
Good coding style leads to Good Design.
赫赫,愚人之见了。
写状态机就得学学7楼的风格
代码写的的确不是很清楚,可能是阻塞、非阻塞的问题
问题解决了吗?还在试.......
代码风格的问题
给位都是高手阿,学习了
是不是说,state要用非阻塞赋值,逻辑控制信号和输出信号用阻塞赋值来写,这样一般就没有问题了?
case结构下的每个状态里的 if else 语句都木有描述完整。
代码风格确实差了点。