先週の土曜日に酔った勢いでポチした品物が、1週間経過した本日手元にやってきました。実際には月曜発送されて水曜に関西空港に着。そこから一般の宅配便で配達され、かつ不在だったので1週間かかったわけです。
今日は二日酔いで気分悪いのでこれはイジリません (^^;
このサイトは楠 昌浩が興味をもったことに対して広く浅くネタ集めしております。
スタートメニューから Xilinx ISE Design Suite 13.1 → アクセサリ → アップデートのチェック
を実行いたしますと、更新対象のプロダクトが表示されます。私の場合はJapanese Documentaion for 13.1 PlanAhead と 13.1 April 2011 Update is now avaliable の2つが表示されてました。で、まず 13.1 のアップデートをダウンロードします。
何故かWebブラウザが起動されてログインしないことにはダウンロード出来ません。仕方ないのでログインします。そうしたら Xilinx_ISE_DS_Update_13.1_O.40e.2.1.tar のダウンロードが始まりました。
ダウンロードするときのダイアログボックスに Launch when done のチェックボックスがあるのでチェックしときましょう。そうすればダウンロードした .tar の展開まではやってくれます。
あとは。 xsetup.exe を流せばOK
どうでもいいけど、ダウンロードの度にログインする仕組みはやめてくれ
普段 DWMとか読まないんで、CPLDやFPGAの事情はさっぱりわかりません。昔のページに XILINX XC9500シリーズの
CPLD使った記事も書きましたが2002年6月のことで、当然ここのサイトには掲載してません。
今更という感じはあるのですが、久しぶりにやってみたくなったので入門キットを買ってボチボチ遊びたいと思います。
FPGAの「Hello, World」は、はやり LEDピコピコですが、今回は飛ばして VGA 出力の練習です。
Verilog HDL入門本見ながら書いてみました。以下ソースとUCFです。
Webpack 10.1で作成してとりあえず成功っと
モニタはPCデポ店頭に積んであったセリング KW-M80C というとこのSVGAモニタでアナログRGBとコンポッジト入力だけの
シンプル構成です。1万4千円くらいだったと思います。まぁちょっと使う程度なら使えるモニタです。
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 12:46:33 06/22/2008 // Design Name: // Module Name: vga // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// // // -- 水平タイミング -- // 表示期間: 640ドット // フロントポーチ: 16ドット // 水平同期: 96ドット(656) // バックポーチ: 48ドット(752) // // -- 垂直タイミング -- // 表示期間: 480ライン // フロントポーチ: 10ライン // 垂直同期: 2ライン(490) // バックポーチ: 29ライン(492) module vga(CLK_50MHZ, VGA_R, VGA_G, VGA_B, VGA_HSYNC, VGA_VSYNC); input CLK_50MHZ; output [3:0] VGA_R; output [3:0] VGA_G; output [3:0] VGA_B; output VGA_HSYNC; output VGA_VSYNC; reg [3:0] VGA_R; reg [3:0] VGA_G; reg [3:0] VGA_B; reg VGA_HSYNC; reg VGA_VSYNC; wire clk_25mhz; reg clk_25mhz_a; assign clk_25mhz = clk_25mhz_a; reg [9:0] hcount; reg [9:0] vcount; /* 25MHz のクロック作成 */ always @(posedge CLK_50MHZ) begin clk_25mhz_a <= ‾clk_25mhz_a; end /* 25Mhz のクロックで画面描画 */ always @(posedge clk_25mhz) begin // 水平タイミング hcount <= hcount + 1; // 水平カウント 800 で一周 if(hcount > 10'd799) begin hcount <= 0; vcount <= vcount + 1; end // 水平同期出力 if(hcount == 10'd655) begin VGA_HSYNC <= 0; VGA_R <= 4'b0000; VGA_G <= 4'b0000; VGA_B <= 4'b0000; end // 水平同期出力終了 if(hcount == 10'd751) begin VGA_HSYNC <= 1; end // 垂直タイミング // 521 ラインで一周 if(vcount > 10'd520) begin vcount <= 0; end // 垂直同期開始 if(vcount == 10'd489) begin VGA_VSYNC <= 0; end // 垂直同期終了 if(vcount == 10'd491) begin VGA_VSYNC <= 1; end // カラーバーもどき → メモリインタフェースにする if(hcount == 10'd0) begin VGA_R <= 4'b1111; VGA_G <= 4'b1111; VGA_B <= 4'b1111; end if(hcount == 10'd79) begin VGA_R <= 4'b0000; VGA_G <= 4'b1111; VGA_B <= 4'b1111; end if(hcount == 10'd159) begin VGA_R <= 4'b1111; VGA_G <= 4'b0000; VGA_B <= 4'b1111; end if(hcount == 10'd239) begin VGA_R <= 4'b1111; VGA_G <= 4'b1111; VGA_B <= 4'b0000; end if(hcount == 10'd319) begin VGA_R <= 4'b1111; VGA_G <= 4'b0000; VGA_B <= 4'b0000; end if(hcount == 10'd399) begin VGA_R <= 4'b0000; VGA_G <= 4'b1111; VGA_B <= 4'b0000; end if(hcount == 10'd479) begin VGA_R <= 4'b0000; VGA_G <= 4'b0000; VGA_B <= 4'b1111; end if(hcount == 10'd559) begin VGA_R <= 4'b0000; VGA_G <= 4'b0000; VGA_B <= 4'b0000; end end endmodule <pre><code> NET "VGA_R<3>" LOC = "C8" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_R<2>" LOC = "B8" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_R<1>" LOC = "B3" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_R<0>" LOC = "A3" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_G<3>" LOC = "D6" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_G<2>" LOC = "C6" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_G<1>" LOC = "D5" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_G<0>" LOC = "C5" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_B<3>" LOC = "C9" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_B<2>" LOC = "B9" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_B<1>" LOC = "D7" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_B<0>" LOC = "C7" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_HSYNC" LOC = "C11" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "VGA_VSYNC" LOC = "B11" | IOSTANDARD = LVTTL | DRIVE = 8 | SLEW = FAST ; NET "CLK_50MHZ" LOC = "E12"| IOSTANDARD = LVCMOS33 ; # NET "CLK_AUX" LOC = "V12"| IOSTANDARD = LVCMOS33 ; # NET "CLK_SMA" LOC = "U12"| IOSTANDARD = LVCMOS33 ;
Spartan-3A スターターキットの PDF の資料やアプリケーションノートなど見てますが
基本クロックは、50MHzの水晶が原発ですが、それ以外の
クロックが欲しいときは、DCM(Digital Clock Manager)を使用するようです。
ということで、DCM を使用する準備として veritak で確認してみました。
CORE Generator を起動して DCM のコアを作成してみました。
今回は、 FPGA Features and Design -> Clocking -> Spartan-3E, Spartan-3A -> Single DCM_SP
とファンクションを選択して、DCM作成です。
今回は、CLK0以外に、90度づつ位相ずれた CLK90, CLK180, CLK270 なども
出力するようにしてみました。
また、PDF 文書にあった推奨リセット回路(シフトレジスタでワンショットパルスを出す)も追加しました。
生成された DCM モジュール
//////////////////////////////////////////////////////////////////////////////// // Copyright (c) 1995-2008 Xilinx, Inc. All rights reserved. //////////////////////////////////////////////////////////////////////////////// // ____ ____ // / /\/ / // /___/ \ / Vendor: Xilinx // \ \ \/ Version : 10.1.03 // \ \ Application : xaw2verilog // / / Filename : dcm_test01.v // /___/ /\ Timestamp : 04/21/2009 13:34:03 // \ \ / \ // \___\/\___\ // //Command: xaw2verilog -st C:\mkusunoki\\dcm_test01.xaw C:\mkusunoki\\dcm_test01 //Design Name: dcm_test01 //Device: xc3s700a-4fg484 // // Module dcm_test01 // Generated by Xilinx Architecture Wizard // Written for synthesis tool: XST `timescale 1ns / 1ps module dcm_test01(CLKFB_IN, CLKIN_IN, RST_IN, CLKIN_IBUFG_OUT, CLK0_OUT, CLK90_OUT, CLK180_OUT, CLK270_OUT, LOCKED_OUT); input CLKFB_IN; input CLKIN_IN; input RST_IN; output CLKIN_IBUFG_OUT; output CLK0_OUT; output CLK90_OUT; output CLK180_OUT; output CLK270_OUT; output LOCKED_OUT; wire CLKFB_IBUFG; wire CLKIN_IBUFG; wire CLK0_BUF; wire CLK90_BUF; wire CLK180_BUF; wire CLK270_BUF; wire GND_BIT; assign GND_BIT = 0; assign CLKIN_IBUFG_OUT = CLKIN_IBUFG; IBUFG CLKFB_IBUFG_INST (.I(CLKFB_IN), .O(CLKFB_IBUFG)); IBUFG CLKIN_IBUFG_INST (.I(CLKIN_IN), .O(CLKIN_IBUFG)); BUFG CLK0_BUFG_INST (.I(CLK0_BUF), .O(CLK0_OUT)); BUFG CLK90_BUFG_INST (.I(CLK90_BUF), .O(CLK90_OUT)); BUFG CLK180_BUFG_INST (.I(CLK180_BUF), .O(CLK180_OUT)); BUFG CLK270_BUFG_INST (.I(CLK270_BUF), .O(CLK270_OUT)); DCM_SP DCM_SP_INST (.CLKFB(CLKFB_IBUFG), .CLKIN(CLKIN_IBUFG), .DSSEN(GND_BIT), .PSCLK(GND_BIT), .PSEN(GND_BIT), .PSINCDEC(GND_BIT), .RST(RST_IN), .CLKDV(), .CLKFX(), .CLKFX180(), .CLK0(CLK0_BUF), .CLK2X(), .CLK2X180(), .CLK90(CLK90_BUF), .CLK180(CLK180_BUF), .CLK270(CLK270_BUF), .LOCKED(LOCKED_OUT), .PSDONE(), .STATUS()); defparam DCM_SP_INST.CLK_FEEDBACK = "1X"; defparam DCM_SP_INST.CLKDV_DIVIDE = 2.0; defparam DCM_SP_INST.CLKFX_DIVIDE = 1; defparam DCM_SP_INST.CLKFX_MULTIPLY = 4; defparam DCM_SP_INST.CLKIN_DIVIDE_BY_2 = "FALSE"; defparam DCM_SP_INST.CLKIN_PERIOD = 20.000; defparam DCM_SP_INST.CLKOUT_PHASE_SHIFT = "NONE"; defparam DCM_SP_INST.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS"; defparam DCM_SP_INST.DFS_FREQUENCY_MODE = "LOW"; defparam DCM_SP_INST.DLL_FREQUENCY_MODE = "LOW"; defparam DCM_SP_INST.DUTY_CYCLE_CORRECTION = "TRUE"; defparam DCM_SP_INST.FACTORY_JF = 16'hC080; defparam DCM_SP_INST.PHASE_SHIFT = 0; defparam DCM_SP_INST.STARTUP_WAIT = "FALSE"; endmodule
作成してみたテストベンチ
`default_nettype none `timescale 1ns / 1ns module dcm_test01_testbench; reg CLK50MHz; reg RST_IN; wire CLKIN_IBUFG_OUT; wire CLK0_OUT; wire CLK90_OUT; wire CLK180_OUT; wire CLK270_OUT; wire LOCKED_OUT; dcm_test01 dcm01 ( .CLKFB_IN(CLK0_OUT), .CLKIN_IN(CLK50MHz), .RST_IN(Q), .CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT), .CLK0_OUT(CLK0_OUT), .CLK90_OUT(CLK90_OUT), .CLK180_OUT(CLK180_OUT), .CLK270_OUT(CLK270_OUT), .LOCKED_OUT(LOCKED_OUT) ); wire Q; //defparam U1.INIT = 16'h000F; SRL16 #(16'h000F) U1 ( .Q(Q), .A0(1), .A1(1), .A2(1), .A3(1), .CLK(CLK50MHz), .D(0) ); // クロック initial begin CLK50MHz = 0; forever #10 CLK50MHz = ~CLK50MHz; end initial begin #1600 $finish; end always $monitor($time, "clkin=%b reset=%b clk0=%b clk90=%b clk180=%b clk270=%b locked=%b\n", CLK50MHz, RST_IN,CLK0_OUT,CLK90_OUT,CLK180_OUT,CLK270_OUT,LOCKED_OUT); endmodule
で、veritakでシミューレーションしてみましたところ、各種クロックと、リセットに反応すること、と
クロックのロック状態も表示されたので実際にインプリする場合もちょっと安心ということで
にしても、ついでで DDR2 SDRAM も MIG で作成してみて veritak してみましたところ
これも動きそうな感じではあります。が、UG086 に書いてる使いかたが
まだよく理解出来ないのと、DDR/DDR2 な SDRAM の基本もわかってないので
これから余裕が出来れば、使ってみたいですね。
とりあえず、picoblaze を先に使用したいです。
今回は、Spartan-3A の PicoBlaze でキャラクタ液晶の表示を行ないました。
と言っても今回は、fpga ポートの入出力動作がうまくいかなかったので
BUSYチェックはしないで、時間待ちして表示させてます。
何のヒネリも無いので、そのままソース掲載でし。マイコンのアセンブラとVerilogです。
PicoBlaze のソース
CONSTANT LCD_DATA, 01 ; CONSTANT LCD_CTRL_E, 02 ; CONSTANT LCD_CTRL_RS, 03 ; 0=Command, 1=Data CONSTANT LCD_CTRL_RW, 04 ; 0=write, 1=read CONSTANT LED, 05 ; LED port ADDRESS 000 INIT00: ENABLE INTERRUPT CALL LCD_INIT MAIN00: LOAD s4, 50 ; P CALL LCD_PUTCH LOAD s4, 69 ; i CALL LCD_PUTCH LOAD s4, 63 ; c CALL LCD_PUTCH LOAD s4, 6F ; o CALL LCD_PUTCH LOAD s4, 42 ; B CALL LCD_PUTCH LOAD s4, 6C ; l CALL LCD_PUTCH LOAD s4, 61 ; a CALL LCD_PUTCH LOAD s4, 7A ; z CALL LCD_PUTCH LOAD s4, 65 ; e CALL LCD_PUTCH LOAD s4, 21 ; ! CALL LCD_PUTCH LOAD s4, 00 MAIN90: CALL DELAY20ms CALL DELAY20ms CALL DELAY20ms CALL DELAY20ms CALL DELAY20ms CALL DELAY20ms CALL DELAY20ms CALL DELAY20ms CALL DELAY20ms CALL DELAY20ms OUTPUT s4, LED ; LED チカチカ ADD s4, 01 JUMP MAIN90 LCD_INIT: CALL DELAY20ms CALL DELAY20ms LOAD s4, 30 CALL LCD_PUTCMD CALL DELAY20ms LOAD s4, 30 CALL LCD_PUTCMD CALL DELAY1ms LOAD s4, 30 CALL LCD_PUTCMD CALL DELAY1ms LOAD s4, 38 CALL LCD_PUTCMD CALL DELAY100us LOAD s4, 0F CALL LCD_PUTCMD CALL DELAY100us LOAD s4, 06 CALL LCD_PUTCMD CALL DELAY100us LOAD s4, 01 CALL LCD_PUTCMD CALL DELAY100us RETURN LCD_PUTCH: CALL LCD_RS_1 CALL LCD_RW_0 OUTPUT s4, LCD_DATA CALL LCD_E RETURN LCD_PUTCMD: CALL LCD_RS_0 CALL LCD_RW_0 OUTPUT s4, LCD_DATA CALL LCD_E RETURN LCD_RS_0: LOAD s0, 00 JUMP LCD_RS LCD_RS_1: LOAD s0, 01 LCD_RS: OUTPUT s0, LCD_CTRL_RS RETURN LCD_RW_0: LOAD s0, 00 JUMP LCD_RW LCD_RW_1: LOAD s0, 01 LCD_RW: OUTPUT s0, LCD_CTRL_RW RETURN LCD_E: LOAD s0, 01 OUTPUT s0, LCD_CTRL_E CALL DELAY1us LOAD s0, 00 OUTPUT s0, LCD_CTRL_E CALL DELAY1ms RETURN ; ------------------------------------------------------------------------------ ; -- 時間待ち ; -- 50Mhz = 20ns ; -- 1命令 2クロック = 40ns ; -- s0,s1,s2,s3 ; -- ; ------------------------------------------------------------------------------ DELAY1us: LOAD s0, 16 DELAY1us00: SUB s0, 01 JUMP NZ, DELAY1us00 RETURN DELAY100us: LOAD s1, 64 DELAY100us00: CALL DELAY1us SUB s1, 01 JUMP NZ, DELAY100us00 RETURN DELAY1ms: LOAD s2, 0A DELAY1ms00: CALL DELAY100us SUB s2, 01 JUMP NZ, DELAY1ms00 RETURN DELAY20ms: LOAD s3, 14 DELAY20ms00: CALL DELAY1ms SUB s3, 01 JUMP NZ, DELAY20ms00 RETURN ; ------------------------------------------------------------------------------ ; -- 割り込みルーチン ; -- ; ------------------------------------------------------------------------------ INTERRUPT: ; <<コード>> RETURNI ENABLE ; ------------------------------------------------------------------------------ ; -- 割り込みベクタ ; -- ; ------------------------------------------------------------------------------ ADDRESS 3FF JUMP INTERRUPT
verilog のソース
`timescale 1ns / 1ps ////////////////////////////////////////////////////////////////////////////////// // Company: // Engineer: // // Create Date: 10:28:22 04/24/2009 // Design Name: // Module Name: picolcd // Project Name: // Target Devices: // Tool versions: // Description: // // Dependencies: // // Revision: // Revision 0.01 - File Created // Additional Comments: // ////////////////////////////////////////////////////////////////////////////////// `default_nettype none module picolcd ( input wire CLK_50MHZ, output wire LCD_E, output wire LCD_RS, output wire LCD_RW, output wire [7:0] LCD_DB, output wire [7:0] LED ); wire RESET; // DCMのLOCKED_OUTをロジカルなリセットにするのがいい wire DCM01_CLKIN_IBUF_OUT; wire DCM01_CLK0_OUT; wire DCM01_LOCKED_OUT; wire [9:0] CPU00_ADDRESS; wire [17:0] CPU00_INSTRUCTION; wire [7:0] CPU00_PORT_ID; wire [7:0] CPU00_IN_PORT; wire [7:0] CPU00_OUT_PORT; wire CPU00_READ_STROBE; wire CPU00_WRITE_STROBE; wire CPU00_INTERRUPT; wire CPU00_INTERRUPT_ACK; generate_reset_pulse generate_reset_pulse ( .clock(DCM01_CLKIN_IBUF_OUT), .reset_pulse(RESET) ); dcm01 DCM01 ( .CLKIN_IN(CLK_50MHZ), .RST_IN(RESET), .CLKIN_IBUFG_OUT(DCM01_CLKIN_IBUF_OUT), .CLK0_OUT(DCM01_CLK0_OUT), .LOCKED_OUT(DCM01_LOCKED_OUT) ); kcpsm3 CPU00 ( .address(CPU00_ADDRESS), .instruction(CPU00_INSTRUCTION), .port_id(CPU00_PORT_ID), .write_strobe(CPU00_WRITE_STROBE), .out_port(CPU00_OUT_PORT), .read_strobe(CPU00_READ_STROBE), .in_port(CPU00_IN_PORT), .interrupt(CPU00_INTERRUPT), .interrupt_ack(CPU00_INTERRUPT_ACK), .reset(RESET), .clk(DCM01_CLK0_OUT) ); lcd CPU00ROM ( .address(CPU00_ADDRESS), .instruction(CPU00_INSTRUCTION), .clk(DCM01_CLK0_OUT) ); lcdport_out lcd_port_out ( .we(CPU00_WRITE_STROBE), .port(CPU00_PORT_ID), .data(CPU00_OUT_PORT), .lcd_data(LCD_DB), .lcd_e(LCD_E), .lcd_rs(LCD_RS), .lcd_rw(LCD_RW), .led(LED) ); endmodule //////////////////////////////////////////////////////////////////////////////// // Generate 1shot pulse //////////////////////////////////////////////////////////////////////////////// module generate_reset_pulse ( input wire clock, output wire reset_pulse ); SRL16 #(.INIT(16'h00FF)) SRL16_inst ( .Q(reset_pulse), .A0(1'b1), .A1(1'b1), .A2(1'b1), .A3(1'b1), .CLK(clock), .D(1'b0) ); endmodule //////////////////////////////////////////////////////////////////////////////// // CPU00(PicoBlaze) ADDRESS DECODER //////////////////////////////////////////////////////////////////////////////// module lcdport_out ( input wire we, input wire [7:0] port, input wire [7:0] data, output reg [7:0] lcd_data, output reg lcd_e, output reg lcd_rs, output reg lcd_rw, output reg [7:0] led ); always @(posedge we) begin case(port) 8'h01: lcd_data = data; 8'h02: lcd_e = data[0]; 8'h03: lcd_rs = data[0]; 8'h04: lcd_rw = data[0]; 8'h05: led = data; endcase end endmodule
PicoBlaze で LEDピコピコです。
PicoBlaze については、 http://www.xilinx.com/picoblaze に関連する情報と
PicoBlaze のアセンブラなどのダウンロードがあります。
マイコンは、アセンブラのソース(.psm)を KCPSM3.EXE でアセンブルします。
エラーが無ければHDLのソース VHDL と Verilog のソースが出力されるので
これをトップモジュールに組み込めば動くという寸法です。
xilinx からダウンロード出来る KCPSM3.ZIP の中には資料含めて一式入ってるので
大丈夫でしょう。また ug129 のユーザーガイドには日本語版PDF(日付古いですが…)
があるので、これもダウンロードしておけばいいと思います。
アセンブラのソース
ADDRESS 000 INIT00: ENABLE INTERRUPT MAIN00: LOAD s5, 00 MAIN90: OUTPUT s5, 01 ; ポート1に出力する ADD s5, 01 CALL DELAY1s JUMP MAIN90 ; ------------------------------------------------------------------------------ ; -- 時間待ち ; -- 50Mhz = 20ns ; -- 1命令 2クロック = 40ns ; -- s0,s1,s2,s3 ; ------------------------------------------------------------------------------ DELAY1us: LOAD s0, 17 DELAY1us00: SUB s0, 01 JUMP NZ, DELAY1us00 RETURN DELAY100us: LOAD s1, 64 DELAY100us00: CALL DELAY1us SUB s1, 01 JUMP NZ, DELAY100us00 RETURN DELAY1ms: LOAD s2, 0A DELAY1ms00: CALL DELAY100us SUB s2, 01 JUMP NZ, DELAY1ms00 RETURN DELAY20ms: LOAD s3, 14 DELAY20ms00: CALL DELAY1ms SUB s3, 01 JUMP NZ, DELAY20ms00 RETURN DELAY1s: LOAD s4, 32 DELAY1s00: CALL DELAY20ms SUB s4, 01 JUMP NZ, DELAY1s00 RETURN ; ------------------------------------------------------------------------------ ; -- 割り込みルーチン ; -- ; ------------------------------------------------------------------------------ INTERRUPT: ; <<コード>> RETURNI ENABLE ; ------------------------------------------------------------------------------ ; -- 割り込みベクタ ; -- ; ------------------------------------------------------------------------------ ADDRESS 3FF JUMP INTERRUPT </コード></code></pre> <p> Verilog のソース </p> <pre><code> module main ( input wire CLK_50MHZ, output wire [7:0] LED ); wire RESET; wire CLKIN_IBUFG_OUT; wire CLK0_OUT; wire LOCKED_OUT; wire [9:0] address ; wire [17:0] instruction ; wire [7:0] port_id ; wire write_strobe, read_strobe, interrupt_ack ; wire [7:0] out_port ; wire [7:0] in_port ; wire interrupt, reset, clk ; user_reset reset00 ( .CLOCK(), .RESET() ); dcmsp00 dcmsp00 ( .CLKIN_IN(CLK_50MHZ), .RST_IN(RESET), .CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT), .CLK0_OUT(CLK0_OUT), .LOCKED_OUT(LOCKED_OUT) ); kcpsm3 CPU00 ( .address(address), .instruction(instruction), .port_id(port_id), .write_strobe(write_strobe), .out_port(out_port), .read_strobe(read_strobe), .in_port(in_port), .interrupt(interrupt), .interrupt_ack(interrupt_ack), .reset(RESET), .clk(CLK0_OUT) ); led CPU00LED ( .address(address), .instruction(instruction), .clk(CLK0_OUT) ); outp_sel outp_sel ( .port_id(port_id), .write_strobe(write_strobe), .indata(out_port), .otdata(LED) ); endmodule // // Generate RESET PULSE // module user_reset ( input wire CLOCK, output wire RESET ); SRL16 #(.INIT(16'h00FF)) // Initial Value of Shift Register SRL16_inst ( .Q(RESET), // SRL data output .A0(1'b1), // Select[0] input .A1(1'b1), // Select[1] input .A2(1'b1), // Select[2] input .A3(1'b1), // Select[3] input .CLK(CLOCK), // Clock input .D(1'b0) // SRL data input ); // End of SRL16_inst instantiation endmodule module outp_sel ( input wire port_id, input wire write_strobe, input wire [7:0] indata, output reg [7:0] otdata ); always @(posedge write_strobe) begin if(port_id == 1) otdata = indata; end endmodule
Xilinx の WebPACK 13.1 を vmware の仮想マシンにインストール。とりあえず C:\Xilinx は10GB くらい使用。しかし仮想マシンのディスク20GBで設定してて残り4GBちょい、アップデートきたら足りん。仮想ディスクの増やし方を調べとこ
あとは Veritak も導入して、今日は終り。以前作成したverilogソースが通るかはまた後で。今日はもう眠い。