Advertisement
ivushka

ATLAST

Jul 29th, 2018
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. `timescale 1ns/100ps
  2.  
  3. module ads1018 (
  4.                 input  reset,
  5.                 input  clk_i,
  6.                 output sclk_adc,
  7.                 output reg cs,
  8.                 input  din, //принимаем результат
  9.                 output dout, //отправляем вопрос к каналам
  10.                 output reg [11:0]o_ch1,
  11.                 output reg [11:0]o_ch2,
  12.                 output reg [11:0]o_ch3,
  13.                 output reg [11:0]o_ch4,
  14.                 input ena_i
  15.                );
  16.  
  17. reg [8:0] counter; // reg to enter 32- or 16-bit transmission cycle
  18. // operating way
  19. // cs high 5*40.69 ns
  20. parameter csHigh = 5;
  21. //sclk low 3*40.69 ns
  22. parameter sclkLow = 3;
  23. //sclk high 4*40.69 ns
  24. parameter sclkPer = 8*16-4; // 16 периодов по восемь тактов/ не учитывается последний низкий sclk
  25. //sclk low 4*40.69 ns
  26. //sclk low 3*40.69 ns
  27. //repeat
  28. wire drdy_check ;
  29. reg start_conv = 0;
  30. reg start;
  31.     reg    main_reg;
  32.     wire    pos_sclk, neg_sclk;
  33.     assign  pos_sclk = sclk_adc & ~main_reg;
  34.     assign  neg_sclk = ~sclk_adc & main_reg;
  35. assign drdy_check = ~cs & ~din & ~start_conv;// start conversation when curcuit is ready to transmit and cs is low
  36. reg [2:0] dur_sclk = -1;
  37. assign sclk_adc = start_conv & dur_sclk[2];
  38.  
  39. wire [15:0] i_ch1 = 16'h8888;
  40. wire [15:0] i_ch2 = 16'hAAAA;
  41. wire [15:0] i_ch3 = 16'h1111;
  42. wire [15:0] i_ch4 = 16'hF0F0;
  43. // get data
  44. wire [15:0] reg_in;
  45. reg [15:0] reg_in_next;
  46. reg [3:0]cnt_adc_p = 0;
  47.  
  48. // give data
  49. reg [15:0] reg_out;
  50. wire [15:0] reg_out_next;
  51. assign dout = start_conv & reg_out[15];
  52. assign reg_out_next = {reg_out[14:0], 1'b0};
  53. ////////////
  54.  
  55.  
  56.  
  57. reg [3:0]cnt_adc_n = 0;
  58. reg [1:0]ch_cnt;
  59.  
  60.  
  61. assign reg_in = reg_in_next;
  62. initial begin
  63.     cs<=1; o_ch1 <=0;o_ch2 <=0;o_ch3 <=0;o_ch4 <=0;
  64.  
  65. end
  66.  
  67. always @(posedge clk_i or posedge reset)
  68.     begin
  69.         if (reset)
  70.             begin
  71.                 counter <= 1'b0;
  72.                 ch_cnt <= 1'b0;
  73.                 start <=0;
  74.                 cnt_adc_p <= 0;
  75.                 cnt_adc_n <= 0;
  76.                 reg_out = i_ch1;
  77.  
  78.             end
  79.         else
  80.             begin
  81.                 main_reg <= sclk_adc;
  82.                 if (ena_i) begin start<=1'b1;  end
  83.                 if (start) counter <= counter + 1;
  84.                 if (counter == csHigh-1'd1) begin start <=0; cs<=0; counter <=0; end
  85.                 if (drdy_check) start_conv <= 1;
  86.                 if (start_conv)
  87.                 begin
  88.                     //if(neg_sclk & sclk_adc) reg_in_next <= { reg_in_next[14:0],din};
  89.                     //if(pos_sclk & ~sclk_adc)
  90.  
  91.                     counter <= counter + 1;
  92.                     dur_sclk <= dur_sclk - 1;
  93.                     if (counter == sclkPer+sclkLow-1'b1)
  94.                     begin
  95.                         counter <= 0;
  96.                         dur_sclk <= -1;
  97.                         cs <= 1;
  98.                         ch_cnt <= ch_cnt + 1;
  99.                         start_conv <= 0;
  100.                         if (ch_cnt == 2'd0) begin reg_out = i_ch2; o_ch1 = reg_in; end
  101.                         if (ch_cnt == 2'd1) begin reg_out = i_ch3; o_ch2 = reg_in;  end
  102.                         if (ch_cnt == 2'd2) begin reg_out = i_ch4; o_ch3 = reg_in; end
  103.                         if (ch_cnt == 2'd3) begin reg_out = i_ch1; o_ch4 = reg_in; end
  104.                     end
  105.                 end
  106.                
  107.             end
  108.     end
  109. always @(negedge sclk_adc) reg_in_next <= { reg_in_next[14:0],din};
  110. always @(posedge sclk_adc)
  111.     begin
  112.         cnt_adc_p <= cnt_adc_p + 1;
  113.         if (cnt_adc_p != 0) reg_out <= reg_out_next;
  114.     end
  115. endmodule
  116.  
  117. `timescale 1ns/1ps
  118.  
  119. module tb;
  120. reg din = 0;
  121. reg [3:0] sclk_adc1 = 0;
  122.  
  123. reg [8:0]counter =0;
  124. reg clk,reset,ena_i;
  125. initial begin
  126.  
  127.     reset = 1;
  128.     #5;
  129.     reset = 0;
  130.     clk = 0;
  131.     ena_i = 0;
  132.     #10;
  133.     ena_i = 1;
  134.     #5;
  135.     ena_i = 0;
  136.     #500;
  137.     ena_i = 1;
  138.     #5;
  139.     ena_i = 0;
  140.     #500;
  141.     ena_i = 1;
  142.     #5;
  143.     ena_i = 0;
  144.     #500;
  145.     ena_i = 1;
  146.     #5;
  147.     ena_i = 0;
  148.     #500;
  149.     ena_i = 1;
  150.     #5;
  151.     ena_i = 0;
  152.     #500;
  153.     ena_i = 1;
  154.     #5;
  155.     ena_i = 0;
  156.     #500;
  157.     ena_i = 1;
  158.     #5;
  159.     ena_i = 0;
  160.     #500;
  161. end
  162. initial begin
  163.  
  164.     din = 0;
  165.     #50;
  166.     din = 1;
  167.     #300;
  168.     din = 0;
  169.     #600;
  170.     din = 1;
  171.     #300;  
  172.     din = 0;
  173.     #800;
  174.     din = 1;
  175.     #300;
  176.     din = 0;
  177.     #800;
  178.     din = 1;
  179.     #300;
  180.     din = 0;
  181.     #800;
  182.     din = 1;
  183.     #300;
  184. end
  185.  
  186. always #1 clk = ~clk;
  187.  
  188. always @ (posedge clk)
  189. begin
  190. counter <= counter +1;
  191.  if (counter > 4'hb) sclk_adc1 = sclk_adc1 +1;
  192.     else sclk_adc1 = 0;
  193. end
  194. ads1018 DUT
  195. (
  196.  
  197.     .reset(reset),
  198.     .clk_i(clk),
  199.         .sclk_adc (sclk_adc),
  200.     .cs(cs),
  201.     .din(din), //принимаем результат
  202.         .dout(), //отправляем вопрос к каналам
  203.     .o_ch1(),
  204.         .o_ch2(),
  205.         .o_ch3(),
  206.         .o_ch4(),
  207.         .ena_i(ena_i)
  208. );
  209. //initial #2000 $stop;
  210.  
  211.  
  212.  
  213. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement