• 时序逻辑电路的设计要点:

  ①只有时钟信号复位信号可以放在敏感列表里;

  ②使用非阻塞赋值,即使用"<=";

  ③无需对所有分支进行描述,对于未描述的分支,变量将保持原值;

  ④如果敏感列表中,有一个信号是边沿触发,则所有信号都得使用边沿触发。

  • 锁存器: 当时钟为高电平时,输出才会随输入数据的变化而更新。
//基本锁存器
module latch(clk, d, q);
    input clk, d;
    output q;
    always @(clk, d)    begin
        if(clk)
            q<=d;
    end
endmodule

//含复位控制的锁存器:高电平有效,低电平复位
module latch_reset(clk, rstn, d, q);
    input clk, rstn;
    input d;
    output q;
    always @(clk, rstn, d)  begin
        if(!rstn)
            q<=0;
        else if(clk)
            q<=d;
    end
endmodule
  • 触发器: 只有在时钟上升沿时才会更新数据
//基本D触发器
module dff(clk, d, q);
    input clk;
    input d;
    output reg q;
    always @(posedge clk)
        q<=d;
endmodule

//含异步复位信号的D触发器:高电平有效,低电平复位
module dff_reset(clk, rstn, d, q);
    input clk, rstn;
    input d;
    output reg q;
    always @(posedge clk, negedge rstn) begin
        if(~rstn)
            q<=1'b0;
        else
            q<=d;
    end
endmodule

//同步复位信号的D触发器
module dff_reset(clk, rstn, d, q);
    input clk, rstn;
    input d;
    output reg q;
    always @(posedge clk) begin
        if(~rstn)
            q<=1'b0;
        else
            q<=d;
    end
endmodule

//含异步复位和同步使能的D触发器:使能信号高电平有效;优先级:reset>clk>en.
module dff_reset_en(clk, rstn, en, d, q);
    input clk, rstn, en;
    input d;
    output reg q;
    always @(posedge clk, negedge rstn) begin
        if(~rstn)
            q<=1'b0;
        else if(en)
            q<=d;
    end
endmodule
  • 寄存器:
//1位寄存器
module reg1(clk, reset, load, in_data, out_data);
    input clk, reset, load;
    input in_data;
    output reg out_data;
    always @(posedge clk, posedge reset)    begin
        if(reset)
            out_data<=1'b0;
        else if(load)
            out_data<=in_data;
    end
endmodule

//N位寄存器
module regN
    #(parameter N=8)
    (input clk, reset, load,
    input [N-1:0] in_data,
    output reg [N-1:0] out_data);

    always @(posedge clk, posedge reset)    begin
        if(reset)
            out_data<=0;
        else if(load)
            out_data<=in_data;
    end
endmodule
  • 计数器:
//模M计数器:参数M指定计数模值;参数N指定计数器所需位数。
module counter_mod_m
    #(parameter M=10,
    parameter N=4)
    (input clk, reset,
    output [N-1:0] qd,
    output cout);

    always@(posedge clk)    begin
        if(reset)
            regN<=0;
        else if(regN<(M-1))
            regN<=regN+1;
        else
            regN<=0;
    end
    assign qd = regN;
    assign cout=(regN==(M-1))?1'b1:1'b0;
endmodule