1
0
mirror of synced 2026-01-12 00:02:46 +00:00

Uploaded_4_12_2023

This commit is contained in:
MicroCoreLabs 2023-04-12 23:14:11 -07:00
parent 68d44791fc
commit 12d3057e31

View File

@ -1,15 +1,15 @@
// //
// File Name : MDA_Video_core_v1_0.v // File Name : MDA_Video_core_v1_0.v
// Used on : // Used on :
// Author : Ted Fried // Author : Ted Fried
// Creation : 4/10/2023 // Creation : 4/10/2023
// Code Type : Synthesizable // Code Type : Synthesizable
// //
// Description: // Description:
// ============ // ============
// //
// This AXI slave reads an image held in dul ported RAM and // This AXI slave reads an image held in dul ported RAM and
// sends it out to an MDA Display // sends it out to an MDA Display
// //
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// //
@ -23,17 +23,17 @@
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// //
// Copyright (c) 2023 Ted Fried // Copyright (c) 2023 Ted Fried
// //
// Permission is hereby granted, free of charge, to any person obtaining a copy // Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal // of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights // in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is // copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions: // furnished to do so, subject to the following conditions:
// //
// The above copyright notice and this permission notice shall be included in all // The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software. // copies or substantial portions of the Software.
// //
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@ -48,94 +48,94 @@
`timescale 1 ns / 1 ps `timescale 1 ns / 1 ps
module MDA_Video_core_v1_0 # module MDA_Video_core_v1_0 #
(
// Users to add parameters here
// User parameters ends
// Do not modify the parameters beyond this line
// Parameters of Axi Slave Bus Interface S00_AXI
parameter integer C_S00_AXI_DATA_WIDTH = 32,
parameter integer C_S00_AXI_ADDR_WIDTH = 4,
// Parameters of Axi Master Bus Interface M00_AXI
parameter C_M00_AXI_TARGET_SLAVE_BASE_ADDR = 32'h40000000,
parameter integer C_M00_AXI_BURST_LEN = 4,
parameter integer C_M00_AXI_ID_WIDTH = 1,
parameter integer C_M00_AXI_ADDR_WIDTH = 32,
parameter integer C_M00_AXI_DATA_WIDTH = 32,
parameter integer C_M00_AXI_AWUSER_WIDTH = 0,
parameter integer C_M00_AXI_ARUSER_WIDTH = 0,
parameter integer C_M00_AXI_WUSER_WIDTH = 0,
parameter integer C_M00_AXI_RUSER_WIDTH = 0,
parameter integer C_M00_AXI_BUSER_WIDTH = 0
)
( (
// Users to add parameters here // AXI Slave Interface
// ------------------------------------------------------------------------------------
input wire s00_axi_aclk, // Clock and Reset
input wire s00_axi_aresetn,
// User parameters ends input wire [31:0] s00_axi_awaddr, // Write Address Channel
// Do not modify the parameters beyond this line input wire s00_axi_awvalid,
output wire s00_axi_awready,
input wire [31:0] s00_axi_wdata, // Write Data Channel
input wire [3:0] s00_axi_wstrb,
input wire s00_axi_wvalid,
output wire s00_axi_wready,
output wire [1:0] s00_axi_bresp, // Write Response Channel
output wire s00_axi_bvalid,
input wire s00_axi_bready,
input wire [31:0] s00_axi_araddr, // Read Address Channel
input wire s00_axi_arvalid,
output wire s00_axi_arready,
output wire [31:0] s00_axi_rdata, // Read Data Channel
output wire [1:0] s00_axi_rresp,
output wire s00_axi_rvalid,
input wire s00_axi_rready,
input wire [2:0] s00_axi_awprot, // AXI Protection
input wire [2:0] s00_axi_arprot,
// MDA Video display signals
// ------------------------------------------------------------------------------------
output MDA_HSYNC,
output MDA_VSYNC,
output MDA_DATA,
output MDA_INTENSITY
// Parameters of Axi Slave Bus Interface S00_AXI );
parameter integer C_S00_AXI_DATA_WIDTH = 32,
parameter integer C_S00_AXI_ADDR_WIDTH = 4,
// Parameters of Axi Master Bus Interface M00_AXI
parameter C_M00_AXI_TARGET_SLAVE_BASE_ADDR = 32'h40000000,
parameter integer C_M00_AXI_BURST_LEN = 4,
parameter integer C_M00_AXI_ID_WIDTH = 1,
parameter integer C_M00_AXI_ADDR_WIDTH = 32,
parameter integer C_M00_AXI_DATA_WIDTH = 32,
parameter integer C_M00_AXI_AWUSER_WIDTH = 0,
parameter integer C_M00_AXI_ARUSER_WIDTH = 0,
parameter integer C_M00_AXI_WUSER_WIDTH = 0,
parameter integer C_M00_AXI_RUSER_WIDTH = 0,
parameter integer C_M00_AXI_BUSER_WIDTH = 0
)
(
// AXI Slave Interface
// ------------------------------------------------------------------------------------
input wire s00_axi_aclk, // Clock and Reset
input wire s00_axi_aresetn,
input wire [31:0] s00_axi_awaddr, // Write Address Channel
input wire s00_axi_awvalid,
output wire s00_axi_awready,
input wire [31:0] s00_axi_wdata, // Write Data Channel
input wire [3:0] s00_axi_wstrb,
input wire s00_axi_wvalid,
output wire s00_axi_wready,
output wire [1:0] s00_axi_bresp, // Write Response Channel
output wire s00_axi_bvalid,
input wire s00_axi_bready,
input wire [31:0] s00_axi_araddr, // Read Address Channel
input wire s00_axi_arvalid,
output wire s00_axi_arready,
output wire [31:0] s00_axi_rdata, // Read Data Channel
output wire [1:0] s00_axi_rresp,
output wire s00_axi_rvalid,
input wire s00_axi_rready,
input wire [2:0] s00_axi_awprot, // AXI Protection
input wire [2:0] s00_axi_arprot,
// MDA Video display signals
// ------------------------------------------------------------------------------------
output MDA_HSYNC,
output MDA_VSYNC,
output MDA_DATA,
output MDA_INTENSITY
);
// Internal Signals // Internal Signals
//------------------------------------------------------------------------ //------------------------------------------------------------------------
reg s00_axi_bvalid_int = 'h0; reg s00_axi_bvalid_int = 'h0;
reg s00_axi_rvalid_int = 'h0; reg s00_axi_rvalid_int = 'h0;
reg s00_axi_awready_int = 'h0; reg s00_axi_awready_int = 'h0;
reg s00_axi_wready_int = 'h0; reg s00_axi_wready_int = 'h0;
reg mda_hsync_int = 'h0; reg mda_hsync_int = 'h0;
reg mda_vsync_int = 'h0; reg mda_vsync_int = 'h0;
reg mda_data_int = 'h0; reg mda_data_int = 'h0;
reg mda_intensity_int = 'h0; reg mda_intensity_int = 'h0;
reg dpram_a_wr = 'h0; reg dpram_a_wr = 'h0;
reg mda_shifter_load = 'h0; reg mda_shifter_load = 'h0;
reg [31:0] s00_axi_rdata_int; reg [31:0] s00_axi_rdata_int;
reg [8:0] dpram_a_addr = 'h0; reg [8:0] dpram_a_addr = 'h0;
reg [719:0] dpram_a_data = 'h0; reg [719:0] dpram_a_data = 'h0;
reg [8:0] dpram_b_addr = 'h0; reg [8:0] dpram_b_addr = 'h0;
reg [719:0] mda_shift_out = 'h0; reg [719:0] mda_shift_out = 'h0;
reg [15:0] mda_bit_counter = 'h0; reg [15:0] mda_bit_counter = 'h0;
wire mda_clock; wire mda_clock;
@ -150,19 +150,19 @@ wire [719:0] dpram_b_data;
//------------------------------------------------------------------------ //------------------------------------------------------------------------
// AXI Slave Controller signals // AXI Slave Controller signals
assign s00_axi_awready = s00_axi_awready_int; assign s00_axi_awready = s00_axi_awready_int;
assign s00_axi_arready = 1'b1; assign s00_axi_arready = 1'b1;
assign s00_axi_wready = s00_axi_wready_int; assign s00_axi_wready = s00_axi_wready_int;
assign s00_axi_bresp = 2'b00; assign s00_axi_bresp = 2'b00;
assign s00_axi_rresp = 2'b00; assign s00_axi_rresp = 2'b00;
assign s00_axi_bvalid = s00_axi_bvalid_int; assign s00_axi_bvalid = s00_axi_bvalid_int;
assign s00_axi_rvalid = s00_axi_rvalid_int; assign s00_axi_rvalid = s00_axi_rvalid_int;
assign s00_axi_rdata = s00_axi_rdata_int; assign s00_axi_rdata = s00_axi_rdata_int;
assign MDA_HSYNC = mda_hsync_int; assign MDA_HSYNC = mda_hsync_int;
assign MDA_VSYNC = mda_vsync_int; assign MDA_VSYNC = mda_vsync_int;
assign MDA_DATA = mda_shift_out[719]; assign MDA_DATA = mda_shift_out[719];
assign MDA_INTENSITY = mda_intensity_int; assign MDA_INTENSITY = mda_intensity_int;
@ -177,111 +177,111 @@ always @(posedge s00_axi_aclk)
begin : AXI_SLAVE_CONTROLLER begin : AXI_SLAVE_CONTROLLER
// For AXI Writes, the write data can come before the write address. // For AXI Writes, the write data can come before the write address.
// We will enforce that the address and data arrive simultaneously. // We will enforce that the address and data arrive simultaneously.
if (s00_axi_aresetn==1'b0) if (s00_axi_aresetn==1'b0)
begin begin
s00_axi_awready_int <= 1'b0; s00_axi_awready_int <= 1'b0;
s00_axi_wready_int <= 1'b0; s00_axi_wready_int <= 1'b0;
s00_axi_bvalid_int <= 1'b0; s00_axi_bvalid_int <= 1'b0;
s00_axi_rvalid_int <= 1'b0; s00_axi_rvalid_int <= 1'b0;
end end
else else
begin begin
// AXI Write Controller // AXI Write Controller
// //
// Accept write data only when the address and data are available from the host // Accept write data only when the address and data are available from the host
// Assert the write response as soon as data is received // Assert the write response as soon as data is received
// //
if (s00_axi_awvalid==1'b1 && s00_axi_wvalid==1'b1) if (s00_axi_awvalid==1'b1 && s00_axi_wvalid==1'b1)
begin begin
s00_axi_awready_int <= 1'b1; s00_axi_awready_int <= 1'b1;
s00_axi_wready_int <= 1'b1; s00_axi_wready_int <= 1'b1;
s00_axi_bvalid_int <= 1'b1; // Assert write response s00_axi_bvalid_int <= 1'b1; // Assert write response
// Debounce the write address and data ready signals // Debounce the write address and data ready signals
// //
if (s00_axi_awready_int==1'b1) if (s00_axi_awready_int==1'b1)
begin begin
s00_axi_awready_int <= 1'b0; s00_axi_awready_int <= 1'b0;
s00_axi_wready_int <= 1'b0; s00_axi_wready_int <= 1'b0;
end end
// Debounce the write response when the host is ready // Debounce the write response when the host is ready
// //
if (s00_axi_bvalid_int==1'b1 && s00_axi_bready==1'b1) if (s00_axi_bvalid_int==1'b1 && s00_axi_bready==1'b1)
begin begin
s00_axi_bvalid_int <= 1'b0; s00_axi_bvalid_int <= 1'b0;
case (s00_axi_awaddr[7:0]) case (s00_axi_awaddr[7:0])
8'h10 : dpram_a_data[31:0] <= s00_axi_wdata[31:0]; 8'h10 : dpram_a_data[31:0] <= s00_axi_wdata[31:0];
8'h14 : dpram_a_data[63:32] <= s00_axi_wdata[31:0]; 8'h14 : dpram_a_data[63:32] <= s00_axi_wdata[31:0];
8'h18 : dpram_a_data[95:64] <= s00_axi_wdata[31:0]; 8'h18 : dpram_a_data[95:64] <= s00_axi_wdata[31:0];
8'h1C : dpram_a_data[127:96] <= s00_axi_wdata[31:0]; 8'h1C : dpram_a_data[127:96] <= s00_axi_wdata[31:0];
8'h20 : dpram_a_data[159:128] <= s00_axi_wdata[31:0]; 8'h20 : dpram_a_data[159:128] <= s00_axi_wdata[31:0];
8'h24 : dpram_a_data[191:160] <= s00_axi_wdata[31:0]; 8'h24 : dpram_a_data[191:160] <= s00_axi_wdata[31:0];
8'h28 : dpram_a_data[223:192] <= s00_axi_wdata[31:0]; 8'h28 : dpram_a_data[223:192] <= s00_axi_wdata[31:0];
8'h2C : dpram_a_data[255:224] <= s00_axi_wdata[31:0]; 8'h2C : dpram_a_data[255:224] <= s00_axi_wdata[31:0];
8'h30 : dpram_a_data[287:256] <= s00_axi_wdata[31:0]; 8'h30 : dpram_a_data[287:256] <= s00_axi_wdata[31:0];
8'h34 : dpram_a_data[319:288] <= s00_axi_wdata[31:0]; 8'h34 : dpram_a_data[319:288] <= s00_axi_wdata[31:0];
8'h38 : dpram_a_data[351:320] <= s00_axi_wdata[31:0]; 8'h38 : dpram_a_data[351:320] <= s00_axi_wdata[31:0];
8'h3C : dpram_a_data[383:352] <= s00_axi_wdata[31:0]; 8'h3C : dpram_a_data[383:352] <= s00_axi_wdata[31:0];
8'h40 : dpram_a_data[415:384] <= s00_axi_wdata[31:0]; 8'h40 : dpram_a_data[415:384] <= s00_axi_wdata[31:0];
8'h44 : dpram_a_data[447:416] <= s00_axi_wdata[31:0]; 8'h44 : dpram_a_data[447:416] <= s00_axi_wdata[31:0];
8'h48 : dpram_a_data[479:448] <= s00_axi_wdata[31:0]; 8'h48 : dpram_a_data[479:448] <= s00_axi_wdata[31:0];
8'h4C : dpram_a_data[511:480] <= s00_axi_wdata[31:0]; 8'h4C : dpram_a_data[511:480] <= s00_axi_wdata[31:0];
8'h50 : dpram_a_data[543:512] <= s00_axi_wdata[31:0]; 8'h50 : dpram_a_data[543:512] <= s00_axi_wdata[31:0];
8'h54 : dpram_a_data[575:544] <= s00_axi_wdata[31:0]; 8'h54 : dpram_a_data[575:544] <= s00_axi_wdata[31:0];
8'h58 : dpram_a_data[607:576] <= s00_axi_wdata[31:0]; 8'h58 : dpram_a_data[607:576] <= s00_axi_wdata[31:0];
8'h5C : dpram_a_data[639:608] <= s00_axi_wdata[31:0]; 8'h5C : dpram_a_data[639:608] <= s00_axi_wdata[31:0];
8'h60 : dpram_a_data[671:640] <= s00_axi_wdata[31:0]; 8'h60 : dpram_a_data[671:640] <= s00_axi_wdata[31:0];
8'h64 : dpram_a_data[703:672] <= s00_axi_wdata[31:0]; 8'h64 : dpram_a_data[703:672] <= s00_axi_wdata[31:0];
8'h68 : dpram_a_data[719:704] <= s00_axi_wdata[15:0]; 8'h68 : dpram_a_data[719:704] <= s00_axi_wdata[15:0];
8'h70 : dpram_a_addr <= s00_axi_wdata[8:0]; 8'h70 : dpram_a_addr <= s00_axi_wdata[8:0];
8'h74 : dpram_a_wr <= s00_axi_wdata[0]; 8'h74 : dpram_a_wr <= s00_axi_wdata[0];
default: ; default: ;
endcase endcase
end end
end end
// AXI Read Controller // AXI Read Controller
// //
if (s00_axi_arvalid==1'b1) if (s00_axi_arvalid==1'b1)
begin begin
s00_axi_rvalid_int <= 1'b1; // Assert read response s00_axi_rvalid_int <= 1'b1; // Assert read response
case (s00_axi_araddr[8:0]) case (s00_axi_araddr[8:0])
9'h000: s00_axi_rdata_int <= 32'hDEAD_BEEF; // FPGA_ID 9'h000: s00_axi_rdata_int <= 32'hDEAD_BEEF; // FPGA_ID
9'h004: s00_axi_rdata_int <= 32'h0000_0088; // FPGA Version 9'h004: s00_axi_rdata_int <= 32'h0000_0088; // FPGA Version
default: ; default: ;
endcase endcase
end end
// Debounce Read Response // Debounce Read Response
// //
if (s00_axi_rvalid_int==1'b1 && s00_axi_rready==1'b1) if (s00_axi_rvalid_int==1'b1 && s00_axi_rready==1'b1)
begin begin
s00_axi_rvalid_int <= 1'b0; s00_axi_rvalid_int <= 1'b0;
end end
end end
end end
@ -292,10 +292,10 @@ end
// //
//------------------------------------------------------------------------ //------------------------------------------------------------------------
MDA_DCM i_MDA_DCM ( MDA_DCM i_MDA_DCM (
.clk_in1 (s00_axi_aclk), .clk_in1 (s00_axi_aclk),
.clk_out1 (mda_clock) .clk_out1 (mda_clock)
); );
//------------------------------------------------------------------------ //------------------------------------------------------------------------
@ -304,15 +304,15 @@ MDA_DCM i_MDA_DCM (
// //
//------------------------------------------------------------------------ //------------------------------------------------------------------------
MDA_VIDEO_DPRAM i_MDA_VIDEO_DPRAM ( MDA_VIDEO_DPRAM i_MDA_VIDEO_DPRAM (
.clka (s00_axi_aclk), .clka (s00_axi_aclk),
.wea (dpram_a_wr), .wea (dpram_a_wr),
.addra (dpram_a_addr), .addra (dpram_a_addr),
.dina (dpram_a_data), .dina (dpram_a_data),
.clkb (mda_clock), .clkb (mda_clock),
.addrb (dpram_b_addr), .addrb (dpram_b_addr),
.doutb (dpram_b_data) .doutb (dpram_b_data)
); );
@ -327,31 +327,31 @@ always @(posedge mda_clock)
begin : MDA_CONTROLLER begin : MDA_CONTROLLER
// Shift out a video row // Shift out a video row
// //
if (mda_shifter_load==1'b1) mda_shift_out <= dpram_b_data[719:0]; if (mda_shifter_load==1'b1) mda_shift_out <= dpram_b_data[719:0];
else mda_shift_out <= { mda_shift_out[718:0] , 1'b0 }; else mda_shift_out <= { mda_shift_out[718:0] , 1'b0 };
mda_bit_counter <= mda_bit_counter + 1'b1; mda_bit_counter <= mda_bit_counter + 1'b1;
case (mda_bit_counter) case (mda_bit_counter)
'd000 : mda_shifter_load <= 1'b1; // Load DPRAM contents into shift register 'd000 : mda_shifter_load <= 1'b1; // Load DPRAM contents into shift register
'd001 : mda_shifter_load <= 1'b0; // Debounce shift register loader 'd001 : mda_shifter_load <= 1'b0; // Debounce shift register loader
'd002 : dpram_b_addr <= dpram_b_addr + 1'b1; // Advance to the next DPRAM row 'd002 : dpram_b_addr <= dpram_b_addr + 1'b1; // Advance to the next DPRAM row
'd731 : mda_hsync_int <= 1'b1; // 720 clocks for active video and another 10 clocks, then assert HSYNC 'd731 : mda_hsync_int <= 1'b1; // 720 clocks for active video and another 10 clocks, then assert HSYNC
'd866 : mda_hsync_int <= 1'b0; // 135 clocks for HSYNC active 'd866 : mda_hsync_int <= 1'b0; // 135 clocks for HSYNC active
'd883 : begin 'd883 : begin
mda_bit_counter <= 'd0; // Return to the beginning of this state machine mda_bit_counter <= 'd0; // Return to the beginning of this state machine
if (dpram_b_addr=='d349) mda_vsync_int <= 1'b0; // 17 clocks after HSYNC de-asserted, then check to start VSYNC at end of 350 lines if (dpram_b_addr=='d349) mda_vsync_int <= 1'b0; // 17 clocks after HSYNC de-asserted, then check to start VSYNC at end of 350 lines
if (dpram_b_addr=='d365) mda_vsync_int <= 1'b1; // De-assert VSYNC after 16 lines if (dpram_b_addr=='d365) mda_vsync_int <= 1'b1; // De-assert VSYNC after 16 lines
if (dpram_b_addr=='d369) dpram_b_addr <= 'h0; // After four lines of nothing, return to the beginning of the video DPRAM if (dpram_b_addr=='d369) dpram_b_addr <= 'h0; // After four lines of nothing, return to the beginning of the video DPRAM
end end
default: ; default: ;
endcase endcase
end end