FC2カウンター FPGAの部屋 AXIバスのEDKでキャラクタ・ディスプレイ・コントローラのカスタムIPを作る7
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

AXIバスのEDKでキャラクタ・ディスプレイ・コントローラのカスタムIPを作る7

AXIバスのEDKでキャラクタ・ディスプレイ・コントローラのカスタムIPを作る6”で、画面いっぱいにA を出したはずなのに、書けていない場所があった。今回はその理由を探ってみた。(くだらないミスでした)

user_logic.vhd で、CharDispCtrler_SP605.v をインスタンスしている。processer_weには、we_1dを入れたが、これは50MHzのクロックに同期した信号だった。
SP605_AXI_CDC_23_110802.png

CharDispCtrler_SP605.v でクロックをピクセル・クロックにするために40MHz(SVGAでした)に落としている。それなのに、processer_weは50MHzで同期した信号を入れてしまった。アドレスやデータは、その前から確定してるので問題はないようだ。
そこで、50MHzと40MHzをつなぐハンドシェーク回路を付けた。下にそれを示す。clkinが50MHz、clkが40MHzクロックだ。

    reg        we_clkin;
    wire    we_ena_clkin;
    reg        we_ena_clkin_1d, we_ena_clkin_2d;
    reg        we_in_clk_1d, we_in_clk_2d;
    parameter    IDLE_WE =        3'b001,
                WE_ENA_PXCLK =    3'b010,
                WE_WAIT =        3'b100;
    reg        [2:0]    cs_we;
    reg        we;
    
    
    // clkin でのwe を保持して、ハンドシェークする
    always @(posedge clkin) begin
        if (rst)
            we_clkin <= 1'b0;
        else begin
            if (processor_we)
                we_clkin <= 1'b1;
            else if (we_ena_clkin_2d)
                we_clkin <= 1'b0;
        end
    end
    
    // we_node をclkで同期化する
    always @(posedge clk) begin
        if (rst) begin
            we_in_clk_1d <= 1'b0;
            we_in_clk_2d <= 1'b0;
        end else begin
            we_in_clk_1d <= we_clkin;
            we_in_clk_2d <= we_in_clk_1d;
        end
    end
    
    // we を出力するステートマシン
    always @(posedge clk) begin
        if (rst) begin
            cs_we <= IDLE_WE;
            we <= 1'b0;
        end else begin
            case (cs_we)
                IDLE_WE : begin
                    if (we_in_clk_2d) begin
                        cs_we <= WE_ENA_PXCLK;
                        we <= 1'b1;
                    end
                end
                WE_ENA_PXCLK : begin
                    cs_we <= WE_WAIT;
                    we <= 1'b0;
                end
                WE_WAIT : begin
                    we <= 1'b0;
                    if (~we_in_clk_2d)
                        cs_we <= IDLE_WE;
                end
            endcase
        end
    end
    assign we_ena_clkin = (cs_we ==  WE_WAIT) ? 1'b1 : 1'b0;
    
    // we_ena_clkin をclkinで同期化
    always @(posedge clkin) begin
        if (rst) begin
            we_ena_clkin_1d <= 1'b0;
            we_ena_clkin_2d <= 1'b0;
        end else begin
            we_ena_clkin_1d <= we_ena_clkin;
            we_ena_clkin_2d <= we_ena_clkin_1d;
        end
    end
    
            
    dcm_inst dcm_inst_i (
        .clkin(clkin),
        .reset(rst),
        .clkout(clk),
        .clk90(clk90),
        .locked(locked)
    );
    assign reset = !locked;
    assign clkb = !clk;
    assign clk90b = !clk90;
//    assign dvi_reset_b = locked;
    assign dvi_reset_b = 1'b1;
    
    CharDispCtrler CharDispCtrler_inst (
        .clk(clk),
        .reset(reset),
        .processor_addr(processor_addr),
        .processor_din(processor_din),
        .processor_dout(processor_dout),
        .processor_we(we),


これで、コンパイルして、SDKでビットファイルをボードにダウンロードして、実行したら画面に、うまくA が並んだ。成功した。。。
SP605_AXI_CDC_39_110809.jpg

原因は、クロックが違っていることに気がつかなかったことだった。クロックを載せ替えたら問題が無くなった。
  1. 2011年08月10日 21:07 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/1873-cae9a8df
この記事にトラックバックする(FC2ブログユーザー)