dna_reader.v 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. `timescale 1 ns / 1 ps
  2. module dna_reader
  3. (
  4. input wire aclk,
  5. input wire aresetn,
  6. output wire [56:0] dna_data
  7. );
  8. localparam integer CNTR_WIDTH = 16;
  9. localparam integer DATA_WIDTH = 57;
  10. reg int_enbl_reg, int_enbl_next;
  11. reg int_read_reg, int_read_next;
  12. reg int_shift_reg, int_shift_next;
  13. reg [CNTR_WIDTH-1:0] int_cntr_reg, int_cntr_next;
  14. reg [DATA_WIDTH-1:0] int_data_reg, int_data_next;
  15. wire int_comp_wire, int_data_wire;
  16. assign int_comp_wire = int_cntr_reg < 64*DATA_WIDTH;
  17. DNA_PORT dna_0 (
  18. .DOUT(int_data_wire),
  19. .CLK(int_cntr_reg[5]),
  20. .DIN(1'b0),
  21. .READ(int_read_reg),
  22. .SHIFT(int_shift_reg)
  23. );
  24. always @(posedge aclk)
  25. begin
  26. if(~aresetn)
  27. begin
  28. int_enbl_reg <= 1'b0;
  29. int_read_reg <= 1'b0;
  30. int_shift_reg <= 1'b0;
  31. int_cntr_reg <= {(CNTR_WIDTH){1'b0}};
  32. int_data_reg <= {(DATA_WIDTH){1'b0}};
  33. end
  34. else
  35. begin
  36. int_enbl_reg <= int_enbl_next;
  37. int_read_reg <= int_read_next;
  38. int_shift_reg <= int_shift_next;
  39. int_cntr_reg <= int_cntr_next;
  40. int_data_reg <= int_data_next;
  41. end
  42. end
  43. always @*
  44. begin
  45. int_enbl_next = int_enbl_reg;
  46. int_read_next = int_read_reg;
  47. int_shift_next = int_shift_reg;
  48. int_cntr_next = int_cntr_reg;
  49. int_data_next = int_data_reg;
  50. if(~int_enbl_reg & int_comp_wire)
  51. begin
  52. int_enbl_next = 1'b1;
  53. int_read_next = 1'b1;
  54. end
  55. if(int_enbl_reg)
  56. begin
  57. int_cntr_next = int_cntr_reg + 1'b1;
  58. end
  59. if(&int_cntr_reg[5:0])
  60. begin
  61. int_read_next = 1'b0;
  62. int_shift_next = 1'b1;
  63. int_data_next = {int_data_reg[DATA_WIDTH-2:0], int_data_wire};
  64. end
  65. if(~int_comp_wire)
  66. begin
  67. int_enbl_next = 1'b0;
  68. int_shift_next = 1'b0;
  69. end
  70. end
  71. assign dna_data = int_data_reg;
  72. endmodule