使用Verilog实现基本组合逻辑和时序逻辑(寄存器、计数器)

1、寄存器

理解:由D触发器构成,每当有上升沿或者下降沿时,数据就从输入端到达输出端。还具有复位清零的功能,包括异步复位、同步复位。

异步复位:不需要等待上升沿或下降沿的到来,只要复位按键按下输出端就输出0

同步复位:在上升沿或者下降沿到来时,如果复位按键按下,才输出0

------------——————————--------同步复位-----------------------------------------------

module register(
        input clk,
        input din,
        input rst,
        output reg dout
    );
    
    always@(posedge clk )
    begin
    if(rst==1'b0)
        dout<=1'b0;
    else
        dout <= din;
    end
    
endmodule

testbench仿真

`timescale 1ns / 1ps
module register_tb(

    );
    reg clk;
    reg din;
    reg rst;
    wire dout;
    
    register register_tb(
    .clk(clk),
    .din(din),
    .rst(rst),
    .dout(dout)
    );
    
    initial
    begin
    clk=0;
    din=0;
    rst=1;
    #200
    $stop;
    end
    
    always #5 clk=~clk;
    always #10 rst=~rst;
    always #20 din<=din+1;
endmodule

 在vivado中进行仿真,结果

————————————————————异步复位——————————————————

module register(
    input clk,
    input rst,
    input din,
    output reg out
    );
    
    always@(posedge clk or rst)
    begin
    if(rst == 1'b0)
        out <= 1'b0;
    else
        out <= din;
    end

endmodule

testbench

`timescale 1ns / 1ps
module register_tb(

    );
    reg clk;
    reg din;
    reg rst;
    wire dout;
    
    register register_tb(
    .clk(clk),
    .din(din),
    .rst(rst),
    .dout(dout)
    );
    
    initial
    begin
    clk=0;
    din=0;
    rst=1;
    #200
    $stop;
    end
    
    always #5 clk=~clk;
    always #10 rst=~rst;
    always #20 din<=din+1;
endmodule

仿真结果

 

————————————————既异步置位又异步复位————————————————

设置复位的优先级高,rst和set都是低电平有效

1、当rst=0,set=1时,输出为0

2、当rst=1,set=0时,输出为1

3、当rst=1,set=1时,输出为din

4、当rst=0,set=0时,都有效,看优先级高的那个

module register(
    input clk,
    input rst,
    input din,
    input set,
    output reg dout
    );
    
    always@(posedge clk or rst or set)
    begin
    if(rst == 1'b0)
        dout <= 1'b0;
    else if(set == 1'b0)
        dout <= 1'b1;
    else
        dout <= din;
    end
    
    endmodule

 testbench

`timescale 1ns / 1ps
module register_tb(

    );
    reg clk;
    reg din;
    reg rst;
    reg set;
    wire dout;
    
    register register_tb(
    .clk(clk),
    .din(din),
    .rst(rst),
    .set(set),
    .dout(dout)
    );
    
    initial
    begin
    clk=0;
    din=0;
    set=1;
    rst=1;
    #200
    $stop;
    end
    
    always #5 clk=~clk;
    always #10 rst=~rst;
    always #15 set=~set;
    always #20 din<=din+1;
endmodule

仿真结果

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值