verilog基礎
我先說,看了肯定會忘,但是重要的是這個過程,我們知道了概念,知道了以后在哪里查詢。語法都是術,通用的概念是術。所以如果你有相關的軟件編程經驗,那么其實開啟這個學習之旅,你會感受到熟悉,也會感受到別致。
入門
- 如何開始
歡迎來到二進制的世界,數字邏輯的入門一開始可能有難度,因為你需要學習新的概念,新的硬件描述語言(HDL – Hardware Description Language)例如 verilog
,幾個新的仿真軟件和一塊FPGA的板子.但是這能幫你更加深刻的理解計算機的運作原理.
設計電路需要如下幾個步驟:
- 編寫HDL(verilog)代碼
- 編譯代碼生成電路
- 模擬電路并修復錯誤
下面,我們來個簡單的例子,請把one
的輸出設為1:
- Module Declaration
module top_module(output one);
- Solution
module top_module( output one );assign one = 1;endmodule
- 輸出0
建立一個沒有輸入,輸出為常數0的電路.
本系列題使用verilog-2001 ANSI-style 的端口聲明語法,因為它更容易閱讀并減少了拼寫錯誤.如果愿意,可以使用舊的verilog-1995語法.例如,下面的兩個模塊聲明是可接受的和等效的:
module top_moduel(zero);output zero;//verilog-1995
endmodulemodule top_module(output zero);
//verilog-2001
endmodule
- Module Declaration
module top_module(output zero
);
- Solution
module top_module(output zero
);// Module body starts after semicolonassign zero=0;
endmodule
Verilog 語言
基礎元素
- wire類型
創建一個具有一個輸入和一個輸出的模塊,其行為想一條"線"(Wire)。
與物理線不同但十分相似,Verilog中的線(和其他信號)是定向的。
這意味著信息只在一個方向上流動,從(通常是一個)源流向匯點(該源通常也被稱為驅動程序,將值驅動到wire上)。
在verilog"連續賦值"(assign left_side=right_side;)中,右側的信號值被驅動到左側的"線"上。
請注意:賦值是"連續的"(Continuous Assignments),因為如果右側的值發生更改,分配也會一直持續,因此左側的值將隨之改變。(這里與其他語言有很大區別)。 連續分配不是一次性事件,其產生的變化是永久的。
想要真正理解為啥會這樣,你首先要明白,你并不是在編寫程序,你其實是在用代碼"畫"電路!
因此輸入端的電平高低的變化必然會影響到wire的另一端,你可以想像真的有一根電線連接兩個變量。
模塊(module)上的端口(port)也有一個方向(通常是輸入 – input或輸出 – output)。
輸入端口由來自模塊外部的東西驅動,而輸出端口驅動外部的東西。從模塊內部查看時,輸入端口是驅動程序或源,而輸出端口是接收器。
下圖說明了電路的每個部分如何對應Verilog代碼的每個部分。
- 模塊和端口聲明創建電路的黑色部分。
- 您的任務是通過添加一個assign語句來創建一條線(綠色)。
- 盒子外的部件不是您的問題,但您應該知道,通過將測試激勵連接到top_module上的端口來測試電路。
除了連續賦值之外,Verilog還有另外三種用于程序塊(Procedural block)的賦值類型,其中兩種是可綜合的。在開始使用Procedural block之前,我們不會使用它們.
- Module Declaraction
module top_module( input in, output out );
- Solution
module top_module( input in, output out );assign out = in;
endmodule
這里的 Module Declaraction 和 Solution就像是對應C里面的聲明和定義實現
- Four wires
創建一個具有3個輸入和4個輸出的模塊,這些輸入和輸出的行為如下:
A ->W
B -> X
B -> Y
C -> Z
下圖說明了電路的每個部分如何對應Verilog代碼的每個部分.模塊外部有三個輸入端口和四個輸出端口.
當您有多個assign語句時,它們在代碼中的出現順序并不重要.與編程語言不同,assign語句(“連續賦值”)描述事物之間的連接,而不是將值從一個事物復制到另一個事物的操作.
可能現在應該澄清的一個潛在的困惑來源是:這里的綠色箭頭表示電線之間的連接,但不是wire本身.
模塊本身已經聲明了7條線(名為A、B、C、W、X、Y和Z).這是因為input與output被聲明為了wire類型.因此,assign語句不會創建wire,而是描述了在已存在的7條線之間創建的連接.
- Module Declaraction
module top_module(input a,b,c;output w,x,y,z
);
- Solution
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
- 反轉器 (Inveter)
創建實現非門的模塊.
這個電路和電線相似,但有點不同.當把電線從進線連接到出線時,我們要實現一個反相器(非門),而不是一根