Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PICを作ろう ,ALU(2) ~昼休みにまったり進めるプロジェクト~

ALUのソースコード (一部省略)

//
// ALU
//
//
// Based on section 15.0 , TABLE 15-2: PIC16F627A/628A/648A INSTRUCTION SET
// PIC16F627A/628A/648A
//  (c) 2007 BakaOyaji
// $Id$
//

`include "../pic_def.h"
`include "../pic_instructions.h"

module alu( y_o, a_i, b_i,
        c_o , dc_o, z_o , skip_o , c_i ,
        instruction_i);
output [7:0] y_o ;
input [7:0]  a_i, b_i ; // Abus Bbus input
output c_o , // carry out
        dc_o,// decimal carry out
        z_o ,// zero out
        skip_o; // test flag
input c_i ; // carry in
input [(`Instruction_Len-1):0] instruction_i  ;

reg [7:0] y_o ;
reg c_o , dc_o, z_o, skip_o ;

reg [2:0] bbb; // bbb slice in instruction

    always@( a_i or  b_i or c_i or instruction_i ) begin
        bbb = instruction_i[9:7];
        // reset everything here. hints for synthesis
        c_o = 1'bx ;
        dc_o = 1'bx;
        z_o = 1'bx ;
        y_o = 8'bxxxx_xxxx ;
        // skip flug must be strictly fully maintained
        skip_o = 1'b0 ;           
        casex (instruction_i )
            `INST_ADDWF , 
            `INST_ADDLW :   begin
                // { c_o , y_o } = {1'b0, a_i } + b_i + c_i ;
                { c_o , y_o } = a_i  + b_i + c_i ;
                dc_o = ( y_o[3:0] > 'd9 ) ? 1'b1 : 1'b0 ;
                z_o = ( y_o == 'h00 ) ? 1'b1 : 0 ;
            end
           
            `INST_ANDWF ,
            `INST_ANDLW : begin
                y_o = a_i & b_i ;
                z_o = ( y_o == 'h00 ) ? 1'b1 : 0 ;
            end

            `INST_CLRF ,
            `INST_CLRW : begin
                y_o = 8'b0000_0000 ;
                z_o = ( y_o == 'h00 ) ? 1'b1 : 0 ;
            end

            `INST_COMF : begin
                y_o = ~b_i ;
                z_o = ( y_o == 'h00 ) ? 1'b1 : 0 ;
            end

            `INST_DECF ,
            `INST_DECFSZ : begin
                y_o = b_i - 1'b1 ;
                if ( instruction_i == `INST_DECF ) begin
                    z_o = ( y_o == 'h00 ) ? 1'b1 : 0 ;
                end // if
                else begin
                    skip_o = ( y_o == 'h00 ) ? 1'b1 : 0 ;
                end // else
            end

            `INST_INCF ,
            `INST_INCFSZ : begin
                y_o = b_i + 1'b1 ;
                if ( instruction_i == `INST_INCF ) begin
                    z_o = ( y_o == 'h00 ) ? 1'b1 : 0 ;
                end // if
                else begin
                    skip_o = ( y_o == 'h00 ) ? 1'b1 : 0 ;
                end // else
            end

            `INST_IORWF ,
            `INST_IORLW : begin
                y_o = a_i || b_i ;
                z_o = ( y_o == 'h00 ) ? 1'b1 : 0 ;
            end

            `INST_MOVF :
                y_o = b_i ;
            `INST_MOVWF :
                y_o = a_i ;
            `INST_RLF :
                {c_o, y_o } = { b_i, c_i} ;
            `INST_RRF :
                {y_o, c_o } = { c_i, b_i} ;
            `INST_SUBWF ,
            `INST_SUBLW : begin
                // physical adder can be shared with ADDWF, ADDLW
                { c_o , y_o } = b_i - a_i - ~c_i ;
                dc_o = ( y_o[3:0]  > 'd9 ) ? 1'b1 : 1'b0 ;
                z_o = ( y_o == 'h00 ) ? 1'b1 : 0
                   :       

            default : begin       
                // nothing to do
            end
        endcase
    end // always
endmodule // ALU
// EOF ALU.v



コメント

コメントの投稿


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

トラックバック

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

FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。