ivushka

Untitled

Jul 25th, 2018
230
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 reg sclk_adc,
  7.                 output reg cs,
  8.                 input  din, //принимаем результат
  9.                 output reg 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. parameter SYSCLK_PERIOD = 40.690104; // 24,576MHz              
  17. //defparam    sclk_sours1.freq_const = sclk_presc;  // 24,576/4/2 = 3,072 MHz  
  18. parameter   sclk_presc = 10;
  19.  
  20. reg [8:0] counter; // reg to enter 32- or 16-bit transmission cycle
  21. // operating way
  22. // cs high 5*40.69 ns
  23. parameter csHigh = 5;
  24. //sclk low 3*40.69 ns
  25. parameter sclkLow = 3;
  26. //sclk high 4*40.69 ns
  27. parameter sclkPer = 8*16-4; // 16 периодов по восемь тактов/ не учитывается последний низкий sclk
  28. //sclk low 4*40.69 ns
  29. //sclk low 3*40.69 ns
  30. //repeat
  31. reg [2:0] dur_sclk;
  32.  
  33. reg [15:0] transdata = 0;
  34. wire [15:0] transtmp  = {transdata[14:0], din};
  35.  
  36. //wires for cofig regs
  37. //////////////////////////////////////////////////////////////////
  38.  
  39. reg [15:0]dataInCh[3:0];
  40. reg  [1:0]ch_cnt;
  41.  
  42. parameter dataOutCh =
  43. {
  44. // ss mux pga m dr ts p op r
  45. 16'b1_100_010_0_100_0_0_01_1,
  46. 16'b1_101_010_0_100_0_0_01_1,
  47. 16'b1_110_010_0_100_0_0_01_1,
  48. 16'b1_111_010_0_100_0_0_01_1
  49.  
  50. };
  51. reg start = 0;
  52. reg [15:0] shiftOut [3:0];
  53.  
  54.  
  55.     reg    main_reg;
  56.     wire    pos_sclk, neg_sclk;
  57.     assign  pos_sclk = sclk_adc & ~main_reg;
  58.     assign  neg_sclk = ~sclk_adc & main_reg;
  59.     integer i;
  60.  
  61. initial begin
  62.     cs = 1'b1;
  63.     for (i = 0; i < 4; i=i+1) shiftOut[i] = dataOutCh[((3-i)*16)+:16];
  64.     counter <= 0;
  65.     ch_cnt = 0;
  66.     sclk_adc = 0;
  67.     dur_sclk = 0;
  68.     dout = 0;
  69.     o_ch1 = 0; o_ch2 = 0; o_ch3 = 0; o_ch4 = 0;
  70.     dataInCh[0][15:0] = 0;
  71.     dataInCh[1][15:0] = 0;
  72.     dataInCh[2][15:0] = 0;
  73.     dataInCh[3][15:0] = 0;
  74. end
  75.  
  76.  
  77. //switch control
  78. always @(posedge clk_i or posedge reset)
  79. begin  
  80. if (reset)
  81.     begin
  82.         main_reg <= sclk_adc;
  83.         cs <= 1;
  84.         dout <= 0;
  85.         counter <= 0;
  86.         o_ch1 <= 0; o_ch2 <= 0; o_ch3 <= 0; o_ch4 <= 0;
  87.     end
  88. else if (ena_i) start <= 1'b1;
  89.  
  90. if (start)
  91.  
  92.     begin
  93.         counter <= counter + 1'b1;
  94.         if (counter == csHigh + 1) cs <= 0;
  95.         if ((counter > (csHigh + sclkLow)) && (counter < (csHigh + sclkLow + sclkPer)))
  96.             begin
  97.                 dur_sclk <= dur_sclk -1;
  98.                 sclk_adc <= dur_sclk[2];
  99.                 main_reg <= sclk_adc;
  100.                
  101.                 if (pos_sclk)
  102.                     begin
  103.                         dout <= shiftOut [ch_cnt] [15];
  104.                         shiftOut [ch_cnt][15:0] <= { shiftOut[ch_cnt] [14:0], 1'b0};
  105.                     end
  106.                 if (neg_sclk)
  107.                     begin
  108.                         transdata <= transtmp;
  109.                         dataInCh[ch_cnt][15:0] <= transdata;
  110.                     end
  111.             end
  112.         if (counter > csHigh + sclkLow + sclkPer)
  113.         begin
  114.             dur_sclk <= 0;
  115.             sclk_adc <= 0;
  116.             if (ch_cnt == 0) o_ch1 <= dataInCh[3][15:4];
  117.             if (ch_cnt == 1) o_ch2 <= dataInCh[0][15:4];
  118.             if (ch_cnt == 2) o_ch3 <= dataInCh[1][15:4];
  119.             if (ch_cnt == 3) o_ch4 <= dataInCh[2][15:4];
  120.             end
  121.         if (counter > csHigh + sclkLow + sclkPer + sclkLow)
  122.         begin
  123.             cs <= 1;
  124.             counter <= 0;
  125.             start <= 0;
  126.             for (i = 0; i < 4; i=i+1) shiftOut[i] = dataOutCh[((3-i)*16)+:16];
  127.             transdata <= 0;
  128.             ch_cnt <= ch_cnt + 1;
  129.             dout <= 0;
  130.         end
  131.     end
  132.  
  133. end
  134. /*
  135. //записываем ответ по спаду
  136. always @(negedge sclk_adc)
  137. begin
  138.     transdata = transtmp;
  139.     dataInCh[ch_cnt][15:0] = transdata;
  140. end
  141. //запрос  отсылаем по восходящему
  142. always @(posedge sclk_adc)
  143. begin
  144.     dout = shiftOut [ch_cnt] [15];
  145.     shiftOut [ch_cnt][15:0] = { shiftOut[ch_cnt] [14:0], 1'b0};
  146. end/*/
  147.  
  148. endmodule
Advertisement
Add Comment
Please, Sign In to add comment