博主最近刚开始学习FPGA设计,选用的开发语言是目前比较流行的Verilog,教材选用的是北京航空航天大学出版的《夏宇闻Verilog HDL数字系统设计教程》(第四版),这本书也是比较经典的一本教材,第四版是它的最新版本。在学习的过程中,博主对每一章的知识点进行了梳理,对其中重要的知识点(博主认为的)都做了归纳,当然也有些知识点被博主舍弃掉了。学习的过程中也存在一些没看太明白的地方,对于这些内容,有的没写在总结里,有的在总结里标注出了“存疑”二字,请各位读者阅读时留意。最后也欢迎各位读者指出文章中出现的错误!
目录
第四章 运算符、赋值语句和结构说明语句
4.1逻辑运算符:
逻辑运算符是对整体进行运算的,注意与位运算符的区分;逻辑运算符中的&&和||低于关系运算符,!高于算术运算符。
4.2关系运算符:
结果是假的,返回0;结果是真的,返回1;结果是模糊的,返回不定值;
4.3等式运算符:
“==”和“!=”又称逻辑等式运算符,当操作数中的某些位是不定值x或高阻值z时,结果为不定值x;而“===”和“!==”对不定值和高阻值也进行比较,另两个操作数必须完全一样,结果才为1。
4.4移位运算符:
左移运算符和右移运算符都用0来填补移出的空位,其中左移会使位得以拓展。
4.5位拼接运算符:
位拼接表达式中不允许出现没有指明位数的信号;位拼接可以用重复法来简化表达式:
{4{w}}等同于{w,w,w,w};位拼接还可以用嵌套的方式来表达:{b,{3{a,b}}}等同于{b,a,b,a,b,a,b}。
4.6缩减运算符:
具体运算过程是这样的:第一步先将操作数的第1位与第2位进与、或、非运算;第二步将运算结果与第三位进行与、或、非运算,直至最后一位。(只有与或非运算?不)
4.7阻塞赋值与非阻塞赋值:
4.7.1非阻塞赋值(“<=”)
- 在语句块中,上面语句所赋的变量值不能立即就为下面的语句所使用;
- 块结束后才能完成这次赋值操作,而所赋的值是上一次赋值得到的;
- 在编写可综合时序逻辑模块时,这是最常用的赋值方法。
4.7.2阻塞赋值(“=”)
- 在赋值语句执行完后,块才结束;
- b的值在赋值语句执行完后立刻就改变;
- 在时序逻辑中使用,可能会产生意想不到的结果。
例:
b<=a;
always块内的下一条语句执行后,b并不等于a,而是保持原来的值,always块结束后,才进行赋值。
b=a;
这种赋值是马上执行的,也就是说执行下一条语句时,b已等于a。
4.8块语句
4.8.1顺序块:
- 块内语句是按顺序执行的,即只有上面一条语句执行完后下面的语句才能执行。
- 每条语句的延迟时间是相对于前一条语句的仿真时间而言的。
- 直到下一条语句执行完,程序流程控制才跳出该语句块。
begin
语句1;
语句2;
语句n;
end
或
begin :块名
语句1;
语句2;
语句n;
end
begin 后可加块名,块内声明语句可以是参数声明语句,reg型变量声明语句,integer型声明语句和real型变量声明语句。
4.8.2并行块:
- 块内语句是同时执行的,即程序流程一进入到该并行块,块内语句则开始同时并行地执行。
- 块内每条语句的延迟时间是相对于程序流程控制进入到块内的仿真时间。
- 延迟时间是用来给赋值语句提供执行时序的。
- 当按时间顺序排序在最后的语句执行完后或一个disable语句执行时,程序流程控制跳出该程序块。
格式如下:
fork
语句1;
语句2;
语句n;
end
或:
fork:块名
语句1;
语句2;
语句n;
end
fork后可加块名,语句块内的说明语句可以是参数说明语句、reg型变量声明语句、integer型变量声明语句、real型变量声明语句、time型变量声明语句和事件(event)说明语句。如果两条语句在同一时刻对同一个变量产生影响,那么将会引起隐含的竞争。
块名:可以在块内定义局部变量;可以通过块名被其他块调用。