Verilog语言快速入门

Verilog语言快速入门

基本框架

module<模块名> (端口列表)
端口说明
input 
output
inout

参数定义
数据类型定义

连续赋值语句
assign

过程块 
initial(行为描述语句)
always(行为描述语句)

低层模块实例
任务和函数
延时说明块
endmodule

行为描述语句只能出现在initial、always两种语句内。

q=a+b;
q<=a+b

这样的行为语句只能出现在always块内,而且always块内只能使用reg变量。
这是因为always里面可能会出现时序逻辑和寄存器,因此必须采用拥有保持原值属性的reg。但是always也可以做组合逻辑,因此reg也可能被综合成线网类项。

wire只能搭配assign使用,这是因为他就是一根导线,只能放在组合逻辑里。
区别于VHDL,带有反馈的只能采用buffer类型,wire也可以带有反馈

module test(Din, CS, WR, Dout ) ;
	input CS, WR;
	input Din;
	output Dout;

	wire t;
	assign t = ~t;
	assign Dout = t;
endmodule

Verilog语言快速入门_第1张图片
时序逻辑的产生:

	always @ (posedge CS)
	begin
		Dout<=Din;
	end

可以理解为,posedge CS可以写成VHDL中的if(clk’event and clk=1),这是一个不完整的if语句因此产生时序逻辑,但是verilog里貌似没有找到类似的对应,只能用 (posedge CS) 来描述,而且,如果要异步复位只能用negedge RST+if(!RST)来实现,因为不能写(posedge CS or RST),但是无伤大雅。

	always @ (posedge CS or negedge RST)
	begin
		if(!RST)
		...
	end

如果代码如上述所示,那么CS的上升沿会触发一次事件,如果此时RST已经为0,那么会走if语句的内容。如果CS不是上升沿,但是RST变化,同样也会触发always,然后相应判断。

如果是这个代码,那么RST的变化不会触发always,只要clk会触发,因此这个就是同步时序。

	always @ (posedge CS)
	begin
		if(!RST)
		...
	end

实例化示意:

or iB (out, sel a, sel b) ;

模块名+实例化名+端口

A note on wire vs. reg: The left-hand-side of an assign statement must be a net type (e.g., wire), while the left-hand-side of a procedural assignment (in an always block) must be a variable type (e.g., reg). These types (wire vs. reg) have nothing to do with what hardware is synthesized, and is just syntax left over from Verilog’s use as a hardware simulation language.

你可能感兴趣的:(FPGA,程序人生)