IP2Bus_Mst_BE <= (others => '1');
IP2Bus_Mst_Length <= CONV_STD_LOGIC_VECTOR(64, 12); -- 64バイト、32ビット幅、16バースト
IP2Bus_MstWr_src_dsc_n <= '1';
IP2Bus_MstWr_rem <= (others => '0');
if (reset_cam)
if reset_cam='1' then
()内はどちらの回路がドライブするかを示す。
1.IP2Bus_Mst_Typeを1(バースト転送)、IP2Bus_MstRd_Reqを1(Read)、IP2Bus_Mst_Addrに有効なアドレスを出力、IP2Bus_Mst_Lengthに転送長(バイト単位)を出力、IP2Bus_MstRd_Reqを1にする。IP2Bus_Mst_BEのバイト・イネーブルは何でも良い。(ユーザー回路)
2.Bus2IP_Mst_CmdAckが1になると、IPICコマンド転送終了。(IPIC) ユーザー回路はコマンド信号をディアサートする。(ユーザー回路)
3.最初の有効なReadデータの最初でBus2IP_MstRd_sof_nが0にアサートされている。その時、Bus2IP_MstRd_REMはオール0の様だ。多分4バイト境界のアドレスからReadしていると思われる。
同時にBus2IP_MstRd_dにReadデータが出力され、Bus2IP_MstRd_src_dsc_nが0になり、Readデータが有効なことを示す。(IPIC)
4.ユーザー回路で、IP2Bus_MstRd_dst_rdy_nが0にすでにアサートされているので、Bus2IP_MstRd_src_dsc_nが0になった最初のクロックで、Bus2IP_MstRd_dのReadデータがユーザー回路に読み込まれる。
5.次のクロックから、次のReadデータがBus2IP_MstRd_dに出力される。Bus2IP_MstRd_src_dsc_nが0でかつIP2Bus_MstRd_dst_rdy_nが0の時に、ユーザー回路に読み込まれる。どちらか1つでも1だと、Bus2IP_MstRd_dに出力されたReadデータは次のクロックまで保持される。
6.この場合は、IP2Bus_Mst_Lengthが020だったので、32バイトの転送だった、バス幅が32ビットなので、1回の転送に4バイト送れるので、転送長は8バーストになる。最後のReadデータの時に、Bus2IP_MstRd_eof_nが0にアサートされる。同時に、Bus2IP_MstRd_REMにも有効な値が出力される。(IPIC)
7.最後のReadデータ転送の次のクロックで、Bus2IP_Mst_Cmpltが1にアサートされて転送終了が宣言される。(IPIC)
()内はどちらの回路がドライブするかを示す。
1.IP2Bus_Mst_Typeを1(バースト転送)、IP2Bus_MstWr_Reqを1(Write)、IP2Bus_Mst_Addrに有効なアドレスを出力、IP2Bus_Mst_BEにバイト・イネーブルを出力して、IP2Bus_MstRd_Reqを1にする。(ユーザー回路)
2.1.と同時に(でなくても良いと思うが)IP2Bus_MstWr_dにWriteデータを出力し、IP2Bus_MstWr_REMはマスク(1でマスク、0で有効なデータ)を出力する。IP2Bus_MstWr_sof_n、IP2Bus_MstWr_src_rdy_nを0にアサートする。(ユーザー回路)
3.IPICがBus2IP_MstWr_dst_rdy_nを0にアサートするまで、最初のWriteデータ(IP2Bus_MstWr_d)と、IP2Bus_MstWr_sof_nのアサートを継続する。
4.IPICがBus2IP_MstWr_dst_rdy_nを0にアサートしたら、次のWriteデータ(IP2Bus_MstWr_d)を次のクロックで出力する。IP2Bus_MstWr_src_rdy_nとBus2IP_MstWr_dst_rdy_nが同時にアサートされたときにWriteデータ転送が有効になる。同時にアサートされない場合は、次のクロックも同じWriteデータを出力する。(ユーザー回路)
5.コマンド転送終了時に、IPICがBus2IP_Mst_CmdAckが1にアサートするので、そうしたらユーザー回路はコマンド信号をディアサートする。
5.最後のWriteデータ転送、この場合は8バースト目でIP2Bus_MstWr_eof_nをユーザー回路が0にアサートする。これのWriteデータ転送が有効になったら、バーストWrite転送は終了となる。
6.バーストWrite転送が終了した次のクロックで、IPICによってBus2IP_Mst_Cmpltが1にアサートされて、バーストWrite転送が完了する。
()内はどちらの回路がドライブするかを示す。
1.IP2Bus_Mst_Typeを0(シングル転送)、IP2Bus_MstRd_Reqを1(Read)、IP2Bus_Mst_Addrに有効なアドレスを出力、IP2Bus_Mst_BEにバイト・イネーブルを出力して、IP2Bus_MstRd_Reqを1にする。(ユーザー回路)
2.Bus2IP_Mst_CmdAckが1になると、IPICコマンド転送終了。(IPIC) ユーザー回路はコマンド信号をディアサートする。(ユーザー回路)
3.予め、IP2Bus_MstRd_dst_rdy_nを0(active low) にして、ユーザー回路がデータを受け入れ可能なことを宣言しておく。(ユーザー回路)
4.シングル転送なので、Bus2IP_MstRd_sof_nとBus2IP_MstRd_eof_nが同時に0になる。同時にBus2IP_MstRd_dにReadデータが出力され、Bus2IP_MstRd_src_dsc_nが0になり、Readデータが有効なことを示す。(IPIC)
5.IP2Bus_MstRd_dst_rdy_nを0にすでにアサートされていて、IPICはBus2IP_MstRd_src_dsc_nを0にアサートするときに、IPICはBus2IP_Mst_Cmpltを1にアサートして転送終了を宣言する。(IPIC)
()内はどちらの回路がドライブするかを示す。
1.IP2Bus_Mst_Typeを0(シングル転送)、IP2Bus_MstWr_Reqを1(Write)、IP2Bus_Mst_Addrに有効なアドレスを出力、IP2Bus_Mst_BEにバイト・イネーブルを出力して、IP2Bus_MstRd_Reqを1にする。(ユーザー回路)
2.1.と同時に(でなくても良いと思うが)IP2Bus_MstWr_dにWriteデータを出力し、IP2Bus_MstWr_REMはマスクのようなので、IP2Bus_Mst_BEを反転して出力すれば良いと思う。IP2Bus_MstWr_sof_n、IP2Bus_MstWr_eof_n、IP2Bus_MstWr_src_rdy_nを0にアサートする。(ユーザー回路)
3.IPICがBus2IP_MstWr_dst_rdy_nを0にアサートして、Writeデータを受け取ったことを示す。(IPIC)
4.IPICが、次のクロックでBus2IP_Mst_CmdAck、Bus2IP_Mst_Cmpltを1にアサートして、データ転送の終了をユーザー回路に通知する。(IPIC) ユーザー回路はすべての信号をディアサートする。(ユーザー回路)
Release 13.2 Map O.61xd (nt)
Xilinx Mapping Report File for Design 'system_top'
Design Information
------------------
Command Line : map -intstyle ise -p xc3s700a-fg484-4 -cm area -ir off -pr off
-c 100 -o system_top_map.ncd system_top.ngd system_top.pcf
Target Device : xc3s700a
Target Package : fg484
Target Speed : -4
Mapper Version : spartan3a -- $Revision: 1.55 $
Mapped Date : FRI 19 AUG 13:0:46 2011
Design Summary
--------------
Number of errors: 0
Number of warnings: 260
Logic Utilization:
Number of Slice Flip Flops: 4,223 out of 11,776 35%
Number of 4 input LUTs: 5,107 out of 11,776 43%
Logic Distribution:
Number of occupied Slices: 4,155 out of 5,888 70%
Number of Slices containing only related logic: 4,155 out of 4,155 100%
Number of Slices containing unrelated logic: 0 out of 4,155 0%
*See NOTES below for an explanation of the effects of unrelated logic.
Total Number of 4 input LUTs: 5,251 out of 11,776 44%
Number used as logic: 4,453
Number used as a route-thru: 144
Number used as 16x1 RAMs: 4
Number used for Dual Port RAMs: 474
(Two LUTs used per Dual Port RAM)
Number used as Shift registers: 176
The Slice Logic Distribution report is not meaningful if the design is
over-mapped for a non-slice resource or if Placement fails.
Number of bonded IOBs: 90 out of 372 24%
IOB Flip Flops: 34
IOB Master Pads: 3
IOB Slave Pads: 3
Number of ODDR2s used: 24
Number of DDR_ALIGNMENT = NONE 24
Number of DDR_ALIGNMENT = C0 0
Number of DDR_ALIGNMENT = C1 0
Number of BUFGMUXs: 6 out of 24 25%
Number of DCMs: 2 out of 8 25%
Number of BSCANs: 1 out of 1 100%
Number of BSCAN_SPARTAN3As: 1 out of 1 100%
Number of MULT18X18SIOs: 3 out of 20 15%
Number of RAMB16BWEs: 17 out of 20 85%
Number of RPM macros: 1
Average Fanout of Non-Clock Nets: 3.35
Peak Memory Usage: 223 MB
Total REAL time to MAP completion: 22 secs
Total CPU time to MAP completion: 17 secs
Release 13.2 Map O.61xd (nt)
Xilinx Mapping Report File for Design 'system_top'
Design Information
------------------
Command Line : map -intstyle ise -p xc3s700a-fg484-4 -cm area -ir off -pr off
-c 100 -o system_top_map.ncd system_top.ngd system_top.pcf
Target Device : xc3s700a
Target Package : fg484
Target Speed : -4
Mapper Version : spartan3a -- $Revision: 1.55 $
Mapped Date : FRI 19 AUG 22:55:42 2011
Design Summary
--------------
Number of errors: 0
Number of warnings: 205
Logic Utilization:
Number of Slice Flip Flops: 3,555 out of 11,776 30%
Number of 4 input LUTs: 4,493 out of 11,776 38%
Logic Distribution:
Number of occupied Slices: 3,621 out of 5,888 61%
Number of Slices containing only related logic: 3,621 out of 3,621 100%
Number of Slices containing unrelated logic: 0 out of 3,621 0%
*See NOTES below for an explanation of the effects of unrelated logic.
Total Number of 4 input LUTs: 4,614 out of 11,776 39%
Number used as logic: 3,697
Number used as a route-thru: 121
Number used for Dual Port RAMs: 620
(Two LUTs used per Dual Port RAM)
Number used as Shift registers: 176
The Slice Logic Distribution report is not meaningful if the design is
over-mapped for a non-slice resource or if Placement fails.
Number of bonded IOBs: 73 out of 372 19%
IOB Flip Flops: 23
IOB Master Pads: 3
IOB Slave Pads: 3
Number of ODDR2s used: 24
Number of DDR_ALIGNMENT = NONE 24
Number of DDR_ALIGNMENT = C0 0
Number of DDR_ALIGNMENT = C1 0
Number of BUFGMUXs: 6 out of 24 25%
Number of DCMs: 2 out of 8 25%
Number of BSCANs: 1 out of 1 100%
Number of BSCAN_SPARTAN3As: 1 out of 1 100%
Number of MULT18X18SIOs: 3 out of 20 15%
Number of RAMB16BWEs: 14 out of 20 70%
Number of RPM macros: 1
Average Fanout of Non-Clock Nets: 3.40
Peak Memory Usage: 217 MB
Total REAL time to MAP completion: 18 secs
Total CPU time to MAP completion: 15 secs
`timescale 100ps / 1ps
////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 05:32:57 08/16/2011
// Design Name: system_top
// Module Name: H:/HDL/FndtnISEWork/Spartan6/SP605_AXI_CharDispCtrler5/system_top_tb.v
// Project Name: SP605_AXI_CharDispCtrler5
// Target Device:
// Tool versions:
// Description:
//
// Verilog Test Fixture created by ISE for module: system_top
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
////////////////////////////////////////////////////////////////////////////////
module system_top_tb;
// Inputs
reg SysACE_MPIRQ;
reg SysACE_CLK;
reg RS232_Uart_1_sin;
reg RESET;
reg [0:3] Push_Buttons_4Bits_TRI_I;
reg Ethernet_Lite_TX_CLK;
reg Ethernet_Lite_RX_ER;
reg Ethernet_Lite_RX_DV;
reg Ethernet_Lite_RX_CLK;
reg [3:0] Ethernet_Lite_RXD;
reg Ethernet_Lite_CRS;
reg Ethernet_Lite_COL;
reg [0:3] DIP_Switches_4Bits_TRI_I;
reg CLK_P;
reg CLK_N;
// Outputs
wire mcbx_dram_we_n;
wire mcbx_dram_udm;
wire mcbx_dram_ras_n;
wire mcbx_dram_odt;
wire mcbx_dram_ldm;
wire mcbx_dram_ddr3_rst;
wire mcbx_dram_clk_n;
wire mcbx_dram_clk;
wire mcbx_dram_cke;
wire mcbx_dram_cas_n;
wire [2:0] mcbx_dram_ba;
wire [12:0] mcbx_dram_addr;
wire SysACE_WEN;
wire SysACE_OEN;
wire [6:0] SysACE_MPA;
wire SysACE_CEN;
wire RS232_Uart_1_sout;
wire [0:3] LEDs_4Bits_TRI_O;
wire Ethernet_Lite_TX_EN;
wire [3:0] Ethernet_Lite_TXD;
wire Ethernet_Lite_PHY_RST_N;
wire Ethernet_Lite_MDC;
wire dvi_reset_b;
wire dvi_sda;
wire dvi_v;
wire [11:0] dvi_d;
wire dvi_xclk_n;
wire dvi_de;
wire dvi_xclk_p;
wire dvi_h;
wire dvi_scl;
// Bidirs
wire zio;
wire rzq;
wire mcbx_dram_udqs_n;
wire mcbx_dram_udqs;
wire mcbx_dram_dqs_n;
wire mcbx_dram_dqs;
wire [15:0] mcbx_dram_dq;
wire [7:0] SysACE_MPD;
wire SPI_FLASH_SS;
wire SPI_FLASH_SCLK;
wire SPI_FLASH_MOSI;
wire SPI_FLASH_MISO;
wire IIC_EEPROM_SDA;
wire IIC_EEPROM_SCL;
wire Ethernet_Lite_MDIO;
// Instantiate the Unit Under Test (UUT)
system_top uut (
.zio(zio),
.rzq(rzq),
.mcbx_dram_we_n(mcbx_dram_we_n),
.mcbx_dram_udqs_n(mcbx_dram_udqs_n),
.mcbx_dram_udqs(mcbx_dram_udqs),
.mcbx_dram_udm(mcbx_dram_udm),
.mcbx_dram_ras_n(mcbx_dram_ras_n),
.mcbx_dram_odt(mcbx_dram_odt),
.mcbx_dram_ldm(mcbx_dram_ldm),
.mcbx_dram_dqs_n(mcbx_dram_dqs_n),
.mcbx_dram_dqs(mcbx_dram_dqs),
.mcbx_dram_dq(mcbx_dram_dq),
.mcbx_dram_ddr3_rst(mcbx_dram_ddr3_rst),
.mcbx_dram_clk_n(mcbx_dram_clk_n),
.mcbx_dram_clk(mcbx_dram_clk),
.mcbx_dram_cke(mcbx_dram_cke),
.mcbx_dram_cas_n(mcbx_dram_cas_n),
.mcbx_dram_ba(mcbx_dram_ba),
.mcbx_dram_addr(mcbx_dram_addr),
.SysACE_WEN(SysACE_WEN),
.SysACE_OEN(SysACE_OEN),
.SysACE_MPIRQ(SysACE_MPIRQ),
.SysACE_MPD(SysACE_MPD),
.SysACE_MPA(SysACE_MPA),
.SysACE_CLK(SysACE_CLK),
.SysACE_CEN(SysACE_CEN),
.SPI_FLASH_SS(SPI_FLASH_SS),
.SPI_FLASH_SCLK(SPI_FLASH_SCLK),
.SPI_FLASH_MOSI(SPI_FLASH_MOSI),
.SPI_FLASH_MISO(SPI_FLASH_MISO),
.RS232_Uart_1_sout(RS232_Uart_1_sout),
.RS232_Uart_1_sin(RS232_Uart_1_sin),
.RESET(RESET),
.Push_Buttons_4Bits_TRI_I(Push_Buttons_4Bits_TRI_I),
.LEDs_4Bits_TRI_O(LEDs_4Bits_TRI_O),
.IIC_EEPROM_SDA(IIC_EEPROM_SDA),
.IIC_EEPROM_SCL(IIC_EEPROM_SCL),
.Ethernet_Lite_TX_EN(Ethernet_Lite_TX_EN),
.Ethernet_Lite_TX_CLK(Ethernet_Lite_TX_CLK),
.Ethernet_Lite_TXD(Ethernet_Lite_TXD),
.Ethernet_Lite_RX_ER(Ethernet_Lite_RX_ER),
.Ethernet_Lite_RX_DV(Ethernet_Lite_RX_DV),
.Ethernet_Lite_RX_CLK(Ethernet_Lite_RX_CLK),
.Ethernet_Lite_RXD(Ethernet_Lite_RXD),
.Ethernet_Lite_PHY_RST_N(Ethernet_Lite_PHY_RST_N),
.Ethernet_Lite_MDIO(Ethernet_Lite_MDIO),
.Ethernet_Lite_MDC(Ethernet_Lite_MDC),
.Ethernet_Lite_CRS(Ethernet_Lite_CRS),
.Ethernet_Lite_COL(Ethernet_Lite_COL),
.DIP_Switches_4Bits_TRI_I(DIP_Switches_4Bits_TRI_I),
.CLK_P(CLK_P),
.CLK_N(CLK_N),
.dvi_reset_b(dvi_reset_b),
.dvi_sda(dvi_sda),
.dvi_v(dvi_v),
.dvi_d(dvi_d),
.dvi_xclk_n(dvi_xclk_n),
.dvi_de(dvi_de),
.dvi_xclk_p(dvi_xclk_p),
.dvi_h(dvi_h),
.dvi_scl(dvi_scl)
);
parameter PERIOD = 50; // 200MHz clock
parameter real DUTY_CYCLE = 0.5;
parameter OFFSET = 0;
initial // Clock process for clk
begin
CLK_P = 1'b0;
CLK_N = 1'b1;
#OFFSET;
forever begin
CLK_P = 1'b0;
CLK_N = 1'b1;
#(PERIOD-(PERIOD*DUTY_CYCLE)) CLK_P = 1'b1; CLK_N = 1'b0;
#(PERIOD*DUTY_CYCLE);
end
end
initial begin
// Initialize Inputs
SysACE_MPIRQ = 0;
SysACE_CLK = 0;
RS232_Uart_1_sin = 0;
RESET = 1'b1;
Push_Buttons_4Bits_TRI_I = 0;
Ethernet_Lite_TX_CLK = 0;
Ethernet_Lite_RX_ER = 0;
Ethernet_Lite_RX_DV = 0;
Ethernet_Lite_RX_CLK = 0;
Ethernet_Lite_RXD = 0;
Ethernet_Lite_CRS = 0;
Ethernet_Lite_COL = 0;
DIP_Switches_4Bits_TRI_I = 0;
// Wait 100 ns for global reset to finish
#1000;
// Add stimulus here
#500;
RESET = 1'b0;
end
endmodule
/* * axi_timer_test.c * * Created on: 2011/08/12 * Author: Masaaki */
#include "xbasic_types.h"
#include "xio.h"
#include "mb_interface.h"
#include "xparameters.h"
#define AXI_TIMER_0_TCSR0 XPAR_AXI_TIMER_0_BASEADDR // Control/Status Register 0
#define AXI_TIMER_0_TLR0 XPAR_AXI_TIMER_0_BASEADDR+0x4 // Load Register 0
#define AXI_TIMER_0_TCR0 XPAR_AXI_TIMER_0_BASEADDR+0x8 // Timer/Counter Register 0
#define AXI_TIMER_0_TCSR1 XPAR_AXI_TIMER_0_BASEADDR+0x10 // Control/Status Register 1
#define AXI_TIMER_0_TLR1 XPAR_AXI_TIMER_0_BASEADDR+0x14 // Load Register 1
#define AXI_TIMER_0_TCR1 XPAR_AXI_TIMER_0_BASEADDR+0x18 // Timer/Counter Register 1
#define ENABLE_ALL_TIMERS (0x1<<10)
#define ENABLE_PULSE_WIDTH_MODULATION (0x1<<9)
#define TIMER_INTERRUPT (0x1<<8)
#define ENABLE_TIMER (0x1<<7)
#define ENABLE_INTERRUPT (0x1<<6)
#define LOAD_TIMER (0x1<<5)
#define AUTO_RELOAD_HOLD_TIMER (0x1<<4)
#define ENABLE_EXT_CAPTURE_TRIG (0x1<<3)
#define ENABLE_EXT_GENERATE_SIG (0x1<<2)
#define DOWN_UP_COUNT_TIMER (0x1<<1)
#define TIMER_MODE_CAP_GENE (0x1)
int interrupt = 0;
void axi_timer_init(){
*(volatile *)(AXI_TIMER_0_TLR0) = 0x004C4B40; // 0.1秒
// *(volatile *)(AXI_TIMER_0_TLR0) = 0x00989680; // 0.2秒
*(volatile *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; // TLR0へロード
*(volatile *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | AUTO_RELOAD_HOLD_TIMER | DOWN_UP_COUNT_TIMER; // GenerateモードでDWONカウント、割り込みあり、オートロードあり
}
void timer_int_handler(void * arg) {
interrupt = 1;
}
void write_data(unsigned int address, unsigned int data)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
}
int read_data(unsigned int address)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
return(*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4));
}
int main()
{
unsigned int addr;
unsigned int color, char_code, data;
unsigned int temp;
axi_timer_init(); // axi_timerの初期化
// 割り込みハンドラ登録、割り込み許可
microblaze_register_handler(timer_int_handler, (void *) 0);
microblaze_enable_interrupts();
for(addr=0, color=1, char_code=0x21; addr < 100*75; addr++, color++, char_code++){
data = (color & 0x7)<<7 | char_code;
write_data(addr, data);
if (char_code == 0x7e) // キャラクタの~
char_code = 0x20; // キャラクタの!
if ((color & 0x7) == 7)
color = 0;
// axi_timter割り込み待ち
interrupt = 0;
while(interrupt==0);
*(volatile *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | ENABLE_INTERRUPT | AUTO_RELOAD_HOLD_TIMER | DOWN_UP_COUNT_TIMER | TIMER_INTERRUPT;
}
return 0;
}
/* * axi_timer_test.c * * Created on: 2011/08/12 * Author: Masaaki */
#include "xbasic_types.h"
#include "xio.h"
#include "mb_interface.h"
#include "xparameters.h"
#define AXI_TIMER_0_TCSR0 XPAR_AXI_TIMER_0_BASEADDR // Control/Status Register 0
#define AXI_TIMER_0_TLR0 XPAR_AXI_TIMER_0_BASEADDR+0x4 // Load Register 0
#define AXI_TIMER_0_TCR0 XPAR_AXI_TIMER_0_BASEADDR+0x8 // Timer/Counter Register 0
#define AXI_TIMER_0_TCSR1 XPAR_AXI_TIMER_0_BASEADDR+0x10 // Control/Status Register 1
#define AXI_TIMER_0_TLR1 XPAR_AXI_TIMER_0_BASEADDR+0x14 // Load Register 1
#define AXI_TIMER_0_TCR1 XPAR_AXI_TIMER_0_BASEADDR+0x18 // Timer/Counter Register 1
int interrupt = 0;
void axi_timer_init(){
*(volatile *)(AXI_TIMER_0_TLR0) = 0x00989680; // 0.2秒
*(volatile *)(AXI_TIMER_0_TCSR0) = 0x00000420; // TLR0へロード
*(volatile *)(AXI_TIMER_0_TCSR0) = 0x000004D2; // GenerateモードでDWONカウント、割り込みあり、オートロードあり
}
void timer_int_handler(void * arg) {
interrupt = 1;
}
void write_data(unsigned int address, unsigned int data)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
}
int read_data(unsigned int address)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
return(*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4));
}
int main()
{
unsigned int addr;
unsigned int color, char_code, data;
axi_timer_init(); // axi_timerの初期化
// 割り込みハンドラ登録、割り込み許可
microblaze_register_handler(timer_int_handler, (void *) 0);
microblaze_enable_interrupts();
for(addr=0, color=1, char_code=0x21; addr < 100*75; addr++, color++, char_code++){
data = (color & 0x7)<<7 | char_code;
write_data(addr, data);
if (char_code == 0x7e) // キャラクタの~
char_code = 0x20; // キャラクタの!
if ((color & 0x7) == 7)
color = 0;
// axi_timter割り込み待ち
interrupt = 0;
while(interrupt==0);
}
return 0;
}
/* * axi_timer_test.c * * Created on: 2011/08/12 * Author: Masaaki */
#include "xbasic_types.h"
#include "xio.h"
#include "mb_interface.h"
#include "xparameters.h"
#define AXI_TIMER_0_TCSR0 XPAR_AXI_TIMER_0_BASEADDR // Control/Status Register 0
#define AXI_TIMER_0_TLR0 XPAR_AXI_TIMER_0_BASEADDR+0x4 // Load Register 0
#define AXI_TIMER_0_TCR0 XPAR_AXI_TIMER_0_BASEADDR+0x8 // Timer/Counter Register 0
#define AXI_TIMER_0_TCSR1 XPAR_AXI_TIMER_0_BASEADDR+0x10 // Control/Status Register 1
#define AXI_TIMER_0_TLR1 XPAR_AXI_TIMER_0_BASEADDR+0x14 // Load Register 1
#define AXI_TIMER_0_TCR1 XPAR_AXI_TIMER_0_BASEADDR+0x18 // Timer/Counter Register 1
#define ENABLE_ALL_TIMERS (0x1<<10)
#define ENABLE_PULSE_WIDTH_MODULATION (0x1<<9)
#define TIMER_INTERRUPT (0x1<<8)
#define ENABLE_TIMER (0x1<<7)
#define ENABLE_INTERRUPT (0x1<<6)
#define LOAD_TIMER (0x1<<5)
#define AUTO_RELOAD_HOLD_TIMER (0x1<<4)
#define ENABLE_EXT_CAPTURE_TRIG (0x1<<3)
#define ENABLE_EXT_GENERATE_SIG (0x1<<2)
#define DOWN_UP_COUNT_TIMER (0x1<<1)
#define TIMER_MODE_CAP_GENE (0x1)
int interrupt = 0;
void axi_timer_init(){
*(volatile *)(AXI_TIMER_0_TLR0) = 0x004C4B40; // 0.1秒
// *(volatile *)(AXI_TIMER_0_TLR0) = 0x00989680; // 0.2秒
*(volatile *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | LOAD_TIMER; // TLR0へロード
*(volatile *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | AUTO_RELOAD_HOLD_TIMER | DOWN_UP_COUNT_TIMER; // GenerateモードでDWONカウント、割り込みあり、オートロードあり
}
void timer_int_handler(void * arg) {
interrupt = 1;
}
void write_data(unsigned int address, unsigned int data)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
}
int read_data(unsigned int address)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
return(*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4));
}
int main()
{
unsigned int addr;
unsigned int color, char_code, data;
unsigned int temp;
axi_timer_init(); // axi_timerの初期化
// 割り込みハンドラ登録、割り込み許可
microblaze_register_handler(timer_int_handler, (void *) 0);
microblaze_enable_interrupts();
for(addr=0, color=1, char_code=0x21; addr < 100*75; addr++, color++, char_code++){
data = (color & 0x7)<<7 | char_code;
write_data(addr, data);
if (char_code == 0x7e) // キャラクタの~
char_code = 0x20; // キャラクタの!
if ((color & 0x7) == 7)
color = 0;
// axi_timter割り込み待ち
// interrupt = 0;
// while(interrupt==0);
do{
temp = *(volatile *)(AXI_TIMER_0_TCSR0);
}while((temp & TIMER_INTERRUPT)==0);
*(volatile *)(AXI_TIMER_0_TCSR0) = ENABLE_ALL_TIMERS | ENABLE_TIMER | AUTO_RELOAD_HOLD_TIMER | DOWN_UP_COUNT_TIMER | TIMER_INTERRUPT;
}
return 0;
}
// Monitor
// 2011/08/11
#include "xparameters.h"
void write_data(unsigned int address, unsigned int data)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
}
int read_data(unsigned int address)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
return(*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4));
}
int main()
{
unsigned int addr;
unsigned int color, char_code, data;
for(addr=0, color=1, char_code=0x21; addr < 100*75; addr++, color++, char_code++){
data = (color & 0x7)<<7 | char_code;
write_data(addr, data);
if (char_code == 0x7e) // キャラクタの~
char_code = 0x21; // キャラクタの!
if ((color & 0x7) == 7)
color = 0;
}
return 0;
}
reg we_clkin;
wire we_ena_clkin;
reg we_ena_clkin_1d, we_ena_clkin_2d;
reg we_in_clk_1d, we_in_clk_2d;
parameter IDLE_WE = 3'b001,
WE_ENA_PXCLK = 3'b010,
WE_WAIT = 3'b100;
reg [2:0] cs_we;
reg we;
// clkin でのwe を保持して、ハンドシェークする
always @(posedge clkin) begin
if (rst)
we_clkin <= 1'b0;
else begin
if (processor_we)
we_clkin <= 1'b1;
else if (we_ena_clkin_2d)
we_clkin <= 1'b0;
end
end
// we_node をclkで同期化する
always @(posedge clk) begin
if (rst) begin
we_in_clk_1d <= 1'b0;
we_in_clk_2d <= 1'b0;
end else begin
we_in_clk_1d <= we_clkin;
we_in_clk_2d <= we_in_clk_1d;
end
end
// we を出力するステートマシン
always @(posedge clk) begin
if (rst) begin
cs_we <= IDLE_WE;
we <= 1'b0;
end else begin
case (cs_we)
IDLE_WE : begin
if (we_in_clk_2d) begin
cs_we <= WE_ENA_PXCLK;
we <= 1'b1;
end
end
WE_ENA_PXCLK : begin
cs_we <= WE_WAIT;
we <= 1'b0;
end
WE_WAIT : begin
we <= 1'b0;
if (~we_in_clk_2d)
cs_we <= IDLE_WE;
end
endcase
end
end
assign we_ena_clkin = (cs_we == WE_WAIT) ? 1'b1 : 1'b0;
// we_ena_clkin をclkinで同期化
always @(posedge clkin) begin
if (rst) begin
we_ena_clkin_1d <= 1'b0;
we_ena_clkin_2d <= 1'b0;
end else begin
we_ena_clkin_1d <= we_ena_clkin;
we_ena_clkin_2d <= we_ena_clkin_1d;
end
end
dcm_inst dcm_inst_i (
.clkin(clkin),
.reset(rst),
.clkout(clk),
.clk90(clk90),
.locked(locked)
);
assign reset = !locked;
assign clkb = !clk;
assign clk90b = !clk90;
// assign dvi_reset_b = locked;
assign dvi_reset_b = 1'b1;
CharDispCtrler CharDispCtrler_inst (
.clk(clk),
.reset(reset),
.processor_addr(processor_addr),
.processor_din(processor_din),
.processor_dout(processor_dout),
.processor_we(we),
// Monitor
// 2011/08/07
#include "xparameters.h"
void write_data(unsigned int address, unsigned int data)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
}
int read_data(unsigned int address)
{
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR) = address;
return(*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4));
}
int main()
{
unsigned int addr;
for(addr=0; addr < 100*75; addr++){
write_data(addr, 0x3C1);
}
return 0;
}
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
*(volatile *)(XPAR_CHARDISPC_0_BASEADDR+4) = data;
// 表示タイミングの定義
// 800x600 60Hz, Pixel clock=40MHz
parameter H_ACTIVE_VIDEO= 800;
parameter H_FRONT_PORCH = 40;
parameter H_SYNC_PULSE = 128;
parameter H_BACK_PORCH = 88;
parameter H_SUM = H_ACTIVE_VIDEO + H_FRONT_PORCH + H_SYNC_PULSE + H_BACK_PORCH;
parameter V_ACTIVE_VIDEO = 600;
parameter V_FRONT_PORCH = 1;
parameter V_SYNC_PULSE = 4;
parameter V_BACK_PORCH = 23;
parameter V_SUM = V_ACTIVE_VIDEO + V_FRONT_PORCH + V_SYNC_PULSE + V_BACK_PORCH;
parameter H_DISPLAY_SIZE = H_ACTIVE_VIDEO/8; // 横100桁
parameter V_DISPLAY_SIZE = V_ACTIVE_VIDEO/8; // 縦75行
parameter RED_DOT_POS = 9; // 9ビット目がRED
parameter GREEN_DOT_POS = 8; // 8ビット目がGREEN
parameter BLUE_DOT_POS = 7; // 7ビット目がBLUE
mwr 0x74200004 0x3C1
mwr 0x74200000 0x64
mwr 0x74200004 0x3C2
mwr 0x74200000 0x0
mwr 0x74200004 0x3C1
mwr 0x74200000 0x4
mwr 0x74200004 0x3C2
XMD% mrd 0x74200000
74200000: 00000004
XMD% mrd 0x74200004
74200004: 000003C2
XMD% mwr 0x74200000 0x0
XMD% mrd 0x74200004
74200004: 000003C1
0x74200000 :レジスタ1、キャラクタ・ディスプレイ・コントローラのアドレスを示す。Readの場合はレジスタ1の内容がそのまま出力される。
0x74200004 :レジスタ2、キャラクタ・ディスプレイ・コントローラのデータを示す。このレジスタにWriteすると、キャラクタ・ディスプレイ・コントローラのフレーム・バッファのレジスタ1で示された番地にデータがWriteされる。Readの場合は、フレーム・バッファのレジスタ1で示された番地の内容をReadする。
PORT dvi_xclk_p = "", DIR = O
PORT dvi_xclk_n = "", DIR = O
PORT dvi_de = "", DIR = O
PORT dvi_h = "", DIR = O
PORT dvi_v = "", DIR = O
PORT dvi_d = "", DIR = O, VEC = [11:0]
PORT dvi_reset_b = "", DIR = O
PORT dvi_sda = "", DIR = O
PORT dvi_scl = "", DIR = O
・MHSファイルで、DVI関連のピン名を変更することもできるようだ。Projectタブを選択して、Project Files のMHS File: system.mhs をダブルクリックする。PORTの最後の方にchardispc_0 関連の信号ピンが見える。
・名前の前のchardispc_0_ と名前の後ろの_pin を削除した。FileメニューからSaveを選択して、セーブする。
・Reload Projectダイアログが出る。Reloadボタンをクリックする。
・プロジェクトがリロードされて、External Portsの名前が変更された。
NET "dvi_d[0]" IOSTANDARD = LVCMOS25;
NET "dvi_d[0]" DRIVE = 12;
NET "dvi_d[0]" LOC = K16;
NET "dvi_d[1]" IOSTANDARD = LVCMOS25;
NET "dvi_d[1]" DRIVE = 12;
NET "dvi_d[1]" LOC = U19;
NET "dvi_d[2]" IOSTANDARD = LVCMOS25;
NET "dvi_d[2]" DRIVE = 12;
NET "dvi_d[2]" LOC = T20;
NET "dvi_d[3]" IOSTANDARD = LVCMOS25;
NET "dvi_d[3]" DRIVE = 12;
NET "dvi_d[3]" LOC = N16;
NET "dvi_d[4]" IOSTANDARD = LVCMOS25;
NET "dvi_d[4]" DRIVE = 12;
NET "dvi_d[4]" LOC = P16;
NET "dvi_d[5]" IOSTANDARD = LVCMOS25;
NET "dvi_d[5]" DRIVE = 12;
NET "dvi_d[5]" LOC = M17;
NET "dvi_d[6]" IOSTANDARD = LVCMOS25;
NET "dvi_d[6]" DRIVE = 12;
NET "dvi_d[6]" LOC = M18;
NET "dvi_d[7]" IOSTANDARD = LVCMOS25;
NET "dvi_d[7]" DRIVE = 12;
NET "dvi_d[7]" LOC = R15;
NET "dvi_d[8]" IOSTANDARD = LVCMOS25;
NET "dvi_d[8]" DRIVE = 12;
NET "dvi_d[8]" LOC = R16;
NET "dvi_d[9]" IOSTANDARD = LVCMOS25;
NET "dvi_d[9]" DRIVE = 12;
NET "dvi_d[9]" LOC = P17;
NET "dvi_d[10]" IOSTANDARD = LVCMOS25;
NET "dvi_d[10]" DRIVE = 12;
NET "dvi_d[10]" LOC = P18;
NET "dvi_d[11]" IOSTANDARD = LVCMOS25;
NET "dvi_d[11]" DRIVE = 12;
NET "dvi_d[11]" LOC = R17;
NET "dvi_de" IOSTANDARD = LVCMOS25;
NET "dvi_de" DRIVE = 12;
NET "dvi_de" LOC = J17;
NET "dvi_h" IOSTANDARD = LVCMOS25;
NET "dvi_h" DRIVE = 12;
NET "dvi_h" LOC = J16;
NET "dvi_reset_b" IOSTANDARD = LVCMOS25;
NET "dvi_reset_b" DRIVE = 12;
NET "dvi_reset_b" LOC = L15;
NET "dvi_v" IOSTANDARD = LVCMOS25;
NET "dvi_v" DRIVE = 12;
NET "dvi_v" LOC = B22;
NET "dvi_xclk_n" SLEW = FAST;
NET "dvi_xclk_n" IOSTANDARD = LVCMOS25;
NET "dvi_xclk_n" DRIVE = 12;
NET "dvi_xclk_n" LOC = C22;
NET "dvi_xclk_p" SLEW = FAST;
NET "dvi_xclk_p" IOSTANDARD = LVCMOS25;
NET "dvi_xclk_p" DRIVE = 12;
NET "dvi_xclk_p" LOC = C20;
NET "dvi_sda" IOSTANDARD = LVCMOS25;
NET "dvi_sda" DRIVE = 12;
NET "dvi_sda" LOC = AA4;
NET "dvi_scl" IOSTANDARD = LVCMOS25;
NET "dvi_scl" DRIVE = 12;
NET "dvi_scl" LOC = W13;
Release 13.2 Map O.61xd (nt)
Xilinx Mapping Report File for Design 'system_top'
Design Information
------------------
Command Line : map -intstyle ise -p xc6slx45t-fgg484-3 -w -logic_opt off -ol high -t 1 -xt 0 -register_duplication off
-r 4 -global_opt off -mt off -ir off -pr off -lc off -power off -o system_top_map.ncd system_top.ngd system_top.pcf
Target Device : xc6slx45t
Target Package : fgg484
Target Speed : -3
Mapper Version : spartan6 -- $Revision: 1.55 $
Mapped Date : TUE 2 AUG 20:52:36 2011
Design Summary
--------------
Number of errors: 0
Number of warnings: 29
Slice Logic Utilization:
Number of Slice Registers: 4,348 out of 54,576 7%
Number used as Flip Flops: 4,340
Number used as Latches: 0
Number used as Latch-thrus: 0
Number used as AND/OR logics: 8
Number of Slice LUTs: 5,190 out of 27,288 19%
Number used as logic: 4,792 out of 27,288 17%
Number using O6 output only: 3,660
Number using O5 output only: 119
Number using O5 and O6: 1,013
Number used as ROM: 0
Number used as Memory: 252 out of 6,408 3%
Number used as Dual Port RAM: 96
Number using O6 output only: 4
Number using O5 output only: 1
Number using O5 and O6: 91
Number used as Single Port RAM: 4
Number using O6 output only: 4
Number using O5 output only: 0
Number using O5 and O6: 0
Number used as Shift Register: 152
Number using O6 output only: 48
Number using O5 output only: 1
Number using O5 and O6: 103
Number used exclusively as route-thrus: 146
Number with same-slice register load: 124
Number with same-slice carry load: 20
Number with other load: 2
Slice Logic Distribution:
Number of occupied Slices: 2,103 out of 6,822 30%
Number of LUT Flip Flop pairs used: 6,156
Number with an unused Flip Flop: 2,169 out of 6,156 35%
Number with an unused LUT: 966 out of 6,156 15%
Number of fully used LUT-FF pairs: 3,021 out of 6,156 49%
Number of unique control sets: 357
Number of slice register sites lost
to control set restrictions: 1,374 out of 54,576 2%
A LUT Flip Flop pair for this architecture represents one LUT paired with
one Flip Flop within a slice. A control set is a unique combination of
clock, reset, set, and enable signals for a registered element.
The Slice Logic Distribution report is not meaningful if the design is
over-mapped for a non-slice resource or if Placement fails.
IO Utilization:
Number of bonded IOBs: 127 out of 296 42%
Number of LOCed IOBs: 127 out of 127 100%
IOB Flip Flops: 64
Specific Feature Utilization:
Number of RAMB16BWERs: 34 out of 116 29%
Number of RAMB8BWERs: 1 out of 232 1%
Number of BUFIO2/BUFIO2_2CLKs: 1 out of 32 3%
Number used as BUFIO2s: 1
Number used as BUFIO2_2CLKs: 0
Number of BUFIO2FB/BUFIO2FB_2CLKs: 0 out of 32 0%
Number of BUFG/BUFGMUXs: 8 out of 16 50%
Number used as BUFGs: 8
Number used as BUFGMUX: 0
Number of DCM/DCM_CLKGENs: 2 out of 8 25%
Number used as DCMs: 2
Number used as DCM_CLKGENs: 0
Number of ILOGIC2/ISERDES2s: 16 out of 376 4%
Number used as ILOGIC2s: 16
Number used as ISERDES2s: 0
Number of IODELAY2/IODRP2/IODRP2_MCBs: 32 out of 376 8%
Number used as IODELAY2s: 8
Number used as IODRP2s: 2
Number used as IODRP2_MCBs: 22
Number of OLOGIC2/OSERDES2s: 86 out of 376 22%
Number used as OLOGIC2s: 40
Number used as OSERDES2s: 46
Number of BSCANs: 1 out of 4 25%
Number of BUFHs: 0 out of 256 0%
Number of BUFPLLs: 0 out of 8 0%
Number of BUFPLL_MCBs: 1 out of 4 25%
Number of DSP48A1s: 3 out of 58 5%
Number of GTPA1_DUALs: 0 out of 2 0%
Number of ICAPs: 0 out of 1 0%
Number of MCBs: 1 out of 2 50%
Number of PCIE_A1s: 0 out of 1 0%
Number of PCILOGICSEs: 0 out of 2 0%
Number of PLL_ADVs: 1 out of 4 25%
Number of PMVs: 0 out of 1 0%
Number of STARTUPs: 0 out of 1 0%
Number of SUSPEND_SYNCs: 0 out of 1 0%
PARAMETER C_NUM_REG = 1, DT = INTEGER
##############################################################################
## Filename: H:/HDL/FndtnISEWork/Spartan6/SP605_AXI_CharDispCtrler/system/pcores/chardispc_v1_00_a/data/chardispc_v2_1_0.pao
## Description: Peripheral Analysis Order
## Date: Sat Jul 30 05:47:37 2011 (by Create and Import Peripheral Wizard)
##############################################################################
lib proc_common_v3_00_a all
lib axi_lite_ipif_v1_01_a all
lib chardispc_v1_00_a user_logic vhdl
lib chardispc_v1_00_a chardispc vhdl
lib chardispc_v1_00_a char_gen_rom.v verilog
lib chardispc_v1_00_a CharDispCtrler.v verilog
lib chardispc_v1_00_a CharDispCtrler_SP605.v verilog
lib chardispc_v1_00_a dcm_inst.vhd vhdl
lib chardispc_v1_00_a disp_timing.v verilog
lib chardispc_v1_00_a frame_buffer.v verilog
lib chardispc_v1_00_a freqdiv.vhd vhdl
lib chardispc_v1_00_a One_Transaction_SCCB.vhd vhdl
lib chardispc_v1_00_a SCCB_Reg_Controller.vhd vhdl
lib chardispc_v1_00_a SCCB_reg_values_ROM.vhd vhdl
PORT S_AXI_ACLK = clk_50_0000MHzPLL0
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | 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 | - | - | - |