カスタムIPはなるほど簡単

43209 ワード

本文は転載文章で、原作者のウェブサイトは:http://www.cnblogs.com/nios_ii/archive/2010/10/05/1844432.html
まずVerilog言語またはVHDLで作成したり、原理図でハードウェアドライバを描いたりします.デジタルチューブドライバを例に、Verilogを作成するには以下のようにします.

   
   
   
   
1 module sg7IP( 2 3   input reset, 4   input clk, 5   input avs_s1_write, 6   input [ 31 : 0 ]avs_s1_writedata, 7   input avs_s1_address, 8   output wire [ 7 : 0 ] oSEG7 9 ); 10 11   reg [ 7 : 0 ] sg7_r; 12   always @( posedge clk or posedge reset) 13 begin 14 if (reset) 15 sg7_r <= 8 ' hf; 16 else if (avs_s1_write && avs_s1_address == 0 ) 17 sg7_r[ 7 : 0 ] <= avs_s1_writedata[ 7 : 0 ]; 18 19 end 20 assign oSEG7 =~ sg7_r; 21 endmodule 22


 
 
次に、sg 7 IPを呼び出すために最上位ファイルを作成する.v上記のドライバが正常であることをテストして検証します.ここではsg 7 topを書きました.vは、最上位ファイルとして使用されます.
 

   
   
   
   
1 module seg7top( 2 input iCLK_50, 3 input [ 0 : 0 ]iKEY, 4 output wire [ 6 : 0 ] oHEX0_D, 5 output wire oHEX0_DP 6 ); 7 8 9 sg7IP sg7ipu0( 10 .reset( ! iKEY[ 0 ]), 11 .clk(iCLK_50), 12 .avs_s1_write( 1 ' b1), 13 .avs_s1_writedata( 32 ' d113), 14 .avs_s1_address( 1 ' b0), 15 .oSEG7({oHEX0_DP,oHEX0_D[ 6 : 0 ]}) 16 17 endmodule 18


チュートリアルを割り当て、コンパイルしてDE 2-70の開発ボードにダウンロードし、デジタルチューブHEX 0をFと表示するとハードウェア駆動が正常であることを示します.
 
次にSOPCBuilderを開き、componentを新規作成します.プロセスは次の図のようになります.
 
自定义IP原来如此简单_第1张图片
 
 
sg 7 IP、onchipmemory、cpu、jtag uartコンポーネントを追加し、「生成」をクリック
 
自定义IP原来如此简单_第2张图片
 
終わったらQUARTUS IIでsg 7 topを修正する.v
 
 
 

   
   
   
   
1 module seg7top( 2 input iCLK_50, 3 input [ 0 : 0 ]iKEY, 4 output wire [ 6 : 0 ] oHEX0_D, 5 output wire oHEX0_DP 6 ); 7 8 9 nios_cpu nios_cpu_inst 10 ( 11 .clk_0 (iCLK_50), 12 .oSEG7_from_the_sg7IP_0 ({oHEX0_DP,oHEX0_D[ 6 : 0 ]}), 13 .reset_n (iKEY[ 0 ]) 14 ); 15 16 endmodule 17


 
 
再コンパイル、ダウンロード.
NISO IDEを開きます.
空のプロジェクトを新規作成します.
sg 7を確立する.h
 
 

   
   
   
   
1 #ifndef SEG7_H_ 2 #define SEG7_H_ 3 4 void SEG7_NUM(alt_u8 num); 5 6 7 #endif /*SEG7_H_*/ 8


 
 
sg 7を確立する.c
 
 

   
   
   
   
1 # include " io.h " 2 # include " alt_types.h " 3 4 # include " system.h " 5 6 # include " SEG7.h " 7 8 #define SEG7_SET(seg_mask) IOWR(SG7IP_0_BASE,0,seg_mask) 9 10 static unsigned char szMap[] = { 11 63 , 6 , 91 , 79 , 102 , 109 , 125 , 7 , 12 127 , 111 , 119 , 124 , 57 , 94 , 121 , 113 13 }; // 0,1,2,....9, a, b, c, d, e, f 14 15 16 void SEG7_NUM(alt_u8 num) 17 { 18 SEG7_SET(szMap[num]); 19 } 20


 
mainを作成します.c
 

   
   
   
   
1 # include < stdio.h > 2 # include " system.h " 3 # include " unistd.h " 4 # include " alt_types.h " 5 # include " SEG7.h " 6 7 int main(void) { 8 alt_u8 i = 0 ; 9 printf( " My first IP " ); 10 while ( 1 ){ 11 for (i = 0 ; i < 10 ; i ++ ) { 12 SEG7_NUM(i); 13 printf( " Now print:%d
" ,i); 14 usleep( 1 * 1000 * 1000 ); 15 } 16 } 17 return 0 ; 18 } 19


CTRL+Bコンパイル.
run as  NIOS II  hardware.
開発ボードのデジタルチューブは0から9まで変化している.IP作成テスト完了.