【HDLBits刷題筆記】09 Latches and Flip-Flops

来源:https://www.cnblogs.com/magnolia666/archive/2022/10/29/16839315.html
-Advertisement-
Play Games

Dff 這一節終於開始時序電路了。首先是一個用的最多的D觸發器。 module top_module ( input clk, // Clocks are used in sequential circuits input d, output reg q );// // Use a clocked ...


Dff

這一節終於開始時序電路了。首先是一個用的最多的D觸發器。

module top_module (
    input clk,    // Clocks are used in sequential circuits
    input d,
    output reg q );//

    // Use a clocked always block
    //   copy d to q at every positive edge of clk
    //   Clocked always blocks should use non-blocking assignments
    always@(posedge clk)
    begin
       q <= d; 
    end

endmodule

Dff8

8位D觸發器,寫法和上一題是一樣的。

module top_module (
    input clk,
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk)
    begin
        q <= d;
    end

endmodule

Dff8r

帶同步高電平複位的D觸發器。

module top_module (
    input clk,
    input reset,            // Synchronous reset
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk)
    begin
        if(reset)
            q <= 'd0;
           else
            q <= d;
    end

endmodule

Dff8p

註意這道題觸發器是下降沿觸發。

module top_module (
    input clk,
    input reset,
    input [7:0] d,
    output [7:0] q
);
    always@(negedge clk)
    begin
        if(reset)
            q <= 'h34;
        else
            q <= d;        
    end

endmodule

Dff8ar

這道題是非同步複位,把areset寫在敏感事件列表即可。

module top_module (
    input clk,
    input areset,   // active high asynchronous reset
    input [7:0] d,
    output [7:0] q
);
    always@(posedge clk or posedge areset)
    begin
        if(areset)
            q <= 'd0;
        else
            q <= d;
    end
endmodule

Dff16e

這題多了一個位元組使能信號,只有對應的位元組使能才能寫入,否則維持當前的值。

module top_module (
    input clk,
    input resetn,
    input [1:0] byteena,
    input [15:0] d,
    output [15:0] q
);
    always@(posedge clk)
    begin
        if(~resetn)
            q <= 'd0;
        else
            q <= {byteena[1]?d[15:8]:q[15:8],byteena[0]?d[7:0]:q[7:0]};        
    end
endmodule

Exams/m2014 q4a

這題要求使用一個latch,latch是電平觸發的觸發器,當ena信號為高電平時輸入會傳遞給輸出,這樣的缺點是毛刺(glitch)會逐級傳遞,所以應儘量避免綜合出不必要的latch,這一點在前面if和case語句中提到過。

提示中告訴了這裡應該使用非阻塞賦值,因為其仍然是時序電路。

module top_module (
    input d, 
    input ena,
    output q);
    always@(*)
    begin
        if(ena)
            q<=d;
    end
endmodule

Exams/m2014 q4b

module top_module (
    input clk,
    input d, 
    input ar,   // asynchronous reset
    output q);
    always@(posedge clk or posedge ar)
    begin
        if(ar)
            q <= 'd0;
        else
            q <= d;
    end
endmodule

Exams/m2014 q4c

總放些重覆的題有點浪費時間。。。

module top_module (
    input clk,
    input d, 
    input r,   // synchronous reset
    output q);
    always@(posedge clk)
    begin
        if(r)
            q <= 'd0;
        else
            q <= d;
    end
endmodule

Exams/m2014 q4d

module top_module (
    input clk,
    input in, 
    output out);
    always@(posedge clk)
    begin
        out <= in^out;
    end
endmodule

Mt2015 muxdff

這道題只要寫出一個子模塊即可。

module top_module (
    input clk,
    input L,
    input r_in,
    input q_in,
    output reg Q);
    always@(posedge clk)
    begin
        Q <= L?r_in:q_in;
    end
endmodule

Exams/2014 q4a

同樣也是寫一個子模塊。

module top_module (
    input clk,
    input w, R, E, L,
    output Q
);
    always@(posedge clk)
    begin
        Q <= L?R:(E?w:Q);
    end
endmodule

Exams/ece241 2014 q4

根據RTL視圖直接寫代碼就可以了。

module top_module (
    input clk,
    input x,
    output z
); 
    reg [2:0]Q=3'd0;
    always@(posedge clk)
    begin
        Q[0] <= x^Q[0];
        Q[1] <= x&~Q[1];
        Q[2] <= x|~Q[2];
    end
    assign z=~|Q;
endmodule

Exams/ece241 2013 q7

使用verilog實現一個JK觸發器。

module top_module (
    input clk,
    input j,
    input k,
    output reg Q); 
    always@(posedge clk)
    begin
        case({j,k})
            2'b00:Q<=Q;
            2'b01:Q<=1'b0;
            2'b10:Q<=1'b1;
            2'b11:Q<=~Q;
        endcase
    end
endmodule

Edgedetect

用了兩個always,其實和答案是一樣的。

module top_module (
    input clk,
    input [7:0] in,
    output reg[7:0] pedge
);
    reg [7:0] in_r;
    always@(posedge clk)
    begin
        in_r <= in;
    end
    always@(posedge clk)
    pedge <= in&~in_r;
endmodule

Edgedetect2

和上一題思路是一樣的,區別是邏輯改為異或。

module top_module (
    input clk,
    input [7:0] in,
    output reg[7:0] anyedge
);
    reg [7:0] in_r;
    always@(posedge clk)
    begin
           in_r <= in;
        anyedge <= in_r^in;
    end

endmodule

Edgecapture

capture和detect區別:capture會保持1,直到reset。

out <= (~in&in_r)|out;代表只有1會傳遞到out,從而達到保持的作用。

module top_module (
    input clk,
    input reset,
    input [31:0] in,
    output reg[31:0] out
);
    reg [31:0] in_r;
    always@(posedge clk)
    begin
        in_r <= in;
        if(reset)
            out <= 'd0;
        else if(~in&in_r)
            out <= (~in&in_r)|out;
    end

endmodule

Dualedge

要求寫一個雙邊沿觸發器,題目已經告訴了@(posedge clk or negedge clk)的寫法是不被允許的。

這題確實沒想到好的方法,我的寫法可能會產生毛刺,因為在邊沿的時候q_p和q_n需要時間跳變,這個時候輸出就可能有問題,當然,這樣模擬還是能通過的,但實際電路中不能這樣寫。

題目給的答案非常巧妙,上升沿時p變為d^n,所以輸出q = (p^n) = (d^n^n) = d,下降沿同理。

我的答案:

module top_module (
    input clk,
    input d,
    output q
);
    reg q_p,q_n;
    always@(posedge clk)
        q_p <= d;
    always@(negedge clk)
        q_n <= d;
    assign q = clk?q_p:q_n;
endmodule

標準答案:

module top_module(
    input clk,
    input d,
    output q);
    
    reg p, n;
    
    // A positive-edge triggered flip-flop
    always @(posedge clk)
        p <= d ^ n;
        
    // A negative-edge triggered flip-flop
    always @(negedge clk)
        n <= d ^ p;
    
    // Why does this work? 
    // After posedge clk, p changes to d^n. Thus q = (p^n) = (d^n^n) = d.
    // After negedge clk, n changes to d^p. Thus q = (p^n) = (p^d^p) = d.
    // At each (positive or negative) clock edge, p and n FFs alternately
    // load a value that will cancel out the other and cause the new value of d to remain.
    assign q = p ^ n;
    
    
    // Can't synthesize this.
    /*always @(posedge clk, negedge clk) begin
        q <= d;
    end*/
    
    
endmodule

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 大家好,我是陶朱公Boy. 今天跟大家分享一款基於“生產者消費者模式”下實現的組件。 該組件是作者偶然在翻閱公司一中間件源碼的時候碰到的,覺得設計的非常精美、巧妙,花了點時間整理成文分享給大家。 ...
  • 2022-10-29 一、web中的兩個介面: (1)ServletConfig: 說明:每當有一個servlet對象時,就會有唯一 一個servletConfig配置文件對象 功能:能獲得Servlet名稱(該名稱是web.xml中配置的servlet-name的值),使用方法:如下,可寫在 創建 ...
  • python版本:python 3.9 libpcap版本:1.11.0b7 python libpcap庫是底層綁定c語言libpcap庫的開發包,旨在提供python應用可訪問的unix c libpcap庫API(以及為win32系統提供的Npcap、WinPcap),直接使用底層c代碼,性能 ...
  • 同源策略介紹 同源策略(Same origin policy)是一種約定,它是瀏覽器最核心也最基本的安全功能,如果缺少了同源策略,則瀏覽器的正常功能可能都會受到影響。可以說Web是構建在同源策略基礎之上的,瀏覽器只是針對同源策略的一種實現 請求的url地址,必須與瀏覽器上的url地址處於同域上,也就 ...
  • 2022-10-29 Servlet 1、 Servlet的作用: 例如:查詢數據 (1)瀏覽器端點擊某個查詢功能,向伺服器端發出請求;伺服器端解析請求,創建Servlet對象,並調用特定方法;Servlet對象調用“DAO”方法獲取數據;DAO方法查詢資料庫。 (2)之後將後端的處理數據傳遞給“前 ...
  • 各位好啊,我是會編程的蝸牛,作為java開發者,對於各類java開發技術、開發框架肯定是多少都要瞭解和知道的。 但是作為已經發展了幾十年的java開發生態,各類技術層出不窮,有的新技術新框架已經對舊技術舊框架產生了顛覆性的影響,當然還有一些舊技術壓根就沒流行過。今天我們來看下Java那些可以放棄的技... ...
  • CSS 1.css介紹 css指的是層疊樣式表(cascading style sheets) 官方文檔:https://www.w3school.com.cn/css/index.asp 為什麼需要css? 在沒有css之前,我們想要修改html元素的樣式需要為每個html元素單獨定義樣式屬性,費 ...
  • 原文鏈接:https://www.zhoubotong.site/post/86.html 這裡介紹下介面interface嵌套的用法,大家知道Go語言中不僅僅結構體與結構體之間可以嵌套,介面與介面之間也可以嵌套,通過介面的嵌套我們可以定義出新的介面。 Golang 的介面嵌套,其實也就是一個介面里 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...