參考內容:Verilog硬件描述語言 西安電子科技大學 蔡覺平等主講 https://www.bilibili.com/video/BV1zb411s7bY?p=21
王建飛《你好FPGA一本可以聽的書》
蔡覺平《Verilog HDL數字集成電路設計原理與應用》
正點原子《開拓者FPGA開發指南》
硬件描述語言(HDL)及其發展
發展過程
國際標準
語言要素
1、空白符:空格符(\b)、製表符(\t)、換行符和換頁符
2、註釋符:同C語言
3、標識符:被用來命名信號名、模塊名、參數名等。可以由一組字母、數字、$符號、_(下劃線)符號的組合。注意:標識符的字母區分大小寫、第一個字符必須是字母或下劃線。
4、關鍵字
5、數值:Verilog HDL共有四種邏輯數值狀態。
狀態 | 含義 |
0 | 低電平、邏輯0或“假” |
1 | 高電平、邏輯1或“真” |
x或X | 不確定或未知的邏輯狀態 |
z或Z | 高阻態 |
整數的表示形式: +/-<size>'<base_format><number>
例如:16'b1100_1100_0010_0000 8'hbx 8'b1001zzzz 用下劃線區分增加可讀性 沒有數字說明位寬默認爲32位
數據類型
1、連線型:表示邏輯單元的物理連接,對應電路中的物理信號連線。最常用的是wire(連線)和tri(三態線)。
2、寄存器類型:reg是最常見的寄存器型數據類型,reg型是數據存儲單元的抽象類型,其對應的硬件電路元件具有狀態保持作用,能夠存儲數據,如觸發器、鎖存器等。reg型變量常用於行爲級描述,由過程賦值語句對其進行賦值。
3、參數型(parameter):屬於常量,在仿真開始之前就被賦值,在仿真過程中保持不變。
運算符和表達式
基本與C語言一致
※連接運算符{}與複製運算符{{}}
- 連接運算符:{信號1的某幾位,信號2的某幾位,...,信號n的某幾位}
- 複製運算符:將一個表達式放入雙重花括號中,複製因子放在第一層括號中。
※賦值語句
- 非阻塞賦值語句:“<=”
- 阻塞賦值語句:“=”
Initial
begin
A<=B; //語句S1
B<=A; //語句S2
end
語句S1、S2沒有先後順序
Initial
begin
A=B; //語句S1
B=A; //語句S2
end
※條件語句
(1)if-else:條件分支語句
(2)case:分支控制語句
module pocky_led(
input clk,
input rst,
output reg [3:0] led
);
reg err;
reg [1:0] sel;
always @(posedge clk or negedge rst)begin // if-else 語句塊
if(!rst)begin
led[1:0] <= 2'b00;
end
else if(err == 1'b1)
led[1:0] <= 2'b11;
else
led[1:0] <= 2'b10;
end
always @(posedge clk or negedge rst)begin // case 語句塊
if(!rst)begin
led[3:2] <= 2'b00;
end
else begin
case(sel)
2'b00:led[3:2] <= 2'b00;
2'b01:led[3:2] <= 2'b01;
2'b10:led[3:2] <= 2'b10;
2'b11:led[3:2] <= 2'b11;
default:;
endcase
end
end
endmodule
※模塊
Verilog HDL程序設計建模方式
數據流建模
數據流建模是比較簡單的建模,基本語句是由assign關鍵詞引導的。顯示連續賦值語句如下:
<net_declaration><range><name>;
assign #<delay><name>=Assignment expression;
上述格式中:
- net_declaration(連線型變量類型):可以是除了trireg之外的任何一種連線型數據類型。
- range(變量位寬):指明瞭變量數據類型的寬度,格式爲[msb:lab],省缺時爲1位。
- delay(延時量):是可選的。語法格式爲:#(delay1,delay2,delay3) delay1指連線型變量轉移到“1”狀態的延時值(稱爲上升沿時),delay2指連線型變量轉移到“2”狀態的延時值(稱爲下降沿時),delay3指連線型變量轉移到“高阻Z”狀態的延時值(稱爲關閉沿時)。
module example(a,b,m,n,c,y);
input[3:0] a,b,m,n;
output[3:0] c,y;
wire[3:0] a,b,m,n,c,y;
assign y = m|n;
assign #(3,2,4) c=a&b;
// wire[3:0] #(3,2,4) c=a&b; // 隱式連續賦值語句
endmodule
行爲級建模
always過程語句 觸發狀態是一直存在的,只要滿足always後面的敏感事件表,就執行語句塊。
always @(<敏感事件列表>)
語句塊
敏感事件列表就是觸發條件,只有當觸發條件滿足時,後面的語句塊纔會被執行。當有兩個或者兩個以上的信號,他們之間可以用“or”連接,也可以用逗號“,”連接。敏感信號分爲兩種:一種爲邊沿敏感型,一種爲電平敏感型。對於時序電路通常採用邊沿敏感型。posedge和negedge兩個關鍵字分別描述信號的上升沿和下降沿。例如
@(*) // 觸發信號的省缺模式,使用時相當於assign
@(a) // 當信號a的值發生改變時
@(a or b) // 當信號a或者信號b的值發生改變時
@(posedge clock) // 當clock的上升沿到來時
@(negedge clock) // 當clock的下降沿到來時
@(posedge clock or negedge clock) // 當clk的上升沿或者reset信號的下降沿到來時
結構化建模
結構描述方式就是講硬件電路描述成一個分級子模塊系統,通過組成電泳這些子模塊構成功能複雜的數字邏輯電路和系統的一種描述方式。