實驗四、七人表決器的設計實驗報告 一、實驗目的 1、初步了解Verilog語言。 2、學會用Verilog語言的行為描述方式來設計電路。 二、實驗原理 用七個開關作為表決器的7個輸入變量,輸入變量為邏輯“1”時表示表決者“贊同”;輸入變量為邏輯“0”時,表示表決者“不贊同”。輸出邏輯“1”時,表示表決“通過”;輸出邏輯“0”時,表示表決“不通過”。當表決器的七個輸入變量中有4個以上(含4個)為“1”時,則表決器輸出為“1”;否則為“0”。 七人表決器設計方案很多,比如用多個全加器采用組合電路實現。用VHDL語言設計七人表決器時,也有多種選擇。我們可以用結構描述的方式用多個全加器來實現電路,也可以用行為描述。采用行為描述時,可用一變量來表示選舉通過的總人數。當選舉人大于或等于4時為通過,綠燈亮;反之不通過時,黃燈亮。描述時,只須檢查每一個輸入的狀態(通過為“1”,不通過為“0”),并將這些狀態值相加,判斷狀態值和即可選擇輸出。 三、實驗內容 1、用Verilog語言設計七人表決器(VHDL程序代碼可附在實驗報告后面)。 2、下載并驗證結果。 四、實驗結果 1、畫出你設計的七人表決器的仿真波形圖。 <一>方案比較: 消抖方式: - <font color="rgb(0, 0, 0)">always@(posedge clk or posedge rst)
- begin
- if(rst)
- begin
- sum<=0;
- date_in<=0;
- end
- else
- begin
- if(in)
- begin
- yl<=yl+1;
- if(js==5'b11111) //按鍵消抖
- begin
- yl<=0;
- sum=0;
- date_in<=date_in | in;
- sum=0;
- for(i=0;i<7;i=i+1)
- if(date_in[i])
- sum=sum+1;
- end
- end
- end
- end</font>
復制代碼
延時消抖: always@(posedge clk or posedge rst) begin if(rst) cnt<=20'd0; else if(vote) cnt<=20'd0; else begin cnt<=cnt+1'b1; end end 結論:第一個消抖方法可以達到內外消抖,第二個就是一個很簡單的延時消抖,很容易理解。 always@(vote or rst) begin if(rst) begin sum<=0; end else sum<=vote[6]+vote[5]+vote[4]+vote[3]+vote[2]+vote[1]+vote[0]; end 結論:第一7bit數相加,統計投票的人數,第二,利用for 循環來完成投票人數的統計。 <二>硬件測試 2.1管腳約束 Out:pin-127 show:pin-133 Pin-126 pin-135 Pin-125 pin-136 Din:pin-32 pin-137 Pin-33 pin-138 Pin-34 pin-141 Pin-38 pin-142 Pin-39 pin-128 Pin-42 Pin-43 Pin-44 2.2 quarters ll操作平臺以及試驗箱 <三>軟件測試 always@(vote or rst) begin if(rst) begin sum<=0; end else sum<=vote[6]+vote[5]+vote[4]+vote[3]+vote[2]+vote[1]+vote[0]; end end 這段是利用7bit的數相加來得到投票通過的人數 always@(posedge clk or posedge rst) begin if(rst) cnt<=20'd0; else if(vote) cnt<=20'd0; else begin cnt<=cnt+1'b1; end end 這段是利用延時消抖 always@(posedge clk or posedge rst) begin if(rst) begin out<=3'b111; count<=0; end else begin case(count) 0 : begin out<=3'b110; case (sum[2:0]) 3'b000:show <= 8'b11111100; 3'b001:show <= 8'b01100000; 3'b010:show <= 8'b11011010; 3'b011:show <= 8'b11110010; 3'b100:show <= 8'b01100110; 3'b101:show <= 8'b10110110; 3'b110:show <= 8'b10111110; 3'b111:show <= 8'b11100000; endcase count<=count+1; end 1 : begin out<=3'b111; if(sum>=4) show<=8'b01100000; else show<=8'b11111100; count<=count+1; end endcase end end endmodule 這段是片選兩個數碼管,一個數碼管用來顯示投票的人數,一個顯示大于等于四個人時用1表示通過,其他情況則為零。
<四>實驗流程圖
<五>七人表決器源程序 module test4(vote,show,out,rst,clk); input rst,clk; output reg [2:0]out; output reg[7:0]show; input [6:0] vote; reg[19:0] cnt; reg [2:0]sum; reg count; integeri;//定義整型變量i為循環控制變量 always@(vote or rst) begin if(rst) begin sum<=0; end else sum<=vote[6]+vote[5]+vote[4]+vote[3]+vote[2]+vote[1]+vote[0]; end always@(posedge clk or posedge rst) begin if(rst) cnt<=20'd0; else if(vote) cnt<=20'd0; else begin cnt<=cnt+1'b1; end end always@(posedge clk or posedge rst) begin if(rst) begin out<=3'b111; count<=0; end else begin case(count) 0 : begin out<=3'b110; case (sum[2:0]) 3'b000:show <= 8'b11111100; 3'b001:show <= 8'b01100000; 3'b010:show <= 8'b11011010; 3'b011:show <= 8'b11110010; 3'b100:show <= 8'b01100110; 3'b101:show <= 8'b10110110; 3'b110:show <= 8'b10111110; 3'b111:show <= 8'b11100000; endcase count<=count+1; end 1 : begin out<=3'b111; if(sum>=4) show<=8'b01100000; else show<=8'b11111100; count<=count+1; end endcase end end endmodule 2、簡單描述你設計的七人表決器下載到試驗箱上的結果。(手寫) 片選了兩個數碼管,第一個數碼管當投票人數小于4的時候,顯示0。每撥下一個開關,第二個數碼管顯示的數字按照123順序遞增,當投票人數大于等于4的時候,第一個數碼管有0變成1,但是第二個數碼管現實的數字按照4567順序遞增。 五、實驗小結(手寫) 通過這段時間的EDA實驗,我更加熟練地掌握了EDA開發的基本流程,熟練地使用Quartus ll軟件進行編程,在自己的努力下,完成了七人表決器的相關設計,感謝老師和同學給我的幫助。同時,我發現了自己的編程思路還不是很清晰,需要在以后的學習中加強鍛煉。此次實驗收獲很多,學會了延時消抖,對case語句的使用越來越熟練,這個程序雖然耗費了一些時間來寫,但是在這個反復修改的過程中,我學習到了一些新東西,在驗收實驗的過程中,也逐漸意識到對于語法規范性的重要性,以及編程過程中寫程序的格式的規范性。
完整的Word格式文檔51黑下載地址:
實驗四指導書七人表決器.doc
(128.5 KB, 下載次數: 93)
2017-11-23 14:39 上傳
點擊文件名下載附件
eda課程設計
|