178 lines
4.9 KiB
Coq
178 lines
4.9 KiB
Coq
module mojo_top(
|
|
// 50MHz clock input
|
|
input clk,
|
|
// Input from reset button (active low)
|
|
input rst_n,
|
|
// cclk input from AVR, high when AVR is ready
|
|
input cclk,
|
|
// Outputs to the 8 onboard LEDs
|
|
output[7:0]led,
|
|
// AVR SPI connections
|
|
output spi_miso,
|
|
input spi_ss,
|
|
input spi_mosi,
|
|
input spi_sck,
|
|
// AVR ADC channel select
|
|
output [3:0] spi_channel,
|
|
// Serial connections
|
|
input avr_tx, // AVR Tx => FPGA Rx
|
|
output avr_rx, // AVR Rx => FPGA Tx
|
|
input avr_rx_busy, // AVR Rx buffer full
|
|
output[3:0] hdmi1_tmds,
|
|
output[3:0] hdmi1_tmdsb
|
|
);
|
|
|
|
wire rst = ~rst_n; // make reset active high
|
|
|
|
wire hdmi_clk;
|
|
|
|
reg[7:0] hdmired, hdmigreen, hdmiblue;
|
|
wire[10:0] hdmix;
|
|
wire[9:0] hdmiy;
|
|
|
|
reg[7:0] frame_q, frame_d;
|
|
|
|
clk_wiz_v3_6 clk_wiz(
|
|
.CLK_IN1(clk),
|
|
.CLK_OUT1(hdmi_clk)
|
|
);
|
|
|
|
hdmi_encoder hdmi(
|
|
.clk(hdmi_clk),
|
|
.rst(rst),
|
|
.tmds(hdmi1_tmds),
|
|
.tmdsb(hdmi1_tmdsb),
|
|
.x(hdmix),
|
|
.y(hdmiy),
|
|
.red(hdmired),
|
|
.green(hdmigreen),
|
|
.blue(hdmiblue)
|
|
);
|
|
|
|
// these signals should be high-z when not used
|
|
assign spi_miso = 1'bz;
|
|
assign avr_rx = 1'bz;
|
|
assign spi_channel = 4'bzzzz;
|
|
|
|
assign led[6:0] = 7'b1000000;
|
|
assign led[7] = char_index_q;
|
|
|
|
wire [7:0] char_data [7:0][7:0];
|
|
|
|
assign char_data[0][0] = 8'b00000000;
|
|
assign char_data[0][1] = 8'b00000000;
|
|
assign char_data[0][2] = 8'b00111000;
|
|
assign char_data[0][3] = 8'b01101100;
|
|
assign char_data[0][4] = 8'b01101100;
|
|
assign char_data[0][5] = 8'b01111100;
|
|
assign char_data[0][6] = 8'b01101100;
|
|
assign char_data[0][7] = 8'b01101100;
|
|
|
|
assign char_data[1][0] = 8'b00000000;
|
|
assign char_data[1][1] = 8'b00000000;
|
|
assign char_data[1][2] = 8'b01111000;
|
|
assign char_data[1][3] = 8'b01101100;
|
|
assign char_data[1][4] = 8'b01111000;
|
|
assign char_data[1][5] = 8'b01101100;
|
|
assign char_data[1][6] = 8'b01101100;
|
|
assign char_data[1][7] = 8'b01111000;
|
|
|
|
assign char_data[2][0] = 8'b00000000;
|
|
assign char_data[2][1] = 8'b00000000;
|
|
assign char_data[2][2] = 8'b00111000;
|
|
assign char_data[2][3] = 8'b01101100;
|
|
assign char_data[2][4] = 8'b01100000;
|
|
assign char_data[2][5] = 8'b01100000;
|
|
assign char_data[2][6] = 8'b01101100;
|
|
assign char_data[2][7] = 8'b00111000;
|
|
|
|
assign char_data[3][0] = 8'b00000000;
|
|
assign char_data[3][1] = 8'b00000000;
|
|
assign char_data[3][2] = 8'b01111000;
|
|
assign char_data[3][3] = 8'b01101100;
|
|
assign char_data[3][4] = 8'b01101100;
|
|
assign char_data[3][5] = 8'b01101100;
|
|
assign char_data[3][6] = 8'b01101100;
|
|
assign char_data[3][7] = 8'b01111000;
|
|
|
|
assign char_data[4][0] = 8'b00000000;
|
|
assign char_data[4][1] = 8'b00000000;
|
|
assign char_data[4][2] = 8'b00111100;
|
|
assign char_data[4][3] = 8'b01100000;
|
|
assign char_data[4][4] = 8'b01111000;
|
|
assign char_data[4][5] = 8'b01100000;
|
|
assign char_data[4][6] = 8'b01100000;
|
|
assign char_data[4][7] = 8'b00111100;
|
|
|
|
assign char_data[5][0] = 8'b00000000;
|
|
assign char_data[5][1] = 8'b00000000;
|
|
assign char_data[5][2] = 8'b00111100;
|
|
assign char_data[5][3] = 8'b01100000;
|
|
assign char_data[5][4] = 8'b01111000;
|
|
assign char_data[5][5] = 8'b01100000;
|
|
assign char_data[5][6] = 8'b01100000;
|
|
assign char_data[5][7] = 8'b01100000;
|
|
|
|
assign char_data[6][0] = 8'b00000000;
|
|
assign char_data[6][1] = 8'b00000000;
|
|
assign char_data[6][2] = 8'b00111100;
|
|
assign char_data[6][3] = 8'b01100000;
|
|
assign char_data[6][4] = 8'b01100000;
|
|
assign char_data[6][5] = 8'b01101100;
|
|
assign char_data[6][6] = 8'b01101100;
|
|
assign char_data[6][7] = 8'b00111100;
|
|
|
|
assign char_data[7][0] = 8'b00000000;
|
|
assign char_data[7][1] = 8'b00000000;
|
|
assign char_data[7][2] = 8'b01101100;
|
|
assign char_data[7][3] = 8'b01101100;
|
|
assign char_data[7][4] = 8'b01111100;
|
|
assign char_data[7][5] = 8'b01101100;
|
|
assign char_data[7][6] = 8'b01101100;
|
|
assign char_data[7][7] = 8'b01101100;
|
|
|
|
//assign char_data[2][0] = 8'b00000000;
|
|
//assign char_data[2][1] = 8'b00000000;
|
|
//assign char_data[2][2] = 8'b00000000;
|
|
//assign char_data[2][3] = 8'b00000000;
|
|
//assign char_data[2][4] = 8'b00000000;
|
|
//assign char_data[2][5] = 8'b00000000;
|
|
//assign char_data[2][6] = 8'b00000000;
|
|
//assign char_data[2][7] = 8'b00000000;
|
|
|
|
reg[2:0] char_index_q, char_index_d;
|
|
|
|
always @(*) begin
|
|
//hdmired = hdmix[7:0] + frame_q;
|
|
//hdmigreen = hdmiy[7:0] + frame_q;
|
|
//hdmiblue = hdmix[7:0] ^ hdmiy[7:0];
|
|
|
|
hdmired = 1'h28;
|
|
hdmigreen = 1'h28;
|
|
hdmiblue = 1'h28;
|
|
|
|
if (char_data[char_index_q][(hdmiy >> 1) % 8][7 - ((hdmix >> 1) % 8)] == 1) begin
|
|
hdmired = 8'hEB;
|
|
hdmigreen = 8'hDB;
|
|
hdmiblue = 8'hB2;
|
|
end
|
|
|
|
frame_d = frame_q;
|
|
char_index_d = (hdmix >> 4) % 8;
|
|
|
|
if (hdmix == 1279 && hdmiy == 719) begin
|
|
frame_d = frame_q + 1'b1;
|
|
end
|
|
end
|
|
|
|
always @(posedge hdmi_clk) begin
|
|
if (rst) begin
|
|
frame_q <= 1'b0;
|
|
char_index_q <= 1'b0;
|
|
end else begin
|
|
frame_q <= frame_d;
|
|
char_index_q <= char_index_d;
|
|
end
|
|
end
|
|
|
|
endmodule |