« Cosmo-ZがハードウェアMCAになった | トップページ | Kintex-7のPCI Expressボードを早く仕上げなければ・・ »

2016.06.16

MITOUJTAGのBLOGANAをVerilogで使う

MITOUJTAGにはBLOGANA(ブロガナ)という機能があります。

BLOGANAは、ChipScopeやSignalTapと同様、FPGAの中のBRAMに波形を溜め込んで、「JTAGで吸い出して見る」という、内蔵型のJTAGロジックアナライザです。

BLOGANAを使うには、コアを埋め込みたいモジュールに

component blogana2 is
  generic(
    BIT_WIDTH     : integer := 72; --サンプリングする信号のBIT幅を指定(1bit以上、252bit以下で選択)
    SAMPLE_LENGTH : integer := 1024--サンプリングの長さ(word)を指定(1word以上、8192word位下で選択)
    );
  Port (    CLK         : in std_logic;
            TRIG        : in std_logic;
            USER_OP     : out std_logic_vector(19 downto 0);
            SAMPLE_EN   : in std_logic;
            DIN         : in std_logic_vector(255 downto 0); --BIT幅はgenericのBIT_WIDTHで指定
            SAMP_FREQ   : in integer range 0 to 2147483647; -- サンプリング周波数
            BUSY        : out std_logic                     -- 必ずどこかに出力すること
            );
end component;

というコンポーネントを宣言して、インスタンシエートします。

最近はISEでもVivadoでも、VerilogからVHDLのモジュールを呼び出すことはできるので、Verilogでも使えるはず・・と思っているのですが、私はVHDL派なのでVerilog対応はおざなりになっていたのですが、お客様からVerilogでも使用できないかという問合せがあったので、試してみました。

というか、インターンで来ている学生さんに試してもらいました。

結論からいうと、このままではダメでした。

という理由によるものでした。

GenericにあるBIT_WIDTHやSAMPLE_LENGTHはInteger型でも大丈夫なのですが、PortのところにあるSAMP_FREQがダメな原因でした。

どうすればよいかというと、SAMP_FREQをstd_logic_vectorに書き換える必要がありました。

うまく動くようになったLEDチカチカのソースを載せます。

module LED_Chika(xtalclk_ip, led_op, tmp);
input   xtalclk_ip;
output [7:0] led_op;
output tmp; wire [71:0] blogana_din;
wire   blogana_trig;
wire   blogana_busy;
wire [19:0] blogana_user;

//
wire   xtalclk;
reg  [7:0] led;
reg  [31:0] timer;
reg    count_en;
reg  [2:0] count; assign xtalclk = xtalclk_ip;
assign led_op = led;

blogana2 #(
   .BIT_WIDTH(72),
  //サンプリングする信号のBIT幅を指定(1bit以上、252bit以下で選択)
   .SAMPLE_LENGTH(1024)
//サンプリングの長さ(word)を指定(1word以上、8192word位下で選択)
   )
blogana
   (  .CLK(xtalclk),
   .TRIG(blogana_trig),
   .DIN(blogana_din),
   .USER_OP(blogana_user),
   .SAMPLE_EN(1'b1),
   .SAMP_FREQ(32'd480000),
   .BUSY(blogana_busy)
   );
always @(posedge xtalclk) begin
  if (timer == 5000000) begin //10Hz
   timer <= 32'h00000000;
   count_en <= 1'b1;
  end else begin
   timer <= timer + 1;
   count_en <= 1'b0;
  end
end
//counter ( output LED )
always @(count) begin
  case (count)
  3'b000: begin
   led <= 8'b00000001;
  end
  3'b001: begin
   led <= 8'b00000010;
  end
  3'b010: begin
   led <= 8'b00000100;
  end
  3'b011: begin
   led <= 8'b00001000;
  end
  3'b100: begin
   led <= 8'b00010000;
  end
  3'b101: begin
   led <= 8'b00100000;
  end
  3'b110: begin
   led <= 8'b01000000;
  end
  3'b111: begin
   led <= 8'b10000000;
  end
  default: begin
   led <= 8'b11111111;
  end
  endcase
end
always @(posedge xtalclk) begin
  if (count_en == 1'b1) begin
   count <= count + 1;
  end
end

assign blogana_trig = count_en ? 1'b1 : 1'b0;
assign blogana_din[2:0] = count;
assign blogana_din[10:3] = led;
assign blogana_din[42:11] = timer;
assign blogana_din[43] = count_en;

assign  tmp = blogana_busy;

endmodule

これでVerilogからblogana2というモジュールをインスタンシエートする形になりますが、ISEのプロジェクトマネージャでは

Verilog_blogana

という期待通りの階層構造が表示され、blogana2.vhdが下位モジュールとして認識されるようです。

論理合成したら、出来上がったBitファイルを書き込みます。

そして、ロジアナ画面を開き、BLOGANAボタンを押すと、ダイアログが開き、

Verilog_blogana2

BLOGANAを組み込んだソースファイルを指示されます。このダイアログに書かれているサンプリング周波数、ビット幅、データ長は、GenreicとPortで設定したSAMP_FREQ、BIT_WIDTH、SAMPLE_WIDTHです。

Verilogファイルを読むこむと、

assign blogana_din[*:*] = ○○○

で書いた行を自動的に解析して、信号に名前を付けてくれます。

Verilog_blogana3

バスはまとめてバスにしてくれて、名前まで付けてくれるので、意外と便利ですよ。

BLOGANAのソースファイルと、インスタンシエートするサンプルのVerilogファイルはこちらにアップロードしました。

https://www.tokudenkairo.co.jp/login2/getfile.php?target=blogana2_verilog

|

« Cosmo-ZがハードウェアMCAになった | トップページ | Kintex-7のPCI Expressボードを早く仕上げなければ・・ »

コメント

コメントを書く



(ウェブ上には掲載しません)




« Cosmo-ZがハードウェアMCAになった | トップページ | Kintex-7のPCI Expressボードを早く仕上げなければ・・ »