Registros
1. Códigos
1.1. Registro básico  (PIPO)
1.2. Registro de corrimiento Serie-Paralelo (SIPO)
| sipo_reg.v | 
|---|
|  | module sipo_reg #(
  parameter Width = 8
) (
  input              clk_i,
  input              rst_i,
  input              d_i,  
  input              en_i,
  output [Width-1:0] q_o
);  
  reg  [Width-1:0] reg_q;
  wire [Width-1:0] mux_d;
  assign mux_d = (en_i) ? {reg_q[Width-2:0], d_i} : reg_q;
  always @(posedge clk_i, posedge rst_i) begin
    if (rst_i)
      reg_q <= 0;
    else
      reg_q <= mux_d;
  end
  assign q_o = reg_q;
endmodule
 | 
1.3. Registro de corrimiento Paralelo-Serie (PISO)
| piso_reg.v | 
|---|
|  | module piso_reg #(
  parameter Width = 8   
) (
  input             rst_i,
  input             clk_i,
  input [Width-1:0] d_i,
  input       [1:0] op_i,
  output            q_o
);  
  reg [Width-1:0] mux_d, reg_q;
  always @(d_i, op_i, reg_q) begin
    case (op_i)
      2'b00   : mux_d = reg_q;
      2'b01   : mux_d = d_i;
      2'b10   : mux_d = {reg_q[Width-2:0], 1'b0};
      default : mux_d = 0;
    endcase
  end   
  always @(posedge clk_i, posedge rst_i) begin
    if (rst_i)
      reg_q <= 0;
    else
      reg_q <= mux_d;    
  end
  assign q_o = reg_q[Width-1];
endmodule
 |