Verilog-语法篇3(正点原子笔记)

本文介绍了Verilog中initial和always关键字的用途,initial主要用于初始化变量和生成激励信号,always则用于创建持续执行的进程,可以是电平触发或边沿触发。文中详细阐述了阻塞赋值和非阻塞赋值的区别,以及在组合逻辑和时序逻辑中的应用,并提到了条件语句和case结构的使用规则。
摘要由CSDN通过智能技术生成

结构语句

initial

initial(只执行一次)
	常用于测试文件的编写,用来产生仿真信号(激励信号)
		或者用于对存储器变量赋初值
		
	initial begin
		sys_clk			<=		1'b0		;	// 1'b0 assign sys_clk
		sys_rst_n		<=		1'b0		;
		#20 sys_rst_n	<=		1'b1		;	// #20 are delay 20,unit are ns
	end

always


always(一直重复执行)
	所以只有和一定时间控制结合在一起才有用

	always #10 sys_clk <= 		~sys_clk	;	//10ns sys_clk reversal


always的时间控制可以是沿触发,也可以是电平触发;
		可以是单信号也可以多信号(多信号中间用or连接)	
always语句后紧跟的过程块是否可以运行,要看它的触发条件是否满足

always @ (posedge sys_clk or negedge sys_rst_n) begin	//posedge is rising edge ,negedge is falling edge
	if (!sys_rst_n) begin
		counter <= 24'd0;
	end else if (counter < 24'd1000_0000) begin
		counter <= counter + 1'b1;
	end else begin
		counter <= 24'd0;
	end
end

由关键字or连接的多个事件或者信号名组成的列表称之为“敏感列表”
组合逻辑电路中为高低电平
时序逻辑电路中为边沿触发?

always @ (a or b or c or d or e or f or g or h or p or m) begin // = always @ (*) begin
	out1 = a? (b + c) : (d + e);								//@ (*)表示块中输入的所有变量的变化都是敏感的
	out2 = f? (g + h) : (p + m);
end

组合逻辑电路和时序逻辑电路

	1.组合逻辑电路中,任意时刻的输出仅仅取决于该时刻的输入,与电路原来的状态无关
	2.时序逻辑电路中,任一时刻的输出不仅取决于当时的输入信号,还取决于电路原来的状态。
			或者说还与以前的输入有关,因此时序逻辑电路必须具备记忆功能。

n

赋值语句

		1.阻塞赋值,如	b 	= 	 a;
		2.非阻塞赋值,如	b 	<=	 a;
		3.				LHS = 	 RHS;(RHS赋值操作的源头,LHS赋值操作的目标)

阻塞赋值(顺序执行?,一般运用于组合逻辑电路)

	可认为只计算RHS并更新LHS
	所谓阻塞是指在同一个always块中,后面的赋值语句是在前一句赋值语句结束后才开始赋值的
always @(posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		a = 1	;
		b = 2	;
		c = 3	;
	end else begin
		a = 0	;
		b = a	;
		c = b	;	//a=b=c=0
	end
end

非阻塞赋值(并行执行?,一般运用于时序逻辑电路)

非阻塞赋值的操作可以看作两个步骤:
		(1)赋值开始时,计算RHS
		(2)赋值结束后,更新LHS
所谓非阻塞赋值的概念是指,在计算非阻塞赋值的RHS以及更新LHS期间,允许其他的非阻塞赋值语句同时计算RHS和更新LHS

要求:非阻塞赋值只能用于寄存器类型的变量进行赋值,因此只能用于initial和always等过程块中
always @(posedge clk or negedge rst_n) begin
	if(!rst_n) begin
		a <= 1	;
		b <= 2	;
		c <= 3	;
	end else begin
		a <= 0	;
		b <= a	;
		c <= b	;	//a=0,b=1,c=2
	end
end

经验

描述组合逻辑的always中用阻塞赋值=,组成的组合逻辑电路只与输入电平有关
描述时序逻辑的always中用非阻塞赋值<=,组成的时序逻辑电路往往与触发沿有关

同一个always中不能非阻塞赋值与阻塞赋值不用同时用
不允许在多个always中对同一个变量赋值

条件语句(必须在过程块中用)

1.if  else
    ()中只有1是真值。0、x、z都是假
    
2.case(num)
	分支表达式:控制表达式;
   	..............
   	default :控制表达式;	 
  endcase
  
要求:1.所有分支表达式值不同
	 2.所有表达式的位宽相等
	 3.casez
	 	比较时,不考虑高阻值z(只要除z之外相等即可)
	 4.casex
	 	比较时,不考虑高阻值z和不定值x(只要除z、x之外相等即可)

关于顺序/并行执行的总结

组合逻辑(无记忆)的begin end 间是顺序执行的
时序逻辑(有记忆)的begin end 间是并行执行的

assign用于描述组合逻辑
alway用于描述时序逻辑(沿触发)/组合逻辑(电平触发)
所有的always和assign都是并行执行的

关于always的一些说明

1、一个模块中可有多个always块,并行运作
2、若always块可综合,则表示的是某种结构;若always块不可综合,则表示的电路结构的行为

需要注意的地方

1、assign不能再always中使用
2、assign和实例应用可独立于过程块存在

参考文章:【Verilog】一、Verilog的always使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值