模型功能

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

模型框图

`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. OGP协议的使用

    OGP协议是一套Metatags的规格,用来标注页面,告诉我们你的网页快照.帮助社交app高效并准确的获取网页中的核心链接.标题.主图.正文摘要等信息,使得该网页在社交分享中有更好的展现体验. 如果网 ...

  2. Java并发编程实例--8.在线程中处理未检查异常

    java中有两类异常: 已检查异常:这类异常编译器要求开发者必须在代码中通过throws去处理. 例如:IOException和ClassNotFoundException. 未检查异常:不必显式的在 ...

  3. 我又踩坑了!如何为HttpClient请求设置Content-Type?

    1. 坑位 最近在重构认证代码,认证过程相当常规: POST /open-api/v1/user-info?client_id&timstamp&rd=12345&sign=* ...

  4. Miniconda安装和使用

    Miniconda概述 Miniconda是什么? 要解释Miniconda是什么,先要弄清楚什么是Anaconda,它们之间的关系是什么? 而要知道Anaconda是什么,最先要明白的是搞清楚什么是 ...

  5. CentOS 8安装RabbitMQ

    第一步:安装yum仓库 导入签名KEY: ## primary RabbitMQ signing key ## 这一步如果因为网络问题下载不成功,可以先将签名文件下载下来,本地导入 rpm --imp ...

  6. django学习第二天---django视图系统,基于类的视图写法,FBV和CBV加装饰器

    django视图系统 request对象 常用属性和方法 print(request) #wsgirequest对象 print(request.path) #请求路径 /index/ print(r ...

  7. 【LeetCode排序专题02】最小k个数,关于快速排序的讨论

    最小k个数 https://leetcode.cn/problems/smallest-k-lcci/ 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个 ...

  8. 如何在矩池云复现开源对话语言模型 ChatGLM

    ChatGLM-6B 是一个开源的.支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数.结合模型量化技术,用户可以在消费级的显卡上进行 ...

  9. 【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题

    问题描述 启用App Service Local Git 部署,在Clone 代码库到本地时候,卡在Clone 'xxxxxx' ... ... 一动不动的问题? 问题解答 因为Git Clone没有 ...

  10. 【Azure 媒体服务】记录一个简单的媒体视频上传到Media Service无法播放问题

    问题描述 从本地上传到Azure Media Service Portal的视频,并且新增定位符后,无法播放.但是上传的其他视频是可以的.疑惑中!! 问题自查 自查发现,是视频的文件名中有个特殊符号. ...