можно чисто ради интереса - на этом конкретном примере написать код в ХДЛ и посмотреть что лучше скомпилируется - схема или ХДЛ )
Вид для печати
можно чисто ради интереса - на этом конкретном примере написать код в ХДЛ и посмотреть что лучше скомпилируется - схема или ХДЛ )
Ну, моего опыта, например, хватает, чтобы в схемном вводе получить результат как минимум не хуже, чем в HDL. Более того, RTL потом будет практически 1:1, а ведь это именно то, что положится в ПЛИСину. Преимущества xHDL вижу лишь в том, что их гораздо легче редактировать. Но мне как инженеру схемотехнику гораздо привычнее смотреть схему устройства а не ее описание на xHDL.
Так это же я схему кворума взял, а там всё именно так, вот я и планирую её оптимизировать, понятно, что в 90-е это делалось в отсутствие информации и в сжатые сроки. Возможно еще поддержка CP/M тут каким-то боком замешана...
Попробую из других клонов подсмотреть дельные блоки.
Да, на блоки поделить это отличная идея, я просто сначала так сделал, чтобы было общее представление о схеме и ничего не потерять, т.к. сделано это из 3-х схем, но уже всё это реализовано в железе на мелкой логике и работает.
Странно, но он работает и нормально регенерирует, схема взята от реального образца Quorum 1024
на мелкой работает, на CPLD которые как минимум в разы быстрее может глючить, (например меркая логика не реагировала на коротки иголки, на которые CPLD уже ввиду более выского быстродействая среагирует) особенно критично в участках с счетчиками с самобросом итд, нужно внимательно оценить гонки сигналов, возможно где то придется добавить привязку к синхронизации
178 каналов ШИМ.
Скрытый текст
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
//**************************************************
[свернуть]
Страшно? :D
Начал разбивать на модули, пока что делаю менеджер памяти, получилось как-то так
http://savepic.ru/13170466.png
Есть ли смысл делать чтение портов 7FFD и 1FFD ?
Вот так его в схему засунул :)
http://savepic.ru/13162309.png
...и не предвидится...
Глазками-ручками.
Кнопочка только в обратную сторону работает.
Впрочем Вы это и сами знаете.
- - - Добавлено - - -
Наличие возможности чтения порта Вас ни к чему не обязывает - если какая-либо часть схемы в дальнейшем не используется, фиттер её просто выкинет при компиляции.
Пока что привел к такому виду, выкинул задержку видеовыхода, буду с ним разбираться когда отладочную плату сварганю.
http://savepic.ru/13110870.png
Получилось 95MC, так что можно еще и порты добавить.
Пока что застрял на Wave симуляции, хочу посмотреть что на счетчиках получается, но не могу понять как это сделать :( может кто кинет ссылочкой на толковый материал по этому поводу?
PS: добавил последнюю версию в первое сообщение