首先稍微描述一下这个分频电路,也可以说是计数器,一样的。
该模块是对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 pclk(
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 pclk_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;
pclk 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