module PWM_10_Ch
(
input wire inclk, //Вход тактовой частоты (16MHz)
input wire nSSIN, //Выбор чипа, по положительному перепаду запись по адресу в старших 8 битах SPI
input wire SCKin, //Вход такта SPI
input wire MOSIin, //Вход данных от МК
output wire MISOout, //Выход данных на МК
output wire [num_PWM-1:0] PWM //Выход 10 каналов ШИМ 50Гц
);
parameter SPI_Width = 16; //Ширина шины SPI, бит
parameter CNT_Width = 8; //Ширина счётчиков PWM, бит
parameter num_PWM = 178; //Количество каналов PWM
parameter fCLK = 16000000; //Тактовая частота, Гц
parameter fPWM = 50; //Частота ШИМ, Гц
parameter fDiv = fCLK/fPWM/2**CNT_Width; //Коэффициент деления, вычисляемое
parameter psc = $clog2(fDiv); //Ширина сччётчика прескалера, вычисляемое
//**************************************************
wire [SPI_Width - CNT_Width - 1:0] SPI_Addr; //Шина адреса модулей CCP
wire [CNT_Width - 1:0] SPI_Data; //Шина данных модулей CCP
wire [CNT_Width - 1:0] Cur_Cnt; //Текущее значение счётчика PWM
wire [SPI_Width - 1:0] dataOUT;
assign SPI_Addr = dataOUT[SPI_Width -1: CNT_Width];
assign SPI_Data = dataOUT[CNT_Width - 1:0];
//**************************************************
// Предделитель на 1250
//**************************************************
reg [psc-1:0] f_cnt = 0; //Счетчик предделителя
reg pulse = 0; //Такт предделителя
always @ (posedge inclk) begin
f_cnt <= f_cnt + 1;
if (f_cnt == fDiv + 1) begin
f_cnt <= 0;
pulse <= 1;
end else pulse <= 0;
end
//**************************************************
// Дешифратор адреса CCP
//**************************************************
reg [CNT_Width - 1:0] CCP_Addr [num_PWM-1:0];
always @ (posedge nSSIN) begin
CCP_Addr[SPI_Addr] <= SPI_Data;
end
//**************************************************
// Подключение модулей
//**************************************************
SPIslave #(SPI_Width) SPI_1(.SCK(SCKin), .MOSI(MOSIin), .MISO(MISOout), .data(dataOUT));
Counter #(CNT_Width) CNT_1(.clock(pulse), .Cnt(Cur_Cnt));
// Создание модулей CCP
genvar y;
generate
for(y = 0; y < num_PWM; y = y + 1 ) begin : CCP_generation
CCP #(CNT_Width) CCP_0(.clock(pulse), .CurCNT(Cur_Cnt), .CompareVal(CCP_Addr[y]), .PWM_out(PWM[y]));
end
endgenerate
//**************************************************
endmodule
//**************************************************
[свернуть]