コントローラを作るために必要なファンクションブロックの数はいくつですか?

コントローラーへのバイナリー入力信号はそれぞれ8〜8桁です。出力は4つのバイナリー信号で、入力と同じ番号を構成します。
7番目の入力信号が 1 の場合、最初の入力信号が 1 の場合、4つの出力信号は
0 0 0 1 出力は 0 1 1 1
でなければなりません。下の表は、システムを示しています(10進数のバイナリ表現)。

d   4 3 2 1
-   - - - - 
  - 0 0 0 0
1 - 0 0 0 1
2 - 0 0 1 0
3 - 0 0 1 1
4 - 0 1 0 0
5 - 0 1 0 1
6 - 0 1 1 0
7 - 0 1 1 1
8 - 1 0 0 0

最初の入力信号が 1 の場合、コントローラからの出力はバイナリ出力 0 0 0
1
(バイナリで 1 )になります。 6番目の入力信号が 1
の場合、コントローラからの出力は 0 1 1 0 (バイナリで 6
)になります。入力信号が与えられていない場合、出力は空白にしてください。

2つ以上の入力信号が 1 の場合、出力信号は前後に切り替わる必要があります。例えば。第1と第6の信号が
1 の場合、コントローラからの出力は 0 0 0 10 1 1
0

コントローラには次の機能ブロックがあります。

  • 論理ゲート AND、OR、XOR、NOT、NAND、NOR、XNOR
    ゲートは最大2つの信号と無制限の出力を取ります。 ( NOT は1つの入力しか受け付けません)。
  • パルスジェネレータ 1 0 1 0 1 0 1 ...0
    1 の期間は同じ)。パルスジェネレータの周波数は同じですが、位相を選択することもできます。

課題:

所望の動作を達成するために必要な機能ブロックの最小数は何ですか?コントローラはどのように構成されますか?

例:

1 2 3 4 5 6 7 8
- - - - - - - - 
0 0 0 0 0 0 0 0   <- Input signals
0 0 0 0           <- Output


0 0 1 0 0 0 0     <- Input signals
0 0 1 1           <- Output
0 1 0 0 1 0 0 0   <- Input signals
0 0 1 0           <- Output sequence
0 1 0 1           <-
0 0 1 0           <-
0 1 0 1           <-
0 0 1 0
0 1 0 1

0 0 1 1 1 1 1 0    <- Input signals
0 0 1 1            <- Output sequence
0 1 0 0            <-
0 1 0 1            <-
0 1 1 0            <-
0 1 1 1
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1    
ベストアンサー

これはおそらく最適ではありませんが、他のソリューションの基礎として役立つかもしれません。

Instead of drawing a diagram where wires x and
y enter an AND-gate and z leaves it,
let’s use C-like syntax and write z=x&y. Likewise:
z=x|y for OR, z=~x for NOT. (We don’t use
XOR, NAND, NOR, XNOR.) Wires are free, so it doesn’t matter how
many of them we name with =. Comments start with
//. For conciseness, sometimes we’ll write indices as
x12 instead of the traditional
x[1][2].

周期の0,1/8,2/8、…、7/8の位相を持つパルスジェネレータを g1
g8 としましょう。

   //time -->
g1 //1 1 1 1 0 0 0 0
g2 //0 1 1 1 1 0 0 0
g3 //0 0 1 1 1 1 0 0
g4 //0 0 0 1 1 1 1 0
g5 //0 0 0 0 1 1 1 1
g6 //1 0 0 0 0 1 1 1
g7 //1 1 0 0 0 0 1 1
g8 //1 1 1 0 0 0 0 1
   //cost: 8

我々は正確な時刻(モジュロ8の期間の8つの時)を知ることができます。

             //time -->
t1 = g1 & g6 //1 0 0 0 0 0 0 0
t2 = g2 & g7 //0 1 0 0 0 0 0 0
t3 = g3 & g8 //0 0 1 0 0 0 0 0
t4 = g4 & g1 //0 0 0 1 0 0 0 0
t5 = g5 & g2 //0 0 0 0 1 0 0 0
t6 = g6 & g3 //0 0 0 0 0 1 0 0
t7 = g7 & g4 //0 0 0 0 0 0 1 0
t8 = g8 & g5 //0 0 0 0 0 0 0 1
             //cost: 8

入力の否定を事前に計算する:

y1 = ~x1
y2 = ~x2
...
y8 = ~x8
// cost: 8

今最も難しいのは、 i が現在表示されている出力値であるべきかどうかを v
[i]

v1 = x1&(t1|(y2&(t2|(y3&(t3|(y4&(t4|(y5&(t5|(y6&(t6|(y7&(t7|(y8&t8))))))))))))))
v2 = x2&(t2|(y3&(t3|(y4&(t4|(y5&(t5|(y6&(t6|(y7&(t7|(y8&(t8|(y1&t1))))))))))))))
...
v8 = x8&(t8|(y1&(t1|(y2&(t2|(y3&(t3|(y4&(t4|(y5&(t5|(y6&(t6|(y7&t7))))))))))))))
// cost: 120 (8 lines * 15 functions per line)

最後に、 v -sをバイナリ数字にかなり効率的に変換することができます:

d1 = v1 | v3 | v5 | v7
d2 = v2 | v3 | (v6|v7) //v6|v7 can be computed only once
d3 = v4 | v5 | (v6|v7)
d4 = v8
// cost: 8

総コスト:8 + 8 + 8 + 120 + 8 = 152ファンクションブロック

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です