HDLBits: 在線學習 SystemVerilog(五)-Problem 19-23
HDLBits 是一組小型電路設計習題集,使用 Verilog/SystemVerilog 硬件描述語言 (HDL) 練習數字硬件設計~
網址如下:
https://hdlbits.01xz.net/
關于HDLBits的Verilog實現可以查看下面專欄:
https://www.zhihu.com/column/c_1131528588117385216
縮略詞索引:
SV:SystemVerilog
Problem 19-Module
從這題開始會接觸到一個“熟悉的陌生人”-模塊module
截止目前,我們已經對 Verilog 中模塊這一概念建立了初步的印象:模塊是一個電路,通過輸入輸出端口和外部的電路聯系。無論多大,多復雜的數字電路都是由一個個模塊以及其他組成部分(比如 assign 賦值語句以及 always 過程塊)互相連接所構成的。在一個模塊中可以例化下一級的模塊,這就形成了層級的概念(hierarchy)。
模塊例化的基本語法 :模塊名 實例名(定義連接 port 的信號);
比如 mod_a instance1 ( wa, wb, wc );
模塊信號連接的三種方式:
在實例化模塊時,使用Verilog時有兩種常用的方式來進行模塊端口的信號連接:按端口順序以及按端口名稱連接端口。
按端口順序,mod_a instance1 ( wa, wb, wc ); wa, wb, wc 分別連接到模塊的 第一個端口(in1),第二個端口(in2)以及第三個端口(out)。這里所謂的端口順序指的是模塊端口的定義順序。這種方式的弊端在于,一旦端口列表發生改變,所有模塊實例化中的端口連接都需要改變。
按端口名稱,mod_a instance2 ( .out(wc), .in1(wa), .in2(wb) ); 在這種方式中根據端口名稱指定外部信號的連接。這樣一來就和端口聲明的順序完全沒有關系。一旦模塊出現改動,只要修改相應的部分即可。實際上,一般都使用這種方式來進行模塊實例化。
這里建議初學者統一使用按端口名稱進行模塊例化,避免不必要的功能錯誤。
題目說明
在上面已經定義了一個模塊mod_a,請例化該模塊,下圖時模塊mod_a定義。
圖片來自 HDLBits
這個題目的核心就是將上面的圖片里的模塊mod_a進行例化。
模塊端口聲明
moduletop_module(inputa,inputb,outputout);
題目解析
這個題目重點是模塊例化,可以使用上面介紹的任何一種方式(按端口順序以及按端口名稱連接端口)。
moduletop_module(inputlogica,inputlogicb,outputwirelogicout); mod_am1( .in1(a), .in2(b), .out(out) ); endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
Problem 20-Module_pos
題目說明
這道題也和上一題一樣,給出了一個模塊mod_a,該模塊按順序具有 2 個輸出和 4 個輸入。必須將6個端口按位置順序與頂層的端口out1,out2,a,b,c和d相連接。
模塊端口聲明
moduletop_module( inputa, inputb, inputc, inputd, outputout1, outputout2 );
題目解析
這道題難度不大,和上一題類似,加大對模塊例化的理解。
moduletop_module( inputlogica,b,c,d, outputwirelogicout1,out2 ); mod_am1( out1, out2, a, b, c, d ); endmodule
在本題中對于給出的模塊來說,我們并不知道mod_a這個模塊的端口名是什么,所以對于本題來說,只能按照位置的順序來連接。
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
Problem 21-Module_name
題目說明
這道題和上一題一樣,給出了一個名為mod_a的模塊,該模塊按某種順序具有2個輸出和4個輸入。必須將6個端口通過按名字的方法與頂層的端口相連接。
圖片來自 HDLBits
mod_a的定義如下:
modulemod_a(outputout1,outputout2,inputin1,inputin2,inputin3,inputin4);圖片來自 HDLBits
模塊端口聲明
moduletop_module( inputa, inputb, inputc, inputd, outputout1, outputout2 );
題目解析
本題考查的和上一題一樣,只不過上一題沒有給出mod_a的端口定義,這一題給出了端口定義,所以我們需要使用按端口名稱來例化模塊。
moduletop_module( inputlogica, inputlogicb, inputlogicc, inputlogicd, outputwirelogicout1, outputwirelogicout2 ); mod_am1( .out1(out1), .out2(out2), .in1(a), .in2(b), .in3(c), .in4(d) ); endmodule
這道題有人覺得和上一道題一樣,也是同樣使用上一道題進行解答,但是會報錯,這是因為出題者考慮到了這種問題,所以題目給出的out1, out2, a, b, c, d不是mod_a正確的順序,只能按照名稱去例化。
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
Problem 22-Module_shift
題目說明
給定一個名為my_dff(實現 D 觸發器功能)模塊,該模塊具有兩個輸入和一個輸出。實例化三次,將它們鏈接在一起制作一個長度為 3 的移位寄存器。clk端口需要連接到所有實例。
提供的模塊是:
modulemy_dff(inputclk,inputd,outputq);
請注意,要建立內部連接,需要聲明一些wire。wire和模塊例化時候命名要小心:名稱必須是唯一的。
圖片來自 HDLBits
問題的核心就是上面的圖片,例化和連線需要注意。
模塊端口聲明
moduletop_module(inputclk,inputd,outputq);
題目解析
這個題目還是模塊例化,需要理解例化的概念。需要將第一個例化的輸出,作為第二個例化模塊的輸入,以此類推。
moduletop_module(inputlogicclk, inputlogicd, outputlogicq ); wirelogicq0,q1; my_dfff1( .clk(clk), .d(d), .q(q0) ); my_dfff2( .clk(clk), .d(q0), .q(q1) ); my_dfff3( .clk(clk), .d(q1), .q(q) ); endmodule
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
Problem 23-Module shift8
本題是上一題的擴展。使用向量作為端口的連線。正如Verilog的語法一樣,端口的向量長度不必與連接到它的導線匹配,但這將導致向量的零填充或截斷。在本練習中不使用具有不匹配的向量連接。
題目說明
給出了一個名為my_dff8的模塊,包含兩個輸入和一個輸出(實現一個8bit的D觸發器)。請實例化三次,并將它們連接在一起,形成一個長度為3的8bit移位寄存器。此外,再寫出一個4選1多路復用器(未提供模塊模型),根據輸入的sel[1:0]選擇要輸出的內容:輸入D的值,在第一個D觸發器之后的值,第二個或第三個D觸發器之后的值。(可以說sel選擇的是輸入延遲的的周期數,0~3個時鐘周期不等。)
圖片來自 HDLBits
這個題目的核心就是將上面的圖片里的模塊my_dff8進行例化。
模塊端口聲明
moduletop_module( inputclk, input[7:0]d, input[1:0]sel, output[7:0]q );
題目解析
這個題目重點是模塊例化,和上一題差不多,注意一下向量定義及端口連接即可。
moduletop_module( inputclk, inputlogic[7:0]d, inputlogic[1:0]sel, outputlogic[7:0]q ); logic[7:0]q0,q1,q2; my_dff8d0( .clk(clk), .d(d), .q(q0) ); my_dff8d1( .clk(clk), .d(q0), .q(q1) ); my_dff8d2( .clk(clk), .d(q1), .q(q2) ); always_combbegin uniquecase(sel) 2'b00: q=d; 2'b01: q=q0; 2'b10: q=q1; 2'b11: q=q2; default: q=2'bzz; endcase end endmodule
這題中,涉及到了SV的組合邏輯設計,基本語法和Verilog類似,主要涉及到了一個unique決策修飾符,使用unique會指示綜合編譯器可以并行計算case項。這部分內容會在SV的系列教程里繼續展開描述。
點擊Submit,等待一會就能看到下圖結果:
注意圖中的Ref是參考波形,Yours是你的代碼生成的波形,網站會對比這兩個波形,一旦這兩者不匹配,仿真結果會變紅。
這一題就結束了。
總結
今天的幾道題就結束了,主要考察模塊例化問題~
最后我這邊做題的代碼也是個人理解使用,有錯誤歡迎大家批評指正,祝大家學習愉快~
-
硬件
+關注
關注
11文章
3315瀏覽量
66206 -
Verilog
+關注
關注
28文章
1351瀏覽量
110078 -
端口
+關注
關注
4文章
964瀏覽量
32058
原文標題:HDLBits: 在線學習 SystemVerilog(五)-Problem 19-23
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論