我的晶元之路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內需要對這個output的wire修改,可以定義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在人工智慧的應用