05 06 Verilog基础语法与应用讲解

05. 1. 位操作

计数器实验升级,设计8个LED灯以每个0.5s的速率循环闪烁(跑马灯)

1.1 方法1:使用移位操作符<<来控制led灯的循环亮灭

设计代码

  1. Verilog中,判断操作的时候不加位宽限定是可以的,比如if(counter == 24999999)或者if(counter == 25’d24999999)都可以,但是在赋值的时候要加,比如counter <= counter + 1’d1;(赋0可以不加)

  2. [7:0] led,led有八个,所以用8'b0000_0001来代表八个led,使用移位操作符<<来控制led灯的循环亮灭。

module led_run(clk,rstn,led
);input clk;input rstn;output reg[7:0]  led;reg[25:0] counter;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == 24999999)//else if(counter == 24999)counter <= 0;elsecounter <= counter + 1'd1;always@(posedge clk or negedge rstn)if(!rstn)led <= 8'b0000_0001;else if(counter == 24999999)begin//else if(counter == 24999)beginif(led == 8'b1000_0000)led <= 8'b0000_0001;elseled <= led << 1;endelseled <= led;endmodule

仿真代码:

`timescale 1ns/1nsmodule led_run_tb();reg clk;reg rstn;wire[7:0] led;led_run led_run(.clk(clk),.rstn(rstn),.led(led));initial clk = 1;always #10 clk = !clk;initial beginrstn = 0;#201;rstn = 1;#4000000;$stop;endendmodule

仿真波形:

1.2 方法2:利用位拼接{led[6:0], led[7]}实现循环移位

设计代码

该方法应用场景不多,了解即可。

module led_run_1(clk,rstn,led
);input clk;input rstn;output reg[7:0]  led;reg[25:0] counter;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == 24999999)//else if(counter == 24999)counter <= 0;elsecounter <= counter + 1'd1;always@(posedge clk or negedge rstn)if(!rstn)led <= 8'b0000_0001;else if(counter == 24999999)begin//else if(counter == 24999)led <= {led[6:0], led[7]};elseled <= led;endmodule

1.3 方法3:调用其他模块

设计代码

思路:用计数器产生8种状态,然后再把这8种状态拿去用三八译码器译码,就刚好能够去对应点亮8个led灯。

  1. 调用了底层模块3_8译码器后(3位输入[2:0],八位输出8'b0000_0001),顶层led_run_2的输出led的数据类型需要由reg变为wire形(或者不写wire)
  2. 模块的调用与tb里的调用方式一样,做好对应端口的连接即可。
module led_run_2(clk,rstn,led
);input clk;input rstn;output wire[7:0]  led; //注意1reg[25:0] counter;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == 24999999)//else if(counter == 24999)counter <= 0;elsecounter <= counter + 1'd1;reg[2:0] counter2;always@(posedge clk or negedge rstn)if(!rstn)counter2 <= 0;else if(counter == 24999999)//else if(counter == 24999)counter2 <= counter2 + 1'd1;decoder_3_8 decoder_3_8( //注意2.a(counter2[2]),.b(counter2[1]),.c(counter2[0]),.out(led)
);endmodule

调用方法:

05. 2. 参数化设计

设计代码

  1. 将24999999用参数代替,好处1是增加代码复用性与可读性。好处2是我们可以在板级验证的时候使用24999999,在写tb做调试的时候将参数改为2499,节约仿真时间
module led_run(clk,rstn,led
);parameter MCNT = 25'd24999999; //注意1input clk;input rstn;output reg[7:0]  led;reg[25:0] counter;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == MCNT)//else if(counter == 24999)counter <= 0;elsecounter <= counter + 1'd1;always@(posedge clk or negedge rstn)if(!rstn)led <= 8'b0000_0001;else if(counter == MCNT)begin//else if(counter == 24999)beginif(led == 8'b1000_0000)led <= 8'b0000_0001;elseled <= led << 1;endelseled <= led;endmodule

仿真代码

  1. 写法一,修改例化后的模块参数,defparam led_run_inst.MCNT = 2499;
  2. 写法二,例化前修改module,led_run里的参数
`timescale 1ns/1nsmodule led_run_tb();reg clk;reg rstn;wire[7:0] led;led_run led_run_inst(.clk(clk),.rstn(rstn),.led(led));defparam led_run_inst.MCNT = 2499; //写法一initial clk = 1;always #10 clk = !clk;initial beginrstn = 0;#201;rstn = 1;#4000000;$stop;endendmodule

`timescale 1ns/1nsmodule led_run_tb();reg clk;reg rstn;wire[7:0] led;led_run //写法二#(.MCNT(2499))led_run_inst(.clk(clk),.rstn(rstn),.led(led));initial clk = 1;always #10 clk = !clk;initial beginrstn = 0;#201;rstn = 1;#4000000;$stop;endendmodule

仿真波形

06 使用参数化的设计实现模块的重用

让八个led灯分别以不同的频率闪烁

思路:使用八个led灯闪烁模块,为了简化,我们分别以0.1s,0.2s,0.3s,0.4s让四个led闪烁。

1.设计代码

  1. 先构建一个led闪烁的设计代码,再给与不同的计数参数例化4次即可
module led_run8(clk,rstn,led
);parameter MCNT = 24999999;input clk;input rstn;output led;reg[25:0] counter;reg led;always@(posedge clk or negedge rstn)if(!rstn)counter <= 0;else if(counter == MCNT)counter <= 0;elsecounter <= counter + 1'd1;always@(posedge clk or negedge rstn)if(!rstn)led <= 0;else if(counter == MCNT)led <= !led;endmodule
  1.  例化4个模块,使用参数化的设计实现模块的重用
module led_run8_test(clk,rstn,led
);input clk;input rstn;output wire[3:0] led;led_run8 led_run8_inst0(.clk(clk),.rstn(rstn),.led(led[0]));defparam led_run8_inst0.MCNT = 25'd2499999;led_run8 led_run8_inst1(.clk(clk),.rstn(rstn),.led(led[1]));defparam led_run8_inst1.MCNT = 25'd4999999;led_run8 led_run8_inst2(.clk(clk),.rstn(rstn),.led(led[2]));defparam led_run8_inst2.MCNT = 25'd7499999;led_run8 led_run8_inst3(.clk(clk),.rstn(rstn),.led(led[3]));defparam led_run8_inst3.MCNT = 25'd9999999;endmodule

 2.仿真代码

`timescale 1ns/1nsmodule led_run8_test_tb();reg clk;reg rstn;wire[3:0] led;led_run8_test led_run8_test_inst(.clk(clk),.rstn(rstn),.led(led));initial clk = 1;always #10 clk = !clk;initial beginrstn = 0;#201;rstn = 1;#400000000;$stop;endendmodule

 3.仿真波形

4.布置引脚(通过代码来布置引脚)

 

 

到此布置引脚就布置好了,后续生成bit流文件,打开硬件管理器之后就可以板级验证了。

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

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

相关文章

手把手教你玩转蓝牙模块(原理+驱动)

head: title: 手把手教你玩转蓝牙模块&#xff08;原理驱动&#xff09; description: 手把手教你玩转蓝牙模块&#xff08;原理驱动&#xff09; 作为嵌入式开发工程师&#xff0c;蓝牙模块怎能少呢&#xff1f; 蓝牙模块广泛应用在各种电子器件&#xff0c;比如手机、蓝牙耳…

【stm32】hal库学习笔记-ADC模数转换(超详细)

【stm32】hal库学习笔记-ADC模数转换&#xff08;超详细&#xff09; 本篇章介绍了ADC实现电压检测的三种方式 ADC原理及选型 ADC将连续的模拟电压信号转换为二进制的数字信号 选型参数 速度&#xff08;采样频率&#xff09; 功耗 精度 转换原理 ADC hal库驱动函数 普通…

主干网络篇 | YOLOv5/v7 更换主干网络为 VGG13 / VGG16 / VGG19 | 对比实验必备

论文地址:https://arxiv.org/pdf/1409.1556.pdf 在这项工作中,我们研究了卷积网络深度对其在大规模图像识别环境中准确性的影响。我们的主要贡献是对使用非常小(33)卷积滤波器的架构的不断增加深度的网络进行了彻底评估,这表明通过将深度推进到16-19个权重层,可以在先前…

【数据结构】一篇文章带你学会八大排序

一、排序的概念1. 排序的使用&#xff1a;2. 稳定性&#xff1a;3. 内部排序&#xff1a;4. 外部排序︰5. 排序的用途&#xff1a; 二、排序的原理及实现1. 插入排序1.1 直接插入排序1.1.1 直接插入排序在现实中的应用1.1.2 直接插入排序的思想及个人理解1.1.3 直接插入排序的排…

如何有效避免交易贵金属爆仓的一些建议

在交易贵金属的市场中&#xff0c;爆仓是一个令人恐惧的场景。许多交易者在面临巨额亏损时无法承受并被迫平仓&#xff0c;导致资金损失甚至破产。为了帮助您规避这种风险&#xff0c;下面将提供一些有效的建议&#xff0c;帮助您在交易贵金属时避免爆仓。 第一&#xff0c;了解…

C++力扣题目377--组合求和VI 爬楼梯进阶版 322--零钱兑换 279完全平方数

377. 组合总和 Ⅳ 力扣题目链接(opens new window) 难度&#xff1a;中等 给定一个由正整数组成且不存在重复数字的数组&#xff0c;找出和为给定目标正整数的组合的个数。 示例: nums [1, 2, 3]target 4 所有可能的组合为&#xff1a; (1, 1, 1, 1) (1, 1, 2) (1, 2, …

计算机网络基础 第三章——数据链路层层 知识点(持续更新)

3.1差错产生的原因及差错控制方法 1.差错产生的原因及差错控制方法 (1)当数据信号从发送端出发经过物理线路时,由于物理线路存在着噪声,因此数据信号通 过物理线路传输到接收端时,接收信号必然是数据信号与噪声信号电平的叠加。在接收端 接收电路在取样时对叠加后的信号进行判…

JavaScript相关(一)——作用域

本篇将从JS的执行上下文开始&#xff0c;去理解&#xff1a;变量提升、 栈式调用、作用域和闭包。 参考&#xff1a; 浏览器工作原理与实践 JS执行上下文 执行上下文是 JavaScript 执行一段代码时的运行环境&#xff0c;比如调用一个函数&#xff0c;就会生成这个函数的执行…

发廊理发店微信小程序展示下单前端静态模板源码

模板描述&#xff1a;剪发小程序前端源码&#xff0c;一共五个页面&#xff0c;包括店铺、理发师、订单、我的等页面 注&#xff1a;该源码是前端静态模板源码&#xff0c;没有后台和API接口

个人博客说明

本人博客主要发布平台为博客园 https://www.cnblogs.com/carmi 更多详细&#xff0c;完整图片的文章还请师傅们动动小手到博客园去看吧。

STM32/C51开发环境搭建(KeilV5安装)

Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统&#xff0c;与汇编相比&#xff0c;C语言在功能上、结构性、可读性、可维护性上有明显的优势&#xff0c;因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等…

降准是什么意思?降准对股市有哪些影响?

降准是什么意思 降准&#xff0c;全称为“中央银行调低法定存款准备率”&#xff0c;是指中央银行降低法定存款准备率&#xff0c;以增加银行的可用资金&#xff0c;从而增加市场的流动性。 具体来说&#xff0c;存款准备金是商业银行为了应对储户取款和清算时准备的资金&…

java异常类

目录 异常 编译时异常 运行时异常 异常的抛出&#xff1a;throw 异常的声明&#xff1a;throws try-catch捕获并处理&#xff1a; finally 自定义异常类 异常处理流程总结 异常 当程序出现异常之后&#xff0c;将不会执行异常之后的代码 1. Throwable&#xff1a;是异…

Java基础常见面试题总结-并发(二)

volatile底层原理 volatile是轻量级的同步机制&#xff0c;volatile保证变量对所有线程的可见性&#xff0c;不保证原子性。 当对volatile变量进行写操作的时候&#xff0c;JVM会向处理器发送一条LOCK前缀的指令&#xff0c;将该变量所在缓存行的数据写回系统内存。由于缓存一…

【Jave EE】----SpringBoot配置文件

1.配置文件的作用 数据库的连接信息&#xff08;包含⽤户名和密码的设置&#xff09;项⽬的启动端⼝ 第三⽅系统的调⽤秘钥等信息 ⽤于发现和定位问题的普通⽇志和异常⽇志 2.SpringBoot的配置文件分类 系统使用的配置文件&#xff0c;如端口号的设置&#xff0c;连接数据库的配…

Java项目:18 基于SpringBoot的学生成绩管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 基于springboot的学生成绩管理系统主要功能 分为两个端&#xff0c;教师和学生 教师的主要功能&#xff1a;学生信息、成绩信息的增删改查 学生的主要…

[职场] 服务行业个人简历 #笔记#笔记

服务行业个人简历 服务员个人简历范文1 姓名: XXX国籍:中国 目前所在地:天河区民族:汉族 户口所在地:阳江身材: 160cm43kg 婚姻状况:未婚年龄: 21岁 培训认证:诚信徽章: 求职意向及工作经历 人才类型:普通求职 应聘职位: 工作年限:职称:初级 求职类型:全职可到职日期:随时 月薪…

bpmn.js一个基于Bpmn 2.0的前端工作流展示和绘制工具

bpmn.js是由开源工作流引擎camunda内部组织BPMN.IO组织开发的一款基于BPMN 2.0的工作流展示、编辑的web端工具库。由于工作流引擎activiti、flowable、camunda属于同宗分流&#xff0c;其工作流定义格式大致相同&#xff0c;所以我们可以使用bpmn.js完美融合其中任一工作流引擎…

无广告iOS获取设备UDID 简单方便快捷

ps&#xff1a; 为啥不用蒲公英了&#xff0c;就是因为有广告了&#xff0c;获取个UDID还安装游戏&#xff0c;真恶心?&#xff0c;所以找了新的获取UDID都方法&#xff0c;网页直接获取就可以&#xff0c;不会安装软件。 UDID 是一种 iOS 设备的特殊识别码。除序号之外&…

Redis中内存淘汰算法实现

Redis中内存淘汰算法实现 Redis的maxmemory支持的内存淘汰机制使得其成为一种有效的缓存方案&#xff0c;成为memcached的有效替代方案。 当内存达到maxmemory后&#xff0c;Redis会按照maxmemory-policy启动淘汰策略。 Redis 3.0中已有淘汰机制&#xff1a; noevictionall…