2014年2月27日木曜日

AVNET LX9 MicroBoardでUART出力

はじめに

AVNET LX9 MicroBoardでUART出力してみました。
flashledのサンプルを改良しています。
UARTのIPはOpenCoresに登録されているDocumented Verilog UARTを使用させてもらっています。(MITライセンス)
コード一式はこちらです。

UART出力するVerilog記述

UART IPをインスタンスしてa-zを出力後にCR+LFを出力するコントローラを接続します。
将来的にはCPUをのっけたいところですが、とりあえずUART出力できればよいので適当なタイミングでトリガをかけます。

Xilinx ISEで下記のように入力。

`timescale 1 ns / 1 ps

module ledflash
  (
  input  wire        CLK_66MHZ,
  input  wire        USER_RESET,
  input  wire        USB_RS232_RXD,
  output wire        USB_RS232_TXD,
  output wire [3:0]  LED
  );

  //******************************************************************//
  // Create clock.                                                    //
  //******************************************************************//

  wire          clk;
  wire          clknub;
  wire          clk_enable;

  assign clk_enable = ~USER_RESET;

  DCM_SP DCM_SP_INST(
    .CLKIN(CLK_66MHZ),
    .CLKFB(clk),
    .RST(1'b0),
    .PSEN(1'b0),
    .PSINCDEC(1'b0),
    .PSCLK(1'b0),
    .DSSEN(1'b0),
    .CLK0(clknub),
    .CLK90(),
    .CLK180(),
    .CLK270(),
    .CLKDV(),
    .CLK2X(),
    .CLK2X180(),
    .CLKFX(),
    .CLKFX180(),
    .STATUS(),
    .LOCKED(),
    .PSDONE());
  defparam DCM_SP_INST.CLKIN_DIVIDE_BY_2 = "FALSE";
  defparam DCM_SP_INST.CLKIN_PERIOD = 15.000;

  BUFGCE  BG (.O(clk), .CE(1'b1), .I(clknub));

  //******************************************************************//
  //                                                                  //
  //******************************************************************//

  reg  [26:0] led_count;

  always @(posedge clk or posedge USER_RESET) begin
    if (USER_RESET) begin
        led_count <= 27'd0;
    end else begin
        led_count <= led_count + 1'b1;
    end
  end

  assign LED[3:0] = led_count[26:23];   // connects led outputs to counter value

  reg r_delay;
  wire w_trigger;
  always @(posedge clk or posedge USER_RESET) begin
    if (USER_RESET) begin
        r_delay <= 1'b0;
    end else begin
        r_delay <= led_count[20];
    end
  end

  assign w_trigger = ~r_delay & led_count[20];

  reg [7:0] r_char;
  always @(posedge clk or posedge USER_RESET) begin
    if (USER_RESET) begin
        r_char <= "assss";
    end else begin
        if (w_trigger) begin
            if (r_char == "z") begin
                r_char <= "\r";
            end else if (r_char == "\r") begin
                r_char <= "\n";
            end else if (r_char == "\n") begin
                r_char <= "a";
            end else begin
                r_char <= r_char + 1'b1;
            end
        end
    end
  end

  uart #(
    .CLOCK_DIVIDE(1736)
  ) u_uart(
    .clk(clk), // The master clock for this module
    .rst(USER_RESET), // Synchronous reset.
    .rx(USB_RS232_RXD), // Incoming serial line
    .tx(USB_RS232_TXD), // Outgoing serial line
    .transmit(w_trigger), // Signal to transmit
    .tx_byte(r_char), // Byte to transmit
    .received(), // Indicated that a byte has been received.
    .rx_byte(), // Byte received
    .is_receiving(), // Low when receive line is idle.
    .is_transmitting(), // Low when transmit line is idle.
    .recv_error() // Indicates error in receiving packet.
    );

endmodule

UARTのCLOCK_DIVIDEパラメータには666666666/(4*9600)で計算した1736の値を設定します。

テストベンチを作成し、simで動作確認。USB_RS232_TXD端子がスタートビットでlow, ストップビットでhighになることを確認します。

制約ファイルは下記のとおりです。

NET "CLK_66MHZ"     LOC = "K15"  | IOSTANDARD = LVCMOS33;
Net CLK_66MHZ TNM_NET = CLK_66MHZ;
TIMESPEC TS_CLK_66MHZ = PERIOD CLK_66MHZ 15000 ps INPUT_JITTER 1000 ps;


NET USB_RS232_RXD     LOC = R7  | IOSTANDARD = LVCMOS33;               # "USB_RS232_RXD"
NET USB_RS232_TXD     LOC = T7  | IOSTANDARD = LVCMOS33;               # "USB_RS232_TXD"


NET LED<0>           LOC = P4  | IOSTANDARD = LVCMOS18 | DRIVE = 8 | SLEW = SLOW ;
NET LED<1>           LOC = L6  | IOSTANDARD = LVCMOS18 | DRIVE = 8 | SLEW = SLOW ;
NET LED<2>           LOC = F5  | IOSTANDARD = LVCMOS18 | DRIVE = 8 | SLEW = SLOW ;
NET LED<3>           LOC = C2  | IOSTANDARD = LVCMOS18 | DRIVE = 8 | SLEW = SLOW ;

NET USER_RESET       LOC = V4  | IOSTANDARD = LVCMOS33 | PULLDOWN;    # "USER_RESET"

CONFIG VCCAUX = "3.3" ;

合成, P&Rしてflashled.bitファイルをFPGAにコンフィグレーションします。

PuTTYで受信

手始めにWindowsのPuTTYで受信します。

シリアルポート: COM3(自分の環境の場合)
スピード(baudrate): 9600bps
データ長: 8bit
ストップビット長: 1bit
パリティ:なし
フロー制御:なし

enter image description here

できた!

2014年2月22日土曜日

AVNET LX9 MicroBoardではじめてのLED点灯

AVNET LX9 MicroBoardを買ってからだいぶ放置していたので引っ張り出して遊んでみます。 
まずはXilinx ISEでサンプルのLED点灯のパターンを合成からコンフィギュレーションまでやってみました。
途中、DegilentのUSB Driverがうまくインストールできなかったり、ボード設定ファイルの置場がわからなくて苦戦しましたがなんとかLED点灯までできました。

 作成したファイルは下記を参照してください。
  https://github.com/extremesoc/flashled

2013年12月23日月曜日

BloggerでVerilogコードのシンタックスハイライティング

Bloggerでシンタックスハイライティングの練習。


いろいろ調べたけど、VerilogコードだったらGistを使うのが一番手っ取り早い?
どなたか詳しい方教えてください。

はてなブログだったらデフォルトで対応してるっぽい。
ソースコードを色付けして記述する(シンタックス・ハイライト)

2013年12月18日水曜日

Windows8にXilinx ISEインストール

Windows8 PCにXilinx ISE13.2をインストールしたときのメモ。
Windows8はサポートしていなくてだいぶ手こずりました。

1. AVNET Spartan-6 LX9 MicroBoard付属のDVDをドライブに挿入
2. 自動再生で実行→「_xsetup.exeは動作を停止しました」
3. bin\nt64\batchxsetup.exeを実行→「Qt: Untested Windows Version 6.2 detected!」

 ということでサポートしていないようです。。。
あきらめていたところ下記の投稿が!

08-22-2012 03:40 AMI got version 14.2 installed on windows 8 but facing a lot of problems with it.
ISim is not working a all.
64bit mode of ISE crash at startup

32 mode seems to work
http://forums.xilinx.com/t5/Installation-and-Licensing/Xilinx-ISE-installation-problem-on-windows8-Release-Preview/td-p/245650

32bitモードなら動くみたいです。
上記の情報をもとに下記のファイルを実行。
D:\bin\nt\batchxstartup.exe
無事インストール画面が出てきました!

ところでVivadoってSpartan6は対応していない??
まずは付属のISEを使ってみます。

2013年12月8日日曜日

MicroZed評価キット

Xilinx Zynq-7000に俄然興味がわいています。
特にAvnetのMicroZedボードは200$ととっても安価。
Avnet の日本語サイトを見ると下記の通り10月に日本向けの独自パッケージが出るという記載が。。。
12月に入ってしまっていますが、どうなっちゃってるんでしょう??

評価ボード購入に関する注意事項
評価ボード購入は輸入諸経費が必要ない国内(アヴネット・インターニックス)での購入をお勧めします。

【この評価ボードは、お客様の利便性向上のため、日本独自のパッケージを10月をめどにご用意する予定です。
詳細については、準備が整い次第、本ページおよびニュースレターでご案内いたします。】

2013年12月5日木曜日

Real Intentが60%の高成長

Real Intentが60%の高成長を達成したそうです。Real Intentは新興EDAベンダーで、
リントツールとCDC チェッカーを主力製品として展開しています。

EDSFairで日本の代理店の方とお話ししました。米大手の半導体メーカーも採用しているようです。

競合の製品としてAtrentaのSpyglassがあります。
疑似エラーの少なさや高速実行で徐々に追い上げているみたいです。

参照
http://www10.edacafe.com/nbc/articles/1/1240322/Real-Intent-Achieves-60-Percent-Business-Growth-Fiscal-Year-2013;-Outperforms-Verification-Industry-Large-by-More-than-10X