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

news2024/9/24 12:21:02

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;
    else
        counter <= counter + 1'd1;
        
    always@(posedge clk or negedge rstn)
    if(!rstn)
        led <= 8'b0000_0001;
    else if(counter == 24999999)begin
    //else if(counter == 24999)begin
        if(led == 8'b1000_0000)
            led <= 8'b0000_0001;
        else
            led <= led << 1;
    end
    else
        led <= led;
        
endmodule

仿真代码:

`timescale 1ns/1ns

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

endmodule

仿真波形:

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;
    else
        counter <= 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]};
    else
        led <= 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; //注意1
    
    reg[25:0] counter;
    
    always@(posedge clk or negedge rstn)
    if(!rstn)
        counter <= 0;
    else if(counter == 24999999)
    //else if(counter == 24999)
        counter <= 0;
    else
        counter <= 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; //注意1
    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 == MCNT)
    //else if(counter == 24999)
        counter <= 0;
    else
        counter <= counter + 1'd1;
        
    always@(posedge clk or negedge rstn)
    if(!rstn)
        led <= 8'b0000_0001;
    else if(counter == MCNT)begin
    //else if(counter == 24999)begin
        if(led == 8'b1000_0000)
            led <= 8'b0000_0001;
        else
            led <= led << 1;
    end
    else
        led <= led;
        
endmodule

仿真代码

  1. 写法一,修改例化后的模块参数,defparam led_run_inst.MCNT = 2499;
  2. 写法二,例化前修改module,led_run里的参数
`timescale 1ns/1ns

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

endmodule

`timescale 1ns/1ns

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

endmodule

仿真波形

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

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

endmodule

 3.仿真波形

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

 

 

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

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

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

相关文章

【Flink入门修炼】1-3 Flink WordCount 入门实现

本篇文章将带大家运行 Flink 最简单的程序 WordCount。先实践后理论&#xff0c;对其基本输入输出、编程代码有初步了解&#xff0c;后续篇章再对 Flink 的各种概念和架构进行介绍。 下面将从创建项目开始&#xff0c;介绍如何创建出一个 Flink 项目&#xff1b;然后从 DataStr…

pwn学习笔记(1)前置基础

pwn学习笔记&#xff08;1&#xff09; &#xff08;1&#xff09;pwn简介&#xff1a; ​ 以下来自于百度百科&#xff1a;”Pwn”是一个黑客语法的俚语词&#xff0c;是指攻破设备或者系统发音类似“砰”&#xff0c;对黑客而言&#xff0c;这就是成功实施黑客攻击的声音—…

【开源】SpringBoot框架开发医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

【前端素材】bootstrap4实现绿色植物Lukani平台

一、需求分析 绿色植物商城是一个专门销售绿色植物的零售商店或在线平台。它提供各种类型和品种的室内植物、室外植物和盆栽等。绿色植物商城的作用可以从以下几个方面来分析&#xff1a; 1. 提供多样化的选择&#xff1a;绿色植物商城通常会提供各种各样的绿色植物选项&…

.NET Core 实现 JWT 认证

写在前面 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准, 由三部分组成&#xff0c;分别是Header、Payload和Signature&#xff0c;它以 JSON 对象的方式在各方之间安全地传输信息。通俗的说&#xff0c;就是通过数字签名算法生产一个字符串&#xff0c;然后在网络…

『运维备忘录』之 Kubernetes(K8S) 常用命令速查

一、简介 kubernetes&#xff0c;简称K8s&#xff0c;是用8代替名字中间的8个字符“ubernete”而成的缩写&#xff0c;是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用。kubernetes是基于容器技术的分布式架构解决方案&#xff0c;具有完备的集群管理能力&a…

UDP端口探活的那些细节

一 背景 商业客户反馈用categraf的net_response插件配置了udp探测, 遇到报错了&#xff0c;如图 udp是无连接的&#xff0c;无法用建立连接的形式判断端口。 插件最初的设计是需要配置udp的发送字符&#xff0c;并且配置期望返回的字符串&#xff0c; [[instances]] targets…

【PyTorch][chapter 14][李宏毅深度学习][Word Embedding]

前言&#xff1a; 这是用于自然语言处理中数据降维的一种方案。 我们希望用一个向量来表示每一个单词. 有不同的方案 目录&#xff1a; one-hot Encoding word-class 词的上下文表示 count-based perdition-based CBOW Skip-Gram word Embedding 词向量相似…

数据结构(C语言)代码实现(八)——顺序栈实现数值转换行编辑程序汉诺塔

目录 参考资料 顺序栈的实现 头文件SqStack.h&#xff08;顺序栈函数声明&#xff09; 源文件SqStack.cpp&#xff08;顺序栈函数实现&#xff09; 顺序栈的三个应用 数值转换 行编辑程序 顺序栈的实现测试 栈与递归的实现&#xff08;以汉诺塔为例&#xff09; 参考资…

Vision Pro新机测评!“这才是MR硬件该有的模样!”

期盼很久的Vision Pro终于到了&#xff0c;小编迫不及待地体验了一把&#xff0c;效果相当非常震撼&#xff0c;操作非常丝滑&#xff0c;画面非常清晰…来不急解释了&#xff0c;快和小编一起来看一下吧~ 新机一到公司&#xff0c;为解大家对Vision Pro 的“相思之苦”&#x…

(43)找出中枢整数

文章目录 每日一言题目解题思路法一&#xff1a;法二&#xff1a; 代码法一&#xff1a;法二&#xff1a; 结语 每日一言 即使慢&#xff0c;驰而不息&#xff0c;纵令落后&#xff0c;纵令失败&#xff0c;但一定可以达到他所向往的目标。——鲁迅 题目 题目链接&#xff1a…

SQL注入(SQL Injection)从注入到拖库 —— 简单的手工注入实战指南精讲

基本SQL注入步骤&#xff1a; 识别目标&#xff1a;确定目标网站或应用程序存在潜在的SQL注入漏洞。收集信息&#xff1a;通过查看页面源代码、URL参数和可能的错误信息等&#xff0c;搜集与注入有关的信息。判断注入点&#xff1a;确定可以注入的位置&#xff0c;比如输入框、…

网络套件字(理论知识)

一、源IP地址和目的IP地址 上次说到IP地址是为了是为了让信息正确的从原主机传送到目的主机&#xff0c;而原IP地址和目的IP地址就是用于标识两个主机的&#xff0c;既然叫做地址必然有着路径规划的作用&#xff0c;而路径规划最重要的就是&#xff0c;从哪来到哪去&#xff0…

tab 切换类交互功能实现

tab切换类交互&#xff1a; 记录激活项&#xff08;整个对象/id/index)动态类型控制 下面以一个地址 tab 切换业务功能为例&#xff1a; <div class"text item" :class"{active : activeAddress.id item.id}" click"switchAddress(item)"…

2023年出版的新书中提到的《人月神话》(202402更新)(2)共8本

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《人月神话》于1975年出版&#xff0c;1995年出二十周年版。自出版以来&#xff0c;该书被大量的书籍和文章引用&#xff0c;直到现在热潮不退。 2023年&#xff0c;清华大学出版社推…

MySQL 升级脚本制作

当数据库更新字段后或添加一些基础信息&#xff0c;要对生产环境进行升级&#xff0c;之前都是手动编写sql&#xff0c;容易出错还容易缺失。 通过 Navcat 工具的数据库结构同步功能和数据同步功能完成数据库脚本的制作。 一、结构同步功能 1、选择 工具–结构同步&#xff1…

WifiConfigStore初始化读取-Android13

WifiConfigStore初始化读取 1、StoreData创建并注册2、WifiConfigStore读取2.1 文件读取流程2.2 时序图2.3 日志 1、StoreData创建并注册 packages/modules/Wifi/service/java/com/android/server/wifi/WifiConfigManager.java mWifiConfigStore.registerStoreData(mNetworkL…

机器学习 - 梯度下降

场景 上一章学习了代价函数&#xff0c;在机器学习中&#xff0c;代价模型是用于衡量模型预测值与真实值之间的差异的函数。它是优化算法的核心&#xff0c;目标是通过调整模型的参数来最小化代价模型的值&#xff0c;从而使模型的预测结果更接近真实值。常见的代价模型是均方…

猫头虎分享已解决Bug ‍ || TypeError: Object of type ‘int64‘ is not JSON serializable

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

fghbbbbbbbbbb

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…