開発日記

Erlangをダラダラ書きます。

順序回路と組み合わせ回路

基本:順序回路と組み合わせ回路

簡単にまとめると,自己参照しているのが順序回路.していないのが組み合わせ回路.

順序回路

  • 自己参照して値を保持している.
 // 順序回路
  always_ff @(posedge clk) begin
    if (reset) count <= 32'd0;
    else if(count == 32'd1000000) count <= 32'd0;
    else count <= count + 32'd1; // 自己参照
  end

// 順序回路(暗黙の自己参照)
  always_ff @(posedge clk) begin
 // resetが1の時,inst <= inst; (自己参照は必ず明示されているわけではない)
    if(!reset) begin
      inst <= hoge;
    end
  end

// 順序回路(暗黙の自己参照)
  always_ff @(posedge clk) begin
 // resetが1の時,data <= data;
    if(reset) begin
      for(int i=0; i<10000; i=i+1) memory[i] <= 32'd0;
    end else begin
      data <= mem[addr];
   // flgが0の時,mem[addr] <= mem[addr]
      if(flg) begin
       mem[addr] <= wdata;
      end
    end
  end

組み合わせ回路

  • 必ず何かしら別の値が代入されている.

  • 全パターンが列挙されている.

// 組み合わせ回路(an, segの全パターン)
  always_comb begin
     if(count_seg < 32'd1000000) begin
        an = 4'b1110;
        seg = decode(data%10);
     end
     else if(count_seg < 32'd2000000) begin
        an = 4'b1101;
        seg = decode(data/10%10);
     end
     else if(count_seg < 32'd3000000) begin
        an = 4'b1011;
        seg = decode(data/100%10); 
     end
     else begin
        an = 4'b0111;
        seg = decode(data/1000%10);
      end
  end

// 組み合わせ回路(hoge)
  assign hoge = foo && tmp;

// 組み合わせ回路(dataの全パターン)
  always_comb begin
    if(a || b) data = hoge;
    else if(c) data = foo;
    else if(d) data = tmp;
    else if(e) data = hoge + foo;
    else data = foo + tmp;
  end