Hoo

无复位信号的分频器的设计与仿真

0
阅读(1677)

      工具:Quartus II   ;   ModelSim

      在项目中,遇到一个时钟分频电路,我要对其进行仿真,但是由于没有复位端,仿真时输出端的初始态是不确定的,所以,无法进行仿真。

      怎么办?

      

      首先稍微描述一下这个分频电路,也可以说是计数器,一样的。

      该模块是对F0做2,2^2,2^3,2^4...2^11分频。只有一个输入端,系统时钟F0。之后串接11个D触发器,每个D触发器的输出端Q_接回到自己的D端,从而实现每个D触发器在被触发后自动取反,也就实现了每个D触发器完成一次二分频。把每个D触发器的输出端Q引出,即得到11个不同频率的时钟。

      很简单的设计,问题是怎样在没有复位端的情况下对输出端进行初始态的赋值,以能够仿真?

      在代码中,寄存器声明的时候直接赋值即可,reg xxx = 0;

      另外,不建议用initial,因为这东西不能综合,当然有人说有些综合器也可以综合initial了,等碰到再说吧,尽量不要用就好了。原则就是,设计当中不用,只在仿真中用。

      特殊情况:我在做Verilog-NC仿真的时候,竟然不能在声明reg处直接赋值,会报错。版本太旧还是NC本来不吃这套呢?这时候我就用了initial赋值,反正也不综合,只是仿真而已。


代码如下:

1、单个D触发器的模块

module   dff1(clk,  q,  qn)  ;

input       clk    ;

output     q      ;

output     qn    ;

reg           q = 0;

reg           qn    ;


always  @(posedge  clk)  begin

    q  <=  ~q;

end

always  @(q)  begin

    qn  =  ~q;

end


endmodule


2、模块例化调用

module divclk(

clk,

Q0,

Q1,

Q2,

Q3,

Q4,

Q5,

Q6,

Q7,

Q8,

Q9,

Q10

);


input      wire  clk;

output   wire  Q0;

output   wire  Q1;

output   wire  Q2;

output   wire  Q3;

output   wire  Q4;

output   wire  Q5;

output   wire  Q6;

output   wire  Q7;

output   wire  Q8;

output   wire  Q9;

output   wire  Q10;


wire    SYNTHESIZED_WIRE_0;

wire    SYNTHESIZED_WIRE_1;

wire    SYNTHESIZED_WIRE_2;

wire    SYNTHESIZED_WIRE_3;

wire    SYNTHESIZED_WIRE_4;

wire    SYNTHESIZED_WIRE_5;

wire    SYNTHESIZED_WIRE_6;

wire    SYNTHESIZED_WIRE_7;

wire    SYNTHESIZED_WIRE_8;

wire    SYNTHESIZED_WIRE_9;

wire    SYNTHESIZED_WIRE_10;

wire    SYNTHESIZED_WIRE_11;

wire    SYNTHESIZED_WIRE_12;

wire    SYNTHESIZED_WIRE_13;

wire    SYNTHESIZED_WIRE_14;

wire    SYNTHESIZED_WIRE_15;

wire    SYNTHESIZED_WIRE_16;

wire    SYNTHESIZED_WIRE_17;

wire    SYNTHESIZED_WIRE_18;

wire    SYNTHESIZED_WIRE_19;

wire    SYNTHESIZED_WIRE_20;


assign    Q0 = SYNTHESIZED_WIRE_1;

assign    Q1 = SYNTHESIZED_WIRE_3;

assign    Q2 = SYNTHESIZED_WIRE_5;

assign    Q3 = SYNTHESIZED_WIRE_7;

assign    Q4 = SYNTHESIZED_WIRE_9;

assign    Q5 = SYNTHESIZED_WIRE_11;

assign    Q6 = SYNTHESIZED_WIRE_13;

assign    Q7 = SYNTHESIZED_WIRE_15;

assign    Q8 = SYNTHESIZED_WIRE_17;

assign    Q9 = SYNTHESIZED_WIRE_19;


dff1    b2v_inst(

.clk(clk),

.d(SYNTHESIZED_WIRE_0),

.q(SYNTHESIZED_WIRE_1),

.qn(SYNTHESIZED_WIRE_0));


dff1    b2v_inst1(

.clk(SYNTHESIZED_WIRE_1),

.d(SYNTHESIZED_WIRE_2),

.q(SYNTHESIZED_WIRE_3),

.qn(SYNTHESIZED_WIRE_2));


dff1    b2v_inst2(

.clk(SYNTHESIZED_WIRE_3),

.d(SYNTHESIZED_WIRE_4),

.q(SYNTHESIZED_WIRE_5),

.qn(SYNTHESIZED_WIRE_4));


dff1    b2v_inst3(

    .clk(SYNTHESIZED_WIRE_5),

.d(SYNTHESIZED_WIRE_6),

.q(SYNTHESIZED_WIRE_7),

.qn(SYNTHESIZED_WIRE_6));


dff1    b2v_inst4(

.clk(SYNTHESIZED_WIRE_7),

.d(SYNTHESIZED_WIRE_8),

.q(SYNTHESIZED_WIRE_9),

.qn(SYNTHESIZED_WIRE_8));


dff1    b2v_inst5(

.clk(SYNTHESIZED_WIRE_9),

.d(SYNTHESIZED_WIRE_10),

.q(SYNTHESIZED_WIRE_11),

.qn(SYNTHESIZED_WIRE_10));


dff1    b2v_inst6(

.clk(SYNTHESIZED_WIRE_11),

.d(SYNTHESIZED_WIRE_12),

.q(SYNTHESIZED_WIRE_13),

.qn(SYNTHESIZED_WIRE_12));


dff1    b2v_inst7(

.clk(SYNTHESIZED_WIRE_13),

.d(SYNTHESIZED_WIRE_14),

.q(SYNTHESIZED_WIRE_15),

.qn(SYNTHESIZED_WIRE_14));


dff1    b2v_inst8(

.clk(SYNTHESIZED_WIRE_15),

.d(SYNTHESIZED_WIRE_16),

.q(SYNTHESIZED_WIRE_17),

.qn(SYNTHESIZED_WIRE_16));


dff1    b2v_inst9(

.clk(SYNTHESIZED_WIRE_17),

.d(SYNTHESIZED_WIRE_18),

.q(SYNTHESIZED_WIRE_19),

.qn(SYNTHESIZED_WIRE_18));


dff1    b2v_inst10(

.clk(SYNTHESIZED_WIRE_19),

.d(SYNTHESIZED_WIRE_20),

.q(Q10),

.qn(SYNTHESIZED_WIRE_20));

endmodule


3、testbench

`timescale    1ns/1ns

module    divclk_TB;


reg      clk  ;

wire    Q0   ;

wire    Q1   ;

wire    Q2   ;

wire    Q3   ;

wire    Q4   ;

wire    Q5   ;

wire    Q6   ;

wire    Q7   ;

wire    Q8   ;

wire    Q9   ;

wire    Q10   ;


initial     clk = 0 ;


always    #10    clk = ~clk;


divclk u(.clk(clk),

         .Q0(Q0),

         .Q1(Q1),

         .Q2(Q2),

         .Q3(Q3),

         .Q4(Q4),

         .Q5(Q5),

         .Q6(Q6),

         .Q7(Q7),

         .Q8(Q8),

         .Q9(Q9),

         .Q10(Q10)

        );


endmodule