OpenCores
URL https://opencores.org/ocsvn/eco32/eco32/trunk

Subversion Repositories eco32

[/] [eco32/] [trunk/] [fpga/] [mc/] [boards/] [s3e-500/] [src/] [spi/] [spi.v] - Blame information for rev 290

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 218 hellwig
//
2
// spi.v -- SPI bus controller
3
//
4
 
5
 
6 290 hellwig
`timescale 1ns/10ps
7
`default_nettype none
8
 
9
 
10
module spi(clk, rst, spi_en,
11 218 hellwig
           dac_sample_l, dac_sample_r, dac_next,
12
           spi_sck, spi_mosi,
13
           dac_cs_n, dac_clr_n,
14
           amp_cs_n, amp_shdn,
15
           ad_conv);
16
    // internal interface
17
    input clk;
18 290 hellwig
    input rst;
19 218 hellwig
    input spi_en;
20
    // DAC controller interface
21
    input [15:0] dac_sample_l;
22
    input [15:0] dac_sample_r;
23
    output dac_next;
24
    // external interface
25
    output spi_sck;
26
    output spi_mosi;
27
    output dac_cs_n;
28
    output dac_clr_n;
29
    output amp_cs_n;
30
    output amp_shdn;
31
    output ad_conv;
32
 
33
  //------------------------------------------------------------
34
 
35
  //
36
  // SPI timing and clock generator
37
  //
38
 
39
  reg [9:0] timing;
40
 
41
  always @(posedge clk) begin
42 290 hellwig
    if (rst) begin
43 218 hellwig
      timing <= 10'h0;
44
    end else begin
45
      if (spi_en == 1'b0 && timing == 10'h0) begin
46
        // put SPI on hold in state 0 if disabled
47
        timing <= timing;
48
      end else begin
49
        // else step through the command cycle
50
        timing <= timing + 1;
51
      end
52
    end
53
  end
54
 
55
  assign spi_sck = timing[0];
56
 
57
  //------------------------------------------------------------
58
 
59
  //
60
  // DAC controller
61
  //
62
 
63
  reg dac_ld;
64
  reg [47:0] dac_sr;
65
  wire dac_shift;
66
 
67
  assign dac_next = (timing[9:0] == 10'h001) ? 1 : 0;
68
 
69
  always @(posedge clk) begin
70 290 hellwig
    if (rst) begin
71 218 hellwig
      dac_ld <= 1'b1;
72
    end else begin
73
      if (timing[9:0] == 10'h001) begin
74
        dac_ld <= 1'b0;
75
      end
76
      if (timing[9:0] == 10'h031) begin
77
        dac_ld <= 1'b1;
78
      end
79
      if (timing[9:0] == 10'h033) begin
80
        dac_ld <= 1'b0;
81
      end
82
      if (timing[9:0] == 10'h063) begin
83
        dac_ld <= 1'b1;
84
      end
85
    end
86
  end
87
 
88
  assign dac_shift = spi_sck & ~dac_ld;
89
 
90
  always @(posedge clk) begin
91 290 hellwig
    if (rst) begin
92 218 hellwig
      dac_sr <= 48'h0;
93
    end else begin
94
      if (dac_next) begin
95
        dac_sr[47:44] <= 4'b0011;
96
        dac_sr[43:40] <= 4'b0000;
97
        dac_sr[39:24] <= { ~dac_sample_l[15],
98
                            dac_sample_l[14:0] };
99
        dac_sr[23:20] <= 4'b0011;
100
        dac_sr[19:16] <= 4'b0001;
101
        dac_sr[15: 0] <= { ~dac_sample_r[15],
102
                            dac_sample_r[14:0] };
103
      end else begin
104
        if (dac_shift) begin
105
          dac_sr[47:1] <= dac_sr[46:0];
106
          dac_sr[0] <= 1'b0;
107
        end
108
      end
109
    end
110
  end
111
 
112
  assign dac_cs_n = dac_ld;
113 290 hellwig
  assign dac_clr_n = ~rst;
114 218 hellwig
 
115
  //------------------------------------------------------------
116
 
117
  //
118
  // amplifier controller
119
  //
120
 
121
  assign amp_cs_n = 1;
122 290 hellwig
  assign amp_shdn = rst;
123 218 hellwig
 
124
  //------------------------------------------------------------
125
 
126
  //
127
  // ADC controller
128
  //
129
 
130
  assign ad_conv = 0;
131
 
132
  //------------------------------------------------------------
133
 
134
  //
135
  // SPI data output
136
  //
137
 
138
  assign spi_mosi = dac_sr[47];
139
 
140
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.