diff --git a/cMIPS/bin/edMemory.sh b/cMIPS/bin/edMemory.sh index 74acc9c5533b3e89e3963a0820671bb7d67e49ee..5905b0d8fec2cef61e2073bf635e9408985441db 100755 --- a/cMIPS/bin/edMemory.sh +++ b/cMIPS/bin/edMemory.sh @@ -56,7 +56,7 @@ hdr="${include}"/cMIPS.h asm="${include}"/cMIPS.s -VARIABLES="x_INST_BASE_ADDR x_INST_MEM_SZ x_DATA_BASE_ADDR x_DATA_MEM_SZ x_IO_BASE_ADDR x_IO_MEM_SZ x_IO_ADDR_RANGE" +VARIABLES="x_INST_BASE_ADDR x_INST_MEM_SZ x_DATA_BASE_ADDR x_DATA_MEM_SZ x_IO_BASE_ADDR x_IO_MEM_SZ x_IO_ADDR_RANGE x_SDRAM_BASE_ADDR x_SDRAM_MEM_SZ" EXCEPTION_VECTORS="x_EXCEPTION_0000 x_EXCEPTION_0100 x_EXCEPTION_0180 x_EXCEPTION_0200 x_EXCEPTION_BFC0 x_ENTRY_POINT" diff --git a/cMIPS/include/cMIPS.h b/cMIPS/include/cMIPS.h index 9a881a5605595eb567539ca0a22317dc1705d348..d718c68f882fa6720170270cb2988e5a3cc55d76 100644 --- a/cMIPS/include/cMIPS.h +++ b/cMIPS/include/cMIPS.h @@ -1,9 +1,11 @@ -#define x_INST_BASE_ADDR 0x00000000 -#define x_DATA_BASE_ADDR 0x00010000 -#define x_IO_BASE_ADDR 0x0F000000 -#define x_IO_MEM_SZ 0x00002000 -#define x_IO_ADDR_RANGE 0x00000020 +#define x_INST_BASE_ADDR 0x00000000 +#define x_DATA_BASE_ADDR 0x00010000 +#define x_SDRAM_BASE_ADDR 0x04000000 +#define x_SDRAM_MEM_SZ 0x02000000 +#define x_IO_BASE_ADDR 0x3c000000 +#define x_IO_MEM_SZ 0x00002000 +#define x_IO_ADDR_RANGE 0x00000020 #define x_IO_ADDR_MASK (0 - x_IO_ADDR_RANGE) diff --git a/cMIPS/include/cMIPS.ld b/cMIPS/include/cMIPS.ld index 2855338e14d23d101492771311b040f5d5599e02..9f4bd2cc4fad09fae1c042d7c37c8602c216e6bd 100644 --- a/cMIPS/include/cMIPS.ld +++ b/cMIPS/include/cMIPS.ld @@ -7,7 +7,9 @@ MEMORY LENGTH = 0x00004000, /* x_INST_MEM_SZ */ ram (!rx) : ORIGIN = 0x00010000, /* x_DATA_BASE_ADDR */ LENGTH = 0x00008000, /* x_DATA_MEM_SZ */ - io (!rx) : ORIGIN = 0x0f000000, /* not used, do not remove */ + sdram (!rx) : ORIGIN = 0x04000000, /* x_SDRAM_BASE_ADDR */ + LENGTH = 0x02000000, /* x_SDRAM_MEM_SZ */ + io (!rx) : ORIGIN = 0x3c000000, /* not used, do not remove */ LENGTH = 0x00020000 /* edMemory.sh needs thess lines */ } diff --git a/cMIPS/include/cMIPS.s b/cMIPS/include/cMIPS.s index c9d5283d26a93c51554e37af9c15060b77e27a7c..d6636a560114ca566e352eeb84910eadebd6ce6f 100644 --- a/cMIPS/include/cMIPS.s +++ b/cMIPS/include/cMIPS.s @@ -6,10 +6,13 @@ .set x_DATA_BASE_ADDR,0x00010000 .set x_DATA_MEM_SZ,0x00008000 - .set x_IO_BASE_ADDR,0x0F000000 + .set x_IO_BASE_ADDR,0x3c000000 .set x_IO_MEM_SZ,0x00002000 .set x_IO_ADDR_RANGE,0x00000020 + .set x_SDRAM_BASE_ADDR,0x04000000 + .set x_SDRAM_MEM_SZ,0x02000000 + .set HW_counter_addr,(x_IO_BASE_ADDR + 5 * x_IO_ADDR_RANGE) .set HW_FPU_addr, (x_IO_BASE_ADDR + 6 * x_IO_ADDR_RANGE) .set HW_uart_addr, (x_IO_BASE_ADDR + 7 * x_IO_ADDR_RANGE) diff --git a/cMIPS/tests/sdram1.s b/cMIPS/tests/sdram1.s new file mode 100644 index 0000000000000000000000000000000000000000..1c57098c250b97ef460bcec6527ff9449ce9cf4b --- /dev/null +++ b/cMIPS/tests/sdram1.s @@ -0,0 +1,48 @@ +# Test SDRAM's address range +# read from 4 distinct sdram rows + + .include "cMIPS.s" + .text + .align 2 + .set noreorder + .globl _start + .ent _start + + .set HW_stdout_addr,(x_IO_BASE_ADDR + 1 * x_IO_ADDR_RANGE) + + .set SDRAM_base,x_SDRAM_BASE_ADDR + .set S_row,(8*4) + +_start: nop + la $20, HW_stdout_addr + la $10, SDRAM_base + + +snd: lw $3, 0($10) + li $5, 1 + li $5, 2 + + lw $3, 1*S_row($10) + li $5, 3 + li $5, 4 + + lw $3, 2*S_row($10) + li $5, 5 + li $5, 6 + + lw $3, 3*S_row($10) + li $5, 7 + li $5, 8 + + li $5, 9 + li $5, 10 + +end: nop + nop + nop + nop + nop + wait 0 + nop + nop + .end _start diff --git a/cMIPS/vhdl/core.vhd b/cMIPS/vhdl/core.vhd index 1521267c514c385973a6cf5950335b1dba998509..2ba0c4fe2ece8525a86641646353c041d448fbbf 100644 --- a/cMIPS/vhdl/core.vhd +++ b/cMIPS/vhdl/core.vhd @@ -3011,14 +3011,14 @@ begin - -- TLB entry 6 -- initialized to 5th,6th pages of RAM + -- TLB entry 6 -- initialized to 1st,2nd pages of SDRAM - MMU_TAG6: register32 generic map(MMU_ini_tag_RAM4) + MMU_TAG6: register32 generic map(MMU_ini_tag_SDR0) port map (clk, rst, tlb_tag6_updt, tlb_tag_inp, tlb_tag6); - MMU_DAT6_0: registerN generic map(DAT_REG_BITS, MMU_ini_dat_RAM4) -- d=1,v=1,g=1 + MMU_DAT6_0: registerN generic map(DAT_REG_BITS, MMU_ini_dat_SDR0) -- d=1,v=1,g=1 port map (clk, rst, tlb_dat6_updt, tlb_dat0_inp, tlb_dat6_0); - MMU_DAT6_1: registerN generic map(DAT_REG_BITS, MMU_ini_dat_RAM5) -- d=1,v=1,g=1 + MMU_DAT6_1: registerN generic map(DAT_REG_BITS, MMU_ini_dat_SDR1) -- d=1,v=1,g=1 port map (clk, rst, tlb_dat6_updt, tlb_dat1_inp, tlb_dat6_1); hit6_pc <= TRUE when (tlb_tag6(VA_HI_BIT downto VA_LO_BIT) = PC(VA_HI_BIT downto VA_LO_BIT) diff --git a/cMIPS/vhdl/packageMemory.vhd b/cMIPS/vhdl/packageMemory.vhd index 36a866b80c742750ec9b7ef94223fd3110697923..e8e4f3c4c215ed820a2ae1d85f3630d948bc17ff 100644 --- a/cMIPS/vhdl/packageMemory.vhd +++ b/cMIPS/vhdl/packageMemory.vhd @@ -204,7 +204,8 @@ package p_MEMORY is constant DAT_AHI_BIT : natural := DAT_ALO_BIT + PPN_BITS - 1; constant DAT_REG_BITS : natural := DAT_ALO_BIT + PPN_BITS; - constant ContextPTE_init : reg9 := b"000000000"; + constant ContextPTE_init : reg9 := b"000000000"; + constant mmu_PageMask : reg32 := x"00001800"; -- pg 68, 4k pages only subtype mmu_dat_reg is std_logic_vector (DAT_AHI_BIT downto 0); @@ -256,7 +257,7 @@ package p_MEMORY is x_ROM_PPN_7(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 - -- physical addresses for 8 ROM pages + -- physical addresses for 8 RAM pages constant x_RAM_PPN_0 : reg32 := std_logic_vector(to_signed(DATA_BASE_ADDR + 0*PAGE_SZ, 32)); constant x_RAM_PPN_1 : reg32 := std_logic_vector(to_signed(DATA_BASE_ADDR + 1*PAGE_SZ, 32)); @@ -303,8 +304,41 @@ package p_MEMORY is constant MMU_ini_dat_IO1 : mmu_dat_reg := x_IO_PPN_1(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 + + -- physical addresses for 8 SDRAM pages + + constant x_SDRAM_PPN_0 : reg32 := std_logic_vector(to_signed(SDRAM_BASE_ADDR + 0*PAGE_SZ, 32)); + constant x_SDRAM_PPN_1 : reg32 := std_logic_vector(to_signed(SDRAM_BASE_ADDR + 1*PAGE_SZ, 32)); + constant x_SDRAM_PPN_2 : reg32 := std_logic_vector(to_signed(SDRAM_BASE_ADDR + 2*PAGE_SZ, 32)); + constant x_SDRAM_PPN_3 : reg32 := std_logic_vector(to_signed(SDRAM_BASE_ADDR + 3*PAGE_SZ, 32)); + constant x_SDRAM_PPN_4 : reg32 := std_logic_vector(to_signed(SDRAM_BASE_ADDR + 4*PAGE_SZ, 32)); + constant x_SDRAM_PPN_5 : reg32 := std_logic_vector(to_signed(SDRAM_BASE_ADDR + 5*PAGE_SZ, 32)); + constant x_SDRAM_PPN_6 : reg32 := std_logic_vector(to_signed(SDRAM_BASE_ADDR + 6*PAGE_SZ, 32)); + constant x_SDRAM_PPN_7 : reg32 := std_logic_vector(to_signed(SDRAM_BASE_ADDR + 7*PAGE_SZ, 32)); - constant mmu_PageMask : reg32 := x"00001800"; -- pg 68, 4k pages only + constant MMU_ini_tag_SDR0 : reg32 := (x_SDRAM_PPN_0 and tag_mask) or tag_g; + constant MMU_ini_dat_SDR0 : mmu_dat_reg := + x_SDRAM_PPN_0(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 + constant MMU_ini_dat_SDR1 : mmu_dat_reg := + x_SDRAM_PPN_1(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 + + constant MMU_ini_tag_SDR2 : reg32 := (x_SDRAM_PPN_2 and tag_mask) or tag_g; + constant MMU_ini_dat_SDR2 : mmu_dat_reg := + x_SDRAM_PPN_2(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 + constant MMU_ini_dat_SDR3 : mmu_dat_reg := + x_SDRAM_PPN_3(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 + + constant MMU_ini_tag_SDR4 : reg32 := (x_SDRAM_PPN_4 and tag_mask) or tag_g; + constant MMU_ini_dat_SDR4 : mmu_dat_reg := + x_SDRAM_PPN_4(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 + constant MMU_ini_dat_SDR5 : mmu_dat_reg := + x_SDRAM_PPN_5(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 + + constant MMU_ini_tag_SDR6 : reg32 := (x_SDRAM_PPN_6 and tag_mask) or tag_g; + constant MMU_ini_dat_SDR6 : mmu_dat_reg := + x_SDRAM_PPN_6(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 + constant MMU_ini_dat_SDR7 : mmu_dat_reg := + x_SDRAM_PPN_7(PABITS-1 downto PAGE_SZ_BITS) & b"000111"; -- d,v,g=1 end p_MEMORY; diff --git a/cMIPS/vhdl/sdram.vhd b/cMIPS/vhdl/sdram.vhd index 4b6191b33dcb28113025ad3f8d234db92a0e780e..d86f4346ac762cf6974e249f40c7a2997ce8e1a2 100644 --- a/cMIPS/vhdl/sdram.vhd +++ b/cMIPS/vhdl/sdram.vhd @@ -34,9 +34,10 @@ use work.p_memory.all; entity SDRAM_controller is port (rst : in std_logic; -- FPGA reset (=0) + clk : in std_logic; -- CPU clock clk2x : in std_logic; -- 100MHz clock - hcs : in std_logic; -- host side chip select (=0) + sel : in std_logic; -- host side chip select (=0) rdy : out std_logic; -- tell CPU to wait (=0) wr : in std_logic; -- host side write enable (=0) bsel : in reg4; -- byte select @@ -94,32 +95,6 @@ entity SDRAM_controller is end entity SDRAM_controller; --- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ --- fake SDRAM controller for Macnica's development board Mercurio IV --- IS42S16320B, 512Mbit SDRAM, 146MHz, 32Mx16bit --- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -architecture fake of SDRAM_controller is -begin - - rdy <= '1'; - hDout <= (others => 'X'); - - cke <= '1'; - scs <= '1'; - ras <= '1'; - cas <= '1'; - we <= '1'; - dqm0 <= '1'; - dqm1 <= '1'; - ba0 <= '1'; - ba1 <= '1'; - saddr <= (others => 'X'); - sdata <= (others => 'X'); - -end architecture fake; --- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - -- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -- real SDRAM controller for Macnica's development board Mercurio IV -- IS42S16320B, 512Mbit SDRAM, 146MHz, 32Mx16bit @@ -150,6 +125,19 @@ architecture simple of SDRAM_controller is Q: out std_logic_vector); end component registerN; + component wait_states is + generic (NUM_WAIT_STATES :integer); + port(rst : in std_logic; + clk : in std_logic; + sel : in std_logic; -- active in '0' + waiting : out std_logic); -- active in '1' + end component wait_states; + + component FFDsimple is + port(clk, rst, D : in std_logic; Q : out std_logic); + end component FFDsimple; + + -- state machine type ctrl_state is (st_noreset, -- 0 @@ -179,9 +167,24 @@ architecture simple of SDRAM_controller is signal ld_old : std_logic; signal command : t_cmd_type; signal doit : cmd_index; + + signal wait1, wait2, waiting : std_logic; begin -- simple + + U_WAIT_ON_READS: wait_states generic map (1) + port map (rst, clk, sel, wait1); + + U_WAIT2: FFDsimple port map (clk, rst, wait1, wait2); + + rdy <= not BOOL2SL((sel = '0') and + ((wait1 = '1') or (wait2 = '1') or (waiting = '1'))); + + is_accs <= (sel = '0'); + is_rd <= (sel = '0') and (wr = '1'); + is_wr <= (sel = '0') and (wr = '0'); + command <= cmd_table(doit); scs <= command.cs; ras <= command.ras; @@ -197,7 +200,7 @@ begin -- simple addr(9 downto 0); U_address: registerN generic map (26, b"00"&x"000000") - port map (clk2x, rst, hcs, haddr, addr); + port map (clk2x, rst, sel, haddr, addr); row_bits <= addr(23 downto 11); col_bits <= addr(10 downto 1); @@ -205,11 +208,12 @@ begin -- simple ba1 <= addr(25); - ld_old <= hcs and not(BOOL2SL(same_row)); + ld_old <= sel and not(BOOL2SL(same_row)); U_last_row: registerN generic map (13, '1'&x"fff") port map (clk2x, rst, ld_old, haddr(23 downto 11), last_row); - same_row <= (last_row = row_bits) and (command.cmd /= cPALL); +-- same_row <= (last_row = row_bits) and (command.cmd /= cPALL); + same_row <= FALSE; @@ -238,7 +242,7 @@ begin -- simple else next_st <= st_noreset; end if; - + -- INITIALIZATION SEQUENCE when st_in0 => -- 1 nop next_st <= st_in1; @@ -394,7 +398,6 @@ begin -- simple end case; end process U_CTRL_st_transitions; --------------------------- - U_CTRL_outputs: process(curr_st) ------------------------------ begin @@ -420,10 +423,33 @@ begin -- simple when others => doit <= cNOP; end case; - end process U_CTRL_outputs; ------------------------------------------- + end process U_CTRL_outputs; ---------------------------------- + U_CTRL_waiting: process(curr_st) ------------------------------ + begin + case curr_st is + when st_rdcol | st_rdn0 => + waiting <= '0'; -- read from column + + when st_wrcol => + waiting <= '0'; -- write to column + + when st_ipre | st_pall => + waiting <= '0'; -- precharge all banks + when st_aref1 | st_aref2 | st_aref3 | st_aref4 => + waiting <= '0'; -- auto-refresh + when st_lmr => + waiting <= '0'; -- load mode register + + when st_act | st_an0 | st_an1 => + waiting <= '0'; -- activate row + + when others => + waiting <= '1'; + end case; + end process U_CTRL_waiting; ----------------------------------- @@ -477,3 +503,29 @@ end simple; -- --------------------------------------------------------------------- + +-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +-- fake SDRAM controller for Macnica's development board Mercurio IV +-- IS42S16320B, 512Mbit SDRAM, 146MHz, 32Mx16bit +-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +architecture fake of SDRAM_controller is +begin + + rdy <= '1'; + hDout <= (others => 'X'); + + cke <= '1'; + scs <= '1'; + ras <= '1'; + cas <= '1'; + we <= '1'; + dqm0 <= '1'; + dqm1 <= '1'; + ba0 <= '1'; + ba1 <= '1'; + saddr <= (others => 'X'); + sdata <= (others => 'X'); + +end architecture fake; +-- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + diff --git a/cMIPS/vhdl/tb_cMIPS.vhd b/cMIPS/vhdl/tb_cMIPS.vhd index 2ccd1757bf2aeab841191de7f022fc87d4757470..5bddc874f5f9f9d69f07829d81c7ca31958fee74 100644 --- a/cMIPS/vhdl/tb_cMIPS.vhd +++ b/cMIPS/vhdl/tb_cMIPS.vhd @@ -259,8 +259,9 @@ architecture TB of tb_cMIPS is component SDRAM_controller is port (rst : in std_logic; -- FPGA reset (=0) + clk : in std_logic; -- CPU clock clk2x : in std_logic; -- 100MHz clock - hcs : in std_logic; -- host side chip select (=0) + sel : in std_logic; -- host side chip select (=0) rdy : out std_logic; -- tell CPU to wait (=0) wr : in std_logic; -- host side write enable (=0) bsel : in reg4; -- byte select @@ -414,7 +415,7 @@ architecture TB of tb_cMIPS is signal irq : reg6; signal inst_aVal, inst_wait, rom_rdy : std_logic; signal data_aVal, data_wait, ram_rdy, mem_wr : std_logic; - signal sdram_aVal, sdram_rdy, sdram_wr : std_logic; + signal sdram_aVal, sdram_wait, sdram_wr : std_logic; signal cpu_xfer, mem_xfer : reg4; signal dev_select, dev_select_ram, dev_select_io, dev_select_sdram : reg4; signal io_print_sel : std_logic := '1'; @@ -456,24 +457,11 @@ architecture TB of tb_cMIPS is signal LCD_RS, LCD_RW, LCD_EN, LCD_BLON : std_logic; -- LCD control signal uart_txd, uart_rxd, uart_rts, uart_cts, uart_irq : std_logic; - - signal hcs : std_logic; -- host side chip select (=0) - signal haddr : reg26; -- host side address - signal hDinp : reg32; -- host side data input - signal hDout : reg32; -- host side data output - signal sdcke : std_logic; -- ram side clock enable - signal sdscs : std_logic; -- ram side chip select - signal sdras : std_logic; -- ram side RAS - signal sdcas : std_logic; -- ram side CAS - signal sdwe : std_logic; -- ram side write enable - signal sddqm0 : std_logic; -- ram side byte0 output enable - signal sddqm1 : std_logic; -- ram side byte0 output enable - signal sdba0 : std_logic; -- ram side bank select 0 - signal sdba1 : std_logic; -- ram side bank select 1 - signal sdaddr : reg12; -- ram side address - signal sddata : reg16; -- ram side data - - + signal sdcke, sdscs, sdras, sdcas, sdwe : std_logic; -- SDRAM + signal sddqm0, sddqm1, sdba0, sdba1 : std_logic; + signal sdaddr : reg12; + signal sddata : reg16; + signal hDinp, hDout : reg32; begin -- TB @@ -484,7 +472,6 @@ begin -- TB -- pll_io : mf_altpll_io port map (areset => a_reset, inclk0 => clock_50mhz, -- c0 => clk2x, c1 => clk4x0, c2 => clk4x180); - clk2x <= '0'; clk4x0 <= '0'; clk4x180 <= '0'; @@ -514,20 +501,21 @@ begin -- TB cpu_i_wait <= inst_wait; - cpu_d_wait <= data_wait and io_wait; + cpu_d_wait <= data_wait and io_wait and sdram_wait; io_wait <= io_lcd_wait and io_fpu_wait; - not_waiting <= (inst_wait and data_wait); -- and io_wait); + not_waiting <= (inst_wait and data_wait and sdram_wait); -- and io_wait); -- irq <= b"000000"; -- NO interrupt requests irq <= uart_irq & counter_irq & b"0000"; -- uart+counter interrupts -- irq <= counter_irq & b"00000"; -- counter interrupts nmi <= '0'; -- input port to TB - U_CORE: core port map (cpu_reset, clk, phi1,phi2,phi3, - cpu_i_aVal, cpu_i_wait, i_addr, cpu_instr, - cpu_d_aVal, cpu_d_wait, d_addr, cpu_data_inp, cpu_data, - wr, cpu_xfer, nmi, irq, i_busError, d_busError); + U_CORE: core + port map (cpu_reset, clk, phi1,phi2,phi3, + cpu_i_aVal, cpu_i_wait, i_addr, cpu_instr, + cpu_d_aVal, cpu_d_wait, d_addr, cpu_data_inp, cpu_data, + wr, cpu_xfer, nmi, irq, i_busError, d_busError); U_INST_ADDR_DEC: inst_addr_decode port map (rst, cpu_i_aVal, i_addr, inst_aVal, i_busError); @@ -542,7 +530,8 @@ begin -- TB port map (rst, clk, mem_i_sel,rom_rdy, phi3, mem_i_addr,datrom); U_DATA_BUS_ERROR_DEC: busError_addr_decode - port map (rst, cpu_d_aVal, d_addr, d_busError); + port map (rst, cpu_d_aVal, d_addr, open); + d_busError <= '1'; -- only while testing the SDRAM U_IO_ADDR_DEC: io_addr_decode port map (phi0, rst, cpu_d_aVal, d_addr, dev_select_io, @@ -585,10 +574,11 @@ begin -- TB mem_addr, datram_out, datram_inp, mem_xfer, dump_ram); U_SDRAMc: SDRAM_controller port map - (rst, clk, sdram_aVal, sdram_rdy, wr, cpu_xfer, d_addr(25 downto 0), - hDinp,hDout, + (rst, clk, clk2x, sdram_aVal, sdram_wait, wr, + cpu_xfer, d_addr(25 downto 0), hDinp,hDout, sdcke,sdscs,sdras,sdcas,sdwe,sddqm0,sddqm1,sdba0,sdba1,sdaddr,sddata); + sdcke <= '1'; U_to_stdout: to_stdout port map (rst,clk, io_stdout_sel, wr, cpu_data); @@ -657,9 +647,15 @@ begin -- TB U_clock: process -- simulate external clock begin clock_50mhz <= '1'; - wait for CLOCK_PER / 2; + clk2x <= '1'; + wait for CLOCK_PER / 4; + clk2x <= '0'; + wait for CLOCK_PER / 4; clock_50mhz <= '0'; - wait for CLOCK_PER / 2; + clk2x <= '1'; + wait for CLOCK_PER / 4; + clk2x <= '0'; + wait for CLOCK_PER / 4; end process; -- ------------------------------------------------------- -- simulate reset switch bounces