教育營銷型的網(wǎng)站建設(shè)常州網(wǎng)站推廣公司
02 認(rèn)識Verilog HDL
?
對于Verilog的語言的學(xué)習(xí),我認(rèn)為沒必要一開始就從頭到尾認(rèn)真的學(xué)習(xí)這個語言,把這個語言所有細(xì)節(jié)都搞清楚也不現(xiàn)實(shí),我們能夠看懂當(dāng)前FPGA的代碼的程度就可以了,隨著學(xué)習(xí)FPGA深度的增加,再不斷的去查閱不會的Verilog的語法。例如下面這個流水燈的程序,請帶著能夠看懂這段代碼的目的去開始Verilog的入門學(xué)習(xí)吧!
module flow_led(input sys_clk , input sys_rst_n, output reg [3:0] led );//reg define
reg [23:0] counter;//*****************************************************
//** main code
//***************************************************** always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)counter <= 24'd0;else if (counter < 24'd1000_0000)counter <= counter + 1'b1;elsecounter <= 24'd0;
endalways @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)led <= 4'b0001;else if(counter == 24'd1000_0000) led[3:0] <= {led[2:0],led[3]};elseled <= led;
endendmodule
一. Verilog 簡介
Verilog 是一種硬件描述語言,FPGA 開發(fā)主要有兩種語言,Verilog 和 VHDL。 而 Verilog 更加容易上手, Verilog 是在 C 語言的基礎(chǔ)上發(fā)展出來的。其語法也和 C 語言更加的接近,入門更加的簡單,也是目前最多使用的。
特點(diǎn):
1. 語法自由,易學(xué)易用。2.代碼簡單。3.發(fā)展速度快。3.適合算法級,門級設(shè)計(jì)。
二. Verilog 基礎(chǔ)語法
1.邏輯值
(1) 0:低電平
(2) 1:高電平
(3) z : 高阻態(tài)
(4) x:未知狀態(tài)
2. 關(guān)鍵字
?
module endmodule input outpt inout
2.2 變量
Verilog 最常用的 2 種數(shù)據(jù)類型就是線網(wǎng)(wire)與寄存器(reg)。
wire : 直接的連接,會被映射成真實(shí)的物理連接,表示硬件單元之間的物理連線,由其連接的器件輸出端連續(xù)驅(qū)動。
**reg:**某一時間點(diǎn)狀態(tài)的保持,會被映射成物理寄存器,用來表示存儲單元,它會保持?jǐn)?shù)據(jù)原有的值,直到被改寫
reg [3:0] counter ; //聲明4bit位寬的寄存器counter
wire [32-1:0] gpio_data; //聲明32bit位寬的線型變量gpio_data
2.3 參數(shù)
二者之間有區(qū)別和聯(lián)系,使用到再詳細(xì)結(jié)介紹。
parameter:
localparam:
?
2.4 常量
表示格式 :[換算成二進(jìn)制后的總長度]'[數(shù)制進(jìn)制符號][與數(shù)值進(jìn)制符號對應(yīng)的數(shù)值]
8'd171: 位寬為 8,十進(jìn)制的 171.
直接寫 100,就表示 32'd100,模式是 10 進(jìn)制 32 位寬,這是 verliog 中默認(rèn)的。
3.賦值方式
Verliog 中的賦值方式有兩種 阻塞賦值 和 非阻塞賦值。
阻塞賦值
a=1;b=2;
順序執(zhí)行,當(dāng)執(zhí)行完 a=1,才去執(zhí)行 b=2;
非阻塞賦值
a<=1;b<=2;
兩條語句是同時執(zhí)行的。
4.常用的語句
過程結(jié)構(gòu)語句有 2 種,initial 與 always 語句。它們是行為級建模的 2 種基本語句。
一個模塊中可以包含多個 initial 和 always 語句,但 2 種語句不能嵌套使用。
這些語句在模塊間并行執(zhí)行,與其在模塊的前后順序沒有關(guān)系。
但是 initial 語句或 always 語句內(nèi)部可以理解為是順序執(zhí)行的(非阻塞賦值除外)。
每個 initial 語句或 always 語句都會產(chǎn)生一個獨(dú)立的控制流,執(zhí)行時間都是從 0 時刻開始。
?
4.1 always
4.2 initial
只在仿真文件中使用,不可綜合的。
4.2 if else
和 c 語言中的使用一致。
if():
else():
4.3 case
在 c 語言的基礎(chǔ)上,在結(jié)束的時候需要添加一個 endcase。
case() <> : 語句1;<> : 語句2;default :
endcase
4.4 assign( 全加器)
4.5 @(事件控制)
語句執(zhí)行的條件是信號的值發(fā)生特定的變化。
關(guān)鍵字 posedge ?指信號發(fā)生邊沿正向跳變,negedge ?指信號發(fā)生負(fù)向邊沿跳變,未指明跳變方向時,則 2 種情況的。
5. 常用的運(yùn)算符
基礎(chǔ)的運(yùn)算符的使用和 c 語言中大概相同,使用到的時候如果不會,自己復(fù)習(xí)一下就好,這里說明不常見的運(yùn)算符,但在 Verliog 中經(jīng)常使用到的。
5.1 位拼接運(yùn)算符 {}
d = { a, b, c} // 將 a,b,c按順序拼接成了d,注意的是a,b,c,d的寬度一定要符合。
5.2 條件運(yùn)算符 ? :
也就是 c 語言中的三目運(yùn)算符。
表達(dá)式1?表達(dá)式2:表達(dá)式3
如果表達(dá)式 1 為真,就執(zhí)行 2,否則執(zhí)行 3.
6. 系統(tǒng)函數(shù)
verliog 中系統(tǒng)預(yù)定義一些函數(shù),完成特殊的功能,以下就是經(jīng)常使用到的一些系統(tǒng)函數(shù)。
·timescale 1ns/1ns //時間尺度預(yù)編譯指令 時間單位/時間精度
$display("%d",1); //用于輸出,類似c語言中的print
$write("\n",1); //用于輸出,和display一樣,但是display可以自動換行,wirte需要換行符
#1 //表示延時的時間
$stop; //暫停仿真
$finish; //結(jié)束仿真
$time; //返回64位的當(dāng)前時間
以反引號 ` 開始的某些標(biāo)識符是 Verilog 系統(tǒng)編譯指令。
?