您的位置:首页 > 其它

利用条件语句实现不同占空比的分频时钟电路

2015-04-21 23:01 148 查看
1,要实现的是如下的一个“产生占空比不同的分频时钟”:



(1)、建模:

module fdivision_module(clock,d_clock,reset,j);

input clock,reset;

output d_clock,j;

reg d_clock;

reg [2:0]j;

always @(posedge clock)

begin

if(!reset)

//初始化过程

begin

d_clock<=0;

j<=0;

end

else

begin

if(j==4)

j<=0;

else if(j==1)

begin

d_clock=1;

j<=j+1;

end

else

begin

d_clock=0;

j<=j+1;

end

end

end

endmodule

(2)testbench:

`include "fdivision_module.v"

module fdivision_stimulus;

reg clock,reset;

wire d_clock;

wire [2:0]j;

fdivision_module fd(clock,d_clock,reset,j);

initial

begin

clock=0;

forever #5 clock=~clock;

end

initial

begin

reset=0;

#20 reset=1;

#100 reset=1;

#5 reset=1;

end

(3)、正确仿真波形:



2、出现的问题及解决办法:

(1)、第一次的仿真结果如下:由图可见,在reset置0的时候,d_clock并没有置0,没有初始化



(2)、为了调试程序,我将局部变量j也作为输出变量,得到下面的仿真结果:局部起到计数的变量一直为未知量x



(3)、改动程序,将reset也放入always的敏感列表中,写成always @(posedge clock,negedge reset),得到下面的结果:很显然,尽管仿真出结果,但是占空比错误,这个错归根结底还是在于计数器的设定,开始我写成(j==5)时,j<=0;(j==2)时,d_clock=1;特别很明显0~5总共经历了6个时钟。所以,建模过程中,要特别注意计数器j的设定。



(4),现在回过头来想想最开始的建模有什么错误,在2.3中,将reset置于敏感列表中,写成always @(posedge clock,negedge reset),这相当于异步置0 ,reset的置0信号是不受时钟控制的,只要reset=0,就能将d_clock和j置0。但是在最开始错误的2.1中,敏感列表为always @(posedge clock),再在后面过程块中写,reset=0时,j=0,d_clock=0;那么这时的reset置0为同步置0,只有当上升沿出现时,才生效,给j和d_clock赋值。但是,我在testbench模块中,给reset的赋值如下图:很显然,在0~5ns时,reset=0,#5ns之后reset=1,则当#10ns,上升沿到来时,reset已经为1,不能再给j和d_clock赋值了,所以造成了2.1的错误。特别值得注意的是,在异步置0时,reset=0的保持时间可以任意,但同步置0时,reset=0的保持时间需要大于一个时钟,否则就会出现上面上升沿还没到来,reset就为1,不能赋值的错误。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: