IO拡張モジュールのテスト例


主にFPGAチップのIOがコアボード、基板、基板インタフェースを経て、最後に拡張ボードまで、全体の対応が正しいかどうかをテストします.
70個以上のIOがあると思って、それぞれもテストして、1つの方法を考えて簡潔で迅速に解決することができます.
n個のUART送信機を設定し、それぞれのPIN NAME、例えばE 12というFPGAピンがE 12という文字列を送信することで、拡張ボード上のピン文字に対応して正しいかどうかを判断することができる.
問題はUART送信機を作ることで、パラメータ化が要求され、1つの文字列を伝達することができ、4つの文字列に規定することができます.FPGAのピン番号を表すには4文字で十分です.
このようなパラメータ伝達の例をネットワークから見つけた.
module dma_controller #( parameter integer C0_MAX_MIG_BL[3:0] = {2048,2048,2048,2048}, parameter integer C0_APP_DATA_WIDTH[3:0] = {64,64,64,64} , parameter integer C0_DMA_WR_DATA_WIDTH[3:0] = {16,16,16,16} , parameter integer C0_DMA_RD_DATA_WIDTH[3:0] = {16,16,16,16} , parameter [1 : 8*11] C0_READ_WRITE[3:0] = {"Write Only","Bidirection","Bidirection","Bidirection"}, parameter integer C1_MAX_MIG_BL[3:0] = {2048,2048,2048,2048}, parameter integer C1_APP_DATA_WIDTH[3:0] = {128,128,128,128} , parameter integer C1_DMA_WR_DATA_WIDTH[3:0] = {32,32,32,32} , parameter integer C1_DMA_RD_DATA_WIDTH[3:0] = {32,32,32,32} , parameter [1 : 8*11] C1_READ_WRITE[3:0] = {"Write Only","Bidirection","Bidirection","Bidirection"}) (
parameter [1 : 8*11] C1_READ_WRITE[3:0] = {"Write Only","Bidirection","Bidirection","Bidirection"}
複数の文字列を定義し、1つだけ定義して簡略化しようとします.
parameter [1 : 8*4] PIN_NAME = "AB12"; 
その後、簡単なUART送信機として考える、このn個の送信機は同じボーレートを用いるため、同じカウンタを用いて1個のビット同期パルス信号pulseを生成することができる.
100 Mクロックは、9600のボーレートを生成し、100*1000*1000を9600で割ったものです.10416.666を得たのは10417です.
reg [31:0] c;  always @ (posedge clk) if ( c== 10416) c<=0;else c<=c+1; 
reg pulse ; always @ (posedge clk) pulse <=c== 10416; 
その後、私たちは送信機を作ります.この送信機は6文字、4つのPIN NAMEを循環して送信します.後の2つは13 10を送信します.つまり、車に戻って改行します.つまり、r、つまり'h 13'h 10です.
各バイトに12 bitを設定し、そのうちの1つは開始ビット0、その後8データビット、その後1停止ビット、2空きビット(3停止ビットと理解できる)である.2つの空きビットを追加するのは、シリアル通信をより安定させるためです.
各バイト12 bitで6バイトが72 BITなので、0-71からループするカウンタを設定します.
reg [ 7:0 ] bit_cnt ;  always @(posedge clk) if (pulse)  bit_cntr <= (bit_cntr == 71 ) ?0:(bit_cntr + 1 ) ;
このカウンタは主に同期作用であり,72ビットのシリアルシフトレジスタを設定し,各pluseはビットを左にシフトし,bit_cntr=0のときに72ビットを新たにロードします. 
この72ビットは実際には6バイト拡張されています
  reg [71:0]    sft_reg ;  
always @ (posedge clk) if (pulse & ~|bit_cntr ) 
 sft_reg <= {  'b0  , byte0[7:0], 'b11  ,    'b0  ,byte1[7:0], 'b11  ,    'b0  , byte2[7:0], 'b11  ,  'b0  , byte3[7:0], 'b11  ,     'b0  , 'h0d, 'b11  , 'b0  , 'h0a, 'b11  }   
else sft_reg <= {  sft_reg[70:1] ,1'b  }    ;
シリアルシフトの出力は、実際にはsft_regが移動するたびに最高位になります.
reg tx; always @* tx<=sft_reg[71] ;
以上の解析により,送信機の完全なコードが呼び出される.
 




module chk_ext_io(
input clk ,
output AB12 
);

`define OVF = (1000*1000*100 )/9600 ; 
reg [31:0] c;

always@ (posedge clk) if (c == `OVF ) c<=0;else c<=1+c;

reg pulse ;
always @ (posedge clk)  pulse <= c =`OVF ;


  tx_node   # ( .PIN_NAME ("AB12"))i_txnode( .clk(clk), .pulse(pulse) ,.tx(AB12) );

endmodule


module tx_node # ( 
parameter [1:6*8]PIN_NAME = "AB12"
)( input clk, pulse ,output reg tx);



wire [7:0]  byte0 = swap8 ( PIN_NAME[1:8]    ) ;
wire [7:0]  byte1 = swap8 ( PIN_NAME[9:16]   ) ; 
wire [7:0]  byte2 = swap8 ( PIN_NAME[17:24]  ) ; 
wire [7:0]  byte3 = swap8 ( PIN_NAME[25:32]  ) ;

reg [ 7:0 ] bit_cnt ;  always @(posedge clk) if (pulse)  bit_cntr <= ( bit_cntr == 71 ) ? 0 : ( bit_cntr + 1 ) ;

reg [71:0]    sft_reg ;  
always @ (posedge clk) if (pulse & ~|bit_cntr ) 
 sft_reg <= {  'b0  , byte0[7:0], 'b11  ,    'b0  ,byte1[7:0], 'b11  ,    'b0  , byte2[7:0], 'b11  ,  'b0  , byte3[7:0], 'b11  ,     'b0  , 'h0d, 'b11  ,      'b0  , 'h0a, 'b11  }   
else sft_reg <= {  sft_reg[70:1] ,1'b1  }    ;


reg tx; always @(posedge clk) tx<=sft_reg[71] ;

  function [31:0]swap8;      // 。
    input  [3:0] inbyte;
    begin
		swap8 =  {inbyte[0] , inbyte[1] , inbyte[2] , inbyte[3] , inbyte[4] , inbyte[5] , inbyte[6] , inbyte[7]  } ; 
    end
  endfunction
  
  
  
endmodule 


先にここまで書いて、少し遅れてデバッグします.
 
reg [71:0]    sft_reg ;  always @ (posedge clk) if (pulse & ~|bit_cntr )  sft_reg <= 
reg [ 7:0 ] bit_cnt ;  always @(posedge clk) if (pulse)  bit_cntr <= (bit_cntr == 71 ) ?0:(bit_cntr + 1 ) ;
reg [71:0]    sft_reg ;  
always @ (posedge clk) if (pulse & ~|bit_cntr ) 
 sft_reg <= {  'b0  , byte0[7:0], 'b11  ,    'b0  ,byte1[7:0], 'b11  ,    'b0  , byte2[7:0], 'b11  ,  'b0  , byte3[7:0], 'b11  ,     'b0  , 'h0d, 'b11  , 'b0  , 'h0a, 'b11  }   
else sft_reg <= {  sft_reg[70:1] ,1'b  }    ;