博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BT1120时序,可以用于自测用
阅读量:5172 次
发布时间:2019-06-13

本文共 13498 字,大约阅读时间需要 44 分钟。

module bt1120_gen #(        parameter H_SYNC                 =  44,        parameter H_FRONT_PORCH =  88,        parameter H_BACK_PORCH  = 148,        parameter V_SYNC            =   5,        parameter V_FRONT_PORCH =   4,        parameter V_BACK_PORCH  =  36            )(        input             clk,        input             rst_p,//        input [5:0] h_sync_pixcels,//        input [5:0] h_front_porch_pixcels,//        input [5:0] h_back_porch_pixcels,//        input [5:0] v_sync_lines,//        input [5:0] v_front_porch_lines,//        input [5:0] v_back_porch_lines,                        input [12:0] col,        input [12:0] row,                output reg[15:0] odata,        output reg v_sync,        output reg h_sync,        output reg de                            );            parameter S_H_SYNC = 2'b00;    parameter S_H_BACK_PORCH = 2'b01;    parameter S_H_ACTIVE   = 2'b10;    parameter S_H_FRONT_PORCH = 2'b11;    parameter S_V_SYNC = 2'b00;    parameter S_V_BACK_PORCH = 2'b01;    parameter S_V_ACTIVE   = 2'b10;    parameter S_V_FRONT_PORCH = 2'b11;                reg [1:0] h_pre_state = S_H_FRONT_PORCH;    reg [1:0] h_nx_state = S_H_FRONT_PORCH;    reg [1:0] v_pre_state = S_V_SYNC;    reg [1:0] v_nx_state = S_V_SYNC;        reg [12:0] h_cnt     = 0;    reg [12:0] v_cnt     = 0;    reg [15:0] sync_code = 0;    reg           de_r     = 1'b0;    reg             vid_sop_r = 1'b0;    wire            pos_vid_sop;    reg                fifo_rd_valid = 1'b0;    reg [15:0] fifo_rd_data_r = 16'd0;    reg [15:0] sync_code_r = 16'd0;    reg [15:0] sync_code_r1 = 16'd0;    reg                  de_r1 = 1'b0;    reg                    de_r2 = 1'b0;    reg                    h_sync_r = 1'b0;    reg                    h_sync_r1 = 1'b0;    reg                    h_sync_r2 = 1'b0;    reg                    v_sync_r  = 1'b0;    reg                    v_sync_r1 = 1'b0;    reg                    v_sync_r2 = 1'b0;                                    reg data_en = 1'b0;    reg data_en_dly = 1'b0;    always @( posedge clk )    begin            if( h_nx_state == S_H_ACTIVE && v_nx_state == S_V_ACTIVE )                    data_en <= 1'b1;            else                    data_en <= 1'b0;    end        always @( posedge clk )    begin            data_en_dly <= data_en;    end        always @( posedge clk )    begin            if( data_en_dly )                    fifo_rd_data_r <= fifo_rd_data_r + 1'b1;            else                    fifo_rd_data_r <= 16'd0;    end    /**********************************************************************************************************************************************/            always @( posedge clk )//or posedge rst_p    begin            if( rst_p ) begin                 h_pre_state <= S_H_FRONT_PORCH;                v_pre_state <= S_V_SYNC;            end else begin                 h_pre_state <= h_nx_state;                v_pre_state <= v_nx_state;            end     end        always @( * )    begin            case( h_pre_state )            S_H_SYNC :                    if( h_cnt == H_SYNC -1 )                            h_nx_state  <= S_H_BACK_PORCH;                    else                            h_nx_state <= S_H_SYNC;                        S_H_BACK_PORCH :            begin                    if( h_cnt == H_BACK_PORCH -1 )                                    h_nx_state  <= S_H_ACTIVE;                    else                                                        h_nx_state <= S_H_BACK_PORCH;                   end            S_H_ACTIVE    :            begin                   if( h_cnt == col -1 )                             h_nx_state  <= S_H_FRONT_PORCH;                           else                                                           h_nx_state <= S_H_ACTIVE;                                        end            S_H_FRONT_PORCH :                begin                if( h_cnt == H_FRONT_PORCH -1 )                                        h_nx_state  <= S_H_SYNC;                    else                                                         h_nx_state <= S_H_FRONT_PORCH;                                        end                    default:;            endcase                                    end        always @( * )    begin            case( v_pre_state )            S_V_SYNC :            begin                     if( h_nx_state == S_H_FRONT_PORCH &&  h_pre_state  == S_H_ACTIVE   ) begin                            if( v_cnt == V_SYNC -1 )                                    v_nx_state = S_V_BACK_PORCH;                            else                                v_nx_state = S_V_SYNC;                    end else begin                            v_nx_state = S_V_SYNC;                    end            end            S_V_BACK_PORCH :            begin                    if( h_nx_state == S_H_FRONT_PORCH &&  h_pre_state  == S_H_ACTIVE   ) begin                            if( v_cnt == V_BACK_PORCH -1 )                                            v_nx_state = S_V_ACTIVE;                            else                                    v_nx_state = S_V_BACK_PORCH;                        end else begin                            v_nx_state = S_V_BACK_PORCH;                      end              end            S_V_ACTIVE    :            begin                    if( h_nx_state == S_H_FRONT_PORCH &&  h_pre_state  == S_H_ACTIVE   ) begin                           if( v_cnt == row -1 )                                     v_nx_state = S_V_FRONT_PORCH;                            else                                    v_nx_state = S_V_ACTIVE;                 end else begin                        v_nx_state = S_V_ACTIVE;                 end                                       end            S_V_FRONT_PORCH :                begin                    if( h_nx_state == S_H_FRONT_PORCH &&  h_pre_state  == S_H_ACTIVE   ) begin                        if( v_cnt == V_FRONT_PORCH -1'b1 )                                                v_nx_state = S_V_SYNC;                            else                                    v_nx_state = S_V_FRONT_PORCH;                     end else begin                            v_nx_state = S_V_FRONT_PORCH;                    end            end                    default:;            endcase    //            end else begin//                    v_nx_state = v_nx_state;//            end//        end/***********************************************************************cnt***********************************************************************/    always @( posedge clk )    begin        if( rst_p ) begin            h_cnt <= 0;        end else begin             case( h_nx_state )            S_H_SYNC :            begin                      if( h_pre_state == S_H_FRONT_PORCH  )  //&& h_cnt == H_FRONT_PORCH -1                            h_cnt <= 0;                    else                            h_cnt <= h_cnt + 1'b1;            end             S_H_BACK_PORCH :            begin                    if( h_pre_state == S_H_SYNC )//&& h_cnt == H_SYNC -1)                            h_cnt <= 0;                    else                                                        h_cnt <= h_cnt + 1'b1;                   end            S_H_ACTIVE    :            begin                if( h_pre_state == S_H_BACK_PORCH)// && h_cnt == H_BACK_PORCH -1)                        h_cnt <= 0;                           else                                                           h_cnt <= h_cnt + 1'b1;                    end            S_H_FRONT_PORCH :                begin                if( h_pre_state == S_H_ACTIVE )//&& h_cnt == col -1)                        h_cnt <= 0;                   else                                                         h_cnt <= h_cnt + 1'b1;                   end                    default:;            endcase        end    end         always @( posedge clk or posedge rst_p )    begin        if( rst_p)            v_cnt <= 0;        else  begin             if( h_nx_state == S_H_FRONT_PORCH &&  h_pre_state  == S_H_ACTIVE   )             begin                case( v_nx_state )                S_V_SYNC :                begin                    if( v_pre_state == S_V_FRONT_PORCH )                            v_cnt <= 0;                    else                            v_cnt <= v_cnt + 1'b1;                end                            S_V_BACK_PORCH :                begin                    if( v_pre_state  ==  S_V_SYNC )                                    v_cnt <= 0;                    else                                                        v_cnt <= v_cnt + 1'b1;                       end                S_V_ACTIVE    :                begin                   if( v_pre_state  ==  S_V_BACK_PORCH )                             v_cnt <= 0;                           else                                                           v_cnt <= v_cnt + 1'b1;                                            end                S_V_FRONT_PORCH :                    begin                if( v_pre_state  ==  S_V_ACTIVE )                                       v_cnt <= 0;                   else                                                         v_cnt <= v_cnt + 1'b1;                                         end                        default:;                endcase                end        end    end    /***********************************************************************h_sync v_sync de ***********************************************************************/        always @( posedge clk )    begin            if( h_nx_state == S_H_SYNC )                    h_sync_r <= 1'b1;            else                    h_sync_r <= 1'b0;    end        always @( posedge clk )    begin            if( v_nx_state == S_V_SYNC )                    v_sync_r <= 1'b1;            else                    v_sync_r <= 1'b0;    end        always @( posedge clk )    begin            if( h_nx_state == S_H_ACTIVE && v_nx_state == S_V_ACTIVE )                    de_r <= 1'b1;            else                    de_r <= 1'b0;    end/**********************************************************************************************************************************************/            always @( posedge clk )    begin        if( h_nx_state == S_H_ACTIVE && v_nx_state == S_V_ACTIVE )                sync_code <= 16'd0;        else if(( h_nx_state == S_H_BACK_PORCH) && ( v_nx_state == S_V_SYNC || v_nx_state == S_V_BACK_PORCH || v_nx_state == S_V_FRONT_PORCH))                case( h_cnt )                        H_BACK_PORCH -2 : sync_code <= 16'habab;//16'hab00;//                        H_BACK_PORCH -3 : sync_code <= 16'h0000;//16'h00ff;//                        H_BACK_PORCH -4 : sync_code <= 16'h0000;//16'h8010;//                        H_BACK_PORCH -5 : sync_code <= 16'hffff;//16'h8010;//                default:sync_code <= 16'h1080;                endcase        else if(( h_nx_state == S_H_FRONT_PORCH) && ( v_nx_state == S_V_SYNC || v_nx_state == S_V_BACK_PORCH || v_nx_state == S_V_FRONT_PORCH))                if( h_pre_state == S_H_ACTIVE)                        sync_code <= 16'hffff;//16'h00ff;//                else begin                    case(h_cnt )                                    0 : sync_code <= 16'h0000;//16'hb600;//                        1 : sync_code <= 16'h0000;//16'h8010;//                        2 : sync_code <= 16'hb6b6;//16'h8010;//                          default:sync_code <= 16'h1080;                    endcase                end        else if(( h_nx_state == S_H_BACK_PORCH)) begin // && ( v_nx_state == S_V_ACTIVE)            case(h_cnt )                                             H_BACK_PORCH -2 : sync_code <= 16'h8080;//16'h8000;//                            H_BACK_PORCH -3 : sync_code <= 16'h0000;//16'h00ff;//                            H_BACK_PORCH -4 : sync_code <= 16'h0000;//16'h8010;//                           H_BACK_PORCH -5 : sync_code <= 16'hffff;//16'h8010;//                       default:sync_code <= 16'h1080;                                    endcase                                end        else if(( h_nx_state == S_H_FRONT_PORCH)) begin// && ( v_nx_state == S_V_ACTIVE)                if( h_pre_state == S_H_ACTIVE)                        sync_code <= 16'hffff;//16'h00ff;//                else begin                    case(h_cnt )                                                   0 : sync_code <= 16'h0000;//16'h9d00;//                                 1 : sync_code <= 16'h0000;//16'h8010;//                                  2 : sync_code <= 16'h9d9d;//16'h8010;//                             default:sync_code <= 16'h1080;                                          endcase                  end                               end        else begin                    sync_code <= 16'h1080;        end    end/***********************************************************************sync***********************************************************************/            always @( posedge clk )    begin        sync_code_r <= sync_code;        sync_code_r1<= sync_code_r;        de_r1 <= de_r;        de_r2 <= de_r1;        h_sync_r1 <= h_sync_r;        h_sync_r2 <= h_sync_r1;        v_sync_r1 <= v_sync_r;        v_sync_r2 <= v_sync_r1;            end    always @( posedge clk )    begin            odata <= sync_code_r1 + fifo_rd_data_r;            h_sync <= h_sync_r2;            v_sync <= v_sync_r2;            de     <= de_r2;    end            endmodule

 

转载于:https://www.cnblogs.com/zhongguo135/p/9121005.html

你可能感兴趣的文章
TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(二)
查看>>
python 初学02 替换文件内容
查看>>
选择语句 if else
查看>>
STL中的set使用方法详细!!!!
查看>>
sealed关键字的作用
查看>>
Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
查看>>
HDU - 4472 Count
查看>>
搭建测试环境
查看>>
调用链监控 CAT 之 入门
查看>>
flexbox属性速览及常见布局实现
查看>>
zlib在Linux和windows中的使用
查看>>
rabbitMq实战使用
查看>>
JQuery Easyui/TopJUI表格基本的删除功能(删除当前行和多选删除)
查看>>
javascript 倒计时
查看>>
web前端工程师入门须知
查看>>
linux--->linux 各个文件夹及含义
查看>>
欢迎使用CSD横竖屏切换问题占位
查看>>
2016集训测试赛(二十)Problem B: 字典树
查看>>
中文保存在properties乱码的解决
查看>>
poj题目分类
查看>>