verilog always中如何延时
急!!!用verilog写的程序烧进fpga后,希望在always进程中执行一段程序后延时100ns(无需太精确)左右后再执行后续程序。各位大虾帮帮忙。...
急!!!用verilog写的程序烧进fpga后,希望在always进程中执行一段程序后延时100ns(无需太精确)左右后
再执行后续程序。各位大虾帮帮忙。 展开
再执行后续程序。各位大虾帮帮忙。 展开
4个回答
展开全部
在模块中,源管脚(input or inout)到目的管脚(output or inout)之间的延迟叫做模块路径延迟(module path delay)。在verilog中,路径延迟用关键字specify和endspecify表示。在这两个关键字之间的部分构成一个specify块。
specify块包含以下内容:
在模块交叉路径上定义管脚与管脚之间的延迟
在电路中进行set up time的检查
定义specparam 常量
例如:
//Pin-to-pin delays
module M (out,a,b,c,d);
output out;
input a,b,c,d;
wire e,f;
//specify block with path delay statements
specify
(a => out) = 9;
(b => out) = 9;
(c => out) = 11;
(d => out) = 11;
endspecify
//gate instantiations
and a1(e,a,b);
and a2(f,c,d);
and a3(out,e,f);
endmodule
specify块是module的一个组成部分,不能被其他的块所包含,比如说initial和always。
在specify块中,可以采用下面的几种方式来描述路径延迟:
1,并行连接,如果源和输出有相同的位数,采用并行连接的方式,例如,
a[3:0]为源,out[3:0]为输出,则可以描述为(a => out) = 9;
这与 (a[0] => out[0]) =9;
(a[1] => out[1]) =9;
(a[2] => out[2]) =9;
(a[3] => out[3]) =9;
的功能是相同的。
2,全部连接,如果源到输出之间都有相同的路径延迟,采用全部连接的方式,即
(<source_field> *> <destination_field>) = <delay_value>;
例如
(a,b *> out) =9;
(c,d *> out) = 11;
3,边沿触发条件下的路径延迟,例如
(posedge clock => (out +: in)) = (10:8)
这里,在clock的上升沿,当out从低到高变化时,延迟为10,当out从高到低变化时,延迟为8
4,有条件的路径延迟,路径延迟与输入信号的状态有关,例如
if (a) (a => out) = 9;
if (~a) (a => out) = 10;
5,上升沿,下降沿和高阻态的路径延迟
源到输出之间的延迟特性可以细分为上升沿,下降沿和高组态变化时的延迟。可以选择1,2,3,6或12个延迟参数。
6,最大,最小和常规的路径延迟
主要定义在不同环境下的最大,最小和常规的路径延迟。
specify块包含以下内容:
在模块交叉路径上定义管脚与管脚之间的延迟
在电路中进行set up time的检查
定义specparam 常量
例如:
//Pin-to-pin delays
module M (out,a,b,c,d);
output out;
input a,b,c,d;
wire e,f;
//specify block with path delay statements
specify
(a => out) = 9;
(b => out) = 9;
(c => out) = 11;
(d => out) = 11;
endspecify
//gate instantiations
and a1(e,a,b);
and a2(f,c,d);
and a3(out,e,f);
endmodule
specify块是module的一个组成部分,不能被其他的块所包含,比如说initial和always。
在specify块中,可以采用下面的几种方式来描述路径延迟:
1,并行连接,如果源和输出有相同的位数,采用并行连接的方式,例如,
a[3:0]为源,out[3:0]为输出,则可以描述为(a => out) = 9;
这与 (a[0] => out[0]) =9;
(a[1] => out[1]) =9;
(a[2] => out[2]) =9;
(a[3] => out[3]) =9;
的功能是相同的。
2,全部连接,如果源到输出之间都有相同的路径延迟,采用全部连接的方式,即
(<source_field> *> <destination_field>) = <delay_value>;
例如
(a,b *> out) =9;
(c,d *> out) = 11;
3,边沿触发条件下的路径延迟,例如
(posedge clock => (out +: in)) = (10:8)
这里,在clock的上升沿,当out从低到高变化时,延迟为10,当out从高到低变化时,延迟为8
4,有条件的路径延迟,路径延迟与输入信号的状态有关,例如
if (a) (a => out) = 9;
if (~a) (a => out) = 10;
5,上升沿,下降沿和高阻态的路径延迟
源到输出之间的延迟特性可以细分为上升沿,下降沿和高组态变化时的延迟。可以选择1,2,3,6或12个延迟参数。
6,最大,最小和常规的路径延迟
主要定义在不同环境下的最大,最小和常规的路径延迟。
展开全部
你的时钟如果是50M的话,在5个周期后再继续主体程序就可以了
如果是其他频率时钟,执行f/10个空周期就行
always@(posedge clk50)begin
...
case()
4'd0: ..//主体
...
4'd3:state<=4'd4; //空语句延时
4'd4:state<=4'd5;
4'd5:state<=4'd6;
4'd6:state<=4'd7;
4'd7:state<=4'd8;
4'd8:...//主体
...
...
如果你不是用case的话,就简单的再写个计数延时模块,用两个使能信号连接主体也可以
如果是其他频率时钟,执行f/10个空周期就行
always@(posedge clk50)begin
...
case()
4'd0: ..//主体
...
4'd3:state<=4'd4; //空语句延时
4'd4:state<=4'd5;
4'd5:state<=4'd6;
4'd6:state<=4'd7;
4'd7:state<=4'd8;
4'd8:...//主体
...
...
如果你不是用case的话,就简单的再写个计数延时模块,用两个使能信号连接主体也可以
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没有办法,没有空程序这样的东西的,只好自己设置多几个频率,或者用多几个case语句来分开,比如要延时100ns的,就
case(a)
00:if(cont==5d'100)
begin
a<=2'b01;
cont<=0;
end
else
cont<=cont+5'b1;
01:........
这样的
case(a)
00:if(cont==5d'100)
begin
a<=2'b01;
cont<=0;
end
else
cont<=cont+5'b1;
01:........
这样的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
做一个counter
always@(posedge clk)begin
counter <= counter + 1;
end
always@(posedge clk)begin
if (counter == 5'b11111)begin
flag <= 3'b111;
end
end
always@(posedge clk)begin
if(flag == 3'b111)
your main
end
always@(posedge clk)begin
counter <= counter + 1;
end
always@(posedge clk)begin
if (counter == 5'b11111)begin
flag <= 3'b111;
end
end
always@(posedge clk)begin
if(flag == 3'b111)
your main
end
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询