assign I_RED = {vga_out[7:5], vga_out[7:5], vga_out[7:6]};
assign I_GREEN = {vga_out[4:2], vga_out[4:2], vga_out[4:3]};
assign I_BLUE = {vga_out[1:0], vga_out[1:0], vga_out[1:0], vga_out[1:0]};
Гы..!
wire
Вид для печати
omercury, туплю, помоги :
module vga_gen
(
input wire clk_50MHz,
output wire [7:0] TMDS
);
wire h_sync;
wire v_sync;
wire picselclock;
wire hdmi_clock;
wire blank;
wire vaddr[7:0];
vga_sync VGA_SYN
( .clk_in (clk_50MHz),
.picselclock(picselclock) ,
.hdmi_clock(hdmi_clock),
.vga_hsync (h_sync),
.vga_vsync (v_sync),
.disp_enable (blank),
.v_addr (vaddr)
);
hdmi #(
.FREQ(5200000),
.FS(48000),
.CTS(25200),
.N(6144))
HDMI1 (
.I_CLK_VGA (picselclock),
.I_CLK_TMDS (hdmi_clock),
.I_HSYNC (h_sync),
.I_VSYNC (v_sync),
.I_BLANK (~blank),
//.I_RED (8'b11111111),
.I_RED (),
.I_GREEN (),
.I_BLUE (),
.I_AUDIO_PCM_L (1'b0),
.I_AUDIO_PCM_R (1'b0),
.O_TMDS (TMDS)
);
assign I_RED = { vaddr[7:5], vaddr[7:5], vaddr[7:6]};
assign I_GREEN = { vaddr[4:2], vaddr[4:2], vaddr[4:3]};
assign I_BLUE = { vaddr[1:0], vaddr[1:0], vaddr[1:0], vaddr[1:0]};
endmodule
- - - Добавлено - - -Цитата:
Warning (10236): Verilog HDL Implicit Net warning at vga_gen.v(56): created implicit net for "I_RED"
Warning (10236): Verilog HDL Implicit Net warning at vga_gen.v(57): created implicit net for "I_GREEN"
Warning (10236): Verilog HDL Implicit Net warning at vga_gen.v(58): created implicit net for "I_BLUE"
Error (10044): Verilog HDL error at vga_gen.v(30): expression cannot reference entire array "vaddr"
Error (10048): Verilog HDL error at vga_gen.v(30): values cannot be assigned directly to all or part of array "vaddr" - assignments must be made to individual elements only
Error (10133): Verilog HDL Expression error at vga_gen.v(56): illegal part select of unpacked array "vaddr"
Error (10133): Verilog HDL Expression error at vga_gen.v(57): illegal part select of unpacked array "vaddr"
Error (10133): Verilog HDL Expression error at vga_gen.v(58): illegal part select of unpacked array "vaddr"
Error: Quartus II 64-Bit Analysis & Synthesis was unsuccessful. 5 errors, 3 warnings
Error: Peak virtual memory: 4622 megabytes
Error: Processing ended: Sat Oct 05 15:42:10 2019
Error: Elapsed time: 00:00:09
Error: Total CPU time (on all processors): 00:00:09
Error (293001): Quartus II Full Compilation was unsuccessful. 7 errors, 3 warnings
Мда , досадная ошибка из-за невнимательности ...
Надо
wire [7:0] vaddr;
а не
wire vaddr[7:0];
Скрытый текст
module vga_gen
(
input wire clk_50MHz,
output wire [7:0] TMDS
);
wire h_sync;
wire v_sync;
wire picselclock;
wire hdmi_clock;
wire blank;
wire vaddr[7:0];
vga_sync VGA_SYN
( .clk_in (clk_50MHz),
.picselclock(picselclock) ,
.hdmi_clock(hdmi_clock),
.vga_hsync (h_sync),
.vga_vsync (v_sync),
.disp_enable (blank),
.v_addr (vaddr)
);
hdmi #(
.FREQ(5200000),
.FS(48000),
.CTS(25200),
.N(6144))
HDMI1 (
.I_CLK_VGA (picselclock),
.I_CLK_TMDS (hdmi_clock),
.I_HSYNC (h_sync),
.I_VSYNC (v_sync),
.I_BLANK (~blank),
//.I_RED (8'b11111111),
.I_RED (I_RED ),
.I_GREEN (I_GREEN),
.I_BLUE (I_BLUE),
.I_AUDIO_PCM_L (1'b0),
.I_AUDIO_PCM_R (1'b0),
.O_TMDS (TMDS)
);
wire [7:0] I_RED = { vaddr[7:5], vaddr[7:5], vaddr[7:6]};
wire [7:0] I_GREEN = { vaddr[4:2], vaddr[4:2], vaddr[4:3]};
wire [7:0] I_BLUE = { vaddr[1:0], vaddr[1:0], vaddr[1:0], vaddr[1:0]};
endmodule[свернуть]
Цвета не подключил.
Что ж так тормозит-то?
Угу и это то же.
Вообщем счас так :
Можно продолжать...Код:module vga_gen
(
input wire clk_50MHz,
output wire [7:0] TMDS
);
wire h_sync;
wire v_sync;
wire picselclock;
wire hdmi_clock;
wire blank;
wire [7:0] vaddr;
vga_sync VGA_SYN
( .clk_in (clk_50MHz),
.picselclock(picselclock) ,
.hdmi_clock(hdmi_clock),
.vga_hsync (h_sync),
.vga_vsync (v_sync),
.disp_enable (blank),
.v_addr (vaddr)
);
hdmi #(
.FREQ(5200000),
.FS(48000),
.CTS(25200),
.N(6144))
HDMI1 (
.I_CLK_VGA (picselclock),
.I_CLK_TMDS (hdmi_clock),
.I_HSYNC (h_sync),
.I_VSYNC (v_sync),
.I_BLANK (~blank),
.I_RED ({ vaddr[7:5], vaddr[7:5], vaddr[7:6]}),
.I_GREEN ({ vaddr[4:2], vaddr[4:2], vaddr[4:3]}),
.I_BLUE ({ vaddr[1:0], vaddr[1:0], vaddr[1:0], vaddr[1:0]}),
.I_AUDIO_PCM_L (1'b0),
.I_AUDIO_PCM_R (1'b0),
.O_TMDS (TMDS)
);
endmodule
Шрифт ещё не подбирал?
Угу ...
- - - Добавлено - - -
Копипаст с нотепада++ прокатывает только до сохранения , дальше так же .
Плюнул, камменты english only, forever ...
- - - Добавлено - - -
HardWareMan, Вот RTL :
RTL кликабельно
dosikus, ты его не мне показывай. Ты его сам научись правильно считывать.
HardWareMan, в смысле читать /понимать?
dosikus, да, и самое главное - делать выводы. Оно потом как положительная обратная связь начинает работать. Как давно сказал кто-то из моих знакомых: сначала программист развивает программу, а потом программа развивает программиста.
omercury, так как визард тыкать неззя, а нам нужна тактовая и сброс на 8051 , правильно ли я понимаю :
Редактируем v_pll :
Было
СталоКод:module v_pll #(parameter mul1 = 5, mul2 = 1, div1 = 2, div2 = 2)
(
inclk0,
c0,
c1);
input inclk0;
output c0;
output c1;
wire [4:0] sub_wire0;
wire [0:0] sub_wire5 = 1'h0;
wire [1:1] sub_wire2 = sub_wire0[1:1];
wire [0:0] sub_wire1 = sub_wire0[0:0];
wire c0 = sub_wire1;
wire c1 = sub_wire2;
wire sub_wire3 = inclk0;
wire [1:0] sub_wire4 = {sub_wire5, sub_wire3};
altpll altpll_component (
.inclk (sub_wire4),
.clk (sub_wire0),
.locked (),
.vcooverrange (),
.vcounderrange ());
Код:module v_pll #(parameter mul1 = 5, mul2 = 1, mul3=2, div1 = 2, div2 = 2, div3=1)
(
inclk0,
c0,
c1,
c2,
locked);
input inclk0;
output c0;
output c1;
output c2;
output locked;
wire [4:0] sub_wire0;
wire [0:0] sub_wire5 = 1'h0;
wire [2:2] sub_wire6 = sub_wire0[2:2];
wire [1:1] sub_wire2 = sub_wire0[1:1];
wire [0:0] sub_wire1 = sub_wire0[0:0];
wire c0 = sub_wire1;
wire c1 = sub_wire2;
wire c2 = sub_wire6;
wire sub_wire3 = inclk0;
wire [1:0] sub_wire4 = {sub_wire5, sub_wire3};
altpll altpll_component (
.inclk (sub_wire4),
.clk (sub_wire0),
.locked (locked),
.vcooverrange (),
.vcounderrange ());
dosikus, смотреть-то никто не запрещал. :)
Создай новую PLL, открой блокнотом и посмотри разницу.
Там всё просто, разберёшься с ходу.
Какая частота-то нужна?
Ты сделал 100МГц.
Или другой вариант - заюзай вторую PLL, благо у тебя их 4 штуки.
И меньше 4 всё равно не будет.)))
Да, все получилось , да 100MHz. Правда пришлось еще в alt_pll дефпараметр править.
Вопрос , epm3256aqc208 толерантна к 5в. или надо резисторы ставить ? Например в pdf по xilinx четко пишут толерантность.
Еще вопрос ,кто нибудь прикручивал SDRAM 100мгц через плис к медленным проектам типа спектрума , где не быстрое асинхронная работа память+проц ?
Если вывод работает на вход, то резистор по 300 ом необходим, на вывод - не нужен.
Разумеется, да.
Например, знаменитая корка Влада от ReVerSe_xx
Но, есть нюанс...
1. На Z80 катит, ибо есть аппаратный рефрешь;
2. На Z80 катит, ибо цикл чтения/записи занимает более 1 такта ЦП;
3. Не используется с экранной памятью, ибо дОлжно соблюдать жесткие тайминги;
4. Если цикл обращения к памяти уже запущен, новое обращение будет проигнорировано (вероятнее всего), ибо нет буферизации (на внедрение которой некоторые пользователи высказывают своё "фи" - дескать расточительное использование ресурсов).
Посему - что надо-то:
Какой проц?
Какая ожидается тактовая?
100МГц - это уже CL-3, а значит 8 тактов SDRAM на цикл рандомного чтения/записи/рефреша.
С буферизацией входа + выхода =8+1+1 тактов на цикл, отсюда и рассчитывать тактовую контроллера.
Это откуда такие требования? Я поставил тут epm3064atc100 без всяких резисторов подал шину данных подтянутую к 5в, уже "мучу" микруху экспериментами долго, но все еще работает и даже не греется. То может для MAX-II такое надо?
- - - Добавлено - - -
я в sdram вообще не шарю, расшифруйте для меня что это значит? неужели что 100/(8+1+1) = 10mhz максимум при "эмуляции sram"?
Как работает SDRAM:
http://www.dsioffe.narod.ru/mysdram/MyMicronSDRAM.htm
Цикл обращения к SDR SDRAM состоит из нескольких тактов, в зависимости от параметров чипа и длины очереди.
У Speccy-2010 вроде 1/(14 МГц), можно посмотреть в исходниках.
Мин. цикл обращения tRC - обычно не менее 60 нс (у SDR).
Временно пришлось завязать, на работе случился переезд в другое помещение, а оно всегда хуже пожара .
смогу пока только в выходные и то если смогу, ибо с внуком сижу.
Сделал как ты пишешь, оставил твой синхрогенератор с твоим PLL и добавил свою PLL.
Готов продолжать, огромное спасибо за помощь...
omercury, Поздравляю!!! Всего, всего,всего!!!
Вопрос , формирование адресов для DRAM на verilog (xilinx).
После компиляции ma10 и ma11 всегда сидят на земле , от чего так ?
A1-A22 адреса проца , ma0-ma11 адреса на DRAM
Код:begin if( mux_switch==0 )
ma[11:0] <= A[22:11];
else // mux_switch==1
ma[9:0] <= A[10:1];
ma[11:10] <= 2'b0;
end
Потому, что надо делать begin/end если в условии более одного оператора, прямо как и в других языках.
Ну ещё можно объединить в ma[11:0] = {2'b0,A[10:1]}Код:begin if( mux_switch==0 )
ma[11:0] <= A[22:11];
else begin// mux_switch==1
ma[9:0] <= A[10:1];
ma[11:10] <= 2'b0;
end
end
JV-Soft, как уже было сказано ранее, кейсы это дляслабаковпрограммистов, каких-либо преимуществ перед другими способами он не даёт.
Пофиг , я не программист я любитель , количество букв меньше , уже приятнее для глаз. Учитывая что про верилог я ещё недавно вообще и не слышал.
Ну тогда в кейсах ты можешь использовать и именованные константы, тогда вообще по феншую читабельности и самокомментирования будет. Но не забывай, что даже в кейсе действует правило begin/end для множественных команд, но так же работает правило множественных состояний (несколько констант на 1 блок), как в С.
Вот именно. При этом, соберется нормальная бинарная схема без излишков.
А скажите, вот так считается нормально, или фу?
Сейчас сам не могу врубиться что у меня на каком такте происходит и как это описать. Так, вроде, проще.Код:always @(*)
begin
// вся комбинаторика
end
always @(posedge clk)
begin
// в регистры пишем выходы комбинаторики
end
Прямую комбинаторику не обязательно оборачивать в always блок. Достаточно описать каждый сигнал через assign. Но то, что такие вещи надо группировать - это правильная идея. Где это может быть полезно? Ну, например, если тебе надо в синхронный триггер загружать выход мультиплексора. Мультиплексор проще и понятнее всего описывается в комбинаторике и формирует сигнал типа wire, который ты и присваиваешь синхронному триггеру. Заметно читаемее чем описание мультиплексора внутри always блока. И в RTL он будет таким, как если бы был в обычной схеме.
Значит я на правильном пути.
Описываю в always из-за сложной и до конца ещё не продуманной логики. Для эксперимента проще налепить if-ов, потом распутывать, если заработает как надо.
Тяжело после ассемблера мозги в сторону HDL разворачивать. Уже и на бумаге схемы рисую, всё равно в тактах путаюсь, что будет происходить до фронта, и что после. А если ещё учесть то, что схема должна работать на упреждение, как бы предсказывая что будет на следующем такте... брррр :)
Bolt, всегда смотри в RTL.
И в RTL смотрю, и в post-map/post-fit, и даже в timing analyzer наносекуды считаю.
А как описать двухпортовую память с портами разной ширины? Сейчас у меня она описана как две 8-битных с выбором по младшему биту адреса, а запись с 16-битного порта выполняется побайтно во второй порт обеих. На выходе получается мультиплексор для данных, а это лишние наносекунды. Вроде это есть аппаратно, но добиться в RTL желаемого результата так и не смог.
Разобрался почему не получалось, я слишком много хотел от блока M9K, он такое не умеет. Один порт может одновременно или читать, или писать, а в режиме "simple dual port", в котором можно в одном такте и читать, и писать, просто используются оба порта.
Bolt, такие вещи обычно в букваре описаны, стало быть там их и надо искать изначально.