Сообщение от
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: фигня, походу это всё считывалось с ШД проца, т.к. я перепутал спады/подъемы сигналов ))))