Verilog_Day2

来源:https://www.cnblogs.com/fishpoint/archive/2018/02/28/8485379.html
-Advertisement-
Play Games

Verilog_Day1 在CSDN博客上。http://blog.csdn.net/m0_38073085 第三章: 書上基本知識 每個Verilog程式包括4個主要部分:埠定義,I/O說明,內部信號聲明和功能定義。 input/output/inout都預設是wire型而不是reg型變數。 1 ...


Verilog_Day1 在CSDN博客上。http://blog.csdn.net/m0_38073085

 

第三章:

書上基本知識

  • 每個Verilog程式包括4個主要部分:埠定義,I/O說明,內部信號聲明和功能定義。
  • input/output/inout都預設是wire型而不是reg型變數。
  •  1 module block(a,b,c,d);  // 埠定義
     2 input a,b; // 輸入口說明
     3 output c,d; // 輸出口說明
     4 
     5 reg [2:0] e; // 內部信號說明 [2:0] 表示3位信號
     6 
     7 assign c=a|b; // 功能定義  1.用assign申明語句
     8 and #2 u1(e,c,d); //     2.用實例元件  #2表示延時2單位時間
     9 always @(c or e)
    10 begin
    11 
    12 end          //          3.用always語句
    13 endmodule

    在實例元件使用中,and  #2 u1()可以看成是調用了一個名為u1的and內置模塊。

  • 採用“assign"語句是描述組合邏輯最常用的方法之一。而"always"塊既可以用於描述組合邏輯,也可描述時序邏輯。
  • 在"always"模塊內,邏輯是按照指定的順序執行的。  (?)
  • 只有連續賦值語句(即用關鍵詞assign引出的語句)和實例應用語句(即用已定義的模塊名引出的語句),可以獨立於過程塊而存在於模塊的功能定義部分。
問題1:begin - end 語句內是順序執行還是併列執行,alwatys內部語句執行順序是不是一定是順序執行,而不是取決於if-else?
  • 在數字電路中,x代表不定值,z代表高阻值。z還有一種表示方法是可以寫作“?”。
  • 高阻,數字電路里常見的術語,又叫高阻態,指的是電路的一種輸出狀態,既不是高電平也不是低電平。

    高阻態是一個數字電路里常見的術語,指的是電路的一種輸出狀態,既不是高電平也不是低電平,如果高阻態再輸入下一級電路的話,對下級電路無任何影響,和沒接一樣,如果用萬用表測的話有可能是高電平也有可能是低電平,隨它後面接的東西定。

    高阻態的實質:

    電路分析時高阻態可做開路理解。你可以把它看作輸出(輸入)電阻非常大。他的極限可以認為懸空。也就是說理論上高阻態不是懸空,它是對地或對電源電阻極大的狀態。而實際應用上與引腳的懸空幾乎是一樣的。

    高阻態的意義:

    當門電路的輸出上拉管導通而下拉管截止時,輸出為高電平;反之就是低電平;如上拉管和下拉管都截止時,輸出端就相當於浮空(沒有電流流動),其電平隨外部電平高低而定,即該門電路放棄對輸出端電路的控制 。

    單片機引腳複位後P口的所有引腳都是高阻輸入什麼是“高阻”?

    高阻 簡言之就是 輸入輸出電阻都相當大,相當於隔離狀態。處在高阻態的三態門是與匯流排隔離開的,這樣匯流排可以同時被其他電路占用。

    高阻:從邏輯器件內部電路結構來說,就是其輸出電阻很大,該狀態即不是高電平,也不是低電平。當三態門處於高阻態時,無論該門的輸入如何變化,都不會對其輸出有貢獻。

  • 負數的表示方法: -8‘d5    只能放在最前面。
  • 可以在長數字中使用下劃線分隔開數以提高程式的可讀性。
  • 在verilog中用parameter來定義常量,即用parameter來定義一個標識符代表一個常量,稱為符號常量。              eg:   parameter byte=8,byte_msb=byte-1,delay=(byte+byte_msb)/2; 

 

兩種參數傳遞方法

 

下麵是一個參數傳遞實例:

module Decode(s,A,F);
    input s;
    parameter Width=2,Polarity=2;
    output A,F;
    reg A,F;
    always @(s)
    if(! s) A=Width%2;
    else F=Polarity%2;
endmodule

module Top;
    reg clock;
    wire A4,A5,F16,F32;
    initial
    begin
    clock=0;
    end
    always #50 clock=~clock;
    always @(posedge clock)
    begin
    end    
    Decode #(3,3)  D1(clock,A4,F16);
    Decode #(3)  D2(clock,A5,F32);
endmodule

 

代碼表示如果參數傳遞不成功,最後輸出應該都為0,如果都傳遞成功,最後A4,F16,A5輸出為1;F32輸出為0.

 

最後結果輸出如下圖:

可以看出參數傳遞成功。

編程過程中的幾個問題:

  1.   把always @(posedge clock)   begin end 註釋掉也沒有問題;
  2.        本來想在Decode模塊中通過reg [Width]  A;將輸出的A4,A5的數據長度也進行改變。但是最後沒有成功。 不報錯,但還是1位。
  3.       在Decode模塊中要使用功能定義模塊。不然輸出全是不定態。
  4.        在wave視窗,使用 a 快捷鍵可以顯示多個觀察時間點。
  5.        reg A,F; 不能省。不然會報錯:Illegal reference to net "A".        因為 A 和 F 在always模塊內被賦值。需要使用 reg 型數據。

另一種參數傳遞可以通過defparam命令來實現。

module Decode(s,A,F);
    input s;
    parameter Width=2,Polarity=2;
    output A,F;
    reg F;
    reg [Width:0] A;
    always @(s)
    if(! s) A=Width%2;
    else F=Polarity%2;
endmodule

module Top;
    reg clock;
    wire A4,A5,F16,F32;
    initial
    begin
    clock=0;
    end
    always #50 clock=~clock;
    //always @(posedge clock)
    //begin
    //end    
    Decode #(3,3)  D1(clock,A4,F16);
    Decode     D2(clock,A5,F32);   // 這裡直接產生Decode的D2。內部參數不變。
    defparam   // 用defparam來改變參數。
    Top.D2.Width=3;  //  是Width, 不是A或者是A5。
endmodule

 

最後模擬結果不變。

總結:可以通過兩種方法來改變module裡面的參數型常量。   第一種是直接在生成一個實例時進行參數更改;第二種是用defparam在生成實例後再進行更改。

 網路數據類型(wire,tri)與reg型的一般區別

  • 網路數據類型表示結構實體例如門之間的物理連接。常用的網路數據類型包括wire型和tri型。網路數據類型的變數不能儲存值,而且必須受到驅動器(例如門和連續賦值語句,assign)的驅動。
  • wire型變數通常是用來表示單個門驅動或連續賦值語句驅動的網路數據類型,tri 型變數則用來表示多驅動器驅動的網路數據。
  • 如果沒有驅動器連接到網路類型(wire,tri)的變數,則該變數就是高阻(z)。    reg 型的變數預設為不定值x
  • 在”always"模塊內被賦值的每一個信號都必須是reg型。
  • 註意:reg 型只表示被定義的信號將用在”always“模塊內。

reg型數據與memory型數據的相似與區別

  • verilog通過對 reg 型變數建立數組來對存儲器建模,可以描述RAM型存儲器,ROM存儲器和reg文件。    在verilog 中沒有多維數組存在。數組的維數不能大於2。
  • memory 型數據是通過擴展 reg 型數據的地址範圍來生成的。 eg: reg [7:0] mema[255:0]   定義了一個名為mema的存儲器,包含有256個8位存儲器。 註意:第二個括弧的表達式必須是是常數表達式。
  • reg [n-1:0] rega;   //一個n為存儲器。   可以使用   rega=0; 進行賦值
  • reg  mema [n-1,0];   // 一個由n個1位存儲器構成的存儲器組。   不能用 mema=0; 進行賦值。 類似於C中的數組。
  • 讀多位的memory型,可以用  reg[7:0] mema[255:0];  mema[56][2]; 。 先找到56號8位存儲器,再讀該8位存儲器的第二位。
  • 註意存儲器屬於寄存器數組類型。線網數據類型沒有相應的存儲器類型。

 

.運算符、表達式

  •  進行取模運算時,結果值的符號為採用模運算式里第一個操作數的符號位。 eg:  -10%3 = -1 ;  11%-3 = 2;
  • 位運算符:

      1.   ~      // 取反
      2.   &     // 按位與
      3.   |      // 按位或
      4.   ^     // 按位異或  
      5.   ^~  // 按位同或     

 

 

 

    


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

-Advertisement-
Play Games
更多相關文章
  • 之前寫過一篇博客《Spring+Mybatis+Mysql搭建分散式資料庫訪問框架》描述如何通過Spring+Mybatis配置動態數據源訪問多個資料庫。但是之前的方案有一些限制(原博客中也描述了):只適用於資料庫數量不多且固定的情況。針對資料庫動態增加的情況無能為力。 下麵講的方案能支持資料庫動態 ...
  • jdk1.8.0_144 AbstractMap抽象類實現了一些簡單且通用的方法,本身並不難。但在這個抽象類中有兩個方法非常值得關註,keySet和values方法源碼的實現可以說是教科書式的典範。 抽象類通常作為一種骨架實現,為各自子類實現公共的方法。上一篇我們講解了Map介面,此篇對Abstra ...
  • github 的使用教程(非常詳細的小白視頻)鏈接如下: http://yun.itheima.com/course/209.html Git 詳細使用手冊鏈接如下: https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%85%B3%E4%BA% ...
  • 最近開始接觸matplotlib, 1.首先安裝matplotlib庫和其依賴的一些其他庫,例如:numpy,scipy和pandas等 2.開始進行簡單的編碼工作,併在PyCharm中運行,出現如下錯誤: 解決步驟如下: 前提: 1.導入正確版本的matplotlib庫 2.代碼最後調用matpl ...
  • 因為啟動tomcat有時候操作不當會出現8080被占用的情況 之前一直按百度經驗來,很麻煩 然而2條命令就可以解決 netstat ano|findstr 8080 說明:查看占用8080埠的進程 //pid 是10776 taskkill /pid 10776 /f 說明,運行windows自帶 ...
  • 我之前的文章已經改造了自定義MVC框架中的工具類(驗證碼,圖片上傳,圖像處理,分頁)4個類,接下來,就要改造模型類,模型類肯定要連接資料庫,由於我的Ubuntu Linux是裸裝的php(目前只編譯了一個gd擴展),所以需要編譯安裝mysql,並把它編譯成擴展,這裡,我選用5.7版本帶boost的源 ...
  • 1、什麼是類的載入 類的載入指的是將類的.class文件中的二進位數據讀入到記憶體中,將其放在運行時數據區的方法區內,然後在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數據結構。類的載入的最終產品是位於堆區中的Class對象,Class對象封裝了類在方法區內的數據結構,並向程 ...
  • 感想 該項目是目前為止,我寫過代碼量最多的項目了.....雖然清楚是沒有含金量的【跟著視頻來寫的】,但感覺自己也在進步中...... 寫的過程中,出了不少的問題.....非常多的Servlet,JSP看得眼花..... 現在,想把該項目好好梳理一下要點,於是有了這篇博文.... E R圖 該項目涉及 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...