从零开始学FPGA -- Verilog模块调用、阻塞与非阻塞赋值、状态机

本文介绍了Verilog中模块调用的两种方式,强调了端口顺序的重要性,并解释了阻塞与非阻塞赋值在组合逻辑和时序逻辑中的应用。同时,通过电子密码锁的状态机示例,阐述了状态机设计的基本概念和三段式状态机的实现方法。
摘要由CSDN通过智能技术生成

在编写各种语言时,正确良好的注释是必不可少的,一般我们最少要保证3:1的代码注释比例,即3句代码至少一个注释。Verilog有两种注释方式:
单行注释:以 // 开头
多行注释:以 /* 开始,以 */ 结束

一、Verilog调用模块

Verilog的基本设计单元是“模块”。一个模块是由两部分组成的,一部分描述接口,另一部分描述逻辑功能。每个Verilog程序包括4个主要的部分:端口定义、IO说明、内部信号声明、功能定义。

例如下面的代码:

module yuanlaishini(a,b,c,d);
	input a,b;
	output c,d;
reg [23:0] counter;
assign c = a | b;
assign d = a & b;

endmodule

每个模块都是以module开始,endmodule结束。yuanlaishini为模块名,在实际中我们应该起一个比较“正经”的名字,最好是能体现模块功能的名字。上述例子中(a,b,c,d)即为端口定义,描述了本模块都有哪些端口,input a,b;与output c,d; 即为IO说明,reg [23:0] counter为内部信号声明;assign在前面已介绍过,它是一种给wire类型赋值的,assign这两句即为功能定义

功能定义有三种方法:assign语句是来描述组合逻辑;always语句是来描述组合/时序逻辑;例化实例元件(如:and #2 u1(q,a,b);)
上述三种逻辑功能是并行的,这也是FPGA最重要的一个特点,在C语言中,谁在前面谁先执行,但在verilog中无论多个always或assign如何放置,他们都是并行同时执行的。在always块中,逻辑是顺序执行的,而多个always块之间是并行的。

那么不同模块之间如何调用呢?
我们考虑一个简单的全加器模块:
在这里插入图片描述

module add(a,b,cin,s,cout);
	input a,b,cin;
	output cout,s;
	assign {cout,s} = a + b + cin;
endmo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值