【Verilog HDL 模块学习】门级描述 / 数据流描述 / 行为级描述

模块

Verilog语言中的基本描述单位是模块。模块描述某个设计的功能或结构,以及它与其他外部模块进行通信的端口。使用开关级原语、门级原语和用户定义的原语可以对设计的结构进行描述;使用连续赋值语句可以对设计的数据流行为进行描述;使用过程性结构可以对时序行为进行描述。

模块基本语法结构如下

module module_name ( port_list) :
	Declarations:
		reg, wire, parameter,
		input, output, inout,
		function, task, ...
	Statements:
		Initial statement
		Always statement
		Module instantiation
		Gate instantiation
		UDP instantiation
		Continuous assignment
		Generate statement
endmodule

在模块中,可以使用下面4种风格对设计进行描述:

  • 数据流风格
  • 行为风格
  • 结构风格
  • 上述描述风格的混合

数据流风格

用于建立组合逻辑电路行为模型。以数据流风格对设计进行建模的基本机制就是使用连续赋值语句,通过使用关键词 assign 对线网进行赋值(不能对寄存器进行赋值)

Verilog HDL有两大类数据类型

  • 线性类型:表示结构化元件间的物理连线。常见类型:wire
  • 变量类型:表示一个抽象的数据存储单元。共5种变量类型:reg、memories、integer、time、real(realtime)
//1位全加器的数据流方式描述
module full_adder_dataflow(a, b, carry_in, sum, carry_out);
	input a, b, carry_in;
	output sum, carry_out;
	
	assign sum = a^b^carry_in;
	assign carry_out = (a&carry_in)|(b&carry_in)|(a&b);
endmodule

行为风格

用于建立时序逻辑电路行为模型

行为级建模的主要结构:

  • initial语句。只执行一次。
  • always语句。循环执行,可由触发条件触发执行。

一个模块可以包括任意多条initial语句或always语句。同时这些语句间并行执行,与顺序无关。只有变量类型数据能够在这两种语句中被赋值。

//1位全加器的行为方式描述
module full_seq(a, b, carry_in, sum, carry_out);
	input a, b, carry_in;
	output reg sum, carry_out;
	reg t1, t2, t3;
	
	always
		@(a or b or carry_in) begin
			sum <= (a^b)^carry_in;
			t1 = a&carry_in;
			t2 = b&carry_in;
			t3 = a&b;
			carry_out <= (t1|t2)|t3;
		end
endmodule

语句块

  • 顺序语句块(begin end)
  • 并行语句块(fork join)

过程赋值语句

  • 阻塞过程性赋值(=)
  • 非阻塞过程性赋值(<=)

语句类型

条件语句 if else
case语句
循环语句

forever语句
repeat语句
while语句
for语句

结构风格

用于描述电路结构模型
在Verilog HDL中,可以使用以下4种构造对电路结构进行描述:

  • 内建门级基元:在门级描述电路
  • 开关级基元:在晶体管级描述电路
  • 用户定义基元:在门级描述电路
  • 模块实例:创建层级结构描述电路

Verilog HDL提供下列内建基元门:

  • 多输入门:and、 nand、or、 nor、xor、xnor
  • 多输出门:buf(缓冲门)、not(非门)。
  • 三态门:bufif0、bufif1、notif0、notif1。
  • 上拉、下拉门:pullup、pulldown。
  • MOS开关:cmos、nmos、pmos、rcmos、rnmos、rpmos。
  • 双向开关:tran、tranif0、tranif1、rtran、rtranif0、rtranif1。
//4选1多路器门级描述
module mux4x1(y, d0, d1, d2, d3, s0, s1);
	input d0, d1, d2, d3, s0, s1;
	output y;
	
	and (t0, d0, s0bar, s1bar),
		(t1, d1, s0bar, s1),
		(t2, d2, s0, s1bar),
		(t3, d3, s0, s1);
	not (s0bar, s0),
		(s1bar, s1);
	or (y, t0, t1, t2, t3,);
endmodule
//4选1多路器UDP描述
primitive mux4x1(y, d0, d1, d2, d3, s0, s1);
	input d0, d1, d2, d3, s0, s1;
	output y;
	
	table
		//真值表
	endtable
endprimitive

补充

如何实现各风格转化
真值表 -> 逻辑表达式 -> 门级结构
(懒得写了,数电知识)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值