3.2 逻辑设计和硬件控制语言HCL

发布时间 2023-05-27 10:24:11作者: C~A
在硬件设计中,用电子电路来计算对位进行运算的函数,以及在各种存储器单元中存储位。大多数现代电路技术都是用信号线上的高电压或低电压来表示不同的位值。在当前的技术中,逻辑1是用1.0伏特左右的高电压表示的,而逻辑0是用0.0伏特左右的低电压表示的。要实现一个数字系统需要三个主要的组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器单元,以及控制存储器单元更新的时钟信号。
逻辑门
逻辑门是数字电路的基本计算单元。他们产生的输出,等于它们输入位值的某个布尔函数。逻辑门只对单个位的数进行操作,而不是整个字。逻辑门总是活动的,一个输入门变化了,在很短的时间内输出也回相应变化。
组合电路和HCL布尔表达式
将很多的逻辑门组合成一个网,就能构建计算块(computational block),称为组合电路(combinational circuits)。如何构建这些网有几个限制:
每个逻辑门的输入必须连接到下述选项之一:1)一个系统输入(称为主输入),2)某个存储器单元的输出,3)某个逻辑门的输出。
两个或多个逻辑门的输出不能连接在一起。否则它们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电路故障。
这个网必须是无环的。也就是在网中不能有路径经过一系列的门而形成一个回路,这样的回路会导致该网络计算的函数有歧义。
HCL.表达式很清楚地表明了组合逻辑电路和C语言中逻辑表达式的对应之处。它们都是用布尔操作来对输入进行计算的函数。值得注意的是,这两种表达计算的方法之间有以下区别:
因为组合电路是由一系列的逻辑门组成,它的属性是输出会持续地响应输入的变化。如果电路的输入变化了,在一定的延迟之后,输出也会相应地变化。相比之下,C表达式只会在程序执行过程中被遇到时才进行求值。
C的逻辑表达式允许参数是任意整数,0表示FALSE,其他任何值都表示TRUE。而逻辑门只对位值0和1进行操作。
C的逻辑表达式有个属性就是它们可能只被部分求值。如果一个AND或OR操作的结果只用对第一个参数求值就能确定,那么就不会对第二个参数求值了。例如下面的C表达式:
(a && !a) && func(b,c)
这里函数func是不会被调用的,因为表达式(a &&!a)求值为0。而组合逻辑没有部分求值这条规则,逻辑门只是简单地响应输入的变化。
字级的组合电路和HCL整数表达式
 通过将逻辑门组合成大的网,可以构造出更复杂函数的组合电路。执行字级运算的组合电路根据输入字的各个位,用逻辑门来计算字的各个位。组合逻辑电路可以设计成在字级数据上执行许多不同类型的操作。
算术逻辑单元ALU是一种很重要的组合电路,这个电路有三个输入,标号AB的两个数据输入,以及一个控制输入。根据控制输入的设置,电路会对数据输入执行不同的算术或逻辑操作。
 存储器和时钟
组合电路从本质上讲,不存储任何信息。相反,它们只是简单地响应输入信号,产生等于输入的某个函数的输出。为了产生时序电路(sequential circuit),也就是有状态并且在这个状态上进行计算的系统,我们必须引入按位存储信息的设备。存储设备都是由同一个时钟控制的,时钟是一个周期性信号,决定什么时候要把新值加载到设备中。
考虑两类存储器设备:
时钟寄存器(简称寄存器)存储单个位或字。时钟信号控制寄存器加载输入值。
随机访问存储器(简称内存)存储多个字,用地址来选择该读或该写哪个字。随机访问存储器的例子包括:1)处理器的虚拟内存系统,硬件和操作系统软件结合起来使处理器可以在一个很大的地址空间内访问任意的字;2)寄存器文件,在此,寄存器标识符作为地址。在IA32或Y86-64处理器中,寄存器文件有15个程序寄存器(rax~r14)。
寄存器工作状态:大多数时候寄存器都保持在稳定状态,产生的输出等于它的当前状态。信号沿着寄存器前面的组合逻辑传播,这时产生一个新的寄存器输入,但只要时钟信号是低电位的,寄存器的输出就保持不变。当时钟变成高电位是,输入信号就加载到寄存器中,成为下一个状态,知道下一个时钟上升沿,这个状态就是寄存器的输出。寄存器是作为电路不同部分中的组合逻辑之间的屏障。
寄存器文件有两个读端口(A和B),还有一个写端口(W)。这样一个多端口随机访问存储器允许同时进行多个读和写操作。图中所示的寄存器文件中,电路可以读两个程序寄存器的值,同时更新第三个寄存器的状态。每个端口都有一个地址输入,表明该选择哪个程序寄存器,另外还有一个数据输出或对应该程序寄存器的输入值。地址是用编码表示的寄存器标识符。两个读端口有地址输入srcA和srcB(“source A”和“source B”的缩写)和数据输出va1A和va1B(“value A”和“value B”的缩写)。写端口有地址输入dstw(“destination W”的缩写),以及数据输入va1w(“value W”的缩写)。
向寄存器文件写入字是由时钟信号控制的,控制方式类似于将值加载到时钟寄存器。每次时钟上升时,输入va1W上的值会被写入输入dstW上的寄存器ID指示的程序寄存器。当dstw设为特殊的ID值0xE时,不会写任何程序寄存器。由于寄存器文件既可以读也可以写,一个很自然的问题就是“如果我们试图同时读和写同一个寄存器会发生什么?”答案简单明了:如果更新一个寄存器,同时在读端口上用同一个寄存器ID,我们会看到一个从旧值到新值的变化。