24.可乐机拓展练习--综合训练

(1)设计要求:仍以可乐机为背景,一瓶可乐的价格是2.5 元,用按键控制投币(加入按键消抖功能),可以投 0.5 元硬币和 1元硬币,投入 0.5 元后亮一个灯,投入 1元后亮 2个灯,投入 1.5 元后亮 3个灯,投入 2元后亮 4 个灯。投入 2.5 元后出可乐不找零,此时 led 灯实现单向流水操作,流水 10s后自动停止;投入 3 元后出可乐找零,此时 led 灯实现双向流水操作,流水 3s 后自动停止。整个系统有复位键,其功能是终止本次投币操作,使可乐机立刻回到初始状态。

(2)Verilog代码:

module complex_cola(clk,reset_n,key_half_money,key_one_money,led_out);input clk;input reset_n;input key_half_money;input key_one_money;output [3:0]led_out;wire pi_money_half;wire pi_money_one;   wire po_cola;wire po_money;wire en0;wire en1;wire [3:0]led_out0;wire [3:0]led_out1;wire [3:0]led_r;//按键消抖模块    key_filter key_filter_inst0(.clk(clk),.reset_n(reset_n),.key_in(key_half_money),.key_p_flag(pi_money_half),.key_r_flag(),.key_state());key_filter key_filter_inst1(.clk(clk),.reset_n(reset_n),.key_in(key_one_money),.key_p_flag(pi_money_one),.key_r_flag(),.key_state());//可乐机主体程序fsm_cola_plus fsm_cola_plus_inst(.clk(clk),.reset_n(reset_n),.pi_money_one(pi_money_one),.pi_money_half(pi_money_half),.po_cola(po_cola),.po_money(po_money),.led(led_r));//单向、双向流水灯模块water_led_s water_led_s_inst(.clk(clk),.reset_n(reset_n),.en(en0),.led_out(led_out0));water_led_d water_led_d_inst(.clk(clk),.reset_n(reset_n),.en(en1),.led_out(led_out1));//en0、en1设计  assign {en1,en0} = ({po_cola,po_money} == 2'b11)? (2'b10):(({po_cola,po_money} == 2'b10)? 2'b01:2'b00);//led_out设计assign led_out = (led_r == 4'b0000)? ((en1)?led_out1:(en0?led_out0:4'b0000)):led_r;endmodule
module key_filter(clk,reset_n,key_in,key_p_flag,key_r_flag,key_state);input clk;input reset_n;input key_in;output reg key_p_flag;output reg key_r_flag;output reg key_state;reg key_in1;reg key_in2;reg key_in3;reg [3:0]STATE;
//抖动时间往往小于20ms,20ms = 20_000_000ns = 20ns * 1_000_000;   需要一个20位的寄存器reg [19:0]cnt;reg en_cnt;wire podge;wire nedge;wire arrive_time_20ms;//状态设计parameter IDLE      = 4'b0001;parameter P_SHAKE   = 4'b0010;parameter DOWN      = 4'b0100;parameter R_SHAKE   = 4'b1000;//异步输入key_in信号的同步化————“打两拍”always@(posedge clk)beginkey_in1 <= key_in;key_in2 <= key_in1;end//上升沿、下降沿设计always@(posedge clk)key_in3 <= key_in2;assign podge = key_in2  &&  (!key_in3);assign nedge = (!key_in2)  &&  key_in3;//20ms计数器模块设计    always@(posedge clk or negedge reset_n)if(!reset_n)cnt <= 20'd0;else if(en_cnt &&(cnt == 20'd999_999))cnt <= 20'd0;else if(en_cnt)cnt <= cnt + 20'd1;else cnt <= 20'd0;//计满20ms信号设计           assign arrive_time_20ms = (cnt == 20'd999_999);//状态机主程序设计always@(posedge clk or negedge reset_n)if(!reset_n)beginkey_r_flag <= 1'd0;key_p_flag <= 1'd0;key_state  <= 1'd1;STATE      <= IDLE;en_cnt <= 1'd0;endelse begincase(STATE)IDLE:beginkey_r_flag <= 1'd0;key_state  <= 1'd1;if(nedge)beginSTATE <= P_SHAKE;en_cnt <= 1'd1;endelse STATE <= STATE;endP_SHAKE:beginif(arrive_time_20ms)beginSTATE <= DOWN;en_cnt <= 1'd0;key_p_flag <= 1'd1;key_state <= 1'd0;endelse if(podge)beginSTATE <= IDLE;en_cnt <= 1'd0;endelse STATE <= STATE;  endDOWN:beginkey_p_flag <= 1'd0;key_state <= 1'd0;if(podge)beginSTATE <= R_SHAKE;en_cnt <= 1'd1;endelse STATE <= STATE;          endR_SHAKE:beginif(arrive_time_20ms)beginSTATE <= IDLE;en_cnt <= 1'd0;key_r_flag <= 1'd1;key_state  <= 1'd1;endelse if(nedge)beginSTATE <= DOWN;en_cnt <= 1'd0;endelse STATE <= STATE; enddefault:beginkey_r_flag <= 1'd0;key_p_flag <= 1'd0;key_state  <= 1'd1;STATE      <= IDLE;endendcaseendendmodule
module water_led_s(clk,reset_n,en,led_out);input clk;input en;input reset_n;output reg [3:0]led_out;reg [29:0]cnt;reg cnt_flag;reg [4:0]flag_cnt;parameter MCNT = 30'd24_999_999;//0.5s计数器模块设计  always@(posedge clk or negedge reset_n)if(!reset_n)cnt <= 30'd0;else if((cnt == MCNT) && (en))cnt <= 30'd0;else if(en)cnt <= cnt + 30'd1;else cnt <= 30'd0;//计数完成标志信号cnt_flag信号设计always@(posedge clk or negedge reset_n)if(!reset_n)cnt_flag <= 1'd0;else if(cnt == MCNT - 28'd1)cnt_flag <= 1'd1;else cnt_flag <= 1'd0;//flag_cnt信号设计always@(posedge clk or negedge reset_n)if(!reset_n)flag_cnt <= 5'd0;else if((cnt_flag)&&(flag_cnt == 5'd20))flag_cnt <= 5'd0;else if(cnt_flag)flag_cnt <= flag_cnt + 5'd1;else flag_cnt <= flag_cnt;//流水灯主程序设计always@(posedge clk or negedge reset_n)if(!reset_n)led_out <= 4'b0001;else if((cnt_flag)&&(flag_cnt == 5'd20))led_out <= 4'b0000;else if(cnt_flag) led_out <= {led_out[2:0],led_out[3]};else led_out <= led_out;endmodule
module fsm_cola_plus(clk,reset_n,pi_money_one,pi_money_half,po_cola,po_money,led);input clk;input reset_n;input pi_money_one;input pi_money_half;output po_cola;output po_money;output reg [3:0]led;reg [4:0] state;wire [1:0]pi_money;reg [1:0]po;parameter IDLE      = 5'b00001;parameter HALF      = 5'b00010;parameter ONE       = 5'b00100;parameter ONE_HALF  = 5'b01000;parameter TWO       = 5'b10000;//输入、输出信号编码设计assign pi_money = {pi_money_one,pi_money_half};assign {po_cola,po_money} = po;//状态机状态跳转设计always@(posedge clk or negedge reset_n)if(!reset_n)state <= IDLE;else begincase(state)IDLE:beginif(pi_money == 2'b10)state <= ONE;else if(pi_money == 2'b01)state <= HALF;else state <= state;endHALF:beginif(pi_money == 2'b10)state <= ONE_HALF;else if(pi_money == 2'b01)state <= ONE;else state <= state;endONE:beginif(pi_money == 2'b10)state <= TWO;else if(pi_money == 2'b01)state <= ONE_HALF;else state <= state;endONE_HALF:beginif(pi_money == 2'b10)state <= IDLE;else if(pi_money == 2'b01)state <= TWO;else state <= state;endTWO:beginif((pi_money == 2'b10) || (pi_money == 2'b01))state <= IDLE;else state <= state;enddefault:beginstate <= IDLE;endendcaseend//状态机输出信号设计always@(posedge clk or negedge reset_n)if(!reset_n)po <= 2'b00;else if(((state == ONE_HALF) && (pi_money == 2'b10)) || ((state == TWO) && (pi_money == 2'b01)))po <= 2'b10;else if((state == TWO) && (pi_money == 2'b10))po <= 2'b11;elsepo <= po;//led灯设计always@(posedge clk or negedge reset_n)if(!reset_n)led <= 4'b0000;else begincase(state)IDLE:led     <= 4'b0000;HALF:led     <= 4'b0001;ONE:led      <= 4'b0011;ONE_HALF:led <= 4'b0111;TWO:led      <= 4'b1111;default:led  <= 4'b0000;endcaseendendmodule
module water_led_d(clk,reset_n,en,led_out);input clk;input en;input reset_n;output reg [3:0]led_out;reg [29:0]cnt;reg cnt_flag;reg [4:0]flag_cnt;parameter MCNT = 30'd24_999_999;//0.5s计数器模块设计  always@(posedge clk or negedge reset_n)if(!reset_n)cnt <= 30'd0;else if((cnt == MCNT) && (en))cnt <= 30'd0;else if(en)cnt <= cnt + 30'd1;else cnt <= 30'd0;//计数完成标志信号cnt_flag信号设计always@(posedge clk or negedge reset_n)if(!reset_n)cnt_flag <= 1'd0;else if(cnt == MCNT - 28'd1)cnt_flag <= 1'd1;else cnt_flag <= 1'd0;//flag_cnt信号设计always@(posedge clk or negedge reset_n)if(!reset_n)flag_cnt <= 5'd0;else if((cnt_flag)&&(flag_cnt == 5'd6))flag_cnt <= 5'd0;else if(cnt_flag)flag_cnt <= flag_cnt + 5'd1;else flag_cnt <= flag_cnt;//流水灯主程序设计always@(posedge clk or negedge reset_n)if(!reset_n)led_out <= 4'b0001;else if((cnt_flag)&&(flag_cnt == 5'd6))led_out <= 4'b0000;else if((cnt_flag)&&(flag_cnt <= 2))led_out <= {led_out[2:0],led_out[3]};else if(cnt_flag)led_out <= {led_out[0],led_out[3:1]};else led_out <= led_out;endmodule

(3)引脚绑定:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/43323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从微软 Word 中提取数据

从 Microsoft Word 文档中提取数据可以通过编程来实现&#xff0c;有几种常见的方法&#xff0c;其中之一是使用 Python 和 python-docx 库。python-docx 是一个处理 .docx 文件&#xff08;Microsoft Word 文档&#xff09;的 Python 库&#xff0c;可以读取和操作 Word 文档的…

语雀平替,一款私有化功能丰富的开源知识库系统

背景介绍 现代企业面临的文档管理挑战日益严峻&#xff0c;包括信息冗余&#xff0c;存在多份数据&#xff0c;难以做到统一 &#xff0c;文档数量激增&#xff0c;查找麻烦&#xff0c;知识的信息安全问题频发以及团队协作需求不断上升。同时&#xff0c;随着知识管理在企业运…

洞察插槽和 v-slot:组件插槽案例的分类解读

目录 插槽和v-slot介绍 组件插槽 默认插槽 具名插槽 条件插槽 动态插槽 作用域插槽 插槽和v-slot介绍 Vue插槽(Slot)是Vue.js框架中用于实现组件间内容传递和模板通信的一种机制。通过插槽,父组件可以向子组件的指定位置插入HTML结构或内容,从而实现更灵活和…

华为HCIP Datacom H12-821 卷31

1、PBR&#xff08;Policy-Based-Route&#xff09;可以执行以下哪些操作 A、修改匹配数据包的LSP B、修改匹配流量的下一跳地址 C、修改匹配流量的出接口 D、修改匹配流量的Qos信息 正确答案&#xff1a; A,B,C,D 解析&#xff1a;PBR可以设置本地路由策略动作&#x…

文章SameStr(二):图2代码

title: “Publication Figure 2” 百度云盘链接: https://pan.baidu.com/s/15g7caZp354zIWktpnWzWhQ 提取码: 4sh7 Libraries Standard Import library(tidyverse) library(cowplot) library(scales) library(ggpubr)Special library(lme4) library(sjPlot) library(sjst…

根据https链接点击按钮下载文件

filePreview(row) {fetch(row.attachmentContent.url).then(res >res.blob().then(blob > {var a document.createElement(a);var url window.URL.createObjectURL(blob);var name row.attachmentContent.name;a.href url;a.download name; // 下载名称a.click();wi…

数据仓库之命名规范

数据仓库命名规范旨在确保数据仓库中的各种对象&#xff08;如数据库、表、列、索引、视图等&#xff09;具有一致、清晰且有意义的名称。这些规范有助于提高数据的可读性、可维护性和可理解性。以下是一些常见的数据仓库命名规范&#xff0c;涵盖了数据库对象的各个方面。 一…

基于Java中的SSM框架实现学生网上请假系统项目【项目源码+论文说明】计算机毕业设计

摘要 本学生网上请假系统是针对目前学生网上请假系统的实际需求&#xff0c;从实际工作出发&#xff0c;对过去的学生网上请假系统存在的问题进行分析&#xff0c;结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用目前最流…

大文件切片上传 So Easy?分享 1 段优质 JS 代码片段!

本内容首发于工粽号&#xff1a;程序员大澈&#xff0c;每日分享一段优质代码片段&#xff0c;欢迎关注和投稿&#xff01; 大家好&#xff0c;我是大澈&#xff01; 本文约 1100 字&#xff0c;整篇阅读约需 2 分钟。 大文件切片上传&#xff0c;我一般会分为4步来搞&#xf…

liosam编译问题

编译过程 因为lego安装时已经安装了gtsam因子图优化库,所以不需要再安装 直接编译即可 catkin_make -j8 报错实例 示例:[lio_sam_imuPreintegration-2] process has died,[lio_sam_mapOptmization-5] process has died 解决方法 实际问题是库文件libmetis.so 的位置。…

数据结构与算法:顺序表和链表

目录 一、线性表 二、顺序表 三、链表 一、线性表 线性表&#xff08; linear list &#xff09;是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线…

MyBatis框架学习笔记(一):MyBatis入门

1 MyBatis 介绍 1.1 官方文档 MyBatis 中文手册&#xff1a; &#xff08;1&#xff09;https://mybatis.org/mybatis-3/zh/index.html &#xff08;2&#xff09;https://mybatis.net.cn/ Maven 仓库&#xff1a; https://mvnrepository.com/ 仓库作用&#xff1a;需要…

(三)前端javascript中的数据结构之集合

集合的特点 1.无序 2.唯一性 3.不可重复 集合相对于前面几种数据结构&#xff0c;比较简单好理解&#xff0c;看看代码实现就能知道他的用法了 集合的创建 function MySet() {this.item {}; } MySet.prototype.has function (value) {return value in this.item; };//增 M…

编程范式之函数式编程

目录 前言1. 函数式编程的定义2. 函数式编程的特点2.1 纯函数2.2 不可变性2.3 高阶函数2.4 惰性求值 3. 函数式编程的应用场景3.1 并行计算3.2 数据分析3.3 Web开发 4. 函数式编程的优缺点4.1 优点4.2 缺点 5. 代表性的编程语言5.1 Haskell5.2 Scala5.3 Clojure 6. 示例代码结语…

Java中常见的消息中间件有哪些,各自的优缺点是那些?

1、ActiveMQ 优点&#xff1a; Apache基金会开发的开源消息中间件&#xff0c;支持JMS规范。 提供多种集群模式和高可用机制。 易于使用&#xff0c;并且与多种编程语言交互良好。 缺点&#xff1a; 在处理大量消息和并发连接时&#xff0c;性能可能不如其他中间件。 对于大型…

状态模式在金融业务中的应用及其框架实现

引言 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式通过将状态的相关行为分离到独立的状态类中&#xff0c;使得状态转换更加明确和简洁。在金融业务中&#xff0c;状态模式可以用于实现交易状…

legoloam算法环境配置和调试笔记

安装gtsam 参考 Ubuntu20.04安装gtsam记录_gtsam安装-CSDN博客 mkdir buildcd buildcmake .. make -

简谈设计模式之设计原则

设计模式是软件工程中解决特定问题的通用解决方案。这些模式提供了设计结构和最佳实践&#xff0c;帮助开发者创建灵活、可重用和可维护的代码。 设计模式分类 创建型模式 用于描述"如何创建对象", 它的特点是“将对象的创建和使用分离”. 包括单例, 原型, 工厂方…

负载均衡(Load Balancing)、集群(Cluster)和分布式(Distributed)

负载均衡&#xff08;Load Balancing&#xff09; 定义&#xff1a;负载均衡是指将网络流量或计算任务均匀地分配到多个服务器或计算资源上&#xff0c;以提高系统的整体处理能力、可靠性和响应速度。 特点&#xff1a; 流量分配&#xff1a;负载均衡器根据一定的算法&#x…

HTML5新增的input元素属性:placeholder、required、autofocus、min、max等

HTML5 大幅度地增加与改良了 input 元素的属性&#xff0c;可以简单地使用这些属性来实现 HTML5 之前需要使用 JavaScript 才能实现的许多功能。 下面将详细介绍这些新增的 input 元素的属性。 属性说明属性说明placeholder在输入框显示描述性或提示性文本list为文本框添加选…