实验四、七人表决器的设计实验报告 一、实验目的 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)
|