PicoBlaze で LEDピコピコ

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:
;       &lt;<コード>>
        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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です