Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Verilog

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:

  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.

Log Simulasi
 ncsim> run rstn=0 data=1, en=0, dir=0, out=xxxxxxxxxxxxxxxx rstn=0 data=1, en=0, dir=0, out=0000000000000000 rstn=1 data=1, en=1, dir=0, out=0000000000000000 rstn=1 data=0, en=1, dir=0, out=0000000000000001 rstn=1 data=1, en=1, dir=0, out=0000000000000010 rstn=1 data=0, en=1, dir=0, out=0000000000000101 rstn=1 data=1, en=1, dir=0, out=0000000000001010 rstn=1 data=0, en=1, dir=0, out=0000000000010101 rstn=1 data=1, en=1, dir=0, out=0000000000101010 rstn=1 data=0, en=1, dir=0, out=0000000001010101 rstn=1 data=0, en=1, dir=1, out=0000000001010101 rstn=1 data=1, en=1, dir=1, out=0000000000101010 rstn=1 data=0, en=1, dir=1, out=1000000000010101 rstn=1 data=1, en=1, dir=1, out=0100000000001010 rstn=1 data=0, en=1, dir=1, out=1010000000000101 rstn=1 data=1, en=1, dir=1, out=0101000000000010 rstn=1 data=0, en=1, dir=1, out=1010100000000001 rstn=1 data=1, en=1, dir=1, out=0101010000000000 rstn=1 data=1, en=1, dir=1, out=1010101000000000 rstn=1 data=1, en=1, dir=1, out=1101010100000000 rstn=1 data=1, en=1, dir=1, out=1110101010000000 rstn=1 data=1, en=1, dir=1, out=1111010101000000 rstn=1 data=1, en=1, dir=1, out=1111101010100000 rstn=1 data=1, en=1, dir=1, out=1111110101010000 Simulation complete via $finish(1) at time 430 NS + 0 

Verilog

  1. Menguasai Verilog: Tutorial Lengkap untuk Desain Sirkuit Digital
  2. Menguasai Konkatenasi Verilog: Panduan Praktis
  3. Memahami Penugasan Verilog: Jenis, Sintaks, dan Praktik Terbaik
  4. Perbedaan Kunci Penugasan Blokir dan Non-Blokir Verilog
  5. Menguasai Fungsi Verilog untuk Desain RTL yang Efisien
  6. Memahami Tugas Verilog: Fungsi vs Tugas, Sintaks, dan Penggunaan
  7. Generator Jam Verilog: Panduan Desain dan Implementasi
  8. Menguasai Fungsi Matematika Verilog untuk Desain Perangkat Keras yang Efisien
  9. Menguasai $timeformat Verilog: Kontrol Presisi dan Tampilan
  10. Memahami dan Mencetak Timescale Verilog pada Setiap Cakupan