можно чисто ради интереса - на этом конкретном примере написать код в ХДЛ и посмотреть что лучше скомпилируется - схема или ХДЛ )
можно чисто ради интереса - на этом конкретном примере написать код в ХДЛ и посмотреть что лучше скомпилируется - схема или ХДЛ )
Ну, моего опыта, например, хватает, чтобы в схемном вводе получить результат как минимум не хуже, чем в HDL. Более того, RTL потом будет практически 1:1, а ведь это именно то, что положится в ПЛИСину. Преимущества xHDL вижу лишь в том, что их гораздо легче редактировать. Но мне как инженеру схемотехнику гораздо привычнее смотреть схему устройства а не ее описание на xHDL.
Так это же я схему кворума взял, а там всё именно так, вот я и планирую её оптимизировать, понятно, что в 90-е это делалось в отсутствие информации и в сжатые сроки. Возможно еще поддержка CP/M тут каким-то боком замешана...
Попробую из других клонов подсмотреть дельные блоки.
Да, на блоки поделить это отличная идея, я просто сначала так сделал, чтобы было общее представление о схеме и ничего не потерять, т.к. сделано это из 3-х схем, но уже всё это реализовано в железе на мелкой логике и работает.
Странно, но он работает и нормально регенерирует, схема взята от реального образца Quorum 1024
Последний раз редактировалось EvgenRU; 06.03.2017 в 22:35.
на мелкой работает, на 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
//**************************************************
[свернуть]
Страшно?
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Начал разбивать на модули, пока что делаю менеджер памяти, получилось как-то так
Есть ли смысл делать чтение портов 7FFD и 1FFD ?
Вот так его в схему засунул
Последний раз редактировалось EvgenRU; 07.03.2017 в 00:06.
...и не предвидится...
Глазками-ручками.
Кнопочка только в обратную сторону работает.
Впрочем Вы это и сами знаете.
- - - Добавлено - - -
Наличие возможности чтения порта Вас ни к чему не обязывает - если какая-либо часть схемы в дальнейшем не используется, фиттер её просто выкинет при компиляции.
Последний раз редактировалось omercury; 06.03.2017 в 21:16.
Пока что привел к такому виду, выкинул задержку видеовыхода, буду с ним разбираться когда отладочную плату сварганю.
Получилось 95MC, так что можно еще и порты добавить.
Пока что застрял на Wave симуляции, хочу посмотреть что на счетчиках получается, но не могу понять как это сделать может кто кинет ссылочкой на толковый материал по этому поводу?
PS: добавил последнюю версию в первое сообщение
Последний раз редактировалось EvgenRU; 08.03.2017 в 11:13.
Profi v3.2 -=- Speccy2010,r2
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)