设计示例一 用门级结构描述D触发器:
设计示例一 module flop(data,clock,clear,q,qb); input data,clock,clear; output q,qb; nand #10 nd1(a,data,clock,clear), nd2(b,ndata,clock), nd4(d,c,b,clear), nd5(e,c,nclock), nd6(f,d,nclock), nd8(qb,q,f,clear); nand #9 nd3(c,a,d), nd7(q,e,qb); not #10 iv1(ndata,data), iv2(nclock,clock); endmodule
设计示例二 由已设计的模块来构成高一级的模块 四位寄存器电路结构图 q0 d0 d3 d2 q2 q3 q1 d1 clrb f4 f3 clk q0 d0 d3 d2 q2 q3 q1 d1 clrb f4 f3 f2 f1 四位寄存器电路结构图
设计示例二 `include “ flop.v ” module hardreg(d,clk,clrb,q); input clk,clrb; input[3:0] d; output[3:0] q; flop f1(d[0],clk,clrb,q[0],), f2(d[1],clk,clrb,q[1],), f3(d[2],clk,clrb,q[2],), f4(d[3],clk,clrb,q[3],); endmodule
设计示例三 编写测试模块通过仿真检查设计正确与否: `include “hardreg.v” module hardreg_top; reg clock, clearb; reg [3:0] data; wire [3:0] qout; `define stim #100 data=4'b //宏定义 stim,可使源程序简洁 event end_first_pass; //定义事件end_first_pass
设计示例三 (续) hardreg reg_4bit(.d(data),.clk(clock), .clrb(clearb), .q(qout)); /*--------------------------------------------------- 把本模块中产生的测试信号data、clock、clearb输入实例reg_4bit以观察输出信号qout.实例reg_4bit引用了hardreg ---------------------------------------------------*/ initial begin clock = 0; clearb = 1; end always #50 clock = ~clock;
设计示例三 (续) /*------------------------------------------------- 宏定义stim引用,等同于 #100 data=4'b 注意引用时要用 `符号。--------------------------------------*/ `stim 0000; `stim 0001; . . . . . . `stim 1111; end #200 -> end_first_pass; 延迟200个单位时间,触发事件end_first_pass -------------------------------------------------*/ $finish; //结束仿真 endmodule
Verilog HDL 设计示例四 有限状态机的设计 - 有限状态机是由寄存器组和组合逻辑构成的 硬件时序电路; - 其状态(即由寄存器组的1和0的组合状态所 构成的有限个状态)只能在同一时钟跳变沿 的 情况下才能从一个状态转向另一个状态; - 究竟转向哪一状态不但取决于各个输入值, 还取决于当前状态。 - 状态机可用于产生在时钟跳变沿时刻开关的 复杂的控制逻辑,是数字逻辑的控制核心。
设计示例四 (续)
设计示例四 (续) module fsm (Clock, Reset, A, F, G); input Clock, Reset, A; output F,G; reg F,G; reg [1:0] state ; parameter Idle = 2’b00, Start = 2’b01, Stop = 2’b10, Clear = 2’b11; always @(posedge Clock) if (!Reset) begin state <= Idle; F<=0; G<=0; end else
设计示例四 (续) idle: begin if (A) state <= Start; G<=0; end case (state) idle: begin if (A) state <= Start; G<=0; end start: if (!A) state <= Stop; Stop: begin if (A) state <= Clear; F <= 1; Clear: begin if (!A) state <=Idle; F<=0; G<=1; endcase endmodule
设计示例四 (续) 还可以用另一个Verilog HDL模型来表示同一个有限状态,见下例: module fsm (Clock, Reset, A, F, G); input Clock, Reset, A; output F,G; reg F,G; reg [3:0] state ; parameter Idle = 4’b1000, Start = 4’b0100, Stop = 4’b0010, Clear = 4’b0001;
设计示例四 (续) always @(posedge clock) if (!Reset) begin state <= Idle; F<=0; G<=0; end else case (state) Idle: begin if (A) state <= Start; G<=0; Start: if (!A) state <= Stop; Stop: begin if (A) state <= Clear;
设计示例四 (续) F <= 1; end Clear: begin if (!A) state <=Idle; F<=0; G<=1; default: state <=Idle; endcase endmodule
设计示例四 (续) 我们还可以用另一种风格的Verilog HDL模型来表示同一个有限状态。在这个模型中,我们把用always语句在时钟沿触发条件下的状态变化放在一个独立的块中, 而把在状态控制下的两个开关分两个独立的组合逻辑always块来描述。见下例: module fsm (Clock, Reset, A, F, G); input Clock, Reset, A; output F,G; reg [1:0] state ; reg F,G; parameter Idle = 2’b00, Start = 2’b01, Stop = 2’b10, Clear = 2’b11;
设计示例四 (续) always @(posedge Clock) if (!Reset) begin state <= Idle; end else case (state) Idle: if (A) state <= Start; Start: if (!A) state <= Stop; Stop: if (A) state <= Clear; Clear: if (!A) state <= Idle; default: state <= 2 ’bxx; endcase
设计示例四 (续) always @(state or Reset or A) begin if ( !Reset) F = 0; else if (state == Stop) F = 1; end if (! Reset) G = 0; else if (state == Clear) G = 1; endmodule