精华内容
下载资源
问答
  • 当我们使用Verilog时,对于信号定义为reg型还是wire型比较混乱,那么今天我们就来讲一讲如何快速的进行信号定义。 在Verilog中,wire永远是wire,就是相当于一条连线,用来连接电路,不能存储数据,无驱动能力,是...

    当我们使用Verilog时,对于信号定义为reg型还是wire型比较混乱,那么今天我们就来讲一讲如何快速的进行信号定义。

    在Verilog中,wire永远是wire,就是相当于一条连线,用来连接电路,不能存储数据,无驱动能力,是组合逻辑;并且只能在assign左侧赋值,不能在always @ 中赋值。

    reg可以综合成register,latch,甚至是wire(当其只是中间变量的时候),能存储数据,有驱动能力,可以用于组合逻辑或者时序逻辑;在always @模块表达式左侧被赋值。

    掌握了基本原理,并不代表我们可以快速的判断信号类型。我们在实际设计中,并不需要考虑这么多,对于信号类型的定义,明德扬有一个小技巧,按照这个技巧使用,就不会出错。即“用always实现的是reg型,其它都是wire型”。

    我们举几个例子来使用一下此技巧。

    我们举几个例子来使用一下此技巧。

    案例一:
    下面代码可以看出是由always模块引导的,因此属于reg类型:
    在这里插入图片描述
    案例二:
    下面代码不是由always模块引导的,因此属于wire类型:
    在这里插入图片描述
    案例三:
    下面代码是由always模块引导的,因此属于reg类型:
    在这里插入图片描述
    案例四:
    下面代码是由assign模块引导的,不是由always模块引导的,因此属于wire类型:
    在这里插入图片描述
    案例五:
    在测试文件中,凡是initial模块引导的信号都是reg类型,因此下面代码属于reg类型:
    在这里插入图片描述掌握了信号类型的原理,就非常好判断信号的类型了。大家试着多看一些案例设计进行验证,就会发现明德扬的小技巧非常好用。因此希望大家可以牢记,定义信号类型时,用always实现的是reg型,其它都是wire型。如果可以完全掌握并多加应用,今后的工程师道路会节省不少的脑细胞。

    reg、wire怎么确定?明德扬总结了以下的3句话,大家记好啦:

    1、功能文件:由本模块产生,并且用always产生的信号,就定义成reg
    2、测试文件:由初始化initial产生(一般是对测模块的输入)的信号,就定义成reg
    3、除了以上两种情况,就定义成wire型

    转载:在设计文件中,如何确定信号是reg型还是wire型?

    展开全文
  • wire型,意为连线型,一般用于组合逻辑(CL)之中。verilog HDL模块中的输入输出信号类型... wire型和reg型在verilog HDL语法中的区别在于,wire型数据通常用assign语句赋值,reg型数据必须被放在过程语句中(如initia

     

    wire型,意为连线型,一般用于组合逻辑(CL)之中。verilog HDL模块中的输入输出信号类型默认时自动定义为wire型。

    reg型,意为寄存器型,既可以用组合逻辑实现,亦可用于时序逻辑中,即用触发器(filp-flop)实现。

    wire型和reg型在verilog HDL语法中的区别在于,wire型数据通常用assign语句赋值,reg型数据必须被放在过程语句中(如initial、always)中,通过过程赋值语句赋值。

    同样一个组合电路,不光可以用wire型数据来写,实际上也可以用reg型数据写:

    未标题-1

    (1) wire写法

    wire cl_a;

    assign cl_a = a ?A : B;

    (2) reg写法

    reg cl_a;

    always@(a or A or B)

    begin

    if(a)

    cl_a = A;

    else

    cl_a = B;

    end

    (3)reg写法2

    reg cl_a;

    always@(a or A or B)

    begin

    cl_a = a? A : B;

    end

    需要注意的是,reg型在用于组合逻辑时,always(parameter)中的参数为组合逻辑的参数;reg型参数在always中赋值采用阻塞赋值。

    下面举出reg型数据使用触发器实现的例子:

    reg f_a;

    always@(posedge clk)

    begin

    f_a <= a ? A : B;

    end

    对应该电路实现为:

    未标题-2

    reg型在用触发器实现时,always(parameter) 中的参数通常为时钟边沿,这是由触发器的性质决定的,reg型参数在always中复制采用非阻塞赋值。

    展开全文
  • 当我们使用Verilog时,对于信号定义为reg型还是wire型比较混乱,那么今天我们就来讲一讲如何快速的进行信号定义。 在Verilog中,wire永远是wire,就是相当于一条连线,用来连接电路,不能存储数据,无驱动能力,是...

    当我们使用Verilog时,对于信号定义为reg型还是wire型比较混乱,那么今天我们就来讲一讲如何快速的进行信号定义。

    在Verilog中,wire永远是wire,就是相当于一条连线,用来连接电路,不能存储数据,无驱动能力,是组合逻辑;并且只能在assign左侧赋值,不能在always @ 中赋值。

    reg可以综合成register,latch,甚至是wire(当其只是中间变量的时候),能存储数据,有驱动能力,可以用于组合逻辑或者时序逻辑;在always @模块表达式左侧被赋值。

    掌握了基本原理,并不代表我们可以快速的判断信号类型。我们在实际设计中,并不需要考虑这么多,对于信号类型的定义,明德扬有一个小技巧,按照这个技巧使用,就不会出错。即“用always实现的是reg型,其它都是wire型”。

    我们举几个例子来使用一下此技巧。

    案例一:
    下面代码可以看出是由always模块引导的,因此属于reg类型:
    在这里插入图片描述

    案例二:
    下面代码不是由always模块引导的,因此属于wire类型:
    在这里插入图片描述

    案例三:
    下面代码是由always模块引导的,因此属于reg类型:
    在这里插入图片描述

    案例四:
    下面代码是由assign模块引导的,不是由always模块引导的,因此属于wire类型:
    在这里插入图片描述

    案例五:
    在测试文件中,凡是initial模块引导的信号都是reg类型,因此下面代码属于reg类型:
    在这里插入图片描述

    掌握了信号类型的原理,就非常好判断信号的类型了。大家试着多看一些案例设计进行验证,就会发现明德扬的小技巧非常好用。因此希望大家可以牢记,定义信号类型时,用always实现的是reg型,其它都是wire型。如果可以完全掌握并多加应用,今后的工程师道路会节省不少的脑细胞。更多FPGA技巧敬请关注明德扬,有疑问的同学也可以留言给我们互相讨论!

    reg、wire怎么确定?明德扬总结了以下的3句话,大家记好啦:

    1、功能文件:由本模块产生,并且用always产生的信号,就定义成reg
    2、测试文件:由初始化产生(一般是对测模块的输入)的信号,就定义成reg
    3、除了以上两种情况,就定义成wire型

    展开全文
  • 因为inout类型既是input有事output类型,所以必须同时遵守输入输出的描述规定。...连续赋值语句用于对wire型变量进行赋值,它由关键字assign开始,后面跟着由操作数和运算符组成的逻辑表达式。 ...

    inout类型的作用

    inout 类型常出现于芯片外部引脚,为的是减少管腿个数,一个端口同时做输入和输出。

    如32位半导体随机读写寄存器RAM,若分别使用input output,则仅数据管脚就有64位,且同一时间最多只有32位管脚处于有效状态。而使用inout类型,则缩减了32位数据管脚,使模块对外看起来更简洁。

    inout类型的用法

    那么,如何判断这个数据段代表输入还是输出呢?一般我们还需要另一个读写控制信号we,根据这个决定inout类型的数据段按读还是写解析。

    因为inout类型既是input又是output类型,所以必须同时遵守输入输出的描述规定。这个规定也很好理解。因为硬件描述语言的=不是C语言的“覆盖”,而是用一根线将电路中的两个点链接起来。如果这个=表示的电线链接了两个寄存器类型,那么当其中一个reg改变时,另一个无法改变,则会产生冲突。所以用语法规定,盛装某电路模块输出信息的必须是wire类型。

    那么,在向inout类型传入数据时(tb模块),必须遵守output的规定,使用线网型。(inout接口的另一端必须是wire)

    //举个例子

    //建模部分(模块描述)

    module ModuleName(

        input we;//读写控制信号 : 高电平代表写,低电平代表读

        inout [31:0] inoutData;

    );

    //调用部分(实例化)

    module ModeuleName_tb();  //为了看起来更简洁,省略begin end等

        wire [31:0] inoutData;//传入inout接口的必须是wire型

        reg we;//高电平代表写,低电平代表读

        ModuleName ThisModuleName (.we(we), .inoutData(inoutData));

    在we读写控制信号代表读,inout作为输出端口时,这样表述没有问题。但是,当we读写控制信号代表写,inout作为输入端口时,你大概率会碰到一个问题:

    如何向inoutData中写入数据,使我能将我想要被调用的模块读到的数据传入呢

    在调用模块里,inoutData是wire型,不能用行为级描述直接赋值。但是,你可能会想到,数据流描述方式

    数据流描述方式:连续使用赋值语句(assign)对电路的逻辑功能进行描述。

    连续赋值语句用于对wire型变量进行赋值,它由关键字assign开始,后面跟着由操作数和运算符组成的逻辑表达式。

    连续赋值语句对inout类型数据赋值

    在讨论这个问题之前,我们先讨论一下 线网(wire)数据类型的特征:

    首先,线网类型相当于导线。这与C++语言中的变量(与Verilog中的reg寄存器类似)不同。线网没有存储功能,连接端改变,线网上的值立即改变。如上面的例子中是实例化语句,就相当于把inoutData导线接到了ModelName模块的接口上。

    这样看似乎与寄存器类型没什么不同。但是,如果你想改变这个线网型变量呢?(如we=1写有效时赋值)直接赋值是不可以的,因为会

    这就是硬件描述语言线网型的特点,它的值不能多次赋值覆盖改变,而是会产生冲突。

    其次,与C++程序语言不同,硬件描述语言是要对应到门级电路上的。在C++程序中,可能有没有执行到的程序分支;但在Verilog语言中,每一句语言都会对应到电路被刻制在板子上。这就意味着,不管输入是什么样的,硬件描述语言的每一处都是确定的。 所以不存在,如果满足某个条件,电路如何连,否则采用另一种连法的情况,在实际中无法实现。(即不可能实现,读有效时连模块,写有效时连赋值寄存器)

    正确用法的具体实现

    inout 在具体实现上一般用三态门来实现。

    既然硬件描述语言线网型的值不能多次赋值覆盖改变,还会产生冲突,那如何改变它的值呢?正确做法是将它与之前的连接“断开”,就不会产生冲突了。

    assign inoutData = we ? Data_reg : 32'bz;

    首先,在连续赋值语句中不能用if,只能用 ?:操作符

    其次,设置一个寄存器类型的映像数据Data_reg,储存要给inoutData赋值的数据

    最后,高阻抗z代表断开连接。

    这样,inout类型的处理就完成了。测试模块中,在写有效时为它赋值映像数据域Data_reg数据,读有效时断开。在建模模块中则读有效时连接要输出的数据,写有效时断开。

    如果这篇文章对您有帮助,请点个赞支持一下吧~码字不易,多谢鼓励

    展开全文
  • Verilog HDL 初级入门知识简单讲解(wire 和 reg 类型的区别, always 和 assign 的区别,“阻塞”赋值 和 “非阻塞赋值”的区别 ) 很多刚学Verilog HDL (硬件描述语言)的朋友肯定会对阻塞赋值和非阻塞赋值比较...
  • verilogHDL 赋值

    2018-06-21 09:29:22
    持续赋值语句assign:wire型变量过程赋值always:reg型变量,又分为阻塞赋值和非阻塞赋值
  • 连续赋值和过程赋值

    千次阅读 2019-09-08 17:50:08
    2)左侧被赋值的数据类型必须是线网数据(wire); 3)连续赋值语句不能出现在过程快中(initial/always); 4)连续赋值语句主要用来对组合逻辑进行建模以及线网数据间进行描述; 5)连续赋值语句产生作用后,...
  • 2)左侧被赋值的数据类型必须是线网数据(wire);3)连续赋值语句不能出现在过程快中(initial/always);4)连续赋值语句主要用来对组合逻辑进行建模以及线网数据间进行描述;5)连续赋值语句产生作用后,赋值...
  •  很多刚学Verilog HDL (硬件描述语言)的朋友肯定会对阻塞赋值和非阻塞赋值比较疑惑,那我们就一起来抛开这层迷雾吧。  首先我们要理解两种变量类型 Net Type(连线)和 Register Type (寄存器)。(有些...
  • 2)左侧被赋值的数据类型必须是线网数据(wire); 3)连续赋值语句不能出现在过程快中(initial/always); 4)连续赋值语句主要用来对组合逻辑进行建模以及线网数据间进行描述; 5)连续赋值语句产生作用后,...
  • 2)左侧被赋值的数据类型必须是线网数据(wire); 3)连续赋值语句不能出现在过程快中(initial/always); 4)连续赋值语句主要用来对组合逻辑进行建模以及线网数据间进行描述; 5)连续赋值语句产生...
  • Verilog 赋值

    2021-06-02 14:02:22
    连续赋值assign 针对wire,连线的值时会随着它的驱动源的变化而立刻变化。 过程语句always 针对reg, 基本格式 always@(敏感信号条件表) 各类顺序语句;//always里的语句是顺序执行的 1. always @(a or b) //a,b...
  • 题目:reg和wire的区别

    2021-04-13 14:08:34
    reg型在always块和initial块中赋值wire型用assign赋值。 reg型可用于时序逻辑和组合逻辑赋值wire型只能用于组合逻辑赋值。 wire表示直通,即只要输入有变化,输出马上出现结果,reg表示一定要有触发,输出才会...
  • wire 和reg

    2019-05-27 19:37:38
    wire型数据常用来表示以assign关键字指定的组合逻辑信号。模块的输入输出端口类型都默认为wire型。默认初始值是z。 reg型表示的寄存器类型。always模块内被赋值的信号,必须定义为reg型,代表触发器。 默认初始值是x...
  • assign连续赋值

    千次阅读 2010-10-21 17:01:00
    一些verilog书上说assign用在连续型赋值的 场合,摘自某书籍—— “连续赋值语句用来驱动线型变量,这一线型变量必须已经事先定义过。只要输入端操作数的值发生变化,该语句就重新计算并刷新赋值...
  • verilog的wire和reg

    2020-06-11 11:28:12
    1.wire可以理解为物理连线,不可用于always块中,常用assign语句赋值。 2.reg具有存储性质。always块中的每个信号必须定义为reg。 3.阻塞赋值可以是wire赋值,也可以是reg的赋值。 4.非阻塞赋值只能是reg的赋值。...
  • 文章目录3.1 Verilog 连续赋值assign 语句连续赋值时延全加器3.2 Verilog 过程结构、赋值和时序控制Verilog 过程结构...连续赋值语句是 Verilog 数据流建模的基本语句,用于对 wire 变量进行赋值。格式如下: assi
  • reg与wire类型数据

    2021-01-18 22:10:00
    线网数据类型包括wire和tri型,常用wire型。 wire data; //定义1_bit的wire型数据data 二、寄存器类型 寄存器类型表示一个抽象的数据存储单元,通过赋值语句可以改变寄存器存储的值。 寄存器类型数据关键字为reg,...
  • wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接... 两者的区别是:寄存器数据保持最后一次的赋值,而线型数据需要持续的驱动。wire使用在连续赋值语句中,而reg使用在过程赋值语句(initia
  • verilog中wire和reg类型的区别

    千次阅读 2020-09-21 21:41:33
    wire型数据常用来表示以assign关键字指定的组合逻辑信号,模块的输入输出端口类型都默认为wire型,wire相当于物理连线,默认初始值是z。 reg型表示的寄存器类型,用于always模块内被赋值的信号,且必须定义为reg型,...
  • 按键消抖在单片机上的实现是非常简单的,检测到输入变化后延时一段时间继续检测,在FPGA...本文使用的按键消抖中,有四个重要的寄存器和一个wire型变量: output reg key_state; //寄存新的key状态 output reg key...
  • wire与reg的区别?什么时候用wire?什么时候用reg? 简单来说硬件描述语言有两种用途:1、仿真,2、综合。 对于wire和reg,也要从这两个角度来考虑。...1、wire型的变量综合出来一般是一根导线; 2、reg变量在al
  • 下面简要讲述一下wire型和reg型数据的使用问题。 首先我面需要明确,reg为寄存器数据,wire为连线型数据。 在程序设计中,正确的使用wire和reg需要牢记以下几点: 1)连续赋值语句(assign)只能使用wire类型; 2)...
  • wire型数据常用来表示以assign关键字指定的组合逻辑信号。模块的输入输出端口类型都默认为wire型。默认初始值是z。 reg型表示的寄存器类型。always模块内被赋值的信号,必须定义为reg型,代表触发器。 默认初始值...
  • Verilog中reg和wire的... 两者的区别是:寄存器数据保持最后一次的赋值,而线型数据需要持续的驱动。wire使用在连续赋值语句中,而reg使用在过程赋值语句(initial ,always)中。wire若无驱动器连接,其值为z,reg
  • FPGA wire和reg区别总结

    2019-01-27 11:39:14
    wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接...两者的区别是:寄存器数据保持最后一次的赋值,而线型数据需要持续的驱动。wire使用在连续赋值语句中,而reg使用在过程赋值语句(init...
  • wire 和 reg 区别

    2012-02-04 17:54:06
    wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接)。... 两者的区别是:寄存器数据保持最后一次的赋值,而线型数据需要持续的驱动。wire使用在连续赋值语句中,而reg使

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 161
精华内容 64
关键字:

wire型赋值