簡體   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