跳轉到

第6章 暫存器

簡介

拴鎖器

正反器

RS 型正反器

D 型正反器

JK 型正反器

T 型正反器

暫存器

Verilog程式碼

Verilog測試檔案

移位暫存器

5位元左移暫存器


串列輸入四位元左移位串列輸出

Verilog程式碼
module siso_shift_register (clock, clear, in, out);
input clock, clear, in;
output out;
reg [3:0] register;

always @ (posedge clock) begin
  if (clear) begin
    register = 4'd0;
  end else begin
    register[3] = register[2];
    register[2] = register[1];
    register[1] = register[0];
    register[0] = in;
  end
end

assign out = register[3];

endmodule // siso_shift_register
Verilog測試檔案
`include "siso_shift_register.v"

module siso_shift_register_test ();
  reg clock, clear, in;
  wire out;
  integer number;

  siso_shift_register UUT (clock, clear, in, out);

  initial begin
    $display("| clock | clear | in | out |");
    in = 1'b0;
    clock = 1'b1;
    clear = 1'b1;

    #5;
    clear = 1'b0;

    #10;

    for (number = 0; number < 5; number = number + 1) begin
      in  = 1;
      #20;
    end
    #20;
    clear = 1'b1;
    #20;
    clear = 1'b0;
    for (number = 0; number < 8; number = number + 1) begin
      in  = number;
      #20;
    end
    #20;
    $finish;
  end
  always begin
    #5;
    $monitor("|   %b   |   %b   | %b  |  %b  |", clock, clear, in, out);

    #5;
    clock = ~clock;
  end

endmodule // siso_shift_register_test
測試結果
| clock | clear | in | out |
|   1   |   0   | 0  |  0  |
|   0   |   0   | 0  |  0  |
|   0   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   1   |   0   | 1  |  1  |
|   1   |   0   | 1  |  1  |
|   0   |   0   | 1  |  1  |
|   0   |   0   | 1  |  1  |
|   1   |   0   | 1  |  1  |
|   1   |   0   | 1  |  1  |
|   0   |   0   | 1  |  1  |
|   0   |   0   | 1  |  1  |
|   1   |   0   | 1  |  1  |
|   1   |   0   | 1  |  1  |
|   0   |   0   | 1  |  1  |
|   0   |   1   | 1  |  1  |
|   1   |   1   | 1  |  0  |
|   1   |   1   | 1  |  0  |
|   0   |   1   | 1  |  0  |
|   0   |   0   | 0  |  0  |
|   1   |   0   | 0  |  0  |
|   1   |   0   | 0  |  0  |
|   0   |   0   | 0  |  0  |
|   0   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   0   |   0   | 0  |  0  |
|   1   |   0   | 0  |  0  |
|   1   |   0   | 0  |  0  |
|   0   |   0   | 0  |  0  |
|   0   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   0   |   0   | 0  |  0  |
|   1   |   0   | 0  |  1  |
|   1   |   0   | 0  |  1  |
|   0   |   0   | 0  |  1  |
|   0   |   0   | 1  |  1  |
|   1   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   0   |   0   | 0  |  0  |
|   1   |   0   | 0  |  1  |
|   1   |   0   | 0  |  1  |
|   0   |   0   | 0  |  1  |
|   0   |   0   | 1  |  1  |
|   1   |   0   | 1  |  0  |
|   1   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   0   |   0   | 1  |  0  |
|   1   |   0   | 1  |  1  |
|   1   |   0   | 1  |  1  |
|   0   |   0   | 1  |  1  |
|   0   |   0   | 1  |  1  |

串列輸入四位元左移位並列輸出

Verilog程式碼
module sipo_shift_register (clock, clear, in, out);
input clock, clear, in;
output [3:0] out;
reg [3:0] register;

always @ (posedge clock) begin
  if (clear) begin
    register = 4'd0;
  end else begin
    register[3] = register[2];
    register[2] = register[1];
    register[1] = register[0];
    register[0] = in;
  end
end

assign out = register;

endmodule // sipo_shift_register
Verilog測試檔案
`include "sipo_shift_register.v"

module sipo_shift_register_test ();
  reg clock, clear, in;
  wire [3:0] out;
  integer number;

  sipo_shift_register UUT (clock, clear, in, out);

  initial begin
    in = 1'b0;
    clock = 1'b1;
    clear = 1'b1;

    #5;

    clear = 1'b0;

    #10;

    $display("| clock | clear | in |  out   |");

    for (number = 0; number < 2; number = number + 1) begin
      in  = 1;
      $monitor("|   %b   |   %b   | %b  |  %b  |", clock, clear, in, out);
      #20;
    end
    #20;
    clear = 1'b1;
    #20;
    clear = 1'b0;
    for (number = 0; number < 8; number = number + 1) begin
      in  = number;
      $monitor("|   %b   |   %b   | %b  |  %b  |", clock, clear, in, out);
      #20;
    end
    $finish;
  end
  always begin
    #10;
    clock = ~clock;
  end

endmodule // sipo_shift_register_test
測試結果
| clock | clear | in |  out   |
|   0   |   0   | 1  |  0000  |
|   1   |   0   | 1  |  0001  |
|   0   |   0   | 1  |  0001  |
|   0   |   0   | 1  |  0001  |
|   1   |   0   | 1  |  0011  |
|   0   |   0   | 1  |  0011  |
|   1   |   0   | 1  |  0111  |
|   0   |   0   | 1  |  0111  |
|   0   |   1   | 1  |  0111  |
|   1   |   1   | 1  |  0000  |
|   0   |   1   | 1  |  0000  |
|   0   |   0   | 0  |  0000  |
|   1   |   0   | 0  |  0000  |
|   0   |   0   | 0  |  0000  |
|   0   |   0   | 1  |  0000  |
|   1   |   0   | 1  |  0001  |
|   0   |   0   | 1  |  0001  |
|   0   |   0   | 0  |  0001  |
|   1   |   0   | 0  |  0010  |
|   0   |   0   | 0  |  0010  |
|   0   |   0   | 1  |  0010  |
|   1   |   0   | 1  |  0101  |
|   0   |   0   | 1  |  0101  |
|   0   |   0   | 0  |  0101  |
|   1   |   0   | 0  |  1010  |
|   0   |   0   | 0  |  1010  |
|   0   |   0   | 1  |  1010  |
|   1   |   0   | 1  |  0101  |
|   0   |   0   | 1  |  0101  |
|   0   |   0   | 0  |  0101  |
|   1   |   0   | 0  |  1010  |
|   0   |   0   | 0  |  1010  |
|   0   |   0   | 1  |  1010  |
|   1   |   0   | 1  |  0101  |
|   0   |   0   | 1  |  0101  |

累加器

用於做加法後自我存入到暫存器,在這裡拆開說明講解暫存器的使用範例。

Verilog程式碼
module accumulator (clock, clear, in, out);
input clock, clear;
input [3:0] in;
output [3:0] out;
reg [3:0] register;

always @ (posedge clock) begin
  if (clear) begin
    register = 4'd0;
  end else begin
    register += in;
  end
end

assign out = register;

endmodule // accumulator
Verilog測試檔案
`include "accumulator.v"

module accumulator_test ();
  reg clock, clear;
  reg [3:0] in;
  wire [3:0] out;
  integer number;

  accumulator UUT (clock, clear, in, out);

  initial begin
    in = 1'b0;
    clock = 1'b1;
    clear = 1'b1;

    #5;

    clear = 1'b0;

    #10;

    $display("| clock | clear |  in  | out  |");

    for (number = 0; number < 2; number = number + 1) begin
      in  = 1;
      $monitor("|   %b   |   %b   | %b | %b |", clock, clear, in, out);
      #20;
    end
    #20;
    clear = 1'b1;
    #20;
    clear = 1'b0;
    for (number = 0; number < 8; number = number + 2) begin
      in  = number;
      $monitor("|   %b   |   %b   | %b | %b |", clock, clear, in, out);
      #20;
    end
    $finish;
  end
  always begin
    #10;
    clock = ~clock;
  end

endmodule // accumulator_test
測試結果
| clock | clear |  in  | out  |
|   0   |   0   | 0001 | 0000 |
|   1   |   0   | 0001 | 0001 |
|   0   |   0   | 0001 | 0001 |
|   0   |   0   | 0001 | 0001 |
|   1   |   0   | 0001 | 0010 |
|   0   |   0   | 0001 | 0010 |
|   1   |   0   | 0001 | 0011 |
|   0   |   0   | 0001 | 0011 |
|   0   |   1   | 0001 | 0011 |
|   1   |   1   | 0001 | 0000 |
|   0   |   1   | 0001 | 0000 |
|   0   |   0   | 0000 | 0000 |
|   1   |   0   | 0000 | 0000 |
|   0   |   0   | 0000 | 0000 |
|   0   |   0   | 0010 | 0000 |
|   1   |   0   | 0010 | 0010 |
|   0   |   0   | 0010 | 0010 |
|   0   |   0   | 0100 | 0010 |
|   1   |   0   | 0100 | 0110 |
|   0   |   0   | 0100 | 0110 |
|   0   |   0   | 0110 | 0110 |
|   1   |   0   | 0110 | 1100 |
|   0   |   0   | 0110 | 1100 |

電路名稱

Verilog程式碼

Verilog測試檔案

測試結果