Verilog HDL学习记录(3~4章)
3.Verilog HDL 程序设计语句和描述方式
3.1数据流建模
连续赋值语句只能用来对连线型变量进行驱动,而不能对寄存器型变量进行赋值,连线型变量由assign引导,寄存器类型一般在initial或always语句块中;连续赋值语句不能出现在过程块中;多个连续赋值语句之间是并行关系,与位置顺序无关。
3.2行为级建模
下图为VHDL行为描述中模块的构成框架。
3.2.1 过程语句
过程块由过程语句组成,过程语句有两种,分别是:initial与always。在initial和always中赋值时,必须用reg型的寄存器变量。
initial:
initial在仿真过程中只执行一次,不用在工程设计文件中,都是从0时刻开始执行。initial过程块内的多条行为语句可以顺序执行,也可以并行执行。
always:
always过程语句触发状态一直存在,只要满足后面的敏感事件列表,就执行语句块。
always@(<敏感事件列表>)
敏感事件就是触发条件,当敏感事件列表中的值符合变化时,就会引发块内语句的执行。当有>=2个信号时,用or或,连接。一般触发类型为:posedge、negedge。
3.2.2 语句块
当语句数超过一条时,需要采用语句块,语句块由标识符begin-end或fork-join引导。begin-end是串行方式顺序执行。fork-join是并行方式执行,只能用于仿真测试。
3.2.3 过程赋值语句
过程块中的赋值语句叫过程赋值语句,是在initial或always语句内的赋值,只能对寄存器数据类型的变量赋值,对于多位宽的寄存器,还可以只对其中某一位或几位赋值。
1.阻塞赋值语句
变量=表达式;b=a;
有多条阻塞语句时,要按照顺序执行,上面的执行完了,才能执行下面,不然就会堵在那里。先计算等号右边表达式的值,然后立即赋给左边。
2.非阻塞赋值语句
变量<=表达式;b<=a;
在多条非阻塞赋值语句下,都是并行执行,前面的语句不会影响后面语句的执行。
触发器就是在每个时钟沿来临时,让当前状态值更改为当前D的值,Q^n+1=D ,可以存储值。
3.2.4 过程连续赋值语句
连续赋值assign可以在过程块中对连线型和寄存器变量进行赋值?过程连续赋值不能够对寄存器变量赋值,而不可用于对连线型变量赋值?这两句话不矛盾吗?
目前我能肯定的是,在语句块外部,assign只能对wire型变量赋值(assign a = b),不能对reg型赋值;而在initial或always中,reg型可以直接赋值(a=b)和用assign进行赋值,assign不能对wire型赋值,wire型变量也不能单独用个=来赋值。用force不会报错,但还是以常规的为主。即initial/always用reg型,wire用于连线。
3.2.5 条件分支语句
if-else语句
条件语句只能在initial和always语句下的begin-end中使用。if括号中的判断若为0、x、z,按“假”处理,若为1,按“真”处理。
case语句
case(控制表达式)
值1:语句块1
值2:语句块2
...
值n:语句块n
default:语句块n+1
endcase
case语句括号中的内容进行比较时,是一种全等比较;值1到值n必须各不相同;如果连续几个比较值执行的是同一条语句,则这几个值可用逗号间隔;default必须带上,虽然书上说前面列举完了所有情况时,default可以忽略,但现实中很少全部完成。
3.2.6 循环语句
VHDL有4种循环语句,forever,repeat,while,for。
1.forvver,引导的循环语句表示永久循环,一般用在initial中。
2.repeat
关键字“repeat”所引导的循环语句表示执行固定次数的循环。
3.while与for同C语言中相对于的一样。
3.3结构化建模
这部分的内容就是例化模块,在FPGA的例程中有学习。调用模块的格式为:
模块名 实例名(端口名列表(.x(x))
同一个模块在当前模块中被调用几次,则需要用不同的实例名加以标识。当调用模块里面的端口位宽与当前模块不一致时:
调用模块,并改变该模块中的参数值,两种方式,1种是例化函数中改,另一种是用defparam在例化函数后面加一条语句,均在FPGA学习(6)和(7)中体现。
3.3.1 门级模块调用
目前还未涉及?
4.VerilogHDL数字逻辑电路设计方法
主要是讲了一些具体的数字电路例子,与语法关系不大。