1056738 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

緑のボタンを押せ! Press the green button

緑のボタンを押せ! Press the green button

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

Category

Keyword Search

▼キーワード検索

Archives

2024.04
2024.03
2024.02
2024.01
2023.12

Comments

 effelpist@ kilovermek.es effelpist &lt;a href=&quot; <small> <a href="http…
 Jun@ Re:「いっちゅう」さんのiEPG用ソフト入れてみた(09/15) TVdeIEPG Ver.1.2.1.0がリンク切れしてい…
 スター@ Re:hauppauge HD PVR 速報(08/25) スタービーチ <small> <a href="http://c…
 ASOBO@ Re:hauppauge HD PVR 速報 ASOBO攻略 <small> <a href="http:/…
 ハッピーメール@ Re:hauppauge HD PVR 速報 ハッピーメール <small> <a href="http:/…

Freepage List

Favorite Blog

まだ登録されていません
2007.08.10
XML
テーマ:電子工作(533)
カテゴリ:電子工作

ステータスレジスタの実装です。STATUSレジスタと呼ばれていますが、いわゆる「ステータスフラグ」としては、C(キャリー)、DC(デシマルキャリー),Z(ゼロ)ビットだけであとは別の目的に使われています。今回の実装では、ちょっと手を抜き、TO(ウォッチドッグタイマのタイムアウト)とPD(パワーダウン)はまだ、何もしていません。
各フラグは、special functionレジスタとしてもアクセスできます。悩ましいのは、フラグの更新と、スペシャルファンクションレジスタとしての書き込みが同時起きたときに、どちらを優先するかですが、PICmicro Mid-Range MCU Family Reference Manualによると、フラグの更新が優先するのですね。また、命令ごとに更新されるフラグが異なることも注意が必要です。
そこで、各フラグの更新信号を命令からデコードしてます。つぎに、各フラグごとに更新を行うようにしています。あ、あと、ちょっとポート名などに見直しもしました。

次は、File Registerのコントローラの予定です。
---
本日の御託
家内が近所のスーパーで、靴(というか、ミュールだな)の中敷を買ってきたが、よく見たら2つとも「左足」用だった。(大笑い)

//
//  STATUS register
//  Section 4.2.2.1 Status Register
//


`include "yap16_instructions.h"
`include "yap16_def.h"

module status_reg(
    input clk_i,        // system clock
    input reset_i,        // usual POR
    input [(`YAP16_INST_WIDTH -1):0] instruction_i  ,
 
    input status_we_i,  // write enable for status reg
    input [7:0]        data_i,        // data from write_bus

    output irp_o,        // IRP
    output [1:0] rp_o,        // bit6 rp1 bit5 rp0
    output to_n_o,        // bit4 TO_
    output pd_n_o,        // bit3 PD_
    output z_o,                // bit2 Z
    output dc_o,        // bit1 DC
    output c_o,                // bit0 C

    input z_next_i,        // bit2 Z
    input dc_next_i,        // bit1 DC
    input c_next_i        // bit0 C

) ;
reg irp, to_n, pd_n, z, dc, c;
reg [1:0] rp; 

reg z_we, dc_we, c_we ; // flag write (update) enable

    assign {irp_o, rp_o, to_n_o, pd_n_o, z_o, dc_o, c_o }
        = {irp, rp, to_n, pd_n, z, dc, c } ;

    always@ * begin        //always@( instruction_i )
        { z_we, dc_we,  c_we } <= 3'b000 ; // reset all
        casex( instruction_i)
            `YAP16_INST_ADDWF ,
            `YAP16_INST_SUBWF , 
            `YAP16_INST_ADDLW , 
            `YAP16_INST_SUBLW :
                { z_we, dc_we,  c_we } <= 3'b111 ;
            `YAP16_INST_ANDWF ,
            `YAP16_INST_CLRF  ,
            `YAP16_INST_CLRW  ,
            `YAP16_INST_COMF  ,
            `YAP16_INST_DECF  ,
            `YAP16_INST_INCF  ,
            `YAP16_INST_IORWF ,
            `YAP16_INST_XORWF ,
            `YAP16_INST_ANDLW ,
            `YAP16_INST_IORLW ,
            `YAP16_INST_XORLW :
                z_we <= 1'b1 ;
            `YAP16_INST_RLF   ,
            `YAP16_INST_RRF   :
                c_we <= 1'b1 ;
            // No default part
        endcase // casex
    end // always

    // C bit bit 0
    always@( posedge clk_i) begin
        if( reset_i == 1'b1 ) begin
`ifdef FULL_RESET
            c <= 1'b0 ;
`endif // FULL_RESET
        end // if
        else if ( c_we == 1'b1 ) begin
            c <= c_next_i ;
        end
        else if( status_we_i == 1'b1 ) begin
            c <= data_i[0] ;
        end
    end // always
    // DC bit bit 1
    always@( posedge clk_i) begin
        if( reset_i == 1'b1 ) begin
`ifdef FULL_RESET
            dc <= 1'b0 ;
`endif // FULL_RESET
        end // if
        else if ( dc_we == 1'b1 ) begin
            dc <= dc_next_i ;
        end
        else if( status_we_i == 1'b1 ) begin
            dc <= data_i[1] ;
        end
    end // always
    // Z bit bit 2
    always@( posedge clk_i) begin
        if( reset_i == 1'b1 ) begin
`ifdef FULL_RESET
            z <= 1'b0 ;
`endif // FULL_RESET
        end // if
        else if ( z_we == 1'b1 ) begin
            z <= z_next_i ;
        end
        else if( status_we_i == 1'b1 ) begin
            c <= data_i[2] ;
        end
    end // always

    // IRPi,IRP1,IRP0, bit[7:5]
    always@( posedge clk_i) begin
        if( reset_i == 1'b1 ) begin
            {irp, rp } <= 3'b000 ;
        end // if
        else if( status_we_i == 1'b1 ) begin
            {irp, rp } <= data_i[7:5] ;
        end
    end // always
    // to be implemented
    //to_n,        // bit4 TO_
    //pd_n,        // bit3 PD_
endmodule // status_reg
// EOF status_reg.v






お気に入りの記事を「いいね!」で応援しよう

Last updated  2007.08.10 20:56:48
コメント(0) | コメントを書く



© Rakuten Group, Inc.