语法介绍
可综合与不可综合
可综合的verilog语法:语法可以综合成实际的电路
- 组合逻辑:由一堆逻辑单元实现
- 时序逻辑:由寄存器(D触发器)实现,如always@ (posedge i_clk) b<=a;只有在时钟上升沿才会把值输出出去,否则就一直存着
不可综合的verilog语法:语法不可综合成实际的电路
如a<= #1 b; 这个延时1ns是无法实现的,FPGA中没有延时单元
运算
注:FPGA中不能直接用组合逻辑设计除法、取余运算电路,需要结合时序逻辑,可能需要多个时钟周期
阻塞和非阻塞
点击查看代码
//组合逻辑使用阻塞赋值
assign w_d = 1;
assign w_e = w_d;
//时序逻辑使用非阻塞赋值(并行)
always @(posedge i_clk)
begin
r_a <= 1;
r_b <= r_a; //r_b会慢一个时钟周期变为1
end
非阻塞示意图如下:
总结:r_b数值比r_a数值慢一拍,因为r_a输出有延迟,1还没有到r_b数据端口时r_b就已经读取完数据了,所以输出是0,在下一个时钟上升沿会变成1
注:若出现always @(*)
,则这样的话只要下面的信号改变就会赋值,这种写法和组合逻辑是等效的。reg型只能写在always里,assign只能用于wire型
按位与、或
r_a <= &r_a;
r_a <= |r_a;
若r_a为1010,则第一个结果为0,第二个结果为1
功能:判断信号内的1和0
case语句
点击查看代码
always @(posedge i_clk)
case(r_a)
1 :begin
r_b <= 1;
end
2 :begin
r_b <= 2;
end
default :begin
r_b <=3 ;
end
endcase