INTEL FPGA學習筆記

第12節:語法篇_Verilog基礎語法

(1)Verilog 語言四種邏輯:
邏輯 0:表示低電平,也就對應我們電路 GND;
邏輯 1:表示高電平,也就是對應我們電路的 VCC;
邏輯 X:表示未知,有可能是高電平,也有可能是低電平;
邏輯 Z:表示高阻態,外部沒有激勵信號,是一個懸空狀態。
在這裏插入圖片描述

(2)數字表示:不給位寬默認32位,不給進制默認d:如1020=32’d1020
(3)標識符:
標識符區分大小寫,第一個字符必須是字母或者下劃線;
標識符推薦寫法:
不建議大小寫混合使用;
普通內部信號建議全部小寫;
信號命名最好體現信號的含義,簡潔、清晰、易懂;
以下是一些推薦的寫法:
1、用有意義的有效的名字如 sum 、cpu_addr等。
2、用下劃線區分詞,如cpu_addr。
3、採用一些前綴或後綴,比如時鐘採用clk前綴:clk_50,clk_cpu;

(4)在 Verilog 語言中,主要有三大類數據類型:
從名稱中,我們可以看出,真正在數字電路中起作用的數據類型應該是:寄存器數據類型和線網數據類型。

一.寄存器數據類型reg:
(1)表示一個抽象的數據存儲單元,通過賦值語句可以改變寄存器儲存的值
(2)初值不確定,默認X。
(3)reg類型的數據只能在 always 語句和 initial 語句中被賦值。
(4)reg的位寬:[高位,低位]
在這裏插入圖片描述
如果不給位寬,默認爲1
(5)reg的物理意義:觸發器/硬件連線

二.線網數據類型wire/tri(tri很少用但用法一致):
(1)線網數據類型表示結構實體(例如門)之間的物理連線,不能儲存值,它的值是由驅動它的元件所決定的。
(2)驅動的元件有門、連續賦值語句、assign等,如果沒有驅動元件連接到線網類型的變量上,則該變量就是高阻的,即其值爲z

三.參數數據類型parameter:
在這裏插入圖片描述
(1)參數其實就是一個常量
(2)在模塊調用時,可通過參數傳遞來改變被調用模塊中已定義的參數。

(5)移位運算符:
兩種移位運算都用0來填補移出的空位。
左移時,位寬增加;右移時,位寬不變
4’b1001 << 2 = 6’b100100;
4’b1001 >> 1 = 4’b0100;
(6)拼接運算符:
{a,b} 將 a 和 b 拼接起來,作爲一個新信號
比如:c = { a, b[3:0] };

第13節:語法篇_Verilog程序框架

(1)常用關鍵字:
在這裏插入圖片描述

(2)Verilog 的基本設計單元是“模塊”(block)。
一個模塊是由兩部分組成的,一部分描述接口,另一部分描述邏輯功能。
在這裏插入圖片描述

(3)注意:輸入端可以是wire類型的,也可以是reg類型的
但輸出端只能是wire類型
(4)參數傳遞:注意看其中的MAX_NUM ,儘管在模塊中已經有值了,但仍然可以在外面重賦值。
在這裏插入圖片描述
在這裏插入圖片描述

第14節:語法篇_Verilog高級知識點

在這裏插入圖片描述

在這裏插入圖片描述
高級知識點:
(1)#number 的意思:
上一條語句執行完畢後延時number時間執行這一條語句
(2)沒有posedge 和negedge修飾,就是電平觸發方式,電平觸發常用於描述組合邏輯
(3)如果組合邏輯塊語句的輸入變量很多,那麼編寫敏感列表會很煩瑣並且容易出錯。
在這裏插入圖片描述
@( * )表示對後面語句塊中所有輸入變量的變化都是敏感的。

(4)根據邏輯功能的不同特點,可以將數字電路分成兩大類:
組合邏輯電路 和 時序邏輯電路。
組合邏輯電路中,任意時刻的輸出僅僅取決於該時刻的輸入,與電路原來的狀態無關。
時序邏輯電路中,任一時刻的輸出不僅取決於當時的輸入信號,而且還取決於電路原來的狀態。或者說還與以前的輸入有關,因此時序邏輯必須具備記憶功能。
組合邏輯:
在這裏插入圖片描述
時序邏輯:

在這裏插入圖片描述
(5)阻塞賦值與非阻塞賦值:
可以這樣理解:
阻塞賦值(=):有點類似於使用導線將兩個變量連起來,不cpoy,直接賦值,一個變全變。
只有一個步驟:計算所有阻塞賦值右側值,並將右賦左,同時所賦值即時影響其它。
或者這樣理解:後面的變量如果想用之前變量的值,他一定用到的是之前變量更新過後(執行完賦值後)的值。
在這裏插入圖片描述

非阻塞賦值(<=):
有點類似於先cpoy,再賦值,一個變其它下次變。
賦值分兩個步驟:
Step1:取所有阻塞賦值右側值(注意,注意,這裏已經取出來了)
Step2:將右賦左,變量值更新。
在這裏插入圖片描述
兩種賦值的使用:
在這裏插入圖片描述

注意casex和casez:
在這裏插入圖片描述
(未完待續,原則上每日更新)

第15節:語法篇_Verilog狀態機

狀態機:
Verilog中特別適合順序執行邏輯
有限狀態機:FSM
在有限個狀態之間按一定規律轉換的時序電路

重點:四段論法寫三段式狀態機:
(1)寫狀態空間和相關寄存器定義:

//定義狀態
parameter   STATE_WID   =   2;
parameter   IDLE        =   2'b00;//0HZ
parameter   S1          =   2'b01;//1HZ
parameter   S2          =   2'b10;//2HZ
parameter   S3          =   2'b11;//5HZ

//定義相關寄存器    
reg     [STATE_WID-1:0]     state_c;
reg     [STATE_WID-1:0]     state_n;

(2)寫狀態跳轉:(這個進程寫法基本不會變):

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        state_c <= IDLE;
    else 
		  state_c <= state_n;
end

(3)寫下個狀態判斷:

always @(*) begin
    case(state_c)
		IDLE:begin
			if(key==1'b0)begin
			state_n = S1;
			end
			else begin
			state_n = IDLE;
			end
		end
		S1:begin
			if(key==1'b0)begin
			state_n = S2;
			end
			else begin
			state_n = S1;
			end
		end
		S2:begin
			if(key==1'b0)begin
			state_n = S3;
			end
			else begin
			state_n = S2;
			end
		end
		S3:begin
			if(key==1'b0)begin
			state_n = IDLE;
			end
			else begin
			state_n = S3;
			end
		end
	endcase
end

(4)寫各個狀態下的動作:

always @(posedge sys_clk or negedge sys_rst_n) begin
    if (!sys_rst_n)
        counter_comp <= 28'd0;
    else if(state_c==IDLE) begin
			counter_comp <= 28'd0;
    end
	 else if(state_c==S1) begin
			counter_comp <= 28'd500_0000;
    end
	 else if(state_c==S2) begin
			counter_comp <= 24'd60331648;
	 end
	 else if(state_c==S3) begin
			counter_comp <= 28'd2000_0000;
	 end
end

講解:
(1)兩種狀態空間定義表達方式:
在這裏插入圖片描述
(2)
在這裏插入圖片描述
兩種寫法功能完全一樣
(3)
在這裏插入圖片描述
(4)必須注意!!!!
Verilog數值表達位寬問題:
Verilog並不會檢查如下的數字表達問題,下面的兩端代碼仍然可以綜合。

counter_comp <= 8’d1000_0000;
此時d1000_0000中[7,0]賦值到counter_comp中,其它位被丟棄。

也就是說:
24’b1001_1000_1001_0110_1000_0000
與24’b0011_1001_1000_1001_0110_1000_0000相同
所以:數字一定要確認位寬夠用,否則可能帶來莫名其妙的問題

(5)注意:要注意default的書寫,看看有必要寫defult不。

(寫狀態機可參考這篇講解,講的真的好:
https://blog.csdn.net/fengyuwuzu0519/article/details/72571740
再去看一下正點原子的狀態機視頻,就更好了)

第16節:實戰篇_流水燈

第17節:實戰篇_按鍵控制LED

第18節:實戰篇_按鍵控制蜂鳴器(按鍵消抖)

第19節:實戰篇_觸摸按鍵控制LED

第20節:實戰篇_數碼管靜態顯示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章