1、模块定义
模块定义跟C语言的函数很相似。
模块必须使用“module”关键字,他也没有返回值。
模块没有beginmodule,只有endmodule
2、阻塞赋值与非阻塞赋值
a=b就是阻塞赋值,需要一步一步来,先有a再有b,它会阻塞别的语句。
a<=b就是非阻塞赋值,它可以和其他语句并行。并行!这可以硬件的特点。
3、如何给一个端口赋值?
Verilog中有两种数字生命:指明位数的数字和不指明位数的数字
指明位数的数字表示形式:<size>’<base format><number>
Size用来指明数字位宽度,只能用十进制整数表示
Base format包括十进制(’d或’D),二进制(’b或’B),八进制(‘o或’O),十六进制(‘h或’H)
例如
4’b1111 //4位2进制数
cnt = 1'b0; //就是给端口cnt赋0值
4、always 与 always@ 有什么区别?
有区别,而且很大,always 和c语言中的while语句或者说和if...then...有点类似,但不完全相同,always会一直执行,但是always@是有触发条件的时候执行。
通常会这样使用:
always@(条件)
begin
//具体逻辑
end
5、always后面的条件:
always@(posedge x)表示当x信号出现上升沿
always@(negedge x)表示当x信号出现下降沿
这两种一般用于时序逻辑,而在组合逻辑中要使用电平触发。不懂时序逻辑和组合逻辑的朋友,建议你先不要学FPGA了,去看看数字电路,我们搞硬件的不像那些软件的人,
上个培训班就IT的了。
6、系统任务
Verilog为某些常用操作提供了标准的系统任务(也叫系统函数)这些操作包括屏幕显示、线网值动态监视、暂停和结束仿真等。所有的系统任务都具有$<keyword>的形式。
显示信息 $display(p1,p2,p3,…,pn);
$display会自动在字符串的结尾处插入一个换行符,因此如果参数列表为空,则display的效果是现实光标移动到下一行
监视信息 $monitor(p1,p2,p3,…,pm);
系统函数$monitor对其参数列表中的变量值或者信号值进行不间断的监视,当其中任何一个发生变化的时候,显示所有参数的数值。$monitor只需调用一次即可在整个仿真过程中生效。
7、信号类型:wire和reg有什么区别?
Verilog中有两种信号类型,wire可以当做是组合逻辑的输出,而reg是寄存器类型,可以把它想象成D触发器的输出。
它们的区别在于:reg型信号可以使用always语句,实现条件赋值。
8、Verilog中的变量类型:
一共有三种:integer整形 real实型 time
相比较C语言而言,变量类型少了很多。其中integer是至少32位,并且是以补码的形式保存。real型不指明位数。
有一点很重要,这些变量,在FPGA中是不对应任何硬件实体的。我猜测,他们可能只存在于代码层次,会随着编译器的优化,最终有可能会存在于寄存器中。