wire和reg型变量的组合使用
模型功能
- 实现寄存器之间的连线
- 实现寄存器的声明
- 建构时钟的时序系统
模型框图
`timescale 1ns / 1ps
/*
*/
// *******************************************************************************
// Company: Fpga Publish
// Engineer: FP
//
// Create Date: 2024/03/24 12:39:43
// Design Name:
// Module Name: verilog_demo
// Project Name:
// Target Devices: ZYNQ7010 | XCZU2CG | Kintex7
// Tool Versions: 2021.1 || 2022.2
// Description:
// *
// Dependencies:
// *
// Revision: 0.01
// Revision 0.01 - File Created
// Additional Comments:
//
// *******************************************************************************
module verilog_demo #(
//mode
parameter MD_SIM_ABLE = 0,
//number
parameter NB_DELAY_CLK = 100,
//width
parameter WD_ERR_INFO = 4
)(
//! system signals
input i_sys_clk ,
input i_sys_resetn,
//! @virtualbus uart_interface @dir out
output m_uart_0_mtx, //! uart master tx
input m_uart_0_mrx, //! uart master rx
//! @end
//! error info feedback
output [WD_ERR_INFO-1:0] m_err_verilog_info1
);
//========================================================
//function to math and logic
//========================================================
//localparam to converation and calculate
//========================================================
//register and wire to time sequence and combine
// ----------------------------------------------------------
// demo variable
reg [1:0] r_dat0 = 0;
reg signed [1:0] r_dat1 = 0;
wire [1:0] w_dat2;
reg [1:0] r_fifo [0:1]
wire [1:0] w_array [0:1];
//========================================================
//always and assign to drive logic and connect
//========================================================
//module and task to build part of system
//========================================================
//expand and plug-in part with version
//========================================================
//ila and vio to debug and monitor
endmodule
/* end verilog
*/
实现步骤
- 声明寄存器
- reg类型变量实际上是对FF(除法器)的快速声明方法
- 使用FDCE的原语可以实现寄存器的准确描述,但是比较少用
FDCE #(
.INIT(1'b0), // Initial value of register, 1'b0, 1'b1
// Programmable Inversion Attributes: Specifies the use of the built-in programmable inversion
.IS_CLR_INVERTED(1'b0), // Optional inversion for CLR
.IS_C_INVERTED(1'b0), // Optional inversion for C
.IS_D_INVERTED(1'b0) // Optional inversion for D
)
FDCE_inst (
.Q(Q), // 1-bit output: Data
.C(C), // 1-bit input: Clock
.CE(CE), // 1-bit input: Clock enable
.CLR(CLR), // 1-bit input: Asynchronous clear
.D(D) // 1-bit input: Data
);
- 其中位宽的作用是声明多个FDCE组合成寄存器组,实现多bit数据的处理
- 默认值的就是快速输入原语中的INIT值
- 原语中的其他描述则会在always逻辑中体现,本章不展开
- wire线的连接
- 从硬件上理解,wire就是各个器件之间的走线
- 从高级语言的角度理解,wire就是等式的右边部分的缩写
- 也就是说,wire并不是C语言中的变量,而是等式的右边,用于描述某些中间过程
- 二维reg变量的使用
- 如模型描述中的r_fifo,可以允许输入地址去访问类数组结构
- 该二维reg变量实际上依靠DRAM实现,地址由查找表实现,受限于查找表的大小一般为64bit,所以二维变量地址不能太大
- 一般器件将地址深度控制在256以内,这个和器件底层LUT级联单元有关(当然也和时序有关,时序要求越低,支持数目越多)
- 需要注意的是,严禁使用三维reg变量
- 三维reg变量是指地址受到两个reg变量的访问
- 从其映射关系可以知道,三维reg变量形成的是两个reg变量位宽相乘的查找表数量
- 除非两个变量的位宽都很小,且时序要求很低,否则极有可能出现计算异常(本人已经多次验证过,仿真没有问题,但是实际运行异常)
- 而且,可以通过简单地提前一个周期计算地址的方法完成维度的降低,完全没有必要使用这种延时大、条件严格的结构
- 二维阵列的使用
- 如模型描述的w_array,可以允许输入地址去访问数据的特定位宽
- 是的,和二维变量的区别是,w_array是走线集合,而不是硬件结构
- wire [8-1:0] x [0:2-1] 和 wire [8*2-1:0]属于一个性质,只不过对应关系有所差异
- 一般二维阵列就是配合二维变量,在级联结果中形成同步的信号缓存
- 级联一维变量的使用
- 并不是所有类似r_fifo的变量都是二维reg变量
- 这个取决于该变量的地址控制方式
- 当使用常数控制地址访问时,其更多是作为级联变量使用
- 但是从使用效果来说,和二维变量无区别,所以可以全部用fifo进行标记
- 在本集合的第三篇时就使用过级联变量,本质上也是一种缩写,而非特殊的硬件结构
- 寄存器之间的传递
- 理论上,可以使用reg完成所有的寄存器的描述
- 但是为了灵活,还是需要用wire缓存一些中间结果,以免出现大量的重复代码
- 也就是存在下列传递关系:
- reg --> wire (assign)
- wire --> reg (always)
- wire --> wire (assign)
- reg --> reg (always)
- 端口列表在传递时均为wire,可以直接连接,通过input和output进行方向区分
最终效果

module adder_cascade#(
parameter NB_CASCADE = 4,
parameter WD_DAT = 4
)(
input i_clk,
input [WD_DAT-1:0] a,
output [WD_DAT-1:0] s,
output [WD_DAT*NB_CASCADE-1:0] o_dat
);
wire [WD_DAT-1:0] a_array [0:NB_CASCADE]; //add 1 bit for input
reg [WD_DAT-1:0] r_fifo [0:NB_CASCADE-1]; //add 1 bit for input
assign a_array[0] = a;
assign s = a_array[NB_CASCADE];
generate genvar i;
for(i = 0; i < NB_CASCADE; i = i + 1)
begin: FOR_NB_CASCADE
adder #(
.WD_DAT(WD_DAT)
)u_adder(
.a(a_array[i]),
.s(a_array[i+1])
);
always@(posedge i_clk)
begin
r_fifo[i] <= a_array[i];
end
assign o_dat[WD_DAT*(i+1)-1:WD_DAT*i] = r_fifo[i];
end
endgenerate
endmodule
调用接口
- 非封装模型,无调用接口
wire和reg型变量的组合使用的更多相关文章
- [笔记][FPGA]如何使用SignalTap观察wire与reg值
0. 简介 在FPGA程序调试时,我们除了仿真还经常的会用到SignalTap进行板级调试,其可以真实有效的反应某些变量的变化,方便我们理解内在跳转,方便Debug的运行.SignalTap需要制定时 ...
- wire与reg的区别?转载大神!
本文转自:http://www.cnblogs.com/thymon/archive/2010/06/09/1754541.html //------------------------------- ...
- verilog中wire与reg类型的区别
每次写verilog代码时都会考虑把一个变量是设置为wire类型还是reg类型,因此把网上找到的一些关于这方面的资料整理了一下,方便以后查找. wire表示直通,即只要输入有变化,输出马上无条件地反映 ...
- fpga中wire和reg的区别
wire表示直通,即只要输入有变化,输出马上无条件地反映:reg表示一定要有触发,输出才会反映输入.wire表示直通,即只要输入有变化,输出马上无条件地反映:reg表示一定要有触发,输出才会反映输入. ...
- 数字逻辑实践5->Verilog语法 | wire 与 reg 的选择与特性
问题起因:最初学习数字逻辑设计理论的时候还没有注意到,在实验课上写代码的时候发现了一个问题: 对于源码模块的变量定义,何时定义为reg.何时定义为wire?它们各自又有什么特性和物理意义? 1. wi ...
- bool型变量下标的时候javascript是不能允许的
jother编码是我最开始想写的内容,原因有两点:1.原理比较简单,不需要太多关于算法的知识.2.比较有趣,是在对javascript有了很深的理解之后催生的产物.如果你只需要知道jother编码和解 ...
- seaborn 数据可视化(一)连续型变量可视化
一.综述 Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,图像也更加美观,本文基于seaborn官方API还有自己的一些理解. 1.1.样式控制: ...
- (转)C语言16进制输出字符型变量问题
最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char ...
- Path形状获取字符串型变量数据
Path形状获取字符串型变量数据: var path = new Path(); path.Data = Geometry.Parse("M 100,200 C 100,25 400,350 ...
- 连续型变量的推断性分析——t检验
连续型变量的推断性分析方法主要有t检验和方差分析两种,这两种方法可以解决一些实际的分析问题,下面我们分别来介绍一下这两种方法 一.t检验(Student's t test) t检验也称student ...
随机推荐
- Js将字符串转数字的方式
Js将字符串转数字的方式 Js字符串转换数字方方式主要有三类:转换函数.强制类型转换.弱类型隐式类型转换,利用这三类转换的方式可以有5种转换的方法. parseInt() parseInt()和Num ...
- col命令
col命令 在很多UNIX说明文件里,都有RLF控制字符,当我们把说明文件的内容输出成纯文本文件时,控制字符会变成乱码,col命令则能有效滤除这些控制字符. 语法 col [options] 参数 - ...
- std::string std::wstring char w_char 内部中文编码
最近在处理一个字符串转码问题,故记录一下过程 该需求是外部 sdk 的一个 api 需要一个 char* 字符串路径入参,我以往是将宽字符串转为 UTF8 后再传给 sdk 这次这个 api 似乎不接 ...
- LayUI样式优化
如下是LayUI框架中页面元素的CSS优化样式: /* 表单输入框宽度 */ .layui-form-item .layui-input-inline { width: 295px; } /* 下拉框 ...
- 文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具
前言 在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死(实际上Qt还是在跑,只是磁盘消耗超过瓶颈,造成假死(注意:控制台还能看到打印输出 ...
- 项目实战:C#上位机+arduino下位机+控制点亮LED灯
前言 当前比较流行的arduino开发,联动做一个Demo. 应用构架 上位机:C#上位机通过串口发送接收控制协议,来控制下位机: 下位机:arduino下位机主控,接受上位机串口协议控 ...
- 用virtualenv创建虚拟环境
步骤 1.打开终端cmd,直接输入命令pip install virtualenv,前提已经将pip加入到环境变量中了 2.在e盘创建一个专门用来装虚拟环境的文件夹,如django_web_env 3 ...
- 数据抽取平台pydatax介绍--实现和项目使用
数据抽取平台pydatax实现过程中,有2个关键点: 1.是否能在python3中调用执行datax任务,自己测试了一下可以,代码如下: 这个str1就是配置的shell文件 try: resu ...
- 矩池云 | GPU 分布式使用教程之 Pytorch
GPU 分布式使用教程之 Pytorch Pytorch 官方推荐使用 DistributedDataParallel(DDP) 模块来实现单机多卡和多机多卡分布式计算.DDP 模块涉及了一些新概念, ...
- 【Openxml】如何为OpenXml元素创建超链接
已知在OpenXml有以下几种超链接 功能 说明 跳转页面 跳转某一页:ppaction://hlinksldjump跳转第一页:ppaction://hlinkshowjump?jump=first ...