一段Verilog代码的意思
本帖最后由 fpgaw 于 2010-7-4 07:20 编辑请教高手们一段Verilog代码的意思
在仿真的测试模块中CLK是所需的时钟信号,是用下面这段代码实现的,可是触发条件为posedge CLK,而此时CLK时钟信号还没有产生呢呀,怎么可能有上升沿呢??而且在begin---end中竟然有两次的赋值,这样能实现吗?? 谢谢啦
initial CLK <= 1'b1;
initial CLK_N <= 1'b0;
always @(posedge CLK) begin
CLK <= #(`tCK/2) 1'b0;
CLK_N <= #(`tCK/2) 1'b1;
CLK <= #(`tCK) 1'b1;
CLK_N <= #(`tCK) 1'b0;
end ...拿个modelsim跑跑不就知道了.. 偶modelsim跑了,程序如下 <br>
module tst_clk;<br>
<br>
`define tCK 10<br>
<br>
reg CLK;<br>
reg CLK_N;<br>
<br>
initial CLK <= 1'b1;<br>
<br>
initial CLK_N <= 1'b0;<br>
<br>
always @(posedge CLK)<br>
begin<br>
CLK <= #(`tCK/2) 1'b0; <br>
CLK_N <= #(`tCK/2) 1'b1;<br>
CLK <= #(`tCK) 1'b1;<br>
CLK_N <= #(`tCK) 1'b0;<br>
end<br>
<br>
endmodule<br>
<br>
跑完了波形如料是互补的两个方波...<br>
是不是initial clk <=1 就算第一个posedge了么 initial之前CLK是x,x->1算是一个posedge,所以会触发下面的begin-end。<br>
begin-end之间的语句是顺序执行的,当然可以两次赋值喽。 原来是这样! 学习到了! 原帖由 chlor 于 2007-6-13 00:25 发表
http://www.edacn.net/bbs/images/common/back.gif
<br>
initial之前CLK是x,x->1算是一个posedge,所以会触发下面的begin-end。<br>
begin-end之间的语句是顺序执行的,当然可以两次赋值喽。 后面说的不对,由于是非阻塞赋值,所以是并行的,只不过由于延时的时间不同,所以CLK在1/2周期的时候被改变了一次(第一条赋值语句),在一个周期的时候又被改变了一次(第三条赋值语句)。如果是顺序执行的话,则CLK在1/2周期的时候会被改变了一次,在1.5个周期的时候被第二次改变。当把begin-end中的非阻塞赋值改成阻塞赋值的时候,就是顺序执行了。 答得对,是这个意思
页:
[1]