1

Verilog で 8086 プロセッサを作成しようとしており、ほとんどのアーキテクチャについて平均以上の基本的な理解を持っています (そして、この時点を過ぎればうまくやっていくことができます)。キャリー フラグと補助フラグが ALU でどのように機能するかについて頭を悩ませています。

結果が ALU のビット幅よりも大きくなる加算または減算 (この場合はボローと呼ばれます) で CF がトリガーされることを理解しています。

しかし、FLAGS[0] (CF) ビットに書き込み、再度アクセスして操作を続行できる加算と減算用の Verilog コードをどのように記述すればよいでしょうか。分解できる例を誰か教えてもらえますか?

また、これはさらに不自然な質問ですが、SI レジスタと DI レジスタの幅が 16 ビットしかない場合、キャリー操作を伴う ALU が 17 ビット数の作成をサポートできるのはなぜですか? その余分なビットはどこに行きますか、それで何が行われますか? 乗算によって同じビット オーバーフローが発生するとどうなりますか?

初心者レベルの質問で大変申し訳ありません。これに関しては、明らかな無知や理解不足で怒鳴られそうです。これを理解するためにコード行を提供して助けてくれる人に感謝します。

4

1 に答える 1

1

私はあなたが何を意味するのかよくわかりませんし、操作を続行するために再アクセスしますが、16ビットの加算/減算からキャリービットを生成する方法を尋ねているだけなら、これはそれを行う1つの方法です(連結を使用して結果を 2 つの異なるレジスタに書き込みます):

always @ posedge clk begin
  if(add_with_carry)
    {CF[0], result[15:0]} <= a[15:0] + b[15:0];
  else if(sub_with_carry)
    {CF[0], result[15:0]} <= a[15:0] - b[15:0];
  else if(add_without_carry)
            result[15:0]  <= a[15:0] + b[15:0];
  else if(sub_without_carry)
            result[15:0]  <= a[15:0] - b[15:0];
end

これは基本的に、結果を 17 ビット レジスタに書き込み、結果 [16] をキャリー フラグとして指定することと同じです。

于 2013-08-03T04:02:38.147 に答える