资源描述
你好,我们在做verilog仿真时遇到了一些问题,希望你能帮我们看看。下面我就简要的说说什么问题啊!
就是如下所示的原理图:电路主要由一个DIV8分频的模块、一个DIV2分频的模块和外部一些控制的信号模块组成,使得这两个分频模块能够正常工作,从而实现电路的计数功能(当CLK_AFTER_DIV输入端输入时钟脉冲数为256时,OUT端输出一个高电平)。
INPUT的端口有:
CLK_32.768:时钟信号,上升有效。
CLK_AFTER_DIV:分频模块出来的时钟信号,作为DIV8的时钟信号。
HOLD:DIV8的控制端口,低电平有效,高电平则保持上一个状态。
IN7:控制端口,高电平有效。
IN8:控制端口,低电平有效。
IN9:控制端口,低电平有效。
S_0:控制端口,低电平有效。
CON:控制端口,高电平有效。
CLR_0 :清0端口,低电平有效。
OUTPUT的端口有:
OUT:计数器的输出端口。
用spectre仿真得到的结果如下:
仿真结果描述如下:
1、 当IN7=CON=1,IN8=IN9=HOLD=S_0=0的时候才能使得DIV8_BLOCK的SET2_0置1、SET3_1置0及才能实现计数功能。如果其中有一个条件不能满足的话,都不可能实现计数功能。
2、 当CLK_AFTER_DIV输入端输入时钟脉冲数为256时,OUT端输出一个高电平。
我们的问题是:如果我们用verilog仿真时却得不到和spectre一样的结果。Spectre可以仿出正确的结果,即:当CLK_AFTER_DIV输入端输入时钟脉冲数为256时,OUT端输出一个高电平。当我们用verilog仿真时得到的结果却如下:
即输出端OUT出现很多不定态。而且没有实现分频的效果。
其中仿真语言编写如下:
initial
begin
CLK_32_768 = 1'b0;
CLK_AFTER_DIV = 1'b0;
CLR_0 = 1'b1;
CON = 1'b1;
HOLD = 1'b0;
IN7 = 1'b1;
IN8 = 1'b0;
IN9 = 1'b0;
S_0 = 1'b0;
end
always #1 CLK_32_768=~CLK_32_768;
always #1.5 CLK_AFTER_DIV=~CLK_AFTER_DIV;
initial #1000 $finish;
我们仔细分析了下上述原理图后,发现问题是出在原理图中的一个模块名为DIV8_BLOCK的模块。DIV8_BLOCK的模块是实现256分频的电路,他是由8个2分频的电路模块叠起来的。利用低一级的分频输出OUT来控制下一级的分频,从而达到256分频的效果。具体框图如下:
电路内部结构如下:(由于都是一样的电路的叠加,所以只画出一小部分)
其中INPUT:
CLK:分频模块时钟信号,上升有效。
CLR_0 :清0端口,低电平有效。
HOLD:控制信号端口,低电平有效,高电平的时候保持上一个状态。
HOLD=0,SET3_1=0,SET2_0=1 ,电路实现分频功能,DIV_OUT和OUT输出频率等于CLK/256。
OUTPUT:
OUT:计数器的输出端口。
当我们用verilog仿真时得到的结果却如下:
图中的OUTX等表示为X分频。从图中我们可以看到:电路在8到16分频时发生了错误,使得最后的仿真结果OUT和16分频的结果出错,并出现了很多不定态。具体什么原因我们也不清楚,请帮我们看看!下面是我们用语仿真的语言描写:
initial
begin
CLK = 1'b0;
CLR_0 = 1'b0;
HOLD = 1'b0;
SET2_0 = 1'b1;
SET3_1 = 1'b0;
#5 CLR_0=1;
end
always #1 CLK=~CLK;
initial #1000 $finish;
其中我们在用verilog仿真时电路中的各个门描述如下:
电路中所有门都是调用自己建立的library,不是调用sample里的门的。(以INV反向器为例)
1.在自己建立的library中建立INV这个cell,其view有3个分别为functional,schematic和symbol。如下图所示:
其中schematic图如下:
其中functional的建立过程如下:
在composer schematic editing中:
里面选:
就会生成一个functional文件:
接下去就自己写上需要的verilog语言就好了。如下所示。
展开阅读全文