baud_gen.v 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. module baud_gen (
  2. input clk,
  3. input rstn,
  4. input [15:0] ibrd,
  5. input [5:0] fbrd,
  6. input stop,
  7. output reg baud16
  8. );
  9. reg [15:0] i_cnt;
  10. reg [5:0] f_cnt;
  11. reg f_del;
  12. wire [5:0] f_rev = { f_cnt[0], f_cnt[1], f_cnt[2], f_cnt[3], f_cnt[4], f_cnt[5] };
  13. always @(posedge clk or negedge rstn) begin
  14. if (!rstn) begin
  15. i_cnt <= 16'h1;
  16. end else if (stop || !f_del && i_cnt == 1 || i_cnt == 0) begin
  17. i_cnt <= ibrd;
  18. end else begin
  19. i_cnt <= i_cnt - 1;
  20. end
  21. end
  22. always @(posedge clk or negedge rstn) begin
  23. if (!rstn) begin
  24. f_cnt <= 6'h0;
  25. end else if (stop) begin
  26. f_cnt <= 6'h0;
  27. end else if (baud16) begin
  28. f_cnt <= f_cnt + 1;
  29. end
  30. end
  31. always @(posedge clk or negedge rstn) begin
  32. if (!rstn) begin
  33. baud16 <= 1'b0;
  34. end else if (!stop && (!f_del && i_cnt == 1 || i_cnt == 0)) begin
  35. baud16 <= 1'b1;
  36. end else begin
  37. baud16 <= 1'b0;
  38. end
  39. end
  40. always @(posedge clk or negedge rstn) begin
  41. if (!rstn) begin
  42. f_del <= 1'b0;
  43. end else if (f_rev < fbrd) begin
  44. f_del <= 1'b1;
  45. end else begin
  46. f_del <= 1'b0;
  47. end
  48. end
  49. always @(posedge clk or negedge rstn) begin
  50. if (!rstn) begin
  51. end
  52. end
  53. endmodule