集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 11935|回复: 30

FPGA初级课程第二讲 Verilog的语法(与门)

[复制链接]
lcytms 发表于 2016-10-31 20:21:51 | 显示全部楼层 |阅读模式
FPGA初级课程
第二讲 Verilog的语法(与门)

Hi,大家好!我是至芯科技的李老师。
今天讲课的题目是:Verilog的语法(与门)。
本节课我先简要地介绍一下Verilog HDL语言的基础语法,再实际演示一下一个与门电路的建模与仿真,包括前仿和后仿。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-10-31 20:28:49 | 显示全部楼层
本帖最后由 lcytms 于 2016-10-31 20:33 编辑

我们打开《08至芯科技奋斗的小孩之altera 系列 第八篇 Verilog基础语法.pdf》文件。

在Verilog语言中,可综合的语句(可以被综合成电路)并不多,本篇中着重介绍可综合语句,不可综合语句后续再来介绍。
模块(module)是verilog HDL设计当中的基本组成单元,每个设计都是由一个或者多个模块构成,为了能更好地完成设计,我们先来学习模块的写法。

注意:在设计当中,应该在英文状态下输入,否则将会出现语法错误。Verilog HDL 是区分大小写的。
模块必须以关键字module开始,以关键字endmodule结束,例:
module <模块名> (<端口名称,&#8226;&#8226;&#8226;,端口名称>);
        <端口方向> <端口类型> <端口位宽><端口名称>;
        &#8226;&#8226;&#8226;&#8226;&#8226;&#8226;
        &#8226;&#8226;&#8226;&#8226;&#8226;&#8226;
endmodule
端口的方向:input(输入),output(输出),inout(双向端口)。
端口类型:wire(可以省略不写),reg。
端口的位宽:[X -1:0](定义一个位宽为X的总线)。

中间寄存器或中间连线,定义方法如下:
wire [X-1:0] <名称>;
reg [X-1:0] <名称>;

下面介绍verilog建模的方法:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-10-31 20:45:29 | 显示全部楼层
本帖最后由 lcytms 于 2016-10-31 20:50 编辑

这里,我们结合李凡老师的《hdl设计与实践讲义》来进行讲解,介绍三种建模方式。


参见4.2.1 三种建模方式

HDL建模时,可根据其对信号描述方式的不同分为以下三种:
        1、数据流建模
        2、行为建模
        3、结构化建模

数据流建模,是指在模块中对信号资源(或组合逻辑的连接)的描述。
行为建模,是指在模块中对信号的行为进行的描述。
结构化建模,是指将多个模块组织成一个更大的模块而进行的描述。

通常的建模方式往往由上述三种方法之一或它们的组合完成。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-10-31 20:53:12 | 显示全部楼层
再回到《08至芯科技奋斗的小孩之altera 系列 第八篇 Verilog基础语法.pdf》文件。

下面介绍verilog建模的方法:

1. 结构建模

在学习结构建模之前,我们首先先来学习一下,怎么样调用模块实例。
假设我们已经写好了一个二选一多路选择器的代码,如下:
module mux21 (dataa,datab, outdata, sel);
        input [2:0] dataa;
        input [2:0] datab;
        inpur sel;
        outdata [2:0] outdata;
        &#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;
        &#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;&#8226;
endmodule
那么我们应该怎么样去调用它呢?如下:
<模块名><实例名>(
                .端口(连线),
                .端口(连线)
        );

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-10-31 20:58:15 | 显示全部楼层
下面是用结构建模的方式实现三选一:
module mux31 (dataa, datab, datac, sel1, sel2, outdata);
        input [2:0] dataa;
        input [2:0] datab;
        input [2:0] datac;
        input sel1;
        input sel2;
        output [2:0] outdata;
        wire [2:0] data;

        mux21 mux21_dut1(
                        .dataa(dataa),
                        .datab(datab),
                        .outdata(data),
                        .sel(sel1)
                );

        mux21 mux21_dut2(
                        .dataa(data),
                        .datab(datac),
                        .outdata(outdata),
                        .sel(sel2)
                );
endmodule

上述建模是利用了两个二选一多路选择器来构成了一个三选一多路选择器。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-10-31 21:00:53 | 显示全部楼层
2. 数据流建模。

使用assign 语句进行赋值,例如:
assign outdata = indata1 + indata2;
上述赋值执行的方式:当等号右端的数据发生变化时,右端的表达式就会被重新计算,然后赋给等号左侧的变量。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-10-31 21:08:20 | 显示全部楼层
3. 行为建模。

使用always 进行建模,例如:
always @ (posedge clk)
        if(rst)
                outdata <= 0;
        else
                outdata <= indata;
1) always 语句是重复执行的.
2) 括号里面的内容为敏感变量,当敏感变量有变化时,always语句执行一次。
3) 当敏感列表里面是posedge (上升沿)或者negedge(下降沿)时,用来描述时序逻辑,直接为某个电平时,用来表示组合逻辑。
4) 时序逻辑用<=(非阻塞)赋值,组合逻辑用=(阻塞)赋值。
5) 凡是在always模块当中被赋值了,都应该定义成reg的形式。

上述只是很简单的介绍了语法,如果还是不明白的小伙伴可以直接看笔者后续的内容,在应用中,慢慢去体会这些语法。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-10-31 21:14:01 | 显示全部楼层
我们再打开李凡老师的《FPGA设计概述(李凡).pdf》讲义。

我们在没有抽象电路模型之前,一定要在得到实际的电路硬件之后,我们才能够知道这个设计是否有缺陷,是否需要调整。
早期的验证跟Test是类似的,早期的设计里面也有面向测试的设计。
但是验证Verification,它不需要硬件,只需要有一段代码,就知道会发生什么,不会发生什么,逻辑上是否如此,时序上是否如此。
并且支持第三方工具,这些都是抽象电路模型所起的作用。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-10-31 21:21:28 | 显示全部楼层
这个抽象电路模型就是一道门槛,设计者把设计思想用正确的方式描述出来,EDA根据描述正确理解了,就能发生效率上的巨大提升。
这种描述如何变成FPGA最终的硬件实现呢?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
 楼主| lcytms 发表于 2016-10-31 21:24:46 | 显示全部楼层
本帖最后由 lcytms 于 2016-10-31 21:26 编辑

抽象电路模型它有一个好处,就是能进行早期的验证。
验证怎么做呢?
在现在的理论体系下面,一直在说这两件事情,一个是原始的验证,Original,一个是基于Testbench的验证。
现在是保留原始的验证,而特别强调基于Testbench的验证。

我们之所以向大家推荐Testbench,是因为全世界都在向这个方向发展。
Testbench是怎么回事呢?
Testbench是将我们编制的语言描述的电路模型,置入一个抽象的平台,对它的输入加以激励,信号的激励用抽象的方式来生成,观察它的输出和内部信号。

Testbench便于重复地进行观测,比原始的验证要具有更好的可维护性。
Testbench本质上仍旧是一段HDL建模代码,它本身并不能运行。
运行它的方式呢,需要把它转变为目标机器上可执行的代码,这个过程称为仿真。
前仿验证的是功能,加载的模型是RTL,后仿验证的是时序,验证的模型是gate-level的模型。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?我要注册

x
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2024-12-24 03:10 , Processed in 0.065198 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表