源代码地址:https://github.com/penggeon/catanddog

效果演示见: https://www.bilibili.com/video/BV1n24y147S1

警告:

仅给出了实验过程的源代码,需手动复制粘贴至自己项目中。

主模块默认名为 catanddog,若需使用请自行修改。

设计课题的任务要求

任务描述

一个人要将 1 只狗、 1 只猫、 1 只老鼠渡过河,独木舟一次只能装载人和一只动物,但猫和狗不能单独在一起,而猫和老鼠也不能友好相处,试模拟这个人将三只动物安全渡过河的过程。

基本要求

1、 SW6 作为整机开关, SW6=0 为关机状态, 点阵、 数码管和发光二极管为全灭状态;

SW6=1 时,启动游戏,在 8× 8 点阵显示猫、狗、鼠均在左岸的情况(如图 3-1 所示),其中红色方块表示猫, 绿色方块表示狗, 黄色方块表示鼠; 数码管 DISP1-DISP0显示渡河次数,启动时显示“00”; LD15 和 LD0 显示独木舟所在位置, LD15 亮表示独木舟在左岸, LD0 亮表示独木舟在右岸,启动时独木舟在左岸;

2、 BTN0 为复位键,任何时候按下复位都重新启动游戏;

3、 BTN7 代表猫, BTN6 代表狗, BTN5 代表鼠,按下对应的按键表示带该动物过河,同时点阵上显示过河动画。 例如按下 BTN6 选择狗,点阵按图 3-2 所示过程显示过河动画,每秒切换一幅图案;

4、 带某动物过河时要求独木舟和该动物在河的同侧, 如果不在同侧,则按键无效;

5、 BTN4 代表独木舟单独往返,按下后在 LD0~LD15 上显示渡河过程,根据独木舟当前所在位置,依次点亮 LD0~LD15 或 LD15~LD0,每 0.25 秒切换一个 LED;

6、 在数码管 DISP1-DISP0 显示渡河次数, 带动物过河或者独木舟单独往返渡河次数均加 1;

7、 将三只动物全部带到右岸则游戏成功, LD0~LD15 全亮表示成功,按 BTN0 可重新启动游戏;

8、 如果出现猫和鼠或者猫和狗单独在河的某侧,则游戏失败, LD0~LD15 全灭表示失败,按 BTN0 可重新启动游戏。

提高要求

1、 游戏难度可以设置,不同难度要在不同的渡河次数之内完成游戏,在规定步数内未完成游戏则为失败;

2、 在不同情况下播放不同的音效或乐曲;

3、 自拟其它功能。

系统设计(设计思路、总体框图、分块设计)

设计思路

模块化设计,自顶向下设计,自下向上实现。

时钟分频模块将1kHz时钟分频为4Hz与0.25Hz供其他模块使用,消抖模块将按钮经过消抖输出有效短脉冲信号,计数器模块产生需要的计数器供其他模块使用,LED模块、点阵模块、数码管模块、蜂鸣器模块实现底层功能,Main模块实现主要的游戏逻辑。

总体框图

分块设计

顶层模块

顶层模块负责各自模块之间的连接

主模块

Main模块,负责主要逻辑的实现。

包括按下各个按钮后标志位的更新、游戏状态实时更新,正常游戏时猫、狗、鼠位置变量的变换即过河动画,复位键按下后标志位置初始值、位置变量置零等操作。

时钟分频模块(系列)

时钟频率选用1kHz,项目中需要采用其他频率时钟,故而进行时钟分频。

包括divide_4Hz,divide_025Hz两个时钟分频模块,分别产生4Hz时钟与0.25Hz时钟。

计数器模块(系列)

项目设计中需要各种计数器,故将计数器单独拿出,封装为了不同的模块。

包括Counter_8,Counter_2,Counter_2_025Hz,Counter_8_4Hz四个计数器模块,前两者分别是1kHz时钟下产生的模8计数器与模2计数器,后两者分别是0.25Hz时钟下产生的模8计数器与模2计数器。

消抖模块

由于机械按键按下后可能会产生抖动,导致一次的按键按下事件被识别为多次按键按下,故按键信号均需经过消抖模块进行处理。该项目利用debounce模块进行消抖。

LED模块

LED模块采用组合逻辑设计。

第一步判断开机拨码sw6,sw6为0时输出信号全为0,sw6为1时继续判断。

第二步判断难度设置拨码sw5,sw5为1时根据counter_2_025Hz计数器输出信号来实现LED的闪烁效果,表示此时正处于难度设置中,sw5为0时继续判断。

第三步判断游戏状态标志位,若成功,则LED输出信号全为1,若失败,则LED输出信号全为0,若正在处于游戏中,则根据Main模块的输出信号cnt_canoe来判断此时的独木舟处于何处,并正确显示。

点阵模块

点阵模块采用组合逻辑设计。

第一步判断开机拨码sw6,sw6为0时行信号输出为1,列信号输出为0,sw6为1时继续判断。

第二步判断难度设置拨码sw5。

若sw为1,则根据游戏难度,显示不同的动画,提示用户不同的游戏难度,其中点阵行扫描采用计数器Counter_8的输出信号实现。

若sw为0,则根据游戏状态,显示不同的动画。

游戏失败:显示叉号。

游戏成功:显示对勾。

游戏进行中:通过Main的输出信号判断猫、狗、鼠的位置显示不同的点阵动画。

数码管模块

数码管模块采用组合逻辑设计。

第一步判断开机拨码sw6,sw6为0时阴极信号cat全为1,阳极信号seg全为0,sw6为1时继续判断。

第二步判断模2计数器输出信号,判断是显示个位还是十位。

第三步判断难度设置拨码sw5。

若sw为1,则根据游戏难度,显示不同的数字(个位与十位不同),提示用户不同的渡河次数限制。

若sw为0,则根据游戏状态,显示不同的动画。

游戏失败:显示HH,表示失败。

游戏成功:显示UU,表示成功。

游戏进行中:通过Main的输出信号tens与ones分别显示当前的渡河次数。

蜂鸣器模块

蜂鸣器模块采用组合逻辑设计。

第一步判断开机拨码sw6,sw6为0时蜂鸣器输出信号为0,,sw6为1时继续判断。

第二步判断开机拨码sw5,sw6为1时蜂鸣器输出信号为0,,sw6为0时继续判断。

第三步判断游戏状态,通过count_8_4Hz信号改变蜂鸣器输出。

游戏失败:输出周期1s,占空比为25%的信号。

游戏成功:输出周期0.5s,占空比为50%的信号。

游戏进行中:输出信号为0。

功能说明及资源利用情况

功能说明

拨码开关

拨码开关sw6为总开关,只有拨上sw6才能正常进行游戏。

拨码开关sw5为游戏难度设置,当sw5拨上时,每隔4s切换一次游戏难度,游戏难度由0到3依次变换,难度默认为0。当难度为0时,最多渡河次数为15次;难度为1时,最多渡河次数为13次;难度为2时,最多渡河次数为9次;难度为3时,最多渡河次数为6次

按键

按键BTN7为猫过河按键,按下猫过河。

按键BTN6为狗过河按键,按下狗过河。

按键BTN5为鼠过河按键,按下鼠过河。

按键BTN4为独木舟过河按键,按下独木舟单独过河。

按键BTN0为复位建,按下游戏复位。

游戏难度设置

处于游戏难度设置时,LED灯闪烁,数码管提示次数,点阵显示难度。

难度为0时,数码管显示15,点阵显示绿色小火。

难度为1时,数码管显示13,点阵显示绿色中火。

难度为2时,数码管显示9,点阵显示黄色中火。

难度为3时,数码管显示7,点阵显示红色大火。

游戏状态

游戏成功时,LED灯全亮,点阵显示对勾,数码管显示UU,蜂鸣器间断蜂鸣,占空比为25%。

游戏失败时,LED灯全灭,点阵显示叉号,数码管显示HH,蜂鸣器间断蜂鸣,占空比为50%。

资源利用情况

晶振时钟

利用情况:利用

使用1kHz时钟作为总时钟输入。

SW拨码

利用情况:SW6,SW5

SW6,游戏开关拨码。

SW5,游戏难度设置拨码。

BTN按钮

利用情况:BTN7,BTN6,BTN5,BTN4,BTN0

BTN7,猫过河按键。

BTN6,狗过河按键。

BTN5,鼠过河按键。

BTN4,独木舟单独过河按键。

BTN0,复位键。

LED灯

利用情况:LED15~0

作用:表示游戏难度设置,游戏成功,游戏失败,独木舟位置

点阵

利用情况:row150,col_r150,col_g15~0

作用:表示游戏难度设置,游戏成功,游戏失败,猫狗鼠位置

数码管

利用情况:DISP1~0

作用:表示最多渡河次数,游戏成功,游戏失败,当前渡河次数

蜂鸣器

利用情况:利用

作用:表示游戏成功,游戏失败

故障及问题分析

组合逻辑与时序逻辑

原本LED、点阵、数码管与蜂鸣器模块是采用时序逻辑实现的,但在仿真以及下载中出现了问题,实现现象为各个输出信号均无法确定。

由于这些模块并不需要每隔一段时间更改一次,于是改为采用组合逻辑实现。只需根据不同的情况,使输出连接不同的信号即可。

时序逻辑always块设计

always@(posedge clk or posedge btn7 or posedge btn6) 之类的 always 块中,应当首先判断 btn7、btn6 是否按下即

if(btn7)begin

end
else if (btn6)beign end
else beign
// 此处编写时钟上升沿触发后的逻辑
end

反之,若在 if 中判断诸如 sw6 或者敏感条件列表中不存在的信号,会报错,硬件是不支持这样设计的。

若需在 btn7 按下同时判断 sw6 ,可以采用以下代码实现

if(btn7)begin
If(sw6)begin
// 此处编写正常逻辑
end
end

总结和结论

Verilog设计

Verilog设计时应采用自顶向下设计,自下向上实现的思路。在各个模块中实现简单或目标清晰的功能,确认各模块功能正常后,拼接子模块,实现整体功能的实现。

猫狗过河实现思路

猫狗过河实验中重要的一些变量(reg型)为标志位,各个子模块(LED、点阵等模块)可根据标志位改变自己的输出信号,而不需要关心标志位的更改。

在Main模块中实现主要的功能,此时可以更改标志位,表示猫的位置,或独木舟的位置,以及游戏是否成功等,而不需要关心在具体的状态时底层如何显示。

verilog 编写猫狗过河实验的更多相关文章

  1. 使用pytorch完成kaggle猫狗图像识别

    kaggle是一个为开发商和数据科学家提供举办机器学习竞赛.托管数据库.编写和分享代码的平台,在这上面有非常多的好项目.好资源可供机器学习.深度学习爱好者学习之用.碰巧最近入门了一门非常的深度学习框架 ...

  2. Kaggle系列1:手把手教你用tensorflow建立卷积神经网络实现猫狗图像分类

    去年研一的时候想做kaggle上的一道题目:猫狗分类,但是苦于对卷积神经网络一直没有很好的认识,现在把这篇文章的内容补上去.(部分代码参考网上的,我改变了卷积神经网络的网络结构,其实主要部分我加了一层 ...

  3. paddlepaddle实现猫狗分类

    目录 1.预备工作 1.1 数据集准备 1.2 数据预处理 2.训练 2.1 模型 2.2 定义训练 2.3 训练 3.预测 4.参考文献 声明:这是我的个人学习笔记,大佬可以点评,指导,不喜勿喷.实 ...

  4. pytorch实现kaggle猫狗识别

    参考:https://blog.csdn.net/weixin_37813036/article/details/90718310 kaggle是一个为开发商和数据科学家提供举办机器学习竞赛.托管数据 ...

  5. Java中如何分析一个案列---猫狗案例为例

    猫狗案例: 具体事务: 猫.狗 共性: 姓名.年龄.吃饭 分析:从具体到抽象 猫: 姓名.年龄--->成员变量 吃饭       ---> 成员方法 构造方法:无参.有参 狗: 姓名.年龄 ...

  6. java多态 -- 猫狗案列

    我们用猫狗案例来表明在java中使用多态的好处: class Animal{ public Animal(){} public void eat(){ System.out.println(" ...

  7. 深度学习原理与框架-猫狗图像识别-卷积神经网络(代码) 1.cv2.resize(图片压缩) 2..get_shape()[1:4].num_elements(获得最后三维度之和) 3.saver.save(训练参数的保存) 4.tf.train.import_meta_graph(加载模型结构) 5.saver.restore(训练参数载入)

    1.cv2.resize(image, (image_size, image_size), 0, 0, cv2.INTER_LINEAR) 参数说明:image表示输入图片,image_size表示变 ...

  8. 1.keras实现-->自己训练卷积模型实现猫狗二分类(CNN)

    原数据集:包含 25000张猫狗图像,两个类别各有12500 新数据集:猫.狗 (照片大小不一样) 训练集:各1000个样本 验证集:各500个样本 测试集:各500个样本 1= 狗,0= 猫 # 将 ...

  9. 猫狗识别——PyTorch

    猫狗识别 数据集下载: 网盘链接:https://pan.baidu.com/s/1SlNAPf3NbgPyf93XluM7Fg 提取密码:hpn4 1. 要导入的包 import os import ...

  10. python练习:寒冰猴子狐狸,猫狗咬架

    python练习:寒冰猴子狐狸,猫狗咬架 一,寒冰猴子狐狸 class Person: def __init__(self, na, gen, age, fig): self.name = na se ...

随机推荐

  1. ubuntu 下做反向代理给hyperf使用

    使用hyperf的时候发现它监听9501端口,然后这样需要ip+port方式去访问,但是这样对用户而言有点不太友好,如果我们还有域名,可以做一个反向代理避免端口直接写出来. 找了找网上别人写的例子,感 ...

  2. MySQL注入之Fuzz测试&Bypass WAF小结

    目录 BurpSuite Fuzz测试 内联注释 绕过union[]select联合查询 绕过敏感函数 绕过from[]information_schema查表 报错注入示例 常规绕过思路总结 空格绕 ...

  3. [昌哥IT课堂]|欢迎 MySQL 9.0,回顾 Oracle 在 8.0 版中的管理(译)

    对于新兴技术和社区的管理是相对容易的.经过 29 年发展,MySQL 已成为全球数百万用户中使用最广泛且备受信任的开源数据库之一.在这一规模的社区领导中可能存在复杂性.我们努力寻求稳定和创新的平衡,为 ...

  4. Python网络爬虫之requests模块1

    Python网络爬虫之requests模块(1) 引入 Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包 ...

  5. 初见memcached

    一. 概念 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,用于在动态系统中减少数据库负载,提升性能. 二. 适用场合 1. 分布式应用 ...

  6. 一、FreeRTOS学习笔记-基础知识

    一基础知识 1.任务调度(调度器) 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务 FreeRTOS三种任务调度方式: 1.抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优 ...

  7. 解决页面隐藏的元素闪现的问题v-cloak

    在v-if处加上v-cloak属性 <div class="sys-changeBox" v-cloak v-if="showTosat" @click. ...

  8. Trino 436 - 使用教程(亲测,详细)

    第一章 Trino简介 1. Trino概述 Trino是一个分布式SQL查询引擎,旨在查询分布在一个或多个异构数据源上的大型数据集.如果使用的是数TB或数PB的数据,那么很可能使用的是与Hadoop ...

  9. Git因换行符不一致导致反复有修改记录

    前情 Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理,我公司目前都是基于Git来管理项目代码. 坑位 最近刚刚入职一家新公司,本地环境都配好 ...

  10. uView的DatetimePicker组件在confirm回调中取不到v-model的最新值

    前情 uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app,在uniapp生态中u ...