FPGA活用回路&サンプル記述集(4) ―― 安定動作のための回路

小野 裕幸,森田 一

module sciin( si, pout, rcvd, ferr, div, clk, nreset );

    input          si ; ←シリアル・データ入力
    output  [7:0]  pout ; ←パラレル・データ出力
    output         rcvd ; ←受信終了パルス出力
    output         ferr ; ←フレーミング・エラーパルス出力
    input  [10:0]  div ; ←※1

    input          clk ;
    input          nreset ;
    reg     [4:0] stat ;
    reg    [10:0] dc ;
    reg     [7:0] pout ;
    reg           rcvd ;
    reg           ferr ;

    always @( posedge clk or negedge nreset )
    begin
        if( !nreset ) begin

            stat <= 0 ;←リセット時の各レジスタの初期化
            pout <= 0 ;
            dc   <= 0 ;
            rcvd <= 0 ;
            ferr <= 0 ;

        end
        else begin

            if( dc == 0 ) begin←※2
                dc <= div ;
                if( stat != 0 )
                    stat <= stat + 5'd01 ;
            end

            else
            if( stat != 5'd00 )
                dc <= dc - 1 ; ←分周カウンタのデクリメント
            case( stat )
                0: begin
                    stat <= { 4'b0000,~si } ; ←スタート・ビット待ち
                    ferr <= 0 ;
                    rcvd <= 0 ;
                end
                2,4,6,8,10,12,14,16,18,20:
                    ;
                1: begin
                    if( si != 0 )
                        stat <= 0 ;
                end

                3,5,7,9,11,13,15,17:←※3
                    if( dc == 0 ) begin
                        pout[7:0] <= { si,pout[7:1] } ;
                    end
                19:
                    if( dc == 0 ) begin←※4
                        rcvd <= 1 ;
                        stat <= 0 ;
                        if( si == 0 )
                            ferr <= 1 ;

                    end
                21,22,23,24,25,26,27,28,29,30,31:
                    stat <= 0 ;
            endcase
        end
    end
endmodule
module sciout( so, pi, div, xmit, rdy, clk, nreset );

    output        so ; ←シリアル・データ出力
    input   [7:0] pi ; ←パラレル・データ入力
    input  [10:0] div ; ←※5
    input         xmit ;         ←フレーミング送信開始、パルス入力
    output        rdy ; ←送信中表示(送信中'0'になる)

    input         clk ;
    input         nreset ;

    reg    [7:0] ps8 ;
    reg          so ;
    reg    [4:0] stat ;
    reg   [10:0] dc ;
    reg          rdy ;
always @( posedge clk or negedge nreset )
    begin

        if( !nreset ) begin←リセット時の各レジスタの初期化
            ps8  <= 8'h00 ;
            stat <= 5'h00 ;
            dc   <= 16'h0000 ;
            rdy  <= 1'b1 ;
            so   <= 1'b1 ;

        end
        else begin
            if( dc == 16'h0000 )
                dc <= div ;
            else
                if( stat != 5'h00 )
                    dc <= dc - 1 ;
            if( dc == 16'h0000 && stat != 5'h00 )
                stat <= stat + 5'h01 ;
            case( stat )
                5'd00: begin
                    if( xmit == 1'b1 ) begin

                        rdy <= 1'b0 ;←送信開始.スタート・ビット送出
                        ps8 <= pi ;
                        stat <= 5'h01 ;
                        so <= 1'b0 ;
                    end

                    else
                        rdy <= 1'b1 ;
                end
                5'd01:
                    rdy <= 0 ;

                5'd02,5'd04,5'd06,5'd08,5'd10,←データを送出
                5'd12,5'd14,5'd16:
                    if( dc == 16'h0000 ) begin
                        so <= ps8[0] ;
                        ps8[6:0] <= ps8[7:1] ;
                    end

                5'd03,5'd05,5'd07,5'd09,5'd11,
                5'd13,5'd15,5'd17:
                   ;
                5'd18, 5'd19: begin
                    so <= 1'b1 ; ←ストップ・ビットを送出
                end
                default: begin
                    stat <= 5'd00 ;
                    rdy <= 1'b1 ;
                end
            endcase
        end
    end
endmodule


リスト2-1 シリアル通信のためのVerilog HDL記述

注1;ボー・レート分周比.分周比はボー・レートの分周比の半分にする
注2;分周カウンタが0になったらステートを進める
注3;シリアル・データの取り込み
注4;ストップ・ビットの確認
注5;ボー・レート分周比.分周比はボー・レートの分周比の半分にする

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日