我的 FPGA 学习历程(15)

您所在的位置:网站首页 almays 我的 FPGA 学习历程(15)

我的 FPGA 学习历程(15)

#我的 FPGA 学习历程(15)| 来源: 网络整理| 查看: 265

在本篇里,我们讨论 Verilog 语言的综合问题,Verilog HDL (Hardware Description Language) 中文名为硬件描述语言,而不是硬件设计语言。这个名称提醒我们是在描述硬件,即用代码画图。

在 Verilog 语言中,always 块是一种常用的功能模块,也是结构最复杂的部分。笔者初学时经常为 always 语句的编写而苦恼,不知道使用哪种赋值语句,不了解两种赋值之间的区别。究其本质是对 always 语句的综合一知半解,常年使用软件思维编写代码所致。

现在我总结出:always 块的综合可以分为至少三类电路,由于历史原因,三种电路均使用 always 关键字。

此外 reg 关键字也存在一些迷惑性,综合器并不一定生成寄存器。 reg 在 verilog 语法中的定义为变量,它有可能是寄存器,也有可能是连线。

第一类就是组合逻辑,如代码 1-1 和 代码 1-2

// 1-1 组合逻辑 always @ (*) begin if(a>b) q = 1; else q = 0; end

代码 1-1 是展示了一个简单组合逻辑的 always 块,它应该被综合成一个一位的比较器。

// 1-2 组合逻辑,缺少敏感信号 always @ (a) begin if(a>b) q = 1; else q = 0; end

代码 1-2 也是一个组合逻辑,与 1-1 不同的是,敏感信号列表中没有 b。

我们知道,在 Verilog 语法中, always 块的含义是一个重复执行的语句。

那么 1-2 会综合成一个比较器:

当 a 发生变化时,q 发生变化 当 b 发生变化,由于 b 不再敏感信号列表中,所以 q 不变

这是一个彻头彻尾的软件思维,世界上不存在这种电路,综合器多半会综合一个与代码 1-1 一样的电路,然后报一个警告。

编写组合逻辑的 always 块,使用 * 代替敏感信号列表是一个简单方便而且不容易出错的好办法。

第二类就是时序逻辑

// 2-1 时序逻辑 reg [1:0] q; always @ (posedge clk) begin q


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3