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.hqwc.cn/news/459684.html

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

相关文章

kubectl 创建 Pod 背后到底发生了什么?

想象一下&#xff0c;如果我想将 nginx 部署到 Kubernetes 集群&#xff0c;我可能会在终端中输入类似这样的命令&#xff1a; $ kubectl run --imagenginx --replicas3然后回车。几秒钟后&#xff0c;你就会看到三个 nginx pod 分布在所有的工作节点上。这一切就像变魔术一样…

SpringBoot + Tess4J 实现本地与远程图片的文字识别

1 前言 1.1 概要 在本文中&#xff0c;我们将探讨如何在Spring Boot应用程序里集成Tess4J来实现OCR&#xff08;光学字符识别&#xff09;&#xff0c;以识别出本地和远程图片中的文字。 我们将从添加依赖说起&#xff0c;然后创建服务类以实现OCR&#xff0c;最后展示如何处…

jxls 2.4.5 —— 动态导出excel 表头与数据

文章目录 前言依赖引入制作导出模板测试类导出效果注意事项 前言 再之前的博客中&#xff0c;介绍了jxls的基础使用。但导出表头属于写死的&#xff0c;并未采取动态渲染。 本次进行动态渲染操作&#xff0c;动态渲染表头和填充数据。 依赖引入 springboot测试项目中&#…

canvas实现涂鸦画板功能

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

【每日一题】LeetCode——链表的中间结点

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

C#,字符串相似度的莱文斯坦距离(Levenshtein Distance)算法与源代码

一、莱文斯坦&#xff08;Levenshtein&#xff09; Vladimir I. Levenshtein 弗拉基米尔I列文施坦博士是纠错码理论的先驱&#xff0c;被称为俄罗斯编码理论之父。Levenshtein是莫斯科俄罗斯科学院Keldysh应用数学研究所的研究教授&#xff0c;他的贡献体现在消费者的日常生活中…

【网络技术】【Kali Linux】Nmap 嗅探(一)简单扫描

一、实验环境 本次实验进行简单的Nmap扫描&#xff0c;实验使用 Kali Linux 虚拟机和 Ubuntu Linux 虚拟机完成&#xff0c;主机操作系统为 Windows 11&#xff0c;虚拟化平台选择 Oracle VM VirtualBox&#xff0c;如下图所示。 二、实验步骤 1、相关配置 Kali Linux 虚拟机…

10个简单有效的编辑PDF文件工具分享

10个编辑PDF文件工具作为作家、编辑或专业人士&#xff0c;您可能经常发现自己在处理 PDF 文件。无论您是审阅文档、创建报告还是与他人共享工作&#xff0c;拥有一个可靠的 PDF 编辑器供您使用都非常重要。 10个简单适用的编辑PDF文件工具 在本文中&#xff0c;我们将介绍当今…

Verilog刷题笔记23

题目: Suppose you’re building a circuit to process scancodes from a PS/2 keyboard for a game. Given the last two bytes of scancodes received, you need to indicate whether one of the arrow keys on the keyboard have been pressed. This involves a fairly simp…

2/7 算法每日N题(二分+双指针)

第一题&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0, right nums.size() - 1;while(left < right){int mid (right - left) / 2 left;int num nums[mid];if (num target) {return mid;} else if (num >…

React | Center 组件

在 Flutter 中有 Center 组件&#xff0c;效果就是让子组件整体居中&#xff0c;挺好用。 React 中虽然没有对应的组件&#xff0c;但是可以简单封装一个&#xff1a; index.less .container {display: flex;justify-content: center;align-items: center;align-content: ce…

Pandas 对带有 Multi-column(多列名称) 的数据排序并写入 Excel 中

Pandas 从Excel 中读取带有 Multi-column的数据 正文 正文 我们使用如下方式写入数据&#xff1a; import pandas as pd import numpy as npdf pd.DataFrame(np.array([[10, 2, 0], [6, 1, 3], [8, 10, 7], [1, 3, 7]]), columns[[Number, Name, Name, ], [col 1, col 2, co…