PicoBlaze で LEDピコピコです。
PicoBlaze については、 http://www.xilinx.com/picoblaze に関連する情報と
PicoBlaze のアセンブラなどのダウンロードがあります。
- ロイヤリティフリーで使用可
- 8ビットマイコン
- 全ての命令は2クロックで実行される
- 16個のレジスタ / SCRACH PAD RAM(64Byte) / ROM(1K x 18bit)
マイコンは、アセンブラのソース(.psm)を KCPSM3.EXE でアセンブルします。
エラーが無ければHDLのソース VHDL と Verilog のソースが出力されるので
これをトップモジュールに組み込めば動くという寸法です。
xilinx からダウンロード出来る KCPSM3.ZIP の中には資料含めて一式入ってるので
大丈夫でしょう。また ug129 のユーザーガイドには日本語版PDF(日付古いですが…)
があるので、これもダウンロードしておけばいいと思います。
アセンブラのソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | 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 |