我的晶元之路2

我的晶元之路2

上回說到

捋一捋信號,一共sha_clk,nsha_reset_b, sha_wdata, sha_addr, sha_rw_b, sha_ipen, sha_rdata, pre幾個

sha_clk,n時鐘

sha_reset_b複位

sha_wdata寫入的8位數據,常量

,sha_addr,n寫入數據的地址

sha_rw_b,n讀寫線控制信號

sha_ipen,n使能信號

sha_rdata,讀出的7位數據/唯一輸出

pre,32轉8的一個控制信號(這個信號的做法有待商榷,不過不討論了)

現在進度是需要明確結構,或者說架構?

l 需要明確東西是怎樣工作的

需要明確的是,如果用FPGA替代sha_iptop_tb,我需要做的首先應該是明確結構圖

既然是從FPGA中綜合實現,那應該只有sha_clk,reset和output sha_rdata三個信號。開機即啟動

l 用狀態機FSM實現tb內容

對原tb分析,狀態機初步狀態分配如下

版本shasha9_20160812

always@(posedgensha_clk)

if(sha_reset_bn== 1b0)

begin

//current_state=nS1;

current_state=S0;

end

else//測試卡了許久,需要+else這裡

case(current_state)

S0:begin

sign0=1b0;//重置延時標記

sign1=1b0;

sign2=1b0;

sha_ipen=1b0;

sha_rw_b=1b1;

sha_addr=5b00000;

sha_wdata=8b0;

pre=2b00;

delaystart=1b0;

delay=0;

startS1=1b0;

sign0=1b0;

sign1=1b0;

sign2=1b0;

current_state=S1;

end

S1:begin//start

if(startS1==1b0)

begin

delaystartn=1b1;

delayn=16h0040;

if(delaystop==1)//完成延時

begin

delaystart=1b0;

delay=1;

startS1=1b1;

sign0=1b1;

end

end

//信號sign0,對應 #500 nsha_ipen=1b1;

elsenif(sign0==1b1)

begin

if(reuse==1)

begin

delaystart=1b1;

delay=24;

monitor3_regn=1;

if(delaystop==1)//完成延時

begin

delaystart=1b0;

sha_ipen=1b1;

delay=2;

sign1=1b1;

sign0=1b0;

end

end

end

//信號sign1,對應#500

elsenif(sign1==1b1)

begin

if(reuse==1)

begin

delaystart=1b1;

delay=26;

if(delaystop==1)//完成延時

begin

delaystart=1b0;

delay=3;

sign1=1b0;

current_state=S2;

end

end

end

end

S2:begin

monitor1_reg=1;

W32be(SHACTRL,32h0000000a);

//#8000;

begin

delaystart=1b1;

delay=350;

if(delaystop==1)//完成延時

begin

delaystart=1b0;

// s2ign0=1b1;

end

end

if(s2ign0n== 1b1)

begin

read(SHACTRL);

read(SHADO0);

read(SHADO1);

read(SHADO2);

read(SHADO3);

read(SHADO4);

read(SHADO5);

read(SHADO6);

read(SHADO7);

current_staten=S3 ;

end

end

S3:begin

W32(SHADI0,32h61626364); //S3狀態,W32數據

W32(SHADI1,32h62636465);

W32(SHADI2,32h63646566);

W32(SHADI3,32h64656667);//read(SHADI3);

W32(SHADI4,32h65666768);//read(SHADI4);

W32(SHADI5,32h66676869);//read(SHADI5);

W32(SHADI6,32h6768696a);//read(SHADI6);

W32(SHADI7,32h68696a6b);//read(SHADI7);

W32(SHADI8,32h696a6b6c);//read(SHADI8);

W32(SHADI9,32h6a6b6c6d);//read(SHADI9);

W32(SHADIA,32h6b6c6d6e);//read(SHADIA);

W32(SHADIB,32h6c6d6e6f);//read(SHADIB);

W32(SHADIC,32h6d6e6f70);//read(SHADIC);

W32(SHADID,32h6e6f7071);//read(SHADID);

W32(SHADIE,32h80000000);//read(SHADIE);

W32(SHADIF,32h00000000);//read(SHADIF);

read(SHADI0);

read(SHADI1);

read(SHADI2);

read(SHADI3);

read(SHADI4);

read(SHADI5);

read(SHADI6);

read(SHADI7);

read(SHADI8);

read(SHADI9);

read(SHADIA);

read(SHADIB);

read(SHADIC);

read(SHADID);

read(SHADIE);

read(SHADIF);

current_staten=S4;

end

S4:begin

read(SHACTRL);

W32(SHACTRL,32h00000009);

read(SHACTRL);

current_staten=S5;

end

S5:begin

//#14000;

begin

delaystart=1b1;

delay=560;

if(delaystop==1)//完成延時

begin

delaystart=1b0;

end

end

if(s5ign0n== 1b1)

begin

read(SHADO0);

read(SHADO1);

read(SHADO2);

read(SHADO3);

read(SHADO4);

read(SHADO5);

read(SHADO6);

read(SHADO7);

read(SHACTRL);

current_staten=S0;

end

需要意識到的問題是,

ü 代碼中標示部分的else必須加上。要不然過不去編譯,一直是一堆

** Error:nF:/Software/About Career/[test]shasha5_20160811/sha_state_tb.v(147): nearn"=": syntax error, unexpected =, expecting IDENTIFIER ornTYPE_IDENTIFIER

卡了好久,我對modelsim編譯器的運作不是很清楚,是否像C++那樣if之後沒有大括弧就只運行一句話。而且,硬體貌似不是那麼順句而為的

注意if,else要配套

ü 這個版本我意識到不能用for(i=0;i<100;i++);這種做延時了。我重製了sha_counter.v

//這個計數器是可以用的。。。可以被大家借鑒。。。個人認為比網上其他的計數器靠譜得多。。。

modulencounter(clk,rst,start,delay,stop,reuse);

inputnclk,rst;

inputnstart;

inputn[15:0] delay;//delay??°???

// inputndelay;

outputnwire stop;//stop=1時,本次計時結束

outputnwire reuse;//resure=1時,可以開始下一次計數周期

regn[15:0] counter=16h0;

regnstop_reg=1b0;

regnreuse_reg=1b0;

regn[1:0] state=2b00;

assignnstop = stop_reg;

assignnreuse = reuse_reg;

alwaysn@ (posedge clk or rst)??

begin

ifn(rst==1b0)//

begin

countern<= 16h0;

stop_regn<= 1b0;

reuse_reg<=n1b1;

staten<= 2b00;

end

else

case(state)

2b00:

begin

stop_regn<=1b0;

reuse_reg<=1b1;

if(startn== 1b1)

begin

staten= 2b01;

reuse_reg=1b0;

end

else

begin

stop_regn<=1b0;//

reuse_reg<=1b1;

end

end

2b01:

begin

reuse_reg<=1b0;

countern<= counter + 1;

if(counter==delay)

begin

stop_regn<= 1b1;

staten<= 2b10;

countern<=16h0;

end

end

2b10:

begin

// state <= 2b11;

staten<=2b00;

// reuse_reg=1b1;

end

endcase

end

endmodule

工作信號大概如圖

ü Reuse信號沒有被用到(後面多次用到別處,最終還是沒用)。Stop和reuse的波形關係如上圖。具體的調用請見後文,這篇主代碼並不完善。

l 分析原sha_iptop_tb信號的定義

reg n[7:0] sha_wdata ; //tb文件中與所test的module的輸入埠相連接的變數定義為reg

reg nsha_rw_b ;

reg nsha_clk ;

reg n[4:0] sha_addr ;

reg n[1:0] pre ;

wire n[7:0] sha_rdata ; //tb文件中與所test的module的與輸出埠相連的定義為wire

可以reg sha_rdata_reg;

assign sha_rdata = sha_rdata_reg;

reg nsha_ipen ;

reg sha_reset_b ;

ü n一個module裡面的output一般定義為wire,在module內需要對這個outputwire修改,可以定義reg xxx_reg;assign xxx(wire)=xxx_reg;,對這個xxx_reg進行操作,相當於對output wire進行操作

ü nOutput一般定義為wire類型,但wire不一定定義為output,只是視情況而定,wire是瞬時改變值

下期開始將write和read兩項工作也用FSM狀態機化,及期間的一些思考及問題。

*******************

補上期應該有的前期調研整理,該晶元的一些控制字和演算法流程

--------------------------------

微博@georgeuser,一枚很可能要搞硬體的喵控的專業記錄日記。

記錄我所走過的路,願我的分享能予人一些借鑒,也願我某日再回頭時能再拾起細節。


推薦閱讀:

我的晶元之路3
寫書環境 Gitbook + SourceTree + MarkdownPad
IC 實現數據收集 - Floorplan
離職華為創辦「加速雲」,Eric帶你探索FPGA在人工智慧的應用

TAG:数字IC设计 | EDA |