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

文章目录

  • 该系列目录:
  • 设计环境
  • 设计目标
  • 设计思路
  • 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到7reg [2:0] counter2;//标记可以闪烁了reg flag;//50M cyclesparameter MCNT1S = 50_000_000;//12.5M cyclesparameter MCNT025S = 12_500_000;//控制flag状态//flag为0时为空闲状态,led熄灭,counter0开始计数到1秒//flag为1时为忙碌状态,led动态闪烁,counter1和counter2正常计数always@(posedge clk or negedge rst_n) beginif(!rst_n) beginflag <= 0;end else if(counter0 == MCNT1S -1 ) beginflag <= 1;end else if( (counter1 == MCNT025S -1) && (counter2 == 7) ) beginflag <= 0;end else beginflag <= flag;endend//计数空闲的1秒always@(posedge clk or negedge rst_n) beginif(!rst_n) begincounter0 <= 0;end else if(flag == 0) beginif(counter0 == MCNT1S -1)begincounter0 <= 0;end else begincounter0 <= counter0 + 1;endendend//负责在flag为1时计算0.25秒always@(posedge clk or negedge rst_n) beginif(!rst_n) begincounter1 <= 0;end else if(flag == 1) beginif(counter1 == MCNT025S - 1) begincounter1 <= 0;end else begincounter1 <= counter1 + 1;endendend//当flag为1时,counter2每当counter1计满时自增1//如果counter1和counter2都计满,则进入空闲时刻always@(posedge clk or negedge rst_n) beginif(!rst_n) begincounter2 <= 0;end else if(flag == 1) beginif(counter1 == MCNT025S - 1) beginif(counter2 == 7) begincounter2 <= 0;end else begincounter2 <= counter2 + 1;endendendend//负责根据counter2决定led_out输出always@(posedge clk or negedge rst_n) beginif(!rst_n) beginled_out <= 0;end else beginif(flag) begincase(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];endcaseendendend
endmodule

Testbench

`timescale 1ns / 1psmodule 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 beginclk = 1;endalways #10 clk=~clk;initial beginrst_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.mzph.cn/news/763351.shtml

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

相关文章

力扣热门算法题 52. N 皇后 II,53. 最大子数组和,54. 螺旋矩阵

52. N 皇后 II&#xff0c;53. 最大子数组和&#xff0c;54. 螺旋矩阵&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 52. N 皇后 II 解题思路 完整代码 Python Java 53. 最大子数组…

长安链开源社区发布2023年度长安链优秀应用案例

1月27日结束的“长安链发布三周年庆暨生态年会”上&#xff0c;在国家区块链技术创新中心的指导下&#xff0c;长安链开源社区联合长安链生态联盟正式发布2023年度长安链行业示范案例、领域精品案例及特色创新案例。 本次评选面向2023年度应用长安链上线并取得应用成效的案例&…

Matlab在高光谱遥感中的作用:从数据处理到决策支持

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

vue中如何实现子组件相互切换,而且数据不会丢失

项目场景&#xff1a; 今天的项目场景: 项目为数据报表,但是一个父页面中有很多的子页面,而且子页面中不是相互关联,但是数据又有联系. 问题描述 子页面相互切换的时候之前填写好的数据会丢失,无法保存.这样想提交所有的子页面的数据就出现问题. 原因分析&#xff1a; 分析原因…

TypeScript的接口、泛型、自定义类型

接口 src/types/index.ts //定义一个接口&#xff0c;用于限制person对象的具体属性 export interface PersonInter {id: string,name: string,age: number } src/components/person.vue <template><div class"person"></div> </template&g…

外包干了20天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入杭州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

ONNX @riscv+OpenKylin(暂时失败)

先说总结&#xff1a; 目前在算能云riscvOpenKylin没有成功&#xff0c;看近期是否有人成功&#xff0c;学习下先进经验。 荔枝派应该是很容易成功的&#xff0c;直接用这个库里的whl安装即可&#xff1a;Releases zhangwm-pt/onnxruntime GitHub 安装onnxruntime-riscv …

SpringCloud详解,图文码笔记

注意&#xff1a; SpringCloud并 不等于 微服务 1.微服务技术线 2.认识微服务 分布式架构 分布式架构: 根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立项目开发&#xff0c;称为一个服务。 优点&#xff1a; 降低服务耦合有利于服务升级拓展 服务治理 分布式…

基于Java的绩效考核系统的设计与实现

今天要和大家聊的是一款基于Java的绩效考核系统的设计与实现 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f495;个人简介…

AcWing 3224. 画图 (BFS,Flood Fill,坐标变换)

用 ASCII 字符来画图是一件有趣的事情&#xff0c;并形成了一门被称为 ASCII Art 的艺术。 例如&#xff0c;下图是用 ASCII 字符画出来的 CSPRO 字样。 ..____.____..____..____...___.../.___/.___||.._.\|.._.\./._.\.|.|...\___.\|.|_).|.|_).|.|.|.||.|___.___).|..__/|.…

从先序与中序遍历序列构造二叉树

从先序与中序遍历序列构造二叉树 描述&#xff1a; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 递归法 解题思路&#xff1a; 通过先序遍历我…

手势识别模块PAJ7620的简单应用

文章目录 一、PAJ76201.介绍2.模块特性3.模块原理4.原理图5.内部框图 二、软件1.手势识别1.1 初始化ATK-MS7620模块1.2 配置ATK-MS7620模块为手势检测模式1.3 获取手势 2.接近检测1.1 初始化ATK-MS7620模块1.2 配置ATK-MS7620模块为接近检测模式1.3 获取物体亮度和大小 三、总结…

HQYJ 2024-3-19 作业

TCP通信三次握手和四次挥手&#xff1a; 并行和并发的区别&#xff1a;并发是单核处理器处理多个线程任务&#xff0c;并行是多核处理器同时处理多个线程任务。并发过程中会抢占CPU资源&#xff0c;轮流使用&#xff1b;并行过程不会抢占CPU资源。 阻塞IO和非阻塞IO&#xff…

JAVA Synchronized对象锁和类锁区别(牛逼)

一个类就像一个四合院&#xff0c;四合院的大门叫做构造方法&#xff0c;盖房子必须经过大门&#xff0c;每new一个对象&#xff0c;就表示在四合院里再盖一间新房子&#xff0c;大门上面的锁&#xff0c;叫做构造锁&#xff0c;里面每一间房子就是一个实例&#xff0c;每间房子…

迈入C++编程之路(一)

目录 一、什么是C 二、关键字&#xff1a; 三、命名空间 &#xff1a; 1. C语言存在的问题&#xff1a; 2. namespace关键字&#xff1a; 3. 注意点&#xff1a; 4.使用命名空间分为三种&#xff1a; 四、输入输出&#xff1a; 五、缺省函数&#xff1a; 1. 什么是缺省…

Xinstall让App推广变得高效而简单

随着移动互联网的迅猛发展&#xff0c;App已成为人们生活中不可或缺的一部分。然而&#xff0c;对于众多开发者和广告主来说&#xff0c;如何高效地推广自己的App&#xff0c;却一直是一个令人头疼的问题。今天&#xff0c;我们要为大家介绍的&#xff0c;正是国内专业的App全渠…

17.Python从入门到精通—Python 推导式 列表推导式 字典推导式 集合推导式 元组推导式

17.Python从入门到精通—Python 推导式 列表推导式 字典推导式 集合推导式 元组推导式 Python 推导式列表推导式字典推导式集合推导式元组推导式&#xff08;生成器表达式&#xff09; Python 推导式 列表推导式 在Python中&#xff0c;列表推导式是一种简洁的语法&#xff0…

安卓面试题多线程 126-130

126. 简述为什么你应该在循环中检查等待条件?处于等待状态的线程可能会收到错误警报和伪唤醒,如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退出。127. 简述Java 中的同步集合与并发集合有什么区别 ?同步集合与并发集合都为多线程和并发提供了合适的线程…

python内置函数 P

python内置函数 P Python 解释器内置了很多函数和类型&#xff0c;任何时候都能使用。 P 名称描述pow计算一个数的幂。print在控制台上输出文本或变量的值。property创建属性&#xff08;attribute&#xff09;的内置函数。 pow(base, exp, modNone) pow() 是 Python 中的…

《妈妈是什么》笔记(四) 找到自己的兴趣,是童年最重要的工作

经典摘录 一个孩子的童年&#xff0c;本来就会自然地孕育创意。妈妈没有识别创意的能力&#xff0c;不代表孩子没有创意。 【我们要给孩子准备简单、可塑性强的创意材料&#xff0c;比如充足的纸和笔。】 【童年的权利&#xff0c;就是玩&#xff1b;童年的执行力&#xff0…