-1

因此,我开始研究数字电路设计并发现几乎每个操作(我知道)都源自 3 个逻辑操作:ANDORNOT。作为一个类比,这些有点像构成其他一切的原子的亚原子粒子。亚原子粒子之于逻辑门,就像原子之于处理器指令一样。如果用汇编编程就像把原子放在一起,那么用 C 语言编程就像把分子(和原子)放在一起。 有人请告诉我,如果我在这里离开基地。

话虽如此,我知道 GCC 和大多数其他编译器在从 C 到机器代码的优化方面做得很好。假设我们正在查看 x386 指令集。$$如果我只使用、||和构建一个 32 位全加器~编译器是否足够聪明,可以使用处理器提供的现有指令,或者我的全加器最终会成为一个更臃肿、效率更低的版本处理器。

免责声明: 我开始研究数字电路是为了开始学习汇编,我在 C 语言中是公平的。我想用 C 语言对这些电路中的一些电路进行建模,以进一步了解数字电路,因为这些是我理解的术语。但我不想引诱自己误以为使用简单的代码也会是高效的代码(或学习以外的任何其他实际好处)+。是的,我知道代码的可怕可维护性将远远超过这种编码“风格”可能提供的任何好处。

4

3 回答 3

2

全加器的软件模拟永远不会比使用与运行软件模拟的硅相同技术的逻辑门构建的全加器高效。运行模拟所涉及的门数将远远超过硬件加法器中的门数,并且传播延迟将显着延长,特别是如果您包括使模拟作为真正的加法器运行所需的 I/O 处理,它接受并产生电子信号,这意味着代码必须读写实际的 CPU 或外围 I/O 引脚。

即使世界上最好的 x86 汇编语言编码人员的精明团队聚集在一次会议上,设计出理想的代码片段以用机器语言实现全加器,上述情况也是正确的;换句话说,它并不反映编译器无法充分优化 C。

但是,在给定计算机上对逻辑电路进行软件模拟可能比使用与该计算机不同的技术(特别是旧技术)构建的电路更有效。例如,在具有集成 I/O 的现代、快速微控制器芯片上运行的程序可能会在其 GPIO 引脚上表达一个更快的加法器,而不是由分立的通孔晶体管拼凑而成的东西,而且几乎肯定会占用更少空间,并且可能需要更少的电流。

于 2014-01-08T01:10:18.630 回答
1

尽管您可以使用 C 来描述数字电路(实际上,Verilog HDL 与 C 有一些相似之处),但有一个基本的东西是您无法用纯 C 建模的:并行性。

如果有任何属于数字电路描述的东西,那就是它在描述本身中固有的并行性:功能(实际上是模块),甚至代码块都是并行“执行”的。

任何普通的 C 程序随时间描述一系列操作,因此,任何描述数字操作的尝试,除非它是非常微不足道的,都将被编译为一系列步骤,而不是利用数字电路本质上具有的并行性.

也就是说,确实存在一些与 C 相当接近的 HDL(硬件描述语言)。其中之一是Handel-C。Handel-C 使用从 C 中借用的语法,加上一些附加功能以更好地处理数字设计中存在的固有并行性。

例如:假设你要交换两个变量的值。经典解决方案(除了基于按位运算等的解决方案)是:

temp = a;
a = b;
b = temp;

但是,当有人在学习计算机编程时,将上述序列编码为这样的常见错误:

a = b;
b = a;

因为我们认为在变量交换中是一种并行操作:“ b 的值被复制到 a,同时 a 的值被复制到 b ”。

这种方法的有趣之处在于它确实有效……如果我们设法并行执行这两个任务。在普通 C 中不可能的东西,但在 Handel-C 中是不可能的:

par
{
  a = b;
  b = a;
}

par语句表明每个代码行将相对于其他代码行并行“执行”。

在 Verilog 中,相同的交换会写成这样:

a <= b;
b <= a;

<=是 Verilog 中的非阻塞赋值:在第一行完成后,第二行没有“执行”,而是同时开始。这个序列通常出现在一个时钟始终(一种循环,每次灵敏度列表中的时钟信号从 0 变为 1 - posedge- 或从 1 变为 0 - negedge- 时“执行”的一种循环)。

always @(posedge clk) begin
  a <= b;
  b <= a;
end

这意味着:每次clock0 到 1 时,交换 和 之间的ab

请注意,当我谈到数字设计的语言时,我总是引用“执行”。代码实际上并没有转化为要由处理器执行的一系列操作,但代码是一个电路。将其视为 2D 原理图的 1D 渲染,用句子和运算符代替电子符号,用赋值、参数和“函数调用”代替电线。

如果您熟悉数字电路,您会意识到“总是”循环看起来很相似,实际上可以翻译成这样:

两个触发器,输出相互连接

仅将相同的高级描述转换为汇编是您无法做到的(除非目标处理器的 ISA 具有某种XCHG指令,这实际上并不少见,并且代码保留了两个变量以交换到 CPU寄存器)。

于 2014-01-08T01:31:42.060 回答
1

我一直认为构建数字电路与组装编程没有什么不同。我之前说过电子设备就像物理操作码。

对于 C 智能将逻辑加法器编译到 ADD 指令的问题。不,它不会。嵌入式开发中有一些例外,例如 AVR 和 avr-gcc 具有正确的优化标志将转REGISTER|=1<<bitREGISTER&=~(1<<bit)转为位设置和清除指令,而不是执行逐字加载、逻辑、存储。

除了汇编/操作码之外,我真的想不出高级语言与电子学的类比。

于 2014-01-08T00:50:13.353 回答