RTC实时时钟实验 – 在HDMI上显示
top.v
module RTS_TOP#(parameter TIME_INIT = 48'h24_01_06_11_08_00 ,parameter WAIT_TIME = 13'd8000 ,parameter SLAVE_ADDR = 7'b1010001 , parameter CLK_FREQ = 26'd50_000_000 , parameter I2C_FREQ = 18'd250_000
)(input sys_clk ,input rst_n ,output tmds_clk_p , output tmds_clk_n ,output [2:0] tmds_data_p , output [2:0] tmds_data_n ,output scl ,inout sda
);
wire [15 : 0] i2c_addr ;
wire [7 : 0] i2c_data_w ;
wire i2c_rh_wl ;
wire i2c_exec ;
wire dri_clk ;
wire [7 : 0] i2c_data_r ;
wire i2c_ack ;
wire i2c_done ;wire [7 : 0 ] sec ;
wire [7 : 0 ] min ;
wire [7 : 0 ] hour ;
wire [7 : 0 ] day ;
wire [7 : 0 ] mon ;
wire [7 : 0 ] year ;
IIC_CONTROL#(.SLAVE_ADDR ( 7'b1010001 ),.CLK_FREQ ( 26'd50_000_000 ),.I2C_FREQ ( 18'd250_000 )
)u_IIC_CONTROL(.clk ( sys_clk ),.rst_n ( rst_n ),.i2c_addr ( i2c_addr ),.i2c_data_w ( i2c_data_w ),.i2c_rh_wl ( i2c_rh_wl ),.bit_control ( 0 ),.i2c_exec ( i2c_exec ),.dri_clk ( dri_clk ),.i2c_data_r ( i2c_data_r ),.i2c_ack ( i2c_ack ),.i2c_done ( i2c_done ),.scl ( scl ),.sda ( sda )
);PCF8563#(.TIME_INIT ( TIME_INIT ),.WAIT_TIME ( WAIT_TIME )
)u_PCF8563(.clk ( dri_clk ),.rst_n ( rst_n ),.i2c_done ( i2c_done ),.i2c_data_r ( i2c_data_r ),.i2c_rh_wl ( i2c_rh_wl ),.i2c_exec ( i2c_exec ),.i2c_addr ( i2c_addr ),.i2c_data_w ( i2c_data_w ),.sec ( sec ),.min ( min ),.hour ( hour ),.day ( day ),.mon ( mon ),.year ( year )
);hdmi_top u_hdmi_top(.sys_clk ( sys_clk ),.sys_rst_n ( rst_n ),.tmds_clk_p ( tmds_clk_p ),.tmds_clk_n ( tmds_clk_n ),.tmds_data_p ( tmds_data_p ),.tmds_data_n ( tmds_data_n ),.sec ( sec ),.min ( min ),.hour ( hour ),.day ( day ),.mon ( mon ),.year ( year )
);endmodule
dvi_transmitter_top.v
module dvi_transmitter_top(input pclk ,input sys_rst_n ,input pclk_x5 ,input video_hsync ,input video_vsync ,input video_de ,input [23 : 0] video_din ,output tmds_clk_p ,output tmds_clk_n ,output [2 : 0] tmds_data_p ,output [2 : 0] tmds_data_n ,output tmds_oen
);assign tmds_oen = 1 ;
wire reset ;
wire [9:0] blue_10bit ;
wire [9:0] green_10bit ;
wire [9:0] red_10bit ;wire [2:0] tmds_data_serial ;
wire tmds_clk_serial ;reset_syn u_reset_syn(.pclk ( pclk ),.reset_n ( sys_rst_n ),.reset ( reset )
);dvi_encoder u_dvi_encoder_blue(.clkin ( pclk ),.rstin ( reset ),.din ( video_din[7:0] ),.c0 ( video_hsync ),.c1 ( video_vsync ),.de ( video_de ),.dout ( blue_10bit )
);dvi_encoder u_dvi_encoder_green(.clkin ( pclk ),.rstin ( reset ),.din ( video_din[15:8] ),.c0 ( 1'b0 ),.c1 ( 1'b0 ),.de ( video_de ),.dout ( green_10bit )
);dvi_encoder u_dvi_encoder_red(.clkin ( pclk ),.rstin ( reset ),.din ( video_din[23:16] ),.c0 ( 1'b0 ),.c1 ( 1'b0 ),.de ( video_de ),.dout ( red_10bit )
);serializer10 u_serializer10_blue(.reset ( reset ),.paralell_clk ( pclk ),.serial_clk_5x ( pclk_x5 ),.paralell_data ( blue_10bit ),.serial_data_out ( tmds_data_serial[0] )
);serializer10 u_serializer10_green(.reset ( reset ),.paralell_clk ( pclk ),.serial_clk_5x ( pclk_x5 ),.paralell_data ( green_10bit ),.serial_data_out ( tmds_data_serial[1] )
);serializer10 u_serializer10_red(.reset ( reset ),.paralell_clk ( pclk ),.serial_clk_5x ( pclk_x5 ),.paralell_data ( red_10bit ),.serial_data_out ( tmds_data_serial[2] )
);serializer10 u_serializer10_clk(.reset ( reset ),.paralell_clk ( pclk ),.serial_clk_5x ( pclk_x5 ),.paralell_data ( 10'b1111100000 ),.serial_data_out ( tmds_clk_serial )
);
OBUFDS #(.IOSTANDARD ("TMDS_33")
) TMDS0 (.I (tmds_data_serial[0]),.O (tmds_data_p[0]),.OB (tmds_data_n[0])
);OBUFDS #(.IOSTANDARD ("TMDS_33")
) TMDS1 (.I (tmds_data_serial[1]),.O (tmds_data_p[1]),.OB (tmds_data_n[1])
);OBUFDS #(.IOSTANDARD ("TMDS_33")
) TMDS2 (.I (tmds_data_serial[2]), .O (tmds_data_p[2]), .OB (tmds_data_n[2])
);OBUFDS #(.IOSTANDARD ("TMDS_33")
) TMDS3 (.I (tmds_clk_serial), .O (tmds_clk_p),.OB (tmds_clk_n)
);
endmodule
encoder.v
module dvi_encoder (input clkin, input rstin, input [7:0] din, input c0, input c1, input de, output reg [9:0] dout
);reg [3:0] n1d; reg [7:0] din_q;always @ (posedge clkin) beginn1d <=#1 din[0] + din[1] + din[2] + din[3] + din[4] + din[5] + din[6] + din[7];din_q <=#1 din;endwire decision1;assign decision1 = (n1d > 4'h4) | ((n1d == 4'h4) & (din_q[0] == 1'b0));wire [8:0] q_m;assign q_m[0] = din_q[0];assign q_m[1] = (decision1) ? (q_m[0] ^~ din_q[1]) : (q_m[0] ^ din_q[1]);assign q_m[2] = (decision1) ? (q_m[1] ^~ din_q[2]) : (q_m[1] ^ din_q[2]);assign q_m[3] = (decision1) ? (q_m[2] ^~ din_q[3]) : (q_m[2] ^ din_q[3]);assign q_m[4] = (decision1) ? (q_m[3] ^~ din_q[4]) : (q_m[3] ^ din_q[4]);assign q_m[5] = (decision1) ? (q_m[4] ^~ din_q[5]) : (q_m[4] ^ din_q[5]);assign q_m[6] = (decision1) ? (q_m[5] ^~ din_q[6]) : (q_m[5] ^ din_q[6]);assign q_m[7] = (decision1) ? (q_m[6] ^~ din_q[7]) : (q_m[6] ^ din_q[7]);assign q_m[8] = (decision1) ? 1'b0 : 1'b1;reg [3:0] n1q_m, n0q_m; always @ (posedge clkin) beginn1q_m <=#1 q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7];n0q_m <=#1 4'h8 - (q_m[0] + q_m[1] + q_m[2] + q_m[3] + q_m[4] + q_m[5] + q_m[6] + q_m[7]);endparameter CTRLTOKEN0 = 10'b1101010100;parameter CTRLTOKEN1 = 10'b0010101011;parameter CTRLTOKEN2 = 10'b0101010100;parameter CTRLTOKEN3 = 10'b1010101011;reg [4:0] cnt; wire decision2, decision3;assign decision2 = (cnt == 5'h0) | (n1q_m == n0q_m);assign decision3 = (~cnt[4] & (n1q_m > n0q_m)) | (cnt[4] & (n0q_m > n1q_m));reg de_q, de_reg;reg c0_q, c1_q;reg c0_reg, c1_reg;reg [8:0] q_m_reg;always @ (posedge clkin) beginde_q <=#1 de;de_reg <=#1 de_q;c0_q <=#1 c0;c0_reg <=#1 c0_q;c1_q <=#1 c1;c1_reg <=#1 c1_q;q_m_reg <=#1 q_m;endalways @ (posedge clkin or posedge rstin) beginif(rstin) begindout <= 10'h0;cnt <= 5'h0;end else beginif (de_reg) beginif(decision2) begindout[9] <=#1 ~q_m_reg[8]; dout[8] <=#1 q_m_reg[8]; dout[7:0] <=#1 (q_m_reg[8]) ? q_m_reg[7:0] : ~q_m_reg[7:0];cnt <=#1 (~q_m_reg[8]) ? (cnt + n0q_m - n1q_m) : (cnt + n1q_m - n0q_m);end else beginif(decision3) begindout[9] <=#1 1'b1;dout[8] <=#1 q_m_reg[8];dout[7:0] <=#1 ~q_m_reg[7:0];cnt <=#1 cnt + {q_m_reg[8], 1'b0} + (n0q_m - n1q_m);end else begindout[9] <=#1 1'b0;dout[8] <=#1 q_m_reg[8];dout[7:0] <=#1 q_m_reg[7:0];cnt <=#1 cnt - {~q_m_reg[8], 1'b0} + (n1q_m - n0q_m);endendend else begincase ({c1_reg, c0_reg})2'b00: dout <=#1 CTRLTOKEN0;2'b01: dout <=#1 CTRLTOKEN1;2'b10: dout <=#1 CTRLTOKEN2;default: dout <=#1 CTRLTOKEN3;endcasecnt <=#1 5'h0;endendendendmodule
hdmi_display.v
module video_display(input pixel_clk ,input sys_rst_n ,input [ 11 : 0 ] pixel_xpos_w ,input [ 11 : 0 ] pixel_ypos_w ,output reg [ 23 : 0 ] pixel_data_w ,input [ 7 : 0] sec ,input [ 7 : 0] min ,input [ 7 : 0] hour ,input [ 7 : 0] day ,input [ 7 : 0] mon ,input [ 7 : 0] year);wire [7 : 0] year1 ;wire [7 : 0] mon1 ;wire [7 : 0] day1 ;assign day1 = day ;assign year1 = year ;assign mon1 = mon ;localparam CHAR_X_START = 11'd50; localparam CHAR_Y_START = 11'd100; localparam CHAR_WIDTH = 10'd88; localparam CHAR_HEIGHT = 10'd16; localparam BACK_COLOR = 24'hE0FFFF; localparam CHAR_COLOR = 24'hff0000; reg [127:0] char[10:0]; always @(posedge pixel_clk)beginchar[0] = 128'h00000018244242424242424224180000;char[1] = 128'h000000083808080808080808083E0000;char[2] = 128'h0000003C4242420204081020427E0000;char[3] = 128'h0000003C4242020418040242423C0000;char[4] = 128'h000000040C0C142424447F04041F0000;char[5] = 128'h0000007E404040784402024244380000;char[6] = 128'h000000182440405C62424242221C0000;char[7] = 128'h0000007E420404080810101010100000;char[8] = 128'h0000003C4242422418244242423C0000;char[9] = 128'h0000003844424242463A020224180000;char[10] = 128'h00000000000018180000000018180000;endalways@( posedge pixel_clk or negedge sys_rst_n)beginif( sys_rst_n == 0)beginpixel_data_w <=BACK_COLOR ;endelseif( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*0)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*1)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginif( char[hour[7 : 4]][ (CHAR_HEIGHT + CHAR_Y_START - pixel_ypos_w) * 8-((pixel_xpos_w - (CHAR_X_START)) % 8) -1 ] )pixel_data_w <=CHAR_COLOR ;elsepixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*1)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*2)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginif( char[hour[3 : 0]][ (CHAR_HEIGHT + CHAR_Y_START - pixel_ypos_w) * 8-((pixel_xpos_w - (CHAR_X_START)) % 8) -1 ] )pixel_data_w <=CHAR_COLOR ;elsepixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*2)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*3)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginpixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*3)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*4)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginif( char[10][ (CHAR_HEIGHT + CHAR_Y_START - pixel_ypos_w) * 8-((pixel_xpos_w - (CHAR_X_START)) % 8) -1 ] )pixel_data_w <=CHAR_COLOR ;elsepixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*4)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*5)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginpixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*5)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*6)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginif( char[min[7 : 4]][ (CHAR_HEIGHT + CHAR_Y_START - pixel_ypos_w) * 8-((pixel_xpos_w - (CHAR_X_START)) % 8) -1 ] )pixel_data_w <=CHAR_COLOR ;elsepixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*6)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*7)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginif( char[min[3 : 0]][ (CHAR_HEIGHT + CHAR_Y_START - pixel_ypos_w) * 8-((pixel_xpos_w - (CHAR_X_START)) % 8) -1 ] )pixel_data_w <=CHAR_COLOR ;elsepixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*7)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*8)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginpixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*8)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*9)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginpixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*9)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*10)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginif( char[sec[7 : 4]][ (CHAR_HEIGHT + CHAR_Y_START - pixel_ypos_w) * 8-((pixel_xpos_w - (CHAR_X_START)) % 8) -1 ] )pixel_data_w <=CHAR_COLOR ;elsepixel_data_w <=BACK_COLOR ;endelse if( (pixel_xpos_w >= CHAR_X_START + CHAR_WIDTH/11*10)&& (pixel_xpos_w < CHAR_X_START + CHAR_WIDTH/11*11)&& (pixel_ypos_w >= CHAR_Y_START)&& (pixel_ypos_w < CHAR_Y_START + CHAR_HEIGHT) )beginif( char[sec[3 : 0]][ (CHAR_HEIGHT + CHAR_Y_START - pixel_ypos_w) * 8-((pixel_xpos_w - (CHAR_X_START)) % 8) -1 ] )pixel_data_w <=CHAR_COLOR ;elsepixel_data_w <=BACK_COLOR ;endelsebeginpixel_data_w <= BACK_COLOR; endendendmodule
HDMI_top.v
module hdmi_top(input sys_clk,input sys_rst_n,output tmds_clk_p, output tmds_clk_n,output [2:0] tmds_data_p, output [2:0] tmds_data_n ,
input [ 7 : 0] sec ,
input [ 7 : 0] min ,
input [ 7 : 0] hour ,
input [ 7 : 0] day ,
input [ 7 : 0] mon ,
input [ 7 : 0] year);wire pixel_clk;wire pixel_clk_5x;wire clk_locked;wire [10:0] pixel_xpos_w;wire [10:0] pixel_ypos_w;wire [23:0] pixel_data_w;wire video_hs;wire video_vs;wire video_de;wire [23:0] video_rgb;clk_wiz_0 instance_name1(.clk_out1(pixel_clk), .clk_out2(pixel_clk_5x), .reset(~sys_rst_n), .locked(clk_locked), .clk_in1(sys_clk));video_driver u_video_driver(.pixel_clk ( pixel_clk ),.rst_n ( sys_rst_n ),.pixel_data ( pixel_data_w ),.video_rgb ( video_rgb ),.video_hs ( video_hs ),.video_vs ( video_vs ),.video_de ( video_de ),.pixel_xpos ( pixel_xpos_w ),.pixel_ypos ( pixel_ypos_w )
);video_display u_video_display(.pixel_clk ( pixel_clk ),.sys_rst_n ( sys_rst_n ),.pixel_xpos_w ( pixel_xpos_w ),.pixel_ypos_w ( pixel_ypos_w ),.pixel_data_w ( pixel_data_w ),.sec ( sec ),.min ( min ),.hour ( hour ),.day ( day ),.mon ( mon ),.year ( year )
);dvi_transmitter_top u_dvi_transmitter_top(.pclk ( pixel_clk ),.sys_rst_n ( sys_rst_n & clk_locked ),.pclk_x5 ( pixel_clk_5x ),.video_hsync ( video_hs ),.video_vsync ( video_vs ),.video_de ( video_de ),.video_din ( video_rgb ),.tmds_clk_p ( tmds_clk_p ),.tmds_clk_n ( tmds_clk_n ),.tmds_data_p ( tmds_data_p ),.tmds_data_n ( tmds_data_n ),.tmds_oen ( )
);endmodule
I2c_dri.v
module IIC_CONTROL #(parameter SLAVE_ADDR = 7'b1010001 , parameter CLK_FREQ = 26'd50_000_000 , parameter I2C_FREQ = 18'd250_000 )(input clk ,input rst_n ,input [15 : 0] i2c_addr , input [7 : 0] i2c_data_w , input i2c_rh_wl , input bit_control , input i2c_exec ,output reg dri_clk ,output reg [7 : 0] i2c_data_r ,output reg i2c_ack ,output reg i2c_done ,output reg scl ,inout sda);reg [9 : 0] clk_cnt ;wire [8 : 0] dri_cnt ;reg [2 : 0] state ;reg [2 : 0] next_state ;reg st_done ; reg sda_dir ; reg sda_out ; wire sda_in ; reg [6 : 0] cnt ; reg [15: 0] addr_save ; reg [7 : 0] data_w_save ; reg wr_flag ; reg [7 : 0] data_r_save ; parameter st_idle = 3'b000 ; parameter st_sladdr = 3'b001 ; parameter st_addr16 = 3'b010 ; parameter st_addr8 = 3'b011 ; parameter st_data_wr = 3'b100 ; parameter st_addr_rd = 3'b101 ; parameter st_data_rd = 3'b110 ; parameter st_stop = 3'b111 ; assign dri_cnt = (CLK_FREQ/I2C_FREQ ) >> 2 ;always@(posedge clk or negedge rst_n )beginif(rst_n == 0)begindri_clk <= 0 ;clk_cnt <= 0 ;endelse if( clk_cnt == dri_cnt[8:1] - 1)beginclk_cnt <= 0 ;dri_clk <= ~dri_clk ;endelsebegindri_clk <= dri_clk ;clk_cnt <= clk_cnt + 1 ;endendalways@(posedge dri_clk or negedge rst_n)beginif(rst_n == 0)beginstate <= st_idle ;end elsebeginstate <= next_state ;endendalways@(*)beginnext_state <= st_idle ;case(state)st_idle :beginif(i2c_exec == 1)beginnext_state <= st_sladdr ;endelsebeginnext_state <= st_idle ;endendst_sladdr :beginif(st_done == 1)beginif(bit_control == 1)next_state <= st_addr16 ;elsenext_state <= st_addr8 ;endelsebeginnext_state <= st_sladdr ;endendst_addr16 :beginif(st_done == 1)beginnext_state <= st_addr8 ;endelsebeginnext_state <= st_addr16 ;endendst_addr8 :beginif(st_done == 1)beginif(wr_flag == 0)next_state <= st_data_wr ;elsenext_state <= st_addr_rd ;endelsebeginnext_state <= st_addr8 ;endendst_data_wr :beginif(st_done == 1)beginnext_state <= st_stop ;endelsebeginnext_state <= st_data_wr ;endendst_addr_rd :beginif(st_done == 1)beginnext_state <= st_data_rd ;endelsebeginnext_state <= st_addr_rd ;endendst_data_rd :beginif(st_done == 1)beginnext_state <= st_stop ;endelsebeginnext_state <= st_data_rd ;endendst_stop :beginif(st_done == 1)beginnext_state <= st_idle ;endelsebeginnext_state <= st_stop ;endenddefault:next_state <= st_idle ;endcaseendassign sda = sda_dir ? sda_out : 1'bz ; assign sda_in = sda ; always@(posedge dri_clk or negedge rst_n )beginif( rst_n == 0)beginscl <= 1 ;sda_dir <= 1 ;sda_out <= 1 ;i2c_data_r <= 0 ;data_r_save <= 0 ;i2c_ack <= 0 ;i2c_done <= 0 ;cnt <= 0 ;st_done <= 0 ;wr_flag <= 0 ;addr_save <= 0 ;data_w_save <= 0 ;endelsebeginst_done <= 0 ; cnt <= cnt + 1 ;case(state)st_idle :beginscl <= 1 ;sda_dir <= 1 ;sda_out <= 1 ;i2c_data_r <= 0 ;data_r_save <= 0 ;i2c_done <= 0 ;cnt <= 0 ;st_done <= 0 ;if( i2c_exec == 1) beginwr_flag <= i2c_rh_wl ;addr_save <= i2c_addr ;data_w_save <= i2c_data_w ;i2c_ack <= 0 ;endendst_sladdr :begincase(cnt)7'd1 :sda_out <= 0 ;7'd3 :scl <= 0 ;7'd4 :sda_out <= SLAVE_ADDR[6] ;7'd5 :scl <= 1'b1 ;7'd7 :scl <= 1'b0 ;7'd8 :sda_out <= SLAVE_ADDR[5] ;7'd9 :scl <= 1'b1 ;7'd11 :scl <= 1'b0 ;7'd12 :sda_out <= SLAVE_ADDR[4] ;7'd13 :scl <= 1'b1 ;7'd15 :scl <= 1'b0 ;7'd16 :sda_out <= SLAVE_ADDR[3] ;7'd17 :scl <= 1'b1 ;7'd19 :scl <= 1'b0 ;7'd20 :sda_out <= SLAVE_ADDR[2] ;7'd21 :scl <= 1'b1 ;7'd23 :scl <= 1'b0 ;7'd24 :sda_out <= SLAVE_ADDR[1] ;7'd25 :scl <= 1'b1 ;7'd27 :scl <= 1'b0 ;7'd28 :sda_out <= SLAVE_ADDR[0] ;7'd29 :scl <= 1'b1 ;7'd31 :scl <= 1'b0 ;7'd32 :sda_out <= 1'b0 ;7'd33 :scl <= 1'b1 ;7'd35 :scl <= 1'b0 ;7'd36 :sda_dir <= 1'b0 ; 7'd37 :scl <= 1'b1 ;7'd38 :beginst_done <= 1'b1 ;if( sda_in == 1)i2c_ack <= 1'b1 ;end7'd39 :beginscl <= 1'b0 ;cnt <= 7'b0 ;enddefault :;endcaseendst_addr16 :begincase(cnt)7'd0 :begin sda_dir <= 1'b1 ;sda_out <= addr_save[15] ;end7'd1 :scl <= 1'b1 ;7'd3 :scl <= 1'b0 ;7'd4 :sda_out <= addr_save[14] ;7'd5 :scl <= 1'b1 ;7'd7 :scl <= 1'b0 ;7'd8 :sda_out <= addr_save[13] ;7'd9 :scl <= 1'b1 ;7'd11 :scl <= 1'b0 ;7'd12 :sda_out <= addr_save[12] ;7'd13 :scl <= 1'b1 ;7'd15 :scl <= 1'b0 ;7'd16 :sda_out <= addr_save[11] ;7'd17 :scl <= 1'b1 ;7'd19 :scl <= 1'b0 ;7'd20 :sda_out <= addr_save[10] ;7'd21 :scl <= 1'b1 ;7'd23 :scl <= 1'b0 ;7'd24 :sda_out <= addr_save[9] ;7'd25 :scl <= 1'b1 ;7'd27 :scl <= 1'b0 ;7'd28 :sda_out <= addr_save[8] ;7'd29 :scl <= 1'b1 ;7'd31 :scl <= 1'b0 ;7'd32 :sda_dir <= 1'b0 ;7'd33 :scl <= 1'b1 ;7'd34 :beginst_done <= 1'b1 ; if(sda_in == 1)i2c_ack <= 1'b1 ; end7'd35 :beginscl <= 1'b0 ;cnt <= 7'b0 ;enddefault :;endcaseendst_addr8 :begincase(cnt)7'd0:beginsda_dir <= 1'b1 ;sda_out <= addr_save[7]; end7'd1 :scl <= 1'b1;7'd3 :scl <= 1'b0;7'd4 :sda_out <= addr_save[6];7'd5 :scl <= 1'b1;7'd7 :scl <= 1'b0;7'd8 :sda_out <= addr_save[5];7'd9 :scl <= 1'b1;7'd11 :scl <= 1'b0;7'd12 :sda_out <= addr_save[4];7'd13 :scl <= 1'b1;7'd15 :scl <= 1'b0;7'd16 :sda_out <= addr_save[3];7'd17 :scl <= 1'b1;7'd19 :scl <= 1'b0;7'd20 :sda_out <= addr_save[2];7'd21 :scl <= 1'b1;7'd23 :scl <= 1'b0;7'd24 :sda_out <= addr_save[1];7'd25 :scl <= 1'b1;7'd27 :scl <= 1'b0;7'd28 :sda_out <= addr_save[0];7'd29 :scl <= 1'b1 ;7'd31 :scl <= 1'b0 ;7'd32 :sda_dir <= 1'b0 ;7'd33 :scl <= 1'b1 ;7'd34 :beginst_done <= 1'b1 ; if(sda_in == 1)i2c_ack <= 1'b1 ; end7'd35 :beginscl <= 1'b0 ;cnt <= 7'b0 ;enddefault :;endcaseendst_data_wr :begincase(cnt)7'd0:beginsda_dir <= 1'b1 ;sda_out <= data_w_save[7]; end7'd1 :scl <= 1'b1;7'd3 :scl <= 1'b0;7'd4 :sda_out <= data_w_save[6];7'd5 :scl <= 1'b1;7'd7 :scl <= 1'b0;7'd8 :sda_out <= data_w_save[5];7'd9 :scl <= 1'b1;7'd11 :scl <= 1'b0;7'd12 :sda_out <= data_w_save[4];7'd13 :scl <= 1'b1;7'd15 :scl <= 1'b0;7'd16 :sda_out <= data_w_save[3];7'd17 :scl <= 1'b1;7'd19 :scl <= 1'b0;7'd20 :sda_out <= data_w_save[2];7'd21 :scl <= 1'b1;7'd23 :scl <= 1'b0;7'd24 :sda_out <= data_w_save[1];7'd25 :scl <= 1'b1;7'd27 :scl <= 1'b0;7'd28 :sda_out <= data_w_save[0];7'd29 :scl <= 1'b1 ;7'd31 :scl <= 1'b0 ;7'd32 :sda_dir <= 1'b0 ;7'd33 :scl <= 1'b1 ;7'd34 :beginst_done <= 1'b1 ; if(sda_in == 1)i2c_ack <= 1'b1 ; end7'd35 :beginscl <= 1'b0 ;cnt <= 7'b0 ;enddefault :;endcaseendst_addr_rd :begincase(cnt)7'd0 :beginsda_dir <= 1'b1;sda_out <= 1'b1;end7'd1 :scl <= 1'b1;7'd2 :sda_out <= 1'b0; 7'd3 :scl <= 1'b0;7'd4 :sda_out <= SLAVE_ADDR[6]; 7'd5 :scl <= 1'b1;7'd7 :scl <= 1'b0;7'd8 :sda_out <= SLAVE_ADDR[5];7'd9 :scl <= 1'b1;7'd11:scl <= 1'b0;7'd12:sda_out <= SLAVE_ADDR[4];7'd13:scl <= 1'b1;7'd15:scl <= 1'b0;7'd16:sda_out <= SLAVE_ADDR[3];7'd17:scl <= 1'b1;7'd19:scl <= 1'b0;7'd20:sda_out <= SLAVE_ADDR[2];7'd21:scl <= 1'b1;7'd23:scl <= 1'b0;7'd24:sda_out <= SLAVE_ADDR[1];7'd25:scl <= 1'b1;7'd27:scl <= 1'b0;7'd28:sda_out <= SLAVE_ADDR[0];7'd29:scl <= 1'b1;7'd31:scl <= 1'b0;7'd32:sda_out <= 1'b1; 7'd33:scl <= 1'b1;7'd35:scl <= 1'b0;7'd36:beginsda_dir <= 1'b0;sda_out <= 1'b1;end7'd37:scl <= 1'b1;7'd38:begin st_done <= 1'b1;if(sda_in == 1'b1) i2c_ack <= 1'b1; end7'd39:beginscl <= 1'b0;cnt <= 7'b0;enddefault :;endcaseendst_data_rd :begin case(cnt)7'd0:sda_dir <= 1'b0;7'd1:begindata_r_save[7] <= sda_in;scl <= 1'b1;end7'd3:scl <= 1'b0;7'd5:begindata_r_save[6] <= sda_in ;scl <= 1'b1 ;end7'd7:scl <= 1'b0;7'd9:begindata_r_save[5] <= sda_in;scl <= 1'b1 ;end7'd11:scl <= 1'b0;7'd13:begindata_r_save[4] <= sda_in;scl <= 1'b1 ;end7'd15:scl <= 1'b0;7'd17:begindata_r_save[3] <= sda_in;scl <= 1'b1 ;end7'd19:scl <= 1'b0;7'd21:begindata_r_save[2] <= sda_in;scl <= 1'b1 ;end7'd23:scl <= 1'b0;7'd25:begindata_r_save[1] <= sda_in;scl <= 1'b1 ;end7'd27:scl <= 1'b0;7'd29:begindata_r_save[0] <= sda_in;scl <= 1'b1 ;end7'd31:scl <= 1'b0;7'd32:beginsda_dir <= 1'b1;sda_out <= 1'b1;end7'd33:scl <= 1'b1;7'd34:st_done <= 1'b1; 7'd35:beginscl <= 1'b0;cnt <= 7'b0;i2c_data_r <= data_r_save;enddefault :;endcaseendst_stop:begin case(cnt)7'd0:beginsda_dir <= 1'b1; sda_out <= 1'b0;end7'd1 :scl <= 1'b1;7'd3 :sda_out <= 1'b1;7'd15:st_done <= 1'b1;7'd16:begincnt <= 7'b0;i2c_done <= 1'b1; enddefault :;endcaseendendcaseendendendmodule
PCF8563.v
module PCF8563#(parameter TIME_INIT = 48'h24_01_06_14_30_00 ,parameter WAIT_TIME = 13'd8000)(input clk ,input rst_n ,input i2c_done ,input [7 : 0] i2c_data_r , output reg i2c_rh_wl ,output reg i2c_exec ,output reg [15 : 0] i2c_addr ,output reg [ 7 : 0] i2c_data_w , output reg [ 7 : 0] sec ,output reg [ 7 : 0] min ,output reg [ 7 : 0] hour ,output reg [ 7 : 0] day ,output reg [ 7 : 0] mon ,output reg [ 7 : 0] year);reg [3 : 0] reg_cnt ;reg [12 : 0] wait_cnt ;always@(posedge clk or negedge rst_n)beginif(rst_n == 0 )begini2c_rh_wl <= 0 ;i2c_exec <= 0 ;i2c_addr <= 0 ;i2c_data_w <= 0 ;sec <= 0 ;min <= 0 ;hour <= 0 ;day <= 0 ;mon <= 0 ;year <= 0 ;reg_cnt <= 0 ;wait_cnt <= 0 ;endelsebegini2c_exec <= 0 ;case(reg_cnt)4'd0 :begin i2c_exec <= 0 ;if(wait_cnt == WAIT_TIME )beginwait_cnt <= 0 ;reg_cnt <= reg_cnt +1 ;endelsewait_cnt <= wait_cnt + 1 ;end4'd1 :begin i2c_exec <= 1 ;i2c_addr <= 8'h02 ;reg_cnt <= reg_cnt + 1 ;i2c_data_w <= TIME_INIT[7 : 0] ;end4'd2 :begin if(i2c_done == 1)beginsec <= i2c_data_r[6 : 0] ;reg_cnt <= reg_cnt + 1 ;endend4'd3 : begini2c_exec <= 1 ;i2c_addr <= 8'h03 ;reg_cnt <= reg_cnt + 1 ;i2c_data_w <= TIME_INIT[15: 8] ;end4'd4 : begin if(i2c_done == 1)beginmin <= i2c_data_r[6 : 0] ;reg_cnt <= reg_cnt + 1 ;endend4'd5 : begini2c_exec <= 1 ;i2c_addr <= 8'h04 ;reg_cnt <= reg_cnt + 1 ;i2c_data_w <= TIME_INIT[23: 16] ;end4'd6 : begin if(i2c_done == 1)beginhour <= i2c_data_r[5 : 0] ;reg_cnt <= reg_cnt + 1 ;endend4'd7 : begini2c_exec <= 1 ;i2c_addr <= 8'h05 ;reg_cnt <= reg_cnt + 1 ;i2c_data_w <= TIME_INIT[31: 24] ;end4'd8 : begin if(i2c_done == 1)beginday <= i2c_data_r[5 : 0] ;reg_cnt <= reg_cnt + 1 ;endend4'd9 : begini2c_exec <= 1 ;i2c_addr <= 8'h07 ;reg_cnt <= reg_cnt + 1 ;i2c_data_w <= TIME_INIT[39: 32] ;end4'd10 : begin if(i2c_done == 1)beginmon <= i2c_data_r[4 : 0] ;reg_cnt <= reg_cnt + 1 ;endend4'd11 : begini2c_exec <= 1 ;i2c_addr <= 8'h08 ;reg_cnt <= reg_cnt + 1 ;i2c_data_w <= TIME_INIT[47: 40] ;end4'd12 : begin if(i2c_done == 1)beginyear <= i2c_data_r[7 : 0] ;i2c_rh_wl <= 1 ;reg_cnt <= 1 ;endenddefault : reg_cnt <= 0 ;endcaseend
end
endmodule
reset_syn.v
module reset_syn(input pclk ,input reset_n ,output reg reset);reg reset1 ;always@( posedge pclk or negedge reset_n)beginif( reset_n == 0)beginreset1 <= 1 ;endelsebeginreset1 <= 0 ;reset <= reset1 ;endend
endmodule
serializer.v
module serializer10 (input reset , input paralell_clk , input serial_clk_5x , input [9 : 0] paralell_data , output serial_data_out
);wire cascade1 ; wire cascade2 ;
OSERDESE2 #(.DATA_RATE_OQ("DDR"), .DATA_RATE_TQ("DDR"), .DATA_WIDTH(10), .SERDES_MODE("MASTER"), .TBYTE_CTL("FALSE"), .TBYTE_SRC("FALSE"), .TRISTATE_WIDTH(1) )OSERDESE2_MASTER (.OFB(), .OQ(serial_data_out), .SHIFTOUT1(), .SHIFTOUT2(), .TBYTEOUT(), .TFB(), .TQ(), .CLK(serial_clk_5x), .CLKDIV(paralell_clk), .D1(paralell_data[0]),.D2(paralell_data[1]),.D3(paralell_data[2]),.D4(paralell_data[3]),.D5(paralell_data[4]),.D6(paralell_data[5]),.D7(paralell_data[6]),.D8(paralell_data[7]),.OCE(1'b1), .RST(reset), .SHIFTIN1(cascade1), .SHIFTIN2(cascade2), .T1(1'b0), .T2(1'b0), .T3(1'b0), .T4(1'b0), .TBYTEIN(1'b0), .TCE(1'b0) );OSERDESE2 #(.DATA_RATE_OQ("DDR"), .DATA_RATE_TQ("DDR"), .DATA_WIDTH(10), .SERDES_MODE("SLAVE"), .TBYTE_CTL("FALSE"), .TBYTE_SRC("FALSE"), .TRISTATE_WIDTH(1) )OSERDESE2_SLAVE (.OFB(), .OQ(), .SHIFTOUT1(cascade1), .SHIFTOUT2(cascade2), .TBYTEOUT(), .TFB(), .TQ(), .CLK(serial_clk_5x), .CLKDIV(paralell_clk), .D1(1'b0),.D2(1'b0),.D3(paralell_data[8]),.D4(paralell_data[9]),.D5(1'b0),.D6(1'b0),.D7(1'b0),.D8(1'b0),.OCE(1'b1), .RST(reset), .SHIFTIN1(), .SHIFTIN2(), .T1(1'b0), .T2(1'b0), .T3(1'b0), .T4(1'b0), .TBYTEIN(1'b0), .TCE(1'b0) );endmodule
video_driver.v
module video_driver
(input pixel_clk ,input rst_n ,input [ 23 : 0 ] pixel_data ,output [ 23 : 0 ] video_rgb ,output video_hs , output video_vs , output video_de , output [ 11 : 0 ] pixel_xpos , output [ 11 : 0 ] pixel_ypos
);parameter H_SYNC = 12'd40; parameter H_BACK = 12'd220; parameter H_DISP = 12'd1280; parameter H_FRONT = 12'd110; parameter H_TOTAL = 12'd1650; parameter V_SYNC = 12'd5; parameter V_BACK = 12'd20; parameter V_DISP = 12'd720; parameter V_FRONT = 12'd5; parameter V_TOTAL = 12'd750; reg [11 : 0] cnt_h ;reg [11 : 0] cnt_v ;wire data_reg ; always@(posedge pixel_clk or negedge rst_n)beginif( rst_n == 0)begincnt_h <= 0 ;endelsebeginif(cnt_h == H_TOTAL - 1)begincnt_h <= 0 ;endelsecnt_h <= cnt_h + 1 ;endendalways@(posedge pixel_clk or negedge rst_n)beginif( rst_n == 0)begincnt_v = 0 ;endelsebeginif( cnt_h == H_TOTAL - 1)beginif(cnt_v == V_TOTAL - 1)begincnt_v <= 0 ;endelsebegincnt_v <= cnt_v + 1 ;endendendend
assign video_hs = 1 ;
assign video_vs = 1 ; assign video_rgb = video_de ? pixel_data : 24'b0 ; assign video_de = (((cnt_h >= H_SYNC+H_BACK) && (cnt_h < H_SYNC+H_BACK+H_DISP))
&&((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))
? 1'b1 : 1'b0;assign data_reg = (((cnt_h >= H_SYNC+H_BACK - 1) && (cnt_h < H_SYNC+H_BACK+H_DISP - 1))
&&((cnt_v >= V_SYNC+V_BACK) && (cnt_v < V_SYNC+V_BACK+V_DISP)))
? 1'b1 : 1'b0;assign pixel_xpos = data_reg ? (cnt_h - (H_SYNC + H_BACK - 1'b1)) : 0;
assign pixel_ypos = data_reg ? (cnt_v - (V_SYNC + V_BACK - 1'b1)) : 0;endmodule
README.md
( HDMI部分 中间模块 IIC 转接口
其实 HDMI的部分 只要在于修改 display 的显示
对于 IIC 转接口 直接使用上一个项目的 示例 )先了解难度最大的中间模块的书写
在第一次上电 将初始值赋予i2c_dri 这是写 部分 接下来都是进入循环的读
其实我觉得他这个思路挺好的 就是记录一个 i2c_done 如果没有接收到done 信号 就一直执行
接收到了这里有一个值得思考的地方为什么正点原子把 i2c_addr,明明是 16位 在赋值的时候只搞8位
难道不会出现问题嘛?可恶!!!在完成中间模块 和 IIC的模块之后
我们接下来考虑的是 HDMI的接口
HDMI 下属又分为几个小的模块 主要修改的
dvi_transmitter_top
encoder
reset_syn
serializer
top // 修改
video_display // 修改
video_driver