2011年11月24日木曜日

PicoBlaze を使ってみる(その2)


by yosikawa » 2011年2月14日(月) 01:08
PicoBlaze を使ってみるの続き。
PicoBlaze の使い方は分かったけど、もう少し発展させよう。
今回はスイッチを接続する。

コード: 
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    03:19:51 02/13/2011 
// Design Name: 
// Module Name:    top 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//////////////////////////////////////////////////////////////////////////////////
`default_nettype none
module top(clk, led, switch, btn, rotary_a, rotary_b, rotary_press);

   input wire clk;               // グローバルクロック
   input wire [3:0] switch;      // スライドスイッチ
   input wire [3:0] btn;         // プッシュスイッチ (3:north, 2:east, 1:west, 0:south)
   input wire rotary_a;            // ロータリスイッチA接点(アクティブ・ロー)
   input wire rotary_b;            // ロータリスイッチB接点(アクティブ・ロー)
   input wire rotary_press;      // ロータリスイッチ・プッシュ
   output wire [7:0] led;         // LED

   // PicoBlaze の信号定義
   wire [9:0] address;
   wire [17:0] instruction;
   wire [7:0] port_id;
   wire write_strobe;
   wire [7:0] out_port;
   wire read_strobe;
   reg [7:0] in_port = 0;
   reg interrupt = 0;
   wire interrupt_ack;
   wire reset = 1;

   // PicoBlaze インスタンス定義 (resetはアクティブ・ハイ)
   kcpsm3 kcpsm3(
      address,
      instruction,
      port_id,
      write_strobe,
      out_port,
      read_strobe,
      in_port,
      interrupt,
      interrupt_ack,
      ‾reset,
      clk);

   //ROM 定義
   t5_rom t5_rom(address, instruction, clk);
   
   // スイッチ入力を入力ポートに接続する
   always @(posedge clk) begin
      in_port <= { switch, btn };
   end
   
   // 出力ポートから信号を取り出す
   reg [7:0] out1;
   always @(posedge clk) begin
      if(write_strobe) begin
         out1 <= out_port;
      end
   end
   assign led = out1;
   
endmodule


ボードのスイッチ入力を PicoBlaze に接続し、PicoBlaze の出力をLEDに出力した。
では再度、簡単なマシン語プログラムから試す。
コード: 
      ADDRESS 000      ; Programs always start at reset vector 0
BEGIN:
      INPUT s0, 00
      OUTPUT s0, 00
      JUMP BEGIN      ; Embedded applications never end

ポート00から読んだ内容をポート00にそのまま出力する。
これで、PicoBlaze 経由でスイッチとLEDが繋がった。

試してみよう。。。あっけなく動いた。
次はロータリスイッチも繋いでみよう。と、思ったけどうまく動かなかったので、先にpBlaze IDEを試す。
pBlaze IDE

pBlaze IDEを使うとPicoBlaze のシミュレーションができる。
さて、インストールしてみると、、、なんと中身は EXEファイルが1個だけ。
webサイトは単なる紹介ページと思ったが、実はあれがマニュアルだったのか。

でも使い方は大体わかった。一応、PicoBlazeのユーザガイドにも少し説明があるし。
以下、pBlaze IDE用のアセンブリプログラム t5_rom.psm (改)
コード: 

                    VHDL      "ROM_blank.vhd", "t5_rom.vhd", "rom"
switched            DSIN      $00
led                 DSOUT     $00
                    ORG       0
BEGIN: 
                    IN        s0, 0
                    OUT       s0, 0
                    JUMP      BEGIN

最初のVHDL文が重要。これがないと肝心の出力ファイルが作成されない。
"ROM_blank.vhd" は入力テンプレート。これはpBlaze IDEのサイトからダウンロードしてソースと同じフォルダに置いておく。
"t5_rom.vhd" は出力ファイル名。verilogは生成できないようだが問題ない。verilogとVHDLの混在プロジェクトになる。
"rom" はエンティティ名。

標準のアセンブラからpBlaze IDEに乗り換えたため、インタフェースが少し変わった。
top.vのROM定義を以下のように修正する。
コード: 
   //ROM 定義
//   t5_rom t5_rom(.clk(clk), .address(address), .instruction(instruction));
   wire jtag_reset;
   rom rom(.clk(clk), .reset(jtag_reset), .address(address), .instruction(instruction));

rom.reset は出力で、CPUに接続するらしい。
これは、JTAGを使って外部からROMに書き込むことができるらしいが、何の説明もないので使い方が分からない。
ここでは信号名だけ定義して何も接続しない。(例によってうるさいワーニングが出るけど。フィルタを使わずにコードの中でワーニングを消せないものだろうか?)

試してみると、、、よしよし。ちゃんと動いてる。でも前回と同じ動きで違いが分からないのでアセンブラに少しひねりを加える。
コード: 

                    VHDL      "ROM_blank.vhd", "t5_rom.vhd", "rom"
switched            DSIN      $00
led                 DSOUT     $00
                    ORG       0
BEGIN: 
                    IN        s0, 0
               ADD        s0, 12
                    OUT       s0, 0
                    JUMP      BEGIN

定数を加えてみた。これで表示が変わるか、、、よしよし。ちゃんと12が加算されている。

ここではたと気付いた。
pBlaze IDEが使うテンプレートファイル、"ROM_blank.vhd" はpBlaze IDE専用と思ってたら、
中を見ると案外単純な仕組みで、実はPicoBlazeについてきたKCPSM3\Assembler\ROM_form.v 
というファイルをそのまま使える! だから直接verilog用のROMを生成できる。
VHDLの宣言を変えてみた。
コード: 
VHDL      "ROM_form.v", "rom.v", "rom"

なんだ。verilogも生成できるよ。

これでアセンブラのデバッグもできるようになった。
ロータリスイッチは次回にしよう。

0 件のコメント:

コメントを投稿