向博主本人提問FPGA相關問題
【轉載】lattice 黑盒子的生成和使用(Creating Your Own Black Box Modules)
很多客戶,特別是外包項目,需要做黑盒子,防止他人看到源碼,那麼這就需要對相關的源碼打包加封了。diamond help 說的也是模糊模糊的,這次給出實際驗證過的流程。
1.先將要加封的模塊間一個工程,建好工程,寫好代碼之後,模塊名字叫做crosslink(這個使用黑盒子的時候要用),代碼如下:
module crosslink(
output wire[3:0] led,
input wire clk,
input wire reset
);
reg [29:0] cnt;
reg [3:0] led1;
assign led=led1;
always @ (posedge clk)
begin
if(reset==0)
cnt<=1'b0;
else if(cnt==30'd5000000)
cnt<=1'b0;
else
cnt<=cnt+1'b1;
end
always @ (posedge clk)
begin
if(reset==0)
led1<=4'b0001;
else if(cnt==30'd5000000 )
led1<={led1[0],led1[3:1]};
end
endmodule
然後做把disable io insertion設置成true,如下截圖
再然後,進可以點擊綜合translate design按鈕生成黑子盒子了,如下截圖
黑盒子的名字叫做bb_impl1.ngo(前綴視你自己的命名而定,後綴不變),爲了使用它,我們先去把他找出來
接下來就是如何使用的問題了
一樣先建立工程,但是需要注意,選的器件型號一定要和黑盒子的選的型號一致,不然跑不起來。工程建好之後先建一個頂層去包我們的黑盒子,代碼如下
module top(
output wire[3:0] led,
input wire reset
);
/*****************************************************
調用內部晶振
*****************************************************/
wire clk_osc;
defparam I1.HFCLKDIV = 1; // 1,2,4,8
OSCI I1 (
.HFOUTEN(1'd1),
.HFCLKOUT(clk_osc),
.LFCLKOUT(LFCLKOUT)
);
/*****************************************************
調用黑盒子
*****************************************************/
crosslink inst( //需要主要一定要和之前自己生成黑盒子的源碼的模塊名字一樣,這個和其他調用方式是一樣的道理
.led (led),
.clk (clk_osc),
.reset (reset)
);
endmodule
這之後就要建一個.V,去聲明黑盒子的端口,代碼如下
module crosslink( //直接拷貝黑盒子源碼的端口定義就好
output wire[3:0] led,
input wire clk,
input wire reset
);
endmodule
那麼我現在的工程怎麼去識別我的黑盒子呢?接下來要做的事情需要特別注意,說起來也挺搞笑的,尼瑪,我是試出來的。
把之前生成的bb_impl1.ngo,改成黑盒子的源碼的模塊名,即crosslink.ngo(因爲軟件是按名字去識別模塊的,不然會跑不起來或者編譯報錯)
然後放到你想放到的地方,然後指定你放到的地方的路徑(這個是爲了讓軟件能找到你的黑盒子.ngo),如下圖
然後愉快的生成下載文件,下載到板子去測試吧