前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HDLBits:在线学习 Verilog (十八 · Problem 85-89)

HDLBits:在线学习 Verilog (十八 · Problem 85-89)

作者头像
数字积木
发布2021-04-15 11:48:41
7450
发布2021-04-15 11:48:41
举报
文章被收录于专栏:数字积木

本系列内容来自于知乎专栏,链接如下:https://zhuanlan.zhihu.com/c_1131528588117385216 本系列文章将和读者一起巡礼数字逻辑在线学习网站 HDLBits 的教程与习题,并附上解答和一些作者个人的理解,相信无论是想 7 分钟精通 Verilog,还是对 Verilog 和数电知识查漏补缺的同学,都能从中有所收获。

Problem 85 : DFF with byte enable(Dff16e)

本题中需要创建一个 16 路 D触发器。部分情况下,只需要多路触发器中的一部分触发器工作,此时可以通过 ena 使能端进行控制。使能端 ena 信号有效时,触发器在时钟上升沿工作。

byteena 使能信号以 byte 为单位管理 8 路触发器在时钟边沿触发与否。byteena [1] 作为 d[15:8] 高位字节的使能端,byteena [0] 则控制 d 的低位字节。

resetn 为同步,低电平有效复位信号。

所有的触发器在时钟上升沿被触发。

解答与分析

代码语言:javascript
复制
module top_module (
    input clk,
    input resetn,
    input [1:0] byteena,
    input [15:0] d,
    output reg [15:0] q
);

    always @(posedge clk) begin
        if(~resetn)
           q <= 16'd0;
        else if(byteena[0] || byteena[1]) begin
            if(byteena[1])
                q[15:8] <= d[15:8];
            if(byteena[0])
                q[7:0] <= d[7:0];
        end
    end
endmodule

在按照上述的思路写代码时,注意不要在判断 byteena 时将 if...if 结构写成 if..else if ..结构,这样会在 byteena = 2'b11 时产生只判断 byteena [1],忽略 byteena [0] 的逻辑错误。

本题也可以从例化的思路进行,例化16 路带有使能端的触发器,分别将 byteena 作为高 8 位与低 8 位触发器的使能信号。

从做题的角度来说,作者曾搞反了两个使能信号导致了错误,所以做题要注意细节。

Problem 86 : D latch(Exams/m2014 q4a)

本题中需要实现一个如下的电路:

从做题的角度来说,首先你得认识这个元件。同 D触发器相比,这个元件没有 clk 端口,取而代之的是 ena 端口,所以这是一个锁存器。锁存器的特征在于,相较于 D触发器的触发事件发生于 clk 时钟的边沿,锁存器锁存的触发事件发生于使能端 ena 的电平。

当你成功实现了这个锁存器时,Quartus 会提醒(祝贺)你生成了一个锁存器。锁存器相比触发器会消耗更多的资源,所以综合器会在推断出锁存器时产生提醒,防止开发者在不想使用锁存器时,因为代码风格等原因误产生了锁存器。

解答与分析

代码语言:javascript
复制
module top_module (
    input d,
    input ena,
    output reg q);
    
    always@(*)begin
        if(ena)begin
            q<=d;
        end
    end

endmodule

产生锁存器的代码很简单,不是么?因为锁存器的触发事件不是时钟,所以只有在组合逻辑中才能产生锁存器,作者曾经还就锁存器做过一番探究:

ljgibbs:Verilog 实验台(二):综合器,我想要一个锁存器zhuanlan.zhihu.com

Problem 87 : DFF (Exams/m2014 q4b)

本题中需要实现一个如下的电路:

AR 代表 asynchronous reset,所以这是一个带有异步复位的 D 触发器,我们在先前的题目中讨论过异步复位的问题。

图中的三角形代表时钟,不再用 CLK 标出。

解答与分析

代码语言:javascript
复制
module top_module (
    input clk,
    input d,
    input ar,   // asynchronous reset
    output reg q);
	
    always@(posedge clk or posedge ar)begin
        if(ar)begin
        	q <= 1'b0;
        end else begin
            q <= d;
    end
    end
    
endmodule

Problem 88 : DFF (Exams/m2014 q4c)

本题中需要实现一个如下的电路:

R 代表 synchronous reset,(就不用 SR 或者 SSR 表示了)所以这是一个带有同步复位的 D 触发器,我们在先前的题目中讨论过同步复位的问题。

解答与分析

代码语言:javascript
复制
module top_module (
    input clk,
    input d,
    input r,   // synchronous reset
    output reg q);
	
    always @(posedge clk) begin
        if(r)
            q <= 1'b0;
        else
            q <= d;
    end
endmodule

Problem 89 : DFF+gate(Exams/m2014 q4d)

本题中需要实现一个如下的电路:

图中有一个 D 触发器与一个异或门,触发器的输出 q 和输入信号 in 一起作为异或门的输入。异或门的输入作为触发器的输入 d

解答与分析

代码语言:javascript
复制
module top_module (
    input clk,
    input in,
    output reg out);
    always @(posedge clk) begin
        out <= in ^ out;
    end
endmodule

在编写 Verilog 时,使用 ^ 符号抽象实现异或门。使用异或门的输出作为触发器的输入。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数字积木 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档