【学习】Verilog新写法及其疑问
0赞Verilog新写法及其疑问
说是新写法,其实也不新了。说来惭愧,我也是最近听了一节阿东的公开课,才知道Verilog有95语法和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这个引脚RSTn,if(!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; //声明寄存器赋值时是有效的,可以初始化值
两者不要混了,就行。