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でも使用できないかという問合せがあったので、試してみました。
というか、インターンで来ている学生さんに試してもらいました。
![]()
結論からいうと、このままではダメでした。
- インターフェースには型の制限がある
http://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx11/ism_r_mixed_lang_boundary_mapping_rules.htm - VHDLの場合、portにInteger型を使うとVerilogからモジュールをインスタンス化できない(verilogでinteger型を指定したとしても不可)
という理由によるものでした。
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のプロジェクトマネージャでは
という期待通りの階層構造が表示され、blogana2.vhdが下位モジュールとして認識されるようです。
論理合成したら、出来上がったBitファイルを書き込みます。
そして、ロジアナ画面を開き、BLOGANAボタンを押すと、ダイアログが開き、
BLOGANAを組み込んだソースファイルを指示されます。このダイアログに書かれているサンプリング周波数、ビット幅、データ長は、GenreicとPortで設定したSAMP_FREQ、BIT_WIDTH、SAMPLE_WIDTHです。
Verilogファイルを読むこむと、
assign blogana_din[*:*] = ○○○
で書いた行を自動的に解析して、信号に名前を付けてくれます。
バスはまとめてバスにしてくれて、名前まで付けてくれるので、意外と便利ですよ。
BLOGANAのソースファイルと、インスタンシエートするサンプルのVerilogファイルはこちらにアップロードしました。
https://www.tokudenkairo.co.jp/login2/getfile.php?target=blogana2_verilog
| 固定リンク





コメント