初探FPGA 三 之建模思想

2021-07-24 13:08:25 字數 4559 閱讀 3308

微控制器是一種完成的硬體,它的功能已經相對固定化,串列埠,定時器等等,我們使用它,只需要通過c語言呼叫即可,可以說c語言是微控制器的靈魂,這導致了微控制器的侷限性,只能做到能夠做到的事情。vhdl是一種富有形狀的語言,它可以描述微控制器的任何部分。

建模是指使用硬體描述語言去建立某個資源模組。vhdl語言更加適合建模思想,相對c語言更加適合程式設計思想。建模更加實體化,形象化,而程式設計更加抽象化

講求資源的分類,以圖形的方式來提高建模的可讀性。

功能模組,控制模組,組合模組

乙個工程和專案,首先要把它分解乙個個的功能,按照功能乙個個的去實現,再把功能組合控制。

乙個功能模組/控制模組必須僅有乙個功能。

按鍵消抖實驗

把工程分解,如圖示,為了實現功能,按照乙個模組乙個功能的原則,分解為電平檢查和10ms的延時模組,直觀,形象,從整體到部分,然後去編寫對應的模組,思路清晰,這便是低階建模的精髓所在。

detect_module

module detect_module ///檢測電平變化輸入pin_in,輸出h2l_sig,l2h_sig

( clk,rstn,pin_in,h2l_sig,l2h_sig

); input clk;

input rstn;

input pin_in;//按鍵輸入

output h2l_sig;//高to低

output l2h_sig;//低to高

/********/

//50mhz 10ms延時 避免出現因為復位導致的電平不穩 50_000_000*0.01-1 =500_000-1 = 499_999;

parameter t10ms = 19

'd499_999;

reg[18:0]count ;

reg isen; //判斷訊號

always@(posedge clk or negedge rstn)

if(!rstn)

begin

count <= 19

'd0;

isen <= 1

'b0;

endelse

if(count == t10ms)

isen <= 1

'b1;

else

count <= count +1

'd1;

/*************************************/

reg h2l_f1;

reg h2l_f2;

reg l2h_f1;

reg l2h_f2;

always@(posedge clk or negedge rstn)

if(!rstn)

begin

h2l_f1 <= 1

'b1;

h2l_f2 <= 1

'b1;

l2h_f1 <= 1

'b0;

l2h_f2 <= 1

'b0;

endelse

begin

//判斷高變低

h2l_f1 <= pin_in;//當前輸入

h2l_f2 <= h2l_f1;//上一時刻的輸入//!!!!並行

//判斷低變高

l2h_f1 <= pin_in;//當前輸入

l2h_f2 <= l2h_f1;//上一時刻的輸入//!!!!並行

end/***************************************/

assign h2l_sig = isen?(h2l_f2&!h2l_f1):1

'b0;

//復位10ms之後,電平由高變低的訊號h2l_sig出現的時刻僅在由高變低的一瞬間

assign l2h_sig = isen?(!l2h_f2&l2h_f1):1

'b0;

//復位10ms之後,電平由低變高的訊號l2h_sig出現的時刻僅在由低變高的一瞬間

/***************************************/

endmodule

delay_module

module delay_module

(

clk,rstn,h2l_sig,l2h_sig,pin_out

); input clk;

input rstn;

input h2l_sig;

input l2h_sig;

output pin_out;

parameter t1ms = 16

'd49_999;

reg [15:0]count;

reg iscount;

always@(posedge clk or negedge rstn)//1ms延時

if(!rstn)

count <= 1

'd0;

else

if(iscount && count == t1ms)

count <= 1

'd0;

else

if(iscount)

count <= count +1

'd1;

else

if(!iscount)

count <= 16

'd0;

reg [3:0]count_ms;

always@(posedge clk or negedge rstn)//定時10ms

if(!rstn)

count_ms <= 4

'd0;

else

if(iscount && count == t1ms)

count_ms <= count_ms + 1

'b0;

else

if(iscount)

count_ms <= 4

'd0;

reg rpin_out;

reg [1:0]i;

always@(posedge clk or negedge rstn)

if(!rstn)

begin

iscount <= 1

'b0;

rpin_out <= 1

'b0;

i <= 2

'd0;

endelse

case(i)

2'd0:

if(h2l_sig) //高變低 i=1

i <= 2

'd1;

else

if(l2h_sig) //低變高 i=2

i <= 2

'd2;

2'd1:

if(count_ms == 4

'd10)//預設情況iscount 為1僅當10ms延時完成時為0

begin

iscount <= 1

'd0;

rpin_out <=1

'b1;//輸出高

i <= 2

'd0;

endelse

iscount <= 1

'b1;

2'd2:

if(count_ms == 4

'd10)

begin

iscount <=1

'b0;

rpin_out <=1

'b0;//輸出低

i<=2

'd0;

endelse

iscount <= 1

'b1;

endcase

assign pin_out = rpin_out;

endmodule

debounce_module

module debounce_module

( clk,rstn, pin_in,pin_out

); input clk;

input rstn;

input pin_in;

output pin_out;

wire h2l_sig;

wire l2h_sig;

detect_module u1

(.clk(clk),

.rstn(rstn),

.pin_in(pin_in),

.h2l_sig(h2l_sig),

.l2h_sig(l2h_sig)

);delay_module u2

(.clk(clk),

.rstn(rstn),

.l2h_sig(l2h_sig),

.h2l_sig(h2l_sig),

.pin_out(pin_out)

);endmodule

該實驗僅僅判斷了按鍵按下的動作,延時實現忽略抖動的中間過程,無法判斷按鍵最終的狀態,抬起,或者按下,不過這不是這個實驗的重點。

verilog hdl 那些事兒_建模篇

Lucene初探之資料格式詳情 三

今天,我們來了解一下lucene的域的元資料資訊 fnm。乙個段包含多個域,每個域都儲存一下元資料。fnm檔案的詳細資料格式大致如下 如同上面對段的資訊的介紹一般,我們來乙個個地看一下域中各個不同儲存區域的具體含義和作用。如果要詳細地深入了解域的元資料資訊,則需要下面幾點 了解了fnm檔案之後,和域...

三維建模 方法之CSG與B Rep比較

三維模型特徵表示方法 計算機中表示三維形體的模型,按照幾何特點進行分類,大體上可以分為三種 線框模型 表面模型和實體模型。如果按照表示物體的方法進行分類,實體模型基本上可以分為分解表示 構造表示csg constructive solid geometry 和邊界表示brep boundary re...

第三天之C 物件導向模型初探(this指標)

c 物件模型可以概括為以下2部分 語言中直接支援物件導向程式設計的部分,主要涉及如建構函式 析構函式 虛函式 繼承 單繼承 多繼承 虛繼承 多型等等。對於各種支援的底層實現機制。在c語言中,資料 和 處理資料的操作 函式 是分開來宣告的,也就是說,語言本身並沒有支援 資料和函式 之間的關聯性。在c ...