Сообщение от
Syntal
Была вобщем-то простая как три копейки идейка утрамбовать всю логику Ленинграда-1 в ПЛИС Altera EPM7128. Как наивный чукотский юноша я думал, что забабахаю всё сам, используя схемный ввод Quartusа. Сделал платку под ПЛИСину, платку с 8 РУ7 (для расширения в последующем до 128-256 Кб), проц, ПЗУ есть, собрал всё это на бредборде. Создал проект в Quartusе, решил сначала для проверки собрать синхрогенератор для видеоконтроллера, компильнул это дело, прошил. Стал проверять, сигналы после первого счётчика ИЕ7 (H0-H3) - нормальные - сверял на своём KAY-128. Со вторым уже счётчиком (H4-H7) встал туган - он делит не на 2^n - осцилл не синхронизируется, встал вопрос, как вообще можно осциллом проверить хитрые сигналы? Потыркался пару дней, ничего не придумал, решил проверить синхроимпульсы КСИ и ССИ. Вобщем результат меня вконец убил: кадровый СИ на ПЛИС 13 милисек период и 15 микросекунд длительность (на KAY положеные 20 и 10 соответственно), строчного СИ вообще нет. Меня предупреждали, что схемным вводом только косяки получаются, я не поверил, теперь вот уже месяц не знаю, что делать. Надо писать на HDL, но я не врубаюсь в это дело, не мог бы кто-нибудь из гуру помочь примерчиком на каком-нибудь великом и могучем HDL-языке как хотя бы до КСИ и ССИ доползти? Может кто-нибудь также интересуется данной идеей и будет не против проверки своих HDL-идей на практически готовом железе?
Прежде чем лить в камень, проверь прошивку в симуляторе (в квартусе есть свой встроеный). Тогда увидишь все изменения сигналов. По поводу HDL - у каждого своё предпочтение. Написать видео на HDL намного проще, нежели в схемном вводе. Например (на верилоге)
Код:
module videocore(CLK14, nRESET, PIXEL, LINE, nHSYNC, nVSYNC, nHBLANK, nVBLANK, nSWAPBUF);
input CLK14;
input nRESET;
output [8:0] PIXEL;
output [7:0] LINE;
output nHSYNC;
output nVSYNC;
output nHBLANK;
output nVBLANK;
output nSWAPBUF;
reg [8:0] HCNTR;
reg [9:0] VCNTR;
wire [8:0] PIXEL;
wire [7:0] LINE;
wire nSWAPBUF;
reg nHSYNC, nVSYNC, nHBLANK, nVBLANK;
always @(posedge CLK14 or negedge nRESET) begin
if(!nRESET) begin
HCNTR = 9'b0;
nHSYNC = 1;
nHBLANK = 0;
end
else begin
HCNTR = (HCNTR == LINE_END) ? 9'b0 : HCNTR + 1;
nHSYNC = !((HCNTR > HSYNC_START) && (HCNTR < HSYNC_END));
nHBLANK = !(HCNTR > LINE_BLANK);
end
end
always @(posedge nHSYNC or negedge nRESET) begin
if(!nRESET) begin
VCNTR = 8'b0;
nVSYNC = 1;
nVBLANK = 0;
end
else begin
VCNTR = (VCNTR == FRAME_END) ? 10'b0 : VCNTR + 1;
nVSYNC = !((VCNTR > VSYNC_START) && (VCNTR < VSYNC_END));
nVBLANK = !(VCNTR > FRAME_BLANK);
end
end
//assign nVBLANK = !(VCNTR > FRAME_BLANK);
assign nSWAPBUF = !(!nHSYNC && VCNTR[0]);
assign PIXEL = HCNTR;
assign LINE = (!nVBLANK) ? 0 : VCNTR[8:0] >> 1;
endmodule
Это только маленький кусочек (константы опущены), потому как это кусок рабочего проекта.