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

在这里插入图片描述
时序逻辑的产生:

	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.

相关推荐
目 录 译者序 前言 第1章 简介 1 1.1 什么是Verilog HDL? 1 1.2 历史 1 1.3 主要能力 1 第2章 HDL指南 4 2.1 模块 4 2.2 时延 5 2.3 数据流描述方式 5 2.4 行为描述方式 6 2.5 结构化描述形式 8 2.6 混合设计描述方式 9 2.7 设计模拟 10 第3章 Verilog语言要素 14 3.1 标识符 14 3.2 注释 14 3.3 格式 14 3.4 系统任务和函数 15 3.5 编译指令 15 3.5.1 `define和`undef 15 3.5.2 `ifdef、`else 和`endif 16 3.5.3 `default_nettype 16 3.5.4 `include 16 3.5.5 `resetall 16 3.5.6 `timescale 16 3.5.7 `unconnected_drive和 `nounconnected_drive 18 3.5.8 `celldefine 和 `endcelldefine 18 3.6 值集合 18 3.6.1 整型数 18 3.6.2 实数 19 3.6.3 字符串 20 3.7 数据类型 20 3.7.1 线网类型 20 3.7.2 未说明的线网 23 3.7.3 向量和标量线网 23 3.7.4 寄存器类型 23 3.8 参数 26 第4章 表达式 28 4.1 操作数 28 4.1.1 常数 28 4.1.2 参数 29 4.1.3 线网 29 4.1.4 寄存器 29 4.1.5 位选择 29 4.1.6 部分选择 29 4.1.7 存储器单元 30 4.1.8 函数调用 30 4.2 操作符 30 4.2.1 算术操作符 31 4.2.2 关系操作符 33 4.2.3 相等关系操作符 33 4.2.4 逻辑操作符 34 4.2.5 按位操作符 35 4.2.6 归约操作符 36 4.2.7 移位操作符 36 4.2.8 条件操作符 37 4.2.9 连接和复制操作 37 4.3 表达式种类 38 第5章 门电平模型化 39 5.1 内置基本门 39 5.2 多输入门 39 5.3 多输出门 41 5.4 三态门 41 5.5 上拉、下拉电阻 42 5.6 MOS开关 42 5.7 双向开关 44 5.8 门时延 44 5.9 实例数组 45 5.10 隐式线网 45 5.11 简单示例 46 5.12 2-4解码器举例 46 5.13 主从触发器举例 47 5.14 奇偶电路 47 第6章 用户定义的原语 49 6.1 UDP的定义 49 6.2 组合电路UDP 49 6.3 时序电路UDP 50 6.3.1 初始化状态寄存器 50 6.3.2 电平触发的时序电路UDP 50 6.3.3 边沿触发的时序电路UDP 51 6.3.4 边沿触发和电平触发的混合行为 51 6.4 另一实例 52 6.5 表项汇总 52 第7章 数据流模型化 54 7.1 连续赋值语句 54 7.2 举例 55 7.3 线网说明赋值 55 7.4 时延 55 7.5 线网时延 57 7.6 举例 57 7.6.1 主从触发器 57 7.6.2 数值比较器 58 第8章 行为建模 59 8.1 过程结构 59 8.1.1 initial 语句 59 8.1.2 always语句 61 8.1.3 两类语句在模块中的使用 62 8.2 时序控制 63 8.2.1 时延控制 63 8.2.2 事件控制 64 8.3 语句块 65 8.3.1 顺序语句块 66 8.3.2 并行语句块 67 8.4 过程性赋值 68 8.4.1 语句内部时延 69 8.4.2 阻塞性过程赋值 70 8.4.3 非阻塞性过程赋值 71 8.4.4 连续赋值与过程赋值的比较 72 8.5 if 语句 73 8.6 case语句 74 8.7 循环语句 76 8.7.1 forever 循环语句 76 8.7.2 repeat 循环语句 76 8.7.3 while 循环语句 77 8.7.4 for 循环语句 77 8.8 过程性连续赋值 78 8.8.
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页