軟件:Quartus
語言:Verilog
代碼功能:
1.?要求
電梯可在4層之間移動(dòng),每層都有按鈕,所有按鈕都在電梯外部。?按下按鈕意味著需要采取某些措施,以下各節(jié)將對(duì)此進(jìn)行詳細(xì)說明。?電梯系統(tǒng)可以建模為有限狀態(tài)機(jī),該有限狀態(tài)機(jī)經(jīng)歷狀態(tài)轉(zhuǎn)換并根據(jù)提供的輸入產(chǎn)生輸出。?設(shè)計(jì)有限狀態(tài)機(jī)并通過使用狀態(tài)圖或表來描述其行為。?根據(jù)以下規(guī)范在Verilog中實(shí)施該系統(tǒng),并提交代碼,波形以及描述該波形的詳細(xì)記錄。
1.1?描述
除時(shí)鐘信號(hào)外,系統(tǒng)還有6個(gè)輸入。?時(shí)鐘信號(hào)用于同步目的。?按鈕1U位于一樓,2U和2D位于二樓,3U和3D位于三樓,4D位于四樓。?按下按鈕及其含義如下表所示。
請(qǐng)注意,不同樓層的相同名稱的開關(guān)連接在一起。?因此,例如,如果在任意樓層按下1U,則只有一個(gè)信號(hào)將被激活并被饋送到電梯控制器
輸入(按鈕) | 意義 |
1U | 一樓的人想去二樓 |
2U | 二樓的人想去三樓 |
3U | 三樓的人想去四樓 |
4D | 四樓的人想去三樓 |
3D | 三樓的人想去二樓 |
2D | 二樓的人想去一樓 |
1.2?輸出說明
有3個(gè)輸出指示要采取的措施,并在下表中列出。
輸出?(電梯的動(dòng)作) | 意義 |
Up | 電梯向上走 |
Down | 電梯向下走 |
Stay | 電梯停在相同的層 |
1.3?系統(tǒng)行為
電梯可以位于4層中的任何一層;?1樓,2樓,3樓或4樓。在每個(gè)時(shí)鐘周期,根據(jù)是否按下按鈕,必須采取某些措施,其列表如下:
電梯當(dāng)前位置 | 輸入 | 采取的行動(dòng)順序 |
一樓 | 1U | 將電梯移至二樓 |
2U | 將電梯移至二樓,然后移至三樓 | |
2D | 將電梯移至第二層,然后移至第一層 | |
3U | 將電梯移至3樓,然后移至4樓 | |
3D | 將電梯移至三樓,然后移至二樓 | |
4D | 將電梯移至4樓,然后移至3樓 | |
二樓 | 1U | 將電梯移至第一層,然后移至第二層 |
2U | 將電梯移至三樓 | |
2D | 將電梯移至二樓 | |
3U | 將電梯移至3樓,然后移至4樓 | |
3D | 將電梯移至三樓,然后移至二樓 | |
4D | 將電梯移至4樓,然后移至3樓 | |
三樓 | 1U | 將電梯移至第一層,然后移至第二層 |
2U | 將電梯移至二樓,然后移至三樓 | |
2D | 將電梯移至第二層,然后移至第一層 | |
3U | 將電梯移至4樓 | |
3D | 將電梯移到二樓 | |
4D | 將電梯移至4樓,然后移至3樓 | |
四樓 | 1U | 將電梯移至第一層,然后移至第二層 |
2U | 將電梯移至二樓,然后移至三樓 | |
2D | 將電梯移至第二層,然后移至第一層 | |
3U | 將電梯移至3樓,然后移至4樓 | |
3D | 將電梯移至3樓,然后移至2樓 | |
4D | 將電梯移至三樓 |
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
設(shè)計(jì)文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. Testbench
5. 仿真圖
1、按下D3,電梯原本在1樓,先上升到3樓,再下降到2樓。
2、按下U1,電梯原本在2樓,先下降到1樓,再上升到2樓。
3、同時(shí)按下U3和D2,電梯原本在2樓,先執(zhí)行U3,上升到3樓,再上升到4樓,然后執(zhí)行D2,下降到2樓,再下降到1樓。
4、按下D4,電梯原本在1樓,先上升到4樓,再下降到3樓。
5、按下U2,電梯原本在3樓,先下降到2樓,再上升到3樓。
部分代碼展示:
module?InputBuffer(clk,U1,U2,U3,D2,D3,D4,done,qEmpty,up_down_key); input?clk;//時(shí)鐘 input?U1,U2,U3,D2,D3,D4;//輸入按鍵 input?done;//done信號(hào) output?qEmpty;//高電平表示緩沖區(qū)沒有待響應(yīng)按鍵 output?[5:0]?up_down_key;//按鍵編號(hào) //定義信號(hào) reg?[5:0]?up_down_key=6'b0; reg?[5:0]?btn_up_down=6'b000000;//6it按鍵緩存,最高位->最低位依次代表U1,U2,U3,D2,D3,D4 reg?qEmpty; //定義按鍵D觸發(fā)器緩存 reg?U1_buf0,U1_buf1; reg?U2_buf0,U2_buf1; reg?U3_buf0,U3_buf1; reg?D2_buf0,D2_buf1; reg?D3_buf0,D3_buf1; reg?D4_buf0,D4_buf1; //定義按鍵上升沿信號(hào) wire?U1_p; wire?U2_p; wire?U3_p; wire?D2_p; wire?D3_p; wire?D4_p; //D觸發(fā)器緩存2級(jí) always@(posedge?clk) begin U1_buf0<=U1; U1_buf1<=U1_buf0; end //D觸發(fā)器緩存2級(jí) always@(posedge?clk) begin U2_buf0<=U2; U2_buf1<=U2_buf0; end //D觸發(fā)器緩存2級(jí) always@(posedge?clk) begin U3_buf0<=U3; U3_buf1<=U3_buf0; end //D觸發(fā)器緩存2級(jí) always@(posedge?clk) begin D2_buf0<=D2; D2_buf1<=D2_buf0; end //D觸發(fā)器緩存2級(jí) always@(posedge?clk) begin D3_buf0<=D3; D3_buf1<=D3_buf0; end //D觸發(fā)器緩存2級(jí) always@(posedge?clk) begin D4_buf0<=D4; D4_buf1<=D4_buf0; end //獲取按鍵上升沿,信號(hào)為一個(gè)時(shí)鐘的高電平 assign?U1_p=U1_buf0?&?~U1_buf1;//1U按鍵上升沿,1個(gè)時(shí)鐘高電平 assign?U2_p=U2_buf0?&?~U2_buf1;//2U按鍵上升沿,1個(gè)時(shí)鐘高電平 assign?U3_p=U3_buf0?&?~U3_buf1;//3U按鍵上升沿,1個(gè)時(shí)鐘高電平 assign?D2_p=D2_buf0?&?~D2_buf1;//D2按鍵上升沿,1個(gè)時(shí)鐘高電平 assign?D3_p=D3_buf0?&?~D3_buf1;//D3按鍵上升沿,1個(gè)時(shí)鐘高電平 assign?D4_p=D4_buf0?&?~D4_buf1;//D4按鍵上升沿,1個(gè)時(shí)鐘高電平 //按鍵緩存到btn_up_down always@(posedge?clk) begin if(U1_p==1)? btn_up_down[5]<=1;?//1U按鍵緩存在btn_up_down的bit5 else?if(up_down_key==6'b100_000)//按鍵執(zhí)行 btn_up_down[5]<=0;//清除緩存 else btn_up_down[5]<=btn_up_down[5];//keep if(U2_p==1)? btn_up_down[4]<=1;?//2U按鍵緩存在btn_up_down的bit4 else?if(up_down_key==6'b010_000)//按鍵執(zhí)行 btn_up_down[4]<=0;//清除緩存 else btn_up_down[4]<=btn_up_down[4];//keep if(U3_p==1)? btn_up_down[3]<=1;?//3U按鍵緩存在btn_up_down的bit3 else?if(up_down_key==6'b001_000)//按鍵執(zhí)行 btn_up_down[3]<=0;//清除緩存 else btn_up_down[3]<=btn_up_down[3];//keep if(D2_p==1)? btn_up_down[2]<=1;?//2D按鍵緩存在btn_up_down的bit2 else?if(up_down_key==6'b000_100)//按鍵執(zhí)行 btn_up_down[2]<=0;//清除緩存 else btn_up_down[2]<=btn_up_down[2];//keep if(D3_p==1)? btn_up_down[1]<=1;?//3D按鍵緩存在btn_up_down的bit1 else?if(up_down_key==6'b000_010)//按鍵執(zhí)行 btn_up_down[1]<=0;//清除緩存 else btn_up_down[1]<=btn_up_down[1];//keep if(D4_p==1)? btn_up_down[0]<=1;?//4D按鍵緩存在btn_up_down的bit0 else?if(up_down_key==6'b000_001)//按鍵執(zhí)行 btn_up_down[0]<=0;//清除緩存 else btn_up_down[0]<=btn_up_down[0];//keep end always@(*)? begin if(done==1)//done==1表示可以讀取按鍵緩存btn_up_down[5:0]內(nèi)的數(shù)據(jù),按?1U,?2U,?3U,?2D,?3D,?4D順序執(zhí)行 if(btn_up_down[5])?????? up_down_key=6'b100_000;//執(zhí)行1U按鍵 else?if(btn_up_down[4])? up_down_key=6'b010_000;//執(zhí)行2U按鍵 else?if(btn_up_down[3])? up_down_key=6'b001_000;//執(zhí)行3U按鍵 else?if(btn_up_down[2])? up_down_key=6'b000_100;//執(zhí)行2D按鍵 else?if(btn_up_down[1])? up_down_key=6'b000_010;//執(zhí)行3D按鍵 else?if(btn_up_down[0])? up_down_key=6'b000_001;//執(zhí)行4D按鍵 else up_down_key=6'b000_000;//清除 else up_down_key=up_down_key; if(btn_up_down==6'b000_000)//若btn_up_down==6'b000_000表示沒有待響應(yīng)按鍵,輸出高電平,否則輸出低電平 qEmpty=1; else qEmpty=0; end endmodule
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=407