Shift Register N-Bit Arah Dua Verilog – Desain dan Implementasi
Dalam elektronika digital, sebuah shift register adalah kaskade dari flip-flop di mana pin output q dari satu flip-flop terhubung ke pin input data (d) dari flip-flop berikutnya. Karena semua flip-flop bekerja pada jam yang sama, larutan bit yang disimpan dalam shift register akan bergeser satu posisi. Misalnya, jika shift register kanan 5-bit memiliki nilai awal 10110 dan input ke shift register dihubungkan ke 0, maka pola berikutnya akan menjadi 01011 dan berikutnya 00101.
Desain
Desain shift register ini memiliki lima input dan satu output n-bit dan desainnya parameterized menggunakan parameter MSB untuk menunjukkan lebar shift register. Jika n adalah 4, maka menjadi shift register 4-bit. Jika n adalah 8, maka menjadi shift register 8-bit.
Shift register ini memiliki beberapa fitur utama:
Dapat diaktifkan atau dinonaktifkan dengan memancarkan pin en dari desain
Dapat bergeser ke kiri maupun kanan ketika dir dijalankan
Jika rstn ditarik ke bawah, itu akan me-reset shift register dan output akan menjadi 0
Nilai input data shift register dapat dikontrol oleh pin d
module shift_reg #(parameter MSB=8) ( input d, // Declare input for data to the first flop in the shift register input clk, // Declare input for clock to all flops in the shift register input en, // Declare input for enable to switch the shift register on/off input dir, // Declare input to shift in either left or right direction input rstn, // Declare input to reset the register to a default value output reg [MSB-1:0] out); // Declare output to read out the current value of all flops in this register // This always block will "always" be triggered on the rising edge of clock // Once it enters the block, it will first check to see if reset is 0 and if yes then reset register // If no, then check to see if the shift register is enabled // If no => maintain previous output. If yes, then shift based on the requested direction always @ (posedge clk) if (!rstn) out <= 0; else begin if (en) case (dir) 0 : out <= {out[MSB-2:0], d}; 1 : out <= {d, out[MSB-1:1]}; endcase else out <= out; end endmodule
Skematik Perangkat Keras
Testbench
Testbench digunakan untuk memverifikasi fungsionalitas shift register ini. Desain diinstancekan ke dalam module teratas dan input dipancarkan dengan nilai yang berbeda. Perilaku desain untuk setiap input dapat diamati pada pin output out.
module tb_sr; parameter MSB = 16; // [Optional] Declare a parameter to represent number of bits in shift register reg data; // Declare a variable to drive d-input of design reg clk; // Declare a variable to drive clock to the design reg en; // Declare a variable to drive enable to the design reg dir; // Declare a variable to drive direction of shift registe reg rstn; // Declare a variable to drive reset to the design wire [MSB-1:0] out; // Declare a wire to capture output from the design // Instantiate design (16-bit shift register) by passing MSB and connect with TB signals shift_reg #(MSB) sr0 ( .d (data), .clk (clk), .en (en), .dir (dir), .rstn (rstn), .out (out)); // Generate clock time period = 20ns, freq => 50MHz always #10 clk = ~clk; // Initialize variables to default values at time 0 initial begin clk <= 0; en <= 0; dir <= 0; rstn <= 0; data <= 'h1; end // Drive main stimulus to the design to verify if this works initial begin // 1. Apply reset and deassert reset after some time rstn <= 0; #20 rstn <= 1; en <= 1; // 2. For 7 clocks, drive alternate values to data pin repeat (7) @ (posedge clk) data <= ~data; // 4. Shift direction and drive alternate value to data pin for another 7 clocks #10 dir <= 1; repeat (7) @ (posedge clk) data <= ~data; // 5. Drive nothing for next 7 clocks, allow shift register to simply shift based on dir repeat (7) @ (posedge clk); // 6. Finish the simulation $finish; end // Monitor values of these variables and print them into the logfile for debug initial $monitor ("rstn=%0b data=%b, en=%0b, dir=%0b, out=%b", rstn, data, en, dir, out); endmodule
Waktu ketika shift register diaktifkan disorot dalam hijau dalam log yang diberikan di bawah. Waktu ketika bergeser arah disorot dalam kuning. Waktu ketika pin input data tetap konstan disorot dalam biru.