順序回路と組み合わせ回路
基本:順序回路と組み合わせ回路
簡単にまとめると,自己参照しているのが順序回路.していないのが組み合わせ回路.
順序回路
- 自己参照して値を保持している.
// 順序回路 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