clock generator(verilog code)
时间:10-02
整理:3721RD
点击:
在数字电路中,时钟信号是最常用到的信号,所以时钟发生器(clock generator)也就是最常用到的电路。
用verilog行为级描述时钟发生器时,如果是描述一直存在的时钟信号,那当然很简单了,用always语句,或者forever语句都可以描述出需要的时钟信号;如果描述和使能信号相关的时钟信号,就有点麻烦了,当使能信号从使能状态转变到禁止状态时,会出现不能立刻关断时钟发生器的现象(假设:使能信号禁止状态时,时钟发生器输出低电平):发生在低电平时,表面看不出来;发生在高电平时,就很明显了,看到高电平会持续到它的有效时间结束后才转换为低电平。
下面针对后面一种时钟发生器提出一种解决不能立即关断时钟发生器的verilog行为级描述方法:
- parameter T=10;
- reg clk;
- reg enable;
- always @(*)
- begin : gclk
- clk = 1'b0;
- forever
- begin
- if(enable === 1'b0) disable gclk;
- #(T/2) clk = 1'b1;
- #(T/2) clk = 1'b0;
- end
- end
- always @(*)
- if(enable === 1'b0)
- begin
- disable gclk;
- #0.01 clk = 1'b0;
- end
第一个always语句用来跳出clock loop,第二个always语句用来立即关断时钟发生器。
如下图所示:
貌似用(enable & clk)也可以达到同样的效果。
直接在最后一级门控时钟在很多情况下是可以的,不过在多个时钟切换的时候,就可能有点力所不能及了,我也是在做一个项目时,仿真有些test cases时,才不得不用上面我提到的那种方法的。
that's testbech.clock_generator.
Nice
