繁体   English   中英

与使用该语言的标准操作相比,用C语言对数字电路建模是否具有任何实际好处?

[英]Does modeling digital circuits in C have any practical benefits as opposed using the language's standard operations?

因此,我开始研究数字电路设计,并发现几乎所有操作(我知道)都源自3个逻辑运算: ANDORNOT 作为类推,这些原子就像是构成其他所有原子的亚原子粒子。 亚原子粒子成为逻辑门,而原子则成为处理器指令。 如果在Assembly中编程就像将原子放在一起,那么在C中编程就像将分子(和原子)放在一起。 请有人告诉我我是否要离开这里。

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

免责声明:我开始研究数字电路以尝试学习组装,并且在C语言中很公平。我想在C语言中对其中的一些电路进行建模,以进一步理解数字电路,因为这些是我所理解的术语。 但是我不想引诱自己一种幻觉,即使用简单+会行之有效的代码(或者学习以外的任何其他实际好处)。 是的,我知道代码的可怕的可维护性将远远超过此编码“样式”可能提供的任何好处。

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

即使由世界上最好的x86汇编语言编码人员组成的精干团队参加会议来设计理想的代码片段以实现机器语言的完整加法器,上述事实也是正确的。 换句话说,它没有反映出编译器无法充分良好地优化C。

但是,在一台给定计算机上对逻辑电路进行软件仿真可能比使用与该计算机不同技术(特别是较旧的技术)构建的电路更有效。 例如,在带有集成I / O的现代,快速微控制器芯片上运行的程序,与其在离散,通孔晶体管中组合而成的东西相比,可能在其GPIO引脚上表现出更快的加法器,并且几乎可以肯定它所占用的时间更少空间,并且可能需要较少的电流。

我一直牢记,构建数字电路与汇编编程没有什么不同。 我之前曾说过,电子设备就像物理操作码。

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

除了汇编/操作码之外,我真的无法想到将高级语言与电子产品进行类比的方法。

尽管您可以使用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

这意味着:每当clock从0变为1时,在ab之间交换值。

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

如果您熟悉数字电路,您将认识到“总是”循环看起来实际上是这样翻译的:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM