Advertisement
Guest User

Untitled

a guest
Jan 10th, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module pwm_rcv (avalon_slave_address, avalon_slave_readdata, clock_sink_clk, reset_sink_reset, avalon_slave_read, pwm_in);
  2. parameter NUM_CHANNELS = 1;
  3. parameter MIN_VALUE = 50000;
  4. parameter MAX_VALUE = 250000;
  5.  
  6. // PWM regs/wires/clocks
  7. input [NUM_CHANNELS - 1:0] pwm_in;
  8.  
  9.  
  10. // Avalon regs/wires/clocks
  11. input clock_sink_clk;
  12. input reset_sink_reset;
  13. input avalon_slave_read;
  14. input [2:0] avalon_slave_address;
  15. output [31:0] avalon_slave_readdata;
  16.  
  17.  
  18. // Bus clock domain
  19. reg [31:0] c_read_word = 32'b0;
  20. assign avalon_slave_readdata = c_read_word;
  21. reg read_in_progress = 1'b0;
  22.  
  23. // PWM values
  24. reg[NUM_CHANNELS - 1:0][24:0] pwm_counters;
  25. reg[NUM_CHANNELS - 1:0][24:0] pwm_values;
  26. reg[NUM_CHANNELS - 1:0] pwm_prev;
  27.  
  28.  
  29. // Read from bus
  30.  
  31. always @(posedge clock_sink_clk)
  32. begin
  33.     if (avalon_slave_read && !read_in_progress)
  34.     begin
  35.         c_read_word[31:24] <= avalon_slave_address;
  36.         //generate
  37.             for (integer i = 0; i < NUM_CHANNELS; i++) begin
  38.                 if (avalon_slave_address == i)
  39.                 begin
  40.                     c_read_word[23:0] <= pwm_values[i];
  41.                 end
  42.             end
  43.         //endgenerate
  44.         if (avalon_slave_address >=NUM_CHANNELS)
  45.         begin
  46.             c_read_word[23:0] <= 24'hFFFFFF;
  47.         end
  48.         read_in_progress <= 1'b1;
  49.     end
  50.     else
  51.     begin
  52.         read_in_progress <= 1'b0;
  53.     end
  54. end
  55.  
  56. // Read pwm
  57.  
  58. always @(posedge clock_sink_clk)
  59. begin
  60.     //generate
  61.         for (integer i = 0; i < NUM_CHANNELS; i++) begin
  62.             if (pwm_in[i])
  63.             begin
  64.                 if (pwm_prev[i])
  65.                 begin
  66.                     pwm_counters[i] <= pwm_counters[i] + 24'b1;
  67.                 end
  68.                 else
  69.                 begin
  70.                     pwm_counters[i] <= 24'b0;
  71.                     pwm_prev[i] <= 1'b1;
  72.                 end
  73.             end
  74.             else
  75.             begin
  76.                 if (pwm_prev[i])
  77.                 begin
  78.                     pwm_prev[i] <= 1'b0;
  79.                     if (pwm_counters[i] >= MIN_VALUE && pwm_counters[i] <= MAX_VALUE)
  80.                     begin
  81.                         pwm_values[i] <= pwm_counters[i];
  82.                     end
  83.                 end
  84.             end
  85.         end
  86.     //endgenerate  
  87. end
  88.  
  89.  
  90. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement