User Tag List

Показано с 1 по 10 из 202

Тема: SQRUM 1M

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    20.01.2016
    Адрес
    п. Власиха, Московская обл.
    Сообщений
    594
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    41
    Поблагодарили
    22 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от HardWareMan Посмотреть сообщение
    EvgenRU, а ты покажи пример схемного ввода и я покажу твои косяки.
    Ну, я взял из стандартной схемы кворума

    Удалось даже немного упростить
    Код:
    // latch pixels, pixel shift
    always @(negedge OSC)
    	if(DC2n & DC1 & DC0)
    		SHIFT_REG <= 202;//MD;
    	else
    		SHIFT_REG <= SHIFT_REG << 1;
    Цитата Сообщение от omercury Посмотреть сообщение
    Также нежелательно использовать для регистров блокирующее присвоение. ( "=" вместо "<=" )
    Я тут почитал http://asdasd.rpg.fi/~svo/verilog/assignments/ и как-то уже не на 100% уверен в этом, т.к. синтезатор всё-равно сам всё сделает в этом случае.

    PS: ПЗУ могу помочь зашить или подарить зашитое, при желании.

    PS2: вот еще мультиплексор РАБОЧИЙ!

    Скрытый текст

    Код:
    module ZX_mux(
    	input wire [4:0] H,		// horizontal counter
    	input wire [7:0] V,		// vertical counter
    	input wire [19:14] RAM,	// Muxed Extended RAM address
    	input wire [15:0] A,	// Z80 adderss
    	input wire S0,			// RAS
    	input wire DC1,			// H1
    	input wire DC2,			// H2
    	input wire SCR,			// Second SCREEN (128k)
    	input wire CLK,			// CLOCK signal 14MHZ
    	output reg [9:0] MA
    );
    
    always @(negedge CLK)
    begin
    //-----------------------
    // S0 - RAS
    // DC1 - 0=CPU/1=VIDEO
    // DC2 - 0=PIXELS/1=ATTR
    //-----------------------
    	if(DC1)
    	begin
    		// VIDEO CONTROLLER ADDRESSES
    		// screen area address + DRAM refresh
    		if(S0)
    		begin  // SELECT B
    			// screen area row address
    			MA[0] <= 1;
    			MA[1] <= 1;
    			MA[2] <= 0;
    			if(DC2)
    			begin
    				// Attributes
    				MA[3] <= 0;
    				MA[4] <= 1;
    				MA[5] <= 1;
    			end
    			else
    			begin
    				// pixels
    				MA[3] <= V[2];
    				MA[4] <= V[6];
    				MA[5] <= V[7];
    			end
    			MA[6] <= 0;
    			MA[7] <= 0;//SCR;
    			MA[8] <= 0;
    			MA[9] <= 0;
    		end
    		else
    		begin // SELECT A
    			// screen area column address
    			MA[4:0] <= H[4:0];
    			MA[7:5] <= V[5:3];
    			if(DC2)
    			begin
    				// attributes
    				MA[8] <= V[6];
    				MA[9] <= V[7];
    			end
    			else
    			begin
    				//pixels
    				MA[8] <= V[0];
    				MA[9] <= V[1];
    			end
    		end
    	end
    	else
    	begin
    		// CPU ADDRESSES
    		// memory address
    		if(S0)
    		begin // SELECT B
    			// memory row address
    			MA[0] <= RAM[14];
    			MA[1] <= RAM[16];
    			MA[2] <= RAM[18];
    			MA[6:3] <= A[13:10];
    			MA[7] <= RAM[15];			
    			MA[8] <= RAM[17];
    			MA[8] <= RAM[19];
    		end
    		else
    		begin // SELECT A
    			// memory column address
    			MA[9:0] <= A[9:0];
    		end
    	end
    end
    
    endmodule
    [свернуть]



    PS3: вот еще буферы

    Скрытый текст

    Код:
    module ZX_buf(
    	input RAMWEn,
    	input RAMCSn,
    	input DC0,
    	input DC1n,
    	inout [7:0] D,
    	inout [7:0] MD
    );
    
    reg [7:0] wr_buf;
    wire wrbuf = DC0 & DC1n;
    
    assign MD = RAMWEn ? 8'bZZZZZZZZ : D;
    assign D  = RAMCSn ? 8'bZZZZZZZZ : wr_buf;
    
    always @ (posedge wrbuf)
        wr_buf <= MD;
    
    endmodule
    [свернуть]
    Последний раз редактировалось EvgenRU; 02.04.2017 в 17:13.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    HardWareMan
    Гость

    По умолчанию

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    Ну, я взял из стандартной схемы кворума

    Скрытый текст

    [свернуть]
    Зачем непонятная и сложная 299, когда есть православная 198 (ИР13)? Я понимаю, что синтезатор вырежет из нее тристэйт, но зачем усложнять то? И вообще, зачем использовать сложный элемент в кастрированном режиме, если синтезатор все равно его обкромсает, причем часто не так, как нужно вам? Если вам нужно только 2 режима: загрузка и сдвиг, то не проще ли синтезатору прямо об этом сказать?

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    Я тут почитал http://asdasd.rpg.fi/~svo/verilog/assignments/ и как-то уже не на 100% уверен в этом, т.к. синтезатор всё-равно сам всё сделает в этом случае.
    Откройте уже для себя просмотр RTL. Это единственный способ узнать, как именно поняли вас синтезатор и фиттер (а они работают вместе и результат часто отличается для разных типов ПЛИС).
    Цитата Сообщение от EvgenRU Посмотреть сообщение
    PS2: вот еще мультиплексор РАБОЧИЙ!
    Потому, что этот мультиплексор регистровый (с хранением результата) и управляется из одного always блока, что как раз и соответствует всем требованиям. Если бы вам нужен был мультплекор на комбинаторике, его синтаксис был бы несколько иначе. Вот пример:

    Скрытый текст

    Код:
    assign MAPC_A[17:10] = (~CTRL[7]) ? (
                            (PPU_A[12:11] == 2'h0) ? BCH0[7:0] :
                            (PPU_A[12:11] == 2'h1) ? BCH1[7:0] :
                            (PPU_A[12:10] == 3'h4) ? CHR2[7:0] :
                            (PPU_A[12:10] == 3'h5) ? CHR3[7:0] :
                            (PPU_A[12:10] == 3'h6) ? CHR4[7:0] : CHR5[7:0]
                            ) : (
                            (PPU_A[12:10] == 3'h0) ? CHR2[7:0] :
                            (PPU_A[12:10] == 3'h1) ? CHR3[7:0] :
                            (PPU_A[12:10] == 3'h2) ? CHR4[7:0] :
                            (PPU_A[12:10] == 3'h3) ? CHR5[7:0] :
                            (PPU_A[12:11] == 2'h2) ? BCH0[7:0] : BCH1[7:0]
                            );
    [свернуть]
    Последний раз редактировалось HardWareMan; 02.04.2017 в 12:40.

  4. #3

    Регистрация
    13.02.2016
    Адрес
    г. Королёв
    Сообщений
    493
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    11 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    как-то уже не на 100% уверен в этом
    "Весьмя згя!" (с)
    Блокирующее присвоение будет держать цикл до своего полного выполнения и нарушит всю растактовку. Актуально, конечно же для синхронных схем (что к спекки не относится ни в коей мере) и не для текущих частот, но лучше привыкать к этому сразу. А уж если синтезатор "исправит" за Вами блокируещее на неблокирующее, то это косяк!

    Цитата Сообщение от EvgenRU Посмотреть сообщение
    PS: ПЗУ могу помочь зашить или подарить зашитое, при желании.
    Боюсь, что программатор я сделаю быстрее...

    UPD
    Цитата Сообщение от EvgenRU Посмотреть сообщение
    PS2:
    Почитайте про конкатенацию.
    Последний раз редактировалось omercury; 02.04.2017 в 11:57.

  5. #4

    Регистрация
    20.01.2016
    Адрес
    п. Власиха, Московская обл.
    Сообщений
    594
    Спасибо Благодарностей отдано 
    6
    Спасибо Благодарностей получено 
    41
    Поблагодарили
    22 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от omercury Посмотреть сообщение
    UPD
    Почитайте про конкатенацию.
    Спасибо, переделал мультиплексор :-D
    Код:
    module ZX_mux(
    	input wire [4:0] H,		// horizontal counter
    	input wire [7:0] V,		// vertical counter
    	input wire [19:14] RAM,	// Muxed Extended RAM address
    	input wire [15:0] A,	// Z80 adderss
    	input wire S0,			// RAS
    	input wire DC1,			// H1
    	input wire DC2,			// H2
    	input wire SCR,			// Second SCREEN (128k)
    	output wire [9:0] MA
    );
    
    assign MA = DC1 ? (
    				S0 ?	{2'b00,SCR,1'b0,DC2 ? 3'b110 : {V[7],V[6],V[2]} /*attr/pix*/, 3'b011} :
    						{DC2 ? V[7:6] : V[1:0] /*attr/pix*/, V[5:3], H[4:0]}
    			) : (
    				S0 ? 	{RAM[19], RAM[17], RAM[15], A[13:10], RAM[18], RAM[16], RAM[14]} :
    						A[9:0]
    			);
    endmodule
    UPD: подозреваю, что это некорректно, т.к. в счетчике изменение этих сигналов происходит по спаду пиксельклока и соответственно менять адреса нужно так же по спаду тактового генератора!
    Т.е. так
    Код:
    module ZX_mux(
    	input wire [4:0] H,		// horizontal counter
    	input wire [7:0] V,		// vertical counter
    	input wire [19:14] RAM,	// Muxed Extended RAM address
    	input wire [15:0] A,	// Z80 adderss
    	input wire S0,			// RAS
    	input wire DC1,			// H1
    	input wire DC2,			// H2
    	input wire SCR,			// Second SCREEN (128k)
    	input wire CLK,			// 14MHZ
    	output reg [9:0] MA
    );
    
    always @(negedge CLK)
    	MA <= DC1 ? (
    		S0 ?	{2'h0,SCR,1'h0,DC2 ? 3'h6 : {V[7],V[6],V[2]} /*attr/pix*/, 3'h3} :
    				{DC2 ? V[7:6] : V[1:0] /*attr/pix*/, V[5:3], H[4:0]}
    	) : (
    		S0 ? 	{RAM[19], RAM[17], RAM[15], A[13:10], RAM[18], RAM[16], RAM[14]} :
    				A[9:0]
    	);
    
    endmodule
    UPD: Ну что ж, можете меня почти поздравить!!!!!

    Матрас без ПЗУ, бежит немного ввеох
    Атрибуты те что надо! Экран почти как надо, видимо я где-то попутал или в мультиплексоре или в рас/кас...

    UPD1: убедился, что это не мультиплексор
    UPD2: скорее всего проблема в рассинхронизация выборки байтов аттрибутов/пикселей....
    UPD3: оказалось схемный ввод обработчика портов сильно тормозил схему! теперь как-то по-другому всё работает как переписал на Verilog.
    UPD4: фигня, походу это всё считывалось с ШД проца, т.к. я перепутал спады/подъемы сигналов ))))
    Последний раз редактировалось EvgenRU; 10.08.2017 в 22:13.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •