1
0
mirror of https://github.com/Gehstock/Mist_FPGA.git synced 2026-02-28 17:09:12 +00:00
Files
2021-09-02 21:08:25 +02:00

282 lines
5.1 KiB
Verilog

// Video timings for Interact Model One based on sheet #2 of the Interact I Main Electronics Schematics
// Tries as much as possible to map modules to physical ICs on the original schematics
module video_timing (
input clk_14m, // 14.38180 MHz Clock
input rst_n, // active low reset
output ph1, // CPU phase1 clock for 8080a
output ph2, // CPU phase2 clock
output cbclk, // colorburst clock
output pix_a, // pixel select
output reg vid_sel, // video select
output reg [11:0] vid_addr,
output vid_sel_n, // video select low
input nrr_n, // refresh
output ce_n, // RAS#
output pce, // video data latch enable
output vid_ltc, // video latch/pixel clock
output ram_clk, // ram clock
output brst, // color burst enable
output reg tpclk, // tape clock, once per scanline
output cmp_blank, // composite blank
output irq, // interrupt request low
input inte, // interrupt enable
output cmp_sync, // composite sync
output hblank_n, // horizontal blank
output vblank_n, // vertical blank
output hsync_n, // horizontal sync
output vsync_n // vertical sync
);
wire ic15_qb;
wire ic15_qc;
wire ic15_qdn;
wire ic16_qa;
wire ic16_qc;
wire ic18_q1;
wire vclk_n;
wire vclk;
wire vreset_n;
wire ic20_d1;
wire hblank_en;
wire brst_n;
wire hreset_n;
wire ic24_q;
SN74LS195 IC15(
.clk(clk_14m),
.clrn(rst_n),
.j(ic15_qdn),
.kn(ic15_qdn),
.sh_ldn(~(ic16_qa & ic16_qc & pix_a & vid_sel)),
.a(0),
.b(0),
.c(0),
.d(0),
.qb(ic15_qb),
.qc(ic15_qc),
.qd(ph2),
.qdn(ic15_qdn));
assign ph1 = ic15_qb & ~ic15_qc;
SN74LS92 IC16(
.clka(~clk_14m),
.clra(~rst_n),
.clkb(ic16_qa),
.clrb(~rst_n),
.qa(ic16_qa),
.qb(vid_ltc),
.qc(ic16_qc),
.qd(pix_a));
SN74LS74 IC20(
.clk1(ic16_qa),
.clrn1(rst_n),
.prn1(rst_n),
.d1(ic20_d1),
.qn1(ic20_d1),
.q1(cbclk),
.clk2(vid_ltc & vid_sel & ~pix_a & vid_addr[0]),
.clrn2(rst_n),
.prn2(rst_n),
.d2(hblank_en),
.q2(hblank_n)
);
//dff IC20a(.clk(ic16_qa), .clrn(rst_n), .prn(rst_n), .d(~cbclk), .q(cbclk));
//SN74LS393 IC17(
// .a1(pix_a),
// .clr1(~hreset_n | ~rst_n),
// .a2(vid_a2),
// .clr2(~hreset_n | ~rst_n),
//
// .q1a(vid_sel),
// .q1b(vid_a0),
// .q1c(vid_a1),
// .q1d(vid_a2),
// .q2a(vid_a3),
// .q2b(vid_a4),
// .q2c(tpclk));
wire hclr = ~hreset_n | ~rst_n;
always@(negedge pix_a or posedge hclr)
begin
if (hclr)
begin
{tpclk, vid_addr[4:0], vid_sel} <= 7'b0;
end
else
begin
{tpclk, vid_addr[4:0], vid_sel} <= {tpclk, vid_addr[4:0], vid_sel} + 1'b1;
end
end
assign vid_sel_n = ~vid_sel;
// SR Latch just not stable in simulation and probably no better in synthesis
//
//SN7LS279 IC21 (
// .r1n(),
// .s11n(),
// .s12n(),
// .q1(),
//
// .r2n(~(vid_addr[5] & vid_addr[6] & vid_addr[11]) & rst_n),
// .s2n(vreset_n),
// .q2(vblank_n),
//
// .r3n(~(vid_addr[2] & vid_addr[3] & vid_addr[4]) & rst_n),
// .s31n(hreset_n),
// .s32n(hreset_n),
// .q3(hblank_en),
//
// .r4n(),
// .s4n(),
// .q4()
//);
// Substitute SR Flip-Flop for SR Latch, address signals only change on master clock anyway
srff IC21b (
.s(1'b0),
.r(vid_addr[5] & vid_addr[6] & vid_addr[11] & rst_n),
.clk(clk_14m),
.clrn(1'b1),
.prn(vreset_n),
.q(vblank_n)
);
srff IC21c (
.s(1'b0),
.r(vid_addr[2] & vid_addr[3] & vid_addr[4] & rst_n),
.clk(clk_14m),
.clrn(1'b1),
.prn(hreset_n),
.q(hblank_en)
);
assign cmp_blank = ~(vblank_n & hblank_n);
SN74LS138 IC22 (
.a(vid_addr[1]),
.b(vid_addr[2]),
.c(vid_addr[3]),
.g1(1'b1),
.g2an(hblank_en),
.g2bn(hblank_en),
.y0n(hsync_n),
.y1n(brst_n),
.y2n(),
.y3n(hreset_n),
.y4n(),
.y5n(),
.y6n(),
.y7n()
);
assign brst = ~brst_n;
SN74LS73 IC18 (
.clk1(tpclk),
.j1(vclk_n),
.k1(1'b1),
.clrn1(vreset_n & rst_n),
.q1(ic18_q1),
.clk2(tpclk),
.j2(ic18_q1),
.k2(1'b1),
.clrn2(vreset_n & rst_n),
.q2(vclk),
.qn2(vclk_n));
//jkff IC18a (.clk(tpclk), .j(~vclk), .k(1'b1), .clrn(vreset_n & rst_n), .prn(rst_n), .q(ic18_q1));
//jkff IC18b (.clk(tpclk), .j(ic18_q1), .k(1'b1), .clrn(vreset_n & rst_n), .prn(rst_n), .q(vclk));
//SN74LS393 IC19(
// .a1(vclk),
// .clr1(~vreset_n | ~rst_n),
// .a2(vid_a8),
// .clr2(~vreset_n | ~rst_n),
//
// .q1a(vid_a5),
// .q1b(vid_a6),
// .q1c(vid_a7),
// .q1d(vid_a8),
// .q2a(vid_a9),
// .q2b(vid_a10),
// .q2c(vid_a11));
wire vclr = ~vreset_n | ~rst_n;
always@(negedge vclk or posedge vclr)
begin
if (vclr)
begin
vid_addr[11:5] <= 7'b0;
end
else
begin
vid_addr[11:5] <= vid_addr[11:5] + 1'b1;
end
end
assign vreset_n = (~(vid_addr[5] & vid_addr[6] & vid_addr[7])) | (~(ic18_q1 & vid_addr[9] & vid_addr[11]));
assign vsync_n = ((vid_addr[6] | vid_addr[7]) | ~(vid_addr[9] & vid_addr[11]));
assign cmp_sync = !(vsync_n & hsync_n);
dff IC24(
.d(1'b0),
.q(ic24_q),
.clk(~vblank_n),
.prn(inte),
.clrn(rst_n)
);
assign irq = ~ic24_q;
wire ce;
wire nrr_en = ~(~(nrr_n | ~vid_sel) & pix_a & vid_ltc);
srff IC21a (
.s(1'b0),
.r(ic16_qc & ~pix_a),
.clk(clk_14m),
.clrn(1'b1),
.prn(~(~vid_sel & pix_a & vid_ltc) & nrr_en & rst_n),
.q(ce)
);
srff IC21d (
.s(1'b0),
.r(ic16_qc & ~pix_a),
.clk(clk_14m),
.clrn(1'b1),
.prn(nrr_en & rst_n),
.q(pce)
);
assign ce_n = ~ce;
assign ram_clk = ~pix_a & pce;
endmodule