电路图: Verilog代码: 语法说明: 时序逻辑 :电路具有**功能,电路状态不但与当前输入有关,还与前一时刻的状态有关。 同步逻辑 :在同一的时钟信号激励下工作,输出只在时钟的上升沿(或者下降沿)发生变化。 reg :除wire类型外,另外一种常用的数据类型,一般表示寄存器类型数据,不过并不绝对,记住一条原则:在always块内被赋值的信号应定义成reg型,用assign语句赋值的信号应定义成wire型。 always :除assign外,另外一种实现赋值操作的关键字,两者都不可嵌套,区别在于,assign语句只能实现组合逻辑赋值,且一个assign语句后面只能跟一条赋值表达式。而always即能实现组合逻辑赋值,又能实现时序逻辑赋值操作,且可以包含多条赋值表达式,多条赋值表达式,则应位于begin/end对中间。 posedge :verilog关键字,表示上升沿的意思。Always@(posedge clk)表示在clk信号的上升沿的时刻,执行always块内部的语句,与此相对应的,是表示下降沿的关键字negedge。凡是带有posedge或negedge的always块,都会被综合成时序逻辑电路。 阻塞/非阻塞赋值:采用"\<="进行赋值的语句,称为"非阻塞赋值",采用"="进行赋值的语句,称为"阻塞赋值"。在always块中,阻塞式赋值方式语句执行有先后顺序,而非阻塞赋值语句则是同时执行。因此,在时序逻辑电路中,两种赋值方式可能或综合出不同的电路结构。如下所示 显然,第二种电路才是符合我们预期的设计,为避免出现一些稀奇古怪的电路,我们只需记住以下规则: i:在组合逻辑电路中,使用阻塞式赋值方式"="; ii: 在时序逻辑电路中,使用非阻塞式赋值方式"\<=" iii:在同一个always块内,只能存在一种赋值方式。 iv:一个信号,只能在一个always或一个assign语句下赋值。 v:原则上来说,一个always块内只处理一个或一类信号,不同的信号可在不同的always块内处理。 vi: always块内只能对reg型信号进行处理,不能对wire型数据赋值,也不能实例化模块
|