-1

だから私はデジタル回路設計を調べ始め、ほとんどすべての操作 (私が知っている) がすべて 3 つの論理操作から派生していることを発見しました: ANDOR、およびNOT。類推として、これらは、他のすべてを構成する原子に対する亜原子粒子のようなものです。アトムがプロセッサ命令にあるように、サブアトミック粒子は論理ゲートにある。Assembly でのプログラミングが原子を組み立てるようなものだとすれば、C でのプログラミングは分子 (および原子) を組み立てるようなものです。 私がここの基地から外れているかどうか誰か教えてください。

そうは言っても、GCC やその他のほとんどのコンパイラは、C から機械語コードへの最適化を非常にうまく行っていることは承知しています。x386 命令セットを見ているとしましょう。$$||、およびのみを使用して 32 ビットの全加算器を構築した場合~コンパイラはプロセッサによって提供される既存の命令を使用するのに十分スマートであるか、または私の全加算器は、既に存在するもののより肥大化した効率の悪いバージョンになってしまうでしょうか。プロセッサ。

免責事項: 私はアセンブリの学習を開始するためにデジタル回路を調べ始めました.Cで公正です.デジタル回路の理解を深めるために、これらの回路のいくつかをCでモデル化したい. +しかし、単純なwill doを使用すると、それが効率的なコード (または学習以外のその他の実用的な利点) にもなるという幻想に自分自身を誘惑したくありません。そして、はい、コードのひどい保守性が、このコーディング「スタイル」が提供する利点よりもはるかに重要であることを私は認識しています。

4

3 に答える 3

2

全加算器のソフトウェア シミュレーションは、ソフトウェア シミュレーションを実行するシリコンと同じテクノロジの論理ゲートで構築された全加算器ほど効率的ではありません。シミュレーションの実行に関与するゲート数は、ハードウェア加算器のゲート数をはるかに上回り、特にシミュレーション関数を受け入れる実際の加算器として必要な I/O 処理を含める場合、伝播遅延は大幅に長くなります。電子信号を生成します。つまり、コードは実際の CPU または周辺 I/O ピンを読み書きする必要があります。

上記のことは、世界最高の x86 アセンブリ言語コーダーのクラック チームがカンファレンスに集まり、機械語で全加算器を実装するための理想的なコードを設計したとしても当てはまります。つまり、コンパイラが C を十分に最適化できないことを反映していません。

ただし、特定のコンピューターでの論理回路のソフトウェア シミュレーションは、そのコンピューターとは異なるテクノロジ、特に古いテクノロジで構築された回路よりも効率的です。たとえば、統合された I/O を備えた最新の高速マイクロコントローラー チップで実行されるプログラムは、ディスクリートのスルーホール トランジスタを組み合わせたものよりも、GPIO ピンでより高速な加算器を表現できる可能性が高く、ほぼ確実に占有量が少なくなります。スペース、およびおそらくより少ない電流を必要とします。

于 2014-01-08T01:10:18.630 に答える
1

デジタル回路を構築することは、アセンブリでプログラミングすることと変わらないということを常に念頭に置いてきました。以前、エレクトロニクスは物理的なオペコードのようなものだと言いました。

論理加算器を ADD 命令にスマート コンパイルする C についての質問へ..いいえ、そうではありません。AVR や avr-gcc などの組み込み開発にはいくつかの例外があり、適切な最適化フラグを使用すると、逐語的なロード、ロジック、ストアを実行する代わりに、それらをビット セットおよびクリア命令に変換REGISTER|=1<<bitまたは変換します。REGISTER&=~(1<<bit)

アセンブル/オペコードを超えて、高水準言語をエレクトロニクスに例えることは本当に考えられません。

于 2014-01-08T00:50:13.353 に答える
1

C を使用してデジタル回路を記述できますが (実際、Verilog HDL には C に似たものがあります)、単純な C ではモデル化できない基本的なことが 1 つあります。それは並列処理です。

デジタル回路の記述に属するものがあるとすれば、記述自体に固有の並列処理です: 関数 (実際にはモジュール) と、コード ブロックでさえ並列に「実行」されます。

通常の C プログラムは時間の経過に伴う一連の操作を記述します。したがって、デジタル操作を記述しようとすると、それが非常に些細なものでない限り、一連のステップとしてコンパイルされ、デジタル回路が本来持っている並列処理を利用することはありません。 .

そうは言っても、C にかなり近い HDL (ハードウェア記述言語) がいくつか存在します。そのうちの 1 つがHandel-Cです。Handel-C は、C から借用した構文に加えて、デジタル デザインに固有の並列処理をより適切に処理するための追加機能を使用します。

例: 2 つの変数の値を交換する必要があるとします。古典的な解決策 (ビット演算などに基づく解決策以外) は次のとおりです。

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

しかし、誰かがコンピュータ プログラミングを学んでいる場合、上記のシーケンスを次のようにコーディングするのはよくある間違いです。

a = b;
b = a;

変数の交換を並列操作と見なすため、「b の値が a にコピーされ、その間に a の値が b にコピーされる」.

このアプローチの面白い点は、実際に機能することです...これら2つの割り当てを並行して実行できれば。普通の C では不可能なことですが、Handel-C では可能です:

par
{
  a = b;
  b = a;
}

このparステートメントは、各コード行が他のコード行と並行して「実行」されることを示しています。

Verilog では、同じ交換は次のように記述されます。

a <= b;
b <= a;

<=Verilog でのノンブロッキング割り当てです。最初の行が終了した後、2 行目は「実行」されませんが、両方が同時に開始されます。posedgeこのシーケンスは、通常、clocked always (センシティビティ リストのクロック信号が 0 から 1または1 から 0 に変化するたびに「実行される」ループの一種) 内にありますnegedge

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

これは、clockが 0 から 1 になるたびに、 と の間aで値を交換することを意味しますb

デジタル デザインの言語について話すときは、常に「実行された」という言葉を引用することに注意してください。コードは、実際にはプロセッサによって実行される一連の操作に変換されませんが、コードは回路です。電子記号の代わりに文と演算子を使用し、配線の代わりに割り当て、引数、および「関数呼び出し」を使用して、2D 回路図を 1D レンダリングしたものと考えてください。

デジタル回路に精通している場合は、「常に」ループのように見えるが、実際には次のように変換されることに気付くでしょう。

出力が相互に接続された 2 つのフリップフロップ

これは、同じ高レベルの記述をアセンブリに変換するだけではできないことです (ターゲット プロセッサの ISA にある種のXCHG命令があり、実際には珍しくなく、コードが 2 つの変数を交換して CPU に交換する場合を除きます)。登録します)。

于 2014-01-08T01:31:42.060 に答える