宋桓公

【学习】Verilog新写法及其疑问

0
阅读(2435)


Verilog新写法及其疑问

说是新写法,其实也不新了。说来惭愧,我也是最近听了一节阿东的公开课,才知道Verilog95语法和01语法之分,关于这一点其实软件是可以设置的,如下图。

新版的都是默认01语法,当然它是向下兼容的,写成95的形式,编译是不会报错的。

一开始学FPGA的时候,我都是这么些的,

module led

(

CLK,RSTn,LED

);

input CLK

input RSTn

output [3:0] LED

reg [3:0] rLED;

//-------------------------------------------

always @(posedge CLK or negedge)

if(!RSTn) rLED <= 4’b0001;

else rLED = {rLED [0],rLED [2:0]};

assign LED <= rLED;

后来学聪明了一点,就这么写

module led

(

input CLK

input RSTn

output reg[3:0] LED

);

always @(posedge CLK or negedge RSTn)

if(!RSTn) LED <= 4’b0001;

else rLED = {LED [0],LED [2:0]};

感觉第二种,简单很多,立马爱上第二种。(其实第一种就是95写法,第二种就是01的写法)。

后来买了一块开发板,惊奇的发现,开发板上没有RC复位电路,如下图:

这样RSTn这个引脚没地方分配了,搞的我很郁闷,因为这样一来我不好赋初值,例如if(!RSTn) LED <= 4’b0001;

但是,我再次惊奇的发现,即使我没分配RSTn这个引脚RSTnif(!RSTn) LED <= 4’b0001这句话居然是有效的。似乎编译器明白你的想法。

再后来我发现了一种更牛逼的写法:

module led

(

input CLK

output reg[3:0] LED = 4’d1110

);

always @(posedge CLK)

LED = {LED [0],LED [2:0]};

看到这种写法,我十分开心,也豁然开朗,这样也可以啊!直接不要RSTn,怪不得现在有的开发板连时钟复位电路也省了。

结果,却比较失望,流水灯流不起来。复位时的值表现出来是并不是1110,而是0000,但是仿真的值却是对的。

这让我很不明白,后来却而求其次写成了这样:

module led

(

input CLK

output reg[3:0] LED

);

reg[3:0] rLED = 4’d1110; //声明寄存器的时候就可以赋值了,这非常好。

always @(posedge CLK)

rLED = {rLED [0],rLED [2:0]};

assign LED <= rLED;

这样结果就是没问的~~

我不知道,这样赋值为什么结果不正确,希望哪位大神能告知,感激不尽~~

module led

(

input CLK

output reg[3:0] LED = 4’d1110

);



//---------------------2013-12-09----------------------------

跟Craftor以及CrazyBingo询问了下

总结如下:

output reg[3:0] LED = 4’d1110 //这种就是仿真用的,无法初始化值

reg[3:0] LED = 4’d1110; //声明寄存器赋值时是有效的,可以初始化值

两者不要混了,就行。




Baidu
map