【IC设计】Verilog线性序列机点灯案例(四)(小梅哥课程)

news2024/11/13 15:21:22

文章目录

  • 该系列目录:
  • 设计环境
  • 设计目标
  • 设计思路
  • RTL及Testbench代码
    • RTL代码
    • Testbench
    • xdc约束
  • 仿真结果

声明:案例和代码来自小梅哥课程,本人仅对知识点做做笔记,如有学习需要请支持官方正版。

该系列目录:

Verilog线性序列机点灯案例(一)
Verilog线性序列机点灯案例(二)
Verilog线性序列机点灯案例(三)
Verilog线性序列机点灯案例(四)

设计环境

Vivado2018.3 软件
Zynq-7000 xc7z010clg400-1 板卡

设计目标

在案例(三)中提到让一个led根据8个拨码开关的值来循环变化,每个拨码开关负责0.25秒,一共是2秒。
在任务(四)中我们需要在每次动态变化前加入1秒的空闲时间(空闲时间led是熄灭的)
在这里插入图片描述

设计思路

1秒的空闲时间需要一个计数器来计算,假设为counter0
2秒的动态变化可以像案例(二)中一样用两个计数器来完成,假设为counter1和counter2
counter1用来计数0.25秒,counter2在counter1每次计满时加1,最后将sw[counter2]输出给led。
需要注意的是,动态变化是从1秒空闲时间后开始的,所以counter1和counter2必须在counter0计满以后才能开始工作。
在动态变化完成后,即counter1和counter2都计满的情况下,counter0再次重新开始工作。

RTL及Testbench代码

RTL代码

module led_ctrl3(
    clk,
    rst_n,
    sw,
    led_out
);
    input clk;
    input rst_n;
    input [7:0] sw;
    output reg led_out;
    
    //counter0用于计数一秒钟
    reg [25:0] counter0;
    
    //counter1用于计数0.25秒
    reg [25:0] counter1;
    
    //counter2用于计数0到7
    reg [2:0] counter2;
    
    //标记可以闪烁了
    reg flag;
    
    //50M cycles
    parameter MCNT1S = 50_000_000;
    
    //12.5M cycles
    parameter MCNT025S = 12_500_000;
    
    //控制flag状态
    //flag为0时为空闲状态,led熄灭,counter0开始计数到1秒
    //flag为1时为忙碌状态,led动态闪烁,counter1和counter2正常计数
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            flag <= 0;
        end else if(counter0 == MCNT1S -1 ) begin
            flag <= 1;
        end else if( (counter1 == MCNT025S -1) && (counter2 == 7) ) begin
            flag <= 0;
        end else begin
            flag <= flag;
        end
    end
    
    //计数空闲的1秒
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            counter0 <= 0;
        end else if(flag == 0) begin
            if(counter0 == MCNT1S -1)begin
                counter0 <= 0;
            end else begin
                counter0 <= counter0 + 1;
            end
        end
    end
    
    //负责在flag为1时计算0.25秒
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            counter1 <= 0;
        end else if(flag == 1) begin
            if(counter1 == MCNT025S - 1) begin
                counter1 <= 0;
            end else begin
                counter1 <= counter1 + 1;
            end
        end
    end
    
    //当flag为1时,counter2每当counter1计满时自增1
    //如果counter1和counter2都计满,则进入空闲时刻
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            counter2 <= 0;
        end else if(flag == 1) begin
            if(counter1 == MCNT025S - 1) begin
                if(counter2 == 7) begin
                    counter2 <= 0;
                end else begin
                    counter2 <= counter2 + 1;
                end
            end
        end
    end
    
    //负责根据counter2决定led_out输出
    always@(posedge clk or negedge rst_n) begin
        if(!rst_n) begin
            led_out <= 0;
        end else begin
            if(flag) begin
                case(counter2)
                    0:led_out <= sw[0];
                    1:led_out <= sw[1];
                    2:led_out <= sw[2];
                    3:led_out <= sw[3];
                    4:led_out <= sw[4];
                    5:led_out <= sw[5];
                    6:led_out <= sw[6];
                    7:led_out <= sw[7];
                endcase
            end
        end
    end
endmodule

Testbench

`timescale 1ns / 1ps

module tb_led_ctrl3();
    reg clk;
    reg rst_n;
    reg [7:0] sw;
    wire led_out;
    led_ctrl3 led_ctrl3_inst0(
        .clk(clk),
        .rst_n(rst_n),
        .sw(sw),
        .led_out(led_out)    
    );
    defparam led_ctrl3.MCNT1S = 50_000;
    defparam led_ctrl3.MCNT025S = 12_500;
    initial begin
        clk = 1;
    end
    
    always #10 clk=~clk;
    
    initial begin
        rst_n = 0;
        #205;
        rst_n = 1;
        sw = 8'b01010101;
        #3_000_000;
        sw = 8'b11110000;
        #3_000_000;
        $stop;
    end
endmodule

xdc约束

set_property PACKAGE_PIN T14 [get_ports led_out]
set_property PACKAGE_PIN U18 [get_ports clk]
set_property PACKAGE_PIN F20 [get_ports rst_n]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports led_out]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PACKAGE_PIN E17 [get_ports {sw[7]}]
set_property PACKAGE_PIN D18 [get_ports {sw[6]}]
set_property PACKAGE_PIN H15 [get_ports {sw[5]}]
set_property PACKAGE_PIN F16 [get_ports {sw[4]}]
set_property PACKAGE_PIN J14 [get_ports {sw[3]}]
set_property PACKAGE_PIN G14 [get_ports {sw[2]}]
set_property PACKAGE_PIN L15 [get_ports {sw[1]}]
set_property PACKAGE_PIN K14 [get_ports {sw[0]}]

仿真结果

在这里插入图片描述

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

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

相关文章

使用Composer安装Laravel框架

使用Composer安装Laravel框架&#xff0c;不指定版本则安装当下最新版本 composer create-project laravel/laravel laravel-demo 至此&#xff0c;安装框架完成&#xff0c;这里安装的是Laravel11.0.7版本的 进入项目根目录&#xff0c;运行项目 cd laravel.11.0.7 // 进…

maven一点通

1.maven简介 Maven是一个基于Java的工程构建工具&#xff0c;用于管理和构建项目的依赖关系。它提供了一种标准的项目结构和一组约定&#xff0c;使得项目的开发、构建、部署和文档化更加容易和可靠。 Maven的主要功能包括&#xff1a; 依赖管理&#xff1a;Maven可以自动下载…

最细致最简单的 Arm 架构搭建 Harbor

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; ARM离线版本安装 官方提供了一个 arm 版本&#xff0c;但是好久都没更新了&#xff0c;地址&#xff1a;https://github.com/goharbor/harbor-arm 。 也不知道为什么不更新&#xff0c;我看…

Cookie 信息泄露 Cookie未设置http only属性 原理以及修复方法

漏洞名称&#xff1a;Cookie信息泄露、Cookie安全性漏洞、Cookie未设置httponly属性 漏洞描述&#xff1a; cookie的属性设置不当可能会造成系统用户安全隐患&#xff0c;Cookie信息泄露是Cookiehttp only配置缺陷引起的&#xff0c;在设置Cookie时&#xff0c;可以设置的一个…

利用textarea和white-space实现最简单的文章编辑器 支持缩进和换行

当你遇到一个非常基础的文章发布和展示的需求&#xff0c;只需要保留换行和空格缩进&#xff0c;你是否会犹豫要使用富文本编辑器&#xff1f;实际上这个用原生的标签两步就能搞定&#xff01; 1.直接用textarea当编辑器 textarea本身就可以保存空格和换行符&#xff0c;示例如…

Spring mvc的响应

1、static是静态页面的存放 templates是动态模板&#xff0c;不需要可以直接删掉 2、我们要是想访问static下的页面我们只需要他的文件名字就可以访问(如果有多层可以在url中加入相关路径) 3、get可以缓存&#xff08;是幂等的&#xff09; post 不能被缓存 4、返回Json响应 …

【数据挖掘】练习2:数据管理2

课后作业2&#xff1a;数据管理2 一&#xff1a;上机实验2 # 编写函数stat&#xff0c;要求该函数同时计算均值&#xff0c;最大值&#xff0c;最小值&#xff0c;标准差&#xff0c;峰度和偏度。 install.packages("timeDate") library(timeDate) stat <- func…

面试经典150题【81-90】

文章目录 面试经典150题【81-90】530.二叉搜索树的最小绝对差值230.二叉搜索树中第k小的元素98.验证二叉搜索树92.反转链表II25.K个一组翻转链表146.LRU缓存909. 蛇梯棋&#xff08;未做&#xff09;433.最小基因变化127.单词接龙&#xff08;未做&#xff09;17.电话号码的字母…

HTTP 工作流程请求响应 - 面试常问

文章目录 HTTP 工作流程请求和响应格式HTTP请求格式请求行&#xff1a;请求头部字段&#xff1a;空行&#xff1a;消息正文&#xff08;请求正文&#xff09;&#xff1a; HTTP响应格式状态行&#xff1a;响应头部字段&#xff1a;空行&#xff1a; HTTP方法HTTP状态码常用HTTP…

论文笔记:液体管道泄漏综合检测与定位模型

0 简介 An integrated detection and location model for leakages in liquid pipelines 1 摘要 许多液体&#xff0c;如水和油&#xff0c;都是通过管道运输的&#xff0c;在管道中可能发生泄漏&#xff0c;造成能源浪费、环境污染和对人类健康的威胁。本文描述了一种集成的…

C++进阶之路---手撕“红黑树”

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、红黑树的概念与性质 1.概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点…

基于SVM支持向量机的数据预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ........................................................................... Year[2011,2…

总结Dubbo开源RPC框架

一、分布式系统 1.1 集群和分布式 集群&#xff1a;多个机器提供一样的服务&#xff08;实现高性能、高可用、 可伸缩、高可扩展 &#xff09; 分布式&#xff1a;多个机器提供不同的服务&#xff0c;合起来为一个大服务 1.2 架构 二、Dubbo dubbo是一个高性能、轻量级的开…

SQLiteC/C++接口详细介绍sqlite3_stmt类简介

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十八&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍sqlite3_stmt类&#xff08;一&#xff09; 预准备语句对象 typedef struct sqlite3_stmt sqlite3_stmt…

Linux docker1--环境及docker安装

一、基础环境要求 Docker分为ce版本&#xff08;免费&#xff0c;试用7个月&#xff09;和ee版本&#xff08;收费&#xff09;。 最低配置要求&#xff1a;64位操作系统&#xff0c;centOS 7及以上&#xff0c;内核版本不低于3.10 二、部署docker 1、查看服务的基础环境是否满…

基于深度学习YOLOv8+Pyqt5的工地安全帽头盔佩戴检测识别系统(源码+跑通说明文件)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;318安全帽 获取完整源码源文件7000张已标注的数据集训练好的模型配置说明文件 可有偿59yuan一对一远程操作配置环境跑通程序 效果展示&#xff08;图片检测批量检测视频检测摄像头检测&#xff09; 基于深度学习YOLOv8Pyqt…

【HTTP】面试题整理

HTTP&#xff1a;什么是队头阻塞以及怎么解决&#xff1f; 队头阻塞&#xff08;Head-of-Line Blocking&#xff09; 计算机网络中的一个概念&#xff0c;特别是在处理HTTP请求时。当多个HTTP请求被发送到一个服务器&#xff0c;并且这些请求被放置在一个队列中等待处理时&…

uniapp微信小程序随机生成canvas-id报错?

uniapp微信小程序随机生成canvas-id报错&#xff1f; 文章目录 uniapp微信小程序随机生成canvas-id报错&#xff1f;效果图遇到问题解决 场景&#xff1a; 子组件&#xff0c;在 mounted 绘制 canvas&#xff1b;App、H5端正常显示&#xff0c;微信小程序报错&#xff1b; 效…

【Map和Set】(二叉搜索树 查找操作 插入操作 删除操作 Map的使用 Map.Entry<K, V> Set的说明)

文章目录 二叉搜索树查找操作插入操作删除操作 Map的使用Map.Entry<K, V> Set的说明 二叉搜索树 二叉搜索树&#xff1a;是空树或者是具有下面性质的二叉树 若左子树不为空,则左子树上所有节点的值都小于根节点的值;若右子树不为空,则右子树上所有节点的值都大于根节点的…

CSS案例-5.margin产品模块练习

效果1 相关数据 整体长&#xff1a;298px&#xff0c;高&#xff1a;415px 效果2 知识点 外边距margin 块级盒子水平居中 条件&#xff1a; 必须有宽度左右外边距设为auto 三种写法&#xff1a; margin-left&#xff1a;auto&#xff1b;margin-right&#xff1a;auto&…