模型功能

  • 实现寄存器之间的连线
  • 实现寄存器的声明
  • 建构时钟的时序系统

模型框图

`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

*/

实现步骤

  1. 声明寄存器
  • 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逻辑中体现,本章不展开
  1. wire线的连接
  • 从硬件上理解,wire就是各个器件之间的走线
  • 从高级语言的角度理解,wire就是等式的右边部分的缩写
  • 也就是说,wire并不是C语言中的变量,而是等式的右边,用于描述某些中间过程
  1. 二维reg变量的使用
  • 如模型描述中的r_fifo,可以允许输入地址去访问类数组结构
  • 该二维reg变量实际上依靠DRAM实现,地址由查找表实现,受限于查找表的大小一般为64bit,所以二维变量地址不能太大
  • 一般器件将地址深度控制在256以内,这个和器件底层LUT级联单元有关(当然也和时序有关,时序要求越低,支持数目越多)
  • 需要注意的是,严禁使用三维reg变量
    • 三维reg变量是指地址受到两个reg变量的访问
    • 从其映射关系可以知道,三维reg变量形成的是两个reg变量位宽相乘的查找表数量
    • 除非两个变量的位宽都很小,且时序要求很低,否则极有可能出现计算异常(本人已经多次验证过,仿真没有问题,但是实际运行异常)
    • 而且,可以通过简单地提前一个周期计算地址的方法完成维度的降低,完全没有必要使用这种延时大、条件严格的结构
  1. 二维阵列的使用
  • 如模型描述的w_array,可以允许输入地址去访问数据的特定位宽
  • 是的,和二维变量的区别是,w_array是走线集合,而不是硬件结构
  • wire [8-1:0] x [0:2-1] 和 wire [8*2-1:0]属于一个性质,只不过对应关系有所差异
  • 一般二维阵列就是配合二维变量,在级联结果中形成同步的信号缓存
  1. 级联一维变量的使用
  • 并不是所有类似r_fifo的变量都是二维reg变量
  • 这个取决于该变量的地址控制方式
  • 当使用常数控制地址访问时,其更多是作为级联变量使用
  • 但是从使用效果来说,和二维变量无区别,所以可以全部用fifo进行标记
  • 在本集合的第三篇时就使用过级联变量,本质上也是一种缩写,而非特殊的硬件结构
  1. 寄存器之间的传递
  • 理论上,可以使用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型变量的组合使用的更多相关文章

  1. [笔记][FPGA]如何使用SignalTap观察wire与reg值

    0. 简介 在FPGA程序调试时,我们除了仿真还经常的会用到SignalTap进行板级调试,其可以真实有效的反应某些变量的变化,方便我们理解内在跳转,方便Debug的运行.SignalTap需要制定时 ...

  2. wire与reg的区别?转载大神!

    本文转自:http://www.cnblogs.com/thymon/archive/2010/06/09/1754541.html //------------------------------- ...

  3. verilog中wire与reg类型的区别

    每次写verilog代码时都会考虑把一个变量是设置为wire类型还是reg类型,因此把网上找到的一些关于这方面的资料整理了一下,方便以后查找. wire表示直通,即只要输入有变化,输出马上无条件地反映 ...

  4. fpga中wire和reg的区别

    wire表示直通,即只要输入有变化,输出马上无条件地反映:reg表示一定要有触发,输出才会反映输入.wire表示直通,即只要输入有变化,输出马上无条件地反映:reg表示一定要有触发,输出才会反映输入. ...

  5. 数字逻辑实践5->Verilog语法 | wire 与 reg 的选择与特性

    问题起因:最初学习数字逻辑设计理论的时候还没有注意到,在实验课上写代码的时候发现了一个问题: 对于源码模块的变量定义,何时定义为reg.何时定义为wire?它们各自又有什么特性和物理意义? 1. wi ...

  6. bool型变量下标的时候javascript是不能允许的

    jother编码是我最开始想写的内容,原因有两点:1.原理比较简单,不需要太多关于算法的知识.2.比较有趣,是在对javascript有了很深的理解之后催生的产物.如果你只需要知道jother编码和解 ...

  7. seaborn 数据可视化(一)连续型变量可视化

    一.综述 Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,图像也更加美观,本文基于seaborn官方API还有自己的一些理解.   1.1.样式控制: ...

  8. (转)C语言16进制输出字符型变量问题

    最近在做一个C的嵌入式项目,发现在C语言中用printf()函数打印字符型变量时,如果想采用"%x"的格式将字符型变量值以十六进制形式打印出来,会出现一个小问题,如下: char  ...

  9. Path形状获取字符串型变量数据

    Path形状获取字符串型变量数据: var path = new Path(); path.Data = Geometry.Parse("M 100,200 C 100,25 400,350 ...

  10. 连续型变量的推断性分析——t检验

    连续型变量的推断性分析方法主要有t检验和方差分析两种,这两种方法可以解决一些实际的分析问题,下面我们分别来介绍一下这两种方法 一.t检验(Student's t test) t检验也称student ...

随机推荐

  1. Java并发编程之美

    简介 <Java并发编程之美>分为三部分,第一部分为Java 并发编程基础篇,主要讲解Java 并发编程的基础知识.线程有关的知识和并发编程中的其他相关概念,这些知识在高级篇都会有所使用, ...

  2. 【Unity3D】缩放、平移、旋转场景

    1 前言 ​ 场景缩放.平移.旋转有两种实现方案,一种是对场景中所有物体进行同步变换,另一种方案是对相机的位置和姿态进行变换. ​ 对于方案一,如果所有物体都在同一个根对象下(其子对象或孙子对象),那 ...

  3. ELK Stack 分布式日志系统 大纲

    1. Elastic Stack 官网: https://www.elastic.co/cn/what-is/elk-stack 2. 硬件配置 2.1 推算依据 ES JVM heap 最大可以设置 ...

  4. Java I/O 教程(九) FileWriter和FileReader

    FileWriter Java FileWriter 用于往文件中写入字符数据. 不像FileOutputStream类,你无需转换字符串成字节数组,因为它提供了直接写字符串的方法. 类定义 publ ...

  5. Ansible的基本配置

    目录 定义主机和组 主机的定义 主机组的定于 主机组的嵌套 选择主机和组 匹配主机 使用通配符匹配 配置文件优先级 配置文件详解 配置文件段 配置文件参数说明 配置案例 1. 在节点上创建一个普通用户 ...

  6. 【WiFi开发全攻略】WIFI基础知识大全

    [WiFi开发全攻略]WIFI基础知识大全 1. Wi-Fi起源 现在我们大家对Wi-Fi肯定都不陌生,无论是笔记本,手机,智能电视,都离不开Wi-Fi.目前我们一般用的都是Wi-Fi5,Wi-Fi6 ...

  7. 【LeetCode排序专题01】由旋转数组的最小数字引出的关于排序算法的讨论(冒泡排序、二分查找+暴力法)

    旋转数组的最小数字 剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一 ...

  8. 狂神说Git学习笔记整理

    Git 版本控制 ​ 在开发过程中,项目会进行版本迭代,新版本会取代旧版本,但是我们不希望直接删除旧版本,所以就需要一个版本管理器来管理新旧版本,不然就是手动控制... 多人开发必须使用版本控制!!! ...

  9. 【Azure 应用服务】使用App Service for Linux/Container时,如果代码或Container启动耗时大于了230秒,默认会启动失败。

    问题描述 使用App Service for Linux/Container时,从Docker的日志中,我们可以看见有 warmup 行为,而此行为默认时间为230秒,如果超出了这个时间,就会导致Co ...

  10. C#实现软件开机自启动(不需要管理员权限)

    目录 原理简介 使用方法 完整代码 原理简介 本文参考C#/WPF/WinForm/程序实现软件开机自动启动的两种常用方法,将里面中的第一种方法做了封装成AutoStart类,使用时直接两三行代码就可 ...