Verilog 語法入門知識

2021-08-11 06:41:20 字數 3026 閱讀 9925

verilog 語法入門知識

一、變數型別

①數值

數值表示採用《二進位制位數》』《數值表示的進製》《數值》的結構。

其中進製可以為b、o、d、h分別代表

二、八、十、十六進製制。

例如22』d0代表22位二進位制數用十進位制表示為0。

②暫存器型別

reg宣告暫存器型別變數,如 reg[0:3] my[0:63];是64個4位暫存器構成的儲存器。

其中[22:0]代表位寬為23位,最高位在前,含義是[msb:lsb]。

注意,儲存器賦值不能在一條語句內完成,但暫存器賦值可以,類似於陣列元素不能一次性全部賦值。

③還有input,output型別變數

④引數型別parameter

parameter類似於const型別,是常量,與const的區別是可以在定義時不初始化,但僅能賦值一次。常用於定義延時和變數寬度。

二、基本用法

模組開始用module,結束用endmodule

2.1 延時語句

timescale 1ns/1ns //定義延時單位和精度,單位和精度均為1ns,注意開頭為反引號。

反引號代表的是編譯器指令,與c語言中#一樣。

②assign #n sum= a + b; //n應該替換為數字,代表幾個延時單位

每當右邊的運算元有所變化時,延時n個單位後,會執行這條語句,將新值賦給左邊。

2.2 行為描述語句

2.2.1 初始化語句

初始化語句只執行一次。

用法 initial

begin

//code

end

2.2.2 迴圈語句

always @ (條件) (posedge clk or negedge rst_n) 時鐘上公升沿,復位下降沿

begin

//code

end

注意:在塊外的語句都是並行,在begin-end內是序列,在fork-join內是並行的。

三 操作符

當使用賦值運算子的時候,=為擁塞賦值,<=為非擁塞賦值。擁塞賦值的含義是當前面的賦值語句完成後,才會執行下面的賦值語句。

四 模組建立及變數連線

1:verilog所寫的工程是由乙個乙個的模組連線起來的,每個檔案代表乙個模組,模組的名字和檔名要保持一致,乙個模組的基本宣告方法為:

//filename:main_module

module main_module( clk, rstn, io_in, io_out );

input clk; //定義了變數輸入輸出,和變數型別

input rstn;

input io_in;

output io_out;

endmodule

2:對於頂層檔案,所有宣告的input、output變數都可分配引腳。所謂的input和output是相對於自己來說的,如果要利用此變數讀入內容,則宣告為input,要利用此變數輸出內容,則宣告為output。

為了捕獲頂層檔案的clk,rstn,io_in,同時處理後輸出io_out,需要另外建立乙個模組(檔案),如下:

//file_name:io_changer

module io_changer(

myclk, myrstn, myio_in, myio_out;

); input myclk;

input myrstn;

input myio_in;

output myio_out;

endmodule

3:要連線這兩個模組,也就是頂層main_module連線到io_changer,則需要在頂層檔案內做如下宣告:

wire out_receiver;

io_changer u1(

.myclk( clk ),

.myrstn( rstn ),

.myio_in( io_in ),

.myio_out( out_receiver )

);4:由於前三個變數都宣告為了input,因此會將頂層的三個變數值傳入,而第四個變數宣告為了output,因此會將io_changer中的myio_out的值傳入頂層的wire變數out_receiver。這類似於c++中的類內賦值,可以想象為.前面有乙個this指標,在io_changer類內,this.myclk就是io_changer的myclk變數,括號是一種賦值手段,當然這裡也增加了輸出的功能。

當建立起這樣的兩個模組並且完成編譯後,會自動完成檔案連線,將io_changer作為main_module的子檔案。

在模組io_changer內,要改變myio_out的值,一般採用assign賦值

在always迴圈結構內,一般使用reg變數而不能是wire變數,假設存在乙個計數器counter的值由0到50000000代表1秒,要使得io_out每500ms翻轉一次,則要如下書寫:

reg rio_out;

always @ (posedge myclk or negedge myrstn)

if (!myrstn)  

rio_out = 1'b0;

else if(counter >= 2500_0000)

rio_out = 1'b1;

else

rio_out = 1'b0;

assign myio_out = rio_out

6:為了將變化回傳到頂層,還需要在頂層內將接收到的out_receiver賦值到io_out引腳,如下:

assign io_out = out_receiver;

Verilog語法總結

1.阻塞賦值 與非阻塞賦值 的區別 一條非阻塞過程賦值語句對應的賦值操作執行完之前,下一語句也可以開始執行。各條阻塞型過程賦值語句將以他們在順序塊中的排列次序得到執行。2.關係運算子 關係運算子的優先順序比算數運算子的優先順序低.3.縮減運算 縮減運算的過程 第一步將運算元的第一位與第二位進行與或非...

verilog語法隨記

module host cpld 宣告host cpld的輸入輸出變數 input a0,b0,c0 宣告輸入埠a0,b0和c0 output a1,b1,c1 宣告輸出埠a1,b1和c1 reg x 0 reg是暫存器型別,表示需要觸發,無輸入時可保持原來數值 wire x wire是網線型別,表...

Verilog語法簡介

常量 正數常量 含義8 b11001100 寬度為8位的二進位制數 8 hff 寬度為8位的十六進製制數 7 o15 寬度為7位的八進位制數 6 d10 寬度為6位的十進位制數 變數net型變數相當於硬體電路中各種物料連線其特點是輸出的值緊跟輸入值的變化而變化。wire是最常用的net型變數。wir...