找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 27175|回复: 2
收起左侧

Verilog七人表决器的设计课程设计实验报告

[复制链接]
ID:252668 发表于 2017-11-23 14:40 | 显示全部楼层 |阅读模式
实验四、七人表决器的设计实验报告
一、实验目的
1、初步了解Verilog语言。
2、学会用Verilog语言的行为描述方式来设计电路。
二、实验原理
用七个开关作为表决器的7个输入变量,输入变量为逻辑“1”时表示表决者“赞同”;输入变量为逻辑“0”时,表示表决者“不赞同”。输出逻辑“1”时,表示表决“通过”;输出逻辑“0”时,表示表决“不通过”。当表决器的七个输入变量中有4个以上(含4个)为“1”时,则表决器输出为“1”;否则为“0”。
七人表决器设计方案很多,比如用多个全加器采用组合电路实现。用VHDL语言设计七人表决器时,也有多种选择。我们可以用结构描述的方式用多个全加器来实现电路,也可以用行为描述。采用行为描述时,可用一变量来表示选举通过的总人数。当选举人大于或等于4时为通过,绿灯亮;反之不通过时,黄灯亮。描述时,只须检查每一个输入的状态(通过为“1”,不通过为“0”),并将这些状态值相加,判断状态值和即可选择输出。
三、实验内容
1、用Verilog语言设计七人表决器(VHDL程序代码可附在实验报告后面)。
2、下载并验证结果。
四、实验结果
1、画出你设计的七人表决器的仿真波形图。
<一>方案比较:
消抖方式:
  1. <font color="rgb(0, 0, 0)">always@(posedge clk or posedge rst)
  2. begin
  3.               if(rst)
  4.                             begin
  5.                             sum<=0;
  6.                             date_in<=0;
  7.                             end
  8.               else
  9.               begin
  10.                             if(in)
  11.                                           begin
  12.                                                         yl<=yl+1;
  13.                                                         if(js==5'b11111)                            //按键消抖
  14.                                                                       begin
  15.                                                                                     yl<=0;
  16.                                                                                     sum=0;
  17.                                                                                     date_in<=date_in | in;
  18.                                                                                     sum=0;
  19.                                                                                     for(i=0;i<7;i=i+1)
  20.                                                                                                   if(date_in[i])
  21.                                                                                                                 sum=sum+1;            
  22.                                                                       end
  23.                                           end
  24.                             end                 
  25. 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表示通过,其他情况则为零。

<四>实验流程图
0.png

<五>七人表决器源程序
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语句的使用越来越熟练,这个程序虽然耗费了一些时间来写,但是在这个反复修改的过程中,我学习到了一些新东西,在验收实验的过程中,也逐渐意识到对于语法规范性的重要性,以及编程过程中写程序的格式的规范性。
评价项目
所得分数
报告完整正确
□3分    □2分    □1分   其它:    分
程序正确
□3分    □2分    □1分   其它:    分
结果正确
□4分    □3分    □2分   其它:    分
总分:                 分               
日期:      年   月   日  签名:


完整的Word格式文档51黑下载地址:
实验四指导书七人表决器.doc (128.5 KB, 下载次数: 93)

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:252668 发表于 2017-11-23 14:53 | 显示全部楼层
哈哈,试试
回复

使用道具 举报

ID:298081 发表于 2019-1-14 14:41 | 显示全部楼层
谢谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表