07 A B 从计数器到可控线性序列机

07. A.从计数器到可控线性序列机

  1. 让LED灯按照亮0.25秒。灭0.75秒的状态循环亮灭
  2. 让LED灯按照亮0.25秒,灭0.5秒,亮0.75秒,灭1秒的状态循环亮灭
  3. 让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随即指定。以0.25秒为一个变化周期,8个变化状态为一个循环。
  4. 让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为一个循环,每个变化状态的时间值可以根据不同的应用场景选择。
  5. 让多个LED灯按照设置的模式各自在一个变化循环内独立亮灭变化
  6. 每隔10ms,让LED灯的一个8状态循环执行一次(每个状态的变化时间值小一点,方便测试,比如设置为10us)

1.让LED灯按照亮0.25秒。灭0.75秒的状态循环亮灭

设计代码

module counter_led1(clk,rstn,led
);parameter MCNT = 50000000;input clk;input rstn;output reg led;reg[25:0] counter;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == MCNT-1)counter <= 0;elsecounter <= counter + 1'd1;always@(posedge clk or negedge rstn)if(!rstn)   led <= 0;else if(counter == 3*MCNT/4 -1)led <= 1;else if(counter == MCNT - 1)led <= 0;endmodule

仿真代码

`timescale 1ns / 1nsmodule counter_led1_tb();reg clk;reg rstn;wire led;counter_led1 counter_led1_inst(.clk(clk),.rstn(rstn),.led(led));defparam counter_led1_inst.MCNT = 50000;initial clk = 1;always #10 clk = !clk;initial beginrstn = 0;#201;rstn = 1;#2000000;$stop;endendmodule

仿真波形

2.让LED灯按照亮0.25秒,灭0.5秒,亮0.75秒,灭1秒的状态循环亮灭

设计代码

module counter_led2(clk,rstn,led
);parameter MCNT = 1250000000;input clk;input rstn;output reg led;reg[25:0] counter;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == MCNT-1)counter <= 0;elsecounter <= counter + 1'd1;always@(posedge clk or negedge rstn)if(!rstn)   led <= 1;else if(counter == MCNT/10 -1)led <= 0;else if(counter == 3*MCNT/10 - 1)led <= 1;else if(counter == 6*MCNT/10 - 1)led <= 0;else if(counter == MCNT - 1)led <= 1;endmodule

仿真代码

`timescale 1ns / 1nsmodule counter_led2_tb();reg clk;reg rstn;wire led;counter_led2 counter_led1_inst(.clk(clk),.rstn(rstn),.led(led));defparam counter_led1_inst.MCNT = 125000;initial clk = 1;always #10 clk = !clk;initial beginrstn = 0;#201;rstn = 1;#200000000;$stop;endendmodule

仿真波形

3.让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随即指定。以0.25秒为一个变化周期,8个变化状态为一个循环。

思路:2秒为一个周期;有一个指定亮灭状态的输入端口,控制八种状态的亮灭,如果把亮灭看成1和0,那么就可以设计一个八位的控制亮灭状态的端口。

设计代码

  1. ctrl的输入端口不要加reg,ctrl虽然在always块内,但是没有被赋值,led被赋值。在tb里ctrl需要加reg。
  2. 当else if语句比较多是,我们可以将其替换为case语句,case语句的default不要忘记。
module counter_led3(clk,rstn,ctrl,led
);parameter MCNT = 1000000000;input clk;input rstn;input [7:0] ctrl; //注意:不能加regoutput reg led;reg[25:0] counter;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == MCNT-1)counter <= 0;elsecounter <= counter + 1'd1;//	always@(posedge clk or negedge rstn)
//	if(!rstn)   
//		led <= 0;
//	else if(counter == MCNT/8 -1)
//		led <= ctrl[0];
//	else if(counter == 2*MCNT/8 - 1)
//		led <= ctrl[1];
//    else if(counter == 3*MCNT/8 - 1)
//		led <= ctrl[2];
//	else if(counter == 4*MCNT/8 - 1)
//		led <= ctrl[3];
//	else if(counter == 5*MCNT/8 - 1)
//		led <= ctrl[4];
//	else if(counter == 6*MCNT/8 - 1)
//		led <= ctrl[5];
//	else if(counter == 7*MCNT/8 - 1)
//		led <= ctrl[6];
//	else if(counter == MCNT - 1)
//		led <= ctrl[7];always@(posedge clk or negedge rstn)if(!rstn)  led <= 0;else case(counter)1*MCNT/8 - 1 : led <= ctrl[0];2*MCNT/8 - 1 : led <= ctrl[1];3*MCNT/8 - 1 : led <= ctrl[2];4*MCNT/8 - 1 : led <= ctrl[3];5*MCNT/8 - 1 : led <= ctrl[4];6*MCNT/8 - 1 : led <= ctrl[5];7*MCNT/8 - 1 : led <= ctrl[6];8*MCNT/8 - 1 : led <= ctrl[7];default : led <= led;endcaseendmodule

3.1 仿真代码 (set as top)

`timescale 1ns / 1nsmodule counter_led3_tb();reg clk;reg rstn;reg [7:0] ctrl;wire led;counter_led3 counter_led3_inst(.clk(clk),.rstn(rstn),.ctrl(ctrl),.led(led));defparam counter_led3_inst.MCNT = 1000000;initial clk = 1;always #10 clk = !clk;initial beginrstn = 0;#201;rstn = 1;#2000;ctrl = 8'b10000110;#100000000;ctrl = 8'b10100110;#200000000;$stop;endendmodule

仿真波形

总结:计数器不仅仅是一个计量整个时间的一个计数器,而且这个计数器里面的每一个计数值,他都可以作为整个这一段时间里面的一个刻度标尺,都可以拿来用

4.让LED灯按照指定的亮灭模式亮灭,亮灭模式未知,由用户随机指定。8个变化状态为一个循环,每个变化状态的时间值可以根据不同的应用场景选择。

设计文件

  1. 使用case语句时,每种情况的值必须是一个确定值,在这种情况下,我们必须修改代码,使各个状态由确定值来给定,而不是不确定的时间。

  2. timer的数据位宽与counter的数据位宽须保持一致
module counter_led4(clk,rstn,ctrl,times,led
);input clk;input rstn;input [7:0] ctrl; input [31:0] times; output reg led;reg[31:0] counter;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == times - 1'd1) //times的数据位宽与counter的数据位宽须保持一致counter <= 0;elsecounter <= counter + 1'd1;reg [2:0]counter2;always@(posedge clk or negedge rstn)if(!rstn)counter2 <= 0;else if(counter == times - 1'd1)counter2 <= counter2 + 1'd1;always@(posedge clk or negedge rstn)if(!rstn)  led <= 0;else case(counter2)0 : led <= ctrl[0];1 : led <= ctrl[1];2 : led <= ctrl[2];3 : led <= ctrl[3];4 : led <= ctrl[4];5 : led <= ctrl[5];6 : led <= ctrl[6];7 : led <= ctrl[7];default : led <= led;endcaseendmodule

仿真文件

`timescale 1ns / 1nsmodule counter_led4_tb();reg clk;reg rstn;reg [7:0] ctrl;reg [31:0] times;wire led;counter_led4 counter_led4_inst(.clk(clk),.rstn(rstn),.ctrl(ctrl),.times(times),.led(led));initial clk = 1;always #10 clk = !clk;initial beginrstn = 0;#201;rstn = 1;#2000;times = 32'd2500;ctrl = 8'b10000110;#100000000;times = 32'd10000;ctrl = 8'b10100110;#200000000;$stop;endendmodule

仿真波形

5.让多个LED灯按照设置的模式各自在一个变化循环内独立亮灭变化

  1. 在4的基础上多设置几个led灯输出端口即可,此处设置了3个led灯。SPI,IIC等都用到了该相似的原理。
module counter_led5(clk,rstn,ctrla,ctrlb,ctrlc,times,led1,led2,led3
);input clk;input rstn;input [7:0] ctrla,ctrlb,ctrlc; input [31:0] times; output reg led1,led2,led3;reg[31:0] counter;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == times - 1'd1) counter <= 0;elsecounter <= counter + 1'd1;reg [2:0]counter2;always@(posedge clk or negedge rstn)if(!rstn)counter2 <= 0;else if(counter == times - 1'd1)counter2 <= counter2 + 1'd1;always@(posedge clk or negedge rstn)if(!rstn)  begin led1 <= 0; led2 <= 0; led3 <= 0; endelse case(counter2)0 : begin led1 <= ctrla[0]; led2 <= ctrlb[0]; led3 <= ctrlc[0]; end1 : begin led1 <= ctrla[1]; led2 <= ctrlb[1]; led3 <= ctrlc[1]; end2 : begin led1 <= ctrla[2]; led2 <= ctrlb[2]; led3 <= ctrlc[2]; end3 : begin led1 <= ctrla[3]; led2 <= ctrlb[3]; led3 <= ctrlc[3]; end4 : begin led1 <= ctrla[4]; led2 <= ctrlb[4]; led3 <= ctrlc[4]; end5 : begin led1 <= ctrla[5]; led2 <= ctrlb[5]; led3 <= ctrlc[5]; end6 : begin led1 <= ctrla[6]; led2 <= ctrlb[6]; led3 <= ctrlc[6]; end7 : begin led1 <= ctrla[7]; led2 <= ctrlb[7]; led3 <= ctrlc[7]; enddefault : begin led1 <= led1; led2 <= led2; led3 <= led3; endendcaseendmodule

07. B.受控线性序列机课题的实现

6.每隔10ms,让LED灯的一个8状态循环执行一次(每个状态的变化时间值小一点,方便测试,比如设置为10us)

原理图:

总结:通过控制en的状态就能控制计数器的计数,通过计数器的计数,来产生不同的序列,即从计数器到可控状态序列机。

设计代码

module counter_led6(clk,rstn,ctrl,times,led
);parameter MCNT = 500000;//10ms计数器input clk;input rstn;input [7:0] ctrl; input [31:0] times; output reg led;reg [31:0] counter0;//10ms周期计数器always@(posedge clk or negedge rstn)if(!rstn)counter0 <= 0;else if(counter0 == MCNT - 1'd1)counter0 <= 0;elsecounter0 <= counter0 + 1'd1;reg EN;   always@(posedge clk or negedge rstn)if(!rstn)EN <= 0;else if(counter0 == 0)EN <= 1'd1;else if(counter0 == 8*times - 1)EN <= 0;reg[31:0] counter1;always@(posedge clk or negedge rstn)if(!rstn)counter1 <= 0;else if(EN == 1) beginif(counter1 == times - 1'd1) counter1 <= 0;elsecounter1 <= counter1 + 1'd1;endelse counter1 <= 0;reg [2:0]counter2;always@(posedge clk or negedge rstn)if(!rstn)counter2 <= 0;else if(EN == 1)beginif(counter1 == times - 1'd1)counter2 <= counter2 + 1'd1;endelsecounter2 <= 0;always@(posedge clk or negedge rstn)if(!rstn)  led <= 0;else case(counter2)0 : led <= ctrl[0];1 : led <= ctrl[1];2 : led <= ctrl[2];3 : led <= ctrl[3];4 : led <= ctrl[4];5 : led <= ctrl[5];6 : led <= ctrl[6];7 : led <= ctrl[7];default : led <= led;endcaseendmodule

仿真代码

`timescale 1ns / 1nsmodule counter_led6_tb();reg clk;reg rstn;reg [7:0] ctrl;reg [31:0] times;wire led;counter_led6 counter_led6_inst(.clk(clk),.rstn(rstn),.ctrl(ctrl),.times(times),.led(led));initial clk = 1;always #10 clk = !clk;initial beginrstn = 0;#201;rstn = 1;#2000;times = 32'd500;ctrl = 8'b10000110;#100000000;ctrl = 8'b10100110;#200000000;$stop;endendmodule

仿真波形

6.1 代码调试(添加设计信号到波形中)

 

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

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

相关文章

高职单招怎么搜答案? #经验分享#微信#笔记

当今社会&#xff0c;随着信息技术的迅猛发展&#xff0c;大学生们在学习过程中面临着各种各样的困难和挑战。而在这些挑战中&#xff0c;面对繁重的作业和复杂的题目&#xff0c;大学生搜题软件应运而生 1.题老大 这是一个公众号 亿级数量题库&#xff0c;可截图搜题&#…

动态SQl简单创建

创建pojo实体类&#xff0c;使用lombok注解 package com.example.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;import java.time.LocalDate; import java.time.LocalDateTime;Data NoArgsConstructor AllArgsConstructor pu…

Maven私服部署与JAR文件本地安装

Nexus3 是一个仓库管理器&#xff0c;它极大地简化了本地内部仓库的维护和外部仓库的访问。 平常我们在获取 maven 仓库资源的时候&#xff0c;都是从 maven 的官方&#xff08;或者国内的镜像&#xff09;获取。团队的多人员同样的依赖都要从远程获取一遍&#xff0c;从网络方…

【每日一题】LeetCode——反转链表

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有…

MySQL ——group by子句使用with rollup

group by 子句使用with rollup关键字之后&#xff0c;具有分组加和的功能。即&#xff1a;在所有的分组记录之后&#xff0c;自动新增一条记录&#xff0c;从全局计算所有记录的数据。 0 问题描述 求出每年的学生平均成绩&#xff0c;及历史至今的平均成绩&#xff0c;结果保留…

c++二叉树寒假特训题目(2)

hello&#xff0c;我是Joseph&#xff0c;今天推出第二期c二叉树寒假特训题目。 第一期传送门 第一期答案传送门 这期有7题&#xff0c;目录如下。 目录 题目 二叉树结点查找 二叉树是否对称 ​编辑 二叉排序树 层次遍历 根据前序中序求后序 二叉树高度 ​编辑 二…

【机器学习】合成少数过采样技术 (SMOTE)处理不平衡数据(附代码)

1、简介 不平衡数据集是机器学习和人工智能中普遍存在的挑战。当一个类别中的样本数量明显超过另一类别时&#xff0c;机器学习模型往往会偏向大多数类别&#xff0c;从而导致性能不佳。 合成少数过采样技术 (SMOTE) 已成为解决数据不平衡问题的强大且广泛采用的解决方案。 …

核心篇-OSPF技术之序(上)

文章目录 一. 实验专题1.1. 实验1&#xff1a;配置单区域OSPF1.1.1. 实验目的1.1.2. 实验拓扑1.1.3. 实验步骤&#xff08;1&#xff09;配置地址&#xff08;2&#xff09;运行OSPF 1.1.4. 实验调试&#xff08;1&#xff09;查看接口信息&#xff08;2&#xff09;查看邻居状…

基于华为云欧拉操作系统(HCE OS)单节点容器化部署(Prometheus、node-exporter、Grafana)应用性能监控平台

写在前面 博文内容为 华为云欧拉操作系统入门级开发者认证(HCCDA – Huawei Cloud EulerOS)实验笔记整理认证地址&#xff1a;https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1内容涉及&#xff0c;HCE OS 容器化部署(Prometheus、…

Java_栈_队列

文章目录 一、栈&#xff08;Stack&#xff09;1.概念2.栈的使用3.栈的模拟实现1、定义接口2、定义栈3、成员4、构造方法5、判断空间是否满 full6、入栈 push7、出栈 pop8、获取栈顶元素 peek9、获取栈中有效元素个数 size10、检测栈是否为空 empty完整代码 4.练习1、有效括号2…

免费搭建幻兽帕鲁服务器,白嫖阿里云游戏服务器

阿里云幻兽帕鲁服务器免费搭建方案&#xff0c;先在阿里云高校计划「云工开物」活动领取学生专享300元无门槛代金券&#xff0c;幻兽帕鲁专用服务器4核16G配置26元1个月、149元半年&#xff0c;直接使用这个无门槛300元代金券抵扣即可免费搭建幻兽帕鲁服务器。阿里云服务器网al…

除夕快乐(前端小烟花)

家人们&#xff0c;新的一年好运常在&#xff0c;愿大家在新的一年里得偿所愿&#xff0c;发财暴富&#xff0c;愿大家找到属于自己的那个公主&#xff0c;下面就给大家展示一下给公主的烟花 前端烟花 新的一年&#xff0c;新的挑战&#xff0c;愿我们不忘初心&#xff0c;砥砺…

C++ 动态规划 树形DP 没有上司的舞会

Ural 大学有 N 名职员&#xff0c;编号为 1∼N 。 他们的关系就像一棵以校长为根的树&#xff0c;父节点就是子节点的直接上司。 每个职员有一个快乐指数&#xff0c;用整数 Hi 给出&#xff0c;其中 1≤i≤N 。 现在要召开一场周年庆宴会&#xff0c;不过&#xff0c;没有职…

口袋工具箱微信小程序源码

这是一款云开发口袋工具箱微信小程序源码&#xff0c;只有纯前端版本&#xff0c;该版本的口袋工具箱涵盖了13个功能&#xff0c;分别为圣诞帽头像生成、二维码生成、日语50音图、汉字拼音查询、计算器、程序员黄历、娱乐摇骰子、身材计算、所在地天气查询、IP地址查询、手机归…

自制微信红包封面

一.前言 这不是过年了吗&#xff0c;各大平台都发放了免费的微信红包封面&#xff0c;但我老是抢不到QAQ。于是乎&#xff0c;我便想“授人以鱼不如授人以渔”&#xff0c;不如自己造个封面。 二.主要步骤 1.条件 1>创建视频号 2>过去一年发表过视频号 3>过去一…

【JavaScript 漫游】【012】ES5 规范中 String 对象方法汇总

文章简介 本文为【JavaScript 漫游】专栏的第 012 篇文章&#xff0c;记录的内容包含了 ES5 规范中String 对象的所有方法。 笔者认为要掌握的方法包括&#xff1a; String.prototype.concat()String.prototype.slice()String.prototype.substring()String.prototype.substr…

MacOS上怎么把格式化成APFS的U盘或者硬盘格式化回ExFAT?

一、问题 MacOS在更新MacOS Monterey后或者更高系统后发现&#xff0c;格式U盘或者硬盘只有4个APFS选项&#xff0c;那么我们该如何将APFS格式成ExFAT&#xff1f; 二、解答 将APFS的U盘或者硬盘拓展成MacOS的拓展格式即可&#xff0c;操作步骤如下 1、电脑接入U盘或者硬盘 2…

vue3 之 商城项目—二级分类

二级分类功能描述 配置二级路由 准备组件模版 <script setup></script><template><div class"container "><!-- 面包屑 --><div class"bread-container"><el-breadcrumb separator">"><el-bre…

GPT如何在一分钟内完成论文数据分析?

数据上传 PPMAN-AI 01 由于技术限制&#xff0c;目前InfinitePaper AI仅支持上传1份文件&#xff0c;且大小不超过10M。但是&#xff0c;在强大的代码解释器面前&#xff0c;这都是小问题。我们只需要将可能用到的文件打包成压缩文件上传即可&#xff0c;之后要求GPT直接解压…

Spring基础 - Spring核心之控制反转(IOC)

Spring基础 - Spring核心之控制反转(IOC) 引入 Spring框架管理这些Bean的创建工作&#xff0c;用户管理Bean转变为框架管理Bean&#xff0c;这个称之为控制翻转Spring框架托管创建的Bean放在IOC容器中Spring框架为了更好让用户配置Bean&#xff0c;必然会引入不同方式来配置B…