| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- `timescale 1 ns / 1 ps
- module dna_reader
- (
- input wire aclk,
- input wire aresetn,
- output wire [56:0] dna_data
- );
- localparam integer CNTR_WIDTH = 16;
- localparam integer DATA_WIDTH = 57;
- reg int_enbl_reg, int_enbl_next;
- reg int_read_reg, int_read_next;
- reg int_shift_reg, int_shift_next;
- reg [CNTR_WIDTH-1:0] int_cntr_reg, int_cntr_next;
- reg [DATA_WIDTH-1:0] int_data_reg, int_data_next;
- wire int_comp_wire, int_data_wire;
- assign int_comp_wire = int_cntr_reg < 64*DATA_WIDTH;
- DNA_PORT dna_0 (
- .DOUT(int_data_wire),
- .CLK(int_cntr_reg[5]),
- .DIN(1'b0),
- .READ(int_read_reg),
- .SHIFT(int_shift_reg)
- );
- always @(posedge aclk)
- begin
- if(~aresetn)
- begin
- int_enbl_reg <= 1'b0;
- int_read_reg <= 1'b0;
- int_shift_reg <= 1'b0;
- int_cntr_reg <= {(CNTR_WIDTH){1'b0}};
- int_data_reg <= {(DATA_WIDTH){1'b0}};
- end
- else
- begin
- int_enbl_reg <= int_enbl_next;
- int_read_reg <= int_read_next;
- int_shift_reg <= int_shift_next;
- int_cntr_reg <= int_cntr_next;
- int_data_reg <= int_data_next;
- end
- end
- always @*
- begin
- int_enbl_next = int_enbl_reg;
- int_read_next = int_read_reg;
- int_shift_next = int_shift_reg;
- int_cntr_next = int_cntr_reg;
- int_data_next = int_data_reg;
- if(~int_enbl_reg & int_comp_wire)
- begin
- int_enbl_next = 1'b1;
- int_read_next = 1'b1;
- end
- if(int_enbl_reg)
- begin
- int_cntr_next = int_cntr_reg + 1'b1;
- end
- if(&int_cntr_reg[5:0])
- begin
- int_read_next = 1'b0;
- int_shift_next = 1'b1;
- int_data_next = {int_data_reg[DATA_WIDTH-2:0], int_data_wire};
- end
- if(~int_comp_wire)
- begin
- int_enbl_next = 1'b0;
- int_shift_next = 1'b0;
- end
- end
- assign dna_data = int_data_reg;
- endmodule
|