verilog 负数表示敏感信号条件表中*表示什么

Verilog 中定义信号为什么要区分 wire 和 reg 两种类型?
Verilog 中,过程赋值语句要定义成 reg,连续赋值语句要定义成 wire,而且定义为 reg 不一定真的综合出register(也可能是纯组合逻辑),wire也不一定真的是 wire(也可能是 register)。既然如此,为何 Verilog 语法中要区分 wire 和 reg 呢?至今都没想明白有什么必要(除了制造出一些语法错误)。
按投票排序
谢邀。实在不好意思拖延症又犯了,这么久才回答。这是一个历史遗留问题。在 Verilog 被 Cadence 买下之前(大约上世纪八九十年代的样子),Verilog 只是一个用来做仿真的 HDL,不可综合。在那个年代,仿真器看到 wire 和 reg 会区别处理(实际上至今也是这样)。不知道你有没有发现,reg 类型信号的跳变,是依靠输入和敏感列表的,而且在非阻塞赋值中也存在一种并行的概念(同样条件下 B &= A、C &= B 的时候,A 的值不会直接到 C 去)。而 wire 只需要输入就足够了。这样区分两种类型也是为了更好地模拟真实硬件中时序逻辑和组合逻辑的行为。仿真器对 wire 类型会在每个 delta time 都进行计算并赋值,而 reg 类型只有在满足敏感列表条件时才会计算。而如今随着 SV 的推出 Verilog 都已经到 2005 了,但当初的这一习惯继承了下来。虽然 reg 不一定综合出来 register,但这属于综合工具对代码描述的硬件行为的一种解读。always @ (*) 当中这个敏感列表依然存在,仿真器依然会依照敏感列表的指示去干活,不论你的敏感列表是不是*。反过来看 wire,虽然 RTL 代码中这个 wire 信号可能就是综合后网表中某个寄存器的 Q 端,但是在行为级描述中你对这根 wire 重命名也确实是在描述一种硬件行为。P.S. 其实我上学的时候一开始也有同样的疑问。
两者差别很大,完全不能取消。在Verilog中,wire永远是wire,就是相当于一条连线,用来连接电路,不能存储数据,无驱动能力,是组合逻辑,只能在assign左侧赋值,不能在always @ 中赋值;但reg可以综合成register,latch,甚至wire(当其只是中间变量的时候),可以用于组合逻辑或者时序逻辑,能存储数据,有驱动能力,在always @模块表达式左侧被赋值。两个共同具有性质:都能用于assign与always @模块表达式的右侧。-----------------------------------------------------------------------------看到一篇讲两者区别的很棒的文章等有空上传一张Synopsys DC中将reg综合成wire的综合结果图吧。
我对“虽然reg不一定综合出来register,但这属于综合工具对代码描述的硬件行为的一种解读”不是很同意的,综合工具在一定的程度上就是反应你的设计意图,至于为什么不想要的结构,原因有二:其一是你代码写的规范;其二你没有理解你的代码会综合出什么硬件的预期。例如我定义:always@ (*) begin
if (&condition&)
b =end在这段代码中a是不会综合出寄存器的,而b却会,原因在于a是中间变量,就是一条线,所以综合出来的不是寄存器,而是一条线。而在condtion不满足的情况下b要保值,所以b会综合成寄存器。绝不是综合工具对代码描述的硬件行为的一种解读。=================wire也不一定真的是 wire(也可能是 register)这是绝对不可能发生的事情。从verilog的语言上讲只有值和语句的关系。值分成常量和变量两种,而常量是用过wire类型来体现的,这种情况下wire是直接接到高低电平上的,所以不可能是寄存器;再者语句分为过程语句和连续赋值语句,而连续赋值语句是一定不会综合出寄存器的,因为他会马上被引用,没有机会保值;而过程语句大家都知道赋值的变量一定是reg类型的,所以这种情况也被否决掉了。综上所述“wire也可能是 register”这是绝对不可能发生的事情。
这学期刚学习了大规模集成电路,刚开始的时候也有题煮的疑惑,在此分享一点自己的理解,希望能帮到你。如果有不对的地方也希望大家指正。毕竟只是初学者为了应付考试的理解~首先我理解的是,Verilog作为一门行为描述语言,你可以把每一段程序都理解为“用语言描述一个模块”,而实际上,一个模块的组成无非就是“引脚”+“内部的各种电路”。有个这种准备之后就好理解wire 和 reg 了。Verilog中,把没有定义类型的信号默认设置为wire,除非特殊声明一次。如:input[7:0] a, reg [7:0]以上例子,由于“input”就是模块管脚的声明,他有两个管脚a,b,用作输入。而再把a定义成寄存器类型,方便功能定义中进行操作。所以此时a 为reg型 b 为 默认wire 型。所以说,可以粗略地把wire型理解为“从管脚输入的、原始的信号序列”,他在导体上以电信号的形式流动,而把reg型理解为“用寄存器存着从管脚输入的信号”,因为之后在寄存器中存住的数字信息,才能进行诸如移位、赋值等操作。打个比方,你在一个房间里,房间有两个水管,一个流入一个流出,你可以直接把水管的水从输入管接到输出管,但你就没办法用这些水了。如果你想用这些水来炒菜、洗澡、打水仗、等等,你就要用一个名为reg的盆去接水,这样这些水才能被你用。
For system verilog, you can use logic for both wire and reg.
很简单你用verilog写一个simulation的testbench你会发现input永远是reg,output永远是wire你再写一个always block你会发现output永远是reg,说白了只有reg才能在always block里面变值附赠一张slide
网络数据类型表示结构实体(例如门)之间的物理连接。网络类型的变量不能储存值,而且它必需受到驱动器(例如门或连续赋值语句,assign)的驱动。如果没有驱动器连接到网络类型的变量上,则该变量就是高阻的,即其值为z。常用的网络数据类型包括wire型和tri型。这两种变量都是用于连接器件单元,它们具有相同的语法格式和功能。之所以提供这两种名字来表达相同的概念是为了与模型中所使用的变量的实际情况相一致。 wire型变量通常是用来表示单个门驱动或连续赋值语句驱动的网络型数据,tri型变量则用来表示多驱动器驱动的网络型数据。如果wire型或tri型变量没有定义逻辑强度(logic strength) ,在多驱动源的情况下, 逻辑值会发生冲突从而产生不确定值。====================================================wire型数据常用来表示用于以assign关键字指定的组合逻辑信号。Verilog程序模块中输入输出信号类型缺省时自动定义为wire型。wire型信号可以用作任何方程式的输入,也可以用作“assign”语句或实例元件的输出。====================================================寄存器是数据储存单元的抽象。 寄存器数据类型的关键字是reg.通过赋值语句可以改变寄存器储存的值,其作用与改变触发器储存的值相当。Verilog HDL语言提供了功能强大的结构语句使设计者能有效地控制是否执行这些赋值语句。这些控制结构用来描述硬件触发条件,例如时钟的上升沿和多路器的选通信号。在行为模块介绍这一节中我们还要详细地介绍这些控制结构。reg类型数据的缺省初始值为不定值x。=====================================================别想那么复杂,好好体会。学而不思则罔,思而不学则殆。=====================================================以上摘自《夏宇闻Verilog经典教程》
因为verilog是硬件描述语言你设计的是硬件电路你设计的是硬件电路你设计的是硬件电路硬件电路,特别是时序硬件电路,里面的基本构成:寄存器 逻辑门 连线
Hardware description
languages need the concept of a wire. - Janick BergeronThe variable is sufficient for ordinary sequntial programming languages.When desribing hardware, a construct that describe the behavior of a wire used to connect multiple devices together must be provided.希望对你有帮助
reg 只能在always或者initial里面赋值,而wire可以用assign赋值。这是语法区别,设计上灵活的选用。综合只是工具去理解你的设计意图。
已有帐号?
社交帐号登录
无法登录?
社交帐号登录第四章 Verilog设计初步与入门_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第四章 Verilog设计初步与入门
上传于||文档简介
&&华​东​师​范​大​学​可​编​程​逻​辑​器​件​与​E​D​A​课​件
大小:2.79MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢(原)自己动手写CPU之第二阶段(3)——Verilog HDL行为语句 | Imagination中文技术社区第6章_Verilog_HDL设计进阶习题_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
第6章_Verilog_HDL设计进阶习题
上传于||暂无简介
大小:930.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢1085人阅读
FPGA(34)
1. 信号的产生及always块使用注意事项
&&& 1.1 不要在不同的always块内为同一个变量赋值。即某个信号出现在&=或=左边时,只能在一个always块内。(详细解释见 Verilog HDL与数字电路设计 P38)
&&&&&&&&& 所以注意,在产生一个信号时,所有产生该信号的条件都应放在一个always块内考虑。
&&& 1.2 不要在同一个always块内同时使用阻塞赋值(=)和非阻塞赋值(&=)。
&&& 1.3 使用always块描述组合逻辑时使用阻塞赋值(=),在使用always块描述时序逻辑时使用非阻塞赋值(&=)。简单理解可以是,在电平敏感的always块内使用阻塞赋值,在边沿敏感的always块内使用非阻塞赋值。
&&&& 1.4 任何在always块内被赋值的变量都必须是寄存器型(reg)。即&=或=左边的信号,必须是reg型,&=或=右边的信号可以是reg型也可以是wire型。
&&&&&&&&&& 另,端口声明中被声明为input或inout型的端口,只能被定义为线网型(wire);被声明为output型的端口,则可以被定义为线网型(wire)或者寄存器型(reg)。如果不定义,则默认为线网型(wire)。
&&&& 1.5 always的敏感列表中可以同时包括多个电平敏感事件,也可以同时包括多个边沿敏感事件,但不能同时有电平和边沿敏感事件。另外,敏感列表中,同时包括一个信号的上升沿敏感事件和下降沿敏感事件也是不允许的,因为这两个事件可以合并为一个电平事件。
2. 总clk的使用
&&&&always敏感列表里的边沿触发事件,就是一个clk信号,所以在制定ucf时,边沿触发事件信号都要被定义在clk IO端口上,有时随意分配的clk IO端口在Implement时也会出错。需要到ucf中用
&&&&NET &polin& CLOCK_DEDICATED_ROUTE = FALSE;&&&&& //polin为边沿触发事件信号
&&& 语句来规避错误。
&&&&所以在一个程序中,要尽量使用主clk作为always块的边沿触发信号。如果有些变量要通过某个信号的边沿触发来产生,那尽量将这个边沿触发信号做成一个判断条件,然后在产生变量时仍用主clk触发。
&&& 例程:要得到LCD大尺寸屏POL信号的2分频、8分频、16分频...,在控制板上拨动开关设置不同的状态,输出polout切换到不同的pol输入的分频信号。
&&& 思路,定义一个counter(cnt_pol)对输入pol信号进行计数,则cnt_pol的bit0位与pol输入信号一致,cnt_pol的bit1位为pol信号的2分频,bit2位为pol的4分频,bit3位为pol的8分频,bit4位为pol的16分频...
&&&&counter计数有两种方法,一种是直接使用pol作为边沿触发事件计数:
&&& reg [8:0] cnt_
&&&&always @ (posedge polin or negedge rst)
&&&&if(!rst) cnt_pol &= 0;
&&& else cnt_pol &= con_pol +1;
&&& (程序中还有一个主clk信号clkin作为其它信号的主时钟)
&&& 上面这种方法比较简单,但是polin就作为了一个clk信号,只能定义到FPGA的clk IO端口,并且实现时容易报错。
&&&&另一种方法是,采用主时钟信号为cnt_pol计数的边沿敏感事件:
&&& reg [8:0] cnt_
&&& wire cnt_
&&& always @ (posedge clkin or negedge rst)
&&& if (!rst)& pold &= 0;
&&& else pold &=
&&& assign cnt_event = polin&&
&&& always @ (posedge clkin or negedge rst)
&&& if (!rst) cnt_pol &= 0;
&&&&else if (!cnt_event) ;
&&&&&&&&&&& else cnt_pol &= cnt_pol +1;
&&& 这样,程序比较多,但整个程序(包括其它部分)只有clkin是clk信号,避免了上述问题。
&&& 对这段程序的解释:cnt_pol计数的机理与第一种方法不同,先通过第一个always块(寄存器),对polin信号进行延迟,产生pold信号,pold与polin在相位上差一个clkin周期。然后对pold和polin进行与操作并赋值给cnt_event信号,这样,cnt_event信号的每个高电平,即代表一个polin周期。然后再在第二个always块中,通过判断cnt_event的状态,来对cnt_pol计数。简单讲,就是将polin的上升沿,转成一个信号的电平状态,然后通过判断这个信号电平的状态来计数。整个过程使用的边沿触发信号都是主clk。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:325691次
积分:5551
积分:5551
排名:第2711名
原创:171篇
转载:404篇
评论:32条}

我要回帖

更多关于 verilog产生时钟信号 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信