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

Subversion Repositories sqmusic

[/] [sqmusic/] [trunk/] [sqm/] [sqm_pwm.v] - Blame information for rev 6

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 gryzor
/*
2
        SQmusic
3
        logarithmic PWM controller to use with SQMUSIC
4
  Version 0.1, tested on simulation only with Capcom's 1942
5
 
6
  (c) Jose Tejada Gomez, 11th May 2013
7
  You can use this file following the GNU GENERAL PUBLIC LICENSE version 3
8
  Read the details of the license in:
9
  http://www.gnu.org/licenses/gpl.txt
10
 
11
  Send comments to: jose.tejada@ieee.org
12
 
13
*/
14
`timescale 1ns / 1ps
15
module SQM_PWM(
16
  input clk, // VHF clock (>33 MHz)
17
  input reset_n,
18
        input [3:0]A, input [3:0]B, input [3:0]C, // input channels
19
        output Y
20
);
21
 
22
 
23
SQM_PWM_1 apwm( .clk(clk), .reset_n(reset_n), .din(A), .pwm(y_a) );
24
SQM_PWM_1 bpwm( .clk(clk), .reset_n(reset_n), .din(B), .pwm(y_b) );
25
SQM_PWM_1 cpwm( .clk(clk), .reset_n(reset_n), .din(C), .pwm(y_c) );
26
 
27
assign Y=y_a | y_b | y_c;
28
endmodule
29
 
30
////////////////////////////////////////////////////
31
// 1 channel only
32
module SQM_PWM_1(
33
  input clk, // VHF clock (>33 MHz)
34
  input reset_n,
35
  input [3:0]din,
36
  output reg pwm
37
);
38
 
39
reg [7:0] count, last0, last1;
40
wire [7:0]rep0, rep1;
41
 
42
SQM_PWM_LOG dec( .din(din), .rep0(rep0), .rep1(rep1), .zero(zero) );
43
 
44
always @(posedge clk or negedge reset_n) begin
45
  if( !reset_n ) begin
46 6 gryzor
    count<=0;
47
    last0<=0;
48
    last1<=1;
49 4 gryzor
  end
50
  else
51
    if( zero ) begin
52 6 gryzor
      pwm  <=0;
53
      count<=0;
54 4 gryzor
    end
55
    else if( last0!=rep0 || last1!=rep1 ) begin
56
      last0 <= rep0;
57
      last1 <= rep1;
58 6 gryzor
      count <= 0;
59
      pwm   <=0;
60 4 gryzor
    end
61
    else if( last0==1 && last1==1 ) begin
62 6 gryzor
      pwm  <=clk;
63
      count<=0;
64 4 gryzor
    end
65
    else begin
66
      if( pwm && count==last1-1 ) begin
67 6 gryzor
        count<=0;
68
        pwm  <=0;
69 4 gryzor
      end
70
      else if( !pwm && count==last0-1 ) begin
71 6 gryzor
        count<=0;
72
        pwm  <=1;
73 4 gryzor
      end
74
      else begin
75
        count<=count+1;
76 6 gryzor
        pwm  <=pwm;
77 4 gryzor
      end
78
    end
79
end
80
endmodule
81
 
82
module SQM_PWM_LOG(
83
        input [3:0]din,
84
        output reg [7:0] rep0, // "L" repetition
85
        output reg [7:0] rep1, // "H" repetition
86
        output zero
87
);
88
 
89
assign zero = din==0;
90
 
91
always @(din)
92
        case (din)
93
                1: begin
94
                  rep0=64;
95
                  rep1=1;
96
                end
97
                2: begin
98
                  rep0=61;
99
                  rep1=1;
100
                end
101
                3: begin
102
                  rep0=32;
103
                  rep1=1;
104
                end
105
                4: begin
106
                  rep0=61;
107
                  rep1=2;
108
                end
109
                5: begin
110
                  rep0=16;
111
                  rep1=1;
112
                end
113
                6: begin
114
                  rep0=61;
115
                  rep1=4;
116
                end
117
                7: begin
118
                  rep0=8;
119
                  rep1=1;
120
                end
121
                8: begin
122
                  rep0=61;
123
                  rep1=8;
124
                end
125
                9: begin
126
                  rep0=61;
127
                  rep1=16;
128
                end
129
         10: begin
130
                  rep0=61;
131
                  rep1=8;
132
                end
133
         11: begin
134
                  rep0=2;
135
                  rep1=1;
136
                end
137
         12: begin
138
                  rep0=61;
139
                  rep1=32;
140
                end
141
         13: begin
142
                  rep0=1;
143
                  rep1=1;
144
                end
145
         14: begin
146
                  rep0=61;
147
                  rep1=64;
148
                end
149
         15: begin
150
                  rep0=1;
151
                  rep1=1;
152
                end
153
default: begin
154
                  rep0=1;
155
                  rep1=1;
156
                end
157
        endcase
158
endmodule

powered by: WebSVN 2.1.0

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