中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

廣州建網(wǎng)站培訓(xùn)刷粉網(wǎng)站推廣馬上刷

廣州建網(wǎng)站培訓(xùn),刷粉網(wǎng)站推廣馬上刷,好的室內(nèi)設(shè)計網(wǎng)站推薦,上海疫情最新數(shù)據(jù)消息🎉歡迎來到FPGA專欄~按鍵消抖模塊設(shè)計與驗證 ☆* o(≧▽≦)o *☆嗨~我是小夏與酒🍹 ?博客主頁:小夏與酒的博客 🎈該系列文章專欄:FPGA學(xué)習(xí)之旅 文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯誤,希望大…

🎉歡迎來到FPGA專欄~按鍵消抖模塊設(shè)計與驗證


  • ☆* o(≧▽≦)o *☆~我是小夏與酒🍹
  • ?博客主頁:小夏與酒的博客
  • 🎈該系列文章專欄:FPGA學(xué)習(xí)之旅
  • 文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯誤,希望大家能指正🙏
  • 📜 歡迎大家關(guān)注! ??
    FPGQ2

CSDN

🎉 目錄-按鍵消抖模塊設(shè)計與驗證

  • 一、效果演示
  • 二、模塊設(shè)計
  • 三、仿真測試
    • 3.1 常規(guī)編寫
    • 3.2 task編寫
  • 四、仿真模型

遇見未來

一、效果演示

🥝模塊設(shè)計:
模塊設(shè)計


🥝按鍵消抖模塊的完整代碼,可直接使用:

//
//模塊:按鍵消抖模塊
//key_state:輸出消抖之后按鍵的狀態(tài)
//key_flag:按鍵消抖結(jié)束時產(chǎn)生一個時鐘周期的高電平脈沖
/
module KeyFilter(input Clk,input Rst_n,input key_in,output reg key_flag,output reg key_state
);//按鍵的四個狀態(tài)localparamIDLE 		= 4'b0001,FILTER1 	= 4'b0010,DOWN 		= 4'b0100,FILTER2 	= 4'b1000;//狀態(tài)寄存器reg [3:0] curr_st;//邊沿檢測輸出上升沿或下降沿wire pedge;wire nedge;//計數(shù)寄存器reg [19:0]cnt;//使能計數(shù)寄存器reg en_cnt;//計數(shù)滿標(biāo)志信號reg cnt_full;//計數(shù)滿寄存器//------<邊沿檢測電路的實現(xiàn)>------//邊沿檢測電路寄存器reg key_tmp0;reg key_tmp1;//邊沿檢測always@(posedge Clk or negedge Rst_n)beginif(!Rst_n)beginkey_tmp0 <= 1'b0;key_tmp1 <= 1'b0;endelse beginkey_tmp0 <= key_in;key_tmp1 <= key_tmp0;end	endassign nedge = (!key_tmp0) & (key_tmp1);assign pedge = (key_tmp0)  & (!key_tmp1);//------<狀態(tài)機(jī)主程序>------	//狀態(tài)機(jī)主程序always@(posedge Clk or negedge Rst_n)beginif(!Rst_n)begincurr_st <= IDLE;en_cnt <= 1'b0;key_flag <= 1'b0;key_state <= 1'b1;endelse begincase(curr_st)IDLE:beginkey_flag <= 1'b0;if(nedge)begincurr_st <= FILTER1;en_cnt <= 1'b1;endelsecurr_st <= IDLE;endFILTER1:beginif(cnt_full)beginkey_flag <= 1'b1;key_state <= 1'b0;curr_st <= DOWN;en_cnt <= 1'b0;end	else if(pedge)begincurr_st <= IDLE;en_cnt <= 1'b0;endelsecurr_st <= FILTER1;endDOWN:beginkey_flag <= 1'b0;if(pedge)begincurr_st <= FILTER2;en_cnt <= 1'b1;endelsecurr_st <= DOWN;endFILTER2:beginif(cnt_full)beginkey_flag <= 1'b1;key_state <= 1'b1;curr_st <= IDLE;en_cnt <= 1'b0;end	else if(nedge)begincurr_st <= DOWN;en_cnt <= 1'b0;endelsecurr_st <= FILTER2;enddefault:begincurr_st <= IDLE;en_cnt <= 1'b0;key_flag <= 1'b0;key_state <= 1'b1;endendcaseendend//------<20ms計數(shù)器>------		//20ms計數(shù)器//Clk 50_000_000Hz//一個時鐘周期為20ns//需要計數(shù)20_000_000 / 20 = 1_000_000次always@(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt <= 20'd0;else if(en_cnt)cnt <= cnt + 1'b1;elsecnt <= 20'd0;endalways@(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt_full <= 1'b0;else if(cnt == 999_999)cnt_full <= 1'b1;elsecnt_full <= 1'b0;endendmodule

🥝RTL視圖:
RTL


🥝狀態(tài)轉(zhuǎn)移:
狀態(tài)轉(zhuǎn)移


🥝仿真結(jié)果:
仿真結(jié)果


二、模塊設(shè)計

🥝模塊設(shè)計:

信號作用
clk時鐘信號輸入
rst_n復(fù)位信號輸入
key_in按鍵信號輸入
key_flag消抖結(jié)束之后的標(biāo)志位
key_state消抖結(jié)束之后按鍵的狀態(tài)

模塊設(shè)計


🥝上升沿檢測電路:
上升


🥝下降沿檢測電路:

下降


🥝邊沿檢測電路的實現(xiàn):
檢測到下降沿,nedge輸出高電平;檢測到上升沿,pedge輸出高電平。

//------<邊沿檢測電路的實現(xiàn)>------
//邊沿檢測電路寄存器
reg key_tmp0;
reg key_tmp1;//邊沿檢測
always@(posedge Clk or negedge Rst_n)beginif(!Rst_n)beginkey_tmp0 <= 1'b0;key_tmp1 <= 1'b0;endelse beginkey_tmp0 <= key_in;key_tmp1 <= key_tmp0;end	
endassign nedge = (!key_tmp0) & (key_tmp1);//檢測到下降沿,nedge輸出高電平
assign pedge = (key_tmp0)  & (!key_tmp1);//檢測到上升沿,pedge輸出高電平

🥝一段式狀態(tài)機(jī)設(shè)計:
按鍵的四種狀態(tài):

//按鍵的四個狀態(tài)
localparamIDLE 		= 4'b0001,FILTER1 	= 4'b0010,DOWN 		= 4'b0100,FILTER2 	= 4'b1000;

計數(shù)器:

//------<20ms計數(shù)器>------		
//20ms計數(shù)器
//Clk 50_000_000Hz
//一個時鐘周期為20ns
//需要計數(shù)20_000_000 / 20 = 1_000_000次//計數(shù)寄存器
reg [19:0]cnt;//使能計數(shù)寄存器
reg en_cnt;//計數(shù)滿標(biāo)志信號
reg cnt_full;//計數(shù)滿寄存器always@(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt <= 20'd0;else if(en_cnt)cnt <= cnt + 1'b1;elsecnt <= 20'd0;
endalways@(posedge Clk or negedge Rst_n)beginif(!Rst_n)cnt_full <= 1'b0;else if(cnt == 999_999)cnt_full <= 1'b1;elsecnt_full <= 1'b0;
end

狀態(tài)機(jī)主程序:

//------<狀態(tài)機(jī)主程序>------	
//狀態(tài)機(jī)主程序
always@(posedge Clk or negedge Rst_n)beginif(!Rst_n)begincurr_st <= IDLE;en_cnt <= 1'b0;key_flag <= 1'b0;key_state <= 1'b1;endelse begincase(curr_st)IDLE:beginkey_flag <= 1'b0;if(nedge)begincurr_st <= FILTER1;en_cnt <= 1'b1;endelsecurr_st <= IDLE;endFILTER1:beginif(cnt_full)beginkey_flag <= 1'b1;key_state <= 1'b0;curr_st <= DOWN;en_cnt <= 1'b0;end	else if(pedge)begincurr_st <= IDLE;en_cnt <= 1'b0;endelsecurr_st <= FILTER1;endDOWN:beginkey_flag <= 1'b0;if(pedge)begincurr_st <= FILTER2;en_cnt <= 1'b1;endelsecurr_st <= DOWN;endFILTER2:beginif(cnt_full)beginkey_flag <= 1'b1;key_state <= 1'b1;curr_st <= IDLE;en_cnt <= 1'b0;end	else if(nedge)begincurr_st <= DOWN;en_cnt <= 1'b0;endelsecurr_st <= FILTER2;enddefault:begincurr_st <= IDLE;en_cnt <= 1'b0;key_flag <= 1'b0;key_state <= 1'b1;endendcaseend
end

三、仿真測試

3.1 常規(guī)編寫

`timescale 1ns/1ns
`define clock_period 20module KeyFilter_tb;reg Clk;reg Rst_n;reg key_in;wire key_flag;wire key_state;KeyFilter KeyFilter0(.Clk(Clk),.Rst_n(Rst_n),.key_in(key_in),.key_flag(key_flag),.key_state(key_state));initial Clk = 1;always#(`clock_period/2) Clk = ~Clk;initial beginRst_n = 1'b0;key_in = 1'b1;#(`clock_period*10);Rst_n = 1'b1;#(`clock_period*10 + 1);key_in = 0;#1000;key_in = 1;#2000;key_in = 0;#1400;key_in = 1;#2600;key_in = 0;#1300;key_in = 1;#200;key_in = 0;#20000100;#50000000;key_in = 1;#2600;key_in = 0;#1000;key_in = 1;#2000;key_in = 0;#1400;key_in = 1;#2600;key_in = 0;#1300;key_in = 1;#200;key_in = 1;#20000100;#50000000;$stop;endendmodule

仿真結(jié)果:
結(jié)果1


3.2 task編寫

`timescale 1ns/1ns
`define clock_period 20module KeyFilter_tb;reg Clk;reg Rst_n;reg key_in;wire key_flag;wire key_state;KeyFilter KeyFilter0(.Clk(Clk),.Rst_n(Rst_n),.key_in(key_in),.key_flag(key_flag),.key_state(key_state));initial Clk = 1;always#(`clock_period/2) Clk = ~Clk;initial beginRst_n = 1'b0;key_in = 1'b1;#(`clock_period*10);Rst_n = 1'b1;#(`clock_period*10 + 1);#30000;PressKey; #10000;PressKey; #10000;PressKey; #10000;$stop;endreg [15:0]myrand;task PressKey;begin//50次隨機(jī)時間按下抖動repeat(50)beginmyrand = {$random}%65536;//0~65535#myrand key_in = ~key_in;endkey_in = 0;#50_000_000;//按下穩(wěn)定//50次隨機(jī)時間釋放抖動repeat(50)beginmyrand = {$random}%65536;//0~65535#myrand key_in = ~key_in;endkey_in = 1;#50_000_000;//釋放穩(wěn)定endendtaskendmodule

注意$random隨機(jī)函數(shù)的用法:

$random這一系統(tǒng)函數(shù)可以產(chǎn)生一個有符號的32bit隨機(jī)整數(shù)。一般的用法是 $random%b,其中 b>0。這樣就會生成一個范圍在(-b+1):(b-1)中的隨機(jī)數(shù)。如果只得到正數(shù)的隨機(jī)數(shù),可采用{$random}%b 來產(chǎn)生。

myrand = {$random}%65536;//0~65535

上述語句的作用即是產(chǎn)生了0~65535之間的隨機(jī)數(shù)。

通過repeat語句循環(huán)50次,就產(chǎn)生了50次不同的延時效果:

repeat(50)beginmyrand = {$random}%65536;//0~65535#myrand key_in = ~key_in;
end

仿真結(jié)果:
結(jié)果2


四、仿真模型

編寫key_model并添加到測試激勵文件中:

`timescale 1ns/1nsmodule key_model(key);output reg key;reg [15:0]myrand;initial beginkey = 1'b1;PressKey; #10000;PressKey; #10000;PressKey; #10000;$stop;endtask PressKey;begin//50次隨機(jī)時間按下抖動repeat(50)beginmyrand = {$random}%65536;//0~65535#myrand key = ~key;endkey = 0;#50_000_000;//按下穩(wěn)定//50次隨機(jī)時間釋放抖動repeat(50)beginmyrand = {$random}%65536;//0~65535#myrand key = ~key;endkey = 1;#50_000_000;//釋放穩(wěn)定endendtask	endmodule

修改KeyFilter_tb:

`timescale 1ns/1ns
`define clock_period 20module KeyFilter_tb;reg Clk;reg Rst_n;wire key_in;wire key_flag;wire key_state;KeyFilter KeyFilter0(.Clk(Clk),.Rst_n(Rst_n),.key_in(key_in),.key_flag(key_flag),.key_state(key_state));key_model key_model0(.key(key_in));initial Clk = 1;always#(`clock_period/2) Clk = ~Clk;initial beginRst_n = 1'b0;#(`clock_period*10);Rst_n = 1'b1;#(`clock_period*10 + 1);endendmodule

整個激勵文件的內(nèi)部結(jié)構(gòu):
仿真模型
仿真結(jié)果:
結(jié)果3

csdn

🧸結(jié)尾


  • ?? 感謝您的支持和鼓勵! 😊🙏
  • 📜您可能感興趣的內(nèi)容:
  • 【FPGA】串口通信講解-狀態(tài)機(jī)判斷數(shù)據(jù)值
  • 【Python】串口通信-與FPGA、藍(lán)牙模塊實現(xiàn)串口通信(Python+FPGA)
  • 【Arduino TinyGo】【最新】使用Go語言編寫Arduino-環(huán)境搭建和點亮LED燈
  • 【全網(wǎng)首發(fā)開源教程】【Labview機(jī)器人仿真與控制】Labview與Solidworks多路支配關(guān)系-四足爬行機(jī)器人仿真與控制
    遇見未來
http://www.risenshineclean.com/news/51006.html

相關(guān)文章:

  • 做國外購物網(wǎng)站網(wǎng)上怎么找人去推廣廣告
  • 站長素材網(wǎng)站種子搜索神器在線引擎
  • 邯鄲網(wǎng)站優(yōu)化平臺fifa最新排名出爐
  • 手機(jī)網(wǎng)站制作合同如何聯(lián)系百度推廣
  • 什么是網(wǎng)站維護(hù)寧波優(yōu)化系統(tǒng)
  • 網(wǎng)站如何做seo的網(wǎng)絡(luò)營銷課程培訓(xùn)機(jī)構(gòu)
  • 無錫知名網(wǎng)站制作求職seo
  • html5手機(jī)網(wǎng)站特效今日山東新聞頭條
  • 麥包包的網(wǎng)站建設(shè)網(wǎng)絡(luò)運(yùn)營推廣
  • 英文網(wǎng)站源碼北京疫情又嚴(yán)重了
  • 如何建設(shè)網(wǎng)站設(shè)計網(wǎng)站軟件推薦
  • 柳州建站免費(fèi)seo視頻教程
  • 自學(xué)做網(wǎng)站界面百度自動駕駛技術(shù)
  • 中國建設(shè)銀行網(wǎng)站u盾修改密碼seo自學(xué)網(wǎng)app
  • 自動優(yōu)化網(wǎng)站建設(shè)服裝市場調(diào)研報告范文
  • 可口可樂公司建設(shè)網(wǎng)站的目的是什么seo推廣優(yōu)化工具
  • 鄭州網(wǎng)站建設(shè)zzjisu網(wǎng)絡(luò)軟文營銷案例3篇
  • 學(xué)校網(wǎng)站源碼php地推團(tuán)隊接單平臺
  • phpcms v9 網(wǎng)站搬家軟件培訓(xùn)機(jī)構(gòu)排名
  • 開源展示型網(wǎng)站沈陽seo優(yōu)化新勢力
  • 網(wǎng)站建設(shè)推廣選stso88效果好91關(guān)鍵詞
  • 專業(yè)做網(wǎng)站的技術(shù)人員百度網(wǎng)站如何優(yōu)化排名
  • 怎么做網(wǎng)站開發(fā)中國最新消息
  • 深圳網(wǎng)站建設(shè)哪家公司好我贏網(wǎng)客服系統(tǒng)
  • window2003iis建好的網(wǎng)站營銷型網(wǎng)站建設(shè)論文
  • WordPress主題沒有刪除站內(nèi)優(yōu)化seo
  • 做網(wǎng)站北京重慶seo技術(shù)教程博客
  • 長沙優(yōu)化網(wǎng)站技術(shù)廠家seo網(wǎng)站推廣有哪些
  • 網(wǎng)站建設(shè)和錢外貿(mào)網(wǎng)站免費(fèi)推廣b2b
  • 網(wǎng)站如何能讓百度收錄網(wǎng)站數(shù)據(jù)