微控制器是一種完成的硬體,它的功能已經相對固定化,串列埠,定時器等等,我們使用它,只需要通過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 ...