FPGA學習篇——Verilog學習4

1.1 結構語句

結構語句主要是initial語句和always語句,initial 語句它在模塊中只執行一次,而always語句則不斷重復執行,以下是一個比較好解釋的圖:

(圖片來源于知乎博主羅成,畫的很好很直觀!)

1.1.1 initial語句

initial 語句它在模塊中只執行一次

它常用于測試文件的編寫,用來產生仿真測試信號(激勵信號),或者用于對存儲器變量賦初值。

語法格式:

initial begin
???
...
end

PS:當initial與語句內只有一個執行語句時,可以省略begin..end。

1.1.2 always語句

always 語句一直在不斷地重復活動,但是只有和一定的時間控制結合在一起才有作用。

語法格式:

always @ (敏感列表) begin
??? ...
end


PS:敏感列表即觸發always語句執行的條件,多個觸發條件用or連接。同樣,當always語句內只有一個執行語句時,可以省略begin..end。


always語句可用于組合邏輯也可用于時序邏輯,電平觸發往往是組合邏輯,邊沿觸發往往是時序邏輯,因此可進一步細分:

(1)電平觸發——組合邏輯:

????????這個程序表示每當信號abcdefghm的值(即電平變化)發生變化時,always塊中的所有語句都會被執行 。

?????????如果組合邏輯塊語句的輸入變量很多,可簡寫以下形式,@(*)表示對后面語句塊中所有輸入變量的變化都是敏感的(即所有變量有任何一個變化就執行always語句。)

(2)邊沿觸發——時序邏輯:

當檢測到邊沿時,執行always語句,如:

posedge 和 negedge為關鍵字,分別表示上升沿和下降沿,這個程序表示當 sys_clk為上升沿或者 sys_ret_n為下降沿時,執行always語句。

1.1.3 實例理解

?理解:

initial語句中定義了三個信號,sys_clk,sys_rst_n, touch_key,以sys_rst_n, touch_key為例,波形圖對應為第二行和第三行。以下操作只執行了一次。

  • 首先sys_rst_n, touch_key均賦值為0(程序從注釋開始算第3行和第5行);
  • 代碼第6行,延遲20ns后,sys_rst_n賦值為1,對應于波形圖中紅色線(20ns時刻)時sys_rst_n信號由低電平跳變至高電平。
  • 代碼第7行,又延遲10ns后,即30ns處(藍色線),touch_key賦值為1
  • 代碼第8~10行,touch_key類似操作。

always語句則不斷重復操作,每延遲10ns,sys_clk就取反一次,故波形圖上(第一行)對應為產生一個周期信號。

1.2 賦值語句

1.2.1? 阻塞賦值 “ = ”

????????阻塞賦值可以認為只有一個步驟的操作:即計算 RHS 并更新LHS(RHS為式子右邊,LHS為式子左邊)。
????????所謂阻塞的概念是指,在同一個always塊中:后面的賦值語句是在前一句賦值語句結束后才開始賦值的。

以上例子理解:

當clk信號為上升沿或者rest_n信號處于下降沿時,執行操作。

  • 在波形圖部分,從-6時刻開始,直接clk信號上升沿,且滿足rest_n為低電平,執行if語句,故abc分別賦值為1,2,3。
  • 然后 -6 ~ 0時刻,rest_n恒為低電平,每到clk信號上升沿,執行操作中if語句,故-6 ~ 0時刻abc值恒為1,2,3。
  • 0時刻時,rest_n跳變為高電平,是上升沿不是下降沿,故不執行操作。
  • 0時刻后,rest_n恒為高電平,clk信號第一個上升沿為2時刻,執行操作,此時不滿足if語句(rest_n為高電平),則執行else語句。由于賦值語句是在前一句賦值語句結束后才開始賦值的,故a=0執行完后,b = a = 0執行完, 在執行c = b = 0;
  • 2時刻后rest_n恒為高電平,每到clk信號上升沿,執行操作中else語句,故此后abc值都為0。

1.2.2? 非阻塞賦值 “ <=”

????????非阻塞賦值的操作過程可以看作兩個步驟:(1)賦值開始的時候,計算RHS;(2)賦值結束的時候,更新LHS
????????非阻塞賦值可以理解為:第一條非阻塞賦值語句開始時,所有非阻塞語句同時賦值計算好對應的RHS并保存放置一邊,全部計算好后,再將各自保存好的RHS傳遞到對應的LHS中。
??????? 非阻寒賦值只能用于對寄存器類型的變量進行賦值:因此只能用在initial塊和always塊等過程塊中。

以上例子與1.1.1中例子只有阻塞賦值與非阻塞賦值的區別:

同理,當clk信號為上升沿或者rest_n信號處于下降沿時,執行操作。

  • 在波形圖部分,從-6時刻開始,直接clk信號上升沿,且滿足rest_n為低電平,執行if語句,賦值語句右邊為1,2,3然后對應賦值到abc上。
  • 然后 -6 ~ 0時刻,rest_n恒為低電平,每到clk信號上升沿,執行操作中if語句,故-6 ~ 0時刻abc值恒為1,2,3。
  • 0時刻時,rest_n跳變為高電平,是上升沿不是下降沿,故不執行操作。
  • 0時刻后,rest_n恒為高電平,clk信號第一個上升沿為2時刻,執行操作,此時不滿足if語句(rest_n為高電平),則執行else語句。賦值語句右邊0,a(值為1),b(值為2)【由于此時ab值為臨近2時刻的值】,則對應將其賦值到abc上得到a=0,b=1,c=2
  • 2時刻后rest_n恒為高電平,4時刻又到了clk信號上升沿,執行操作中else語句,。賦值語句右邊0,a(值為0),b(值為1)【由于此時ab值為臨近4時刻的值】,則對應將其賦值到abc上得到a=0,b=0,c=1;
  • 2時刻后rest_n恒為高電平,6時刻又到了clk信號上升沿,執行操作中else語句。賦值語句右邊0,a(值為0),b(值為0)【由于此時ab值為臨近6時刻的值】,則對應將其賦值到abc上得到a=0,b=0,c=0;
  • 此后,abc都為0,按照非阻塞也為0了。

1.3 條件語句

條件語句必須在過程塊語句中使用,即是指由initial和always語向引導的塊語句。

1.3.1 if語句

使用方法類似于C語言。

  • 允許一定形式的簡寫, if(a) 等同于 if(a==1);if(!a) 等同于 if(a!=1)
  • if語句對表達式的值進行判斷,若為0,x,z則按假處理:若為1,按真處理:
  • if和else后面的操作語句可以用begin和end包含多個語句。
  • 允許if語句的嵌套。

1.3.2 case語句

case (<expression>)
??? case1 :???? ...
??? case2:?? ...
??? case3 :???? ...
??? case4 :???? begin
????????????????????????? <multiple statements>
??????????????????????? end
??? default: <statement>
endcase


語法解釋:

  • 其中,case1~case4這些寫的是情況1~4,或者說是看<expression>符合case1~case4的哪一種情況,對應進入執行該情況;
  • default表示如果沒有expression沒有匹配的 case 情況,執行 default 語句;
  • 看case4知,如果情況中有多個執行語句,用begin..end來寫。????

注意點:

  • 分支表達式的值互不相同(即每種情況應不同,不然編譯會出現矛盾)
  • 所有表達式的位寬必須相等不能用:bx 來代替:n'bx

除此之外還有另外兩種表達:casez...endcasecasex...endcase

casez不考慮表達式中的高阻值比較時;casex:不考慮高阻值之和不定值x。

例如:以下例子判定sel的值是否滿足以下哪種情況,情況1是8’b1100_zzzz,其中后四位“zzzz”為高阻值不用考慮,即只需要看前4位是否與sel的值相匹配;情況2是8’b1100_xxzz,后兩位才是高阻值不用考慮,看前6位是否與sel匹配。sel=1100_0011,可知前4位與情況1匹配,前6位與情況2不匹配,故進入情況1。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72573.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72573.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Linux】【網絡】UDP打洞-->不同子網下的客戶端和服務器通信(未成功版)

【Linux】【網絡】UDP打洞–>不同子網下的客戶端和服務器通信&#xff08;未成功版&#xff09; 上次說基于UDP的打洞程序改了五版一直沒有成功&#xff0c;要寫一下問題所在&#xff0c;但是我后續又查詢了一些資料&#xff0c;成功實現了&#xff0c;這次先寫一下未成功的…

【Python編程】高性能Python Web服務部署架構解析

一、FastAPI 與 Uvicorn/Gunicorn 的協同 1. 開發環境&#xff1a;Uvicorn 直接驅動 作用&#xff1a;Uvicorn 作為 ASGI 服務器&#xff0c;原生支持 FastAPI 的異步特性&#xff0c;提供熱重載&#xff08;--reload&#xff09;和高效異步請求處理。 啟動命令&#xff1a; u…

前端權限流程(基于rbac實現思想)

1. 權限控制 1.1. 實現思想 基于rbac權限控制思想實現&#xff0c;給用戶分配角色&#xff0c;給角色分配權限 給用戶分配角色業務 注意&#xff1a;上方圖片是個示例圖&#xff0c;代表給用戶分配職位(角色)&#xff0c;頁面中使用了Element-plus的el- checkbox組件…

軟件高級架構師 - 軟件工程

補充中 測試 測試類型 靜態測試 動態測試 測試階段 單元測試中&#xff0c;包含性能測試&#xff0c;如下&#xff1a; 集成測試中&#xff0c;包含以下&#xff1a; 維護 遺留系統處置 高水平低價值&#xff1a;采取集成 對于這類系統&#xff0c;采取 集成 的方式&…

python3.13安裝教程【2025】python3.13超詳細圖文教程(包含安裝包)

文章目錄 前言一、python3.13安裝包下載二、Python 3.13安裝步驟三、Python3.13驗證 前言 本教程將為你詳細介紹 Python 3.13 python3.13安裝教程&#xff0c;幫助你順利搭建起 Python 3.13 開發環境&#xff0c;快速投身于 Python 編程的精彩實踐中。 一、python3.13安裝包下…

【極客時間】瀏覽器工作原理與實踐-2 宏觀視角下的瀏覽器 (6講) - 2.5 渲染流程(上):HTML、CSS和JavaScript,是如何變成頁面的?

https://time.geekbang.org/column/article/118205 2.5 渲染流程&#xff08;上&#xff09;&#xff1a;HTML、CSS和JavaScript&#xff0c;是如何變成頁面的&#xff1f; 2.4講了導航相關的流程&#xff0c;那導航被提交后又會怎么樣呢&#xff1f; 就進入了渲染階段。 這…

小模型和小數據可以實現AGI嗎

小模型和小數據很難實現真正的 通用人工智能&#xff08;AGI, Artificial General Intelligence&#xff09;&#xff0c;但在特定任務或受限環境下&#xff0c;可以通過高效的算法和優化方法實現“近似 AGI” 的能力。 1. 為什么小模型小數據難以實現 AGI&#xff1f; AGI 需…

Android14 OTA差分包升級報kPayloadTimestampError (51)

由于VF 架構&#xff0c; 所以鏡像的打包時間可能存在偏差&#xff0c; 如 boot.img 和 客制化的一些鏡像打包 可能會在 vendor 側進行打包。 而 與system 側進行merge 時&#xff0c;時間戳比較亂&#xff0c;為了解決這個問題&#xff0c;讓時間戳進行統一。 使用adb方式驗證…

CMake學習筆記(一):工程的新建和如何將源文件生成二進制文件

cmake是我們在工作過程中比較常見的一個工具&#xff0c;該系列文章是自己用來學習的筆記。目前只是記錄下自己學習cmake的過程中的一些重要的知識點&#xff0c;其是以項目需求為導向并非完整的cmake的學習路線和系統&#xff0c;同樣也并非適合所有的人。 1.生成一個可執行文…

重定位(1)

一、重定位 1、對于有強大ROM的板子&#xff0c;他們會將上電后的程序放到指定RAM內存 2、無強大片內ROM的板子&#xff0c;自己編程序讓他知道RAM內存指定位置 指定位置&#xff1a;就是鏈接地址&#xff0c;指定哪里&#xff0c;哪里就被編譯好一塊內存用來存放上電的程序 …

自由學習記錄(41)

代理服務器的核心功能是在客戶端&#xff08;用戶設備&#xff09;和目標服務器&#xff08;網站/資源服務器&#xff09;之間充當“中介”&#xff0c;具體過程如下&#xff1a; 代理服務器的工作流程 當客戶端希望訪問某個網站&#xff08;比如 example.com&#xff09;時&…

Jadx Gui 的詳細介紹、安裝指南、使用方法及配置說明

Jadx Gui&#xff1a;安卓應用逆向分析神器 一、Jadx Gui 簡介 Jadx 是一款開源的 Android 反編譯工具&#xff0c;支持將 .apk、.aab、.dex 等文件反編譯為可讀的 Java/Kotlin 源代碼和資源文件&#xff08;如 XML、PNG&#xff09;。其特點包括&#xff1a; 圖形化界面&am…

Linux+apache之 瀏覽器訪問云服務器磁盤的圖片,通過tomcat

https://javab.blog.csdn.net/article/details/80580520 安裝tomcact 修改添加 <Context docBase"/home/wyp/images" path"/img" debug"0" reloadable"true" />修改完成后保存重啟tomcat服務。 測試訪問方式&#xff1a;http…

軟件工程與實踐(第4版 新形態) 練習與實踐1

軟件工程與實踐&#xff08;第4版 新形態&#xff09; 練習與實踐1 1.填空題 (1)程序&#xff0c;文檔 (2)系統軟件&#xff0c;支撐軟件&#xff0c;應用軟件 (3)系統方法 (4)軟件開發和維護 (5)工程的概念、原理、技術和方法 (6)實現軟件的優質高產 (7)軟件開發技術和…

基于遺傳算法的無人機三維路徑規劃仿真步驟詳解

基于遺傳算法的無人機三維路徑規劃仿真步驟詳解 一、問題定義 目標:在三維空間內,尋找從起點到終點的最優路徑,需滿足: 避障:避開所有障礙物。路徑最短:總飛行距離盡可能短。平滑性:轉折角度不宜過大,降低機動能耗。輸入: 三維地圖(含障礙物,如立方體、圓柱體)。起…

LIUNX學習-線程

線程概念 一個進程需要訪的大部分資源&#xff0c;諸如自身的代碼、數據、new\malloc的空間數據、命令行參數和環境變量、動態庫、甚至是系統調用訪問內核代碼…都是通過虛擬地址空間來訪問的。換而言之&#xff0c;進程地址空間是進程的資源窗口&#xff01;&#xff01; ? …

1.Big-endian/ little endian大端對齊、小端對齊

一、大端模式、小端模式的介紹 Little endian&#xff1a;是低位字節排放在內存的低地址端、高位字節排放在內存的高地址端。 Big-endian&#xff1a;是高位字節排放在內存的低地址端、低位字節排放在內存的高地址端。 西門子是大端模式&#xff0c;因為比如 MW100 MB100(高位…

[mybatis]resultMap詳解

resultMap Mybatis中提供了resultMap功能&#xff0c;可以將數據庫查詢結果映射到Java對象&#xff0c;用于解決 字段名與屬性名不一致 或 復雜關系&#xff08;如一對多&#xff09;的映射問題。 比如一個User類&#xff0c;在它的屬性里還有另一個子對象&#xff08;或者多…

SpringBoot Actuator

SpringBoot Actuator 一、簡介二、入門1、依賴2、默認監控指標3、查詢監控指標4、全量監控指標 三、Spring Boot Admin1、主要功能2、Admin3、Client4、應用墻5、其他 四、定制化1、定制Health端點2、定制Info端點3、定制Metrics端點4、定制Endpoint端點 一、簡介 SpringBoot自…

python標識符

在 Python 中&#xff0c;標識符&#xff08;Identifier&#xff09;是指用來標識變量、函數、類、模塊等的名稱。標識符的命名規則如下&#xff1a; 1. 標識符的命名規則 字母、數字和下劃線&#xff1a;標識符可以由字母&#xff08;a-z, A-Z&#xff09;、數字&#xff08;…