1、实验目的 掌握了解格抢答器的工作原理,并用verilog硬件语音来实现抢答器的模模块以及test_bench,最后在Robei可视化仿真软件经行功能实现和仿真验证。 2、实验原理 抢答器实现的是: 1、四人通过按键抢答,最先按下按键的人抢答成功,此后其他人抢答无效。 2、每次只有一人可获得抢答资格,一次抢答完后主持人通过复位按键复位,选手再从新抢答。 3、有从新开始游戏按键,游戏从新开始时每位选手有5分的初始分,答对加1分,答错扣1分,最高分不能超过9分,当选手得分减为0时取消该选手抢答资格。 4、选手抢答成功时其对应的分数闪烁。 3、实验内容 3.1snatch(抢答)模块设计 1)、 新建一个模型命名为snatch,类型为 module,同时具备 3 输入 2 输出,每个引脚的属性和名称参照下图1经行对应的修改。 ![](http://c.51hei.com/a/huq/a/a/g/171/171.001.jpg)
图1snatch引脚属性 ![](http://c.51hei.com/a/huq/a/a/g/171/171.002.jpg)
图2snatch界面图 2)、添加代码。点击模型下方的 Code添加代码。 代码: - <font style="font-size: 14px">/********************************/
- reg c;
- reg q;
- reg [1:0] s;
- wire out=(key[0]&(data[3:0]!=0)|key[1]&(data[7:4]!=0)|key[2]&(data[11:8]!=0)|key[3]&(data[15:12]!=0));
- wire clk=out&(!q);
- assign m={c,s};
- always@(posedge clk or clr)
- if(!clr)
- begin
- q<=0;c<=0;
- end
- else
- begin
- c<=1;q<=!q;
- end
- always@(posedge clk)
- case(key)
- 4'b0001:s<=2'b00;
- 4'b0010:s<=2'b01;
- 4'b0100:s<=2'b10;
- 4'b1000:s<=2'b11;
- default:s<=2'b??;
- endcase
- assign
- led=({c,s}==3'b100)?4'b0001:({c,s}==3'b101)?4'b0010:({c,s}==3'b110)?4'b0100:({c,s}==3'b111)?4'b1000:4'b0000;
- /********************************/</font>
复制代码
3)、保存模型到一个文件夹(文件夹路径不能有空格和中文)中,运行并检查有无错误输出。 3.2store(计分)模块的设计 1)、 新建一个模型命名为store,类型为 module,同时具备 3 输入 2 输出,每个引脚的属性和名称参照下图3经行对应的修改。 ![](http://c.51hei.com/a/huq/a/a/g/171/171.003.jpg)
图3 store引脚的属性 ![](http://c.51hei.com/a/huq/a/a/g/171/171.004.jpg)
图4store界面图 2)、添加代码。点击模型下方的 Code添加代码。 代码: - <font style="font-size: 14px">/********************************/
- always @(posedge clk or posedge start)
- if(start) q<=16'b0101010101010101;
- else if(up)
- case(s)
- 3'b100: if(q[3:0]>=4'h9) q[3:0]<=q[3:0];else q[3:0]<=q[3:0]+1;
- 3'b101: if(q[7:4]>=4'h9) q[7:4]<=q[7:4]; else q[7:4]<=q[7:4] +1;
- 3'b110: if(q[11:8]>=4'h9) q[11:8]<=q[11:8];else q[11:8]<=q[11:8]+1;
- 3'b111: if(q[15:12]>=4'h9) q[15:12]<=q[15:12];else q[15:12]<=q[15:12]+1;
- endcase
- else
- case(s)
- 3'b100:if(q[3:0]>4'h0) q[3:0]<=q[3:0]-1;
- 3'b101:if(q[7:4]>4'h0) q[7:4]<=q[7:4]-1;
- 3'b110:if(q[11:8]>4'h0) q[11:8]<=q[11:8]-1;
- 3'b111:if(q[15:12]>4'h0) q[15:12]<=q[15:12]-1;
- Endcase
- /********************************/</font>
复制代码
3)、保存模型到一个文件夹(文件夹路径不能有空格和中文)中,运行并检查有无错误输出。 3.3qiangdaqi(顶层)模块设计 1)、 新建一个模型命名为qiangdaqi,类型为 module,同时具备 5 输入 2 输出,每个引脚的属性和名称参照下图5经行对应的修改。 ![](http://c.51hei.com/a/huq/a/a/g/171/171.005.jpg)
图5qiangdaqi引脚属性 ![](http://c.51hei.com/a/huq/a/a/g/171/171.006.jpg)
图6 qiangdaqi界面图 3.4qiangdaqi_test测试文件的设计 1) 新建一个5输入 2 输出的qiangdaqi_test测试文件,记得将 Module Type 设置为 “testbench”,各个引脚配置如图7所示。 ![](http://c.51hei.com/a/huq/a/a/g/171/171.007.jpg)
图7qiangdaqi_test引脚属性 - 、另存为测试文件。将测试文件保存到上面创建的模型所在的文件夹下。加入模型。 在 Toolbox 工具箱的 Current 栏里,会出现模型,单击该模型并在qiangdaqi _test上添加,并连接引脚,如下图8所示:
![](http://c.51hei.com/a/huq/a/a/g/171/171.008.jpg)
图8 qiangdaqi_test界面图 4) 输入激励。点击测试模块下方的“Code”,输入激励算法。激励代码在结束 的时候要用$finish 结束。 测试代码: - <font style="font-size: 14px">/***********************************/
- initial begin
- start=1;
- clk=0;
- clr=0;
- up=0;
- key=4'b0000;
- #10 clr=1;
- start=0;
- up=1;
- #2 key=4'b0001;
- #10 clr=0;
- up=0;
- #10 clr=1;
- start=0;
- up=1;
- #2 key=4'b0001;
- #10 clr=0;
- up=0;
- #10 clr=1;
- start=0;
- up=1;
- #2 key=4'b0001;
- #10 clr=0;
- up=0;
- #10 clr=1;
- start=0;
- key=4'b0010;
- up=1;
- #10 clr=0;
- up=0;
- #10 clr=1;
- start=0;
- key=4'b0010;
- up=1;
- #10 clr=0;
- up=0;
- #5 $finish;
- end
- always #7 clk=~clk;
- /***********************************/</font>
复制代码
5) 执行仿真并查看波形。查看输出信息。检查没有错误之后查看波形。点击右侧 Workspace 中的信号,进行添加并查看分析仿真结果。如图9所示: ![](http://c.51hei.com/a/huq/a/a/g/171/171.009.jpg)
图9 qiangdaqi_test仿真波形 4.思考1、思考能不能扩写成n位抢答器。
以上图文的Word格式文档下载(内容和本网页上的一模一样,方便大家保存):
抢答器.docx
(452.28 KB, 下载次数: 2)
|