Verilog HDL(3)程序设计语句和描述方式
在verilog中只有三种设计语句1.数据流建模,2.行为级进模,3.结构性建模
3.1数据流建模
3.1.1连续赋值语句
—连续赋值的目标类型主要是标量线网和向量线网两种
(1)标量线网,如:wire a,b;
(2) 向量线网,如:wire [3:0]a,b;
1.显性连续赋值
—<net_declaration><range><name>; //信号定义 连线型变量类型
—assign #<delay><name>=Assignment expression; //assign赋值语句
assign语句和信号定义语句分成两句。
2.隐形连续赋值语句
—<net_declaration><drive_strength><range>#<delay><name>=Assignment expression;
assign语句和信号定义语句在一句里
连续赋值语句需要注意以下几点:
1.赋值目标只能是线网类型(wire);
2.在连续赋值语句中,只要赋值语句右边表达式任何一个变量有变化,表达式立即被计算,计算的结果立即赋给左边信号(若没有延迟量)
3.连续赋值语句不能出现在过程块中。
4.多个连续赋值语句之间是并行语句,因此与位置顺序无关。
5.连续赋值语句中的延时具有硬件电路中惯性延时的特性,任何小于其延时的信号变化脉冲都将被滤除,不会出现在输出端口上。反之亦然。
对于5的说明:电路成电容性,如果电容性变大,则延迟变大,频率变小,这时信号中的毛刺信号如果小于该频率则不会被输出。如果电容变小,则延迟变小,频率变大,毛刺信号大于频率则会被输出。
3.2行为级建模
只有三种语句,赋值,条件,循环。
下面只列出可综合性的语句:
过程语句 always
赋值语句 连续赋值assign,过程赋值=、<=
条件语句 if-else case,casez,casex
循环语句 for
编译向导语句 'define,'include,'ifdef,'else.'endif
3.2.1过程语句
1.initial过程语句
2.always语句块
从语句描述角度,相对于initial过程块,always语句块的触发状态是一只存在的,只要满足always后面的敏感事件列表,就执行过程块。
其语法格式:
[email protected](<敏感事件列表>)
语句块;
例如:
@(a) //当信号a的值发生改变时
@(a or b) //当信号a或信号b的值发生改变时
@(posedge clock) //当clock的上升沿到来时
@(negedge clock) //当clock的下降沿到来时
@(posedge clk or negedge reset) //当clk的上升沿没到来或reset信号的下降沿到来时
3.过程语句使用中需要注意的问题
在信号定义形式方面,无论是对时序逻辑还是组合逻辑描述,verilog hdl要求在过程语句(initial和always)中,被赋值信号必须定义为reg类型。
(1)采用过程对组合电路进行描述时,作为全部的输入信号需要列入敏感信号列表
(2)采用过程对时序电路进行描述时,需要把时间信号和部分输入信号列入敏感事件列表。应当注意的是,不同敏感事件列表会产生不同的电路形状。
异步计数器由于设计出的电路面积过大而且占用运行空间较大,所以现在多采用同步计数器。也就是clk到达上升沿时触发。
同时同步计数器还用于FPGA领域