mirror of
https://github.com/UzixLS/TSConf_MiST.git
synced 2025-07-18 23:01:37 +03:00
183 lines
4.6 KiB
Verilog
183 lines
4.6 KiB
Verilog
|
|
// This module generates video for DAC
|
|
// (c)2015 TSL
|
|
|
|
`include "tune.v"
|
|
|
|
module video_out
|
|
(
|
|
// clocks
|
|
input wire clk, c3,
|
|
|
|
// video controls
|
|
input wire vga_on,
|
|
input wire tv_blank,
|
|
input wire vga_blank,
|
|
input wire vga_line,
|
|
input wire [1:0] plex_sel_in,
|
|
|
|
// mode controls
|
|
input wire tv_hires,
|
|
input wire vga_hires,
|
|
input wire [3:0] palsel,
|
|
|
|
// Z80 pins
|
|
input wire [15:0] cram_data_in,
|
|
input wire [7:0] cram_addr_in,
|
|
input wire cram_we,
|
|
|
|
// video data
|
|
input wire [7:0] vplex_in,
|
|
input wire [7:0] vgaplex,
|
|
output wire [1:0] vred,
|
|
output wire [1:0] vgrn,
|
|
output wire [1:0] vblu,
|
|
output wire [4:0] vred_raw,
|
|
output wire [4:0] vgrn_raw,
|
|
output wire [4:0] vblu_raw,
|
|
output wire vdac_mode
|
|
);
|
|
|
|
wire [14:0] vpix;
|
|
wire [15:0] vpixel;
|
|
wire [1:0] phase;
|
|
wire [7:0] pwm[0:7];
|
|
|
|
reg blank1; // GOVNOKOD!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
assign vred_raw = vpix[14:10];
|
|
assign vgrn_raw = vpix[9:5];
|
|
assign vblu_raw = vpix[4:0];
|
|
assign vdac_mode = vpixel[15];
|
|
|
|
// TV/VGA mux
|
|
reg [7:0] vplex;
|
|
always @(posedge clk) if (c3)
|
|
vplex <= vplex_in;
|
|
|
|
wire [7:0] plex = vga_on ? vgaplex : vplex;
|
|
wire hires = vga_on ? vga_hires : tv_hires;
|
|
wire plex_sel = vga_on ? plex_sel_in[0] : plex_sel_in[1];
|
|
wire [7:0] vdata = hires ? {palsel, plex_sel ? plex[3:0] : plex[7:4]} : plex;
|
|
wire blank = vga_on ? vga_blank : tv_blank;
|
|
|
|
assign vpix = blank1 ? 15'b0 : vpixel[14:0];
|
|
// assign vpix = blank1 ? 15'b0 : (vpixel[14:0] & 15'b111001110011100); // test for 373 colors
|
|
// assign vpix = blank1 ? 15'b0 : (vpixel[14:0] & 15'b110001100011000); // test for 64 colors
|
|
|
|
// GOVNOKOD!!!!!!!!!!!!!!!!!!!!!
|
|
always @(posedge clk)
|
|
begin
|
|
blank1 <= blank;
|
|
end
|
|
|
|
// color components extraction
|
|
wire [1:0] cred = vpix[14:13];
|
|
wire [2:0] ired = vpix[12:10];
|
|
wire [1:0] cgrn = vpix[ 9: 8];
|
|
wire [2:0] igrn = vpix[ 7: 5];
|
|
wire [1:0] cblu = vpix[ 4: 3];
|
|
wire [2:0] iblu = vpix[ 2: 0];
|
|
|
|
// prepare and clocking two phases of output
|
|
reg [1:0] red0;
|
|
reg [1:0] grn0;
|
|
reg [1:0] blu0;
|
|
reg [1:0] red1;
|
|
reg [1:0] grn1;
|
|
reg [1:0] blu1;
|
|
|
|
always @(posedge clk)
|
|
begin
|
|
red0 <= (!pwm[ired][{phase, 1'b0}] | &cred) ? cred : (cred + 2'b1);
|
|
grn0 <= (!pwm[igrn][{phase, 1'b0}] | &cgrn) ? cgrn : (cgrn + 2'b1);
|
|
blu0 <= (!pwm[iblu][{phase, 1'b0}] | &cblu) ? cblu : (cblu + 2'b1);
|
|
red1 <= (!pwm[ired][{phase, 1'b1}] | &cred) ? cred : (cred + 2'b1);
|
|
grn1 <= (!pwm[igrn][{phase, 1'b1}] | &cgrn) ? cgrn : (cgrn + 2'b1);
|
|
blu1 <= (!pwm[iblu][{phase, 1'b1}] | &cblu) ? cblu : (cblu + 2'b1);
|
|
end
|
|
|
|
`ifdef IDE_VDAC
|
|
// no PWM
|
|
assign vred = cred;
|
|
assign vgrn = cgrn;
|
|
assign vblu = cblu;
|
|
`elsif IDE_VDAC2
|
|
// no PWM
|
|
assign vred = cred;
|
|
assign vgrn = cgrn;
|
|
assign vblu = cblu;
|
|
`else
|
|
// output muxing for 56MHz PWM resolution
|
|
assign vred = clk ? red1 : red0;
|
|
assign vgrn = clk ? grn1 : grn0;
|
|
assign vblu = clk ? blu1 : blu0;
|
|
`endif
|
|
|
|
// PWM phase
|
|
reg [1:0] ph;
|
|
always @(posedge clk)
|
|
ph <= ph + 2'b1;
|
|
|
|
assign phase = {vga_on ? vga_line : ph[1], ph[0]};
|
|
|
|
// PWM
|
|
assign pwm[0] = 8'b00000000;
|
|
assign pwm[1] = 8'b00000001;
|
|
assign pwm[2] = 8'b01000001;
|
|
assign pwm[3] = 8'b01000101;
|
|
assign pwm[4] = 8'b10100101;
|
|
assign pwm[5] = 8'b10100111;
|
|
assign pwm[6] = 8'b11010111;
|
|
assign pwm[7] = 8'b11011111;
|
|
|
|
// CRAM
|
|
dpram #(.DATAWIDTH(16), .ADDRWIDTH(8), .MEM_INIT_FILE("rtl/video/video_cram.mif")) video_cram
|
|
(
|
|
.clock (clk),
|
|
.address_a(cram_addr_in),
|
|
.data_a (cram_data_in),
|
|
.wren_a (cram_we),
|
|
.address_b(vdata),
|
|
.q_b (vpixel)
|
|
);
|
|
/*
|
|
altdpram video_cram
|
|
(
|
|
.inclock (clk),
|
|
.data (cram_data_in),
|
|
.rdaddress (vdata),
|
|
.wraddress (cram_addr_in),
|
|
.wren (cram_we),
|
|
.q (vpixel),
|
|
.aclr (1'b0),
|
|
.byteena (1'b1),
|
|
.inclocken (1'b1),
|
|
.outclock (1'b1),
|
|
.outclocken (1'b1),
|
|
.rdaddressstall (1'b0),
|
|
.rden (1'b1),
|
|
.wraddressstall (1'b0)
|
|
);
|
|
|
|
defparam
|
|
video_cram.indata_aclr = "OFF",
|
|
video_cram.indata_reg = "INCLOCK",
|
|
video_cram.intended_device_family = "ACEX1K",
|
|
video_cram.lpm_file = "../video/mem/video_cram.mif",
|
|
video_cram.lpm_type = "altdpram",
|
|
video_cram.outdata_aclr = "OFF",
|
|
video_cram.outdata_reg = "UNREGISTERED",
|
|
video_cram.rdaddress_aclr = "OFF",
|
|
video_cram.rdaddress_reg = "INCLOCK",
|
|
video_cram.rdcontrol_aclr = "OFF",
|
|
video_cram.rdcontrol_reg = "UNREGISTERED",
|
|
video_cram.width = 16,
|
|
video_cram.widthad = 8,
|
|
video_cram.wraddress_aclr = "OFF",
|
|
video_cram.wraddress_reg = "INCLOCK",
|
|
video_cram.wrcontrol_aclr = "OFF",
|
|
video_cram.wrcontrol_reg = "INCLOCK";
|
|
*/
|
|
endmodule
|