Advertisement
Guest User

uart tx

a guest
Feb 19th, 2024
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. module transmitter(clk,reset,enable,parallel_in,serial_out,busy);
  2. input clk,reset,enable;
  3. input [7:0] parallel_in;
  4. output [7:0] serial_out;
  5. output busy;
  6.  
  7. reg [7:0] data_reg=8'b0;
  8. reg [9:0] cycle_counter=4'b0;
  9. reg [3:0] bit_counter=4'b0;
  10. reg txd =1'b1;
  11.  
  12. reg [2:0] state=0;
  13. reg [2:0] next_state=0;
  14. localparam CYCLES_PER_BIT=2;
  15.  
  16. localparam IDLE = 0;
  17. localparam START= 1;
  18. localparam SEND = 2;
  19. localparam STOP = 3;
  20.  
  21. wire next_bit = cycle_counter == CYCLES_PER_BIT;
  22.  
  23.  
  24. always@(posedge clk)begin
  25.  
  26. state<=next_state;
  27.  
  28. if (state == IDLE)
  29. begin
  30. txd<=1'b1;
  31. end
  32. else if (state == START)
  33. begin
  34. txd=1'b0;
  35. if(next_bit)
  36. cycle_counter<=4'b0000;
  37. else
  38. cycle_counter<=cycle_counter+1;
  39. end
  40.  
  41.  
  42. end
  43. always@(*)begin
  44. case(state)
  45. IDLE :next_state = enable ? START : IDLE;
  46. START:next_state = next_bit? SEND : START;
  47.  
  48.  
  49. endcase
  50.  
  51.  
  52. end
  53. endmodule
  54.  
  55. module tb();
  56. reg clk,reset,enable;
  57. reg [7:0] parallel_in;
  58. wire [7:0] serial_out;
  59. wire busy;
  60.  
  61. transmitter DUT(.clk(clk),.reset(reset),.enable(enable),.parallel_in(parallel_in),.serial_out(serial_out),.busy(busy));
  62.  
  63. always#5 clk=~clk;
  64.  
  65. initial begin
  66. $dumpfile("file.vcd");
  67. $dumpvars(0,tb);
  68.  
  69. clk=1'b0;
  70. enable=1'b0;
  71.  
  72. #10 enable=1'b1;
  73.  
  74.  
  75. #100 $finish;
  76. end
  77. endmodule
  78.  
  79.  
  80.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement