0

if else ブロックを使用して単純なシフト レジスタをコーディングしています。control = 2'b00制御信号が(デフォルト値を保持することを意味する)場合は、else ブロックが正常に機能することに気付きましたが、制御値を指定control = 2'b11すると、右にシフトし始めます。これは、私が望むものではありません。

else ブロックが選択的に機能するのはなぜですか? control = 2'b00との両方control = 2'b11が else の場合でも?

以下のコードとスクリーンショット:

module shift(
input clock,
input reset,
input [1:0] control,
input in,
output [7:0] out
);

reg [7:0] r_reg, r_next; //a 7 bit shift register which will be output as is, this can be changed to any size

always @ (posedge clock or posedge reset)
begin
    if(reset)
        r_reg <= 0;
    else
        r_reg <= r_next;
end

always @ (*)

begin

if(control[0]) //shift right
    r_next = {in, r_reg[7:1]};

else if(control[1]) //shift left
    r_next = {r_reg[6:0], in};

else
    r_next = r_reg; //default state stays the same

end

assign out = r_reg;

endmodule

ここに画像の説明を入力

編集:

if(right) //shift right
    r_next = {in, r_reg[7:1]};

else if(left) //shift left
    r_next = {r_reg[6:0], in};

else if((~right & ~left) || (right & left))
    r_next = r_reg; //default state stays the same

上記も動作しませんでした..しかし、ケースで修正しました。

case(control)
    2'b01: r_next = {in, r_reg[7:1]};
    2'b10: r_next = {r_reg[6:0], in};
    default: r_next = r_reg;
4

2 に答える 2

2

非常に単純です。else ケースにはまったく当てはまりません。

最初の条件は下位ビット (b'd1 に一致) のみを調べるため、b'01 と b'11 の両方が右にシフトします。

于 2013-01-16T19:27:27.847 に答える
2

control[0]1入力したときな11ので、期待通りに動いていると思います。希望どおりに機能させるには、より強力な条件が必要です。

if (control == 2'b01)          // shift right
    r_next = {in, r_reg[7:1]};

else if (control == 2'b10)     // shift left
    r_next = {r_reg[6:0], in};

else                           // default state stays the same
    r_next = r_reg; 
于 2013-01-16T19:27:51.450 に答える