当前课程知识点:IC设计与方法 > 3、Verilog语法 > d)Assign 语句 > 3-1-4assign语句
我们前面已经讲完了
一些基本的语法要素
包括怎么定义电路的名字
怎么定义端口和信号
下面我们要来看
怎么描述一个电路的内部结构了
我们看一下
在这页幻灯片上
我们列举了Verilog语言以及VHDL语言
设计一个电路的内部特性的时候
设计具体实现的电路的时候
能够用哪些技术手段
大体来说有三大类技术手段
一种是用连续赋值语句
描述一个简单的电路
第二种是用过程描述一个相对复杂的电路
第三种是用元件例化语句
描述一个别人已经设计好的电路
或者换句话说
我们可以把别人设计好的电路
直接拿过来用到我们的电路里面
所以这是我们用硬件描述语言
设计电路的三个手段
在用过程的手段里面
在过程里又可以用到这四种语法
来实现过程内部的电路
或者说内部的电路细节
包含阻塞赋值、非阻塞赋值
if语句和case语句
从这里面我们可以看到
一共有七个关键字
也就是说
用Verilog语法去设计电路的时候
一共有这七个关键字就能够实现电路了
加上前面我们所描述的
定义端口、定义信号
一共加起来
也就不超过二十个关键字
用这些手段就能够完成
任意复杂度的电路的设计
从另一个角度来说
不管多复杂的电路
我们只需要用不超过20个关键字
就可以把它设计出来了
如果你觉得用这些语法知识
还不能够把电路表述出来
那一定就是你的设计思路
或者说设计方法上有问题了
我们首先来看一下连续赋值语句
连续赋值语句
通常是用来实现组合逻辑电路
看一下这一页幻灯片
在这个电路里
在这个代码里
我们先看一下电路的外特性
因为我们刚刚接触硬件描述语言
所以
碰到简单的电路
我也会从头分析
到后面的例子
我们就只看核心部分了
就不再一一的去讲了
这个电路模块的名字叫test
它有3个输入输出端
其中有两个out1和out2是输出信号
in是输入信号
在这里面
后边这部分描述了电路的内特性
我们用了assign语句
连续赋值语句
我们来看一下第一个例子
是把输入信号求反后赋给输出信号out2
这相当于是一个非门
在这里面
因为举的例子非常简单
所以就只用了一个非门来表示
实际上这个等号后面可以是
一个任意复杂的布尔函数
换句话说
这条assign语句可以实现任意复杂度的
产生一个输出信号的组合逻辑电路
这么一句话就够了
第二个例子
一个比较复杂的结构
这个语法结构和C语言的描述方式是类似的
或者说完全一样的
根据sel信号的值来判断
如果sel信号是1
有效的时候把i1送给out
如果是0的话
把i0送给out
从电路的角度来说
这条语句相当于描述了一个多路选择器
这就是assign语句的比较典型的两个例子
总结一下:assign语句可以用来实现
比较简单的组合逻辑电路
有时候有一些特例
我们在定义电路内部信号的时候
可以直接把assign语句
跟信号定义结合在一起
这样代码写起来或看起来会更简洁一些
但实际上在工程里
不太建议这么使用
工程里强调的是做事情非常规则
信号定义wire a就放在这
然后电路的功能放在下面
这样
所有的代码看起来都非常的规整
当你的代码从几十行
变成几百行甚至上千行的时候
工程上的规范性就非常重要了
我们再来看一下更多的assign的例子
前面这几个例子
前面这两个例子已经讲过了
就不多说了
看一下稍微复杂一点的例子
如果我们有多个信号
需要用不同的assign去写的时候
我们可以看到
可以把多个语句写在一起
中间用逗号隔开
这也是assign的一种风格
当然在我们这门课里面
或者说我个人不推荐这种风格
我希望大家在写代码的时候
都按照规矩一行一行的写清楚
代码写得很简洁
或者代码写的行数少
从工程的角度来说
没有任何实际的意义
工程人员或者说我们作为项目而言
我们只关心最终设计出来的芯片的面积大小
如果你做出来的芯片只有1000门
代码写了1万行
不是问题
如果你的代码写了1000行
但是做出来电路有10万门100万门
那就是问题了
后面两行是一个比较复杂的例子
我们来看一下
在这一行里
在倒数第二行里
是把a b cin三个信号加起来以后
产生一个输出
这个输出
因为位宽变宽了
位宽一定会比a和b的位宽更宽
所以输出(可以)分别赋到两个信号
低位赋给了s
高位赋给了cout
这也是一种使用方式
换句话说
assign语句产生电路
可以根据输出结果的位宽
赋给几个不同的信号
最后一个例子
我们来看一下
最后的例子
是从原始信号byte里面取出了它的第7位
也就是它的最高位第7位
我们可以假设这个信号是一个8位信号
我们把最高位取出来以后
用大括号给它扩展成两倍
相当于是把最高位又扩展了两位
再和原始的数据合并成一个新的矢量
新的更宽的矢量
如果原始的byte是一个8位信号
合并完的信号就变成了一个10位的信号
这个10位信号的最高两位
和原来信号的第八位是一样的
变成一个新的10位信号赋给out
那工程上这是什么意思呢
相当于把一个8位的有符号数
它的符号位扩展了一下
把8位信号变成了一个10位信号
相当于把有符号数
把8位有符号数变成了10位的有符号数
这也是工程里面常见的一种形式
好 回过头来
我们忘了刚开始的这条assign语句
这条语句跟前面的例子稍微有一点点不同
我们在assign前面加了一个#2
在这里面 #2表示延时两个时间单位
我们看一下右边这张图
就是它实现的一个效果
这个输出信号相对输入信号
经过两个时间单位以后才变化
这个时间单位到底是多少
要结合整段Verilog代码
在刚开始定义的延时单位
我们后面讲到测试的时候会讲延时的概念
这就是assign语句几种实际的应用的例子
在这些例子里
我们看到
对信号的操作
或者说信号的运算
我们举了例子
有加减等等这些运算
这些运算
实际上对应的都是一些电路
在Verilog语言里面定义了哪些运算
我们这都给大家列出来了
大概有这些类型的运算
第一类是算术运算
算术操作
加减乘除取模等等
在这里面我们如果写代码的时候
每用到一个运算符号
实际上在工程里面相当于
是出现了一个小的电路模块
这个电路模块
实现一个加法器、一个减法器
一个乘法器或者一个取模电路等等
我们在代码里面
如果要用到除法的时候一定要特别的慎重
大家可以回想一下
除法
如果是除2、除4、除8等等
这些除以2的n次方这样的运算
大家想一想
是什么效果
相当于是把一个有一定位宽的数
右移了若干位
除2的话
相当于是右移一位
除4的话
相当于是右移两位
但如果说让你去设计一个除3的电路
或者说除5的电路
电路是什么效果呢
会变得非常非常的难实现
所以我们在做除法的时候
如果你想要用到除法符号的时候
一定要想清楚
如果只是去做电路的仿真
去模拟一下
你可以除以任何的数
但如果是想设计出一个具体电路
那只能允许除以2的幂次方
第二类是关系操作
可以用大于、小于、大于等于等等这些操作
和C语言相类似
表述方式也和C语言相类似
原因是因为Verilog语言和C语言是非常相似的
这些操作也会映射出具体的电路
我们的代码里面(如果)写了个大于号
它变成最终的电路的时候
就会出现一个比较器
再往下是一些逻辑运算的操作
包括与或非等等
以及位操作和归约操作
具体这些操作是什么意思
我们后面结合实际的例子来看
和C语言类似
我们还有移位操作和条件操作
移位操作
我们刚才说了
表示把一个信号可以右移多少位
或者是左移多少位
在电路里对应的是相当于从信号里
取出若干位出来
还有就是连接和复制操作
在刚才的例子里已经用的比较多了
具体每一个操作的语法是什么样子
在我们这门课里面
不会特别去强调
因为大家可以从各种网络上的资源
从参考书里面去找到
所以我这只是给大家归类总结了一下
有这些操作可以去使用
方便我们的电路设计
下面我们再来看一下逻辑操作
位操作和规约操作
它们的差异
举个例子
如果是a是这么一个数(1011)
b是这么一个数(0010)
如果是位操作
它对应的是两个二进制数的逐位操作的过程
比如说a或上b
就是a和b的每一位相或所得到的结果
也就是说位操作
是按输入的数据
逐位去进行运算
归约操作的结果
只会出一个比特的结果
比如说这个a前面加一个或
表示把a的每一位都做相同的或运算
最后得到输出
第三个是逻辑操作
逻辑操作相当于是把a和b的值
按照这个要求去运算
比如说a或上b
表示判断a、b里边是不是都是非零的值
然后得到一个逻辑条件
这种操作
通常用在条件判断语句里面
去判断条件是不是发生了
我们这里面再来看一下
实际我们用到这些操作
它的物理意义,是什么物理意义
刚才我们已经提到了
每一个操作
它对应的都是一个电路
我们来看一下实际是什么情况
以左边这段代码为例
c是由a、b相加得到的
这样一条assign语句对应的代码
所得到的电路就是这样一个电路
我们看一下右面的电路
a和b相加以后得到c
所以实际上会映射出一个加法器
bigger信号是由a大于b产生的
a大于b就会映射出一个比较器
这个比较器的输出就是bigger信号
然后eq信号是由a、b的相等判断的
逻辑操作得到的
所以eq信号由一个等于判断的比较器
产生的输出信,是eq信号
这是我们左面这段代码
直接通过翻译以后映射出来的原始电路
右下角这张图是实际在EDA软件里面
产生出来的具体的电路结构
从这里面我们可以看到每一个操作
每一个信号操作
都会实际映射出一个子电路出来
这个子电路有可能会非常的复杂
也有可能会很简单
只是一根连线
所以还是刚才我们提到的这句话
在Verilog设计的时候
我们虽然写的是类似于C语言的程序
但是大家的脑子里面要想的是
这段程序背后对应的是一个什么样的电路
这个概念是一定要有的
有了这个概念以后脑子里
才会始终绷着一根弦
我写的这段代码
它对应的电路是什么样子
脑子里有了这个电路以后
我们才会去想
我怎么才能去改变电路结构
或者说改变代码以后
用一个更好的电路结构去实现它
-软件下载说明
-a) 集成电路的应用及市场
-a) 集成电路的应用及市场--作业
-b)集成电路的制造过程
-b)集成电路的制造过程--作业
-c)从CPU的发展看IC的进展
-c)从CPU的发展看IC的进展--作业
-d)从行业的发展看IC的进展
--Video
-d)从行业的发展看IC的进展--作业
-e)从ISSCC看IC的发展方向
--讲课视频
-e)从ISSCC看IC的发展方向--作业
-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)
--讲课视频
-a)数字系统的实现方法 (ASSP/FPGA/ASIC的对比)
-b)组合逻辑电路
--Video
-2、数字集成电路设计方法--b)组合逻辑电路
-c)时序逻辑电路(1)
-d)时序逻辑电路(2)
-2、数字集成电路设计方法--d)时序逻辑电路(2)
-a)Verilog的历史和学习要点
--讲课视频
-b)端口、信号及数据类型
--讲课视频
-b)端口、信号及数据类型--作业
-c)逻辑电平及数据操作
--讲课视频
-3、Verilog语法--c)逻辑电平及数据操作
-d)Assign 语句
-e)Assign 举例
-f)Always
-f)Always--作业
-g)阻塞与非阻塞赋值
--Video
-3、Verilog语法--g)阻塞与非阻塞赋值
-h)D触发器的描述
--Video
-i)时序电路的设计
--Video
-i)时序电路的设计--作业
-j) 面向测试的Verilog语法(1)
-k) 面向测试的Verilog语法(2)
-k) 面向测试的Verilog语法(2)--作业
-a)电路设计实例1
--Video
-b)电路设计实例2
--讲课视频
-b)电路设计实例2--作业
-c)电路设计实例3
--讲课视频
-Modelsim仿真
-a)综合及相关基本概念
--Video
-a)综合及相关基本概念--作业
-b)综合及优化
--Video
-c)门级仿真
--门级仿真
-d)Quartus综合及分析(1)
--讲课视频
-e)Quartus综合及分析(2)
--讲课视频
-e)Quartus综合及分析(2)--作业
-f)Quartus综合及分析(3)
--Video
-g)Quartus综合及分析(4)
--Video
-g)Quartus综合及分析(4)--作业