- added RPD_BOARD_SIM
- cleaned up - reduced SDRAM CLock to 100 MHz git-svn-id: http://moon:8086/svn/vhdl/trunk@1219 cc03376c-175c-47c8-b038-4cd826a8556b
This commit is contained in:
@@ -35,7 +35,8 @@ entity ctrl_ddr_wb64 is
|
|||||||
BURST_LEN : natural := 2;
|
BURST_LEN : natural := 2;
|
||||||
F_SYSCLK : real := 100.0;
|
F_SYSCLK : real := 100.0;
|
||||||
F_SDRCLK : real := 100.0;
|
F_SDRCLK : real := 100.0;
|
||||||
FIFO_DEPTH : integer := 4
|
FIFO_DEPTH : integer := 4;
|
||||||
|
TPD_BOARD_SIM : time := 0 ns
|
||||||
);
|
);
|
||||||
Port
|
Port
|
||||||
(
|
(
|
||||||
@@ -120,7 +121,8 @@ begin
|
|||||||
inst_sdram_phy : entity work.sdram_phy
|
inst_sdram_phy : entity work.sdram_phy
|
||||||
Generic map
|
Generic map
|
||||||
(
|
(
|
||||||
F_SDRCLK => F_SDRCLK
|
F_SDRCLK => F_SDRCLK,
|
||||||
|
TPD_BOARD_SIM => TPD_BOARD_SIM
|
||||||
)
|
)
|
||||||
Port map
|
Port map
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -34,7 +34,8 @@ use UNISIM.vcomponents.all;
|
|||||||
entity sdram_phy is
|
entity sdram_phy is
|
||||||
Generic
|
Generic
|
||||||
(
|
(
|
||||||
F_SDRCLK : real := 100.0
|
F_SDRCLK : real := 100.0;
|
||||||
|
TPD_BOARD_SIM : time := 0 ns
|
||||||
);
|
);
|
||||||
Port
|
Port
|
||||||
(
|
(
|
||||||
@@ -68,7 +69,7 @@ architecture tech of sdram_phy is
|
|||||||
signal dqs : unsigned(PART_DQS_WIDTH-1 downto 0);
|
signal dqs : unsigned(PART_DQS_WIDTH-1 downto 0);
|
||||||
signal dqs_zen : unsigned(PART_DQS_WIDTH-1 downto 0);
|
signal dqs_zen : unsigned(PART_DQS_WIDTH-1 downto 0);
|
||||||
signal dqs_rst : std_logic;
|
signal dqs_rst : std_logic;
|
||||||
signal ddr_data_w : unsigned(PART_DATA_WIDTH-1 downto 0);
|
signal wr_data : unsigned(PART_DATA_WIDTH-1 downto 0);
|
||||||
signal data_r : unsigned(BUS_DATA_WIDTH-1 downto 0);
|
signal data_r : unsigned(BUS_DATA_WIDTH-1 downto 0);
|
||||||
signal data_reg_r : unsigned(BUS_DATA_WIDTH-1 downto 0);
|
signal data_reg_r : unsigned(BUS_DATA_WIDTH-1 downto 0);
|
||||||
signal drive270 : unsigned(PART_DATA_WIDTH-1 downto 0);
|
signal drive270 : unsigned(PART_DATA_WIDTH-1 downto 0);
|
||||||
@@ -77,10 +78,12 @@ architecture tech of sdram_phy is
|
|||||||
signal read_en : std_logic;
|
signal read_en : std_logic;
|
||||||
|
|
||||||
signal clk0 : std_logic;
|
signal clk0 : std_logic;
|
||||||
signal clk0_s : std_logic;
|
signal clk0_temp : std_logic;
|
||||||
signal rst0 : std_logic;
|
signal rst0 : std_logic;
|
||||||
signal clk_rd : std_logic;
|
signal clk0_rd : std_logic;
|
||||||
signal clk_wr : std_logic;
|
signal clk270_rd : std_logic;
|
||||||
|
signal clk270 : std_logic;
|
||||||
|
|
||||||
|
|
||||||
signal locked : std_logic;
|
signal locked : std_logic;
|
||||||
signal error : std_logic;
|
signal error : std_logic;
|
||||||
@@ -93,9 +96,9 @@ architecture tech of sdram_phy is
|
|||||||
|
|
||||||
begin
|
begin
|
||||||
|
|
||||||
clk0_out <= clk0_s;
|
clk0_out <= clk0_temp;
|
||||||
clk0 <= clk0_s after 10 ps; -- fix delta delay
|
clk0 <= clk0_temp after 10 ps; -- fix delta delay
|
||||||
rst0_out <= rst0;
|
rst0_out <= rst0;
|
||||||
|
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
inst_sdram_clk : entity work.sdram_clk
|
inst_sdram_clk : entity work.sdram_clk
|
||||||
@@ -111,10 +114,10 @@ inst_sdram_clk : entity work.sdram_clk
|
|||||||
rst => rst, -- external async reset, low active
|
rst => rst, -- external async reset, low active
|
||||||
clk_in => clk, -- system clock (e.g. 100MHz), from board
|
clk_in => clk, -- system clock (e.g. 100MHz), from board
|
||||||
clk_fb_in => clk_fb, -- feedback clock
|
clk_fb_in => clk_fb, -- feedback clock
|
||||||
clk0_0_out => clk0_s, -- System clock #0, dcm#0 output 0°
|
clk0_0_out => clk0_temp, -- System clock #0, dcm#0 output 0°
|
||||||
clk0_270_out => clk_wr, -- System clock #0, dcm#0 output 270°
|
clk0_270_out => clk270, -- System clock #0, dcm#0 output 270°
|
||||||
clk1_0_out => open, -- System clock #1 (e.g. clock for DDR-SDRAM data capture), dcm#1 output 0°
|
clk1_0_out => clk0_rd, -- System clock #1 (e.g. clock for DDR-SDRAM data capture), dcm#1 output 0°
|
||||||
clk1_270_out => clk_rd, -- System clock #1 (e.g. clock for DDR-SDRAM data capture), dcm#1 output 270°
|
clk1_270_out => clk270_rd, -- System clock #1 (e.g. clock for DDR-SDRAM data capture), dcm#1 output 270°
|
||||||
locked_out => locked, -- DCM locked status
|
locked_out => locked, -- DCM locked status
|
||||||
error_out => error
|
error_out => error
|
||||||
);
|
);
|
||||||
@@ -225,8 +228,8 @@ gen_ddr_data_out:
|
|||||||
SRTYPE => "SYNC" -- Reset Type ("ASYNC" or "SYNC")
|
SRTYPE => "SYNC" -- Reset Type ("ASYNC" or "SYNC")
|
||||||
)
|
)
|
||||||
port map (
|
port map (
|
||||||
Q => ddr_data_w(n), -- 1-bit DDR output
|
Q => wr_data(n), -- 1-bit DDR output
|
||||||
C => clk_wr, -- 1-bit clock input
|
C => clk270, -- 1-bit clock input
|
||||||
CE => '1', -- 1-bit clock enable input
|
CE => '1', -- 1-bit clock enable input
|
||||||
D1 => phy_in.wr_data(n + PART_DATA_WIDTH), -- 1-bit data input (positive edge)
|
D1 => phy_in.wr_data(n + PART_DATA_WIDTH), -- 1-bit data input (positive edge)
|
||||||
D2 => phy_in.wr_data(n), -- 1-bit data input (negative edge)
|
D2 => phy_in.wr_data(n), -- 1-bit data input (negative edge)
|
||||||
@@ -236,9 +239,9 @@ gen_ddr_data_out:
|
|||||||
end generate gen_ddr_data_out;
|
end generate gen_ddr_data_out;
|
||||||
|
|
||||||
-- Sample tristate on clock90
|
-- Sample tristate on clock90
|
||||||
process (clk_wr)
|
process (clk270)
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk_wr) then
|
if rising_edge(clk270) then
|
||||||
for n in 0 to PART_DATA_WIDTH-1 loop
|
for n in 0 to PART_DATA_WIDTH-1 loop
|
||||||
drive270(n) <= drive;
|
drive270(n) <= drive;
|
||||||
end loop;
|
end loop;
|
||||||
@@ -248,11 +251,11 @@ gen_ddr_data_out:
|
|||||||
-- Output mux
|
-- Output mux
|
||||||
out_mux_data:
|
out_mux_data:
|
||||||
for n in 0 to PART_DATA_WIDTH-1 generate
|
for n in 0 to PART_DATA_WIDTH-1 generate
|
||||||
part_data(n) <= ddr_data_w(n) when drive270(n) = '1' else 'Z';
|
part_data(n) <= wr_data(n) when drive270(n) = '1' else 'Z';
|
||||||
end generate;
|
end generate;
|
||||||
|
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- Data-mask OUT DDR-FFs
|
-- Part DM OUT DDR-FFs
|
||||||
gen_ddr_dm_out:
|
gen_ddr_dm_out:
|
||||||
for n in 0 to PART_DM_WIDTH-1 generate
|
for n in 0 to PART_DM_WIDTH-1 generate
|
||||||
begin
|
begin
|
||||||
@@ -265,7 +268,7 @@ gen_ddr_dm_out:
|
|||||||
)
|
)
|
||||||
port map (
|
port map (
|
||||||
Q => part_dm(n), -- 1-bit DDR output
|
Q => part_dm(n), -- 1-bit DDR output
|
||||||
C => clk_wr, -- 1-bit clock input
|
C => clk270, -- 1-bit clock input
|
||||||
CE => '1', -- 1-bit clock enable input
|
CE => '1', -- 1-bit clock enable input
|
||||||
D1 => phy_in.wr_dm(n + PART_DM_WIDTH), -- 1-bit data input (positive edge)
|
D1 => phy_in.wr_dm(n + PART_DM_WIDTH), -- 1-bit data input (positive edge)
|
||||||
D2 => phy_in.wr_dm(n), -- 1-bit data input (negative edge)
|
D2 => phy_in.wr_dm(n), -- 1-bit data input (negative edge)
|
||||||
@@ -297,30 +300,34 @@ gen_dqs_out:
|
|||||||
);
|
);
|
||||||
end generate gen_dqs_out;
|
end generate gen_dqs_out;
|
||||||
|
|
||||||
-- Tristate-Control fuer dqs
|
-- Part DQS Z-Control
|
||||||
|
proc_dqs_zen:
|
||||||
process (clk0) is
|
process (clk0) is
|
||||||
variable zctrl : boolean;
|
|
||||||
begin
|
begin
|
||||||
if rising_edge(clk0) then
|
if rising_edge(clk0) then
|
||||||
if dqs_drive = '1' then
|
dqs_zen <= (others => not dqs_drive);
|
||||||
zctrl := false;
|
|
||||||
else
|
|
||||||
zctrl := true;
|
|
||||||
end if;
|
|
||||||
if zctrl then
|
|
||||||
dqs_zen <= (others => '1');
|
|
||||||
else
|
|
||||||
dqs_zen <= (others => '0');
|
|
||||||
end if;
|
|
||||||
end if;
|
end if;
|
||||||
end process;
|
end process;
|
||||||
|
|
||||||
-- Tristate-Buffer fuer dqs
|
|
||||||
gen_out_mux_dqs:
|
gen_out_mux_dqs:
|
||||||
for n in 0 to PART_DQS_WIDTH-1 generate
|
for n in 0 to PART_DQS_WIDTH-1 generate
|
||||||
part_dqs(n) <= 'Z' when dqs_zen(n)='1' else dqs(n);
|
part_dqs(n) <= 'Z' when dqs_zen(n)='1' else dqs(n);
|
||||||
end generate gen_out_mux_dqs;
|
end generate gen_out_mux_dqs;
|
||||||
|
|
||||||
|
-- Part Control signals
|
||||||
|
process (clk0) is
|
||||||
|
begin
|
||||||
|
if falling_edge(clk0) then
|
||||||
|
part_ras_n <= part_ctrl_reg.cmd.ras_n;
|
||||||
|
part_cas_n <= part_ctrl_reg.cmd.cas_n;
|
||||||
|
part_we_n <= part_ctrl_reg.cmd.we_n;
|
||||||
|
part_cs_n <= part_ctrl_reg.cmd.cs_n;
|
||||||
|
part_ba <= part_ctrl_reg.ba;
|
||||||
|
part_addr <= part_ctrl_reg.addr;
|
||||||
|
part_cke <= part_ctrl_reg.cke;
|
||||||
|
end if;
|
||||||
|
end process;
|
||||||
|
|
||||||
------------------------------------------------------------------------------------------------------------------------------------------------
|
------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
process (clk0) is
|
process (clk0) is
|
||||||
begin
|
begin
|
||||||
@@ -336,19 +343,6 @@ gen_out_mux_dqs:
|
|||||||
end if;
|
end if;
|
||||||
end process;
|
end process;
|
||||||
|
|
||||||
process (clk0) is
|
|
||||||
begin
|
|
||||||
if falling_edge(clk0) then
|
|
||||||
part_ras_n <= part_ctrl_reg.cmd.ras_n;
|
|
||||||
part_cas_n <= part_ctrl_reg.cmd.cas_n;
|
|
||||||
part_we_n <= part_ctrl_reg.cmd.we_n;
|
|
||||||
part_cs_n <= part_ctrl_reg.cmd.cs_n;
|
|
||||||
part_ba <= part_ctrl_reg.ba;
|
|
||||||
part_addr <= part_ctrl_reg.addr;
|
|
||||||
part_cke <= part_ctrl_reg.cke;
|
|
||||||
end if;
|
|
||||||
end process;
|
|
||||||
|
|
||||||
-----------------------------------------------------------------
|
-----------------------------------------------------------------
|
||||||
-- READ DATA Processing
|
-- READ DATA Processing
|
||||||
-----------------------------------------------------------------
|
-----------------------------------------------------------------
|
||||||
@@ -367,7 +361,7 @@ gen_ddr_data_in:
|
|||||||
(
|
(
|
||||||
Q1 => data_r(n), -- 1-bit output for positive edge of clock
|
Q1 => data_r(n), -- 1-bit output for positive edge of clock
|
||||||
Q2 => data_r(n + PART_DATA_WIDTH), -- 1-bit output for negative edge of clock
|
Q2 => data_r(n + PART_DATA_WIDTH), -- 1-bit output for negative edge of clock
|
||||||
C => clk_rd, -- 1-bit clock input
|
C => clk270_rd, -- 1-bit clock input
|
||||||
CE => read_en, -- 1-bit clock enable input
|
CE => read_en, -- 1-bit clock enable input
|
||||||
D => part_data(n), -- 1-bit DDR data input
|
D => part_data(n), -- 1-bit DDR data input
|
||||||
R => '0', -- 1-bit reset
|
R => '0', -- 1-bit reset
|
||||||
@@ -377,9 +371,9 @@ gen_ddr_data_in:
|
|||||||
|
|
||||||
|
|
||||||
data_sample_stage:
|
data_sample_stage:
|
||||||
process (clk0)
|
process (clk0_rd)
|
||||||
begin
|
begin
|
||||||
if falling_edge(clk0) then
|
if falling_edge(clk0_rd) then
|
||||||
data_reg_r <= data_r;
|
data_reg_r <= data_r;
|
||||||
end if;
|
end if;
|
||||||
end process;
|
end process;
|
||||||
|
|||||||
@@ -34,7 +34,8 @@ end;
|
|||||||
architecture struct of tb_ctrl_ddr_wb64 is
|
architecture struct of tb_ctrl_ddr_wb64 is
|
||||||
|
|
||||||
constant CLK_PERIOD : time := 10 ns;
|
constant CLK_PERIOD : time := 10 ns;
|
||||||
constant SDCLK_PERIOD : time := 7.5 ns;
|
constant TPD_BOARD_SIM : time := 1 ns;
|
||||||
|
constant SDCLK_PERIOD : time := 10 ns;
|
||||||
constant BURST_LEN : natural := 2;
|
constant BURST_LEN : natural := 2;
|
||||||
|
|
||||||
signal sdclk : std_logic := '1';
|
signal sdclk : std_logic := '1';
|
||||||
@@ -109,7 +110,7 @@ begin
|
|||||||
end if;
|
end if;
|
||||||
end process;
|
end process;
|
||||||
|
|
||||||
sdclk_fb <= part_clk_p after 1 ns;
|
sdclk_fb <= part_clk_p;
|
||||||
|
|
||||||
DAT_O <= X"DEADBEEF" & sddat;
|
DAT_O <= X"DEADBEEF" & sddat;
|
||||||
SEL_O <= "0000" & sdsel;
|
SEL_O <= "0000" & sdsel;
|
||||||
@@ -120,8 +121,9 @@ begin
|
|||||||
(
|
(
|
||||||
BURST_LEN => BURST_LEN,
|
BURST_LEN => BURST_LEN,
|
||||||
F_SYSCLK => 100.000,
|
F_SYSCLK => 100.000,
|
||||||
F_SDRCLK => 133.333,
|
F_SDRCLK => 100.000,
|
||||||
FIFO_DEPTH => 4
|
FIFO_DEPTH => 4,
|
||||||
|
TPD_BOARD_SIM => TPD_BOARD_SIM
|
||||||
)
|
)
|
||||||
PORT MAP
|
PORT MAP
|
||||||
(
|
(
|
||||||
|
|||||||
Reference in New Issue
Block a user