写出一个包含触发器和多路选择器的子模块

描述

题目说明

考虑下面的时序电路:

触发器

图片来自HDLBits

我们用3个包含触发器和多路选择器的子模块来实现图中电路。题目要求我们写出包含一个触发器和一个多路选择器的子模块。

模块端口声明

 

module top_module (
 input clk,
 input L,
 input r_in,
 input q_in,
 output reg Q);

 

题目解析

题目只要求我们写出包含一个触发器和一个多路选择器的子模块,所以不需要看整张图片,看图片前部分即可。

触发器

 

module top_module (
 input logic clk,
 input logic L,
 input logic r_in,
 input logic q_in,
 output logic Q);

    always_ff@(posedge clk) begin
        if(L) Q <= r_in ;
        else  Q <= q_in ;
    end
endmodule


触发器

 

点击Submit,等待一会就能看到下图结果:

触发器

注意图中无参考波形。

这一题就结束了。

Problem 91-2014_q4a

题目说明

考虑如下所示 的n位移位寄存器电路:

触发器

图片来自HDLBits

如上图所示,还是实现包含选择器和触发器的部分。

模块端口声明

 

module top_module (
    input clk,
    input w, R, E, L,
    output Q
);

 

题目解析

还是实现包含选择器和触发器的部分。

 

module top_module (
    input logic clk,
    input logic w, R, E, L,
    output logic Q
);
    always_ff@(posedge clk) begin
        casex({E,L})
            2'b00: Q <= Q ;
            2'bx1: Q <= R ;
            2'b10: Q <= w ;
        endcase
    end

endmodule

触发器

 

点击Submit,等待一会就能看到下图结果:

触发器

注意图中无参考波形。

这一题就结束了。

Problem 92-ece241_2014_q4

题目说明

如下图所示的状态机,假设D触发器在状态机启动之前初始化为0,实现该电路:

触发器 图片来自HDLBits

模块端口声明

 

module top_module (
    input clk,
    input x,
    output z
); 

 

题目解析

首先先写出组合电路中逻辑,然后再写时序电路逻辑即可。

 

module top_module (
    input logic clk,
    input logic x,
    output logic z
); 
    var logic Q1,Q2,Q3 ,D1,D2,D3 ;
    
    always_comb begin
        D1 = x^Q1  ;
        D2 = x&~Q2 ;
        D3 = x|~Q3 ;
        
        z  = ~(Q1|Q2|Q3) ;
    end
    
    always_ff@(posedge clk) begin
        Q1 <= D1 ;
        Q2 <= D2 ;
        Q3 <= D3 ;
    end

endmodule


触发器

 

点击Submit,等待一会就能看到下图结果:

触发器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 93-ece241_2013_q7

题目说明

JK 触发器真值表如下。实现一个 JK 触发器。注意:Qold 是正时钟沿之前 D 触发器的输出。

触发器

图片来自HDLBits

模块端口声明

 

module top_module (
    input clk,
    input j,
    input k,
    output Q); 

 

题目解析

这道题目要求是根据真值表写出逻辑表达式,当然也可以直接根据特性方程写出逻辑。

JK触发器的特性方程如下:

触发器

触发器

 

module top_module (
    input logic clk,
    input logic j,
    input logic k,
    output logic Q); 

    var logic D ;
    always_comb begin
        case({j,k})
            2'b00: D = Q  ;
            2'b01: D = '0 ;
            2'b11: D = ~Q ;
            2'b10: D = '1 ;
        endcase
    end
    
    always_ff@(posedge clk) begin
        Q <= D;
    end
endmodule


触发器

 

点击Submit,等待一会就能看到下图结果:

触发器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 94-Edgedetect

题目说明

对于 8 位向量中的每一位,检测输入信号何时从一个时钟周期的 0 变为下一个时钟周期的 1(类似于上升沿检测)。输出位应在发生 0 到 1 转换后的周期内。

下图给我们展示了输入in[1]和输出pedge[1]的时序关系图:

触发器

图片来自HDLBits

模块端口声明

 

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] pedge
);

 

题目解析

查看:

https://blog.csdn.net/qq_31799983/article/details/81544707

 

module top_module (
    input logic clk,
    input logic [7:0] in,
    output logic[7:0] pedge
);
    wire logic [7:0] in_reg_n ,in_reg_l ;
    
    always_ff@(posedge clk) begin
        in_reg_n <= in ;
        in_reg_l <= in_reg_n ;
    end
    
    assign pedge = in_reg_n&~in_reg_l ;


endmodule

触发器

 

点击Submit,等待一会就能看到下图结果:

触发器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 95-Edgedetect2

题目说明

在一个8bit的变量中,从一个周期到另一个周期期间,检测输入信号变化。即上升沿变化或下降沿变化。输出应在0变为1后产生。

如下图所示为输入与输出的时序关系

触发器

图片来自HDLBits

模块端口声明

 

module top_module (
    input clk,
    input [7:0] in,
    output [7:0] anyedge
);

 

题目解析

双边沿检测,在上一题基础上加上下降沿检测即可。

 

module top_module (
    input logic clk,
    input logic [7:0] in,
    output logic [7:0] anyedge
);

    wire logic [7:0] in_reg,edge_flag ;
    
    always_ff@(posedge clk) begin
        in_reg <= in ;
    end
    
    assign edge_flag = in&~in_reg | ~in&in_reg ;
    
    always_ff@(posedge clk) begin
        anyedge <= edge_flag ;
    end
endmodule



触发器

 

点击Submit,等待一会就能看到下图结果:

触发器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 96-Edgecapture

题目说明

对于 32 位向量中的每一位,在输入信号从一个时钟周期的 1 变为下一个时钟周期的 0 时进行捕捉。“捕获”表示输出将保持为 1,直到寄存器复位(同步复位)。

每个输出位的行为类似于 SR 触发器:输出位应在 1 到 0 转换发生后的周期设置(为 1)。当复位为高电平时,输出位应在正时钟沿复位(为 0)。

如果上述两个事件同时发生,则复位优先。在下面示例波形的最后 4 个周期中,“reset”事件比“set”事件早一个周期发生,因此这里不存在冲突。

在下面的示例波形中,为清楚起见,reset、in[1] 和 out[1] 被突出显示。

触发器

图片来自HDLBits

模块端口声明

 

module top_module (
    input clk,
    input reset,
    input [31:0] in,
    output [31:0] out
);

 

题目解析

 

module top_module (
    input logic clk,
    input logic reset,
    input logic [31:0] in,
    output logic [31:0] out
);
    
    var logic [31:0] capture , in_reg ;

    always_ff@(posedge clk) begin
        if(reset) out <= '0;
        else
                  out <= capture ;
    end
    
    always_ff@(posedge clk) begin
           in_reg <= in ;
    end
    
    assign capture = ~in & in_reg | out;
endmodule

触发器

 

点击Submit,等待一会就能看到下图结果:

触发器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

Problem 97-Dualedge

题目说明

熟悉在时钟上升沿或时钟下降沿触发的触发器。在时钟的两个边沿触发双边触发触发器。

但是,FPGA 没有双边触发触发器,并且不接受 @(posedge clk or negedge clk)作为合法的敏感度列表。

构建一个功能类似于双边触发触发器的电路:

(注意:不一定完全等效:触发器的输出没有毛刺,但模拟这种行为的更大组合电路可能。)

触发器

图片来自HDLBits

模块端口声明

 

module top_module (
    input clk,
    input d,
    output q
);

 

题目解析

无法在 FPGA 上创建双边触发触发器。但是可以同时创建正沿触发和负沿触发触发器。

 

module top_module (
    input logic clk,
    input logic d,
    output logic q
);
    var logic temp1,temp2 ;
    always_ff@(posedge clk) begin
        temp1 <= d^temp2 ;
    end
    
    always_ff@(negedge clk) begin
        temp2 <= d^temp1 ;
    end
    
    assign q = temp1^temp2 ;

endmodule

触发器

 

点击Submit,等待一会就能看到下图结果:

触发器

注意图中的Ref是参考波形,Yours是你的代码生成的波形,网站会对比这两个波形,一旦这两者不匹配,仿真结果会变红。

这一题就结束了。

总结

今天的几道题就结束了,对于理解触发器的非常有帮助,而且难度稍微增加了,对于阅读波形设计逻辑非常有帮助。





审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分