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;
	else
		counter <= 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 / 1ns

module 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 begin
        rstn = 0;
        #201;
        rstn = 1;
        #2000000;
        $stop;
    end
    
endmodule

仿真波形

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;
	else
		counter <= 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 / 1ns

module 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 begin
        rstn = 0;
        #201;
        rstn = 1;
        #200000000;
        $stop;
    end
    
endmodule

仿真波形

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; //注意:不能加reg
	output reg led;
	
	reg[25:0] counter;
	always@(posedge clk or negedge rstn)
	if(!rstn)
		counter <= 0;
	else if(counter == MCNT-1)
		counter <= 0;
	else
		counter <= 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;
	endcase
	
endmodule

3.1 仿真代码 (set as top)

`timescale 1ns / 1ns

module 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 begin
        rstn = 0;
        #201;
        rstn = 1;
        #2000;
        ctrl = 8'b10000110;
        #100000000;
        ctrl = 8'b10100110;
        #200000000;
        $stop;
    end
    
endmodule

仿真波形

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

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;
	else
		counter <= 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;
	endcase
	
endmodule

仿真文件

`timescale 1ns / 1ns

module 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 begin
        rstn = 0;
        #201;
        rstn = 1;
        #2000;
        times = 32'd2500;
        ctrl = 8'b10000110;
        #100000000;
        times = 32'd10000;
        ctrl = 8'b10100110;
        #200000000;
        $stop;
    end
    
endmodule

仿真波形

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;
	else
		counter <= 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; end
	else case(counter2)
	   0 : begin led1 <= ctrla[0]; led2 <= ctrlb[0]; led3 <= ctrlc[0]; end
	   1 : begin led1 <= ctrla[1]; led2 <= ctrlb[1]; led3 <= ctrlc[1]; end
	   2 : begin led1 <= ctrla[2]; led2 <= ctrlb[2]; led3 <= ctrlc[2]; end
	   3 : begin led1 <= ctrla[3]; led2 <= ctrlb[3]; led3 <= ctrlc[3]; end
	   4 : begin led1 <= ctrla[4]; led2 <= ctrlb[4]; led3 <= ctrlc[4]; end
	   5 : begin led1 <= ctrla[5]; led2 <= ctrlb[5]; led3 <= ctrlc[5]; end
	   6 : begin led1 <= ctrla[6]; led2 <= ctrlb[6]; led3 <= ctrlc[6]; end
	   7 : begin led1 <= ctrla[7]; led2 <= ctrlb[7]; led3 <= ctrlc[7]; end
	   default : begin led1 <= led1; led2 <= led2; led3 <= led3; end
	endcase
	
endmodule

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;
	else
	   counter0 <= 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) begin
        if(counter1 == times - 1'd1) 
            counter1 <= 0;
        else
            counter1 <= counter1 + 1'd1;
    end
    else 
        counter1 <= 0;
    
    reg [2:0]counter2;
    always@(posedge clk or negedge rstn)
	if(!rstn)
		counter2 <= 0;
	else if(EN == 1)begin
	   if(counter1 == times - 1'd1)
	       counter2 <= counter2 + 1'd1;
	end
	else
	   counter2 <= 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;
	endcase
	
endmodule

仿真代码

`timescale 1ns / 1ns

module 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 begin
        rstn = 0;
        #201;
        rstn = 1;
        #2000;
        times = 32'd500;
        ctrl = 8'b10000110;
        #100000000;
        ctrl = 8'b10100110;
        #200000000;
        $stop;
    end
    
endmodule

仿真波形

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年哪个前端框架用的最多?

2023 年&#xff0c;TypeScript 的每月下载量持续稳定增长&#xff0c;年度累计下载量高达2,071,832,110&#xff08;20.7 亿&#xff09;&#xff0c;展现了强大的市场需求和用户认可。 本文来通过详细的数据&#xff08;2023 年 npm 累计下载量&#xff09;&#xff0c;看看…

深度学习(13)--PyTorch搭建神经网络进行气温预测

一.搭建神经网络进行气温预测流程详解 1.1.导入所需的工具包 import numpy as np # 矩阵计算 import pandas as pd # 数据读取 import matplotlib.pyplot as plt # 画图处理 import torch # 构建神经网络 import torch.optim as optim # 设置优化器 1.2.读取并处理数据…

Linux 36.2@Jetson Orin Nano基础环境构建

Linux 36.2Jetson Orin Nano基础环境构建 1. 源由2. 步骤2.1 安装NVIDIA Jetson Linux 36.2系统2.2 必备软件安装2.3 基本远程环境2.3.1 远程ssh登录2.3.2 samba局域网2.3.3 VNC远程登录 2.4 开发环境安装 3. 总结 1. 源由 现在流行什么&#xff0c;也跟风来么一个一篇。当然&…

【数据结构与算法-初学者指南】【附带力扣原题】队列

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

保育员答案在哪搜?这4款足够解决问题 #媒体#其他#其他

学会运用各类学习辅助工具和资料&#xff0c;是大学生培养自主学习能力和信息获取能力的重要途径之一。 1.石墨文档 石墨文档(Shimo Docs)是一款强大的在线文档协作工具。它提供了多人实时协作、版本控制、评论和批注等功能&#xff0c;方便学生在学习中进行文档编写、合作项…

完美运营的最新视频打赏系统及附带教程

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买) 优于市面上95%的打赏系统,与其他打赏系统相比,功能更加强大,完美运营且无bug。支付会调、短链接生成、代理后台、价…

企业内部知识库管理软件的终极指南:如何选择最适合你的工具?

知识库管理软件对于希望提高客户支持和组织效率的公司来说是一个强大的工具。在数字时代&#xff0c;拥有一个可靠的知识库系统对于快速准确地满足客户需求至关重要。在当今的技术条件下&#xff0c;知识库管理软件有很多选择&#xff0c;每个企业都应该仔细评估并选择最适合自…

阿里云幻兽帕鲁服务器有用过的吗?搭建简单啊

玩转幻兽帕鲁服务器&#xff0c;幻兽帕鲁Palworld多人游戏专用服务器一键部署教程&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云百科…

CTFSHOW命令执行web入门29-54

description: >- 这里就记录一下ctfshow的刷题记录是web入门的命令执行专题里面的题目,他是有分类,并且覆盖也很广泛,所以就通过刷这个来,不过里面有一些脚本的题目发现我自己根本不会笑死。 如果还不怎么知道写题的话,可以去看我的gitbook,当然csdn我也转载了我自己的…

python智慧养老系统—养老信息服务平台vue

本论文中实现的智慧养老系统-养老信息服务平台将以管理员和用户的日常信息维护工作为主&#xff0c;主要涵盖了系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;养老资讯管理&#xff0c;养生有道管理&#xff0c;养老机构管理&#xff0c;系统管理等功能&#x…

【Langchain Agent研究】SalesGPT项目介绍(一)

【2024最全最细LangChain教程-13】Agent智能体&#xff08;二&#xff09;-CSDN博客 之前我们介绍了langchain的agent&#xff0c;其实不难看出&#xff0c;agent是更高级的chain&#xff0c;可以进行决策分析、可以使用工具&#xff0c;今天我们开始开启一些更高阶的课程&…

如何连接ChatGPT?无需科学上网,使用官方GPT教程

随着AI的发展&#xff0c;ChatGPT也越来越强大了。 它可以帮你做你能想到的几乎任何事情&#xff0c;妥妥的生产力工具。 然而&#xff0c;对于许多国内的用户来说&#xff0c;并不能直接使用ChatGPT&#xff0c;不过没关系&#xff0c;我最近发现了一个可以直接免科学上网连…

【大厂AI课学习笔记】【1.5 AI技术领域】(8)文本分类

8,9,10&#xff0c;将分别讨论自然语言处理领域的3个重要场景。 自然语言处理&#xff0c;Natual Language Processing&#xff0c;NLP&#xff0c;包括自然语言识别和自然语言生成。 用途是从非结构化的文本数据中&#xff0c;发掘洞见&#xff0c;并访问这些信息&#xff0…

电脑文件误删除怎么办?8个恢复软件解决电脑磁盘数据可能的误删

您是否刚刚发现您的电脑磁盘数据丢失了&#xff1f;不要绝望&#xff01;无论分区是否损坏、意外格式化或配置错误&#xff0c;存储在其上的文件都不一定会丢失到数字深渊。 我们已经卷起袖子&#xff0c;深入研究电脑分区恢复软件的广阔领域&#xff0c;为您带来一系列最有效…

Qt安装配置教程windows版(包括:Qt5.8.0版本,Qt5.12,Qt5.14版本下载安装教程)(亲测可行)

目录 Qt5.8.0版本安装教程Qt5.8.0版本下载安装 Qt5.12.2版本安装教程下载安装 Qt 5.14.2安装教程下载安装和创建项目 参考视频 QT为嵌入式系统提供了大量的库和可重用组件。 WPS Office&#xff0c;咪咕音乐&#xff0c;Linux桌面环境等都是QT开发的。 Qt5.8.0版本安装教程 Q…

排序算法---堆排序

原创不易&#xff0c;转载请注明出处。欢迎点赞收藏~ 堆排序&#xff08;Heap Sort&#xff09;是一种基于二叉堆数据结构的排序算法。它将待排序的元素构建成一个最大堆&#xff08;或最小堆&#xff09;&#xff0c;然后逐步将堆顶元素与堆的最后一个元素交换位置&#xff0c…

javaEE - 22( 5000 字 Tomcat 和 HTTP 协议入门 -3)

一&#xff1a;Tomcat 1.1 Tomcat 是什么 谈到 “汤姆猫”, 大家可能更多想到的是大名鼎鼎的这个: 事实上, Java 世界中的 “汤姆猫” 完全不是一回事, 但是同样大名鼎鼎. Tomcat 是一个 HTTP 服务器. 前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和…

Java编程构建高效二手交易平台

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

物资捐赠管理系统

文章目录 物资捐赠管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目&#xff08;9.9&#xffe5;带走&#xff09; 物资捐赠管理系统 一、项目演示 爱心捐赠系统 二、项目介绍 基于springboot的爱心捐赠管理系统 开发语言&#xff1a…

APEX开发过程中需要注意的小细节2

开发时遇到首次获取租户号失败的问题 以为是触发顺序问题&#xff0c;所以设置两个动态操作&#xff0c;一个事件是“更改”&#xff0c;另一个是“单击”&#xff0c; 但还是没有解决&#xff0c; 后来终于找到解决方法:在校验前执行取值 果然成功执行&#xff01; 动态查询年…