2016年1月31日 星期日

【FPGA茫茫大海2】register slicing in AXI

在看data sheet常常會看到register slicing這個名詞

這個詞的意思到底是甚麼呢?

簡單的來說AXI interconnect會有所謂的master和slave端,由master傳給slave。

而master和slave的意義可以去看上一篇【FPGA茫茫大海1】

這張圖可以解釋register slicing是甚麼



簡單來說就是master和slave之間的橋樑,一邊要傳送給另一邊訊息的時候,會先將資料傳給register,再傳給另一邊,這樣的好處就是可以做timing的分割(timing isolation),避免兩邊不同timing會有問題。

而register slicing會有三種mode可以選擇,如下所示:
第一種就是需要timing isolation,都有register在中間,第二種則是ready signal和兩邊溝通timing沒有問題,可以直接傳過去,第三種則是都沒差,沒有timing isolation的需要,所以就直接bypass過去。


reference:About the AXI register slice




2016年1月28日 星期四

【FPGA茫茫大海1】在axi bus 上master和slave差別

就像圖上所示,究竟master和slave的差別是甚麼?
後來查資料看到一句話,覺得很有感覺,在Jay Kraut的Hardware Edge Detection Using an Altera Stratix Nios II Development Kit的論文中,談到一句話,一語道破master與slave。
The masters initiate communication and the slave responds to them.

就現在的感覺很像是master就是負責發送命令的,slave則是負責接收master命令的單位。

另外想要了解AXI的細節,可以參考這篇Xilinx文件:AXI Reference Guide

2015年9月29日 星期二

verilog隨手記(一) 關於sequential circuit內的if else判斷會有delay

似乎在sequential cirucit內的if else判斷會有簡單的delay發生,並不會原本理想的狀況,舉例來說:


在curr_state==READ的時候 out輸出應該要是8,雖然當下的那個cycle的確curr_state應該是READ,但因為這是剛輸入進來的 所以curr_state==READ這個判斷,curr_state的值卻抓到上一次的 仔細想想也很合理,因為這本來就是posedge clk trigger的,在這個edge要同時將curr_state轉成READ,同時又是要這個state判斷為READ,out輸出成8 這本來就是不可能的,他在這個edge的瞬間值抓到就只是curr_stae==IDLE所以out輸出會是9,所以這個edge判斷必須等到下一個cycle。

總結來說,這個標題似乎下的有點錯誤,這不算是delay,而是edge trigger,本來就不可能將curr_state轉成READ後,又同時是以READ做判斷(一定是以IDLE做判斷),等到下個cycle時,edge trigger才會抓到READ。

2015年8月30日 星期日

code block in Blogger

程式碼 試試看更長的code
#include <iostream>
#include <fstream>
#include <math.h>
#include <Dense>
#include <SVD>

using Eigen::MatrixXf;
using Eigen::JacobiSVD;
using namespace std;

#define POINT 4

int main()
{
    fstream input;
    int length;
    int i,j,p,pixel;

    int avg[POINT];
    int sum;

    float cov[POINT][POINT]={};
    float x,y=0;
    float KLT_eff,DCT_eff;
    float r;

    unsigned char X[POINT][512*512/POINT];

    input.open("baboon.bmp", ios::in | ios::binary);

    //get the file size.
    input.seekg(0, ios::end);
    length = input.tellg();
    input.seekg(0, ios::beg);

    char *data = new char[length];
    input.read(data, length);        //read the input file and write into the array.

    //build the four vector X1, X2, X3, X4
    for (i=0, pixel=1078; i<512*512/POINT; i++){
        for (p=0; p<POINT;p++){
            X[p][i]=data[pixel++];
        }
    }

    //find each mean of X1, X2, X3, X4
    for (p=0; p<POINT; p++){
        for (i=0, sum=0; i<512*512/POINT; i++){
            sum=X[p][i]+sum;
        }
        avg[p]=sum/(512*512/POINT);
    }

    //Covariance Matrix
    for (i=0; i<POINT; i++){
        for (j=0; j<POINT; j++){
            for (p=0; p<512*512/POINT; p++){
                cov[i][j]=(X[i][p]-avg[i])*(X[j][p]-avg[j])+cov[i][j];
            }
            cov[i][j]=cov[i][j]/((512*512/POINT)-1);
        }
    }

    //print the matrix
    cout<<"Covariance Matrix:"<<endl;
    for (i=0;i<POINT;i++){
        for (j=0;j<POINT;j++){
            cout <<cov[i][j]<<"  ";
        }
        cout <<endl;
    }

    //KLT basis vectors
    MatrixXf m(POINT,POINT);
    for (i=0; i<POINT; i++){
        for (j=0; j<POINT; j++){
            m(i,j)=cov[i][j];
        }
    }

    //std::cout << "Here is the matrix m:" << std::endl << m << std::endl;
    JacobiSVD<MatrixXf> svd(m, Eigen::ComputeThinU | Eigen::ComputeThinV);
    std::cout <<endl<< "Its singular values are:" << std::endl << svd.singularValues() << std::endl;

    //Tdct    //inv_Tdct
    MatrixXf Tdct(POINT,POINT);
    MatrixXf inv_Tdct(POINT,POINT);

    for (i=0; i<POINT; i++){
        for (j=0; j<POINT; j++){
            if (i==0)
                Tdct(i,j)=1/(sqrt((float)POINT));
            else
                Tdct(i,j)=sqrt(2/(float)POINT)*cos((M_PI*(2*j+1)*i)/(2*POINT));
        }

    }

    //cout<<endl<<"Tdct matrix:"<<endl<<Tdct<<endl;
    //build the matrix to calculate inverse matrix
    MatrixXf tmp(POINT,2*POINT);
    for (i=0; i<POINT; i++){
        for (j=0; j<POINT; j++){
            tmp(i,j)=Tdct(i,j);
        }
    }
    for (i=0; i<POINT; i++){
        for (j=POINT; j<2*POINT; j++){
            if ((j-POINT)==i) tmp(i,j)=1.0;
            else tmp(i,j)=0;
        }
    }

    //calculating the inverse matrix
    for (i=0; i<POINT; i++){        //which row is standard to be one and elimate the other rows to be zero
        float beone=tmp(i,i);
        //let standard row (i,i) to be one, other col elements need to be resized.
        for (j=0; j<2*POINT; j++){  //col
            tmp(i,j)=tmp(i,j)/beone;
        }

        //elimating others row
        for (int m=0; m<POINT; m++){    //row
            r=tmp(m,i);     //ref
            for (int l=0; l<2*POINT; l++){  //col
                if (m!=i){
                    tmp(m,l)=tmp(m,l)-tmp(i,l)*r;
                }
            }
        }
    }

    //build inv_Tdct matrix
    for (i=0;i<POINT;i++){
        for (j=0;j<POINT;j++){
            inv_Tdct(i,j)=tmp(i,j+POINT);
        }
    }

    MatrixXf tmp2(POINT,POINT);
    MatrixXf D(POINT,POINT);

    //DCT matrix: D=Tdct*Cov*inv_Tdct
    for (i=0; i<POINT; i++){
        for (j=0; j<POINT; j++){
            float buf=0;
            for (int k=0; k<POINT; k++){
                buf=buf+Tdct(i,k)*m(k,j);      //tmp2 matrix = Tdct matrix* Covariance matrix; tmp2=Tdct*Czm
            }
            tmp2(i,j)=buf;
        }
    }

    for (i=0; i<POINT; i++){
        for (j=0; j<POINT; j++){
            float buf=0;
            for (int k=0; k<POINT; k++){
                buf=buf+tmp2(i,k)*inv_Tdct(k,j);      //D matrix = tmp2 matrix* inverse Tdct matrix; D=tmp2*inv_Tdct
            }
            D(i,j)=buf;
        }
    }

    cout<<endl<<"D matrix:"<<endl<<D<<endl<<endl;

    //De-correlation Efficiency for KLT
    //Y
    for (i=0,y=0;i<POINT;i++)
        y=0;
    //X
    for (i=0,x=0;i<POINT;i++){
        for (j=0;j<POINT;j++){
            if (i!=j)
                x=x+m(i,j);
        }
    }

    KLT_eff=1-y/x;
    cout <<"Decorrelation Efficiency: "<<endl<<"KLT: "<<KLT_eff*100<<"%"<<endl;

    //De-correlation Efficiency for DCT
    //Y
    for (i=0,y=0;i<POINT;i++){
        for (j=0;j<POINT;j++){
            if (i!=j)
                y=y+abs(D(i,j));
        }
    }
    //X
    for (i=0,x=0;i<POINT;i++){
        for (j=0;j<POINT;j++){
            if (i!=j)
                x=x+abs(m(i,j));
        }
    }

    DCT_eff=1-y/x;
    cout<<"DCT: "<<DCT_eff*100<<"%"<<endl;



    return 0;

}

參考:http://www.ewdna.com/2012/02/css-block.html

HTML encoder:http://formatmysourcecode.blogspot.tw/
會需要用到HTML encoder主要的原因就是一些符號在HTML裡是有特殊意義的(像是 > < &)
都需要轉換才能夠使用 否則code內的< > 就會被當成HTML的特殊意義使用 

網頁設計(HTML學習):http://www.phd.com.tw/knowledge/html/typesetting/
將code轉成HTML:http://formatmysourcecode.blogspot.tw/

8/31 2015

Start

    在學習的過程中,很多東西其實花了很大的心力去研究它,但用完後,回頭想再去看的時候,發現有些觀念可能都忘記了,所以希望能夠建立一個自己的筆記,幫助自己記憶,也能夠在寫這些東西的過程中,更確定自己的思路與想法是否正確,或是有其他人能夠一起加入討論都非常歡迎。