- Debugged SPI module

- Debugged UART
- Firmware support for SPI, UART
- Work on SD/MMC support in firmware
- Debugged mblite core/WB interface
This commit is contained in:
2013-06-08 11:53:27 +02:00
parent fd4e8df556
commit 0bc4815926
34 changed files with 2326 additions and 675 deletions

27
.gitignore vendored
View File

@@ -7,6 +7,28 @@
*.prj *.prj
*.srp *.srp
*~ *~
*.bgn
*.bit
*.drc
*.map
*.mrp
*.ncd
*.ngd
*.ngm
*.pcf
*.twr
*.twx
*.xst
*.xwbt
*.pad
*.par
*.ptwx
*.unroutes
*.xpi
2d_display_engine_routed_pad.csv
2d_display_engine_routed_pad.txt
*_usage.xml
*_summary.xml
netlist.lst netlist.lst
toplevel.lso toplevel.lso
planAhead*.jou planAhead*.jou
@@ -17,3 +39,8 @@ planahead/
isim/ isim/
xlnx_auto_0_xdb/ xlnx_auto_0_xdb/
vga?*.bmp vga?*.bmp
*_bd.bmm
planahead_*.tcl
*webtalk.html
fuseRelaunch.cmd
isim.wdb

View File

@@ -37,6 +37,7 @@ src/mblite_rom_data.vhd src/mblite_rom.vhd src/mblite_wrapper.vhd src/pio.vhd \
src/uart/fifo16x8.vhd src/uart/par2ser.vhd src/uart/pulsegen325.vhd src/uart/readctrl.vhd src/uart/ser2par.vhd \ src/uart/fifo16x8.vhd src/uart/par2ser.vhd src/uart/pulsegen325.vhd src/uart/readctrl.vhd src/uart/ser2par.vhd \
src/uart/writectrl.vhd src/uart/uart.vhd src/uart/uart_wbc.vhd \ src/uart/writectrl.vhd src/uart/uart.vhd src/uart/uart_wbc.vhd \
src/ram_16x64.vhd src/wb_mem_bridge.vhd \ src/ram_16x64.vhd src/wb_mem_bridge.vhd \
src/spi.vhd \
src/toplevel.vhd src/toplevel.vhd
MBLITE_INFILES=mblite/config_Pkg.vhd mblite/std_Pkg.vhd mblite/core_Pkg.vhd \ MBLITE_INFILES=mblite/config_Pkg.vhd mblite/std_Pkg.vhd mblite/core_Pkg.vhd \
mblite/dsram.vhd mblite/gprf.vhd mblite/fetch.vhd mblite/decode.vhd mblite/execute.vhd mblite/mem.vhd \ mblite/dsram.vhd mblite/gprf.vhd mblite/fetch.vhd mblite/decode.vhd mblite/execute.vhd mblite/mem.vhd \
@@ -206,6 +207,9 @@ isim/work/intercon_package.vdb isim/work/interconnect.vdb: src/wishbone.vhd
isim/work/vhdl_bl4_dqs_delay.vdb: ddr2_sdram/vhdl_bl4/example_design/rtl/vhdl_bl4_dqs_delay_0.vhd isim/work/vhdl_bl4_dqs_delay.vdb: ddr2_sdram/vhdl_bl4/example_design/rtl/vhdl_bl4_dqs_delay_0.vhd
$(VHPCOMP) $< $(VHPCOMPOPTS) $(VHPCOMP) $< $(VHPCOMPOPTS)
isim/work/mblite_rom_data_pkg_mblite_rom.vdb: src/mblite_rom_data.vhd
$(VHPCOMP) $< $(VHPCOMPOPTS)
isim/work/%.vdb: src/%.vhd isim/work/%.vdb: src/%.vhd
$(VHPCOMP) $< $(VHPCOMPOPTS) $(VHPCOMP) $< $(VHPCOMPOPTS)
@@ -240,13 +244,15 @@ isim/work/toplevel_tb.vdb: isim/work/sim_bmppack.vdb isim/work/toplevel.vdb
isim/work/wb_ddr_ctrl_wb_sc_tb.vdb: isim/work/wb_ddr_ctrl_wb_sc.vdb isim/work/wb_ddr_ctrl_wb_sc_tb.vdb: isim/work/wb_ddr_ctrl_wb_sc.vdb
isim/work/spi_tb.vdb: isim/work/intercon_package.vdb isim/work/spi.vdb
isim/work/wb_mem_bridge_tb.vdb: isim/work/intercon_package.vdb isim/work/wb_ddr_ctrl_wb_sc.vdb isim/work/wb_mem_bridge.vdb isim/work/wb_mem_bridge_tb.vdb: isim/work/intercon_package.vdb isim/work/wb_ddr_ctrl_wb_sc.vdb isim/work/wb_mem_bridge.vdb
isim/work/toplevel.vdb: isim/work/mblite_wrapper.vdb isim/work/intercon_package.vdb isim/work/interconnect.vdb isim/work/clk_reset.vdb isim/work/wb_ddr_ctrl.vdb isim/work/vga.vdb isim/work/wb_ram.vdb isim/work/pio.vdb isim/work/uart_wbc.vdb isim/work/wb_mem_bridge.vdb isim/work/toplevel.vdb: isim/work/mblite_wrapper.vdb isim/work/intercon_package.vdb isim/work/interconnect.vdb isim/work/clk_reset.vdb isim/work/wb_ddr_ctrl.vdb isim/work/vga.vdb isim/work/wb_ram.vdb isim/work/pio.vdb isim/work/uart_wbc.vdb isim/work/wb_mem_bridge.vdb isim/work/spi.vdb
isim/work/mblite_wrapper.vdb: isim/work/intercon_package.vdb isim/work/mblite_rom.vdb isim/mblite/core_wb.vdb isim/work/mblite_wrapper.vdb: isim/work/intercon_package.vdb isim/work/mblite_rom.vdb isim/mblite/core_wb.vdb
isim/work/mblite_rom.vdb: isim/work/intercon_package.vdb isim/work/mblite_rom_data.vdb isim/work/mblite_rom.vdb: isim/work/intercon_package.vdb isim/work/mblite_rom_data_pkg_mblite_rom.vdb
isim/mblite/core_wb.vdb: isim/mblite/config_Pkg.vdb isim/mblite/core_Pkg.vdb isim/mblite/std_Pkg.vdb isim/mblite/core_wb_adapter.vdb isim/mblite/core.vdb isim/mblite/core_wb.vdb: isim/mblite/config_Pkg.vdb isim/mblite/core_Pkg.vdb isim/mblite/std_Pkg.vdb isim/mblite/core_wb_adapter.vdb isim/mblite/core.vdb
@@ -323,3 +329,5 @@ isim/work/uart_wbc.vdb: isim/work/uart.vdb
isim/work/uart.vdb: isim/work/ser2par.vdb isim/work/readctrl.vdb isim/work/fifo16x8.vdb isim/work/pulsegen325.vdb isim/work/par2ser.vdb isim/work/writectrl.vdb isim/work/uart.vdb: isim/work/ser2par.vdb isim/work/readctrl.vdb isim/work/fifo16x8.vdb isim/work/pulsegen325.vdb isim/work/par2ser.vdb isim/work/writectrl.vdb
isim/work/wb_mem_bridge.vdb: isim/work/intercon_package.vdb isim/work/ram_16x64.vdb isim/work/wb_mem_bridge.vdb: isim/work/intercon_package.vdb isim/work/ram_16x64.vdb
isim/work/spi.vdb: isim/work/fifo16x8.vdb

View File

@@ -53,7 +53,7 @@ NET "RS232_RXD" LOC = "E16" | IOSTANDARD = LVCMOS33;
NET "RS232_TXD" LOC = "F15" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW; NET "RS232_TXD" LOC = "F15" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | SLEW = SLOW;
# MicroSD PMOD (in J18) # MicroSD PMOD (in J18)
NET "SD_MISO" LOC = "AA21" | IOSTANDARD = LVCMOS33 | DRIVE = 8; NET "SD_MISO" LOC = "AA21" | IOSTANDARD = LVCMOS33 | DRIVE = 8 | PULLUP;
NET "SD_SCK" LOC = "AB21" | IOSTANDARD = LVCMOS33 | DRIVE = 8; NET "SD_SCK" LOC = "AB21" | IOSTANDARD = LVCMOS33 | DRIVE = 8;
NET "SD_CS" LOC = "AA19" | IOSTANDARD = LVCMOS33 | DRIVE = 8; NET "SD_CS" LOC = "AA19" | IOSTANDARD = LVCMOS33 | DRIVE = 8;
NET "SD_MOSI" LOC = "AB19" | IOSTANDARD = LVCMOS33 | DRIVE = 8; NET "SD_MOSI" LOC = "AB19" | IOSTANDARD = LVCMOS33 | DRIVE = 8;

View File

@@ -372,7 +372,7 @@ NET "ddr_ctrl0/ddr_0/top_0/dqs_int_delay_in*" MAXDELAY = 580 ps;
############################################################################################################## ##############################################################################################################
## Constraint from rst_dqs_div_in PAD to input of LUT delay element. ## Constraint from rst_dqs_div_in PAD to input of LUT delay element.
############################################################################################################## ##############################################################################################################
NET "ddr_ctrl0/ddr_0/top_0/dqs_div_rst" MAXDELAY = 460 ps; NET "ddr_ctrl0/ddr_0/top_0/dqs_div_rst" MAXDELAY = 484 ps; # Original 460 ps, always fails PAR, 484 works too
############################################################################################################## ##############################################################################################################
## Following are the MAXDELAY constraints on delayed rst_dqs_div net and fifo write enable signals. ## Following are the MAXDELAY constraints on delayed rst_dqs_div net and fifo write enable signals.

11
coregen/.gitignore vendored Normal file
View File

@@ -0,0 +1,11 @@
*.asy
*.gise
*.vhd
*.vho
*.xise
*_flist.txt
*.tcl
tmp/
vga_pixeldata_fifo/
wb_ddr_ctrl_wb_from_ddr/
wb_ddr_ctrl_wb_to_ddr/

1
firmware/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
*.elf

View File

@@ -1,7 +1,7 @@
C_SRCS= C_SRCS=main.c sd.c spi.c uart.c util.c
S_SRCS=test.s S_SRCS=
LDOPTS=-T standalone.ld LDOPTS=-T standalone.ld
COPTS=-ffreestanding -nostdlib -nostdinc COPTS=-std=gnu99 -O1 -Wall -Wextra -pedantic -ggdb -ffreestanding -nostdlib -mcpu=v7.10.a
ASOPTS= ASOPTS=
OBJS=$(addprefix objs/,$(C_SRCS:.c=.o)) $(addprefix objs/,$(S_SRCS:.s=.o)) OBJS=$(addprefix objs/,$(C_SRCS:.c=.o)) $(addprefix objs/,$(S_SRCS:.s=.o))
@@ -10,7 +10,7 @@ fw.elf: standalone.ld $(OBJS) objs/kcrt0.o
mb-gcc $(COPTS) $(LDOPTS) -o fw.elf $(OBJS) mb-gcc $(COPTS) $(LDOPTS) -o fw.elf $(OBJS)
objs/%.o: %.c objs/%.o: %.c
mb-gcc $(COPTS) -o $@ $< mb-gcc $(COPTS) -o $@ -c $<
objs/%.o: %.s objs/%.o: %.s
mb-as $(ASOPTS) -o $@ $< mb-as $(ASOPTS) -o $@ $<

View File

@@ -54,4 +54,8 @@ _start_bss_loop:
_start_bss_done: _start_bss_done:
# Jump to firmware start # Jump to firmware start
bri main brlid r15, main
nop
halt:
bri halt

129
firmware/main.c Normal file
View File

@@ -0,0 +1,129 @@
// Copyright (c) 2013 Matthias Blankertz <matthias@blankertz.org>
#include "util.h"
#include "uart.h"
#include "spi.h"
#include "sd.h"
static unsigned int * const pio = (unsigned int *)0x10000;
void main() {
*pio = 0x000000a5u;
/* uart_writes("Hello, World!\n"); */
/* unsigned foo = 0xdeadbeef; */
/* const char *s = utox(foo); */
/* uart_writes("0x"); */
/* uart_writes(s); */
/* uart_writeb('\n'); */
*pio = 0x1u;
unsigned char tmp;
int i;
// Sleep 1 ms
for(int i = 0;i < 16667;++i) {}
// Set SPI clock to ~400kHz
spi_setclk(63u);
*pio = 0x2u;
sd_por();
// Sleep 1 ms
for(int i = 0;i < 16667;++i) {}
*pio = 0x3u;
// Send CMD0
spi_set_ss(true);
tmp = sd_cmd(0, 0);
spi_set_ss(false);
if(tmp&0x80) {
uart_writes("SD timeout (CMD0)\n");
return;
}
*pio = 0x4u;
unsigned rsp;
spi_set_ss(true);
tmp = sd_cmd_r7(8, 0x000001AA, &rsp);
spi_set_ss(false);
if(tmp&0x80) {
uart_writes("SD timeout (CMD8)\n");
return;
}
unsigned char s_tmp = tmp;
*pio = 0x5u;
spi_set_ss(true);
tmp = sd_cmd_r7(58, 0x0, &rsp);
spi_set_ss(false);
if(tmp&0x80) {
uart_writes("SD timeout (CMD58)\n");
return;
}
const char *s = utox(tmp);
uart_writes("0x");
uart_writes(s);
uart_writeb(' ');
s = utox(rsp);
uart_writes("0x");
uart_writes(s);
uart_writeb('\n');
*pio = 0x6u;
if(s_tmp&0x4) { // Illegal command, not SDCv2
tmp = 0xff;
while(tmp&0x1) {
spi_set_ss(true);
tmp = sd_cmd(55, 0);
tmp = sd_cmd(41, 0);
spi_set_ss(false);
if(tmp&0x80) {
uart_writes("SD timeout (ACMD41)\n");
return;
}
uart_writeb('\n');
if(tmp != 0x1)
return;
}
if(tmp&0x4) { // Illegal command, not SDCv1
uart_writes("MMC\n");
} else {
uart_writes("SDCv1\n");
}
} else {
uart_writes("SDCv2\n");
}
*pio = 0x7u;
/* const char *s = utox(tmp); */
/* uart_writes("0x"); */
/* uart_writes(s); */
/* uart_writeb(' '); */
/* s = utox(rsp); */
/* uart_writes("0x"); */
/* uart_writes(s); */
/* uart_writeb('\n'); */
// Echo on uart
char c;
while(1) {
c = uart_readb();
if(c == '\r')
uart_writeb('\n');
uart_writeb(c);
}
}

92
firmware/sd.c Normal file
View File

@@ -0,0 +1,92 @@
// Copyright (c) 2013 Matthias Blankertz <matthias@blankertz.org>
#include <stdbool.h>
#include "spi.h"
#include "sd.h"
#include "util.h"
bool sd_por() {
// Send '1' for 80 cycles
spi_set_ss(true);
for(int i = 0;i < 10;++i)
spi_xmit(0xff);
spi_set_ss(false);
return true;
}
unsigned char sd_cmd(unsigned char cmd, unsigned param) {
spi_xmit(0x40 | cmd);
spi_xmit(param>>24);
spi_xmit(param>>16);
spi_xmit(param>>8);
spi_xmit(param&0xff);
spi_xmit(cmd==0?0x95:(cmd==41?0xe5:0x01));
unsigned char tmp;
int i = 0;
while(((tmp=spi_xmit(0xff))&0x80) && (i++<=8)) {
}
const char *s = utox(tmp);
uart_writes("0x");
uart_writes(s);
uart_writeb(' ');
return tmp;
}
unsigned char sd_acmd(unsigned char cmd, unsigned param) {
spi_xmit(0x77);
/* spi_xmit(0x00); */
/* spi_xmit(0x00); */
/* spi_xmit(0x00); */
/* spi_xmit(0x00); */
/* spi_xmit(0x95); */
spi_xmit(0x40 | cmd);
spi_xmit(param>>24);
spi_xmit(param>>16);
spi_xmit(param>>8);
spi_xmit(param&0xff);
spi_xmit(0x95);
unsigned char tmp;
int i = 0;
while(((tmp=spi_xmit(0xff))&0x80) && (i++<=8)) {
}
const char *s = utox(tmp);
uart_writes("0x");
uart_writes(s);
uart_writeb(' ');
return tmp;
}
unsigned char sd_cmd_r7(unsigned char cmd, unsigned param, unsigned *resp) {
spi_xmit(0x40 | cmd);
spi_xmit(param>>24);
spi_xmit(param>>16);
spi_xmit(param>>8);
spi_xmit(param&0xff);
spi_xmit(0x95);
unsigned char tmp;
int i = 0;
while(((tmp=spi_xmit(0xff))&0x80) && (i++<=8)) {
}
const char *s = utox(tmp);
uart_writes("0x");
uart_writes(s);
uart_writeb(' ');
if(tmp != 0xff) {
*resp = 0;
for(int i = 0;i < 4;++i) {
*resp <<= 8;
*resp |= spi_xmit(0xff);
}
}
return tmp;
}

13
firmware/sd.h Normal file
View File

@@ -0,0 +1,13 @@
// Copyright (c) 2013 Matthias Blankertz <matthias@blankertz.org>
#ifndef _SD_H_
#define _SD_H_
#include <stdbool.h>
bool sd_por();
unsigned char sd_cmd(unsigned char cmd, unsigned param);
unsigned char sd_cmd_r7(unsigned char cmd, unsigned param, unsigned *resp);
#endif

50
firmware/spi.c Normal file
View File

@@ -0,0 +1,50 @@
// Copyright (c) 2013 Matthias Blankertz <matthias@blankertz.org>
#include <stdbool.h>
#include "spi.h"
static volatile unsigned char * const spi_data = (unsigned char *)0x10030;
static volatile unsigned char * const spi_status = (unsigned char *)0x10031;
static volatile unsigned char * const spi_config = (unsigned char *)0x10032;
static volatile unsigned char * const spi_ss = (unsigned char *)0x10033;
static bool _spi_rxempty() {
return ((*spi_status&0x4)==0x4);
}
static bool _spi_txfull() {
return ((*spi_status&0x2)==0x2);
}
static bool _spi_idle() {
return ((*spi_status&0x1)==0x1);
}
void spi_write(unsigned char data) {
while(_spi_txfull()) {}
*spi_data = data;
}
unsigned char spi_read() {
while(_spi_rxempty()) {}
return *spi_data;
}
unsigned char spi_xmit(unsigned char data) {
spi_write(data);
return spi_read();
}
void spi_set_ss(bool active) {
while(!_spi_idle()) {}
if(active)
*spi_ss = 0x0;
else
*spi_ss = 0x1;
}
void spi_setclk(unsigned char div) {
while(!_spi_idle()) {}
*spi_config = div;
}

15
firmware/spi.h Normal file
View File

@@ -0,0 +1,15 @@
// Copyright (c) 2013 Matthias Blankertz <matthias@blankertz.org>
#ifndef _SPI_H_
#define _SPI_H_
#include <stdbool.h>
void spi_write(unsigned char data);
unsigned char spi_read();
unsigned char spi_xmit(unsigned char data);
void spi_set_ss(bool active);
void spi_setclk(unsigned char div);
#endif

View File

@@ -14,7 +14,7 @@ SECTIONS {
} }
/* From here on in RAM */ /* From here on in RAM */
.data 0x1000 : AT ( _datald ) ALIGN(4) { .data 0x8000 : AT ( _datald ) ALIGN(4) {
_data_start = .; _data_start = .;
*(.data) *(.data)
_data_end = .; _data_end = .;
@@ -23,7 +23,8 @@ SECTIONS {
.bss (NOLOAD) : ALIGN(4) { .bss (NOLOAD) : ALIGN(4) {
_bss_start = .; _bss_start = .;
*(.bss) *(.bss)
. = ALIGN(4);
_bss_end = .; _bss_end = .;
} }
_stack = 0x1800; _stack = 0x8800;
} }

48
firmware/uart.c Normal file
View File

@@ -0,0 +1,48 @@
// Copyright (c) 2013 Matthias Blankertz <matthias@blankertz.org>
#include <stdbool.h>
#include "uart.h"
static volatile unsigned char *_uart_sreg = (unsigned char *)0x10021;
static volatile unsigned char *_uart_dreg = (unsigned char *)0x10020;
static bool _uart_writefull() {
return ((*_uart_sreg&0x2)==0x2);
}
static bool _uart_readempty() {
return ((*_uart_sreg&0x4)==0x4);
}
void uart_writeb(unsigned char b) {
while(_uart_writefull()) {}
*_uart_dreg = b;
}
void uart_writes(const char *str) {
while(*str)
uart_writeb(*str++);
}
unsigned char uart_readb() {
while(_uart_readempty()) {}
return *_uart_dreg;
}
// Read from uart until a newline is recvd. The recvd line is written into buf
// as a 0-terminated string. If more than max bytes are read, the bytes already
// read are returned in buf and the function returns false.
bool uart_readline(char *buf, int max) {
int i = 0;
while(i < max-1) {
buf[i] = uart_readb();
if(buf[i] == '\n') {
buf[i] = '\0';
return true;
}
++i;
}
buf[i] = '\0';
return false;
}

13
firmware/uart.h Normal file
View File

@@ -0,0 +1,13 @@
// Copyright (c) 2013 Matthias Blankertz <matthias@blankertz.org>
#ifndef _UART_H_
#define _UART_H_
#include <stdbool.h>
void uart_writeb(unsigned char b);
void uart_writes(const char *str);
unsigned char uart_readb();
bool uart_readline(char *buf, int max);
#endif

17
firmware/util.c Normal file
View File

@@ -0,0 +1,17 @@
// Copyright (c) 2013 Matthias Blankertz <matthias@blankertz.org>
static char _str_buf[9];
const char *utox(unsigned int num) {
int i = 7;
_str_buf[8] = '\0';
while(num || (i == 7)) {
_str_buf[i] = (num&0xf)+'0';
if(_str_buf[i] > '9')
_str_buf[i] += 'A'-'9'-1;
--i;
num>>=4;
}
return _str_buf+(i+1);
}

8
firmware/util.h Normal file
View File

@@ -0,0 +1,8 @@
// Copyright (c) 2013 Matthias Blankertz <matthias@blankertz.org>
#ifndef _UTIL_H_
#define _UTIL_H_
const char *utox(unsigned int num);
#endif

View File

@@ -36,13 +36,13 @@ package config_Pkg is
-- Memory parameters -- Memory parameters
constant CFG_DMEM_SIZE : positive := 28; -- Data memory bus size in 2LOG # elements constant CFG_DMEM_SIZE : positive := 28; -- Data memory bus size in 2LOG # elements
constant CFG_IMEM_SIZE : positive := 12; -- Instruction memory bus size in 2LOG # elements constant CFG_IMEM_SIZE : positive := 14; -- Instruction memory bus size in 2LOG # elements
constant CFG_BYTE_ORDER : boolean := true; -- Switch between MSB (1, default) and LSB (0) byte order policy constant CFG_BYTE_ORDER : boolean := true; -- Switch between MSB (1, default) and LSB (0) byte order policy
-- Register parameters -- Register parameters
constant CFG_REG_FORCE_ZERO : boolean := true; -- Force data to zero if register address is zero [0,1] constant CFG_REG_FORCE_ZERO : boolean := true; -- Force data to zero if register address is zero [0,1]
constant CFG_REG_FWD_WRB : boolean := true; -- Forward writeback to loosen register memory requirements [0,1] constant CFG_REG_FWD_WRB : boolean := true; -- Forward writeback to loosen register memory requirements [0,1]
constant CFG_MEM_FWD_WRB : boolean := false; -- Forward memory result in stead of introducing stalls [0,1] constant CFG_MEM_FWD_WRB : boolean := true; -- Forward memory result in stead of introducing stalls [0,1]
---------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------
-- CONSTANTS (currently not configurable / not tested) -- CONSTANTS (currently not configurable / not tested)

View File

@@ -45,17 +45,17 @@ begin
wb_o.adr_o <= dmem_o.adr_o; wb_o.adr_o <= dmem_o.adr_o;
wb_o.sel_o <= dmem_o.sel_o; wb_o.sel_o <= dmem_o.sel_o;
wb_o.we_o <= dmem_o.we_o; wb_o.we_o <= dmem_o.we_o;
dmem_i.dat_i <= wb_i.dat_i; -- dmem_i.dat_i <= wb_i.dat_i;
dly : process(wb_i.clk_i) --dly : process(wb_i.clk_i)
begin --begin
if rising_edge(wb_i.clk_i) then -- if rising_edge(wb_i.clk_i) then
wb_i_ack_i_dly <= wb_i.ack_i; -- wb_i_ack_i_dly <= wb_i.ack_i;
end if; -- end if;
end process dly; --end process dly;
-- synchronous bus control connections -- synchronous bus control connections
wb_o.cyc_o <= r_cyc_o or wb_i_ack_i_dly; wb_o.cyc_o <= r_cyc_o or wb_i.ack_i;
wb_o.stb_o <= r_cyc_o; wb_o.stb_o <= r_cyc_o;
-- asynchronous core enable connection -- asynchronous core enable connection
@@ -79,7 +79,7 @@ begin
elsif dmem_o.ena_o = '1' and wb_i.ack_i = '1' then elsif dmem_o.ena_o = '1' and wb_i.ack_i = '1' then
-- wishbone bus is occuppied -- wishbone bus is occuppied
rin_data <= r_data; rin_data <= r_data;
rin_cyc_o <= '1'; rin_cyc_o <= r_cyc_o; --'1';
s_wait <= '1'; s_wait <= '1';
elsif r_cyc_o = '0' and dmem_o.ena_o = '1' and wb_i.ack_i = '0' then elsif r_cyc_o = '0' and dmem_o.ena_o = '1' and wb_i.ack_i = '0' then
-- start wishbone cycle -- start wishbone cycle
@@ -100,6 +100,7 @@ begin
if rising_edge(wb_i.clk_i) then if rising_edge(wb_i.clk_i) then
r_cyc_o <= rin_cyc_o; r_cyc_o <= rin_cyc_o;
r_data <= rin_data; r_data <= rin_data;
dmem_i.dat_i <= wb_i.dat_i;
end if; end if;
end process; end process;

View File

@@ -1,6 +1,12 @@
ADDRESS_SPACE mblite_rom RAMB16 [0x00000000:0x00000FFF] ADDRESS_SPACE mblite_rom RAMB16 [0x00000000:0x00003FFF]
BUS_BLOCK BUS_BLOCK
cpu_inst/mblite_rom_inst/rom1_inst [31:16]; cpu_inst/mblite_rom_inst/rom7_inst [31:28];
cpu_inst/mblite_rom_inst/rom0_inst [15:0]; cpu_inst/mblite_rom_inst/rom6_inst [27:24];
cpu_inst/mblite_rom_inst/rom5_inst [23:20];
cpu_inst/mblite_rom_inst/rom4_inst [19:16];
cpu_inst/mblite_rom_inst/rom3_inst [15:12];
cpu_inst/mblite_rom_inst/rom2_inst [11:8];
cpu_inst/mblite_rom_inst/rom1_inst [7:4];
cpu_inst/mblite_rom_inst/rom0_inst [3:0];
END_BUS_BLOCK; END_BUS_BLOCK;
END_ADDRESS_SPACE; END_ADDRESS_SPACE;

197
spi_tb.wcfg Normal file
View File

@@ -0,0 +1,197 @@
<?xml version="1.0" encoding="UTF-8"?>
<wave_config>
<wave_state>
</wave_state>
<db_ref_list>
<db_ref path="./isim.wdb" id="1" type="auto">
<top_modules>
<top_module name="intercon_package" />
<top_module name="numeric_std" />
<top_module name="spi_tb" />
<top_module name="std_logic_1164" />
<top_module name="std_logic_arith" />
<top_module name="std_logic_unsigned" />
<top_module name="textio" />
<top_module name="vcomponents" />
<top_module name="vital_primitives" />
<top_module name="vital_timing" />
<top_module name="vpkg" />
</top_modules>
</db_ref>
</db_ref_list>
<WVObjectSize size="36" />
<wvobject fp_name="/spi_tb/DUT/clk_i" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">clk_i</obj_property>
<obj_property name="ObjectShortName">clk_i</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/rst_i" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">rst_i</obj_property>
<obj_property name="ObjectShortName">rst_i</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/wbs_i" type="array" db_ref_id="1">
<obj_property name="ElementShortName">wbs_i</obj_property>
<obj_property name="ObjectShortName">wbs_i</obj_property>
<wvobject fp_name="/spi_tb/DUT/wbs_i.dat_i" type="array" db_ref_id="1">
<obj_property name="ElementShortName">.dat_i</obj_property>
<obj_property name="ObjectShortName">wbs_i.dat_i</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/wbs_i.we_i" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">.we_i</obj_property>
<obj_property name="ObjectShortName">wbs_i.we_i</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/wbs_i.adr_i" type="array" db_ref_id="1">
<obj_property name="ElementShortName">.adr_i</obj_property>
<obj_property name="ObjectShortName">wbs_i.adr_i</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/wbs_i.cyc_i" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">.cyc_i</obj_property>
<obj_property name="ObjectShortName">wbs_i.cyc_i</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/wbs_i.stb_i" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">.stb_i</obj_property>
<obj_property name="ObjectShortName">wbs_i.stb_i</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/wbs_o" type="array" db_ref_id="1">
<obj_property name="ElementShortName">wbs_o</obj_property>
<obj_property name="ObjectShortName">wbs_o</obj_property>
<wvobject fp_name="/spi_tb/DUT/wbs_o.dat_o" type="array" db_ref_id="1">
<obj_property name="ElementShortName">.dat_o</obj_property>
<obj_property name="ObjectShortName">wbs_o.dat_o</obj_property>
<obj_property name="Radix">HEXRADIX</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/wbs_o.ack_o" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">.ack_o</obj_property>
<obj_property name="ObjectShortName">wbs_o.ack_o</obj_property>
</wvobject>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/miso" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">miso</obj_property>
<obj_property name="ObjectShortName">miso</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/mosi" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">mosi</obj_property>
<obj_property name="ObjectShortName">mosi</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/sclk" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">sclk</obj_property>
<obj_property name="ObjectShortName">sclk</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/ss" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">ss</obj_property>
<obj_property name="ObjectShortName">ss</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/clk_divider" type="array" db_ref_id="1">
<obj_property name="ElementShortName">clk_divider[5:0]</obj_property>
<obj_property name="ObjectShortName">clk_divider[5:0]</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/clk_ctr" type="array" db_ref_id="1">
<obj_property name="ElementShortName">clk_ctr[5:0]</obj_property>
<obj_property name="ObjectShortName">clk_ctr[5:0]</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/spi_clk" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">spi_clk</obj_property>
<obj_property name="ObjectShortName">spi_clk</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/spi_clk_dly" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">spi_clk_dly</obj_property>
<obj_property name="ObjectShortName">spi_clk_dly</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/spi_clk_rst" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">spi_clk_rst</obj_property>
<obj_property name="ObjectShortName">spi_clk_rst</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/spi_clk_inv" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">spi_clk_inv</obj_property>
<obj_property name="ObjectShortName">spi_clk_inv</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/sclk_o_en" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">sclk_o_en</obj_property>
<obj_property name="ObjectShortName">sclk_o_en</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/sclk_o_d0" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">sclk_o_d0</obj_property>
<obj_property name="ObjectShortName">sclk_o_d0</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/sclk_o_d1" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">sclk_o_d1</obj_property>
<obj_property name="ObjectShortName">sclk_o_d1</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/spi_state" type="other" db_ref_id="1">
<obj_property name="ElementShortName">spi_state</obj_property>
<obj_property name="ObjectShortName">spi_state</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/spi_idle" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">spi_idle</obj_property>
<obj_property name="ObjectShortName">spi_idle</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/indata_pending" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">indata_pending</obj_property>
<obj_property name="ObjectShortName">indata_pending</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/spi_ctr" type="other" db_ref_id="1">
<obj_property name="ElementShortName">spi_ctr</obj_property>
<obj_property name="ObjectShortName">spi_ctr</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/sreg" type="array" db_ref_id="1">
<obj_property name="ElementShortName">sreg[8:0]</obj_property>
<obj_property name="ObjectShortName">sreg[8:0]</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/infifo_rd" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">infifo_rd</obj_property>
<obj_property name="ObjectShortName">infifo_rd</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/infifo_wr" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">infifo_wr</obj_property>
<obj_property name="ObjectShortName">infifo_wr</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/infifo_full" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">infifo_full</obj_property>
<obj_property name="ObjectShortName">infifo_full</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/infifo_empty" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">infifo_empty</obj_property>
<obj_property name="ObjectShortName">infifo_empty</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/infifo_din" type="array" db_ref_id="1">
<obj_property name="ElementShortName">infifo_din[7:0]</obj_property>
<obj_property name="ObjectShortName">infifo_din[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/infifo_dout" type="array" db_ref_id="1">
<obj_property name="ElementShortName">infifo_dout[7:0]</obj_property>
<obj_property name="ObjectShortName">infifo_dout[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/outfifo_rd" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">outfifo_rd</obj_property>
<obj_property name="ObjectShortName">outfifo_rd</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/outfifo_wr" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">outfifo_wr</obj_property>
<obj_property name="ObjectShortName">outfifo_wr</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/outfifo_full" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">outfifo_full</obj_property>
<obj_property name="ObjectShortName">outfifo_full</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/outfifo_empty" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">outfifo_empty</obj_property>
<obj_property name="ObjectShortName">outfifo_empty</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/outfifo_din" type="array" db_ref_id="1">
<obj_property name="ElementShortName">outfifo_din[7:0]</obj_property>
<obj_property name="ObjectShortName">outfifo_din[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/outfifo_dout" type="array" db_ref_id="1">
<obj_property name="ElementShortName">outfifo_dout[7:0]</obj_property>
<obj_property name="ObjectShortName">outfifo_dout[7:0]</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/wb_in_cyc" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">wb_in_cyc</obj_property>
<obj_property name="ObjectShortName">wb_in_cyc</obj_property>
</wvobject>
<wvobject fp_name="/spi_tb/DUT/ack_o_int" type="logic" db_ref_id="1">
<obj_property name="ElementShortName">ack_o_int</obj_property>
<obj_property name="ObjectShortName">ack_o_int</obj_property>
</wvobject>
</wave_config>

1
src/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
mblite_rom_data.vhd

View File

@@ -5,7 +5,7 @@
-- Author : Matthias Blankertz <matthias@blankertz.org> -- Author : Matthias Blankertz <matthias@blankertz.org>
-- Company : -- Company :
-- Created : 2013-06-02 -- Created : 2013-06-02
-- Last update: 2013-06-03 -- Last update: 2013-06-07
-- Platform : -- Platform :
-- Standard : VHDL'93/02 -- Standard : VHDL'93/02
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@@ -39,7 +39,7 @@ entity mblite_rom is
port ( port (
clka : IN STD_LOGIC; clka : IN STD_LOGIC;
ena : IN STD_LOGIC; ena : IN STD_LOGIC;
addra : IN STD_LOGIC_VECTOR(9 DOWNTO 0); addra : IN STD_LOGIC_VECTOR(11 DOWNTO 0);
douta : OUT STD_LOGIC_VECTOR(31 DOWNTO 0); douta : OUT STD_LOGIC_VECTOR(31 DOWNTO 0);
wbs_i : in mblite_rom_wbs_i_type; wbs_i : in mblite_rom_wbs_i_type;
@@ -50,17 +50,20 @@ end entity mblite_rom;
architecture Mixed of mblite_rom is architecture Mixed of mblite_rom is
signal wb_clk : std_logic; signal wb_clk : std_logic;
signal ack_o_int : std_logic := '0';
begin begin
wb_clk <= clka; wb_clk <= clka;
wb_ack : process(clka) wb_ack : process(clka)
begin begin
if rising_edge(clka) then if rising_edge(clka) then
wbs_o.ack_o <= wbs_i.stb_i and wbs_i.cyc_i; ack_o_int <= wbs_i.stb_i and wbs_i.cyc_i;
end if; end if;
end process wb_ack; end process wb_ack;
wbs_o.ack_o <= ack_o_int and wbs_i.stb_i;
rom0_inst : ramb16_s18_s18 rom0_inst : ramb16_s4_s4
generic map ( generic map (
INIT_00 => cpu_inst_mblite_rom_inst_rom0_inst_INIT_00, INIT_00 => cpu_inst_mblite_rom_inst_rom0_inst_INIT_00,
INIT_01 => cpu_inst_mblite_rom_inst_rom0_inst_INIT_01, INIT_01 => cpu_inst_mblite_rom_inst_rom0_inst_INIT_01,
@@ -128,20 +131,16 @@ begin
INIT_3F => cpu_inst_mblite_rom_inst_rom0_inst_INIT_3F INIT_3F => cpu_inst_mblite_rom_inst_rom0_inst_INIT_3F
) )
port map ( port map (
doa => douta(15 downto 0), doa => douta(3 downto 0),
dopa => open, dia => "0000",
dia => x"0000",
dipa => "00",
addra => addra, addra => addra,
wea => '0', wea => '0',
ena => ena, ena => ena,
ssra => '0', ssra => '0',
clka => clka, clka => clka,
dob => wbs_o.dat_o(15 downto 0), dob => wbs_o.dat_o(3 downto 0),
dopb => open, dib => "0000",
dib => x"0000",
dipb => "00",
addrb => wbs_i.adr_i, addrb => wbs_i.adr_i,
web => '0', web => '0',
enb => '1', enb => '1',
@@ -149,7 +148,7 @@ begin
clkb => wb_clk clkb => wb_clk
); );
rom1_inst : ramb16_s18_s18 rom1_inst : ramb16_s4_s4
generic map ( generic map (
INIT_00 => cpu_inst_mblite_rom_inst_rom1_inst_INIT_00, INIT_00 => cpu_inst_mblite_rom_inst_rom1_inst_INIT_00,
INIT_01 => cpu_inst_mblite_rom_inst_rom1_inst_INIT_01, INIT_01 => cpu_inst_mblite_rom_inst_rom1_inst_INIT_01,
@@ -217,20 +216,16 @@ begin
INIT_3F => cpu_inst_mblite_rom_inst_rom1_inst_INIT_3F INIT_3F => cpu_inst_mblite_rom_inst_rom1_inst_INIT_3F
) )
port map ( port map (
doa => douta(31 downto 16), doa => douta(7 downto 4),
dopa => open, dia => "0000",
dia => x"0000",
dipa => "00",
addra => addra, addra => addra,
wea => '0', wea => '0',
ena => ena, ena => ena,
ssra => '0', ssra => '0',
clka => clka, clka => clka,
dob => wbs_o.dat_o(31 downto 16), dob => wbs_o.dat_o(7 downto 4),
dopb => open, dib => "0000",
dib => x"0000",
dipb => "00",
addrb => wbs_i.adr_i, addrb => wbs_i.adr_i,
web => '0', web => '0',
enb => '1', enb => '1',
@@ -238,6 +233,514 @@ begin
clkb => wb_clk clkb => wb_clk
); );
rom2_inst : ramb16_s4_s4
generic map (
INIT_00 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_00,
INIT_01 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_01,
INIT_02 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_02,
INIT_03 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_03,
INIT_04 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_04,
INIT_05 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_05,
INIT_06 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_06,
INIT_07 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_07,
INIT_08 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_08,
INIT_09 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_09,
INIT_0A => cpu_inst_mblite_rom_inst_rom2_inst_INIT_0A,
INIT_0B => cpu_inst_mblite_rom_inst_rom2_inst_INIT_0B,
INIT_0C => cpu_inst_mblite_rom_inst_rom2_inst_INIT_0C,
INIT_0D => cpu_inst_mblite_rom_inst_rom2_inst_INIT_0D,
INIT_0E => cpu_inst_mblite_rom_inst_rom2_inst_INIT_0E,
INIT_0F => cpu_inst_mblite_rom_inst_rom2_inst_INIT_0F,
INIT_10 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_10,
INIT_11 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_11,
INIT_12 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_12,
INIT_13 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_13,
INIT_14 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_14,
INIT_15 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_15,
INIT_16 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_16,
INIT_17 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_17,
INIT_18 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_18,
INIT_19 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_19,
INIT_1A => cpu_inst_mblite_rom_inst_rom2_inst_INIT_1A,
INIT_1B => cpu_inst_mblite_rom_inst_rom2_inst_INIT_1B,
INIT_1C => cpu_inst_mblite_rom_inst_rom2_inst_INIT_1C,
INIT_1D => cpu_inst_mblite_rom_inst_rom2_inst_INIT_1D,
INIT_1E => cpu_inst_mblite_rom_inst_rom2_inst_INIT_1E,
INIT_1F => cpu_inst_mblite_rom_inst_rom2_inst_INIT_1F,
INIT_20 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_20,
INIT_21 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_21,
INIT_22 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_22,
INIT_23 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_23,
INIT_24 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_24,
INIT_25 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_25,
INIT_26 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_26,
INIT_27 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_27,
INIT_28 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_28,
INIT_29 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_29,
INIT_2A => cpu_inst_mblite_rom_inst_rom2_inst_INIT_2A,
INIT_2B => cpu_inst_mblite_rom_inst_rom2_inst_INIT_2B,
INIT_2C => cpu_inst_mblite_rom_inst_rom2_inst_INIT_2C,
INIT_2D => cpu_inst_mblite_rom_inst_rom2_inst_INIT_2D,
INIT_2E => cpu_inst_mblite_rom_inst_rom2_inst_INIT_2E,
INIT_2F => cpu_inst_mblite_rom_inst_rom2_inst_INIT_2F,
INIT_30 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_30,
INIT_31 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_31,
INIT_32 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_32,
INIT_33 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_33,
INIT_34 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_34,
INIT_35 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_35,
INIT_36 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_36,
INIT_37 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_37,
INIT_38 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_38,
INIT_39 => cpu_inst_mblite_rom_inst_rom2_inst_INIT_39,
INIT_3A => cpu_inst_mblite_rom_inst_rom2_inst_INIT_3A,
INIT_3B => cpu_inst_mblite_rom_inst_rom2_inst_INIT_3B,
INIT_3C => cpu_inst_mblite_rom_inst_rom2_inst_INIT_3C,
INIT_3D => cpu_inst_mblite_rom_inst_rom2_inst_INIT_3D,
INIT_3E => cpu_inst_mblite_rom_inst_rom2_inst_INIT_3E,
INIT_3F => cpu_inst_mblite_rom_inst_rom2_inst_INIT_3F
)
port map (
doa => douta(11 downto 8),
dia => "0000",
addra => addra,
wea => '0',
ena => ena,
ssra => '0',
clka => clka,
dob => wbs_o.dat_o(11 downto 8),
dib => "0000",
addrb => wbs_i.adr_i,
web => '0',
enb => '1',
ssrb => '0',
clkb => wb_clk
);
rom3_inst : ramb16_s4_s4
generic map (
INIT_00 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_00,
INIT_01 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_01,
INIT_02 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_02,
INIT_03 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_03,
INIT_04 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_04,
INIT_05 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_05,
INIT_06 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_06,
INIT_07 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_07,
INIT_08 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_08,
INIT_09 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_09,
INIT_0A => cpu_inst_mblite_rom_inst_rom3_inst_INIT_0A,
INIT_0B => cpu_inst_mblite_rom_inst_rom3_inst_INIT_0B,
INIT_0C => cpu_inst_mblite_rom_inst_rom3_inst_INIT_0C,
INIT_0D => cpu_inst_mblite_rom_inst_rom3_inst_INIT_0D,
INIT_0E => cpu_inst_mblite_rom_inst_rom3_inst_INIT_0E,
INIT_0F => cpu_inst_mblite_rom_inst_rom3_inst_INIT_0F,
INIT_10 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_10,
INIT_11 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_11,
INIT_12 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_12,
INIT_13 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_13,
INIT_14 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_14,
INIT_15 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_15,
INIT_16 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_16,
INIT_17 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_17,
INIT_18 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_18,
INIT_19 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_19,
INIT_1A => cpu_inst_mblite_rom_inst_rom3_inst_INIT_1A,
INIT_1B => cpu_inst_mblite_rom_inst_rom3_inst_INIT_1B,
INIT_1C => cpu_inst_mblite_rom_inst_rom3_inst_INIT_1C,
INIT_1D => cpu_inst_mblite_rom_inst_rom3_inst_INIT_1D,
INIT_1E => cpu_inst_mblite_rom_inst_rom3_inst_INIT_1E,
INIT_1F => cpu_inst_mblite_rom_inst_rom3_inst_INIT_1F,
INIT_20 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_20,
INIT_21 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_21,
INIT_22 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_22,
INIT_23 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_23,
INIT_24 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_24,
INIT_25 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_25,
INIT_26 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_26,
INIT_27 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_27,
INIT_28 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_28,
INIT_29 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_29,
INIT_2A => cpu_inst_mblite_rom_inst_rom3_inst_INIT_2A,
INIT_2B => cpu_inst_mblite_rom_inst_rom3_inst_INIT_2B,
INIT_2C => cpu_inst_mblite_rom_inst_rom3_inst_INIT_2C,
INIT_2D => cpu_inst_mblite_rom_inst_rom3_inst_INIT_2D,
INIT_2E => cpu_inst_mblite_rom_inst_rom3_inst_INIT_2E,
INIT_2F => cpu_inst_mblite_rom_inst_rom3_inst_INIT_2F,
INIT_30 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_30,
INIT_31 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_31,
INIT_32 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_32,
INIT_33 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_33,
INIT_34 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_34,
INIT_35 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_35,
INIT_36 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_36,
INIT_37 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_37,
INIT_38 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_38,
INIT_39 => cpu_inst_mblite_rom_inst_rom3_inst_INIT_39,
INIT_3A => cpu_inst_mblite_rom_inst_rom3_inst_INIT_3A,
INIT_3B => cpu_inst_mblite_rom_inst_rom3_inst_INIT_3B,
INIT_3C => cpu_inst_mblite_rom_inst_rom3_inst_INIT_3C,
INIT_3D => cpu_inst_mblite_rom_inst_rom3_inst_INIT_3D,
INIT_3E => cpu_inst_mblite_rom_inst_rom3_inst_INIT_3E,
INIT_3F => cpu_inst_mblite_rom_inst_rom3_inst_INIT_3F
)
port map (
doa => douta(15 downto 12),
dia => "0000",
addra => addra,
wea => '0',
ena => ena,
ssra => '0',
clka => clka,
dob => wbs_o.dat_o(15 downto 12),
dib => "0000",
addrb => wbs_i.adr_i,
web => '0',
enb => '1',
ssrb => '0',
clkb => wb_clk
);
rom4_inst : ramb16_s4_s4
generic map (
INIT_00 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_00,
INIT_01 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_01,
INIT_02 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_02,
INIT_03 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_03,
INIT_04 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_04,
INIT_05 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_05,
INIT_06 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_06,
INIT_07 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_07,
INIT_08 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_08,
INIT_09 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_09,
INIT_0A => cpu_inst_mblite_rom_inst_rom4_inst_INIT_0A,
INIT_0B => cpu_inst_mblite_rom_inst_rom4_inst_INIT_0B,
INIT_0C => cpu_inst_mblite_rom_inst_rom4_inst_INIT_0C,
INIT_0D => cpu_inst_mblite_rom_inst_rom4_inst_INIT_0D,
INIT_0E => cpu_inst_mblite_rom_inst_rom4_inst_INIT_0E,
INIT_0F => cpu_inst_mblite_rom_inst_rom4_inst_INIT_0F,
INIT_10 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_10,
INIT_11 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_11,
INIT_12 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_12,
INIT_13 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_13,
INIT_14 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_14,
INIT_15 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_15,
INIT_16 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_16,
INIT_17 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_17,
INIT_18 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_18,
INIT_19 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_19,
INIT_1A => cpu_inst_mblite_rom_inst_rom4_inst_INIT_1A,
INIT_1B => cpu_inst_mblite_rom_inst_rom4_inst_INIT_1B,
INIT_1C => cpu_inst_mblite_rom_inst_rom4_inst_INIT_1C,
INIT_1D => cpu_inst_mblite_rom_inst_rom4_inst_INIT_1D,
INIT_1E => cpu_inst_mblite_rom_inst_rom4_inst_INIT_1E,
INIT_1F => cpu_inst_mblite_rom_inst_rom4_inst_INIT_1F,
INIT_20 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_20,
INIT_21 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_21,
INIT_22 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_22,
INIT_23 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_23,
INIT_24 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_24,
INIT_25 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_25,
INIT_26 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_26,
INIT_27 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_27,
INIT_28 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_28,
INIT_29 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_29,
INIT_2A => cpu_inst_mblite_rom_inst_rom4_inst_INIT_2A,
INIT_2B => cpu_inst_mblite_rom_inst_rom4_inst_INIT_2B,
INIT_2C => cpu_inst_mblite_rom_inst_rom4_inst_INIT_2C,
INIT_2D => cpu_inst_mblite_rom_inst_rom4_inst_INIT_2D,
INIT_2E => cpu_inst_mblite_rom_inst_rom4_inst_INIT_2E,
INIT_2F => cpu_inst_mblite_rom_inst_rom4_inst_INIT_2F,
INIT_30 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_30,
INIT_31 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_31,
INIT_32 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_32,
INIT_33 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_33,
INIT_34 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_34,
INIT_35 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_35,
INIT_36 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_36,
INIT_37 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_37,
INIT_38 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_38,
INIT_39 => cpu_inst_mblite_rom_inst_rom4_inst_INIT_39,
INIT_3A => cpu_inst_mblite_rom_inst_rom4_inst_INIT_3A,
INIT_3B => cpu_inst_mblite_rom_inst_rom4_inst_INIT_3B,
INIT_3C => cpu_inst_mblite_rom_inst_rom4_inst_INIT_3C,
INIT_3D => cpu_inst_mblite_rom_inst_rom4_inst_INIT_3D,
INIT_3E => cpu_inst_mblite_rom_inst_rom4_inst_INIT_3E,
INIT_3F => cpu_inst_mblite_rom_inst_rom4_inst_INIT_3F
)
port map (
doa => douta(19 downto 16),
dia => "0000",
addra => addra,
wea => '0',
ena => ena,
ssra => '0',
clka => clka,
dob => wbs_o.dat_o(19 downto 16),
dib => "0000",
addrb => wbs_i.adr_i,
web => '0',
enb => '1',
ssrb => '0',
clkb => wb_clk
);
rom5_inst : ramb16_s4_s4
generic map (
INIT_00 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_00,
INIT_01 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_01,
INIT_02 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_02,
INIT_03 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_03,
INIT_04 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_04,
INIT_05 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_05,
INIT_06 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_06,
INIT_07 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_07,
INIT_08 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_08,
INIT_09 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_09,
INIT_0A => cpu_inst_mblite_rom_inst_rom5_inst_INIT_0A,
INIT_0B => cpu_inst_mblite_rom_inst_rom5_inst_INIT_0B,
INIT_0C => cpu_inst_mblite_rom_inst_rom5_inst_INIT_0C,
INIT_0D => cpu_inst_mblite_rom_inst_rom5_inst_INIT_0D,
INIT_0E => cpu_inst_mblite_rom_inst_rom5_inst_INIT_0E,
INIT_0F => cpu_inst_mblite_rom_inst_rom5_inst_INIT_0F,
INIT_10 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_10,
INIT_11 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_11,
INIT_12 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_12,
INIT_13 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_13,
INIT_14 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_14,
INIT_15 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_15,
INIT_16 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_16,
INIT_17 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_17,
INIT_18 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_18,
INIT_19 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_19,
INIT_1A => cpu_inst_mblite_rom_inst_rom5_inst_INIT_1A,
INIT_1B => cpu_inst_mblite_rom_inst_rom5_inst_INIT_1B,
INIT_1C => cpu_inst_mblite_rom_inst_rom5_inst_INIT_1C,
INIT_1D => cpu_inst_mblite_rom_inst_rom5_inst_INIT_1D,
INIT_1E => cpu_inst_mblite_rom_inst_rom5_inst_INIT_1E,
INIT_1F => cpu_inst_mblite_rom_inst_rom5_inst_INIT_1F,
INIT_20 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_20,
INIT_21 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_21,
INIT_22 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_22,
INIT_23 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_23,
INIT_24 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_24,
INIT_25 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_25,
INIT_26 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_26,
INIT_27 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_27,
INIT_28 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_28,
INIT_29 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_29,
INIT_2A => cpu_inst_mblite_rom_inst_rom5_inst_INIT_2A,
INIT_2B => cpu_inst_mblite_rom_inst_rom5_inst_INIT_2B,
INIT_2C => cpu_inst_mblite_rom_inst_rom5_inst_INIT_2C,
INIT_2D => cpu_inst_mblite_rom_inst_rom5_inst_INIT_2D,
INIT_2E => cpu_inst_mblite_rom_inst_rom5_inst_INIT_2E,
INIT_2F => cpu_inst_mblite_rom_inst_rom5_inst_INIT_2F,
INIT_30 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_30,
INIT_31 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_31,
INIT_32 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_32,
INIT_33 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_33,
INIT_34 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_34,
INIT_35 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_35,
INIT_36 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_36,
INIT_37 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_37,
INIT_38 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_38,
INIT_39 => cpu_inst_mblite_rom_inst_rom5_inst_INIT_39,
INIT_3A => cpu_inst_mblite_rom_inst_rom5_inst_INIT_3A,
INIT_3B => cpu_inst_mblite_rom_inst_rom5_inst_INIT_3B,
INIT_3C => cpu_inst_mblite_rom_inst_rom5_inst_INIT_3C,
INIT_3D => cpu_inst_mblite_rom_inst_rom5_inst_INIT_3D,
INIT_3E => cpu_inst_mblite_rom_inst_rom5_inst_INIT_3E,
INIT_3F => cpu_inst_mblite_rom_inst_rom5_inst_INIT_3F
)
port map (
doa => douta(23 downto 20),
dia => "0000",
addra => addra,
wea => '0',
ena => ena,
ssra => '0',
clka => clka,
dob => wbs_o.dat_o(23 downto 20),
dib => "0000",
addrb => wbs_i.adr_i,
web => '0',
enb => '1',
ssrb => '0',
clkb => wb_clk
);
rom6_inst : ramb16_s4_s4
generic map (
INIT_00 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_00,
INIT_01 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_01,
INIT_02 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_02,
INIT_03 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_03,
INIT_04 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_04,
INIT_05 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_05,
INIT_06 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_06,
INIT_07 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_07,
INIT_08 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_08,
INIT_09 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_09,
INIT_0A => cpu_inst_mblite_rom_inst_rom6_inst_INIT_0A,
INIT_0B => cpu_inst_mblite_rom_inst_rom6_inst_INIT_0B,
INIT_0C => cpu_inst_mblite_rom_inst_rom6_inst_INIT_0C,
INIT_0D => cpu_inst_mblite_rom_inst_rom6_inst_INIT_0D,
INIT_0E => cpu_inst_mblite_rom_inst_rom6_inst_INIT_0E,
INIT_0F => cpu_inst_mblite_rom_inst_rom6_inst_INIT_0F,
INIT_10 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_10,
INIT_11 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_11,
INIT_12 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_12,
INIT_13 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_13,
INIT_14 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_14,
INIT_15 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_15,
INIT_16 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_16,
INIT_17 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_17,
INIT_18 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_18,
INIT_19 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_19,
INIT_1A => cpu_inst_mblite_rom_inst_rom6_inst_INIT_1A,
INIT_1B => cpu_inst_mblite_rom_inst_rom6_inst_INIT_1B,
INIT_1C => cpu_inst_mblite_rom_inst_rom6_inst_INIT_1C,
INIT_1D => cpu_inst_mblite_rom_inst_rom6_inst_INIT_1D,
INIT_1E => cpu_inst_mblite_rom_inst_rom6_inst_INIT_1E,
INIT_1F => cpu_inst_mblite_rom_inst_rom6_inst_INIT_1F,
INIT_20 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_20,
INIT_21 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_21,
INIT_22 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_22,
INIT_23 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_23,
INIT_24 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_24,
INIT_25 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_25,
INIT_26 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_26,
INIT_27 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_27,
INIT_28 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_28,
INIT_29 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_29,
INIT_2A => cpu_inst_mblite_rom_inst_rom6_inst_INIT_2A,
INIT_2B => cpu_inst_mblite_rom_inst_rom6_inst_INIT_2B,
INIT_2C => cpu_inst_mblite_rom_inst_rom6_inst_INIT_2C,
INIT_2D => cpu_inst_mblite_rom_inst_rom6_inst_INIT_2D,
INIT_2E => cpu_inst_mblite_rom_inst_rom6_inst_INIT_2E,
INIT_2F => cpu_inst_mblite_rom_inst_rom6_inst_INIT_2F,
INIT_30 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_30,
INIT_31 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_31,
INIT_32 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_32,
INIT_33 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_33,
INIT_34 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_34,
INIT_35 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_35,
INIT_36 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_36,
INIT_37 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_37,
INIT_38 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_38,
INIT_39 => cpu_inst_mblite_rom_inst_rom6_inst_INIT_39,
INIT_3A => cpu_inst_mblite_rom_inst_rom6_inst_INIT_3A,
INIT_3B => cpu_inst_mblite_rom_inst_rom6_inst_INIT_3B,
INIT_3C => cpu_inst_mblite_rom_inst_rom6_inst_INIT_3C,
INIT_3D => cpu_inst_mblite_rom_inst_rom6_inst_INIT_3D,
INIT_3E => cpu_inst_mblite_rom_inst_rom6_inst_INIT_3E,
INIT_3F => cpu_inst_mblite_rom_inst_rom6_inst_INIT_3F
)
port map (
doa => douta(27 downto 24),
dia => "0000",
addra => addra,
wea => '0',
ena => ena,
ssra => '0',
clka => clka,
dob => wbs_o.dat_o(27 downto 24),
dib => "0000",
addrb => wbs_i.adr_i,
web => '0',
enb => '1',
ssrb => '0',
clkb => wb_clk
);
rom7_inst : ramb16_s4_s4
generic map (
INIT_00 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_00,
INIT_01 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_01,
INIT_02 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_02,
INIT_03 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_03,
INIT_04 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_04,
INIT_05 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_05,
INIT_06 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_06,
INIT_07 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_07,
INIT_08 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_08,
INIT_09 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_09,
INIT_0A => cpu_inst_mblite_rom_inst_rom7_inst_INIT_0A,
INIT_0B => cpu_inst_mblite_rom_inst_rom7_inst_INIT_0B,
INIT_0C => cpu_inst_mblite_rom_inst_rom7_inst_INIT_0C,
INIT_0D => cpu_inst_mblite_rom_inst_rom7_inst_INIT_0D,
INIT_0E => cpu_inst_mblite_rom_inst_rom7_inst_INIT_0E,
INIT_0F => cpu_inst_mblite_rom_inst_rom7_inst_INIT_0F,
INIT_10 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_10,
INIT_11 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_11,
INIT_12 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_12,
INIT_13 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_13,
INIT_14 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_14,
INIT_15 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_15,
INIT_16 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_16,
INIT_17 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_17,
INIT_18 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_18,
INIT_19 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_19,
INIT_1A => cpu_inst_mblite_rom_inst_rom7_inst_INIT_1A,
INIT_1B => cpu_inst_mblite_rom_inst_rom7_inst_INIT_1B,
INIT_1C => cpu_inst_mblite_rom_inst_rom7_inst_INIT_1C,
INIT_1D => cpu_inst_mblite_rom_inst_rom7_inst_INIT_1D,
INIT_1E => cpu_inst_mblite_rom_inst_rom7_inst_INIT_1E,
INIT_1F => cpu_inst_mblite_rom_inst_rom7_inst_INIT_1F,
INIT_20 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_20,
INIT_21 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_21,
INIT_22 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_22,
INIT_23 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_23,
INIT_24 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_24,
INIT_25 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_25,
INIT_26 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_26,
INIT_27 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_27,
INIT_28 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_28,
INIT_29 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_29,
INIT_2A => cpu_inst_mblite_rom_inst_rom7_inst_INIT_2A,
INIT_2B => cpu_inst_mblite_rom_inst_rom7_inst_INIT_2B,
INIT_2C => cpu_inst_mblite_rom_inst_rom7_inst_INIT_2C,
INIT_2D => cpu_inst_mblite_rom_inst_rom7_inst_INIT_2D,
INIT_2E => cpu_inst_mblite_rom_inst_rom7_inst_INIT_2E,
INIT_2F => cpu_inst_mblite_rom_inst_rom7_inst_INIT_2F,
INIT_30 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_30,
INIT_31 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_31,
INIT_32 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_32,
INIT_33 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_33,
INIT_34 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_34,
INIT_35 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_35,
INIT_36 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_36,
INIT_37 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_37,
INIT_38 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_38,
INIT_39 => cpu_inst_mblite_rom_inst_rom7_inst_INIT_39,
INIT_3A => cpu_inst_mblite_rom_inst_rom7_inst_INIT_3A,
INIT_3B => cpu_inst_mblite_rom_inst_rom7_inst_INIT_3B,
INIT_3C => cpu_inst_mblite_rom_inst_rom7_inst_INIT_3C,
INIT_3D => cpu_inst_mblite_rom_inst_rom7_inst_INIT_3D,
INIT_3E => cpu_inst_mblite_rom_inst_rom7_inst_INIT_3E,
INIT_3F => cpu_inst_mblite_rom_inst_rom7_inst_INIT_3F
)
port map (
doa => douta(31 downto 28),
dia => "0000",
addra => addra,
wea => '0',
ena => ena,
ssra => '0',
clka => clka,
dob => wbs_o.dat_o(31 downto 28),
dib => "0000",
addrb => wbs_i.adr_i,
web => '0',
enb => '1',
ssrb => '0',
clkb => wb_clk
);
end Mixed; end Mixed;

View File

@@ -6,7 +6,7 @@
-- Author : Matthias Blankertz <matthias@blankertz.org> -- Author : Matthias Blankertz <matthias@blankertz.org>
-- Company : -- Company :
-- Created : 2013-06-02 -- Created : 2013-06-02
-- Last update: 2013-06-03 -- Last update: 2013-06-07
-- Platform : -- Platform :
-- Standard : VHDL'93/02 -- Standard : VHDL'93/02
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@@ -71,7 +71,7 @@ begin
port map ( port map (
clka => clk_i, clka => clk_i,
ena => mb_imem_o.ena_o, ena => mb_imem_o.ena_o,
addra => mb_imem_o.adr_o(11 downto 2), addra => mb_imem_o.adr_o(13 downto 2),
douta => mb_imem_i.dat_i, douta => mb_imem_i.dat_i,
wbs_i => rom_wbs_i, wbs_i => rom_wbs_i,
wbs_o => rom_wbs_o wbs_o => rom_wbs_o

View File

@@ -6,7 +6,7 @@
-- Author : Matthias Blankertz <matthias@blankertz.org> -- Author : Matthias Blankertz <matthias@blankertz.org>
-- Company : -- Company :
-- Created : 2013-06-05 -- Created : 2013-06-05
-- Last update: 2013-06-05 -- Last update: 2013-06-07
-- Platform : -- Platform :
-- Standard : VHDL'93/02 -- Standard : VHDL'93/02
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@@ -36,9 +36,16 @@ use work.intercon_package.all;
-- Register map -- Register map
-- 0 : data in/out register -- 0 : data in/out register
-- 1 : status register -- 1 : status register
-- 7..3: reserved
-- 2: RX FIFO empty
-- 1: TX FIFO full
-- 0: idle
-- 2 : config1 register -- 2 : config1 register
-- 7..6: reserved -- 7..6: reserved
-- 5..0: output clock divider -- 5..0: output clock divider
-- 3 : slave select register
-- 7..1: reserved
-- 0: slave select
entity spi is entity spi is
generic ( generic (
@@ -51,33 +58,38 @@ entity spi is
rst_i : in std_logic; rst_i : in std_logic;
-- Wishbone slave port -- Wishbone slave port
dat_i : in std_logic_vector(7 downto 0); wbs_i : in spi_wbs_i_type;
we_i : in std_logic; wbs_o : out spi_wbs_o_type;
cyc_i : in std_logic;
stb_i : in std_logic;
adr_i : in std_logic_vector(1 downto 0);
dat_o : out std_logic_vector(7 downto 0);
ack_o : out std_logic;
-- SPI Master -- SPI Master
miso : in std_logic; miso : in std_logic;
mosi : out std_logic; mosi : out std_logic;
sclk : out std_logic; sclk : out std_logic;
ss : out std_logic ss : out std_logic := '1'
); );
end spi; end spi;
architecture Behavioral of spi is architecture Behavioral of spi is
constant sclk_obuf_init : std_logic := not clock_pol; constant sclk_obuf_init : bit := to_bit(not clock_pol);
signal spi_clk, spi_clk_dly : std_logic := '0'; signal clk_divider, clk_ctr : unsigned(5 downto 0) := to_unsigned(0, 6);
signal spi_clk, spi_clk_dly, spi_clk_rst : std_logic := '0';
signal spi_clk_inv : std_logic; signal spi_clk_inv : std_logic;
type spi_states is (S_IDLE, S_XFER_START, S_XFER, S_WAITFALLING, S_WAITINFIFO); signal sclk_o_en, sclk_o_d0, sclk_o_d1 : std_logic := '0';
signal spi_state : spi_states := S_IDLE;
signal clk_divider, clk_ctr : unsigned(5 downto 0) := to_unsigned(0, 6); type spi_states is (S_IDLE, S_XFER_START1, S_XFER_START2, S_XFER, S_WAITFALLING, S_WAITINFIFO);
signal spi_state : spi_states := S_IDLE;
signal spi_idle, indata_pending : std_logic;
signal spi_ctr : integer range 0 to 7;
signal sreg : std_logic_vector(8 downto 0);
signal infifo_rd, infifo_wr, infifo_full, infifo_empty : std_logic := '0';
signal infifo_din, infifo_dout : std_logic_vector(7 downto 0);
signal outfifo_rd, outfifo_wr, outfifo_full, outfifo_empty : std_logic := '0';
signal outfifo_din, outfifo_dout : std_logic_vector(7 downto 0);
signal wb_in_cyc, ack_o_int : std_logic := '0';
begin begin
spi_clk_gen : process(clk_i) spi_clk_gen : process(clk_i)
begin begin
@@ -98,13 +110,13 @@ begin
sclk_obuf : ODDR2 sclk_obuf : ODDR2
generic map ( generic map (
DDR_ALIGNMENT => "C0", -- DDR_ALIGNMENT => "C0",
INIT => sclk_obuf_init INIT => sclk_obuf_init
) )
port map ( port map (
Q => sclk, Q => sclk,
C0 => spi_clk_dly, C0 => spi_clk_inv,
C1 => spi_clk_inv, C1 => spi_clk_dly,
CE => sclk_o_en, CE => sclk_o_en,
D0 => sclk_o_d0, D0 => sclk_o_d0,
D1 => sclk_o_d1, D1 => sclk_o_d1,
@@ -118,6 +130,7 @@ begin
spi_sreg : process(clk_i) spi_sreg : process(clk_i)
begin begin
if rising_edge(clk_i) then if rising_edge(clk_i) then
spi_clk_rst <= '0';
infifo_wr <= '0'; infifo_wr <= '0';
infifo_din <= (others => dontcare); infifo_din <= (others => dontcare);
outfifo_rd <= '0'; outfifo_rd <= '0';
@@ -130,13 +143,17 @@ begin
if clock_phase = '0' then if clock_phase = '0' then
mosi <= outfifo_dout(7); mosi <= outfifo_dout(7);
end if; end if;
spi_state <= S_XFER_START; spi_clk_rst <= '1';
end if; spi_ctr <= 0;
when S_XFER_START => indata_pending <= '0';
if spi_clk_dly = '1' and spi_clk = '0' then spi_state <= S_XFER_START1;
sclk_o_en <= '1';
spi_state <= S_XFER;
end if; end if;
when S_XFER_START1 =>
spi_clk_rst <= '1';
spi_state <= S_XFER_START2;
when S_XFER_START2 =>
sclk_o_en <= '1';
spi_state <= S_XFER;
when S_XFER => when S_XFER =>
if ((spi_clk_dly = '0' and spi_clk = '1' and clock_phase = '0') or if ((spi_clk_dly = '0' and spi_clk = '1' and clock_phase = '0') or
(spi_clk_dly = '1' and spi_clk = '0' and clock_phase = '1')) then (spi_clk_dly = '1' and spi_clk = '0' and clock_phase = '1')) then
@@ -172,14 +189,16 @@ begin
spi_state <= S_WAITFALLING; spi_state <= S_WAITFALLING;
end if; end if;
end if; end if;
else
spi_ctr <= spi_ctr + 1;
end if; end if;
elsif (spi_clk_dly = '1' and spi_clk = '0' and clock_phase = '0') then elsif (spi_clk_dly = '1' and spi_clk = '0' and clock_phase = '0') then
-- Data out -- Data out
mosi <= sreg(8); mosi <= sreg(7);
sreg <= sreg(7 downto 0) & "0"; sreg <= sreg(7 downto 0) & "0";
elsif (spi_clk_dly = '0' and spi_clk = '1' and clock_phase = '1') then elsif (spi_clk_dly = '0' and spi_clk = '1' and clock_phase = '1') then
-- Data out -- Data out
mosi <= sreg(8); mosi <= sreg(7);
sreg <= sreg(7 downto 0) & "0"; sreg <= sreg(7 downto 0) & "0";
end if; end if;
when S_WAITFALLING => when S_WAITFALLING =>
@@ -209,6 +228,28 @@ begin
end if; end if;
end process spi_sreg; end process spi_sreg;
infifo : entity work.fifo16x8
port map (
clk => clk_i,
writestb => infifo_wr,
readstb => infifo_rd,
datain => infifo_din,
dataout => infifo_dout,
full => infifo_full,
empty => infifo_empty
);
outfifo : entity work.fifo16x8
port map (
clk => clk_i,
writestb => outfifo_wr,
readstb => outfifo_rd,
datain => outfifo_din,
dataout => outfifo_dout,
full => outfifo_full,
empty => outfifo_empty
);
spi_idle <= '1' when spi_state = S_IDLE and outfifo_empty = '1' else spi_idle <= '1' when spi_state = S_IDLE and outfifo_empty = '1' else
'0'; '0';
@@ -220,16 +261,17 @@ begin
outfifo_din <= (others => dontcare); outfifo_din <= (others => dontcare);
if rst_i = '1' then if rst_i = '1' then
wbs_o.ack_o <= '0'; ack_o_int <= '0';
wb_in_cyc <= '0'; wb_in_cyc <= '0';
wbs_o.dat_o <= (others => dontcare); wbs_o.dat_o <= (others => dontcare);
else else
if wb_in_cyc = '1' and wbs_i.stb_i = '0' then if wb_in_cyc = '1' and wbs_i.stb_i = '0' then
wbs_o.dat_o <= (others => dontcare); wbs_o.dat_o <= (others => dontcare);
ack_o_int <= '0';
wb_in_cyc <= '0'; wb_in_cyc <= '0';
elsif wb_in_cyc = '0' and wbs_i.stb_i = '1' and wbs_i.cyc_i = '1' then elsif wb_in_cyc = '0' and wbs_i.stb_i = '1' and wbs_i.cyc_i = '1' then
wb_in_cyc <= '1'; wb_in_cyc <= '1';
wbs_o.ack_o <= '1'; ack_o_int <= '1';
if wbs_i.we_i = '0' then if wbs_i.we_i = '0' then
if wbs_i.adr_i = "00" then if wbs_i.adr_i = "00" then
@@ -240,7 +282,7 @@ begin
end if; end if;
elsif wbs_i.adr_i = "01" then elsif wbs_i.adr_i = "01" then
-- read status reg -- read status reg
wbs_o.dat_o(7 downto 3) <= (others => dontcare) wbs_o.dat_o(7 downto 3) <= (others => dontcare);
wbs_o.dat_o(2 downto 0) <= infifo_empty & outfifo_full & spi_idle; wbs_o.dat_o(2 downto 0) <= infifo_empty & outfifo_full & spi_idle;
elsif wbs_i.adr_i = "10" then elsif wbs_i.adr_i = "10" then
-- read config reg -- read config reg
@@ -260,11 +302,17 @@ begin
elsif wbs_i.adr_i = "10" then elsif wbs_i.adr_i = "10" then
-- write config reg -- write config reg
clk_divider <= unsigned(wbs_i.dat_i(5 downto 0)); clk_divider <= unsigned(wbs_i.dat_i(5 downto 0));
elsif wbs_i.adr_i = "11" then
-- write slave select
if spi_idle = '1' then
ss <= wbs_i.dat_i(0);
end if;
end if; end if;
end if; end if;
end if; end if;
end if; end if;
end if; end if;
end process wb; end process wb;
wbs_o.ack_o <= (ack_o_int or wbs_i.we_i) and wbs_i.stb_i;
end Behavioral; end Behavioral;

View File

@@ -74,7 +74,12 @@ entity toplevel is
-- RS232 -- RS232
rs232_txd : out std_logic; rs232_txd : out std_logic;
rs232_rxd : in std_logic rs232_rxd : in std_logic;
sd_miso : in std_logic;
sd_mosi : out std_logic;
sd_cs : out std_logic;
sd_sck : out std_logic
); );
end toplevel; end toplevel;
@@ -91,6 +96,8 @@ architecture Mixed of toplevel is
signal pio_led_wbs_o : pio_led_wbs_o_type; signal pio_led_wbs_o : pio_led_wbs_o_type;
signal uart_wbs_i : uart_wbs_i_type; signal uart_wbs_i : uart_wbs_i_type;
signal uart_wbs_o : uart_wbs_o_type; signal uart_wbs_o : uart_wbs_o_type;
signal spi_sd_wbs_i : spi_wbs_i_type;
signal spi_sd_wbs_o : spi_wbs_o_type;
signal mem_bridge_wbs_o : mem_bridge_wbs_o_type; signal mem_bridge_wbs_o : mem_bridge_wbs_o_type;
signal mem_bridge_wbs_i : mem_bridge_wbs_i_type; signal mem_bridge_wbs_i : mem_bridge_wbs_i_type;
@@ -231,6 +238,9 @@ pio_led: entity work.pio
); );
uart_inst: entity work.uart_wbc uart_inst: entity work.uart_wbc
generic map (
dontcare => dontcare
)
port map ( port map (
CLK_I => sysClk, CLK_I => sysClk,
RST_I => sysRst, RST_I => sysRst,
@@ -246,6 +256,20 @@ uart_inst: entity work.uart_wbc
SERIALOUT => rs232_txd SERIALOUT => rs232_txd
); );
spi_sd_inst : entity work.spi
port map (
clk_i => sysClk,
rst_i => sysRst,
wbs_i => spi_sd_wbs_i,
wbs_o => spi_sd_wbs_o,
miso => sd_miso,
mosi => sd_mosi,
ss => sd_cs,
sclk => sd_sck
);
mem_bridge_inst : entity work.wb_mem_bridge mem_bridge_inst : entity work.wb_mem_bridge
port map ( port map (
clk_i => sysClk, clk_i => sysClk,
@@ -291,6 +315,8 @@ intercon_1: entity work.interconnect
pio_led_wbs_i => pio_led_wbs_i, pio_led_wbs_i => pio_led_wbs_i,
uart_wbs_o => uart_wbs_o, uart_wbs_o => uart_wbs_o,
uart_wbs_i => uart_wbs_i, uart_wbs_i => uart_wbs_i,
spi_sd_wbs_o => spi_sd_wbs_o,
spi_sd_wbs_i => spi_sd_wbs_i,
clk => sysClk, clk => sysClk,
reset => sysRst); reset => sysRst);

View File

@@ -59,7 +59,7 @@ begin
sr8 <= sr8(6 downto 0) & start; sr8 <= sr8(6 downto 0) & start;
sr16 <= sr16(14 downto 0) & ((sr8(7) or sr16(15)) and (not dly10_sr10(8))); sr16 <= sr16(14 downto 0) & ((sr8(7) or sr16(15)) and (not dly10_sr10(8)));
if (sr8(7) or sr16(15)) = '1' then if (sr8(7) or sr16(15) or not running) = '1' then
dly10_sr10 <= dly10_sr10(8 downto 0) & sr8(7); dly10_sr10 <= dly10_sr10(8 downto 0) & sr8(7);
end if; end if;
end if; end if;

View File

@@ -30,6 +30,9 @@ use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- 57600 baud with 50 MHz clk -- 57600 baud with 50 MHz clk
-- 115200 baud with 100 MHz clk -- 115200 baud with 100 MHz clk
entity uart_wbc is entity uart_wbc is
generic (
dontcare : std_logic := '-'
);
Port ( Port (
-- Wishbone slave -- Wishbone slave
DAT_O : out STD_LOGIC_VECTOR (7 downto 0); DAT_O : out STD_LOGIC_VECTOR (7 downto 0);
@@ -67,7 +70,7 @@ signal uart_dataout, uart_datain: std_logic_vector(7 downto 0);
signal uart_readfifostb, uart_writefifostb: std_logic := '0'; signal uart_readfifostb, uart_writefifostb: std_logic := '0';
signal uart_readfull, uart_readempty, uart_writefull, uart_writeempty: std_logic; signal uart_readfull, uart_readempty, uart_writefull, uart_writeempty: std_logic;
signal in_cyc : std_logic := '0'; signal in_cyc, ACK_O_int : std_logic := '0';
begin begin
uart_inst: uart uart_inst: uart
port map ( port map (
@@ -93,7 +96,7 @@ begin
else else
if STB_I = '0' then if STB_I = '0' then
in_cyc <= '0'; in_cyc <= '0';
ACK_O <= '0'; ACK_O_int <= '0';
elsif STB_I = '1' and in_cyc = '0' then elsif STB_I = '1' and in_cyc = '0' then
if ADR_I(0) = '0' and WE_I = '1' then if ADR_I(0) = '0' and WE_I = '1' then
uart_writefifostb <= '1'; uart_writefifostb <= '1';
@@ -101,15 +104,18 @@ begin
uart_readfifostb <= '1'; uart_readfifostb <= '1';
DAT_O <= uart_dataout; DAT_O <= uart_dataout;
elsif ADR_I(0) = '1' then elsif ADR_I(0) = '1' then
DAT_O <= "----" & uart_readfull & uart_readempty & uart_writefull & uart_writeempty; DAT_O(7 downto 4) <= (others => dontcare);
DAT_O(3 downto 0) <= uart_readfull & uart_readempty & uart_writefull & uart_writeempty;
end if; end if;
in_cyc <= '1'; in_cyc <= '1';
ACK_O <= '1'; ACK_O_int <= '1';
end if; end if;
end if; end if;
end if; end if;
end process wb; end process wb;
ACK_O <= ACK_O_int and STB_I;
uart_datain <= DAT_I; uart_datain <= DAT_I;
SERIALOUT <= serialout_o; SERIALOUT <= serialout_o;
end Behavioral; end Behavioral;

View File

@@ -49,6 +49,8 @@ architecture Behavioral of wb_ram is
signal di3, di2, di1, di0 : std_logic_vector(7 downto 0); signal di3, di2, di1, di0 : std_logic_vector(7 downto 0);
signal bwe : std_logic_vector(3 downto 0) := (others => '0'); signal bwe : std_logic_vector(3 downto 0) := (others => '0');
signal ack_o_int : std_logic := '0';
begin begin
readport : process(clk_i) readport : process(clk_i)
@@ -98,8 +100,10 @@ begin
ack : process(clk_i) ack : process(clk_i)
begin begin
if rising_edge(clk_i) then if rising_edge(clk_i) then
wbs_o.ack_o <= wbs_i.stb_i and wbs_i.cyc_i; ack_o_int <= wbs_i.stb_i and wbs_i.cyc_i;
end if; end if;
end process ack; end process ack;
wbs_o.ack_o <= (ack_o_int or wbs_i.we_i) and wbs_i.stb_i;
--wbs_o.ack_o <= ack_o_int;
end Behavioral; end Behavioral;

View File

@@ -6,7 +6,7 @@
-- Author : Matthias Blankertz <matthias@blankertz.org> -- Author : Matthias Blankertz <matthias@blankertz.org>
-- Company : -- Company :
-- Created : 2013-06-03 -- Created : 2013-06-03
-- Last update: 2013-06-04 -- Last update: 2013-06-07
-- Platform : -- Platform :
-- Standard : VHDL'93/02 -- Standard : VHDL'93/02
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@@ -50,7 +50,7 @@ package intercon_package is
type mblite_rom_wbs_i_type is record type mblite_rom_wbs_i_type is record
sel_i : std_logic_vector(3 downto 0); sel_i : std_logic_vector(3 downto 0);
adr_i : std_logic_vector(11 downto 2); adr_i : std_logic_vector(13 downto 2);
cyc_i : std_logic; cyc_i : std_logic;
stb_i : std_logic; stb_i : std_logic;
end record; end record;
@@ -95,6 +95,18 @@ package intercon_package is
dat_o : std_logic_vector(7 downto 0); dat_o : std_logic_vector(7 downto 0);
ack_o : std_logic; ack_o : std_logic;
end record; end record;
type spi_wbs_i_type is record
dat_i : std_logic_vector(7 downto 0);
we_i : std_logic;
adr_i : std_logic_vector(1 downto 0);
cyc_i : std_logic;
stb_i : std_logic;
end record;
type spi_wbs_o_type is record
dat_o : std_logic_vector(7 downto 0);
ack_o : std_logic;
end record;
type mem_bridge_wbs_i_type is record type mem_bridge_wbs_i_type is record
dat_i : std_logic_vector(31 downto 0); dat_i : std_logic_vector(31 downto 0);
@@ -145,6 +157,9 @@ entity interconnect is
-- uart -- uart
uart_wbs_i : out uart_wbs_i_type; uart_wbs_i : out uart_wbs_i_type;
uart_wbs_o : in uart_wbs_o_type; uart_wbs_o : in uart_wbs_o_type;
-- SPI
spi_sd_wbs_i : out spi_wbs_i_type;
spi_sd_wbs_o : in spi_wbs_o_type;
-- sdram_ctrl -- sdram_ctrl
mem_bridge_wbs_i : out mem_bridge_wbs_i_type; mem_bridge_wbs_i : out mem_bridge_wbs_i_type;
mem_bridge_wbs_o : in mem_bridge_wbs_o_type; mem_bridge_wbs_o : in mem_bridge_wbs_o_type;
@@ -170,9 +185,9 @@ architecture Behavioral of interconnect is
signal buss_bte_o : std_logic_vector(1 downto 0); signal buss_bte_o : std_logic_vector(1 downto 0);
signal buss_cti_o : std_logic_vector(2 downto 0); signal buss_cti_o : std_logic_vector(2 downto 0);
signal mblite_rom_ss, ram_ss, pio_led_ss, uart_ss, mem_bridge_ss : std_logic; signal mblite_rom_ss, ram_ss, pio_led_ss, uart_ss, spi_sd_ss, mem_bridge_ss : std_logic;
signal mblite_rom_ss_r, ram_ss_r, pio_led_ss_r, uart_ss_r, mem_bridge_ss_r : std_logic; signal mblite_rom_ss_r, ram_ss_r, pio_led_ss_r, uart_ss_r, spi_sd_ss_r, mem_bridge_ss_r : std_logic;
signal uart_cs : std_logic; signal uart_cs, spi_sd_cs : std_logic;
signal byte_sel : integer range 0 to 3; signal byte_sel : integer range 0 to 3;
signal hword_sel : integer range 0 to 1; signal hword_sel : integer range 0 to 1;
@@ -208,10 +223,11 @@ begin
-- Slave select gen -- Slave select gen
mblite_rom_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 12) & x"000") = 16#00000000# else '0'; mblite_rom_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 14) & "00" & x"000") = 16#00000000# else '0';
ram_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 11) & "00000000000") = 16#00001000# else '0'; ram_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 11) & "00000000000") = 16#00008000# else '0';
pio_led_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 2) & "00") = 16#00004000# else '0'; pio_led_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 2) & "00") = 16#00010000# else '0';
uart_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 1) & "0") = 16#00004020# else '0'; uart_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 1) & "0") = 16#00010020# else '0';
spi_sd_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 2) & "00") = 16#00010030# else '0';
mem_bridge_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 26) & "00" & x"000000") = 16#08000000# else '0'; mem_bridge_ss <= '1' when unsigned(buss_adr_o((wb_addr_width-1) downto 26) & "00" & x"000000") = 16#08000000# else '0';
byte_sel <= to_integer(unsigned(buss_adr_o(1 downto 0))); byte_sel <= to_integer(unsigned(buss_adr_o(1 downto 0)));
@@ -226,6 +242,7 @@ begin
ram_ss_r <= ram_ss; ram_ss_r <= ram_ss;
pio_led_ss_r <= pio_led_ss; pio_led_ss_r <= pio_led_ss;
uart_ss_r <= uart_ss; uart_ss_r <= uart_ss;
spi_sd_ss_r <= spi_sd_ss;
mem_bridge_ss_r <= mem_bridge_ss; mem_bridge_ss_r <= mem_bridge_ss;
end if; end if;
end process ss_regs; end process ss_regs;
@@ -235,23 +252,25 @@ begin
ram_wbs_o.dat_o when ram_ss_r = '1' else ram_wbs_o.dat_o when ram_ss_r = '1' else
pio_led_wbs_o.dat_o when pio_led_ss_r = '1' else pio_led_wbs_o.dat_o when pio_led_ss_r = '1' else
uart_wbs_o.dat_o & uart_wbs_o.dat_o & uart_wbs_o.dat_o & uart_wbs_o.dat_o when uart_ss_r = '1' else uart_wbs_o.dat_o & uart_wbs_o.dat_o & uart_wbs_o.dat_o & uart_wbs_o.dat_o when uart_ss_r = '1' else
spi_sd_wbs_o.dat_o & spi_sd_wbs_o.dat_o & spi_sd_wbs_o.dat_o & spi_sd_wbs_o.dat_o when spi_sd_ss_r = '1' else
mem_bridge_wbs_o.dat_o when mem_bridge_ss_r = '1' else mem_bridge_wbs_o.dat_o when mem_bridge_ss_r = '1' else
(others => '-'); (others => '-');
buss_ack_i <= mblite_rom_wbs_o.ack_o when mblite_rom_ss_r = '1' else buss_ack_i <= mblite_rom_wbs_o.ack_o when mblite_rom_ss_r = '1' else
ram_wbs_o.ack_o when ram_ss_r = '1' else ram_wbs_o.ack_o when ram_ss_r = '1' else
pio_led_wbs_o.ack_o when pio_led_ss_r = '1' else pio_led_wbs_o.ack_o when pio_led_ss_r = '1' else
uart_wbs_o.ack_o when uart_ss_r = '1' else uart_wbs_o.ack_o when uart_ss_r = '1' else
spi_sd_wbs_o.ack_o when spi_sd_ss_r = '1' else
mem_bridge_wbs_o.ack_o when mem_bridge_ss_r = '1' else mem_bridge_wbs_o.ack_o when mem_bridge_ss_r = '1' else
'0'; '0';
-- Slave modules -- Slave modules
-- mblite_rom (32bit, 0x00000000 - 0x00001000) -- mblite_rom (32bit, 0x00000000 - 0x00004000)
mblite_rom_wbs_i.sel_i <= buss_sel_o; mblite_rom_wbs_i.sel_i <= buss_sel_o;
mblite_rom_wbs_i.adr_i <= buss_adr_o(11 downto 2); mblite_rom_wbs_i.adr_i <= buss_adr_o(13 downto 2);
mblite_rom_wbs_i.cyc_i <= buss_cyc_o and mblite_rom_ss; mblite_rom_wbs_i.cyc_i <= buss_cyc_o and mblite_rom_ss;
mblite_rom_wbs_i.stb_i <= buss_stb_o and mblite_rom_ss; mblite_rom_wbs_i.stb_i <= buss_stb_o and mblite_rom_ss;
-- ram (32bit, 0x00001000 - 0x00001800) -- ram (32bit, 0x00008000 - 0x00008800)
ram_wbs_i.sel_i <= buss_sel_o; ram_wbs_i.sel_i <= buss_sel_o;
ram_wbs_i.adr_i <= buss_adr_o(10 downto 2); ram_wbs_i.adr_i <= buss_adr_o(10 downto 2);
ram_wbs_i.cyc_i <= buss_cyc_o and ram_ss; ram_wbs_i.cyc_i <= buss_cyc_o and ram_ss;
@@ -259,14 +278,14 @@ begin
ram_wbs_i.we_i <= buss_we_o; ram_wbs_i.we_i <= buss_we_o;
ram_wbs_i.dat_i <= buss_dat_o; ram_wbs_i.dat_i <= buss_dat_o;
-- PIO led (32bit, 0x00004000 - 0x00004004) -- PIO led (32bit, 0x00010000 - 0x00010004)
pio_led_wbs_i.sel_i <= buss_sel_o; pio_led_wbs_i.sel_i <= buss_sel_o;
pio_led_wbs_i.cyc_i <= buss_cyc_o and pio_led_ss; pio_led_wbs_i.cyc_i <= buss_cyc_o and pio_led_ss;
pio_led_wbs_i.stb_i <= buss_stb_o and pio_led_ss; pio_led_wbs_i.stb_i <= buss_stb_o and pio_led_ss;
pio_led_wbs_i.we_i <= buss_we_o; pio_led_wbs_i.we_i <= buss_we_o;
pio_led_wbs_i.dat_i <= buss_dat_o; pio_led_wbs_i.dat_i <= buss_dat_o;
-- UART (8bit, 0x00004020 - 0x00004022) -- UART (8bit, 0x00010020 - 0x00010022)
uart_cs <= buss_sel_o(3-byte_sel); uart_cs <= buss_sel_o(3-byte_sel);
uart_wbs_i.cyc_i <= buss_cyc_o and uart_ss; uart_wbs_i.cyc_i <= buss_cyc_o and uart_ss;
uart_wbs_i.stb_i <= buss_stb_o and uart_ss and uart_cs; uart_wbs_i.stb_i <= buss_stb_o and uart_ss and uart_cs;
@@ -274,6 +293,14 @@ begin
uart_wbs_i.dat_i <= buss_dat_o(8*(3-byte_sel)+7 downto 8*(3-byte_sel)); uart_wbs_i.dat_i <= buss_dat_o(8*(3-byte_sel)+7 downto 8*(3-byte_sel));
uart_wbs_i.adr_i <= buss_adr_o(0 downto 0); uart_wbs_i.adr_i <= buss_adr_o(0 downto 0);
-- SPI (8bit, 0x00010030 - 0x00010034)
spi_sd_cs <= buss_sel_o(3-byte_sel);
spi_sd_wbs_i.cyc_i <= buss_cyc_o and spi_sd_ss;
spi_sd_wbs_i.stb_i <= buss_stb_o and spi_sd_ss and spi_sd_cs;
spi_sd_wbs_i.we_i <= buss_we_o;
spi_sd_wbs_i.dat_i <= buss_dat_o(8*(3-byte_sel)+7 downto 8*(3-byte_sel));
spi_sd_wbs_i.adr_i <= buss_adr_o(1 downto 0);
-- mem_bridge (32bit, 0x08000000 - 0x0C000000) -- mem_bridge (32bit, 0x08000000 - 0x0C000000)
mem_bridge_wbs_i.sel_i <= buss_sel_o; mem_bridge_wbs_i.sel_i <= buss_sel_o;
mem_bridge_wbs_i.adr_i <= buss_adr_o(25 downto 2); mem_bridge_wbs_i.adr_i <= buss_adr_o(25 downto 2);

227
tb/spi_tb.vhd Normal file
View File

@@ -0,0 +1,227 @@
-------------------------------------------------------------------------------
-- Title : Testbench for design "spi"
-- Project :
-------------------------------------------------------------------------------
-- File : spi_tb.vhd
-- Author : <matthias@pc>
-- Company :
-- Created : 2013-06-07
-- Last update: 2013-06-07
-- Platform :
-- Standard : VHDL'93/02
-------------------------------------------------------------------------------
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2013
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 2013-06-07 1.0 matthias Created
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use IEEE.NUMERIC_STD.ALL;
use work.intercon_package.all;
-------------------------------------------------------------------------------
entity spi_tb is
end entity spi_tb;
-------------------------------------------------------------------------------
architecture testbench of spi_tb is
-- component generics
constant dontcare : std_logic := '-';
constant clock_pol : std_logic := '1';
constant clock_phase : std_logic := '0';
-- component ports
signal clk_i : std_logic;
signal rst_i : std_logic := '1';
signal wbs_i : spi_wbs_i_type;
signal wbs_o : spi_wbs_o_type;
signal miso : std_logic;
signal mosi : std_logic;
signal sclk : std_logic;
signal ss : std_logic;
-- clock
signal clk : std_logic := '1';
begin -- architecture testbench
-- component instantiation
DUT: entity work.spi
generic map (
dontcare => dontcare,
clock_pol => clock_pol,
clock_phase => clock_phase)
port map (
clk_i => clk_i,
rst_i => rst_i,
wbs_i => wbs_i,
wbs_o => wbs_o,
miso => miso,
mosi => mosi,
sclk => sclk,
ss => ss);
-- clock generation
clk <= not clk after 10 ns;
clk_i <= clk;
wb_gen : process
variable got_data : boolean := false;
begin
wait for 100 ns;
rst_i <= '0';
wait until rising_edge(clk_i);
wait until rising_edge(clk_i);
-- Set output clock divider
wbs_i.we_i <= '1';
wbs_i.stb_i <= '1';
wbs_i.cyc_i <= '1';
wbs_i.adr_i <= "10";
wbs_i.dat_i <= x"03";
wait until rising_edge(clk_i);
while wbs_o.ack_o = '0' loop
wait until rising_edge(clk_i);
end loop;
wbs_i.stb_i <= '0';
while wbs_o.ack_o = '1' loop
wait until rising_edge(clk_i);
end loop;
wait until rising_edge(clk_i);
-- Select slave
wbs_i.we_i <= '1';
wbs_i.stb_i <= '1';
wbs_i.cyc_i <= '1';
wbs_i.adr_i <= "11";
wbs_i.dat_i <= x"00";
wait until rising_edge(clk_i);
while wbs_o.ack_o = '0' loop
wait until rising_edge(clk_i);
end loop;
wbs_i.stb_i <= '0';
while wbs_o.ack_o = '1' loop
wait until rising_edge(clk_i);
end loop;
wait until rising_edge(clk_i);
-- Send data
wbs_i.we_i <= '1';
wbs_i.stb_i <= '1';
wbs_i.cyc_i <= '1';
wbs_i.adr_i <= "00";
wbs_i.dat_i <= x"5a";
wait until rising_edge(clk_i);
while wbs_o.ack_o = '0' loop
wait until rising_edge(clk_i);
end loop;
wbs_i.stb_i <= '0';
while wbs_o.ack_o = '1' loop
wait until rising_edge(clk_i);
end loop;
wait until rising_edge(clk_i);
-- Wait for recvd data
while not got_data loop
wbs_i.we_i <= '0';
wbs_i.stb_i <= '1';
wbs_i.cyc_i <= '1';
wbs_i.adr_i <= "01";
wait until rising_edge(clk_i);
while wbs_o.ack_o = '0' loop
wait until rising_edge(clk_i);
end loop;
if wbs_o.dat_o(2) = '0' then
got_data := true;
end if;
wbs_i.stb_i <= '0';
while wbs_o.ack_o = '1' loop
wait until rising_edge(clk_i);
end loop;
wait until rising_edge(clk_i);
end loop;
-- Check recvd data
wbs_i.we_i <= '0';
wbs_i.stb_i <= '1';
wbs_i.cyc_i <= '1';
wbs_i.adr_i <= "00";
wait until rising_edge(clk_i);
while wbs_o.ack_o = '0' loop
wait until rising_edge(clk_i);
end loop;
assert wbs_o.dat_o = x"a5" report "Received data incorrect" severity error;
wbs_i.stb_i <= '0';
while wbs_o.ack_o = '1' loop
wait until rising_edge(clk_i);
end loop;
wait until rising_edge(clk_i);
-- Deselect slave
wbs_i.we_i <= '1';
wbs_i.stb_i <= '1';
wbs_i.cyc_i <= '1';
wbs_i.adr_i <= "11";
wbs_i.dat_i <= x"01";
wait until rising_edge(clk_i);
while wbs_o.ack_o = '0' loop
wait until rising_edge(clk_i);
end loop;
wbs_i.stb_i <= '0';
while wbs_o.ack_o = '1' loop
wait until rising_edge(clk_i);
end loop;
wait until rising_edge(clk_i);
wait;
end process wb_gen;
spi_gen : process
variable sreg : std_logic_vector(7 downto 0) := x"a5";
variable cap : std_logic;
begin
wait until rst_i = '0';
wait until rising_edge(clk_i);
wait until ss = '0';
miso <= sreg(7);
for i in 7 downto 1 loop
wait until rising_edge(sclk);
sreg(i) := mosi;
wait until falling_edge(sclk);
miso <= sreg(i-1);
end loop;
wait until rising_edge(sclk);
sreg(0) := mosi;
wait until ss = '1';
assert sreg = x"5a" report "Transmitted data incorrect" severity error;
wait;
end process spi_gen;
end architecture testbench;
-------------------------------------------------------------------------------
configuration spi_tb_testbench_cfg of spi_tb is
for testbench
end for;
end spi_tb_testbench_cfg;
-------------------------------------------------------------------------------

View File

@@ -6,7 +6,7 @@
-- Author : <Matthias@MATTHIAS-PC> -- Author : <Matthias@MATTHIAS-PC>
-- Company : -- Company :
-- Created : 2013-03-02 -- Created : 2013-03-02
-- Last update: 2013-06-03 -- Last update: 2013-06-07
-- Platform : -- Platform :
-- Standard : VHDL'87 -- Standard : VHDL'87
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
@@ -63,7 +63,11 @@ architecture testbench of toplevel_tb is
ddr2_ck : out std_logic_vector(0 downto 0); ddr2_ck : out std_logic_vector(0 downto 0);
ddr2_ck_n : out std_logic_vector(0 downto 0); ddr2_ck_n : out std_logic_vector(0 downto 0);
rs232_txd : out std_logic; rs232_txd : out std_logic;
rs232_rxd : in std_logic rs232_rxd : in std_logic;
sd_miso : in std_logic;
sd_mosi : out std_logic;
sd_cs : out std_logic;
sd_sck : out std_logic
); );
end component; end component;
@@ -116,6 +120,7 @@ architecture testbench of toplevel_tb is
signal ddr2_ck_n : std_logic_vector(0 downto 0); signal ddr2_ck_n : std_logic_vector(0 downto 0);
signal rs232_txd, rs232_rxd : std_logic := '1'; signal rs232_txd, rs232_rxd : std_logic := '1';
signal sd_mosi, sd_miso, sd_cs, sd_sck : std_logic := '0';
signal sim_done : boolean := false; signal sim_done : boolean := false;
@@ -159,10 +164,15 @@ begin -- testbench
ddr2_ck => ddr2_ck, ddr2_ck => ddr2_ck,
ddr2_ck_n => ddr2_ck_n, ddr2_ck_n => ddr2_ck_n,
rs232_txd => rs232_txd, rs232_txd => rs232_txd,
rs232_rxd => rs232_rxd); rs232_rxd => rs232_rxd,
sd_mosi => sd_mosi,
sd_miso => sd_miso,
sd_cs => sd_cs,
sd_sck => sd_sck);
rst_dqs_div_in <= rst_dqs_div_out after 100 ps; rst_dqs_div_in <= rst_dqs_div_out after 100 ps;
rs232_rxd <= rs232_txd;
ddr2_model_inst : ddr2_model port map ( ddr2_model_inst : ddr2_model port map (
ck => ddr2_ck(0), ck => ddr2_ck(0),
ck_n => ddr2_ck_n(0), ck_n => ddr2_ck_n(0),

File diff suppressed because it is too large Load Diff