【verilog】时序逻辑的练习

实现D触发器,有输入信号d,时钟信号clk,输出信号q

在这里插入图片描述

module top(d,clk,q);
input d,clk;
output q;
reg q;
always @(posedge clk)begin
    q <= d;
end
module test(
    );
reg d,clk;
wire q;
top f(.d(d),.clk(clk),.q(q));
initial begin
    clk = 1;d = 0;
    #20 d = 1;
    #20 d = 0;
    #5 d = 1;
    #10 d = 0;
    #20 d = 1;
    #15 d = 0;
    #5 d = 1;
    
    
    #10 $stop;
end
always begin
    #5 clk = ~clk;
end
endmodule

在这里插入图片描述

创建8个D触发器。所有DFF应由clk的上升沿触发。

在这里插入图片描述

module top(d,clk,q);
input d,clk;
output q;
wire[7:0] d;
reg[7:0] q;
always @(posedge clk)begin
    q <= d;
end
module test(
    );
reg[7:0] d;
reg clk;
wire[7:0] q;
top f(.d(d),.clk(clk),.q(q));
initial begin
    clk <= 1;d <= 0;
    #5000 $stop;
end
always begin
    #5 clk <= ~clk;
    #7 d <= d + 1;
end
endmodule

在这里插入图片描述

创建具有高电平有效同步复位的8 D触发器。所有DFF应由clk的上升沿触发。

给定一个时钟信号clk上升沿有效,一个复位信号reset高电平有效,一个位宽为8的输入信号d,一个位宽为8的输出信号q
在这里插入图片描述

module top(d,clk,reset,q);
input[7:0] d;
input clk,reset;
output q;
reg[7:0] q;
always @(posedge clk)begin
    if(reset)
        q <= 8'd0;
    else
        q <= d;
end
module test(
    );
reg[7:0] d;
reg clk,reset;
wire[7:0] q;
top f(.d(d),.clk(clk),.reset(reset),.q(q));
initial begin
    clk <= 0;d <= 8'd13;reset <= 1;
    #15 reset <= 0;
    #35 reset <= 1;
    #15 reset <= 0;
    #10 reset <= 1;
    #25 reset <= 0;
    #10 $stop;
end
always begin
    #5 clk <= ~clk;
    #5 d <= d + 1;
end
endmodule

在这里插入图片描述

创建具有高电平有效异步复位的 8 个 D 触发器。所有DFF应由clk的上升沿触发。

在这里插入图片描述

module top(d,clk,reset,q);
input[7:0] d;
input clk,reset;
output q;
reg[7:0] q;
always @(posedge clk or negedge reset)begin
    if(!reset)
        q <= 8'd0;
    else
        q <= d;
     //异步复位的触发器(复位与寄存不能一起操作)
end
module test(
    );
reg[7:0] d;
reg clk,reset;
wire[7:0] q;
top f(.d(d),.clk(clk),.reset(reset),.q(q));
initial begin
    clk <= 1;d <= 8'd13;reset <= 1;
    #15 reset <= 0;
    #5 reset <= 1;
    #14 reset <= 0;
    #7 reset <= 1;
    #21 reset <= 0;
    #4 reset <= 1;
    #24 reset <= 0;
    #6 reset <= 1;
    #16 reset <= 0;
    #10 $stop;
end
always #5 clk <= ~clk;
always #10  d <= d + 3;;

endmodule

在这里插入图片描述

DFF+gate(Exams/m2014 q4d)

实现以下电路# 计数器
实际模块

module top(clk,in,out);
    input clk,in;
    output out;
    reg out;
    
    initial begin
        out = 0;
    end
    always@(posedge clk)
        out = in ^ out;



endmodule

模块实例化

module test(
    );
reg in,clk;
wire out;
top f(.clk(clk),.in(in),.out(out));
initial begin
    in = 0;clk = 0;
    
    #200 $stop;
end
always #10 clk = ~clk; 
always #7 in = ~in; 
endmodule

在这里插入图片描述
在这里插入图片描述

总结:
reg 不能连接到模块实例化的输出端口;
reg 不能 用作实际模块声明中的输入;

模块实例化的输出端口初始化,要在实际模块中进行

计数器

构建一个4位二进制计数器,其计数范围为0到15(含0和15),其周期为16。复位输入是同步的,应将计数器复位为0。
在这里插入图片描述

module top(clk,reset,q);
input clk,reset;
output q;
reg[3:0] q;
initial q <= 0; 
always@(posedge clk)begin
    if(reset)
        q <= 4'd0;
    else if(q == 4'd15)
        q <= 0;
    else
        q <= q + 1;
end
module test(
    );
reg clk,reset;
wire[3:0] q;
top f(.clk(clk),.reset(reset),.q(q));
initial begin
    clk <= 0;reset <= 0;
    
    #500 $stop;
end
always #5 clk <= ~clk;
always begin
    # 177 reset <= 1;
    #20 reset <= 0;
end
endmodule

在这里插入图片描述
在这里插入图片描述
建立一个十进制计数器,该计数器的计数范围为0到9(含0和9),周期为10。复位输入是同步的,应将计数器复位为0。
在这里插入图片描述

module top(clk,reset,q);
input clk,reset;
output q;
reg[3:0] q;
initial q <= 0; 
always@(posedge clk)begin
    if(reset)
        q <= 4'd0;
    else if(q == 4'd9)
        q <= 0;
    else
        q <= q + 1;
end
module test(
    );
reg clk,reset;
wire[3:0] q;
top f(.clk(clk),.reset(reset),.q(q));
initial begin
    clk <= 0;reset <= 0;
    
    #500 $stop;
end
always #5 clk <= ~clk;
always begin
    # 127 reset <= 1;
    #14 reset <= 0;
end
endmodule

在这里插入图片描述
建立一个十进制计数器,该计数器的计数范围为0到9(含0和9),周期为10。复位输入是同步的,应将计数器复位为0。我们希望能够暂停计数器,而不是总是在每个时钟周期都递增,因此,slowena输入指示计数器应何时递增。

在这里插入图片描述

module top(clk,reset,slowna,q);
input clk,reset,slowna;
output q;
reg[3:0] q;
initial q <= 0; 
always@(posedge clk)begin
    if(reset)
        q <= 4'd0;
    else if(slowna)begin
        if(q == 4'd9)
            q <= 0;
        else
            q <= q + 1;
    end
end
module test(
    );
reg clk,reset,slowna;
wire[3:0] q;
top f(.clk(clk),.reset(reset),.slowna(slowna),.q(q));
initial begin
    clk <= 0;reset <= 0;slowna <= 1;
    
    #500 $stop;
end
always #5 clk <= ~clk;
always begin
    #70 slowna <= 0;
    #10 slowna <= 1;
end
always begin
    # 127 reset <= 1;
    #14 reset <= 0;
end
endmodule

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值