Files

94 lines
3.3 KiB
Verilog

`timescale 1ns / 1ns
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2020/10/04 13:29:02
// Design Name:
// Module Name: shift_reg
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module shift_reg #(
parameter DATA_WIDTH = 8,
parameter DEPTH = 4
) (
input clk,
(* max_fanout = 256 *) input rst,
input we,
input [DATA_WIDTH-1:0] din,
output [DATA_WIDTH-1:0] dout
);
// generate
// if (DEPTH > 1) begin
// reg [DEPTH-1:0] shift_register[DATA_WIDTH-1:0];
// genvar shift_bit_cnt;
// for (shift_bit_cnt = 0; shift_bit_cnt < DATA_WIDTH; shift_bit_cnt = shift_bit_cnt + 1) begin : shift_each_bit
// always @(posedge clk) begin
// if (we) shift_register[shift_bit_cnt] <= {din[shift_bit_cnt], shift_register[shift_bit_cnt][DEPTH-1:1]};
// else shift_register[shift_bit_cnt] <= shift_bit_cnt[shift_bit_cnt];
// end
// end
// genvar output_bit_cnt;
// for (output_bit_cnt = 0; output_bit_cnt < DATA_WIDTH; output_bit_cnt = output_bit_cnt + 1) begin : output_each_bit
// assign dout[output_bit_cnt] = shift_register[output_bit_cnt][0];
// end
// end
// else // just a reg
// begin
// reg [DATA_WIDTH-1:0] shift_register;
// always @(posedge clk) begin
// if (we) shift_register <= din;
// else shift_register <= shift_register;
// end
// assign dout = shift_register;
// end
// endgenerate
generate
if (DEPTH > 1) begin
reg [DATA_WIDTH-1:0] shift_register[DEPTH-1:0];
genvar shift_reg_cnt;
for (shift_reg_cnt = 0; shift_reg_cnt < DEPTH; shift_reg_cnt = shift_reg_cnt + 1) begin : shift_each_reg
always @(posedge clk) begin
if (rst) begin
shift_register[shift_reg_cnt][DATA_WIDTH-1:0] <= 'd0;
end
else if (we) begin
if (shift_reg_cnt == 0) begin
shift_register[shift_reg_cnt] <= din;
end
else begin
shift_register[shift_reg_cnt] <= shift_register[shift_reg_cnt-1];
end
end
else shift_register[shift_reg_cnt] <= shift_register[shift_reg_cnt];
end
end
assign dout = shift_register[DEPTH-1];
end
else // just a reg
begin
reg [DATA_WIDTH-1:0] shift_register;
always @(posedge clk) begin
if (we) shift_register <= din;
else shift_register <= shift_register;
end
assign dout = shift_register;
end
endgenerate
endmodule