【HDLBits刷題筆記】10 Counters

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

Count15 module top_module ( input clk, input reset, // Synchronous active-high reset output [3:0] q); always@(posedge clk) begin if(reset) q <= 4'd0; ...


Count15

module top_module (
    input clk,
    input reset,      // Synchronous active-high reset
    output [3:0] q);
    always@(posedge clk)
    begin
        if(reset)
            q <= 4'd0;
        else
            q <= q + 1'b1;
    end
endmodule

Count10

題目給的答案把q清零和reset放在了一個if里if (reset || q == 9)。

module top_module (
    input clk,
    input reset,        // Synchronous active-high reset
    output [3:0] q);
    always@(posedge clk)
    begin
        if(reset)
            q <= 4'd0;
        else
            q <= (q<9)?(q+1):0;
    end
endmodule

Count1to10

module top_module (
    input clk,
    input reset,
    output [3:0] q);
    always@(posedge clk)
    begin
        if(reset)
            q <= 4'd1;
        else
            q <= (q<10)?(q+1):1;
    end
endmodule

Countslow

module top_module (
    input clk,
    input slowena,
    input reset,
    output [3:0] q);
    always@(posedge clk)
    begin
        if(reset)
            q <= 4'd0;
        else if(slowena)
            q <= (q<9)?(q+1):0;
    end
endmodule

Exams/ece241 2014 q7a

這道題感覺怪怪的,一開始我寫的c_load = (Q==12)|reset;由於題目說了count4模塊中的load優先順序比enable高,所以enable為0時仍可以置數。

而題目貌似是希望load和enable不能衝突,enable為0時就不應該置數了,所以此時的load應該為0,所以我又把信號與上了一個enable。

module top_module (
    input clk,
    input reset,
    input enable,
    output [3:0] Q,
    output c_enable,
    output c_load,
    output [3:0] c_d
); //
    count4 the_counter (clk, c_enable, c_load, c_d , Q );
    assign c_d = 1;
    assign c_enable = enable;
    assign c_load = enable&(Q==12)|reset;
endmodule

Exams/ece241 2014 q7b

把三個BCD計數器級聯在一起即可。一開始我寫的c_enable[2]=(Q2==9);OneHertz=(Q3==9);而Q2、Q3都會持續多個周期,只有Q1是一個一直變的信號。

module top_module (
    input clk,
    input reset,
    output OneHertz,
    output [2:0] c_enable
); //
    wire [3:0]Q1;
    wire [3:0]Q2;
    wire [3:0]Q3;
    bcdcount counter0 (clk, reset, c_enable[0],Q1);
    bcdcount counter1 (clk, reset, c_enable[1],Q2);
    bcdcount counter2 (clk, reset, c_enable[2],Q3);
    assign c_enable[0]=1'b1;
    assign c_enable[1]=(Q1==9);
    assign c_enable[2]=(Q2==9)&&(Q1==9);
    assign OneHertz=(Q3==9)&&(Q2==9)&&(Q1==9);
endmodule

Countbcd

感覺寫的稍微有點複雜,利用了verilog里寫多個if優先下麵的語句的特點,實際不會對一個數重覆操作。

實際例化多個BCD計數器會簡單很多。

module top_module (
    input clk,
    input reset,   // Synchronous active-high reset
    output [3:1] ena,
    output [15:0] q);
    always@(posedge clk)
    begin
        if(reset)
            q <= 'd0;
        else begin
            q[3:0] <= q[3:0] + 1;
            if(ena[1])begin
                q[3:0] <= 0;
                q[7:4] <= q[7:4]+1;
            end
            if(ena[2])begin
                q[3:0] <= 0;
                q[7:4] <= 0;
                q[11:8] <= q[11:8]+1;
            end
            if(ena[3])begin
                q[3:0] <= 0;
                q[7:4] <= 0;
                q[11:8] <= 0;
                q[15:12] <= (q[15:12]<9)?q[15:12] +1:0;
            end
        end
    end
    assign ena[1] = (q[3:0]==9);
    assign ena[2] = (q[7:4]==9)&&ena[1];
    assign ena[3] = (q[11:8]==9)&&ena[2];
endmodule

Count clock

這道題稍微有點複雜,難度也不算特別大,但是需要耐心debug,把情況全部考慮清楚。

我提交了五次才通過,可惡。

module top_module(
    input clk,
    input reset,
    input ena,
    output reg pm,
    output reg[7:0] hh,
    output reg[7:0] mm,
    output reg[7:0] ss); 
    
    always@(posedge clk)
    begin
        if(reset)begin
            pm <= 1'b0;
            hh <= {4'd1,4'd2};
            mm <= 0;
            ss <= 0;
        end
        else if(ena)begin
            ss[3:0] <= ss[3:0] +1'b1;
            if(ss[3:0] == 9)begin
                ss[3:0] <= 'd0;
                ss[7:4] <= (ss[7:4]==5)?0:(ss[7:4]+1);
            end
            if(ss[3:0] == 9&&ss[7:4] == 5)begin
                if(mm[3:0]<9)
                    mm[3:0] <= mm[3:0] + 1;
                else begin
                    mm[3:0] <= 'd0;
                    mm[7:4] <= (mm[7:4]==5)?0:(mm[7:4]+1);
                end
            end
            if(ss[3:0] == 9&&ss[7:4] == 5&&mm[3:0] == 9&&mm[7:4] == 5)begin
                if(hh[3:0]<9&&hh[7:4] == 0)
                    hh[3:0] <= hh[3:0] + 1;
                else if(hh[3:0]<2&&hh[7:4] == 1)
                    hh[3:0] <= hh[3:0] + 1;
                else begin
                    if(hh[7:4] == 1)
                        hh[3:0] <= 'd1;//註意這裡是1
                    else
                        hh[3:0] <= 'd0;
                    hh[7:4] <= (hh[7:4]==1)?0:1;
                end                
            end
            if(ss[3:0] == 9&&ss[7:4] == 5&&mm[3:0] == 9&&mm[7:4] == 5&&hh[3:0]==1&&hh[7:4]==1)
                pm<=~pm;
        end
    end

endmodule

 


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

-Advertisement-
Play Games
更多相關文章
  • 1.4 超鏈接 1.4.1 基礎語法 基礎語法: <a href="網頁地址"> </a> 拓展參數: <a href="網頁地址" target="跳轉方式"> </a> | href | 跳轉鏈接地址 | | | | | target | 鏈接打開方式 | 1.4.2 錨鏈接(id參數) 每個標 ...
  • 為了提高系統吞吐率,也就是提高生產效率,核心觀點如下,系統設計也是如此 在微服務或任何其他基於事件的架構(event-driven-architecture)中,在一些用例中,一個服務可能需要我們對他們自己的本地資料庫進行修改,同時發佈一個事件。然後,該事件會被其他服務所消費。為了擁有一個一致的軟體 ...
  • 您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 之前說過,AQS(抽象隊列同步器)是Java鎖機制的底層實現。既然它這麼優秀,是騾子是馬,就拉出來溜溜吧。 首先用重入鎖來實現簡單的累加,就像這樣: /** * 用重入鎖實現累加 * * @author 湘王 */ public class M ...
  • 前提 java version "1.8.0_25" 池簡述 軟體開發活動中,我們經常會聽到資料庫連接池、記憶體池、線程池等各種“池”概念,這些“池”到底是什麼東西呢?程式的世界里,我們可以將池簡單的理解為一種容器類數據結構,比如列表。程式處理信息的過程中,可能會依賴某些資源或者對象(暫且統一稱之為對 ...
  • 概念: 責任鏈模式又叫做職責鏈模式,是屬於行為型的一種。 責任鏈模式分為兩種: 第一種像工廠流水線,目的就讓每一個環節都進行處理。 第二種像層層審批,如果其中一個對象無法處理,調用下一個對象來進行處理,如果一旦能處理,鏈式就此停止,以此類推,第二種為了程式的健壯性,至少得需要一個兜底的模塊,防止穿透 ...
  • 前言 在併發編程中,當多個線程同時訪問同一個共用的可變變數時,會產生不確定的結果,所以要編寫線程安全的代碼,其本質上是對這些可變的共用變數的訪問操作進行管理。導致這種不確定結果的原因就是可見性、有序性和原子性問題,Java 為解決可見性和有序性問題引入了 Java 記憶體模型,使用互斥方案(其核心實現 ...
  • 前言 最近在調研 小米開放平臺 API 的能力,發現能力支持的實在有點少,沒辦法只能另闢蹊徑去逆向 Consule UI 的能力。 逆向工程最重要解決的就是“認證”。有沒有辦法自動登錄鑒權,或者使用一個長久可靠、可續期的 token,直接決定了該 Consule UI 是否可逆向。 逆向工程-認證 ...
  • 我們都知道,我們寫的Java程式需要先經過編譯,生成了.class文件(位元組碼文件)。然而,電腦並不能直接解釋.class文件裡面的內容,這時候就需要一個能載入、解釋.class文件並且能按.class文件里的內容進行處理的一個東西--JVM。 JVM,就是Java虛擬機。它是一種規範,有針對不同 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...