ちょっとリハビリ。
防音コーナーに居てるときに玄関のピンポンが鳴ってもわからないので、お手軽にわかる方法は?ラジオに飛ばせばいいという昔アマチュア無線やってたオッサンの単純な発想。
ということで、先週大須のタケイ無線で、 1,050円で売ってた秋月のキットのハンダ付けと動作確認終了。76MHz で設定。音質もまぁまぁいいと思います。
ケースに入れるというよりかは板に基板ネジ止めして電池ケースは両面ブチルテープかなんかで固定して終りにしたいのですが、手頃なプラ板が無いなぁ。
このサイトは楠 昌浩が興味をもったことに対して広く浅くネタ集めしております。
こんな短かい話しは Twitter で十分やろという話もありますが、 Blog の記事数があまりにも寂しいのでここで。
まぁ、今日も ATMEL も一応確認しましたが3月11日版のベータバージョンのままでんがな、ご紹介ビデオとか更新するのもいいんですけど本番リリースしてくれー。少なくとも私の家の Windows XP SP3 クリーンインストール状態で動かんぞ。
ということで、一旦削除しましたという愚痴。
この週末のお買い物
大須の第2アメ横で電池ボックスと FMワイヤレスマイクキットを購入。ワイヤレスマイクは、防音室にこもっているときに、玄関のピンポンが鳴っても気が付かなかったということがありましたので、音飛ばせるようにしとこうと思って購入 1,050円なのでいいでしょう。
オーディオテクニカのスペアイヤピースはカナル型のイヤホンの交換用ピースですね。あまりカナル型は好きではないのですが、時々使います。普段はBOSE QC3というノイズキャンセルのヘッドホンです。汗かく時期になるとヘッドホンどれ持っていくか悩みます。また、耳が少し悪いのでドンシャリ系ヘッドホンのほうが好みです (^^)
車のシガーソケットに差す、5V変換器です。 1,200mA まで引っぱれるそうです。iPad も少しくらい充電出来たら儲け物と思って購入。それ以外の携帯電話など十分対応可能ですね。
最後は、赤外線コントロールのラジコンヘリです。大須第2アメ横のラジコン屋さんで 3,980円で買いました。まぁ、昔 HoneyBee で懲りてるはずなのに買ってしまいました。まぁ今回はボディが金属製なのでちょっとは長持ちするかもというやつでんな。USB充電も出来るらしい(棒読み)
メルマガや、Twitter などで出てるのは知っていたし、先日大阪へ帰ったときも先輩が電機屋のポイントカードで買ってたのも横で見てたというのもありますが、私は名古屋の三省堂書店のポイントを使うことにして帰ってから買いました。お値段 3,000円ナリ。ただし、単品でマイコンボード買うと1枚 1,980円なので本を買ったほうが安いです。
後はオプションで マルツパーツ館Web Shop で、LEDマトリクスや有機EL・GPSなどのボードが買えます。
ということで、またマイコンボードが増えたというお話でした。
これの正確性は微妙なので規格参照必要
EIAJ-1 | 2.35 × 0.7φ | 3.15V | 2A |
EIAJ-2 | 4.0 × 1.7φ | 6.3V | 2A |
EIAJ-3 | 4.75 × 1.7φ | 10.5V | 2A |
EIAJ-4 | 5.5 × 3.3φ | 13.5V | 2A |
EIAJ-5 | 6.5 × 4.3φ | 18V | 2A |
EIAJ-6 | n.n × n.nφ | 24V | 2A |
普段 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 ;
とりあえずいつ買ったか思い出せないほど昔に買いましたが、
部屋の整理中に発掘されたので、また時間見て遊んでみようと思います。
まぁ、でもとりあえず
stm32Circle.com
にある、プログラムサンプルとかを見てみておもしろそうなのから
動かしてみましょうというレベルですね。
優先度はかなり低い
リアルタイムクロックモジュール RTC-8564 はバッテリーバックアップが可能なので、マイコンボードに電池を接続してバックアップ可能にします。
RTC-8564の電源端子にマイコンからの電源供給がされて動くわけですが、マイコンの電源がOFFになったら電池に切り替えてバックアップします。この方法で一番簡単なのはダイオード一本で片付ける方法です。しかしながらダイオードの電圧降下(0.6~0.7V程度)があるためRTC-8564の電源電圧は5-0.7=4.3Vになります。一方マイコンと接続しているI2Cバスの信号ラインは5Vかかります。
問題は電源電圧より信号ラインの方が電圧が高いということです。RTC-8564のデータシートによりますと入力電圧は GND-0.5V ~ VDD+0.5V までとなっています。このことから普通のダイオードではわずかですが定格を越えます。電圧降下の低いダイオードを使用すればよいのですが買いに行くのも面倒なので、今回は下記のようにトランジスタのスイッチをバックアップ回路として作成しました。
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