寫在前面
之前看過跟多大神安利過這個網站,可以在線仿真運行Verilog代碼,之前也一直想法把這里的題庫中的題給刷一遍。這個網站對HDL語言的新手非常友好,有講解,有示例,對新手和老手都是非常有用的。我也趁著這段時間,鞏固下基礎,深入自己的理解。
網址://hdlbits.01xz.net/wiki/Main_Page
注:文章中的題目部分是翻譯的,這里我為了保證邏輯通常便于理解只進行簡單的修改和標注。
- simple wire
創建一個具有一個輸入和一個輸出的模塊,其行為類似于導線。與物理電線不同,Verilog中的wire(和其他信號)是定向的。僅在一個方向上的該裝置的信息流,從(一般是一個)源區到目的區(源極還通常稱為驅動器即驅動器的值到一個線)。在Verilog“連續分配”(assign left_side = right_side;)中,右側的信號值被驅動到左側的線上。分配是“連續的”,因為即使右側的值發生變化,分配也會一直持續。連續分配不是一次性事件。
模塊上的端口也有方向(通常是輸入或輸出)。輸入端口由模塊外部的東西驅動,而輸出端口將外部的東西驅動。從模塊內部看,輸入端口是驅動程序或源,而輸出端口是接收器。
下圖說明了電路的每個部分如何對應于Verilog代碼的每個位。模塊和端口聲明會創建電路的黑色部分。
您的任務是通過添加一條assign連接in到的語句來創建電線(綠色)out。盒子外面的零件與您無關,但您應該知道通過將來自我們測試線束的信號連接到您的上的端口來測試電路top_module。
- answer
module top_module( input in, output out ); assign out = in ;endmodule
- Wire 4
創建一個具有3個輸入和4個輸出的模塊,其行為類似于以下連接的線:
a-> w b-> x
b-> y c-> z
下圖說明了電路的每個部分如何對應于Verilog代碼的每個位。從模塊外部,有三個輸入端口和四個輸出端口。
當您有多個Assign語句時,它們在代碼中出現的順序無關緊要。不同于編程語言,分配語句(“assign”)描述了連接東西之間,而不是動作復制從一件事到另一個值。
現在應該澄清一個潛在的混亂根源:此處的綠色箭頭表示電線之間的連接,但本身并不是電線。模塊本身已經聲明了7條線(分別命名為a,b,c,w,x,y和z)。這是因為除非另有說明,否則input and output聲明實際上聲明了線。寫作input wire a和一樣input a。因此,這些assign語句不是在創建導線,而是在已存在的7條導線之間創建連接。
- answer
module top_module( input a,b,c, output w,x,y,z ); assign w=a; assign x=b; assign y=b; assign z=c;endmodule
- Not gate
一個實現“非”門的模塊。這個電路類似于wire 而不是普通wire。使用assign語句。該assign聲明將持續輸出的取反后的in給線out。
- answer
module top_module( input in, output out ); assign out =!in;endmodule
- And gate
創建一個實現AND門的模塊。
該電路現在有三根線(a,b,和out)。電線a和b已經具有輸入端口驅動的值。但是,wire out目前不受任何驅動。寫一個assign聲明驅動out與信號a和b實現與門功能。
請注意,該電路與非門非常相似,只需再輸入一次即可。如果聽起來不同,那是因為我已經開始將信號描述為被驅動(具有已知值,該值由附加在其上的東西確定)或未被驅動。Input wires由模塊外部的東西驅動。assign語句將邏輯電平驅動到電線上。如您所料,電線不能有多個驅動器(如果有,其邏輯電平是多少?),而沒有驅動器的wire將具有未定義的值(通常視為0)。
- answer
module top_module( input a, input b, output out ); assign out = (a&b);endmodule
- Nor gate
創建一個實現或非門的模塊。或非門是其輸出反相的或門。用Verilog編寫時,NOR函數需要兩個運算符。
一條assign語句驅動帶有值的wire(或“ net”,更正式的稱呼)。該值可以是所需的復雜函數,只要它是組合(即,無內存,無隱藏狀態)函數即可。的assign語句是一個連續的分配,因為輸出是“重新計算”,只要任何其輸入的變化,很像一個簡單的邏輯門。
- answer
module top_module( input a, input b, output out ); assign out = !(a|b);endmodule
- Xnor gate
創建一個實現XNOR門的模塊。
- answer
module top_module( input a, input b, output out ); assign out =( a&b) |(!a&!b);endmodule
- Declaring wires
到目前為止,電路已經足夠簡單,以至于輸出是輸入的簡單功能。隨著電路變得越來越復雜,您將需要電線將內部組件連接在一起。當需要使用導線時,應在首次使用之前在模塊主體中聲明它。(將來,您會遇到更多類型的信號和變量,它們也以相同的方式聲明,但是現在,我們將從wire類型的信號開始)。
- 舉個例子
module top_module ( input in, // Declare an input wire named "in" output out // Declare an output wire named "out"); wire not_in; // Declare a wire named "not_in" assign out = ~not_in; // Assign a value to out (create a NOT gate). assign not_in = ~in; // Assign a value to not_in (create another NOT gate).endmodule // End of module "top_module"
- 實踐
實現以下電路。創建兩條中間線(命名為任意名稱)以將AND和OR門連接在一起。需要注意的是飼料非門線真的連線出來,所以你不一定需要在這里宣布第三線。請注意,導線是如何僅由一個源(一個門的輸出)驅動的,但可以為多個輸入供電。
如果您遵循圖中的電路結構,則應該以四個assign語句結束,因為有四個信號需要分配值。(是的,無需中間線就可以創建具有相同功能的電路。)
- answer
這里我為了邏輯更加清晰,多加了中間變量的wire
`default_nettype nonemodule top_module( input a, input b, input c, input d, output out, output out_n ); wire a_and_b; wire c_and_d; wire out_or; assign a_and_b=a&b; assign c_and_d=c&d; assign out_or =a_and_b|c_and_d; assign out = out_or; assign out_n = !out_or;endmodule
- 7458 chip
458是具有四個“與”門和兩個“或”門的芯片。創建具有與7458芯片相同功能的模塊。它具有10個輸入和2個輸出。您可以選擇使用assign語句來驅動每條輸出線,也可以選擇聲明(四根)線用作中間信號,其中每條內部線均由AND門之一的輸出驅動。
module top_module ( input p1a, p1b, p1c, p1d, p1e, p1f, output p1y, input p2a, p2b, p2c, p2d, output p2y ); assign p1y=(p1a&p1b&p1c)|(p1d&p1e&p1f); assign p2y=(p2a&p2b)|(p2c&p2d);endmodule