FPGA学习(6)-基础语法参数化设计阻塞与非阻塞

news2024/12/28 18:21:49

目录

1.两种参数化不改变源文件,只改仿真文件的值

2.参数化设计实现模块的重用

2.1不用参数化方法

2.1.1源文件

 2.1.2仿真文件

2.1.3仿真波形及实验

2.2 用参数方法

2.2.1调用之前写的led灯闪烁模块,在本源函数中,例化4次调用之前的模块。

2.2.2 源文件

2.2.3仿真文件

2.2.4 电路图的理解

3阻塞与非阻塞语句 


1.两种参数化不改变源文件,只改仿真文件的值

parameter的作用:

(1)在模块被例化时,在例化它的代码中,使用一定的语句修改其值。

(2)在仿真和实际运行时,分别要取不同的常量,使用parameter进行定义。

(3)仿真时,在testbench中通过defparam语句修改其值,以新的值进行仿真。

在源文件定义好参数后,仿真文件中有两种方式:

方式1:

该语句需要放在例化后,且修改仿真文件参数时,需要使用被例化后的模块名。先定义,后使用。

defparam run_led3_inst0.MCNT=25_000-1;

方式2:

直接在例化中进行修改。

 run_led3 
    #(
        .MCNT(25_00-1)
    )

    run_led3_inst0(
    .clk(clk),
    .reset(reset),
    .led(led)
);

2.参数化设计实现模块的重用

实现下图所示的功能

2.1不用参数化方法

2.1.1源文件

即建立4个计数器,分别计数到各自需要的次数,然后进行累加。这里将后面的会合在一起写了,犯了一个错误:不能出现与rst并行的if语句。再用begin...end相隔开。vivado综合出现ambiguous clock in event control - 知乎 (zhihu.com)

module led_four(
    clk,
    reset,
    led
    );
input clk;
input reset;
output reg [3:0]led;
reg [24:0]counter1;
reg [24:0]counter2;
reg [24:0]counter3;
reg [21:0]counter4;

always@(posedge clk or negedge reset)
if(!reset)
    counter1<=0;
else if(counter1 == 25_000_000-1)
    counter1<=0;
else
    counter1<=counter1+1'd1;
    
always@(posedge clk or negedge reset)
if(!reset)
    counter2<=0;
else if(counter2 == 125_000_00-1)
    counter2<=0;
else
    counter2<=counter2+1'd1;
    
always@(posedge clk or negedge reset)
if(!reset)
    counter3<=0;
else if(counter3 == 625_000_0-1)
    counter3<=0;
else
    counter3<=counter3+1'd1;
    
always@(posedge clk or negedge reset)
if(!reset)
    counter4<=0;
else if(counter4 == 25_000_00-1)
    counter4<=0;
else
    counter4<=counter4+1'd1;

always@(posedge clk or negedge reset)
begin
if(!reset)
    led[3:0]<=1'b0;
else begin
    if(counter1 == 25_000_000-1)
        led[0]<=!led[0];
    if(counter2 == 125_000_00-1)
        led[1]<=!led[1];
    if(counter3 == 625_000_0-1)
        led[2]<=!led[2];
    if(counter4 == 25_000_00-1)
        led[3]<=!led[3];
end
end
endmodule

 2.1.2仿真文件

`timescale 1ns / 1ns

module led_four_tb();
reg clk;
reg reset;
wire [3:0]led;

led_four led_four(
    .clk(clk),
    .reset(reset),
    .led(led)
);

initial clk=1;
always #10 clk=~clk;

initial begin
reset=0;
#201;
reset=1;
#2000_000_000;
#2000_000_000;
$stop;
end
endmodule

2.1.3仿真波形及实验

仿真波形如图所示,实验现象与仿真波形一致。

2.2 用参数方法

2.2.1调用之前写的led灯闪烁模块,在本源函数中,例化4次调用之前的模块。

另一种方法是把要调用模块的.v文件先复制到本源文件工程中。

 这种方式不得勾选copy栏选项。

修改调用的源文件,设一个参数。 

module led_light(
    reset,
    clk,
    led
    );
    input reset;
    input clk;
    output reg led;
    reg [24:0]counter;
    parameter MCNT = 25_000_000-1;
    
    always@(posedge clk or negedge reset)
    if(!reset)
    counter<=1'b0;
    else if (counter == MCNT)
    counter<=1'b0;
    else
    counter<=counter+1'd1;
    
    always@(posedge clk or negedge reset)
    if(!reset)
    led<=1'b0;
    else if(counter == MCNT )
    led<=!led;
endmodule

2.2.2 源文件

分别例化这4个计数值,MCNT就好比结构体一样,MCNT1是参数。

module led_four2(
    clk,
    reset,
    led
);
input clk;
input reset;
output [3:0]led;
parameter MCNT1 = 25_000_000-1;
parameter MCNT2 = 125_000_00-1;
parameter MCNT3 = 625_000_0-1;
parameter MCNT4 = 25_000_00-1;

led_light
#(  .MCNT(MCNT1)
)
led_light_inst0(
    .reset(reset),
    .clk(clk),
    .led(led[3])
    );
    
led_light 
#(  .MCNT(MCNT2)
)
led_light_inst1(
    .reset(reset),
    .clk(clk),
    .led(led[2])
);

led_light led_light_inst2(
    .reset(reset),
    .clk(clk),
    .led(led[1])
);
defparam led_light_inst2.MCNT=MCNT3;

    
led_light led_light_inst3(
    .reset(reset),
    .clk(clk),
    .led(led[0])
);
defparam led_light_inst2.MCNT=MCNT4;
endmodule

2.2.3仿真文件

即将源文件中的参数嵌套一次,可以跟1节一样修改这个值,改变计数的时间。

`timescale 1ns / 1ns

module led_four_tb();
reg clk;
reg reset;
wire [3:0]led;

led_four2 led_four2(
    .clk(clk),
    .reset(reset),
    .led(led)
);
defparam led_four2.MCNT1=250_000_000-1;
defparam led_four2.MCNT2=125_000_00-1;
defparam led_four2.MCNT3=625_000_0-1;
defparam led_four2.MCNT4=25_000_00-1;

initial clk=1;
always #10 clk=~clk;
initial begin
reset=0;
#201;
reset=1;
#2000_000_000;
#2000_000_000;
$stop;
end
endmodule

仿真结果,这里最开始左边端口出现空白,以为是仿真文件的模块名写错,其实这个都没什么关系,模块名最好与文件名一致。就是忘加端口了,一直改模块名可能会让软件找不到路径,导致仿真一直卡住,从而无法进行仿真。

修改每个计数时间,进行仿真验证 ,计数时间已经被修改。

2.2.4 电路图的理解

调用最开始的底层模块,然后用例化4个,分别计数至各自的时间。

3阻塞与非阻塞语句 

时序逻辑电路一般使用<=非阻塞赋值方式,确保所有相关信号在同一时刻被一致地更新,防止出现由于顺序不同导致的竞争冒险问题。组合逻辑电路一般使用=阻塞赋值方式,输出立即响应输入变化。

阻塞语句画电路图时依次往后,在out之前的一般没有触发器,在out之后的一般就需要触发器。非阻塞语句我认为只要有=号就会有触发器。

 仿真图区别在于out2的第一级加法器没有经过一拍D触发器的存储,直接和当前的c进行了运算。

 把led闪烁的例程,分别把某句变为阻塞型,查看仿真例子。左边一直为低电平,右边也是,视频说的是高电平是一个仅20ns的脉冲,这里有点理解不了电路图。

 改前:

 改后:

 

右边改后:

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

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

相关文章

【pyspark学习从入门到精通7】DataFrames_2

目录 创建 DataFrames 生成我们自己的 JSON 数据 创建 DataFrame 创建临时表 简单的 DataFrame 查询 DataFrame API 查询 SQL 查询 创建 DataFrames 通常&#xff0c;您会通过使用 SparkSession&#xff08;或在 PySpark shell 中调用 spark&#xff09;导入数据来创建 …

SpinalHDL之错误集(一)

本文作为SpinalHDL学习笔记第七十六篇&#xff0c;作为错误集使用&#xff0c;类似高中生的错题集&#xff0c;记录使用SpinalHDL过程中遇到的问题&#xff0c;小到语法错误、版本兼容问题&#xff0c;大到SpinalHDL库函数错误等等&#xff0c;持续更新。 SpinalHDL学习笔记总…

记录 ruoyi-vue-plus在linux 部署遇到的问题

整理 linux 文件不要放在 /, 根目录下&#xff0c;要放在 home 文件夹下。docker 启动mysql 容器&#xff0c;映射的 my.cnf 文件不能设置太高权限&#xff0c;权限太高有安全问题&#xff0c;无法读取。 linux 使用注意事项 docker 文件夹 部署在home文件夹下 总结学习到的…

Asp.Net Core 发布 IIS、docker、Azure、文件夹、AAS、ASF、AWM等

发布 微软资料 微软资料 在 IIS 工作进程 (w3wp.exe) 内托管 ASP.NET Core 应用&#xff0c;称为进程内托管模型。 将 Web 请求转发到运行 Kestrel 服务器的后端 ASP.NET Core 应用&#xff0c;称为进程外托管模型。 发布到IIS 》》》Asp.net 之前 》》》 Asp.net Core …

JavaScript 网页设计案例:使用 Canvas 实现趣味打气球小游戏

JavaScript 网页设计案例&#xff1a;使用 Canvas 实现趣味打气球小游戏 在网页设计中&#xff0c;交互性和趣味性是吸引用户的重要因素。借助 JavaScript 和 HTML5 的 canvas 元素&#xff0c;我们可以轻松实现各种动画效果&#xff0c;今天将带你打造一个有趣的 打气球小游戏…

Vxe vue vxe-table 分享实现打印表格以及同时打印两张表

Vxe vue vxe-table 分享实现打印表格以及同时打印两张表 vxe-table 默认情况下支持单表打印。 在有些情况下&#xff0c;页面上同时有几张表&#xff0c;这时需要一次性打印出来。可以利用 Vxe 自带的分页打印功能&#xff0c;实现多张表同时打印。 效果 点击打印后自动调起预…

Redis --- 第四讲 --- 常用数据结构 --- set、zset

一、set类型的基本介绍 谈到一个术语&#xff0c;这个术语很可能有多种含义。Set一个含义是集合&#xff0c;一个含义是设置。 集合就是把一些有关联数据放到一起。 1、集合中的元素是无序的&#xff01; 2、集合中的元素是不能重复的。 和list类似&#xff0c;集合中的每…

数据治理为何如此简单?

欢迎来文末免费获取数据治理相关PPT和文档 引言 随着大数据技术的迅速发展&#xff0c;企业积累的数据量呈现爆炸式增长。有效的数据管理已经成为企业提高决策效率、增强竞争优势的重要手段。在这样的背景下&#xff0c;数据治理逐渐成为企业数据管理中不可或缺的一环。它不仅…

15分钟学Go 第1天:Go语言简介与特点

Go语言简介与特点 1. Go语言概述 Go语言&#xff08;又称Golang&#xff09;是由谷歌于2007年开发并在2009年正式发布的一种开源编程语言。它旨在简单、高效地进行软件开发&#xff0c;尤其适合于网络编程和分布式系统。 1.1 发展背景 多核处理器&#xff1a;随着计算机硬件…

MFC扩展库BCGControlBar Pro v35.1新版亮点:改进网格控件性能

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.1已全新发布了&#xff0c;这个版本改进网格控件的性能、增强工具栏编辑器功能等。 …

hadoop集群搭建-克隆虚拟机,安装jdk,hadoop

2.2 hadoop运行环境的搭建 2.2.1 环境准备 1&#xff09;安装模板虚拟机&#xff0c;IP地址 192.168.10.100&#xff0c;主机名hadoop100&#xff0c;内存41GB&#xff0c;硬盘50GB 2&#xff09;虚拟机配置 首先测试虚拟机是否可以正常上网&#xff0c;测试方法ping www.b…

HarmonyOS Next模拟器异常问题及解决方法

1、问题1&#xff1a;Failed to get the device apiVersion. 解决方法&#xff1a;关闭模拟器清除用户数据重启

centos7.9调整磁盘分区大小

在安装centos7.9时我们一般采用默认分区设置&#xff0c;使用LVM来管理磁盘空间&#xff0c;根分区只有50GB&#xff0c;其余的所有可用空间都分配在/home分区下。可是centos7中大多数的应用软件都是安装在根分区的&#xff0c;在使用过程中经常会出现明明系统还有很大的磁盘空…

CSS 选择器简单回顾

引言 当我们探讨网页设计和开发时, CSS(层叠样式表) 无疑是一个不可或缺的技术, 它使我们能够精确控制网页的外观和布局, 为用户创造出独特的视觉体验、以及良好的交互体验!! 而一个完整的 CSS 规则则是由两个主要部分组成: 选择器和声明块 那么今天我们就来盘点下常见的几种选…

jmeter使用csv数据

背景 使用jmeter对系统进行压测。测试数据存储在了csv中&#xff0c;多线程压测的时候&#xff0c;csv中的一条数据不能多个线程同时使用&#xff0c;数据全部使用过后&#xff0c;需要终止压测。 功能点 从csv读取数据后&#xff0c;完成接口数据拼接。多线程依次从csv文件…

蓝牙HCI的log分析方法

一 前言: Bluetooth HCI log 的最主要功能是用于分析蓝牙设备之间的交互行为是否符合预期,以及是否符合 蓝牙规范之规定。 基本上,在手机应用平台上,除了蓝牙功能无法打开以及蓝牙引起的 system crash 问题之外,蓝牙相 关的问题,均可以通过分析 HCI log 来定位问题。 具…

MacOS Sublime Text 解决中乱码

1. 安装Package Control 官方安装指南 手动安装 通过以此点击菜单 Sublime Text > Preferences > Browse Packages 打开Packages目录找到Packages的同级目录Installed Packages下载PackageControl.sublime-package并保存到Installed Packages中在菜单 Sublime Text &g…

[含文档+PPT+源码等]精品基于springboot实现的原生微信小程序小型电子拍卖系统

基于Spring Boot实现的原生微信小程序小型电子拍卖系统的背景&#xff0c;可以从以下几个方面进行详细阐述&#xff1a; 一、技术背景 Spring Boot框架&#xff1a; Spring Boot是一个开源的Java应用框架&#xff0c;它基于Spring框架&#xff0c;旨在简化Spring应用的开发、配…

SpringBoot基于微信小程序的上门幼儿照护服务系统(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

前端将表格页面导出为 PDF 并适配 A4纸张的思路

文章目录 最终效果技术依赖包优缺点实现思路代码 最终效果 这个是原页面 这个是前端处理成 pdf 的效果 技术依赖包 vue2 element html2canvas jsPDF html2Canvas 官网 jsPDF 官网 优缺点 优点&#xff1a;就是不需要后端处理 pdf 了&#xff0c;原本想着把 dom 和 cs…