Merge pull request #12 from AngeloJacobo/remove_ioserdes_loopback
Remove IOSERDES loopback for bitslip training to make more friendly for OpenXC7 tool
This commit is contained in:
commit
0c41a271d9
|
|
@ -0,0 +1,70 @@
|
|||
PROJECT = ax7103_ddr3
|
||||
FAMILY = artix7
|
||||
PART = xc7a100tfgg484-2
|
||||
CHIPDB = ${ARTIX7_CHIPDB}
|
||||
ADDITIONAL_SOURCES = ../../rtl/ddr3_controller.v ../../rtl/ddr3_phy.v ../../rtl/ddr3_top.v uart_rx.v uart_tx.v clk_wiz.v
|
||||
|
||||
#############################################################################################
|
||||
NEXTPNR_XILINX_DIR ?= /snap/openxc7/current/opt/nextpnr-xilinx
|
||||
NEXTPNR_XILINX_PYTHON_DIR ?= ${NEXTPNR_XILINX_DIR}/python
|
||||
PRJXRAY_DB_DIR ?= ${NEXTPNR_XILINX_DIR}/external/prjxray-db
|
||||
|
||||
DBPART = $(shell echo ${PART} | sed -e 's/-[0-9]//g')
|
||||
SPEEDGRADE = $(shell echo ${PART} | sed -e 's/.*\-\([0-9]\)/\1/g')
|
||||
|
||||
CHIPDB ?= ./
|
||||
ifeq ($(CHIPDB),)
|
||||
CHIPDB = ./
|
||||
endif
|
||||
|
||||
PYPY3 ?= pypy3
|
||||
|
||||
TOP ?= ${PROJECT}
|
||||
TOP_MODULE ?= ${TOP}
|
||||
TOP_VERILOG ?= ${TOP}.v
|
||||
|
||||
PNR_DEBUG ?= # --verbose --debug
|
||||
|
||||
BOARD ?= UNKNOWN
|
||||
JTAG_LINK ?= --board ${BOARD}
|
||||
|
||||
XDC ?= ${PROJECT}.xdc
|
||||
|
||||
.PHONY: all
|
||||
all: ${PROJECT}.bit
|
||||
|
||||
.PHONY: program
|
||||
program: ${PROJECT}.bit
|
||||
openFPGALoader ${JTAG_LINK} --bitstream $<
|
||||
|
||||
${PROJECT}.json: ${TOP_VERILOG} ${ADDITIONAL_SOURCES}
|
||||
yosys -p "synth_xilinx -flatten -abc9 ${SYNTH_OPTS} -arch xc7 -top ${TOP_MODULE}; write_json ${PROJECT}.json" $< ${ADDITIONAL_SOURCES}
|
||||
|
||||
# The chip database only needs to be generated once
|
||||
# that is why we don't clean it with make clean
|
||||
${CHIPDB}/${DBPART}.bin:
|
||||
${PYPY3} ${NEXTPNR_XILINX_PYTHON_DIR}/bbaexport.py --device ${PART} --bba ${DBPART}.bba
|
||||
bbasm -l ${DBPART}.bba ${CHIPDB}/${DBPART}.bin
|
||||
rm -f ${DBPART}.bba
|
||||
|
||||
${PROJECT}.fasm: ${PROJECT}.json ${CHIPDB}/${DBPART}.bin ${XDC}
|
||||
nextpnr-xilinx --chipdb ${CHIPDB}/${DBPART}.bin --xdc ${XDC} --json ${PROJECT}.json --fasm $@ ${PNR_ARGS} ${PNR_DEBUG}
|
||||
|
||||
${PROJECT}.frames: ${PROJECT}.fasm
|
||||
fasm2frames --part ${PART} --db-root ${PRJXRAY_DB_DIR}/${FAMILY} $< > $@
|
||||
|
||||
${PROJECT}.bit: ${PROJECT}.frames
|
||||
xc7frames2bit --part_file ${PRJXRAY_DB_DIR}/${FAMILY}/${PART}/part.yaml --part_name ${PART} --frm_file $< --output_file $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@rm -f *.bit
|
||||
@rm -f *.frames
|
||||
@rm -f *.fasm
|
||||
@rm -f *.json
|
||||
@rm -f *.bin
|
||||
@rm -f *.bba
|
||||
|
||||
.PHONY: pnrclean
|
||||
pnrclean:
|
||||
rm *.fasm *.frames *.bit
|
||||
Binary file not shown.
|
|
@ -3,7 +3,7 @@
|
|||
// Filename: ax7103_ddr3.v
|
||||
// Project: UberDDR3 - An Open Source DDR3 Controller
|
||||
//
|
||||
// Purpose: Example demo of UberDDR3 for ALINX AX7103 (c7a100tfgg484-2). Mechanism:
|
||||
// Purpose: Example demo of UberDDR3 for ALINX AX7103 (xc7a100tfgg484-2). Mechanism:
|
||||
// - four LEDs will light up once UberDDR3 is done calibrating
|
||||
// - if UART (9600 Baud Rate)receives small letter ASCII (a-z), this value will be written to DDR3
|
||||
// - if UART receives capital letter ASCII (A-Z), the small letter equivalent will be retrieved from DDR3 by doing
|
||||
|
|
@ -41,10 +41,10 @@
|
|||
input wire sys_clk_n, //system clock negative on board
|
||||
input wire i_rst_n,
|
||||
// DDR3 I/O Interface
|
||||
output wire[0:0] ddr3_ck_p, ddr3_ck_n,
|
||||
output wire ddr3_ck_p, ddr3_ck_n,
|
||||
output wire ddr3_reset_n,
|
||||
output wire[0:0] ddr3_cke,
|
||||
output wire[0:0] ddr3_cs_n,
|
||||
output wire ddr3_cke,
|
||||
output wire ddr3_cs_n,
|
||||
output wire ddr3_ras_n,
|
||||
output wire ddr3_cas_n,
|
||||
output wire ddr3_we_n,
|
||||
|
|
@ -53,7 +53,7 @@
|
|||
inout wire[32-1:0] ddr3_dq,
|
||||
inout wire[4-1:0] ddr3_dqs_p, ddr3_dqs_n,
|
||||
output wire[4-1:0] ddr3_dm,
|
||||
output wire[0:0] ddr3_odt,
|
||||
output wire ddr3_odt,
|
||||
// UART line
|
||||
input wire rx,
|
||||
output wire tx,
|
||||
|
|
@ -83,7 +83,7 @@
|
|||
reg[7:0] i_wb_data;
|
||||
reg[7:0] i_wb_addr;
|
||||
// o_debug1 taps on value of state_calibrate (can be traced inside ddr3_controller module)
|
||||
assign led[0] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[0] = !(o_debug1[4:0] != 23); //light up if not at DONE_CALIBRATE
|
||||
assign led[1] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[2] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[3] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
|
|
@ -114,10 +114,10 @@
|
|||
clk_wiz clk_wiz_inst
|
||||
(
|
||||
// Clock out ports
|
||||
.clk_out1(i_controller_clk), //100 Mhz
|
||||
.clk_out2(i_ddr3_clk), // 400 MHz
|
||||
.clk_out1(i_controller_clk), //83.333 Mhz
|
||||
.clk_out2(i_ddr3_clk), // 333.333 MHz
|
||||
.clk_out3(i_ref_clk), // 200 MHz
|
||||
.clk_out4(i_ddr3_clk_90), // 400 MHz 90-degree
|
||||
.clk_out4(i_ddr3_clk_90), // 333.333 MHz 90-degree
|
||||
// Status and control signals
|
||||
.reset(!i_rst_n),
|
||||
.locked(clk_locked),
|
||||
|
|
@ -125,26 +125,56 @@
|
|||
.clk_in1(sys_clk_200MHz)
|
||||
);
|
||||
|
||||
// UART module from https://github.com/alexforencich/verilog-uart
|
||||
uart #(.DATA_WIDTH(8)) uart_m
|
||||
(
|
||||
.clk(i_controller_clk),
|
||||
.rst(!i_rst_n),
|
||||
.s_axis_tdata(o_wb_data),
|
||||
.s_axis_tvalid(o_wb_ack),
|
||||
.s_axis_tready(),
|
||||
.m_axis_tdata(rd_data),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(1),
|
||||
.rxd(rx),
|
||||
.txd(tx),
|
||||
.prescale(1302) //9600 Baud Rate: 100MHz/(8*9600)
|
||||
// UART TX/RXmodule from https://github.com/ben-marshall/uart
|
||||
uart_tx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_tx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(i_rst_n && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_txd(tx), // UART transmit pin.
|
||||
.uart_tx_busy(), // Module busy sending previous item.
|
||||
.uart_tx_en(o_wb_ack), // Send the data on uart_tx_data
|
||||
.uart_tx_data(o_wb_data) // The data to be sent
|
||||
);
|
||||
uart_rx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_rx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(i_rst_n && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_rxd(rx), // UART Recieve pin.
|
||||
.uart_rx_en(o_debug1[4:0] == 23), // Recieve enable
|
||||
.uart_rx_break(), // Did we get a BREAK message?
|
||||
.uart_rx_valid(m_axis_tvalid), // Valid data recieved/available.
|
||||
.uart_rx_data(rd_data) // The recieved data.
|
||||
);
|
||||
|
||||
|
||||
// UART module from https://github.com/alexforencich/verilog-uart (DOES NOT WORK ON OPENXC7, UberDDR3 cannot finish calibration when this UART is used)
|
||||
// uart #(.DATA_WIDTH(8)) uart_m
|
||||
// (
|
||||
// .clk(i_controller_clk),
|
||||
// .rst(!i_rst_n),
|
||||
// .s_axis_tdata(o_wb_data),
|
||||
// .s_axis_tvalid(o_wb_ack),
|
||||
// .s_axis_tready(),
|
||||
// .m_axis_tdata(rd_data),
|
||||
// .m_axis_tvalid(m_axis_tvalid),
|
||||
// .m_axis_tready(1),
|
||||
// .rxd(rx),
|
||||
// .txd(tx),
|
||||
// .prescale(1085) //9600 Baud Rate (83.33MHz/(8*9600))
|
||||
// );
|
||||
|
||||
// DDR3 Controller
|
||||
ddr3_top #(
|
||||
.CONTROLLER_CLK_PERIOD(10_000), //ps, clock period of the controller interface
|
||||
.DDR3_CLK_PERIOD(2_500), //ps, clock period of the DDR3 RAM device (must be 1/4 of the CONTROLLER_CLK_PERIOD)
|
||||
.CONTROLLER_CLK_PERIOD(12_000), //ps, clock period of the controller interface
|
||||
.DDR3_CLK_PERIOD(3_000), //ps, clock period of the DDR3 RAM device (must be 1/4 of the CONTROLLER_CLK_PERIOD)
|
||||
.ROW_BITS(15), //width of row address
|
||||
.COL_BITS(10), //width of column address
|
||||
.BA_BITS(3), //width of bank address
|
||||
|
|
|
|||
|
|
@ -9,6 +9,9 @@ set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
|
|||
create_clock -period 5 [get_ports sys_clk_p]
|
||||
set_property PACKAGE_PIN R4 [get_ports sys_clk_p]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p]
|
||||
|
||||
set_property PACKAGE_PIN T4 [get_ports sys_clk_n]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_n]
|
||||
##############reset key define########################
|
||||
set_property PACKAGE_PIN J21 [get_ports i_rst_n]
|
||||
set_property IOSTANDARD LVCMOS33 [get_ports i_rst_n]
|
||||
|
|
@ -341,19 +344,19 @@ set_property IOSTANDARD LVCMOS15 [get_ports {ddr3_reset_n}]
|
|||
set_property PACKAGE_PIN W6 [get_ports {ddr3_reset_n}]
|
||||
|
||||
# PadFunction: IO_L14P_T2_SRCC_34
|
||||
set_property SLEW FAST [get_ports {ddr3_cke[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cke[0]}]
|
||||
set_property PACKAGE_PIN T5 [get_ports {ddr3_cke[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_cke}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cke}]
|
||||
set_property PACKAGE_PIN T5 [get_ports {ddr3_cke}]
|
||||
|
||||
# PadFunction: IO_L14N_T2_SRCC_34
|
||||
set_property SLEW FAST [get_ports {ddr3_odt[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_odt[0]}]
|
||||
set_property PACKAGE_PIN U5 [get_ports {ddr3_odt[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_odt}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_odt}]
|
||||
set_property PACKAGE_PIN U5 [get_ports {ddr3_odt}]
|
||||
|
||||
# PadFunction: IO_L8P_T1_34
|
||||
set_property SLEW FAST [get_ports {ddr3_cs_n[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cs_n[0]}]
|
||||
set_property PACKAGE_PIN AB3 [get_ports {ddr3_cs_n[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_cs_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cs_n}]
|
||||
set_property PACKAGE_PIN AB3 [get_ports {ddr3_cs_n}]
|
||||
|
||||
# PadFunction: IO_L4N_T0_35
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[0]}]
|
||||
|
|
@ -424,14 +427,14 @@ set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_n[3]}]
|
|||
set_property PACKAGE_PIN P4 [get_ports {ddr3_dqs_n[3]}]
|
||||
|
||||
# PadFunction: IO_L3P_T0_DQS_34
|
||||
set_property SLEW FAST [get_ports {ddr3_ck_p[0]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_ck_p[0]}]
|
||||
set_property PACKAGE_PIN R3 [get_ports {ddr3_ck_p[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ck_p}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_ck_p}]
|
||||
set_property PACKAGE_PIN R3 [get_ports {ddr3_ck_p}]
|
||||
|
||||
# PadFunction: IO_L3N_T0_DQS_34
|
||||
set_property SLEW FAST [get_ports {ddr3_ck_n[0]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_ck_n[0]}]
|
||||
set_property PACKAGE_PIN R2 [get_ports {ddr3_ck_n[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ck_n}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_ck_n}]
|
||||
set_property PACKAGE_PIN R2 [get_ports {ddr3_ck_n}]
|
||||
|
||||
|
||||
|
||||
|
|
@ -22,18 +22,18 @@ module clk_wiz
|
|||
.COMPENSATION ("INTERNAL"),
|
||||
.STARTUP_WAIT ("FALSE"),
|
||||
.DIVCLK_DIVIDE (1),
|
||||
.CLKFBOUT_MULT (4), // 200 MHz * 4 = 800 MHz
|
||||
.CLKFBOUT_MULT (5), // 200 MHz * 5 = 1000 MHz
|
||||
.CLKFBOUT_PHASE (0.000),
|
||||
.CLKOUT0_DIVIDE (8), // 800 MHz / 8 = 100 MHz
|
||||
.CLKOUT0_DIVIDE (12), // 1000 MHz / 12 = 83.333 MHz
|
||||
.CLKOUT0_PHASE (0.000),
|
||||
.CLKOUT0_DUTY_CYCLE (0.500),
|
||||
.CLKOUT1_DIVIDE (2), // 800 MHz / 2 = 400 MHz
|
||||
.CLKOUT1_DIVIDE (3), // 1000 MHz / 3 = 333.333 MHz
|
||||
.CLKOUT1_PHASE (0.000),
|
||||
.CLKOUT1_DUTY_CYCLE (0.500),
|
||||
.CLKOUT2_DIVIDE (4), // 800 MHz / 4 = 200 MHz
|
||||
.CLKOUT2_DIVIDE (5), // 1000 MHz / 5 = 200 MHz
|
||||
.CLKOUT2_PHASE (0.000),
|
||||
.CLKOUT2_DUTY_CYCLE (0.500),
|
||||
.CLKOUT3_DIVIDE (2), // 800 MHz / 2 = 400 MHz
|
||||
.CLKOUT3_DIVIDE (3), // 1000 MHz / 3 = 333.333 MHz
|
||||
.CLKOUT3_PHASE (90),
|
||||
.CLKOUT3_DUTY_CYCLE (0.500),
|
||||
.CLKIN1_PERIOD (5.000) // 200 MHz input
|
||||
|
|
|
|||
|
|
@ -1,113 +0,0 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire tx_busy,
|
||||
output wire rx_busy,
|
||||
output wire rx_overrun_error,
|
||||
output wire rx_frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
|
||||
);
|
||||
|
||||
uart_tx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_tx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi input
|
||||
.s_axis_tdata(s_axis_tdata),
|
||||
.s_axis_tvalid(s_axis_tvalid),
|
||||
.s_axis_tready(s_axis_tready),
|
||||
// output
|
||||
.txd(txd),
|
||||
// status
|
||||
.busy(tx_busy),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
uart_rx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_rx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi output
|
||||
.m_axis_tdata(m_axis_tdata),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(m_axis_tready),
|
||||
// input
|
||||
.rxd(rxd),
|
||||
// status
|
||||
.busy(rx_busy),
|
||||
.overrun_error(rx_overrun_error),
|
||||
.frame_error(rx_frame_error),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
|
@ -1,142 +1,207 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_rx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
output wire overrun_error,
|
||||
output wire frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
|
||||
);
|
||||
|
||||
reg [DATA_WIDTH-1:0] m_axis_tdata_reg = 0;
|
||||
reg m_axis_tvalid_reg = 0;
|
||||
|
||||
reg rxd_reg = 1;
|
||||
|
||||
reg busy_reg = 0;
|
||||
reg overrun_error_reg = 0;
|
||||
reg frame_error_reg = 0;
|
||||
|
||||
reg [DATA_WIDTH-1:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
|
||||
assign m_axis_tdata = m_axis_tdata_reg;
|
||||
assign m_axis_tvalid = m_axis_tvalid_reg;
|
||||
|
||||
assign busy = busy_reg;
|
||||
assign overrun_error = overrun_error_reg;
|
||||
assign frame_error = frame_error_reg;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
m_axis_tdata_reg <= 0;
|
||||
m_axis_tvalid_reg <= 0;
|
||||
rxd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
end else begin
|
||||
rxd_reg <= rxd;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
|
||||
if (m_axis_tvalid && m_axis_tready) begin
|
||||
m_axis_tvalid_reg <= 0;
|
||||
end
|
||||
|
||||
if (prescale_reg > 0) begin
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt > 0) begin
|
||||
if (bit_cnt > DATA_WIDTH+1) begin
|
||||
if (!rxd_reg) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
end else begin
|
||||
bit_cnt <= 0;
|
||||
prescale_reg <= 0;
|
||||
end
|
||||
end else if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
data_reg <= {rxd_reg, data_reg[DATA_WIDTH-1:1]};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
if (rxd_reg) begin
|
||||
m_axis_tdata_reg <= data_reg;
|
||||
m_axis_tvalid_reg <= 1;
|
||||
overrun_error_reg <= m_axis_tvalid_reg;
|
||||
end else begin
|
||||
frame_error_reg <= 1;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
busy_reg <= 0;
|
||||
if (!rxd_reg) begin
|
||||
prescale_reg <= (prescale << 2)-2;
|
||||
bit_cnt <= DATA_WIDTH+2;
|
||||
data_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
//
|
||||
// Module: uart_rx
|
||||
//
|
||||
// Notes:
|
||||
// - UART reciever module.
|
||||
//
|
||||
|
||||
module uart_rx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
input wire uart_rxd , // UART Recieve pin.
|
||||
input wire uart_rx_en , // Recieve enable
|
||||
output wire uart_rx_break, // Did we get a BREAK message?
|
||||
output wire uart_rx_valid, // Valid data recieved and available.
|
||||
output reg [PAYLOAD_BITS-1:0] uart_rx_data // The recieved data.
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_rxd line. Helps break long timing
|
||||
// paths from input pins into the logic.
|
||||
reg rxd_reg;
|
||||
reg rxd_reg_0;
|
||||
|
||||
//
|
||||
// Storage for the recieved serial data.
|
||||
reg [PAYLOAD_BITS-1:0] recieved_data;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of recieved bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Sample of the UART input line whenever we are in the middle of a bit frame.
|
||||
reg bit_sample;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_RECV = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Output assignment
|
||||
//
|
||||
|
||||
assign uart_rx_break = uart_rx_valid && ~|recieved_data;
|
||||
assign uart_rx_valid = fsm_state == FSM_STOP && n_fsm_state == FSM_IDLE;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if(!resetn) begin
|
||||
uart_rx_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if (fsm_state == FSM_STOP) begin
|
||||
uart_rx_data <= recieved_data;
|
||||
end
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT ||
|
||||
fsm_state == FSM_STOP &&
|
||||
cycle_counter == CYCLES_PER_BIT/2;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = rxd_reg ? FSM_IDLE : FSM_START;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_RECV : FSM_START;
|
||||
FSM_RECV : n_fsm_state = payload_done ? FSM_STOP : FSM_RECV ;
|
||||
FSM_STOP : n_fsm_state = next_bit ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the recieved data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_recieved_data
|
||||
if(!resetn) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE ) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit ) begin
|
||||
recieved_data[PAYLOAD_BITS-1] <= bit_sample;
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
recieved_data[i] <= recieved_data[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Increments the bit counter when recieving.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_RECV) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Sample the recieved bit when in the middle of a bit frame.
|
||||
always @(posedge clk) begin : p_bit_sample
|
||||
if(!resetn) begin
|
||||
bit_sample <= 1'b0;
|
||||
end else if (cycle_counter == CYCLES_PER_BIT/2) begin
|
||||
bit_sample <= rxd_reg;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when recieving.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_RECV ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the rxd_reg.
|
||||
always @(posedge clk) begin : p_rxd_reg
|
||||
if(!resetn) begin
|
||||
rxd_reg <= 1'b1;
|
||||
rxd_reg_0 <= 1'b1;
|
||||
end else if(uart_rx_en) begin
|
||||
rxd_reg <= rxd_reg_0;
|
||||
rxd_reg_0 <= uart_rxd;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -1,115 +1,187 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_tx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
);
|
||||
|
||||
reg s_axis_tready_reg = 0;
|
||||
|
||||
reg txd_reg = 1;
|
||||
|
||||
reg busy_reg = 0;
|
||||
|
||||
reg [DATA_WIDTH:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
|
||||
assign s_axis_tready = s_axis_tready_reg;
|
||||
assign txd = txd_reg;
|
||||
|
||||
assign busy = busy_reg;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
txd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
end else begin
|
||||
if (prescale_reg > 0) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt == 0) begin
|
||||
s_axis_tready_reg <= 1;
|
||||
busy_reg <= 0;
|
||||
|
||||
if (s_axis_tvalid) begin
|
||||
s_axis_tready_reg <= !s_axis_tready_reg;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
bit_cnt <= DATA_WIDTH+1;
|
||||
data_reg <= {1'b1, s_axis_tdata};
|
||||
txd_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
end else begin
|
||||
if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
{data_reg, txd_reg} <= {1'b0, data_reg};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3);
|
||||
txd_reg <= 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
|
||||
//
|
||||
// Module: uart_tx
|
||||
//
|
||||
// Notes:
|
||||
// - UART transmitter module.
|
||||
//
|
||||
|
||||
module uart_tx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
output wire uart_txd , // UART transmit pin.
|
||||
output wire uart_tx_busy, // Module busy sending previous item.
|
||||
input wire uart_tx_en , // Send the data on uart_tx_data
|
||||
input wire [PAYLOAD_BITS-1:0] uart_tx_data // The data to be sent
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_txd line. Helps break long timing
|
||||
// paths from the logic to the output pins.
|
||||
reg txd_reg;
|
||||
|
||||
//
|
||||
// Storage for the serial data to be sent.
|
||||
reg [PAYLOAD_BITS-1:0] data_to_send;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of sent bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_SEND = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
assign uart_tx_busy = fsm_state != FSM_IDLE;
|
||||
assign uart_txd = txd_reg;
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
wire stop_done = bit_counter == STOP_BITS && fsm_state == FSM_STOP;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = uart_tx_en ? FSM_START: FSM_IDLE ;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_SEND : FSM_START;
|
||||
FSM_SEND : n_fsm_state = payload_done ? FSM_STOP : FSM_SEND ;
|
||||
FSM_STOP : n_fsm_state = stop_done ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the sent data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_data_to_send
|
||||
if(!resetn) begin
|
||||
data_to_send <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE && uart_tx_en) begin
|
||||
data_to_send <= uart_tx_data;
|
||||
end else if(fsm_state == FSM_SEND && next_bit ) begin
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
data_to_send[i] <= data_to_send[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the bit counter each time a new bit frame is sent.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_SEND && fsm_state != FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_SEND && n_fsm_state == FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_STOP&& next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end else if(fsm_state == FSM_SEND && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when sending.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_SEND ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the txd_reg.
|
||||
always @(posedge clk) begin : p_txd_reg
|
||||
if(!resetn) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_IDLE) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_START) begin
|
||||
txd_reg <= 1'b0;
|
||||
end else if(fsm_state == FSM_SEND) begin
|
||||
txd_reg <= data_to_send[0];
|
||||
end else if(fsm_state == FSM_STOP) begin
|
||||
txd_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -0,0 +1,70 @@
|
|||
PROJECT = ax7325b_ddr3
|
||||
FAMILY = kintex7
|
||||
PART = xc7k325tffg900-2
|
||||
CHIPDB = ${KINTEX7_CHIPDB}
|
||||
ADDITIONAL_SOURCES = ../../rtl/ddr3_controller.v ../../rtl/ddr3_phy.v ../../rtl/ddr3_top.v uart_rx.v uart_tx.v clk_wiz.v
|
||||
|
||||
#############################################################################################
|
||||
NEXTPNR_XILINX_DIR ?= /snap/openxc7/current/opt/nextpnr-xilinx
|
||||
NEXTPNR_XILINX_PYTHON_DIR ?= ${NEXTPNR_XILINX_DIR}/python
|
||||
PRJXRAY_DB_DIR ?= ${NEXTPNR_XILINX_DIR}/external/prjxray-db
|
||||
|
||||
DBPART = $(shell echo ${PART} | sed -e 's/-[0-9]//g')
|
||||
SPEEDGRADE = $(shell echo ${PART} | sed -e 's/.*\-\([0-9]\)/\1/g')
|
||||
|
||||
CHIPDB ?= ./
|
||||
ifeq ($(CHIPDB),)
|
||||
CHIPDB = ./
|
||||
endif
|
||||
|
||||
PYPY3 ?= pypy3
|
||||
|
||||
TOP ?= ${PROJECT}
|
||||
TOP_MODULE ?= ${TOP}
|
||||
TOP_VERILOG ?= ${TOP}.v
|
||||
|
||||
PNR_DEBUG ?= # --verbose --debug
|
||||
|
||||
BOARD ?= UNKNOWN
|
||||
JTAG_LINK ?= --board ${BOARD}
|
||||
|
||||
XDC ?= ${PROJECT}.xdc
|
||||
|
||||
.PHONY: all
|
||||
all: ${PROJECT}.bit
|
||||
|
||||
.PHONY: program
|
||||
program: ${PROJECT}.bit
|
||||
openFPGALoader ${JTAG_LINK} --bitstream $<
|
||||
|
||||
${PROJECT}.json: ${TOP_VERILOG} ${ADDITIONAL_SOURCES}
|
||||
yosys -p "synth_xilinx -flatten -abc9 ${SYNTH_OPTS} -arch xc7 -top ${TOP_MODULE}; write_json ${PROJECT}.json" $< ${ADDITIONAL_SOURCES}
|
||||
|
||||
# The chip database only needs to be generated once
|
||||
# that is why we don't clean it with make clean
|
||||
${CHIPDB}/${DBPART}.bin:
|
||||
${PYPY3} ${NEXTPNR_XILINX_PYTHON_DIR}/bbaexport.py --device ${PART} --bba ${DBPART}.bba
|
||||
bbasm -l ${DBPART}.bba ${CHIPDB}/${DBPART}.bin
|
||||
rm -f ${DBPART}.bba
|
||||
|
||||
${PROJECT}.fasm: ${PROJECT}.json ${CHIPDB}/${DBPART}.bin ${XDC}
|
||||
nextpnr-xilinx --chipdb ${CHIPDB}/${DBPART}.bin --xdc ${XDC} --json ${PROJECT}.json --fasm $@ ${PNR_ARGS} ${PNR_DEBUG}
|
||||
|
||||
${PROJECT}.frames: ${PROJECT}.fasm
|
||||
fasm2frames --part ${PART} --db-root ${PRJXRAY_DB_DIR}/${FAMILY} $< > $@
|
||||
|
||||
${PROJECT}.bit: ${PROJECT}.frames
|
||||
xc7frames2bit --part_file ${PRJXRAY_DB_DIR}/${FAMILY}/${PART}/part.yaml --part_name ${PART} --frm_file $< --output_file $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@rm -f *.bit
|
||||
@rm -f *.frames
|
||||
@rm -f *.fasm
|
||||
@rm -f *.json
|
||||
@rm -f *.bin
|
||||
@rm -f *.bba
|
||||
|
||||
.PHONY: pnrclean
|
||||
pnrclean:
|
||||
rm *.fasm *.frames *.bit
|
||||
|
|
@ -0,0 +1,222 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Filename: ax7325b_ddr3.v
|
||||
// Project: UberDDR3 - An Open Source DDR3 Controller
|
||||
//
|
||||
// Purpose: Example demo of UberDDR3 for AX7325B FPGA board from ALINX (xc7k325tffg900-2).
|
||||
// Mechanism:
|
||||
// - four LEDs will light up once UberDDR3 is done calibrating
|
||||
// - if UART (9600 Baud Rate)receives small letter ASCII (a-z), this value will be written to DDR3
|
||||
// - if UART receives capital letter ASCII (A-Z), the small letter equivalent will be retrieved from DDR3 by doing
|
||||
// - a read request, once read data is available this will be sent to UART to be streamed out.
|
||||
// THUS:
|
||||
// - Sendng "abcdefg" to the UART terminal will store that small latter to DDR3
|
||||
// - Then sending "ABCDEFG" to the UART terminal will return the small letter equivalent: "abcdefg"
|
||||
//
|
||||
// Engineer: Angelo C. Jacobo
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2023-2024 Angelo Jacobo
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
module ax7325b_ddr3
|
||||
(
|
||||
//Differential system clocks
|
||||
input wire sys_clk_p, sys_clk_n,
|
||||
input wire i_rst_n,
|
||||
output wire fan_pwm,
|
||||
// DDR3 I/O Interface
|
||||
output wire ddr3_ck_p, ddr3_ck_n,
|
||||
output wire ddr3_reset_n,
|
||||
output wire ddr3_cke,
|
||||
output wire ddr3_cs_n,
|
||||
output wire ddr3_ras_n,
|
||||
output wire ddr3_cas_n,
|
||||
output wire ddr3_we_n,
|
||||
output wire[15-1:0] ddr3_addr,
|
||||
output wire[3-1:0] ddr3_ba,
|
||||
inout wire[64-1:0] ddr3_dq,
|
||||
inout wire[8-1:0] ddr3_dqs_p, ddr3_dqs_n,
|
||||
output wire[8-1:0] ddr3_dm,
|
||||
output wire ddr3_odt,
|
||||
// UART line
|
||||
input wire rx,
|
||||
output wire tx,
|
||||
//Debug LEDs
|
||||
output wire[3:0] led
|
||||
);
|
||||
// for dual-rank, all [0:0] will become [1:0]
|
||||
wire i_controller_clk, i_ddr3_clk, i_ref_clk, i_ddr3_clk_90;
|
||||
wire m_axis_tvalid;
|
||||
wire rx_empty;
|
||||
wire tx_full;
|
||||
wire o_wb_ack;
|
||||
wire[7:0] o_wb_data;
|
||||
wire o_aux;
|
||||
wire[7:0] rd_data;
|
||||
wire o_wb_stall;
|
||||
reg i_wb_stb = 0, i_wb_we;
|
||||
wire[63:0] o_debug1;
|
||||
reg[7:0] i_wb_data;
|
||||
reg[7:0] i_wb_addr;
|
||||
// o_debug1 taps on value of state_calibrate (can be traced inside ddr3_controller module)
|
||||
assign led[0] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[1] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[2] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[3] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign fan_pwm = 1'b0; // turn on fan
|
||||
//assign ddr3_cs_n[1] = 1'b1;
|
||||
|
||||
//===========================================================================
|
||||
//Differentia system clock to single end clock
|
||||
//===========================================================================
|
||||
wire sys_clk; // 200MHz
|
||||
IBUFGDS u_ibufg_sys_clk
|
||||
(
|
||||
.I (sys_clk_p),
|
||||
.IB (sys_clk_n),
|
||||
.O (sys_clk)
|
||||
);
|
||||
|
||||
always @(posedge i_controller_clk) begin
|
||||
begin
|
||||
i_wb_stb <= 0;
|
||||
i_wb_we <= 0;
|
||||
i_wb_addr <= 0;
|
||||
i_wb_data <= 0;
|
||||
if(!o_wb_stall && m_axis_tvalid) begin
|
||||
if(rd_data >= 97 && rd_data <= 122) begin //write to DDR3 if ASCII is small letter
|
||||
i_wb_stb <= 1;
|
||||
i_wb_we <= 1;
|
||||
i_wb_addr <= ~rd_data ;
|
||||
i_wb_data <= rd_data;
|
||||
end
|
||||
else if(rd_data >= 65 && rd_data <= 90) begin //read from DDR3 if ASCII is capital letter
|
||||
i_wb_stb <= 1; //make request
|
||||
i_wb_we <= 0; //read
|
||||
i_wb_addr <= ~(rd_data + 8'd32);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
wire clk_locked;
|
||||
clk_wiz clk_wiz_inst
|
||||
(
|
||||
// Clock out ports
|
||||
.clk_out1(i_controller_clk), //83.3333 Mhz
|
||||
.clk_out2(i_ddr3_clk), // 333.333 MHz
|
||||
.clk_out3(i_ref_clk), // 200 MHz
|
||||
.clk_out4(i_ddr3_clk_90), // 333.333 MHz with 90 degree shift
|
||||
// Status and control signals
|
||||
.reset(!i_rst_n),
|
||||
.locked(clk_locked),
|
||||
// Clock in ports
|
||||
.clk_in1(sys_clk)
|
||||
);
|
||||
|
||||
// // UART module from https://github.com/alexforencich/verilog-uart
|
||||
// uart #(.DATA_WIDTH(8)) uart_m
|
||||
// (
|
||||
// .clk(i_controller_clk),
|
||||
// .rst(!i_rst_n),
|
||||
// .s_axis_tdata(o_wb_data),
|
||||
// .s_axis_tvalid(o_wb_ack),
|
||||
// .s_axis_tready(),
|
||||
// .m_axis_tdata(rd_data),
|
||||
// .m_axis_tvalid(m_axis_tvalid),
|
||||
// .m_axis_tready(1),
|
||||
// .rxd(rx),
|
||||
// .txd(tx),
|
||||
// .prescale(1085) //9600 Baud Rate: 83.3333MHz/(8*9600)
|
||||
// );
|
||||
|
||||
// DDR3 Controller
|
||||
ddr3_top #(
|
||||
.CONTROLLER_CLK_PERIOD(12_000), //ps, clock period of the controller interface
|
||||
.DDR3_CLK_PERIOD(3_000), //ps, clock period of the DDR3 RAM device (must be 1/4 of the CONTROLLER_CLK_PERIOD)
|
||||
.ROW_BITS(15), //width of row address
|
||||
.COL_BITS(10), //width of column address
|
||||
.BA_BITS(3), //width of bank address
|
||||
.BYTE_LANES(8), //number of DDR3 modules to be controlled
|
||||
.AUX_WIDTH(16), //width of aux line (must be >= 4)
|
||||
.WB2_ADDR_BITS(32), //width of 2nd wishbone address bus
|
||||
.WB2_DATA_BITS(32), //width of 2nd wishbone data bus
|
||||
.MICRON_SIM(0), //enable faster simulation for micron ddr3 model (shorten POWER_ON_RESET_HIGH and INITIAL_CKE_LOW)
|
||||
.ODELAY_SUPPORTED(1), //set to 1 when ODELAYE2 is supported
|
||||
.SECOND_WISHBONE(0), //set to 1 if 2nd wishbone is needed
|
||||
.ECC_ENABLE(0), // set to 1 or 2 to add ECC (1 = Side-band ECC per burst, 2 = Side-band ECC per 8 bursts , 3 = Inline ECC )
|
||||
.WB_ERROR(0) // set to 1 to support Wishbone error (asserts at ECC double bit error)
|
||||
) ddr3_top
|
||||
(
|
||||
//clock and reset
|
||||
.i_controller_clk(i_controller_clk),
|
||||
.i_ddr3_clk(i_ddr3_clk), //i_controller_clk has period of CONTROLLER_CLK_PERIOD, i_ddr3_clk has period of DDR3_CLK_PERIOD
|
||||
.i_ref_clk(i_ref_clk),
|
||||
.i_ddr3_clk_90(i_ddr3_clk_90),
|
||||
.i_rst_n(i_rst_n && clk_locked),
|
||||
// Wishbone inputs
|
||||
.i_wb_cyc(1), //bus cycle active (1 = normal operation, 0 = all ongoing transaction are to be cancelled)
|
||||
.i_wb_stb(i_wb_stb), //request a transfer
|
||||
.i_wb_we(i_wb_we), //write-enable (1 = write, 0 = read)
|
||||
.i_wb_addr(i_wb_addr), //burst-addressable {row,bank,col}
|
||||
.i_wb_data(i_wb_data), //write data, for a 4:1 controller data width is 8 times the number of pins on the device
|
||||
.i_wb_sel(16'hffff), //byte strobe for write (1 = write the byte)
|
||||
.i_aux(i_wb_we), //for AXI-interface compatibility (given upon strobe)
|
||||
// Wishbone outputs
|
||||
.o_wb_stall(o_wb_stall), //1 = busy, cannot accept requests
|
||||
.o_wb_ack(o_wb_ack), //1 = read/write request has completed
|
||||
.o_wb_data(o_wb_data), //read data, for a 4:1 controller data width is 8 times the number of pins on the device
|
||||
.o_aux(o_aux),
|
||||
// Wishbone 2 (PHY) inputs
|
||||
.i_wb2_cyc(), //bus cycle active (1 = normal operation, 0 = all ongoing transaction are to be cancelled)
|
||||
.i_wb2_stb(), //request a transfer
|
||||
.i_wb2_we(), //write-enable (1 = write, 0 = read)
|
||||
.i_wb2_addr(), //burst-addressable {row,bank,col}
|
||||
.i_wb2_data(), //write data, for a 4:1 controller data width is 8 times the number of pins on the device
|
||||
.i_wb2_sel(), //byte strobe for write (1 = write the byte)
|
||||
// Wishbone 2 (Controller) outputs
|
||||
.o_wb2_stall(), //1 = busy, cannot accept requests
|
||||
.o_wb2_ack(), //1 = read/write request has completed
|
||||
.o_wb2_data(), //read data, for a 4:1 controller data width is 8 times the number of pins on the device
|
||||
// PHY Interface (to be added later)
|
||||
// DDR3 I/O Interface
|
||||
.o_ddr3_clk_p(ddr3_ck_p),
|
||||
.o_ddr3_clk_n(ddr3_ck_n),
|
||||
.o_ddr3_reset_n(ddr3_reset_n),
|
||||
.o_ddr3_cke(ddr3_cke), // CKE
|
||||
.o_ddr3_cs_n(ddr3_cs_n[0]), // chip select signal (controls rank 1 only)
|
||||
.o_ddr3_ras_n(ddr3_ras_n), // RAS#
|
||||
.o_ddr3_cas_n(ddr3_cas_n), // CAS#
|
||||
.o_ddr3_we_n(ddr3_we_n), // WE#
|
||||
.o_ddr3_addr(ddr3_addr),
|
||||
.o_ddr3_ba_addr(ddr3_ba),
|
||||
.io_ddr3_dq(ddr3_dq),
|
||||
.io_ddr3_dqs(ddr3_dqs_p),
|
||||
.io_ddr3_dqs_n(ddr3_dqs_n),
|
||||
.o_ddr3_dm(ddr3_dm),
|
||||
.o_ddr3_odt(ddr3_odt), // on-die termination
|
||||
.o_debug1(o_debug1),
|
||||
.o_debug2(),
|
||||
.o_debug3()
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
|
|
@ -0,0 +1,759 @@
|
|||
############## clock define##################
|
||||
create_clock -period 5.000 [get_ports sys_clk_p]
|
||||
set_property PACKAGE_PIN AE10 [get_ports sys_clk_p]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_p]
|
||||
|
||||
# no need to constrain N side (only P side) or else tool will analyze interclock oaths and show failure in timing
|
||||
# https://support.xilinx.com/s/article/57109?language=en_US
|
||||
#create_clock -period 5.000 [get_ports sys_clk_n]
|
||||
set_property PACKAGE_PIN AF10 [get_ports sys_clk_n]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports sys_clk_n]
|
||||
|
||||
|
||||
############## key define##################
|
||||
set_property PACKAGE_PIN AG27 [get_ports i_rst_n]
|
||||
set_property IOSTANDARD LVCMOS25 [get_ports i_rst_n]
|
||||
|
||||
|
||||
############## fan define##################
|
||||
set_property IOSTANDARD LVCMOS25 [get_ports fan_pwm]
|
||||
set_property PACKAGE_PIN AE26 [get_ports fan_pwm]
|
||||
|
||||
|
||||
##############LED define##################
|
||||
set_property PACKAGE_PIN A22 [get_ports {led[0]}]
|
||||
set_property IOSTANDARD LVCMOS15 [get_ports {led[0]}]
|
||||
|
||||
set_property PACKAGE_PIN C19 [get_ports {led[1]}]
|
||||
set_property IOSTANDARD LVCMOS15 [get_ports {led[1]}]
|
||||
|
||||
set_property PACKAGE_PIN B19 [get_ports {led[2]}]
|
||||
set_property IOSTANDARD LVCMOS15 [get_ports {led[2]}]
|
||||
|
||||
set_property PACKAGE_PIN E18 [get_ports {led[3]}]
|
||||
set_property IOSTANDARD LVCMOS15 [get_ports {led[3]}]
|
||||
|
||||
|
||||
##############uart define###########################
|
||||
set_property IOSTANDARD LVCMOS25 [get_ports rx]
|
||||
set_property PACKAGE_PIN AJ26 [get_ports rx]
|
||||
|
||||
set_property IOSTANDARD LVCMOS25 [get_ports tx]
|
||||
set_property PACKAGE_PIN AK26 [get_ports tx]
|
||||
|
||||
############## NET - IOSTANDARD ##################
|
||||
|
||||
|
||||
############## NET - IOSTANDARD ##################
|
||||
|
||||
|
||||
# PadFunction: IO_L13P_T2_MRCC_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[0]}]
|
||||
set_property PACKAGE_PIN AD18 [get_ports {ddr3_dq[0]}]
|
||||
|
||||
# PadFunction: IO_L16N_T2_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[1]}]
|
||||
set_property PACKAGE_PIN AB18 [get_ports {ddr3_dq[1]}]
|
||||
|
||||
# PadFunction: IO_L14P_T2_SRCC_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[2]}]
|
||||
set_property PACKAGE_PIN AD17 [get_ports {ddr3_dq[2]}]
|
||||
|
||||
# PadFunction: IO_L17P_T2_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[3]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[3]}]
|
||||
set_property PACKAGE_PIN AB19 [get_ports {ddr3_dq[3]}]
|
||||
|
||||
# PadFunction: IO_L14N_T2_SRCC_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[4]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[4]}]
|
||||
set_property PACKAGE_PIN AD16 [get_ports {ddr3_dq[4]}]
|
||||
|
||||
# PadFunction: IO_L17N_T2_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[5]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[5]}]
|
||||
set_property PACKAGE_PIN AC19 [get_ports {ddr3_dq[5]}]
|
||||
|
||||
# PadFunction: IO_L13N_T2_MRCC_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[6]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[6]}]
|
||||
set_property PACKAGE_PIN AE18 [get_ports {ddr3_dq[6]}]
|
||||
|
||||
# PadFunction: IO_L18P_T2_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[7]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[7]}]
|
||||
set_property PACKAGE_PIN AB17 [get_ports {ddr3_dq[7]}]
|
||||
|
||||
# PadFunction: IO_L8P_T1_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[8]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[8]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[8]}]
|
||||
set_property PACKAGE_PIN AG19 [get_ports {ddr3_dq[8]}]
|
||||
|
||||
# PadFunction: IO_L7N_T1_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[9]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[9]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[9]}]
|
||||
set_property PACKAGE_PIN AK19 [get_ports {ddr3_dq[9]}]
|
||||
|
||||
# PadFunction: IO_L10P_T1_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[10]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[10]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[10]}]
|
||||
set_property PACKAGE_PIN AD19 [get_ports {ddr3_dq[10]}]
|
||||
|
||||
# PadFunction: IO_L7P_T1_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[11]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[11]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[11]}]
|
||||
set_property PACKAGE_PIN AJ19 [get_ports {ddr3_dq[11]}]
|
||||
|
||||
# PadFunction: IO_L11P_T1_SRCC_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[12]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[12]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[12]}]
|
||||
set_property PACKAGE_PIN AF18 [get_ports {ddr3_dq[12]}]
|
||||
|
||||
# PadFunction: IO_L8N_T1_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[13]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[13]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[13]}]
|
||||
set_property PACKAGE_PIN AH19 [get_ports {ddr3_dq[13]}]
|
||||
|
||||
# PadFunction: IO_L10N_T1_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[14]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[14]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[14]}]
|
||||
set_property PACKAGE_PIN AE19 [get_ports {ddr3_dq[14]}]
|
||||
|
||||
# PadFunction: IO_L11N_T1_SRCC_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[15]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[15]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[15]}]
|
||||
set_property PACKAGE_PIN AG18 [get_ports {ddr3_dq[15]}]
|
||||
|
||||
# PadFunction: IO_L1N_T0_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[16]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[16]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[16]}]
|
||||
set_property PACKAGE_PIN AK15 [get_ports {ddr3_dq[16]}]
|
||||
|
||||
# PadFunction: IO_L5N_T0_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[17]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[17]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[17]}]
|
||||
set_property PACKAGE_PIN AJ17 [get_ports {ddr3_dq[17]}]
|
||||
|
||||
# PadFunction: IO_L2N_T0_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[18]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[18]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[18]}]
|
||||
set_property PACKAGE_PIN AH15 [get_ports {ddr3_dq[18]}]
|
||||
|
||||
# PadFunction: IO_L4P_T0_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[19]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[19]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[19]}]
|
||||
set_property PACKAGE_PIN AF15 [get_ports {ddr3_dq[19]}]
|
||||
|
||||
# PadFunction: IO_L4N_T0_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[20]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[20]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[20]}]
|
||||
set_property PACKAGE_PIN AG14 [get_ports {ddr3_dq[20]}]
|
||||
|
||||
# PadFunction: IO_L5P_T0_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[21]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[21]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[21]}]
|
||||
set_property PACKAGE_PIN AH17 [get_ports {ddr3_dq[21]}]
|
||||
|
||||
# PadFunction: IO_L2P_T0_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[22]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[22]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[22]}]
|
||||
set_property PACKAGE_PIN AG15 [get_ports {ddr3_dq[22]}]
|
||||
|
||||
# PadFunction: IO_L1P_T0_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[23]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[23]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[23]}]
|
||||
set_property PACKAGE_PIN AK16 [get_ports {ddr3_dq[23]}]
|
||||
|
||||
# PadFunction: IO_L19P_T3_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[24]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[24]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[24]}]
|
||||
set_property PACKAGE_PIN AE15 [get_ports {ddr3_dq[24]}]
|
||||
|
||||
# PadFunction: IO_L24P_T3_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[25]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[25]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[25]}]
|
||||
set_property PACKAGE_PIN Y16 [get_ports {ddr3_dq[25]}]
|
||||
|
||||
# PadFunction: IO_L22P_T3_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[26]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[26]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[26]}]
|
||||
set_property PACKAGE_PIN AC14 [get_ports {ddr3_dq[26]}]
|
||||
|
||||
# PadFunction: IO_L20P_T3_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[27]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[27]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[27]}]
|
||||
set_property PACKAGE_PIN AA15 [get_ports {ddr3_dq[27]}]
|
||||
|
||||
# PadFunction: IO_L23P_T3_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[28]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[28]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[28]}]
|
||||
set_property PACKAGE_PIN AA17 [get_ports {ddr3_dq[28]}]
|
||||
|
||||
# PadFunction: IO_L22N_T3_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[29]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[29]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[29]}]
|
||||
set_property PACKAGE_PIN AD14 [get_ports {ddr3_dq[29]}]
|
||||
|
||||
# PadFunction: IO_L23N_T3_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[30]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[30]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[30]}]
|
||||
set_property PACKAGE_PIN AA16 [get_ports {ddr3_dq[30]}]
|
||||
|
||||
# PadFunction: IO_L20N_T3_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[31]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[31]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[31]}]
|
||||
set_property PACKAGE_PIN AB15 [get_ports {ddr3_dq[31]}]
|
||||
|
||||
# PadFunction: IO_L22N_T3_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[32]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[32]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[32]}]
|
||||
set_property PACKAGE_PIN AK6 [get_ports {ddr3_dq[32]}]
|
||||
|
||||
# PadFunction: IO_L23P_T3_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[33]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[33]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[33]}]
|
||||
set_property PACKAGE_PIN AJ8 [get_ports {ddr3_dq[33]}]
|
||||
|
||||
# PadFunction: IO_L22P_T3_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[34]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[34]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[34]}]
|
||||
set_property PACKAGE_PIN AJ6 [get_ports {ddr3_dq[34]}]
|
||||
|
||||
# PadFunction: IO_L19P_T3_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[35]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[35]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[35]}]
|
||||
set_property PACKAGE_PIN AF8 [get_ports {ddr3_dq[35]}]
|
||||
|
||||
# PadFunction: IO_L24N_T3_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[36]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[36]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[36]}]
|
||||
set_property PACKAGE_PIN AK4 [get_ports {ddr3_dq[36]}]
|
||||
|
||||
# PadFunction: IO_L23N_T3_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[37]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[37]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[37]}]
|
||||
set_property PACKAGE_PIN AK8 [get_ports {ddr3_dq[37]}]
|
||||
|
||||
# PadFunction: IO_L24P_T3_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[38]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[38]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[38]}]
|
||||
set_property PACKAGE_PIN AK5 [get_ports {ddr3_dq[38]}]
|
||||
|
||||
# PadFunction: IO_L20N_T3_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[39]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[39]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[39]}]
|
||||
set_property PACKAGE_PIN AG7 [get_ports {ddr3_dq[39]}]
|
||||
|
||||
# PadFunction: IO_L10P_T1_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[40]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[40]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[40]}]
|
||||
set_property PACKAGE_PIN AE4 [get_ports {ddr3_dq[40]}]
|
||||
|
||||
# PadFunction: IO_L8N_T1_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[41]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[41]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[41]}]
|
||||
set_property PACKAGE_PIN AF1 [get_ports {ddr3_dq[41]}]
|
||||
|
||||
# PadFunction: IO_L11P_T1_SRCC_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[42]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[42]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[42]}]
|
||||
set_property PACKAGE_PIN AE5 [get_ports {ddr3_dq[42]}]
|
||||
|
||||
# PadFunction: IO_L8P_T1_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[43]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[43]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[43]}]
|
||||
set_property PACKAGE_PIN AE1 [get_ports {ddr3_dq[43]}]
|
||||
|
||||
# PadFunction: IO_L12P_T1_MRCC_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[44]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[44]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[44]}]
|
||||
set_property PACKAGE_PIN AF6 [get_ports {ddr3_dq[44]}]
|
||||
|
||||
# PadFunction: IO_L10N_T1_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[45]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[45]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[45]}]
|
||||
set_property PACKAGE_PIN AE3 [get_ports {ddr3_dq[45]}]
|
||||
|
||||
# PadFunction: IO_L11N_T1_SRCC_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[46]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[46]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[46]}]
|
||||
set_property PACKAGE_PIN AF5 [get_ports {ddr3_dq[46]}]
|
||||
|
||||
# PadFunction: IO_L7N_T1_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[47]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[47]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[47]}]
|
||||
set_property PACKAGE_PIN AF2 [get_ports {ddr3_dq[47]}]
|
||||
|
||||
# PadFunction: IO_L13P_T2_MRCC_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[48]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[48]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[48]}]
|
||||
set_property PACKAGE_PIN AH4 [get_ports {ddr3_dq[48]}]
|
||||
|
||||
# PadFunction: IO_L16N_T2_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[49]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[49]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[49]}]
|
||||
set_property PACKAGE_PIN AJ2 [get_ports {ddr3_dq[49]}]
|
||||
|
||||
# PadFunction: IO_L14N_T2_SRCC_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[50]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[50]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[50]}]
|
||||
set_property PACKAGE_PIN AH5 [get_ports {ddr3_dq[50]}]
|
||||
|
||||
# PadFunction: IO_L13N_T2_MRCC_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[51]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[51]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[51]}]
|
||||
set_property PACKAGE_PIN AJ4 [get_ports {ddr3_dq[51]}]
|
||||
|
||||
# PadFunction: IO_L16P_T2_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[52]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[52]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[52]}]
|
||||
set_property PACKAGE_PIN AH2 [get_ports {ddr3_dq[52]}]
|
||||
|
||||
# PadFunction: IO_L17N_T2_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[53]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[53]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[53]}]
|
||||
set_property PACKAGE_PIN AK1 [get_ports {ddr3_dq[53]}]
|
||||
|
||||
# PadFunction: IO_L14P_T2_SRCC_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[54]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[54]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[54]}]
|
||||
set_property PACKAGE_PIN AH6 [get_ports {ddr3_dq[54]}]
|
||||
|
||||
# PadFunction: IO_L17P_T2_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[55]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[55]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[55]}]
|
||||
set_property PACKAGE_PIN AJ1 [get_ports {ddr3_dq[55]}]
|
||||
|
||||
# PadFunction: IO_L2P_T0_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[56]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[56]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[56]}]
|
||||
set_property PACKAGE_PIN AC2 [get_ports {ddr3_dq[56]}]
|
||||
|
||||
# PadFunction: IO_L4P_T0_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[57]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[57]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[57]}]
|
||||
set_property PACKAGE_PIN AC5 [get_ports {ddr3_dq[57]}]
|
||||
|
||||
# PadFunction: IO_L1N_T0_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[58]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[58]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[58]}]
|
||||
set_property PACKAGE_PIN AD3 [get_ports {ddr3_dq[58]}]
|
||||
|
||||
# PadFunction: IO_L6P_T0_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[59]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[59]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[59]}]
|
||||
set_property PACKAGE_PIN AC7 [get_ports {ddr3_dq[59]}]
|
||||
|
||||
# PadFunction: IO_L5N_T0_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[60]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[60]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[60]}]
|
||||
set_property PACKAGE_PIN AE6 [get_ports {ddr3_dq[60]}]
|
||||
|
||||
# PadFunction: IO_L5P_T0_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[61]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[61]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[61]}]
|
||||
set_property PACKAGE_PIN AD6 [get_ports {ddr3_dq[61]}]
|
||||
|
||||
# PadFunction: IO_L2N_T0_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[62]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[62]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[62]}]
|
||||
set_property PACKAGE_PIN AC1 [get_ports {ddr3_dq[62]}]
|
||||
|
||||
# PadFunction: IO_L4N_T0_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[63]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[63]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[63]}]
|
||||
set_property PACKAGE_PIN AC4 [get_ports {ddr3_dq[63]}]
|
||||
|
||||
# PadFunction: IO_L15P_T2_DQS_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[14]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[14]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[14]}]
|
||||
set_property PACKAGE_PIN AJ9 [get_ports {ddr3_addr[14]}]
|
||||
|
||||
# PadFunction: IO_L7N_T1_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[13]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[13]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[13]}]
|
||||
set_property PACKAGE_PIN AC10 [get_ports {ddr3_addr[13]}]
|
||||
|
||||
# PadFunction: IO_L7P_T1_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[12]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[12]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[12]}]
|
||||
set_property PACKAGE_PIN AB10 [get_ports {ddr3_addr[12]}]
|
||||
|
||||
# PadFunction: IO_L8P_T1_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[11]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[11]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[11]}]
|
||||
set_property PACKAGE_PIN AD8 [get_ports {ddr3_addr[11]}]
|
||||
|
||||
# PadFunction: IO_L6P_T0_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[10]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[10]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[10]}]
|
||||
set_property PACKAGE_PIN AA13 [get_ports {ddr3_addr[10]}]
|
||||
|
||||
# PadFunction: IO_L5N_T0_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[9]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[9]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[9]}]
|
||||
set_property PACKAGE_PIN AA10 [get_ports {ddr3_addr[9]}]
|
||||
|
||||
# PadFunction: IO_L5P_T0_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[8]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[8]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[8]}]
|
||||
set_property PACKAGE_PIN AA11 [get_ports {ddr3_addr[8]}]
|
||||
|
||||
# PadFunction: IO_L4N_T0_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[7]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[7]}]
|
||||
set_property PACKAGE_PIN Y10 [get_ports {ddr3_addr[7]}]
|
||||
|
||||
# PadFunction: IO_L6N_T0_VREF_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[6]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[6]}]
|
||||
set_property PACKAGE_PIN AB13 [get_ports {ddr3_addr[6]}]
|
||||
|
||||
# PadFunction: IO_L3N_T0_DQS_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[5]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[5]}]
|
||||
set_property PACKAGE_PIN AC9 [get_ports {ddr3_addr[5]}]
|
||||
|
||||
# PadFunction: IO_L3P_T0_DQS_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[4]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[4]}]
|
||||
set_property PACKAGE_PIN AB9 [get_ports {ddr3_addr[4]}]
|
||||
|
||||
# PadFunction: IO_L2N_T0_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[3]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[3]}]
|
||||
set_property PACKAGE_PIN AB8 [get_ports {ddr3_addr[3]}]
|
||||
|
||||
# PadFunction: IO_L2P_T0_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[2]}]
|
||||
set_property PACKAGE_PIN AA8 [get_ports {ddr3_addr[2]}]
|
||||
|
||||
# PadFunction: IO_L1N_T0_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[1]}]
|
||||
set_property PACKAGE_PIN AB12 [get_ports {ddr3_addr[1]}]
|
||||
|
||||
# PadFunction: IO_L1P_T0_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[0]}]
|
||||
set_property PACKAGE_PIN AA12 [get_ports {ddr3_addr[0]}]
|
||||
|
||||
# PadFunction: IO_L9N_T1_DQS_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ba[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ba[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_ba[2]}]
|
||||
set_property PACKAGE_PIN AC11 [get_ports {ddr3_ba[2]}]
|
||||
|
||||
# PadFunction: IO_L9P_T1_DQS_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ba[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ba[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_ba[1]}]
|
||||
set_property PACKAGE_PIN AC12 [get_ports {ddr3_ba[1]}]
|
||||
|
||||
# PadFunction: IO_L8N_T1_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ba[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ba[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_ba[0]}]
|
||||
set_property PACKAGE_PIN AE8 [get_ports {ddr3_ba[0]}]
|
||||
|
||||
# PadFunction: IO_L10N_T1_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ras_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ras_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_ras_n}]
|
||||
set_property PACKAGE_PIN AE9 [get_ports {ddr3_ras_n}]
|
||||
|
||||
# PadFunction: IO_L11P_T1_SRCC_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_cas_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_cas_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cas_n}]
|
||||
set_property PACKAGE_PIN AE11 [get_ports {ddr3_cas_n}]
|
||||
|
||||
# PadFunction: IO_L10P_T1_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_we_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_we_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_we_n}]
|
||||
set_property PACKAGE_PIN AD9 [get_ports {ddr3_we_n}]
|
||||
|
||||
# PadFunction: IO_L4P_T0_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_reset_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_reset_n}]
|
||||
set_property IOSTANDARD LVCMOS15 [get_ports {ddr3_reset_n}]
|
||||
set_property PACKAGE_PIN Y11 [get_ports {ddr3_reset_n}]
|
||||
|
||||
# PadFunction: IO_L12P_T1_MRCC_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_cke}]
|
||||
set_property SLEW FAST [get_ports {ddr3_cke}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cke}]
|
||||
set_property PACKAGE_PIN AD12 [get_ports {ddr3_cke}]
|
||||
|
||||
# PadFunction: IO_L12N_T1_MRCC_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_odt}]
|
||||
set_property SLEW FAST [get_ports {ddr3_odt}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_odt}]
|
||||
set_property PACKAGE_PIN AD11 [get_ports {ddr3_odt}]
|
||||
|
||||
# PadFunction: IO_L11N_T1_SRCC_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_cs_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_cs_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cs_n}]
|
||||
set_property PACKAGE_PIN AF11 [get_ports {ddr3_cs_n}]
|
||||
|
||||
# PadFunction: IO_L16P_T2_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[0]}]
|
||||
set_property PACKAGE_PIN AA18 [get_ports {ddr3_dm[0]}]
|
||||
|
||||
# PadFunction: IO_L12P_T1_MRCC_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[1]}]
|
||||
set_property PACKAGE_PIN AF17 [get_ports {ddr3_dm[1]}]
|
||||
|
||||
# PadFunction: IO_L6P_T0_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[2]}]
|
||||
set_property PACKAGE_PIN AE16 [get_ports {ddr3_dm[2]}]
|
||||
|
||||
# PadFunction: IO_L24N_T3_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[3]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[3]}]
|
||||
set_property PACKAGE_PIN Y15 [get_ports {ddr3_dm[3]}]
|
||||
|
||||
# PadFunction: IO_L20P_T3_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[4]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[4]}]
|
||||
set_property PACKAGE_PIN AF7 [get_ports {ddr3_dm[4]}]
|
||||
|
||||
# PadFunction: IO_L7P_T1_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[5]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[5]}]
|
||||
set_property PACKAGE_PIN AF3 [get_ports {ddr3_dm[5]}]
|
||||
|
||||
# PadFunction: IO_L18P_T2_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[6]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[6]}]
|
||||
set_property PACKAGE_PIN AJ3 [get_ports {ddr3_dm[6]}]
|
||||
|
||||
# PadFunction: IO_L1P_T0_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[7]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[7]}]
|
||||
set_property PACKAGE_PIN AD4 [get_ports {ddr3_dm[7]}]
|
||||
|
||||
# PadFunction: IO_L15P_T2_DQS_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_p[0]}]
|
||||
set_property PACKAGE_PIN Y19 [get_ports {ddr3_dqs_p[0]}]
|
||||
|
||||
# PadFunction: IO_L15N_T2_DQS_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_n[0]}]
|
||||
set_property PACKAGE_PIN Y18 [get_ports {ddr3_dqs_n[0]}]
|
||||
|
||||
# PadFunction: IO_L9P_T1_DQS_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_p[1]}]
|
||||
set_property PACKAGE_PIN AJ18 [get_ports {ddr3_dqs_p[1]}]
|
||||
|
||||
# PadFunction: IO_L9N_T1_DQS_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_n[1]}]
|
||||
set_property PACKAGE_PIN AK18 [get_ports {ddr3_dqs_n[1]}]
|
||||
|
||||
# PadFunction: IO_L3P_T0_DQS_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_p[2]}]
|
||||
set_property PACKAGE_PIN AH16 [get_ports {ddr3_dqs_p[2]}]
|
||||
|
||||
# PadFunction: IO_L3N_T0_DQS_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_n[2]}]
|
||||
set_property PACKAGE_PIN AJ16 [get_ports {ddr3_dqs_n[2]}]
|
||||
|
||||
# PadFunction: IO_L21P_T3_DQS_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[3]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_p[3]}]
|
||||
set_property PACKAGE_PIN AC16 [get_ports {ddr3_dqs_p[3]}]
|
||||
|
||||
# PadFunction: IO_L21N_T3_DQS_32
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[3]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_n[3]}]
|
||||
set_property PACKAGE_PIN AC15 [get_ports {ddr3_dqs_n[3]}]
|
||||
|
||||
# PadFunction: IO_L21P_T3_DQS_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[4]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_p[4]}]
|
||||
set_property PACKAGE_PIN AH7 [get_ports {ddr3_dqs_p[4]}]
|
||||
|
||||
# PadFunction: IO_L21N_T3_DQS_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[4]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_n[4]}]
|
||||
set_property PACKAGE_PIN AJ7 [get_ports {ddr3_dqs_n[4]}]
|
||||
|
||||
# PadFunction: IO_L9P_T1_DQS_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[5]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_p[5]}]
|
||||
set_property PACKAGE_PIN AG4 [get_ports {ddr3_dqs_p[5]}]
|
||||
|
||||
# PadFunction: IO_L9N_T1_DQS_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[5]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_n[5]}]
|
||||
set_property PACKAGE_PIN AG3 [get_ports {ddr3_dqs_n[5]}]
|
||||
|
||||
# PadFunction: IO_L15P_T2_DQS_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[6]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_p[6]}]
|
||||
set_property PACKAGE_PIN AG2 [get_ports {ddr3_dqs_p[6]}]
|
||||
|
||||
# PadFunction: IO_L15N_T2_DQS_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[6]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_n[6]}]
|
||||
set_property PACKAGE_PIN AH1 [get_ports {ddr3_dqs_n[6]}]
|
||||
|
||||
# PadFunction: IO_L3P_T0_DQS_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[7]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_p[7]}]
|
||||
set_property PACKAGE_PIN AD2 [get_ports {ddr3_dqs_p[7]}]
|
||||
|
||||
# PadFunction: IO_L3N_T0_DQS_34
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[7]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dqs_n[7]}]
|
||||
set_property PACKAGE_PIN AD1 [get_ports {ddr3_dqs_n[7]}]
|
||||
|
||||
# PadFunction: IO_L13P_T2_MRCC_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ck_p}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ck_p}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_ck_p}]
|
||||
set_property PACKAGE_PIN AG10 [get_ports {ddr3_ck_p}]
|
||||
|
||||
# PadFunction: IO_L13N_T2_MRCC_33
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ck_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ck_n}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_ck_n}]
|
||||
set_property PACKAGE_PIN AH10 [get_ports {ddr3_ck_n}]
|
||||
|
||||
|
||||
|
||||
|
||||
#############SPI Configurate Setting##################
|
||||
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
|
||||
set_property CONFIG_MODE SPIx4 [current_design]
|
||||
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
|
||||
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
|
||||
set_property BITSTREAM.CONFIG.UNUSEDPIN Pullup [current_design]
|
||||
set_property CFGBVS VCCO [current_design]
|
||||
set_property CONFIG_VOLTAGE 3.3 [current_design]
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
`timescale 1ps/1ps
|
||||
|
||||
module clk_wiz
|
||||
(
|
||||
input clk_in1,
|
||||
output clk_out1,
|
||||
output clk_out2,
|
||||
output clk_out3,
|
||||
output clk_out4,
|
||||
input reset,
|
||||
output locked
|
||||
);
|
||||
wire clk_out1_clk_wiz_0;
|
||||
wire clk_out2_clk_wiz_0;
|
||||
wire clk_out3_clk_wiz_0;
|
||||
wire clk_out4_clk_wiz_0;
|
||||
|
||||
|
||||
wire clkfbout;
|
||||
|
||||
PLLE2_ADV
|
||||
#(.BANDWIDTH ("OPTIMIZED"),
|
||||
.COMPENSATION ("INTERNAL"),
|
||||
.STARTUP_WAIT ("FALSE"),
|
||||
.DIVCLK_DIVIDE (1),
|
||||
.CLKFBOUT_MULT (5), // 200 MHz * 5 = 1000 MHz
|
||||
.CLKFBOUT_PHASE (0.000),
|
||||
.CLKOUT0_DIVIDE (12), // 1000 MHz / 12 = 83.333 MHz
|
||||
.CLKOUT0_PHASE (0.000),
|
||||
.CLKOUT0_DUTY_CYCLE (0.500),
|
||||
.CLKOUT1_DIVIDE (3), // 1000 MHz / 3 = 333.333 MHz, 0 phase
|
||||
.CLKOUT1_PHASE (0.000),
|
||||
.CLKOUT1_DUTY_CYCLE (0.500),
|
||||
.CLKOUT2_DIVIDE (5), // 1000 MHz / 5 = 200 MHz
|
||||
.CLKOUT2_PHASE (0.000),
|
||||
.CLKOUT2_DUTY_CYCLE (0.500),
|
||||
.CLKOUT3_DIVIDE (3), // 1000 MHz / 3 = 333.333 MHz, 90 phase
|
||||
.CLKOUT3_PHASE (90.000),
|
||||
.CLKOUT3_DUTY_CYCLE (0.500),
|
||||
.CLKIN1_PERIOD (5.000) // 200 MHz input
|
||||
)
|
||||
plle2_adv_inst
|
||||
(
|
||||
.CLKFBOUT (clkfbout),
|
||||
.CLKOUT0 (clk_out1_clk_wiz_0),
|
||||
.CLKOUT1 (clk_out2_clk_wiz_0),
|
||||
.CLKOUT2 (clk_out3_clk_wiz_0),
|
||||
.CLKOUT3 (clk_out4_clk_wiz_0),
|
||||
.CLKFBIN (clkfbout),
|
||||
.CLKIN1 (clk_in1),
|
||||
.LOCKED (locked),
|
||||
.RST (reset)
|
||||
);
|
||||
BUFG clkout1_buf
|
||||
(.O (clk_out1),
|
||||
.I (clk_out1_clk_wiz_0));
|
||||
BUFG clkout2_buf
|
||||
(.O (clk_out2),
|
||||
.I (clk_out2_clk_wiz_0));
|
||||
BUFG clkout3_buf
|
||||
(.O (clk_out3),
|
||||
.I (clk_out3_clk_wiz_0));
|
||||
BUFG clkout4_buf
|
||||
(.O (clk_out4),
|
||||
.I (clk_out4_clk_wiz_0));
|
||||
endmodule
|
||||
|
|
@ -0,0 +1,207 @@
|
|||
|
||||
//
|
||||
// Module: uart_rx
|
||||
//
|
||||
// Notes:
|
||||
// - UART reciever module.
|
||||
//
|
||||
|
||||
module uart_rx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
input wire uart_rxd , // UART Recieve pin.
|
||||
input wire uart_rx_en , // Recieve enable
|
||||
output wire uart_rx_break, // Did we get a BREAK message?
|
||||
output wire uart_rx_valid, // Valid data recieved and available.
|
||||
output reg [PAYLOAD_BITS-1:0] uart_rx_data // The recieved data.
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_rxd line. Helps break long timing
|
||||
// paths from input pins into the logic.
|
||||
reg rxd_reg;
|
||||
reg rxd_reg_0;
|
||||
|
||||
//
|
||||
// Storage for the recieved serial data.
|
||||
reg [PAYLOAD_BITS-1:0] recieved_data;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of recieved bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Sample of the UART input line whenever we are in the middle of a bit frame.
|
||||
reg bit_sample;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_RECV = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Output assignment
|
||||
//
|
||||
|
||||
assign uart_rx_break = uart_rx_valid && ~|recieved_data;
|
||||
assign uart_rx_valid = fsm_state == FSM_STOP && n_fsm_state == FSM_IDLE;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if(!resetn) begin
|
||||
uart_rx_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if (fsm_state == FSM_STOP) begin
|
||||
uart_rx_data <= recieved_data;
|
||||
end
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT ||
|
||||
fsm_state == FSM_STOP &&
|
||||
cycle_counter == CYCLES_PER_BIT/2;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = rxd_reg ? FSM_IDLE : FSM_START;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_RECV : FSM_START;
|
||||
FSM_RECV : n_fsm_state = payload_done ? FSM_STOP : FSM_RECV ;
|
||||
FSM_STOP : n_fsm_state = next_bit ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the recieved data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_recieved_data
|
||||
if(!resetn) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE ) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit ) begin
|
||||
recieved_data[PAYLOAD_BITS-1] <= bit_sample;
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
recieved_data[i] <= recieved_data[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Increments the bit counter when recieving.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_RECV) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Sample the recieved bit when in the middle of a bit frame.
|
||||
always @(posedge clk) begin : p_bit_sample
|
||||
if(!resetn) begin
|
||||
bit_sample <= 1'b0;
|
||||
end else if (cycle_counter == CYCLES_PER_BIT/2) begin
|
||||
bit_sample <= rxd_reg;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when recieving.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_RECV ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the rxd_reg.
|
||||
always @(posedge clk) begin : p_rxd_reg
|
||||
if(!resetn) begin
|
||||
rxd_reg <= 1'b1;
|
||||
rxd_reg_0 <= 1'b1;
|
||||
end else if(uart_rx_en) begin
|
||||
rxd_reg <= rxd_reg_0;
|
||||
rxd_reg_0 <= uart_rxd;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
||||
|
|
@ -0,0 +1,187 @@
|
|||
|
||||
|
||||
//
|
||||
// Module: uart_tx
|
||||
//
|
||||
// Notes:
|
||||
// - UART transmitter module.
|
||||
//
|
||||
|
||||
module uart_tx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
output wire uart_txd , // UART transmit pin.
|
||||
output wire uart_tx_busy, // Module busy sending previous item.
|
||||
input wire uart_tx_en , // Send the data on uart_tx_data
|
||||
input wire [PAYLOAD_BITS-1:0] uart_tx_data // The data to be sent
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_txd line. Helps break long timing
|
||||
// paths from the logic to the output pins.
|
||||
reg txd_reg;
|
||||
|
||||
//
|
||||
// Storage for the serial data to be sent.
|
||||
reg [PAYLOAD_BITS-1:0] data_to_send;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of sent bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_SEND = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
assign uart_tx_busy = fsm_state != FSM_IDLE;
|
||||
assign uart_txd = txd_reg;
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
wire stop_done = bit_counter == STOP_BITS && fsm_state == FSM_STOP;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = uart_tx_en ? FSM_START: FSM_IDLE ;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_SEND : FSM_START;
|
||||
FSM_SEND : n_fsm_state = payload_done ? FSM_STOP : FSM_SEND ;
|
||||
FSM_STOP : n_fsm_state = stop_done ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the sent data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_data_to_send
|
||||
if(!resetn) begin
|
||||
data_to_send <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE && uart_tx_en) begin
|
||||
data_to_send <= uart_tx_data;
|
||||
end else if(fsm_state == FSM_SEND && next_bit ) begin
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
data_to_send[i] <= data_to_send[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the bit counter each time a new bit frame is sent.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_SEND && fsm_state != FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_SEND && n_fsm_state == FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_STOP&& next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end else if(fsm_state == FSM_SEND && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when sending.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_SEND ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the txd_reg.
|
||||
always @(posedge clk) begin : p_txd_reg
|
||||
if(!resetn) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_IDLE) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_START) begin
|
||||
txd_reg <= 1'b0;
|
||||
end else if(fsm_state == FSM_SEND) begin
|
||||
txd_reg <= data_to_send[0];
|
||||
end else if(fsm_state == FSM_STOP) begin
|
||||
txd_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
PROJECT = arty_ddr3
|
||||
BOARD = arty_s7_50
|
||||
FAMILY = spartan7
|
||||
PART = xc7s50csga324-1
|
||||
CHIPDB = ${SPARTAN7_CHIPDB}
|
||||
ADDITIONAL_SOURCES = ../../rtl/ddr3_controller.v ../../rtl/ddr3_phy.v ../../rtl/ddr3_top.v uart_rx.v uart_tx.v clk_wiz.v
|
||||
|
||||
#############################################################################################
|
||||
NEXTPNR_XILINX_DIR ?= /snap/openxc7/current/opt/nextpnr-xilinx
|
||||
NEXTPNR_XILINX_PYTHON_DIR ?= ${NEXTPNR_XILINX_DIR}/python
|
||||
PRJXRAY_DB_DIR ?= ${NEXTPNR_XILINX_DIR}/external/prjxray-db
|
||||
|
||||
DBPART = $(shell echo ${PART} | sed -e 's/-[0-9]//g')
|
||||
SPEEDGRADE = $(shell echo ${PART} | sed -e 's/.*\-\([0-9]\)/\1/g')
|
||||
|
||||
CHIPDB ?= ./
|
||||
ifeq ($(CHIPDB),)
|
||||
CHIPDB = ./
|
||||
endif
|
||||
|
||||
PYPY3 ?= pypy3
|
||||
|
||||
TOP ?= ${PROJECT}
|
||||
TOP_MODULE ?= ${TOP}
|
||||
TOP_VERILOG ?= ${TOP}.v
|
||||
|
||||
PNR_DEBUG ?= # --verbose --debug
|
||||
|
||||
BOARD ?= UNKNOWN
|
||||
JTAG_LINK ?= --board ${BOARD}
|
||||
|
||||
XDC ?= ${PROJECT}.xdc
|
||||
|
||||
.PHONY: all
|
||||
all: ${PROJECT}.bit
|
||||
|
||||
.PHONY: program
|
||||
program: ${PROJECT}.bit
|
||||
openFPGALoader ${JTAG_LINK} --bitstream $<
|
||||
|
||||
${PROJECT}.json: ${TOP_VERILOG} ${ADDITIONAL_SOURCES}
|
||||
yosys -p "synth_xilinx -flatten -abc9 ${SYNTH_OPTS} -arch xc7 -top ${TOP_MODULE}; write_json ${PROJECT}.json" $< ${ADDITIONAL_SOURCES}
|
||||
|
||||
# The chip database only needs to be generated once
|
||||
# that is why we don't clean it with make clean
|
||||
${CHIPDB}/${DBPART}.bin:
|
||||
${PYPY3} ${NEXTPNR_XILINX_PYTHON_DIR}/bbaexport.py --device ${PART} --bba ${DBPART}.bba
|
||||
bbasm -l ${DBPART}.bba ${CHIPDB}/${DBPART}.bin
|
||||
rm -f ${DBPART}.bba
|
||||
|
||||
${PROJECT}.fasm: ${PROJECT}.json ${CHIPDB}/${DBPART}.bin ${XDC}
|
||||
nextpnr-xilinx --chipdb ${CHIPDB}/${DBPART}.bin --xdc ${XDC} --json ${PROJECT}.json --fasm $@ ${PNR_ARGS} ${PNR_DEBUG}
|
||||
|
||||
${PROJECT}.frames: ${PROJECT}.fasm
|
||||
fasm2frames --part ${PART} --db-root ${PRJXRAY_DB_DIR}/${FAMILY} $< > $@
|
||||
|
||||
${PROJECT}.bit: ${PROJECT}.frames
|
||||
xc7frames2bit --part_file ${PRJXRAY_DB_DIR}/${FAMILY}/${PART}/part.yaml --part_name ${PART} --frm_file $< --output_file $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@rm -f *.bit
|
||||
@rm -f *.frames
|
||||
@rm -f *.fasm
|
||||
@rm -f *.json
|
||||
@rm -f *.bin
|
||||
@rm -f *.bba
|
||||
|
||||
.PHONY: pnrclean
|
||||
pnrclean:
|
||||
rm *.fasm *.frames *.bit
|
||||
|
|
@ -73,7 +73,7 @@
|
|||
reg[7:0] i_wb_data;
|
||||
reg[7:0] i_wb_addr;
|
||||
// o_debug1 taps on value of state_calibrate (can be traced inside ddr3_controller module)
|
||||
assign led[0] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[0] = (o_debug1[4:0] != 23); //light up if not at DONE_CALIBRATE
|
||||
assign led[1] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[2] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[3] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
|
|
@ -114,22 +114,52 @@
|
|||
// Clock in ports
|
||||
.clk_in1(i_clk)
|
||||
);
|
||||
|
||||
// UART module from https://github.com/alexforencich/verilog-uart
|
||||
uart #(.DATA_WIDTH(8)) uart_m
|
||||
(
|
||||
.clk(i_controller_clk),
|
||||
.rst(i_rst),
|
||||
.s_axis_tdata(o_wb_data),
|
||||
.s_axis_tvalid(o_wb_ack),
|
||||
.s_axis_tready(),
|
||||
.m_axis_tdata(rd_data),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(1),
|
||||
.rxd(rx),
|
||||
.txd(tx),
|
||||
.prescale(1085) //9600 Baud Rate (83.33MHz/(8*9600))
|
||||
|
||||
// UART TX/RXmodule from https://github.com/ben-marshall/uart
|
||||
uart_tx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_tx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(!i_rst && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_txd(tx), // UART transmit pin.
|
||||
.uart_tx_busy(), // Module busy sending previous item.
|
||||
.uart_tx_en(o_wb_ack), // Send the data on uart_tx_data
|
||||
.uart_tx_data(o_wb_data) // The data to be sent
|
||||
);
|
||||
uart_rx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_rx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(!i_rst && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_rxd(rx), // UART Recieve pin.
|
||||
.uart_rx_en(o_debug1[4:0] == 23), // Recieve enable
|
||||
.uart_rx_break(), // Did we get a BREAK message?
|
||||
.uart_rx_valid(m_axis_tvalid), // Valid data recieved/available.
|
||||
.uart_rx_data(rd_data) // The recieved data.
|
||||
);
|
||||
|
||||
|
||||
// UART module from https://github.com/alexforencich/verilog-uart (DOES NOT WORK ON OPENXC7, UberDDR3 cannot finish calibration when this UART is used)
|
||||
// uart #(.DATA_WIDTH(8)) uart_m
|
||||
// (
|
||||
// .clk(i_controller_clk),
|
||||
// .rst(i_rst),
|
||||
// .s_axis_tdata(o_wb_data),
|
||||
// .s_axis_tvalid(o_wb_ack),
|
||||
// .s_axis_tready(),
|
||||
// .m_axis_tdata(rd_data),
|
||||
// .m_axis_tvalid(m_axis_tvalid),
|
||||
// .m_axis_tready(1),
|
||||
// .rxd(rx),
|
||||
// .txd(tx),
|
||||
// .prescale(1085) //9600 Baud Rate (83.33MHz/(8*9600))
|
||||
// );
|
||||
|
||||
// DDR3 Controller
|
||||
ddr3_top #(
|
||||
|
|
|
|||
|
|
@ -260,6 +260,6 @@ set_property CONFIG_MODE SPIx4 [current_design]
|
|||
## be set to enable an internal VREF for BANK 34. Since a 1.35v supply is being
|
||||
## used the internal reference is set to half that value (i.e. 0.675v). Note that
|
||||
## this property must be set even if SW3 is not used in the design.
|
||||
set_property INTERNAL_VREF 0.675 [get_iobanks 34]
|
||||
# set_property INTERNAL_VREF 0.675 [get_iobanks 34]
|
||||
|
||||
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire tx_busy,
|
||||
output wire rx_busy,
|
||||
output wire rx_overrun_error,
|
||||
output wire rx_frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
|
||||
);
|
||||
|
||||
uart_tx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_tx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi input
|
||||
.s_axis_tdata(s_axis_tdata),
|
||||
.s_axis_tvalid(s_axis_tvalid),
|
||||
.s_axis_tready(s_axis_tready),
|
||||
// output
|
||||
.txd(txd),
|
||||
// status
|
||||
.busy(tx_busy),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
uart_rx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_rx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi output
|
||||
.m_axis_tdata(m_axis_tdata),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(m_axis_tready),
|
||||
// input
|
||||
.rxd(rxd),
|
||||
// status
|
||||
.busy(rx_busy),
|
||||
.overrun_error(rx_overrun_error),
|
||||
.frame_error(rx_frame_error),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
|
@ -1,142 +1,207 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_rx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
output wire overrun_error,
|
||||
output wire frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
//
|
||||
// Module: uart_rx
|
||||
//
|
||||
// Notes:
|
||||
// - UART reciever module.
|
||||
//
|
||||
|
||||
module uart_rx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
input wire uart_rxd , // UART Recieve pin.
|
||||
input wire uart_rx_en , // Recieve enable
|
||||
output wire uart_rx_break, // Did we get a BREAK message?
|
||||
output wire uart_rx_valid, // Valid data recieved and available.
|
||||
output reg [PAYLOAD_BITS-1:0] uart_rx_data // The recieved data.
|
||||
);
|
||||
|
||||
reg [DATA_WIDTH-1:0] m_axis_tdata_reg = 0;
|
||||
reg m_axis_tvalid_reg = 0;
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
reg rxd_reg = 1;
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
reg busy_reg = 0;
|
||||
reg overrun_error_reg = 0;
|
||||
reg frame_error_reg = 0;
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
reg [DATA_WIDTH-1:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
assign m_axis_tdata = m_axis_tdata_reg;
|
||||
assign m_axis_tvalid = m_axis_tvalid_reg;
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
assign busy = busy_reg;
|
||||
assign overrun_error = overrun_error_reg;
|
||||
assign frame_error = frame_error_reg;
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_rxd line. Helps break long timing
|
||||
// paths from input pins into the logic.
|
||||
reg rxd_reg;
|
||||
reg rxd_reg_0;
|
||||
|
||||
//
|
||||
// Storage for the recieved serial data.
|
||||
reg [PAYLOAD_BITS-1:0] recieved_data;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of recieved bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Sample of the UART input line whenever we are in the middle of a bit frame.
|
||||
reg bit_sample;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_RECV = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Output assignment
|
||||
//
|
||||
|
||||
assign uart_rx_break = uart_rx_valid && ~|recieved_data;
|
||||
assign uart_rx_valid = fsm_state == FSM_STOP && n_fsm_state == FSM_IDLE;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
m_axis_tdata_reg <= 0;
|
||||
m_axis_tvalid_reg <= 0;
|
||||
rxd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
end else begin
|
||||
rxd_reg <= rxd;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
if(!resetn) begin
|
||||
uart_rx_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if (fsm_state == FSM_STOP) begin
|
||||
uart_rx_data <= recieved_data;
|
||||
end
|
||||
end
|
||||
|
||||
if (m_axis_tvalid && m_axis_tready) begin
|
||||
m_axis_tvalid_reg <= 0;
|
||||
end
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
if (prescale_reg > 0) begin
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt > 0) begin
|
||||
if (bit_cnt > DATA_WIDTH+1) begin
|
||||
if (!rxd_reg) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
end else begin
|
||||
bit_cnt <= 0;
|
||||
prescale_reg <= 0;
|
||||
end
|
||||
end else if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
data_reg <= {rxd_reg, data_reg[DATA_WIDTH-1:1]};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
if (rxd_reg) begin
|
||||
m_axis_tdata_reg <= data_reg;
|
||||
m_axis_tvalid_reg <= 1;
|
||||
overrun_error_reg <= m_axis_tvalid_reg;
|
||||
end else begin
|
||||
frame_error_reg <= 1;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
busy_reg <= 0;
|
||||
if (!rxd_reg) begin
|
||||
prescale_reg <= (prescale << 2)-2;
|
||||
bit_cnt <= DATA_WIDTH+2;
|
||||
data_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT ||
|
||||
fsm_state == FSM_STOP &&
|
||||
cycle_counter == CYCLES_PER_BIT/2;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = rxd_reg ? FSM_IDLE : FSM_START;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_RECV : FSM_START;
|
||||
FSM_RECV : n_fsm_state = payload_done ? FSM_STOP : FSM_RECV ;
|
||||
FSM_STOP : n_fsm_state = next_bit ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the recieved data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_recieved_data
|
||||
if(!resetn) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE ) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit ) begin
|
||||
recieved_data[PAYLOAD_BITS-1] <= bit_sample;
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
recieved_data[i] <= recieved_data[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Increments the bit counter when recieving.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_RECV) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Sample the recieved bit when in the middle of a bit frame.
|
||||
always @(posedge clk) begin : p_bit_sample
|
||||
if(!resetn) begin
|
||||
bit_sample <= 1'b0;
|
||||
end else if (cycle_counter == CYCLES_PER_BIT/2) begin
|
||||
bit_sample <= rxd_reg;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when recieving.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_RECV ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the rxd_reg.
|
||||
always @(posedge clk) begin : p_rxd_reg
|
||||
if(!resetn) begin
|
||||
rxd_reg <= 1'b1;
|
||||
rxd_reg_0 <= 1'b1;
|
||||
end else if(uart_rx_en) begin
|
||||
rxd_reg <= rxd_reg_0;
|
||||
rxd_reg_0 <= uart_rxd;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -1,115 +1,187 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// Module: uart_tx
|
||||
//
|
||||
// Notes:
|
||||
// - UART transmitter module.
|
||||
//
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_tx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
module uart_tx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
output wire uart_txd , // UART transmit pin.
|
||||
output wire uart_tx_busy, // Module busy sending previous item.
|
||||
input wire uart_tx_en , // Send the data on uart_tx_data
|
||||
input wire [PAYLOAD_BITS-1:0] uart_tx_data // The data to be sent
|
||||
);
|
||||
|
||||
reg s_axis_tready_reg = 0;
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
reg txd_reg = 1;
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
reg busy_reg = 0;
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
reg [DATA_WIDTH:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
assign s_axis_tready = s_axis_tready_reg;
|
||||
assign txd = txd_reg;
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
assign busy = busy_reg;
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
txd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
end else begin
|
||||
if (prescale_reg > 0) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt == 0) begin
|
||||
s_axis_tready_reg <= 1;
|
||||
busy_reg <= 0;
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
if (s_axis_tvalid) begin
|
||||
s_axis_tready_reg <= !s_axis_tready_reg;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
bit_cnt <= DATA_WIDTH+1;
|
||||
data_reg <= {1'b1, s_axis_tdata};
|
||||
txd_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
end else begin
|
||||
if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
{data_reg, txd_reg} <= {1'b0, data_reg};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3);
|
||||
txd_reg <= 1;
|
||||
end
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_txd line. Helps break long timing
|
||||
// paths from the logic to the output pins.
|
||||
reg txd_reg;
|
||||
|
||||
//
|
||||
// Storage for the serial data to be sent.
|
||||
reg [PAYLOAD_BITS-1:0] data_to_send;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of sent bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_SEND = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
assign uart_tx_busy = fsm_state != FSM_IDLE;
|
||||
assign uart_txd = txd_reg;
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
wire stop_done = bit_counter == STOP_BITS && fsm_state == FSM_STOP;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = uart_tx_en ? FSM_START: FSM_IDLE ;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_SEND : FSM_START;
|
||||
FSM_SEND : n_fsm_state = payload_done ? FSM_STOP : FSM_SEND ;
|
||||
FSM_STOP : n_fsm_state = stop_done ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the sent data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_data_to_send
|
||||
if(!resetn) begin
|
||||
data_to_send <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE && uart_tx_en) begin
|
||||
data_to_send <= uart_tx_data;
|
||||
end else if(fsm_state == FSM_SEND && next_bit ) begin
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
data_to_send[i] <= data_to_send[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the bit counter each time a new bit frame is sent.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_SEND && fsm_state != FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_SEND && n_fsm_state == FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_STOP&& next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end else if(fsm_state == FSM_SEND && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when sending.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_SEND ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the txd_reg.
|
||||
always @(posedge clk) begin : p_txd_reg
|
||||
if(!resetn) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_IDLE) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_START) begin
|
||||
txd_reg <= 1'b0;
|
||||
end else if(fsm_state == FSM_SEND) begin
|
||||
txd_reg <= data_to_send[0];
|
||||
end else if(fsm_state == FSM_STOP) begin
|
||||
txd_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -0,0 +1,71 @@
|
|||
FAMILY = kintex7
|
||||
PART = xc7k160tffg676-2
|
||||
BOARD = qmtechKintex7
|
||||
PROJECT = enclustra_ddr3
|
||||
CHIPDB = ${KINTEX7_CHIPDB}
|
||||
ADDITIONAL_SOURCES = ../../rtl/ddr3_controller.v ../../rtl/ddr3_phy.v ../../rtl/ddr3_top.v uart_rx.v uart_tx.v clk_wiz.v
|
||||
|
||||
#############################################################################################
|
||||
NEXTPNR_XILINX_DIR ?= /snap/openxc7/current/opt/nextpnr-xilinx
|
||||
NEXTPNR_XILINX_PYTHON_DIR ?= ${NEXTPNR_XILINX_DIR}/python
|
||||
PRJXRAY_DB_DIR ?= ${NEXTPNR_XILINX_DIR}/external/prjxray-db
|
||||
|
||||
DBPART = $(shell echo ${PART} | sed -e 's/-[0-9]//g')
|
||||
SPEEDGRADE = $(shell echo ${PART} | sed -e 's/.*\-\([0-9]\)/\1/g')
|
||||
|
||||
CHIPDB ?= ./
|
||||
ifeq ($(CHIPDB),)
|
||||
CHIPDB = ./
|
||||
endif
|
||||
|
||||
PYPY3 ?= pypy3
|
||||
|
||||
TOP ?= ${PROJECT}
|
||||
TOP_MODULE ?= ${TOP}
|
||||
TOP_VERILOG ?= ${TOP}.v
|
||||
|
||||
PNR_DEBUG ?= # --verbose --debug
|
||||
|
||||
BOARD ?= UNKNOWN
|
||||
JTAG_LINK ?= --board ${BOARD}
|
||||
|
||||
XDC ?= ${PROJECT}.xdc
|
||||
|
||||
.PHONY: all
|
||||
all: ${PROJECT}.bit
|
||||
|
||||
.PHONY: program
|
||||
program: ${PROJECT}.bit
|
||||
openFPGALoader ${JTAG_LINK} --bitstream $<
|
||||
|
||||
${PROJECT}.json: ${TOP_VERILOG} ${ADDITIONAL_SOURCES}
|
||||
yosys -p "synth_xilinx -flatten -abc9 ${SYNTH_OPTS} -arch xc7 -top ${TOP_MODULE}; write_json ${PROJECT}.json" $< ${ADDITIONAL_SOURCES}
|
||||
|
||||
# The chip database only needs to be generated once
|
||||
# that is why we don't clean it with make clean
|
||||
${CHIPDB}/${DBPART}.bin:
|
||||
${PYPY3} ${NEXTPNR_XILINX_PYTHON_DIR}/bbaexport.py --device ${PART} --bba ${DBPART}.bba
|
||||
bbasm -l ${DBPART}.bba ${CHIPDB}/${DBPART}.bin
|
||||
rm -f ${DBPART}.bba
|
||||
|
||||
${PROJECT}.fasm: ${PROJECT}.json ${CHIPDB}/${DBPART}.bin ${XDC}
|
||||
nextpnr-xilinx --chipdb ${CHIPDB}/${DBPART}.bin --xdc ${XDC} --json ${PROJECT}.json --fasm $@ ${PNR_ARGS} ${PNR_DEBUG}
|
||||
|
||||
${PROJECT}.frames: ${PROJECT}.fasm
|
||||
fasm2frames --part ${PART} --db-root ${PRJXRAY_DB_DIR}/${FAMILY} $< > $@
|
||||
|
||||
${PROJECT}.bit: ${PROJECT}.frames
|
||||
xc7frames2bit --part_file ${PRJXRAY_DB_DIR}/${FAMILY}/${PART}/part.yaml --part_name ${PART} --frm_file $< --output_file $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@rm -f *.bit
|
||||
@rm -f *.frames
|
||||
@rm -f *.fasm
|
||||
@rm -f *.json
|
||||
@rm -f *.bin
|
||||
@rm -f *.bba
|
||||
|
||||
.PHONY: pnrclean
|
||||
pnrclean:
|
||||
rm *.fasm *.frames *.bit
|
||||
|
|
@ -6,12 +6,14 @@ module clk_wiz
|
|||
output clk_out1,
|
||||
output clk_out2,
|
||||
output clk_out3,
|
||||
output clk_out4,
|
||||
input reset,
|
||||
output locked
|
||||
);
|
||||
wire clk_out1_clk_wiz_0;
|
||||
wire clk_out2_clk_wiz_0;
|
||||
wire clk_out3_clk_wiz_0;
|
||||
wire clk_out4_clk_wiz_0;
|
||||
|
||||
wire clkfbout;
|
||||
|
||||
|
|
@ -20,18 +22,21 @@ module clk_wiz
|
|||
.COMPENSATION ("INTERNAL"),
|
||||
.STARTUP_WAIT ("FALSE"),
|
||||
.DIVCLK_DIVIDE (1),
|
||||
.CLKFBOUT_MULT (8), // 100 MHz * 8 = 800 MHz
|
||||
.CLKFBOUT_MULT (5), // 200 MHz * 5 = 1000 MHz
|
||||
.CLKFBOUT_PHASE (0.000),
|
||||
.CLKOUT0_DIVIDE (8), // 800 MHz / 8 = 100 MHz
|
||||
.CLKOUT0_DIVIDE (12), // 1000 MHz / 12 = 83.333 MHz
|
||||
.CLKOUT0_PHASE (0.000),
|
||||
.CLKOUT0_DUTY_CYCLE (0.500),
|
||||
.CLKOUT1_DIVIDE (2), // 800 MHz / 2 = 400 MHz
|
||||
.CLKOUT1_DIVIDE (3), // 1000 MHz / 3 = 333.333 MHz
|
||||
.CLKOUT1_PHASE (0.000),
|
||||
.CLKOUT1_DUTY_CYCLE (0.500),
|
||||
.CLKOUT2_DIVIDE (4), // 800 MHz / 4 = 200 MHz
|
||||
.CLKOUT2_DIVIDE (5), // 1000 MHz / 5 = 200 MHz
|
||||
.CLKOUT2_PHASE (0.000),
|
||||
.CLKOUT2_DUTY_CYCLE (0.500),
|
||||
.CLKIN1_PERIOD (10.000) // 100 MHz input
|
||||
.CLKOUT3_DIVIDE (3), // 1000 MHz / 3 = 333.333 MHz, 90 phase
|
||||
.CLKOUT3_PHASE (90.000),
|
||||
.CLKOUT3_DUTY_CYCLE (0.500),
|
||||
.CLKIN1_PERIOD (5) // 200 MHz input
|
||||
)
|
||||
plle2_adv_inst
|
||||
(
|
||||
|
|
@ -39,6 +44,7 @@ module clk_wiz
|
|||
.CLKOUT0 (clk_out1_clk_wiz_0),
|
||||
.CLKOUT1 (clk_out2_clk_wiz_0),
|
||||
.CLKOUT2 (clk_out3_clk_wiz_0),
|
||||
.CLKOUT3 (clk_out4_clk_wiz_0),
|
||||
.CLKFBIN (clkfbout),
|
||||
.CLKIN1 (clk_in1),
|
||||
.LOCKED (locked),
|
||||
|
|
@ -53,5 +59,8 @@ module clk_wiz
|
|||
BUFG clkout3_buf
|
||||
(.O (clk_out3),
|
||||
.I (clk_out3_clk_wiz_0));
|
||||
BUFG clkout4_buf
|
||||
(.O (clk_out4),
|
||||
.I (clk_out4_clk_wiz_0));
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -1,210 +0,0 @@
|
|||
################################################################################
|
||||
################################################################################
|
||||
set_property CFGBVS GND [current_design]
|
||||
set_property CONFIG_VOLTAGE 1.8 [current_design]
|
||||
set_property BITSTREAM.CONFIG.CONFIGRATE 22 [current_design]
|
||||
set_property BITSTREAM.CONFIG.OVERTEMPPOWERDOWN ENABLE [current_design]
|
||||
set_property BITSTREAM.CONFIG.UNUSEDPIN PULLNONE [current_design]
|
||||
|
||||
# set_property -dict {PACKAGE_PIN AD24 IOSTANDARD LVCMOS18 } [get_ports {CLK_100_CAL}]
|
||||
set_property DCI_CASCADE {32 33} [get_iobanks 34]
|
||||
## For a 1.5V memory, the appropriate VREF voltage is half of 1.5, or 0.75 Volts
|
||||
## Of the DDR3 bank(s), only bank 33 needs the INTERNAL_VREF. The other DDR3
|
||||
## banks are explicitly connected to an external VREF signal. However, bank
|
||||
## 33s IOs are overloaded--there was no room for the VREF. Hence, to spare
|
||||
## two pins, bank 33 uses an internal voltage reference. Sadly, the same
|
||||
## problem plays out in banks 12-16 as well.
|
||||
set_property INTERNAL_VREF 0.750 [get_iobanks 33]
|
||||
## Other IO banks have internal VREFs as well, those these aren't as critical
|
||||
set_property INTERNAL_VREF 0.90 [get_iobanks 12]
|
||||
set_property INTERNAL_VREF 0.60 [get_iobanks 13]
|
||||
set_property INTERNAL_VREF 0.90 [get_iobanks 14]
|
||||
set_property INTERNAL_VREF 0.90 [get_iobanks 15]
|
||||
set_property INTERNAL_VREF 0.90 [get_iobanks 16]
|
||||
|
||||
## Clocks
|
||||
# 100MHz single ended input clock
|
||||
set_property -dict {PACKAGE_PIN AA4 IOSTANDARD SSTL15 } [get_ports {i_clk}];
|
||||
create_clock -name i_clk -period 10.000 [get_ports i_clk];
|
||||
|
||||
# Baseboard LEDs
|
||||
# set_property -dict {SLEW SLOW PACKAGE_PIN F22 IOSTANDARD LVCMOS18 } [get_ports { o_led_status[4] }]; # GPIO0_LED0_N
|
||||
set_property -dict {SLEW SLOW PACKAGE_PIN E23 IOSTANDARD LVCMOS18 } [get_ports { led[0] }]; # GPIO1_LED1_N
|
||||
set_property -dict {SLEW SLOW PACKAGE_PIN K25 IOSTANDARD LVCMOS12 } [get_ports { led[1] }]; # LED2
|
||||
set_property -dict {SLEW SLOW PACKAGE_PIN K26 IOSTANDARD LVCMOS12 } [get_ports { led[2] }]; # LED3
|
||||
|
||||
## UART
|
||||
## {{{
|
||||
set_property -dict {PACKAGE_PIN B20 IOSTANDARD LVCMOS18 } [get_ports {rx}]; # UART_RX
|
||||
set_property -dict {PACKAGE_PIN A20 IOSTANDARD LVCMOS18 } [get_ports {tx}]; # UART_TX
|
||||
## }}}
|
||||
|
||||
## Buttons
|
||||
## {{{
|
||||
set_property -dict {PACKAGE_PIN C22 IOSTANDARD LVCMOS18 } [get_ports {i_rst_n}]; # (Not in TCL)
|
||||
|
||||
## DDR3 MEMORY
|
||||
set_property -dict {PACKAGE_PIN AB7 IOSTANDARD LVCMOS15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_reset_n}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AB12 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_clk_p}];
|
||||
set_property -dict {PACKAGE_PIN AC12 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_clk_n}];
|
||||
set_property -dict {PACKAGE_PIN AA13 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_cke}]; ## CKE
|
||||
## set_property -dict {SLEW SLOW PACKAGE_PIN AA3 IOSTANDARD LVCMOS15 } [get_ports {o_ddr3_vsel}];
|
||||
set_property -dict {PACKAGE_PIN Y12 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_cs_n}];
|
||||
set_property -dict {PACKAGE_PIN AE13 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_ras_n}]
|
||||
set_property -dict {PACKAGE_PIN AE12 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_cas_n}];
|
||||
set_property -dict {PACKAGE_PIN AA12 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_we_n}];
|
||||
set_property -dict {PACKAGE_PIN AD13 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_odt}];
|
||||
|
||||
|
||||
## Address lines
|
||||
set_property -dict {PACKAGE_PIN AE11 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[0]}];
|
||||
set_property -dict {PACKAGE_PIN AF9 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[1]}];
|
||||
set_property -dict {PACKAGE_PIN AD10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[2]}];
|
||||
set_property -dict {PACKAGE_PIN AB10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[3]}];
|
||||
set_property -dict {PACKAGE_PIN AA9 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[4]}];
|
||||
set_property -dict {PACKAGE_PIN AB9 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[5]}];
|
||||
set_property -dict {PACKAGE_PIN AA8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[6]}];
|
||||
set_property -dict {PACKAGE_PIN AC8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[7]}];
|
||||
set_property -dict {PACKAGE_PIN AA7 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[8]}];
|
||||
set_property -dict {PACKAGE_PIN AE8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[9]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AF10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[10]}];
|
||||
set_property -dict {PACKAGE_PIN AD8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[11]}];
|
||||
set_property -dict {PACKAGE_PIN AE10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[12]}];
|
||||
set_property -dict {PACKAGE_PIN AF8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[13]}];
|
||||
set_property -dict {PACKAGE_PIN AC7 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[14]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AD11 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_ba[0]}];
|
||||
set_property -dict {PACKAGE_PIN AA10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_ba[1]}];
|
||||
set_property -dict {PACKAGE_PIN AF12 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_ba[2]}];
|
||||
|
||||
|
||||
## Byte lane #0
|
||||
set_property -dict {PACKAGE_PIN AA2 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[0]}];
|
||||
set_property -dict {PACKAGE_PIN Y2 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[1]}];
|
||||
set_property -dict {PACKAGE_PIN AB2 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[2]}];
|
||||
set_property -dict {PACKAGE_PIN V1 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[3]}];
|
||||
set_property -dict {PACKAGE_PIN Y1 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[4]}];
|
||||
set_property -dict {PACKAGE_PIN W1 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[5]}];
|
||||
set_property -dict {PACKAGE_PIN AC2 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[6]}];
|
||||
set_property -dict {PACKAGE_PIN V2 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[7]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN Y3 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[0]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AB1 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[0]}];
|
||||
set_property -dict {PACKAGE_PIN AC1 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[0]}];
|
||||
|
||||
|
||||
## Byte lane #1
|
||||
set_property -dict {PACKAGE_PIN W3 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[8]}];
|
||||
set_property -dict {PACKAGE_PIN V3 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[9]}];
|
||||
set_property -dict {PACKAGE_PIN U1 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[10]}];
|
||||
set_property -dict {PACKAGE_PIN U7 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[11]}];
|
||||
set_property -dict {PACKAGE_PIN U6 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[12]}];
|
||||
set_property -dict {PACKAGE_PIN V4 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[13]}];
|
||||
set_property -dict {PACKAGE_PIN V6 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[14]}];
|
||||
set_property -dict {PACKAGE_PIN U2 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[15]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN U5 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[1]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN W6 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[1]}];
|
||||
set_property -dict {PACKAGE_PIN W5 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[1]}];
|
||||
|
||||
|
||||
## Byte lane #2
|
||||
set_property -dict {PACKAGE_PIN AE3 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[16]}];
|
||||
set_property -dict {PACKAGE_PIN AE6 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[17]}];
|
||||
set_property -dict {PACKAGE_PIN AF3 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[18]}];
|
||||
set_property -dict {PACKAGE_PIN AD1 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[19]}];
|
||||
set_property -dict {PACKAGE_PIN AE1 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[20]}];
|
||||
set_property -dict {PACKAGE_PIN AE2 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[21]}];
|
||||
set_property -dict {PACKAGE_PIN AF2 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[22]}];
|
||||
set_property -dict {PACKAGE_PIN AE5 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[23]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AD4 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[2]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AF5 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[2]}];
|
||||
set_property -dict {PACKAGE_PIN AF4 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[2]}];
|
||||
|
||||
|
||||
## Byte lane #3
|
||||
set_property -dict {PACKAGE_PIN AD5 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[24]}];
|
||||
set_property -dict {PACKAGE_PIN Y5 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[25]}];
|
||||
set_property -dict {PACKAGE_PIN AC6 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[26]}];
|
||||
set_property -dict {PACKAGE_PIN Y6 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[27]}];
|
||||
set_property -dict {PACKAGE_PIN AB4 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[28]}];
|
||||
set_property -dict {PACKAGE_PIN AD6 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[29]}];
|
||||
set_property -dict {PACKAGE_PIN AB6 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[30]}];
|
||||
set_property -dict {PACKAGE_PIN AC3 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[31]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AC4 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[3]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AA5 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[3]}];
|
||||
set_property -dict {PACKAGE_PIN AB5 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[3]}];
|
||||
|
||||
|
||||
## Byte lane #4
|
||||
set_property -dict {PACKAGE_PIN AD16 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[32]}];
|
||||
set_property -dict {PACKAGE_PIN AE17 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[33]}];
|
||||
set_property -dict {PACKAGE_PIN AF15 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[34]}];
|
||||
set_property -dict {PACKAGE_PIN AF20 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[35]}];
|
||||
set_property -dict {PACKAGE_PIN AD15 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[36]}];
|
||||
set_property -dict {PACKAGE_PIN AF14 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[37]}];
|
||||
set_property -dict {PACKAGE_PIN AE15 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[38]}];
|
||||
set_property -dict {PACKAGE_PIN AF17 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[39]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AF19 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[4]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AE18 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[4]}];
|
||||
set_property -dict {PACKAGE_PIN AF18 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[4]}];
|
||||
|
||||
|
||||
## Byte lane #5
|
||||
set_property -dict {PACKAGE_PIN AA14 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[40]}];
|
||||
set_property -dict {PACKAGE_PIN AA15 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[41]}];
|
||||
set_property -dict {PACKAGE_PIN AC14 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[42]}];
|
||||
set_property -dict {PACKAGE_PIN AD14 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[43]}];
|
||||
set_property -dict {PACKAGE_PIN AB14 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[44]}];
|
||||
set_property -dict {PACKAGE_PIN AB15 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[45]}];
|
||||
set_property -dict {PACKAGE_PIN AA17 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[46]}];
|
||||
set_property -dict {PACKAGE_PIN AA18 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[47]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN AC16 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[5]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN Y15 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[5]}];
|
||||
set_property -dict {PACKAGE_PIN Y16 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[5]}];
|
||||
|
||||
|
||||
## Byte lane #6
|
||||
set_property -dict {PACKAGE_PIN AB20 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[48]}];
|
||||
set_property -dict {PACKAGE_PIN AD19 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[49]}];
|
||||
set_property -dict {PACKAGE_PIN AC19 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[50]}];
|
||||
set_property -dict {PACKAGE_PIN AA20 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[51]}];
|
||||
set_property -dict {PACKAGE_PIN AA19 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[52]}];
|
||||
set_property -dict {PACKAGE_PIN AC17 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[53]}];
|
||||
set_property -dict {PACKAGE_PIN AD18 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[54]}];
|
||||
set_property -dict {PACKAGE_PIN AB17 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[55]}];
|
||||
set_property -dict {PACKAGE_PIN AB19 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[6]}];
|
||||
set_property -dict {PACKAGE_PIN AD20 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[6]}];
|
||||
set_property -dict {PACKAGE_PIN AE20 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[6]}];
|
||||
|
||||
|
||||
## Byte lane #7
|
||||
set_property -dict {PACKAGE_PIN W15 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[56]}];
|
||||
set_property -dict {PACKAGE_PIN W16 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[57]}];
|
||||
set_property -dict {PACKAGE_PIN W14 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[58]}];
|
||||
set_property -dict {PACKAGE_PIN V16 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[59]}];
|
||||
set_property -dict {PACKAGE_PIN V19 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[60]}];
|
||||
set_property -dict {PACKAGE_PIN V17 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[61]}];
|
||||
set_property -dict {PACKAGE_PIN V18 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[62]}];
|
||||
set_property -dict {PACKAGE_PIN Y17 IOSTANDARD SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[63]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN V14 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[7]}];
|
||||
|
||||
set_property -dict {PACKAGE_PIN W18 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[7]}];
|
||||
set_property -dict {PACKAGE_PIN W19 IOSTANDARD DIFF_SSTL15_T_DCI SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[7]}];
|
||||
|
||||
|
||||
|
||||
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
|
||||
|
|
@ -0,0 +1,210 @@
|
|||
################################################################################
|
||||
################################################################################
|
||||
set_property CFGBVS GND [current_design]
|
||||
set_property CONFIG_VOLTAGE 1.8 [current_design]
|
||||
set_property BITSTREAM.CONFIG.CONFIGRATE 22 [current_design]
|
||||
set_property BITSTREAM.CONFIG.OVERTEMPPOWERDOWN ENABLE [current_design]
|
||||
set_property BITSTREAM.CONFIG.UNUSEDPIN PULLNONE [current_design]
|
||||
|
||||
# set_property -dict {PACKAGE_PIN AD24 IOSTANDARD LVCMOS18 } [get_ports {CLK_100_CAL}]
|
||||
# set_property DCI_CASCADE {32 33} [get_iobanks 34]
|
||||
## For a 1.5V memory, the appropriate VREF voltage is half of 1.5, or 0.75 Volts
|
||||
## Of the DDR3 bank(s), only bank 33 needs the INTERNAL_VREF. The other DDR3
|
||||
## banks are explicitly connected to an external VREF signal. However, bank
|
||||
## 33s IOs are overloaded--there was no room for the VREF. Hence, to spare
|
||||
## two pins, bank 33 uses an internal voltage reference. Sadly, the same
|
||||
## problem plays out in banks 12-16 as well.
|
||||
# set_property INTERNAL_VREF 0.750 [get_iobanks 33]
|
||||
# ## Other IO banks have internal VREFs as well, those these aren't as critical
|
||||
# set_property INTERNAL_VREF 0.90 [get_iobanks 12]
|
||||
# set_property INTERNAL_VREF 0.60 [get_iobanks 13]
|
||||
# set_property INTERNAL_VREF 0.90 [get_iobanks 14]
|
||||
# set_property INTERNAL_VREF 0.90 [get_iobanks 15]
|
||||
# set_property INTERNAL_VREF 0.90 [get_iobanks 16]
|
||||
|
||||
## Clocks
|
||||
# 100MHz single ended input clock
|
||||
set_property -dict {PACKAGE_PIN AA4 IOSTANDARD SSTL15} [get_ports i_clk]
|
||||
create_clock -period 10.000 -name sys_clk_pin -waveform {0.000 5.000} -add [get_ports i_clk]
|
||||
|
||||
# Baseboard LEDs
|
||||
# set_property -dict {SLEW SLOW PACKAGE_PIN F22 IOSTANDARD LVCMOS18 } [get_ports { o_led_status[4] }] # GPIO0_LED0_N
|
||||
set_property -dict {PACKAGE_PIN E23 IOSTANDARD LVCMOS18} [get_ports {led[0]}]
|
||||
set_property -dict {PACKAGE_PIN K25 IOSTANDARD LVCMOS12} [get_ports {led[1]}]
|
||||
set_property -dict {PACKAGE_PIN K26 IOSTANDARD LVCMOS12} [get_ports {led[2]}]
|
||||
|
||||
## UART
|
||||
## {{{
|
||||
set_property -dict {PACKAGE_PIN B20 IOSTANDARD LVCMOS18 } [get_ports {rx}]
|
||||
set_property -dict {PACKAGE_PIN A20 IOSTANDARD LVCMOS18 } [get_ports {tx}]
|
||||
## }}}
|
||||
|
||||
## Buttons
|
||||
## {{{
|
||||
set_property -dict {PACKAGE_PIN C22 IOSTANDARD LVCMOS18 } [get_ports {i_rst_n}]
|
||||
|
||||
## DDR3 MEMORY
|
||||
set_property -dict {PACKAGE_PIN AB7 IOSTANDARD LVCMOS15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_reset_n}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AB12 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_clk_p}]
|
||||
set_property -dict {PACKAGE_PIN AC12 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_clk_n}]
|
||||
set_property -dict {PACKAGE_PIN AA13 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_cke}]
|
||||
## set_property -dict {SLEW SLOW PACKAGE_PIN AA3 IOSTANDARD LVCMOS15 } [get_ports {o_ddr3_vsel}]
|
||||
set_property -dict {PACKAGE_PIN Y12 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_cs_n}]
|
||||
set_property -dict {PACKAGE_PIN AE13 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_ras_n}]
|
||||
set_property -dict {PACKAGE_PIN AE12 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_cas_n}]
|
||||
set_property -dict {PACKAGE_PIN AA12 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_we_n}]
|
||||
set_property -dict {PACKAGE_PIN AD13 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_odt}]
|
||||
|
||||
|
||||
## Address lines
|
||||
set_property -dict {PACKAGE_PIN AE11 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[0]}]
|
||||
set_property -dict {PACKAGE_PIN AF9 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[1]}]
|
||||
set_property -dict {PACKAGE_PIN AD10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[2]}]
|
||||
set_property -dict {PACKAGE_PIN AB10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[3]}]
|
||||
set_property -dict {PACKAGE_PIN AA9 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[4]}]
|
||||
set_property -dict {PACKAGE_PIN AB9 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[5]}]
|
||||
set_property -dict {PACKAGE_PIN AA8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[6]}]
|
||||
set_property -dict {PACKAGE_PIN AC8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[7]}]
|
||||
set_property -dict {PACKAGE_PIN AA7 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[8]}]
|
||||
set_property -dict {PACKAGE_PIN AE8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[9]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AF10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[10]}]
|
||||
set_property -dict {PACKAGE_PIN AD8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[11]}]
|
||||
set_property -dict {PACKAGE_PIN AE10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[12]}]
|
||||
set_property -dict {PACKAGE_PIN AF8 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[13]}]
|
||||
set_property -dict {PACKAGE_PIN AC7 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_addr[14]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AD11 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_ba[0]}]
|
||||
set_property -dict {PACKAGE_PIN AA10 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_ba[1]}]
|
||||
set_property -dict {PACKAGE_PIN AF12 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_ba[2]}]
|
||||
|
||||
|
||||
## Byte lane #0
|
||||
set_property -dict {PACKAGE_PIN AA2 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[0]}]
|
||||
set_property -dict {PACKAGE_PIN Y2 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[1]}]
|
||||
set_property -dict {PACKAGE_PIN AB2 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[2]}]
|
||||
set_property -dict {PACKAGE_PIN V1 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[3]}]
|
||||
set_property -dict {PACKAGE_PIN Y1 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[4]}]
|
||||
set_property -dict {PACKAGE_PIN W1 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[5]}]
|
||||
set_property -dict {PACKAGE_PIN AC2 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[6]}]
|
||||
set_property -dict {PACKAGE_PIN V2 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[7]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN Y3 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[0]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AB1 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[0]}]
|
||||
set_property -dict {PACKAGE_PIN AC1 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[0]}]
|
||||
|
||||
|
||||
## Byte lane #1
|
||||
set_property -dict {PACKAGE_PIN W3 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[8]}]
|
||||
set_property -dict {PACKAGE_PIN V3 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[9]}]
|
||||
set_property -dict {PACKAGE_PIN U1 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[10]}]
|
||||
set_property -dict {PACKAGE_PIN U7 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[11]}]
|
||||
set_property -dict {PACKAGE_PIN U6 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[12]}]
|
||||
set_property -dict {PACKAGE_PIN V4 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[13]}]
|
||||
set_property -dict {PACKAGE_PIN V6 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[14]}]
|
||||
set_property -dict {PACKAGE_PIN U2 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[15]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN U5 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[1]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN W6 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[1]}]
|
||||
set_property -dict {PACKAGE_PIN W5 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[1]}]
|
||||
|
||||
|
||||
## Byte lane #2
|
||||
set_property -dict {PACKAGE_PIN AE3 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[16]}]
|
||||
set_property -dict {PACKAGE_PIN AE6 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[17]}]
|
||||
set_property -dict {PACKAGE_PIN AF3 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[18]}]
|
||||
set_property -dict {PACKAGE_PIN AD1 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[19]}]
|
||||
set_property -dict {PACKAGE_PIN AE1 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[20]}]
|
||||
set_property -dict {PACKAGE_PIN AE2 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[21]}]
|
||||
set_property -dict {PACKAGE_PIN AF2 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[22]}]
|
||||
set_property -dict {PACKAGE_PIN AE5 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[23]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AD4 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[2]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AF5 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[2]}]
|
||||
set_property -dict {PACKAGE_PIN AF4 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[2]}]
|
||||
|
||||
|
||||
## Byte lane #3
|
||||
set_property -dict {PACKAGE_PIN AD5 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[24]}]
|
||||
set_property -dict {PACKAGE_PIN Y5 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[25]}]
|
||||
set_property -dict {PACKAGE_PIN AC6 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[26]}]
|
||||
set_property -dict {PACKAGE_PIN Y6 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[27]}]
|
||||
set_property -dict {PACKAGE_PIN AB4 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[28]}]
|
||||
set_property -dict {PACKAGE_PIN AD6 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[29]}]
|
||||
set_property -dict {PACKAGE_PIN AB6 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[30]}]
|
||||
set_property -dict {PACKAGE_PIN AC3 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[31]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AC4 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[3]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AA5 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[3]}]
|
||||
set_property -dict {PACKAGE_PIN AB5 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[3]}]
|
||||
|
||||
|
||||
## Byte lane #4
|
||||
set_property -dict {PACKAGE_PIN AD16 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[32]}]
|
||||
set_property -dict {PACKAGE_PIN AE17 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[33]}]
|
||||
set_property -dict {PACKAGE_PIN AF15 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[34]}]
|
||||
set_property -dict {PACKAGE_PIN AF20 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[35]}]
|
||||
set_property -dict {PACKAGE_PIN AD15 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[36]}]
|
||||
set_property -dict {PACKAGE_PIN AF14 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[37]}]
|
||||
set_property -dict {PACKAGE_PIN AE15 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[38]}]
|
||||
set_property -dict {PACKAGE_PIN AF17 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[39]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AF19 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[4]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AE18 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[4]}]
|
||||
set_property -dict {PACKAGE_PIN AF18 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[4]}]
|
||||
|
||||
|
||||
## Byte lane #5
|
||||
set_property -dict {PACKAGE_PIN AA14 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[40]}]
|
||||
set_property -dict {PACKAGE_PIN AA15 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[41]}]
|
||||
set_property -dict {PACKAGE_PIN AC14 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[42]}]
|
||||
set_property -dict {PACKAGE_PIN AD14 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[43]}]
|
||||
set_property -dict {PACKAGE_PIN AB14 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[44]}]
|
||||
set_property -dict {PACKAGE_PIN AB15 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[45]}]
|
||||
set_property -dict {PACKAGE_PIN AA17 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[46]}]
|
||||
set_property -dict {PACKAGE_PIN AA18 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[47]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN AC16 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[5]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN Y15 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[5]}]
|
||||
set_property -dict {PACKAGE_PIN Y16 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[5]}]
|
||||
|
||||
|
||||
## Byte lane #6
|
||||
set_property -dict {PACKAGE_PIN AB20 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[48]}]
|
||||
set_property -dict {PACKAGE_PIN AD19 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[49]}]
|
||||
set_property -dict {PACKAGE_PIN AC19 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[50]}]
|
||||
set_property -dict {PACKAGE_PIN AA20 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[51]}]
|
||||
set_property -dict {PACKAGE_PIN AA19 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[52]}]
|
||||
set_property -dict {PACKAGE_PIN AC17 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[53]}]
|
||||
set_property -dict {PACKAGE_PIN AD18 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[54]}]
|
||||
set_property -dict {PACKAGE_PIN AB17 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[55]}]
|
||||
set_property -dict {PACKAGE_PIN AB19 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[6]}]
|
||||
set_property -dict {PACKAGE_PIN AD20 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[6]}]
|
||||
set_property -dict {PACKAGE_PIN AE20 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[6]}]
|
||||
|
||||
|
||||
## Byte lane #7
|
||||
set_property -dict {PACKAGE_PIN W15 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[56]}]
|
||||
set_property -dict {PACKAGE_PIN W16 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[57]}]
|
||||
set_property -dict {PACKAGE_PIN W14 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[58]}]
|
||||
set_property -dict {PACKAGE_PIN V16 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[59]}]
|
||||
set_property -dict {PACKAGE_PIN V19 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[60]}]
|
||||
set_property -dict {PACKAGE_PIN V17 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[61]}]
|
||||
set_property -dict {PACKAGE_PIN V18 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[62]}]
|
||||
set_property -dict {PACKAGE_PIN Y17 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dq[63]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN V14 IOSTANDARD SSTL15 SLEW FAST VCCAUX_IO HIGH } [get_ports {ddr3_dm[7]}]
|
||||
|
||||
set_property -dict {PACKAGE_PIN W18 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_p[7]}]
|
||||
set_property -dict {PACKAGE_PIN W19 IOSTANDARD DIFF_SSTL15 SLEW FAST VCCAUX_IO HIGH} [get_ports {ddr3_dqs_n[7]}]
|
||||
|
||||
|
||||
|
||||
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
|
||||
Binary file not shown.
|
|
@ -37,7 +37,7 @@
|
|||
|
||||
module enclustra_ddr3
|
||||
(
|
||||
input wire i_clk,
|
||||
input wire i_clk200_p, i_clk200_n,
|
||||
input wire i_rst_n,
|
||||
// DDR3 I/O Interface
|
||||
output wire ddr3_clk_p, ddr3_clk_n,
|
||||
|
|
@ -57,9 +57,17 @@
|
|||
input wire rx,
|
||||
output wire tx,
|
||||
//Debug LEDs
|
||||
output wire[2:0] led
|
||||
output wire[3:0] led
|
||||
);
|
||||
wire sys_clk_200MHz;
|
||||
|
||||
IBUFDS sys_clk_ibufgds
|
||||
(
|
||||
.O(sys_clk_200MHz),
|
||||
.I(i_clk200_p),
|
||||
.IB(i_clk200_n)
|
||||
);
|
||||
|
||||
wire i_controller_clk, i_ddr3_clk, i_ref_clk;
|
||||
wire m_axis_tvalid;
|
||||
wire rx_empty;
|
||||
|
|
@ -74,10 +82,11 @@
|
|||
reg[7:0] i_wb_data;
|
||||
reg[7:0] i_wb_addr;
|
||||
// o_debug1 taps on value of state_calibrate (can be traced inside ddr3_controller module)
|
||||
assign led[0] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[1] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[2] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
|
||||
assign led[0] = (o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[1] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[2] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[3] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
|
||||
always @(posedge i_controller_clk) begin
|
||||
begin
|
||||
i_wb_stb <= 0;
|
||||
|
|
@ -101,39 +110,71 @@
|
|||
end
|
||||
|
||||
wire clk_locked;
|
||||
wire i_ddr3_clk_90;
|
||||
clk_wiz clk_wiz_inst
|
||||
(
|
||||
// Clock out ports
|
||||
.clk_out1(i_controller_clk), //100 Mhz
|
||||
.clk_out2(i_ddr3_clk), // 400 MHz
|
||||
.clk_out1(i_controller_clk), //83.333 Mhz
|
||||
.clk_out2(i_ddr3_clk), // 333.333 MHz
|
||||
.clk_out3(i_ref_clk), // 200 MHz
|
||||
.clk_out4(i_ddr3_clk_90), // 333.333 MHz with 90 degrees shift
|
||||
// Status and control signals
|
||||
.reset(!i_rst_n),
|
||||
.locked(clk_locked),
|
||||
// Clock in ports
|
||||
.clk_in1(i_clk)
|
||||
.clk_in1(sys_clk_200MHz)
|
||||
);
|
||||
|
||||
// UART module from https://github.com/alexforencich/verilog-uart
|
||||
uart #(.DATA_WIDTH(8)) uart_m
|
||||
(
|
||||
.clk(i_controller_clk),
|
||||
.rst(!i_rst_n),
|
||||
.s_axis_tdata(o_wb_data),
|
||||
.s_axis_tvalid(o_wb_ack),
|
||||
.s_axis_tready(),
|
||||
.m_axis_tdata(rd_data),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(1),
|
||||
.rxd(rx),
|
||||
.txd(tx),
|
||||
.prescale(1302) //9600 Baud Rate: 100MHz/(8*9600)
|
||||
// UART TX/RX module from https://github.com/ben-marshall/uart
|
||||
uart_tx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_tx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(i_rst_n && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_txd(tx), // UART transmit pin.
|
||||
.uart_tx_busy(), // Module busy sending previous item.
|
||||
.uart_tx_en(o_wb_ack), // Send the data on uart_tx_data
|
||||
.uart_tx_data(o_wb_data) // The data to be sent
|
||||
);
|
||||
uart_rx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_rx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(i_rst_n && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_rxd(rx), // UART Recieve pin.
|
||||
.uart_rx_en(o_debug1[4:0] == 23), // Recieve enable
|
||||
.uart_rx_break(), // Did we get a BREAK message?
|
||||
.uart_rx_valid(m_axis_tvalid), // Valid data recieved/available.
|
||||
.uart_rx_data(rd_data) // The recieved data.
|
||||
);
|
||||
|
||||
|
||||
// UART module from https://github.com/alexforencich/verilog-uart (DOES NOT WORK ON OPENXC7, UberDDR3 cannot finish calibration when this UART is used)
|
||||
// uart #(.DATA_WIDTH(8)) uart_m
|
||||
// (
|
||||
// .clk(i_controller_clk),
|
||||
// .rst(!i_rst_n),
|
||||
// .s_axis_tdata(o_wb_data),
|
||||
// .s_axis_tvalid(o_wb_ack),
|
||||
// .s_axis_tready(),
|
||||
// .m_axis_tdata(rd_data),
|
||||
// .m_axis_tvalid(m_axis_tvalid),
|
||||
// .m_axis_tready(1),
|
||||
// .rxd(rx),
|
||||
// .txd(tx),
|
||||
// .prescale(1085) //9600 Baud Rate (83.33MHz/(8*9600))
|
||||
// );
|
||||
|
||||
// DDR3 Controller
|
||||
ddr3_top #(
|
||||
.CONTROLLER_CLK_PERIOD(10_000), //ps, clock period of the controller interface
|
||||
.DDR3_CLK_PERIOD(2_500), //ps, clock period of the DDR3 RAM device (must be 1/4 of the CONTROLLER_CLK_PERIOD)
|
||||
.CONTROLLER_CLK_PERIOD(12_000), //ps, clock period of the controller interface
|
||||
.DDR3_CLK_PERIOD(3_000), //ps, clock period of the DDR3 RAM device (must be 1/4 of the CONTROLLER_CLK_PERIOD)
|
||||
.ROW_BITS(15), //width of row address
|
||||
.COL_BITS(10), //width of column address
|
||||
.BA_BITS(3), //width of bank address
|
||||
|
|
@ -152,7 +193,7 @@
|
|||
.i_controller_clk(i_controller_clk),
|
||||
.i_ddr3_clk(i_ddr3_clk), //i_controller_clk has period of CONTROLLER_CLK_PERIOD, i_ddr3_clk has period of DDR3_CLK_PERIOD
|
||||
.i_ref_clk(i_ref_clk),
|
||||
.i_ddr3_clk_90(0),
|
||||
.i_ddr3_clk_90(i_ddr3_clk_90),
|
||||
.i_rst_n(i_rst_n && clk_locked),
|
||||
// Wishbone inputs
|
||||
.i_wb_cyc(1), //bus cycle active (1 = normal operation, 0 = all ongoing transaction are to be cancelled)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,750 @@
|
|||
################################################################################
|
||||
# IO constraints
|
||||
################################################################################
|
||||
# cpu_reset_n:0
|
||||
set_property LOC C22 [get_ports {i_rst_n}]
|
||||
set_property IOSTANDARD LVCMOS18 [get_ports {i_rst_n}]
|
||||
|
||||
# clk200:0.p
|
||||
set_property LOC AB11 [get_ports {i_clk200_p}]
|
||||
set_property IOSTANDARD LVDS [get_ports {i_clk200_p}]
|
||||
|
||||
# clk200:0.n
|
||||
set_property LOC AC11 [get_ports {i_clk200_n}]
|
||||
set_property IOSTANDARD LVDS [get_ports {i_clk200_n}]
|
||||
|
||||
# serial:0.tx
|
||||
set_property LOC A20 [get_ports {tx}]
|
||||
set_property IOSTANDARD LVCMOS18 [get_ports {tx}]
|
||||
|
||||
# serial:0.rx
|
||||
set_property LOC B20 [get_ports {rx}]
|
||||
set_property IOSTANDARD LVCMOS18 [get_ports {rx}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AE11 [get_ports {ddr3_addr[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[0]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[0]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AF9 [get_ports {ddr3_addr[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[1]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[1]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AD10 [get_ports {ddr3_addr[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[2]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[2]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AB10 [get_ports {ddr3_addr[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[3]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[3]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[3]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AA9 [get_ports {ddr3_addr[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[4]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[4]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[4]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AB9 [get_ports {ddr3_addr[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[5]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[5]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[5]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AA8 [get_ports {ddr3_addr[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[6]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[6]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[6]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AC8 [get_ports {ddr3_addr[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[7]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[7]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[7]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AA7 [get_ports {ddr3_addr[8]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[8]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[8]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[8]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AE8 [get_ports {ddr3_addr[9]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[9]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[9]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[9]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AF10 [get_ports {ddr3_addr[10]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[10]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[10]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[10]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AD8 [get_ports {ddr3_addr[11]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[11]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[11]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[11]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AE10 [get_ports {ddr3_addr[12]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[12]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[12]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[12]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AF8 [get_ports {ddr3_addr[13]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[13]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[13]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[13]}]
|
||||
|
||||
# ddram:0.a
|
||||
set_property LOC AC7 [get_ports {ddr3_addr[14]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_addr[14]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_addr[14]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[14]}]
|
||||
|
||||
# ddram:0.ba
|
||||
set_property LOC AD11 [get_ports {ddr3_ba[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ba[0]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ba[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_ba[0]}]
|
||||
|
||||
# ddram:0.ba
|
||||
set_property LOC AA10 [get_ports {ddr3_ba[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ba[1]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ba[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_ba[1]}]
|
||||
|
||||
# ddram:0.ba
|
||||
set_property LOC AF12 [get_ports {ddr3_ba[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ba[2]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ba[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_ba[2]}]
|
||||
|
||||
# ddram:0.ras_n
|
||||
set_property LOC AE13 [get_ports {ddr3_ras_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_ras_n}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_ras_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_ras_n}]
|
||||
|
||||
# ddram:0.cas_n
|
||||
set_property LOC AE12 [get_ports {ddr3_cas_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_cas_n}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_cas_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cas_n}]
|
||||
|
||||
# ddram:0.we_n
|
||||
set_property LOC AA12 [get_ports {ddr3_we_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_we_n}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_we_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_we_n}]
|
||||
|
||||
# ddram:0.cs_n
|
||||
set_property LOC Y12 [get_ports {ddr3_cs_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_cs_n}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_cs_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cs_n}]
|
||||
|
||||
# ddram:0.dm
|
||||
set_property LOC Y3 [get_ports {ddr3_dm[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[0]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[0]}]
|
||||
|
||||
# ddram:0.dm
|
||||
set_property LOC U5 [get_ports {ddr3_dm[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[1]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[1]}]
|
||||
|
||||
# ddram:0.dm
|
||||
set_property LOC AD4 [get_ports {ddr3_dm[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[2]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[2]}]
|
||||
|
||||
# ddram:0.dm
|
||||
set_property LOC AC4 [get_ports {ddr3_dm[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[3]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[3]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[3]}]
|
||||
|
||||
# ddram:0.dm
|
||||
set_property LOC AF19 [get_ports {ddr3_dm[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[4]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[4]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[4]}]
|
||||
|
||||
# ddram:0.dm
|
||||
set_property LOC AC16 [get_ports {ddr3_dm[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[5]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[5]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[5]}]
|
||||
|
||||
# ddram:0.dm
|
||||
set_property LOC AB19 [get_ports {ddr3_dm[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[6]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[6]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[6]}]
|
||||
|
||||
# ddram:0.dm
|
||||
set_property LOC V14 [get_ports {ddr3_dm[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dm[7]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dm[7]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[7]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AA2 [get_ports {ddr3_dq[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[0]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[0]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[0]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC Y2 [get_ports {ddr3_dq[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[1]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[1]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[1]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AB2 [get_ports {ddr3_dq[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[2]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[2]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[2]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC V1 [get_ports {ddr3_dq[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[3]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[3]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[3]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC Y1 [get_ports {ddr3_dq[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[4]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[4]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[4]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC W1 [get_ports {ddr3_dq[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[5]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[5]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[5]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AC2 [get_ports {ddr3_dq[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[6]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[6]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[6]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC V2 [get_ports {ddr3_dq[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[7]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[7]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[7]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC W3 [get_ports {ddr3_dq[8]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[8]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[8]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[8]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC V3 [get_ports {ddr3_dq[9]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[9]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[9]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[9]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC U1 [get_ports {ddr3_dq[10]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[10]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[10]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[10]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC U7 [get_ports {ddr3_dq[11]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[11]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[11]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[11]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC U6 [get_ports {ddr3_dq[12]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[12]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[12]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[12]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC V4 [get_ports {ddr3_dq[13]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[13]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[13]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[13]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC V6 [get_ports {ddr3_dq[14]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[14]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[14]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[14]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC U2 [get_ports {ddr3_dq[15]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[15]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[15]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[15]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AE3 [get_ports {ddr3_dq[16]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[16]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[16]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[16]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AE6 [get_ports {ddr3_dq[17]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[17]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[17]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[17]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AF3 [get_ports {ddr3_dq[18]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[18]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[18]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[18]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AD1 [get_ports {ddr3_dq[19]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[19]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[19]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[19]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AE1 [get_ports {ddr3_dq[20]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[20]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[20]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[20]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AE2 [get_ports {ddr3_dq[21]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[21]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[21]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[21]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AF2 [get_ports {ddr3_dq[22]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[22]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[22]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[22]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AE5 [get_ports {ddr3_dq[23]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[23]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[23]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[23]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AD5 [get_ports {ddr3_dq[24]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[24]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[24]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[24]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC Y5 [get_ports {ddr3_dq[25]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[25]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[25]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[25]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AC6 [get_ports {ddr3_dq[26]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[26]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[26]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[26]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC Y6 [get_ports {ddr3_dq[27]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[27]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[27]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[27]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AB4 [get_ports {ddr3_dq[28]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[28]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[28]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[28]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AD6 [get_ports {ddr3_dq[29]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[29]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[29]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[29]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AB6 [get_ports {ddr3_dq[30]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[30]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[30]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[30]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AC3 [get_ports {ddr3_dq[31]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[31]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[31]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[31]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AD16 [get_ports {ddr3_dq[32]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[32]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[32]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[32]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AE17 [get_ports {ddr3_dq[33]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[33]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[33]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[33]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AF15 [get_ports {ddr3_dq[34]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[34]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[34]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[34]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AF20 [get_ports {ddr3_dq[35]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[35]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[35]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[35]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AD15 [get_ports {ddr3_dq[36]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[36]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[36]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[36]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AF14 [get_ports {ddr3_dq[37]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[37]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[37]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[37]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AE15 [get_ports {ddr3_dq[38]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[38]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[38]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[38]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AF17 [get_ports {ddr3_dq[39]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[39]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[39]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[39]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AA14 [get_ports {ddr3_dq[40]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[40]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[40]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[40]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AA15 [get_ports {ddr3_dq[41]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[41]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[41]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[41]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AC14 [get_ports {ddr3_dq[42]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[42]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[42]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[42]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AD14 [get_ports {ddr3_dq[43]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[43]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[43]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[43]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AB14 [get_ports {ddr3_dq[44]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[44]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[44]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[44]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AB15 [get_ports {ddr3_dq[45]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[45]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[45]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[45]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AA17 [get_ports {ddr3_dq[46]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[46]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[46]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[46]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AA18 [get_ports {ddr3_dq[47]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[47]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[47]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[47]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AB20 [get_ports {ddr3_dq[48]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[48]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[48]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[48]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AD19 [get_ports {ddr3_dq[49]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[49]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[49]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[49]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AC19 [get_ports {ddr3_dq[50]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[50]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[50]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[50]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AA20 [get_ports {ddr3_dq[51]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[51]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[51]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[51]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AA19 [get_ports {ddr3_dq[52]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[52]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[52]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[52]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AC17 [get_ports {ddr3_dq[53]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[53]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[53]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[53]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AD18 [get_ports {ddr3_dq[54]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[54]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[54]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[54]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC AB17 [get_ports {ddr3_dq[55]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[55]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[55]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[55]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC W15 [get_ports {ddr3_dq[56]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[56]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[56]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[56]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC W16 [get_ports {ddr3_dq[57]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[57]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[57]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[57]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC W14 [get_ports {ddr3_dq[58]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[58]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[58]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[58]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC V16 [get_ports {ddr3_dq[59]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[59]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[59]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[59]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC V19 [get_ports {ddr3_dq[60]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[60]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[60]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[60]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC V17 [get_ports {ddr3_dq[61]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[61]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[61]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[61]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC V18 [get_ports {ddr3_dq[62]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[62]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[62]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[62]}]
|
||||
|
||||
# ddram:0.dq
|
||||
set_property LOC Y17 [get_ports {ddr3_dq[63]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dq[63]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dq[63]}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[63]}]
|
||||
|
||||
# ddram:0.dqs_p
|
||||
set_property LOC AB1 [get_ports {ddr3_dqs_p[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[0]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[0]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_p[0]}]
|
||||
|
||||
# ddram:0.dqs_p
|
||||
set_property LOC W6 [get_ports {ddr3_dqs_p[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[1]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[1]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_p[1]}]
|
||||
|
||||
# ddram:0.dqs_p
|
||||
set_property LOC AF5 [get_ports {ddr3_dqs_p[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[2]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[2]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_p[2]}]
|
||||
|
||||
# ddram:0.dqs_p
|
||||
set_property LOC AA5 [get_ports {ddr3_dqs_p[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[3]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[3]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_p[3]}]
|
||||
|
||||
# ddram:0.dqs_p
|
||||
set_property LOC AE18 [get_ports {ddr3_dqs_p[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[4]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[4]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_p[4]}]
|
||||
|
||||
# ddram:0.dqs_p
|
||||
set_property LOC Y15 [get_ports {ddr3_dqs_p[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[5]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[5]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_p[5]}]
|
||||
|
||||
# ddram:0.dqs_p
|
||||
set_property LOC AD20 [get_ports {ddr3_dqs_p[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[6]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[6]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_p[6]}]
|
||||
|
||||
# ddram:0.dqs_p
|
||||
set_property LOC W18 [get_ports {ddr3_dqs_p[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_p[7]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_p[7]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_p[7]}]
|
||||
|
||||
# ddram:0.dqs_n
|
||||
set_property LOC AC1 [get_ports {ddr3_dqs_n[0]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[0]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[0]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_n[0]}]
|
||||
|
||||
# ddram:0.dqs_n
|
||||
set_property LOC W5 [get_ports {ddr3_dqs_n[1]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[1]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[1]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_n[1]}]
|
||||
|
||||
# ddram:0.dqs_n
|
||||
set_property LOC AF4 [get_ports {ddr3_dqs_n[2]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[2]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[2]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_n[2]}]
|
||||
|
||||
# ddram:0.dqs_n
|
||||
set_property LOC AB5 [get_ports {ddr3_dqs_n[3]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[3]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[3]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_n[3]}]
|
||||
|
||||
# ddram:0.dqs_n
|
||||
set_property LOC AF18 [get_ports {ddr3_dqs_n[4]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[4]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[4]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_n[4]}]
|
||||
|
||||
# ddram:0.dqs_n
|
||||
set_property LOC Y16 [get_ports {ddr3_dqs_n[5]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[5]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[5]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_n[5]}]
|
||||
|
||||
# ddram:0.dqs_n
|
||||
set_property LOC AE20 [get_ports {ddr3_dqs_n[6]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[6]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[6]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_n[6]}]
|
||||
|
||||
# ddram:0.dqs_n
|
||||
set_property LOC W19 [get_ports {ddr3_dqs_n[7]}]
|
||||
set_property SLEW FAST [get_ports {ddr3_dqs_n[7]}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_dqs_n[7]}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_dqs_n[7]}]
|
||||
|
||||
# ddram:0.clk_p
|
||||
set_property LOC AB12 [get_ports {ddr3_clk_p}]
|
||||
set_property SLEW FAST [get_ports {ddr3_clk_p}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_clk_p}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_clk_p}]
|
||||
|
||||
# ddram:0.clk_n
|
||||
set_property LOC AC12 [get_ports {ddr3_clk_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_clk_n}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_clk_n}]
|
||||
set_property IOSTANDARD DIFF_SSTL15 [get_ports {ddr3_clk_n}]
|
||||
|
||||
# ddram:0.cke
|
||||
set_property LOC AA13 [get_ports {ddr3_cke}]
|
||||
set_property SLEW FAST [get_ports {ddr3_cke}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_cke}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_cke}]
|
||||
|
||||
# ddram:0.odt
|
||||
set_property LOC AD13 [get_ports {ddr3_odt}]
|
||||
set_property SLEW FAST [get_ports {ddr3_odt}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_odt}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_odt}]
|
||||
|
||||
# ddram:0.reset_n
|
||||
set_property LOC AB7 [get_ports {ddr3_reset_n}]
|
||||
set_property SLEW FAST [get_ports {ddr3_reset_n}]
|
||||
set_property VCCAUX_IO HIGH [get_ports {ddr3_reset_n}]
|
||||
set_property IOSTANDARD SSTL15 [get_ports {ddr3_reset_n}]
|
||||
set_property SLEW SLOW [get_ports {ddr3_reset_n}]
|
||||
|
||||
# user_led:0
|
||||
set_property LOC U9 [get_ports {led[0]}]
|
||||
set_property IOSTANDARD LVCMOS15 [get_ports {led[0]}]
|
||||
set_property SLEW SLOW [get_ports {led[0]}]
|
||||
|
||||
# user_led:1
|
||||
set_property LOC V12 [get_ports {led[1]}]
|
||||
set_property IOSTANDARD LVCMOS15 [get_ports {led[1]}]
|
||||
set_property SLEW SLOW [get_ports {led[1]}]
|
||||
|
||||
# user_led:2
|
||||
set_property LOC V13 [get_ports {led[2]}]
|
||||
set_property IOSTANDARD LVCMOS15 [get_ports {led[2]}]
|
||||
set_property SLEW SLOW [get_ports {led[2]}]
|
||||
|
||||
# user_led:3
|
||||
set_property LOC W13 [get_ports {led[3]}]
|
||||
set_property IOSTANDARD LVCMOS15 [get_ports {led[3]}]
|
||||
set_property SLEW SLOW [get_ports {led[3]}]
|
||||
|
||||
|
||||
################################################################################
|
||||
# Design constraints
|
||||
################################################################################
|
||||
|
||||
set_property CONFIG_VOLTAGE 1.8 [current_design]
|
||||
|
||||
set_property CFGBVS GND [current_design]
|
||||
|
||||
|
||||
################################################################################
|
||||
# Clock constraints
|
||||
################################################################################
|
||||
|
||||
|
||||
create_clock -name i_clk200_p -period 5.0 [get_ports i_clk200_p]
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire tx_busy,
|
||||
output wire rx_busy,
|
||||
output wire rx_overrun_error,
|
||||
output wire rx_frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
|
||||
);
|
||||
|
||||
uart_tx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_tx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi input
|
||||
.s_axis_tdata(s_axis_tdata),
|
||||
.s_axis_tvalid(s_axis_tvalid),
|
||||
.s_axis_tready(s_axis_tready),
|
||||
// output
|
||||
.txd(txd),
|
||||
// status
|
||||
.busy(tx_busy),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
uart_rx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_rx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi output
|
||||
.m_axis_tdata(m_axis_tdata),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(m_axis_tready),
|
||||
// input
|
||||
.rxd(rxd),
|
||||
// status
|
||||
.busy(rx_busy),
|
||||
.overrun_error(rx_overrun_error),
|
||||
.frame_error(rx_frame_error),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
|
@ -1,142 +1,207 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_rx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
output wire overrun_error,
|
||||
output wire frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
//
|
||||
// Module: uart_rx
|
||||
//
|
||||
// Notes:
|
||||
// - UART reciever module.
|
||||
//
|
||||
|
||||
module uart_rx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
input wire uart_rxd , // UART Recieve pin.
|
||||
input wire uart_rx_en , // Recieve enable
|
||||
output wire uart_rx_break, // Did we get a BREAK message?
|
||||
output wire uart_rx_valid, // Valid data recieved and available.
|
||||
output reg [PAYLOAD_BITS-1:0] uart_rx_data // The recieved data.
|
||||
);
|
||||
|
||||
reg [DATA_WIDTH-1:0] m_axis_tdata_reg = 0;
|
||||
reg m_axis_tvalid_reg = 0;
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
reg rxd_reg = 1;
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
reg busy_reg = 0;
|
||||
reg overrun_error_reg = 0;
|
||||
reg frame_error_reg = 0;
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
reg [DATA_WIDTH-1:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
assign m_axis_tdata = m_axis_tdata_reg;
|
||||
assign m_axis_tvalid = m_axis_tvalid_reg;
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
assign busy = busy_reg;
|
||||
assign overrun_error = overrun_error_reg;
|
||||
assign frame_error = frame_error_reg;
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_rxd line. Helps break long timing
|
||||
// paths from input pins into the logic.
|
||||
reg rxd_reg;
|
||||
reg rxd_reg_0;
|
||||
|
||||
//
|
||||
// Storage for the recieved serial data.
|
||||
reg [PAYLOAD_BITS-1:0] recieved_data;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of recieved bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Sample of the UART input line whenever we are in the middle of a bit frame.
|
||||
reg bit_sample;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_RECV = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Output assignment
|
||||
//
|
||||
|
||||
assign uart_rx_break = uart_rx_valid && ~|recieved_data;
|
||||
assign uart_rx_valid = fsm_state == FSM_STOP && n_fsm_state == FSM_IDLE;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
m_axis_tdata_reg <= 0;
|
||||
m_axis_tvalid_reg <= 0;
|
||||
rxd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
end else begin
|
||||
rxd_reg <= rxd;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
if(!resetn) begin
|
||||
uart_rx_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if (fsm_state == FSM_STOP) begin
|
||||
uart_rx_data <= recieved_data;
|
||||
end
|
||||
end
|
||||
|
||||
if (m_axis_tvalid && m_axis_tready) begin
|
||||
m_axis_tvalid_reg <= 0;
|
||||
end
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
if (prescale_reg > 0) begin
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt > 0) begin
|
||||
if (bit_cnt > DATA_WIDTH+1) begin
|
||||
if (!rxd_reg) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
end else begin
|
||||
bit_cnt <= 0;
|
||||
prescale_reg <= 0;
|
||||
end
|
||||
end else if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
data_reg <= {rxd_reg, data_reg[DATA_WIDTH-1:1]};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
if (rxd_reg) begin
|
||||
m_axis_tdata_reg <= data_reg;
|
||||
m_axis_tvalid_reg <= 1;
|
||||
overrun_error_reg <= m_axis_tvalid_reg;
|
||||
end else begin
|
||||
frame_error_reg <= 1;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
busy_reg <= 0;
|
||||
if (!rxd_reg) begin
|
||||
prescale_reg <= (prescale << 2)-2;
|
||||
bit_cnt <= DATA_WIDTH+2;
|
||||
data_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT ||
|
||||
fsm_state == FSM_STOP &&
|
||||
cycle_counter == CYCLES_PER_BIT/2;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = rxd_reg ? FSM_IDLE : FSM_START;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_RECV : FSM_START;
|
||||
FSM_RECV : n_fsm_state = payload_done ? FSM_STOP : FSM_RECV ;
|
||||
FSM_STOP : n_fsm_state = next_bit ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the recieved data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_recieved_data
|
||||
if(!resetn) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE ) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit ) begin
|
||||
recieved_data[PAYLOAD_BITS-1] <= bit_sample;
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
recieved_data[i] <= recieved_data[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Increments the bit counter when recieving.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_RECV) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Sample the recieved bit when in the middle of a bit frame.
|
||||
always @(posedge clk) begin : p_bit_sample
|
||||
if(!resetn) begin
|
||||
bit_sample <= 1'b0;
|
||||
end else if (cycle_counter == CYCLES_PER_BIT/2) begin
|
||||
bit_sample <= rxd_reg;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when recieving.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_RECV ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the rxd_reg.
|
||||
always @(posedge clk) begin : p_rxd_reg
|
||||
if(!resetn) begin
|
||||
rxd_reg <= 1'b1;
|
||||
rxd_reg_0 <= 1'b1;
|
||||
end else if(uart_rx_en) begin
|
||||
rxd_reg <= rxd_reg_0;
|
||||
rxd_reg_0 <= uart_rxd;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -1,115 +1,187 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// Module: uart_tx
|
||||
//
|
||||
// Notes:
|
||||
// - UART transmitter module.
|
||||
//
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_tx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
module uart_tx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
output wire uart_txd , // UART transmit pin.
|
||||
output wire uart_tx_busy, // Module busy sending previous item.
|
||||
input wire uart_tx_en , // Send the data on uart_tx_data
|
||||
input wire [PAYLOAD_BITS-1:0] uart_tx_data // The data to be sent
|
||||
);
|
||||
|
||||
reg s_axis_tready_reg = 0;
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
reg txd_reg = 1;
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
reg busy_reg = 0;
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
reg [DATA_WIDTH:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
assign s_axis_tready = s_axis_tready_reg;
|
||||
assign txd = txd_reg;
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
assign busy = busy_reg;
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
txd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
end else begin
|
||||
if (prescale_reg > 0) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt == 0) begin
|
||||
s_axis_tready_reg <= 1;
|
||||
busy_reg <= 0;
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
if (s_axis_tvalid) begin
|
||||
s_axis_tready_reg <= !s_axis_tready_reg;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
bit_cnt <= DATA_WIDTH+1;
|
||||
data_reg <= {1'b1, s_axis_tdata};
|
||||
txd_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
end else begin
|
||||
if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
{data_reg, txd_reg} <= {1'b0, data_reg};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3);
|
||||
txd_reg <= 1;
|
||||
end
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_txd line. Helps break long timing
|
||||
// paths from the logic to the output pins.
|
||||
reg txd_reg;
|
||||
|
||||
//
|
||||
// Storage for the serial data to be sent.
|
||||
reg [PAYLOAD_BITS-1:0] data_to_send;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of sent bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_SEND = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
assign uart_tx_busy = fsm_state != FSM_IDLE;
|
||||
assign uart_txd = txd_reg;
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
wire stop_done = bit_counter == STOP_BITS && fsm_state == FSM_STOP;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = uart_tx_en ? FSM_START: FSM_IDLE ;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_SEND : FSM_START;
|
||||
FSM_SEND : n_fsm_state = payload_done ? FSM_STOP : FSM_SEND ;
|
||||
FSM_STOP : n_fsm_state = stop_done ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the sent data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_data_to_send
|
||||
if(!resetn) begin
|
||||
data_to_send <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE && uart_tx_en) begin
|
||||
data_to_send <= uart_tx_data;
|
||||
end else if(fsm_state == FSM_SEND && next_bit ) begin
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
data_to_send[i] <= data_to_send[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the bit counter each time a new bit frame is sent.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_SEND && fsm_state != FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_SEND && n_fsm_state == FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_STOP&& next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end else if(fsm_state == FSM_SEND && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when sending.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_SEND ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the txd_reg.
|
||||
always @(posedge clk) begin : p_txd_reg
|
||||
if(!resetn) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_IDLE) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_START) begin
|
||||
txd_reg <= 1'b0;
|
||||
end else if(fsm_state == FSM_SEND) begin
|
||||
txd_reg <= data_to_send[0];
|
||||
end else if(fsm_state == FSM_STOP) begin
|
||||
txd_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -0,0 +1,70 @@
|
|||
PROJECT = nexysvideo_ddr3
|
||||
FAMILY = artix7
|
||||
PART = xc7a200tsbg484-1
|
||||
CHIPDB = ${ARTIX7_CHIPDB}
|
||||
ADDITIONAL_SOURCES = ../../rtl/ddr3_controller.v ../../rtl/ddr3_phy.v ../../rtl/ddr3_top.v uart_rx.v uart_tx.v clk_wiz.v
|
||||
|
||||
#############################################################################################
|
||||
NEXTPNR_XILINX_DIR ?= /snap/openxc7/current/opt/nextpnr-xilinx
|
||||
NEXTPNR_XILINX_PYTHON_DIR ?= ${NEXTPNR_XILINX_DIR}/python
|
||||
PRJXRAY_DB_DIR ?= ${NEXTPNR_XILINX_DIR}/external/prjxray-db
|
||||
|
||||
DBPART = $(shell echo ${PART} | sed -e 's/-[0-9]//g')
|
||||
SPEEDGRADE = $(shell echo ${PART} | sed -e 's/.*\-\([0-9]\)/\1/g')
|
||||
|
||||
CHIPDB ?= ./
|
||||
ifeq ($(CHIPDB),)
|
||||
CHIPDB = ./
|
||||
endif
|
||||
|
||||
PYPY3 ?= pypy3
|
||||
|
||||
TOP ?= ${PROJECT}
|
||||
TOP_MODULE ?= ${TOP}
|
||||
TOP_VERILOG ?= ${TOP}.v
|
||||
|
||||
PNR_DEBUG ?= # --verbose --debug
|
||||
|
||||
BOARD ?= UNKNOWN
|
||||
JTAG_LINK ?= --board ${BOARD}
|
||||
|
||||
XDC ?= ${PROJECT}.xdc
|
||||
|
||||
.PHONY: all
|
||||
all: ${PROJECT}.bit
|
||||
|
||||
.PHONY: program
|
||||
program: ${PROJECT}.bit
|
||||
openFPGALoader ${JTAG_LINK} --bitstream $<
|
||||
|
||||
${PROJECT}.json: ${TOP_VERILOG} ${ADDITIONAL_SOURCES}
|
||||
yosys -p "synth_xilinx -flatten -abc9 ${SYNTH_OPTS} -arch xc7 -top ${TOP_MODULE}; write_json ${PROJECT}.json" $< ${ADDITIONAL_SOURCES}
|
||||
|
||||
# The chip database only needs to be generated once
|
||||
# that is why we don't clean it with make clean
|
||||
${CHIPDB}/${DBPART}.bin:
|
||||
${PYPY3} ${NEXTPNR_XILINX_PYTHON_DIR}/bbaexport.py --device ${PART} --bba ${DBPART}.bba
|
||||
bbasm -l ${DBPART}.bba ${CHIPDB}/${DBPART}.bin
|
||||
rm -f ${DBPART}.bba
|
||||
|
||||
${PROJECT}.fasm: ${PROJECT}.json ${CHIPDB}/${DBPART}.bin ${XDC}
|
||||
nextpnr-xilinx --chipdb ${CHIPDB}/${DBPART}.bin --xdc ${XDC} --json ${PROJECT}.json --fasm $@ ${PNR_ARGS} ${PNR_DEBUG}
|
||||
|
||||
${PROJECT}.frames: ${PROJECT}.fasm
|
||||
fasm2frames --part ${PART} --db-root ${PRJXRAY_DB_DIR}/${FAMILY} $< > $@
|
||||
|
||||
${PROJECT}.bit: ${PROJECT}.frames
|
||||
xc7frames2bit --part_file ${PRJXRAY_DB_DIR}/${FAMILY}/${PART}/part.yaml --part_name ${PART} --frm_file $< --output_file $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@rm -f *.bit
|
||||
@rm -f *.frames
|
||||
@rm -f *.fasm
|
||||
@rm -f *.json
|
||||
@rm -f *.bin
|
||||
@rm -f *.bba
|
||||
|
||||
.PHONY: pnrclean
|
||||
pnrclean:
|
||||
rm *.fasm *.frames *.bit
|
||||
|
|
@ -1,50 +0,0 @@
|
|||
# Generated by https://github.com/FPGAOL-CE/caas-wizard
|
||||
DB_DIR = /nextpnr-xilinx/xilinx/external/prjxray-db
|
||||
CHIPDB = ./chipdb
|
||||
|
||||
BUILDDIR := ${CURDIR}/build
|
||||
TOP := nexysvideo_ddr3
|
||||
#SOURCES := $(wildcard *.v ../../rtl/ddr3*.v)
|
||||
XDC := $(wildcard $(wildcard Nexys-video.xdc) )
|
||||
|
||||
CHIPFAM := artix7
|
||||
PART := xc7a200tsbg484-1
|
||||
|
||||
LOGFILE := ${BUILDDIR}/top.log
|
||||
|
||||
all: ${CHIPDB} ${BUILDDIR} ${BUILDDIR}/top.bit
|
||||
|
||||
${BUILDDIR}:
|
||||
mkdir -m 777 -p ${BUILDDIR} && chown -R nobody ${BUILDDIR} | true
|
||||
|
||||
${CHIPDB}:
|
||||
mkdir -m 777 -p ${CHIPDB} && chown -R nobody ${CHIPDB} | true
|
||||
|
||||
# we run this in parent directory to seeminglessly import user source files
|
||||
# otherwise have to parse user pattern and add ../
|
||||
${BUILDDIR}/top.json: $(wildcard *.v) $(wildcard ../../rtl/*.v)
|
||||
yosys -p "synth_xilinx -flatten -abc9 -arch xc7 -top ${TOP}; write_json ${BUILDDIR}/top.json" $^ >> ${LOGFILE} 2>&1
|
||||
|
||||
# The chip database only needs to be generated once
|
||||
# that is why we don't clean it with make clean
|
||||
${CHIPDB}/${PART}.bin:
|
||||
pypy3 /nextpnr-xilinx/xilinx/python/bbaexport.py --device ${PART} --bba ${PART}.bba
|
||||
bbasm -l ${PART}.bba ${CHIPDB}/${PART}.bin
|
||||
rm -f ${PART}.bba
|
||||
|
||||
${BUILDDIR}/top.fasm: ${BUILDDIR}/top.json ${CHIPDB}/${PART}.bin
|
||||
nextpnr-xilinx --chipdb ${CHIPDB}/${PART}.bin --xdc ${XDC} --json ${BUILDDIR}/top.json --pre-place constraints.py --pre-route show_bels.py --fasm $@ >> ${LOGFILE} 2>&1
|
||||
#nextpnr-xilinx --chipdb ${CHIPDB}/${PART}.bin --xdc ${XDC} --json ${BUILDDIR}/top.json --fasm $@ >> ${LOGFILE} 2>&1
|
||||
|
||||
${BUILDDIR}/top.frames: ${BUILDDIR}/top.fasm
|
||||
fasm2frames --part ${PART} --db-root ${DB_DIR}/${CHIPFAM} $< > $@
|
||||
|
||||
${BUILDDIR}/top.bit: ${BUILDDIR}/top.frames
|
||||
xc7frames2bit --part_file ${DB_DIR}/${CHIPFAM}/${PART}/part.yaml --part_name ${PART} --frm_file $< --output_file $@ >> ${LOGFILE} 2>&1
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@rm -f *.bit
|
||||
@rm -f *.frames
|
||||
@rm -f *.fasm
|
||||
@rm -f *.json
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
# Generated by https://github.com/FPGAOL-CE/caas-wizard
|
||||
BUILDDIR := ${CURDIR}/build
|
||||
# TOP := nexysvideo_ddr3
|
||||
# SOURCES := $(wildcard *.v ../../rtl/ddr3*.v)
|
||||
# XDC := $(wildcard $(wildcard Nexys-video.xdc) $(wildcard Nexys-video-vivado.xdc) )
|
||||
|
||||
# PART := xc7a200tsbg484-1
|
||||
|
||||
LOGFILE := ${BUILDDIR}/top.log
|
||||
|
||||
# Build design
|
||||
all: ${BUILDDIR}/top.bit
|
||||
|
||||
${BUILDDIR}:
|
||||
mkdir -m 777 -p ${BUILDDIR} && chown -R nobody ${BUILDDIR} | true
|
||||
|
||||
.ONESHELL:
|
||||
${BUILDDIR}/vivado.tcl: ${BUILDDIR}
|
||||
cat << EOF > $@
|
||||
# vivado.tcl generated for caas
|
||||
# can be launched from any directory
|
||||
cd ${BUILDDIR}
|
||||
create_project -part xc7a200tsbg484-1 -force v_proj
|
||||
set_property target_language Verilog [current_project]
|
||||
cd ..
|
||||
read_verilog [glob *.v ../../rtl/ddr3*.v]
|
||||
read_xdc [glob $(wildcard Nexys-video.xdc) $(wildcard Nexys-video-vivado.xdc) ]
|
||||
cd build
|
||||
synth_design -top nexysvideo_ddr3
|
||||
opt_design
|
||||
place_design
|
||||
phys_opt_design
|
||||
route_design
|
||||
write_bitstream -verbose -force top.bit
|
||||
# report_utilization -file util.rpt
|
||||
# report_timing_summary -file timing.rpt
|
||||
EOF
|
||||
|
||||
${BUILDDIR}/top.bit: ${BUILDDIR}/vivado.tcl
|
||||
cd ${BUILDDIR} && vivado -mode batch -source $< > ${LOGFILE} 2>&1
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
rm -rf ${BUILDDIR}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
set_property INTERNAL_VREF 0.75 [get_iobanks 35]
|
||||
set_property CONFIG_VOLTAGE 3.3 [current_design]
|
||||
set_property CFGBVS VCCO [current_design]
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
ddr3_name = 'ddr3_top_inst.ddr3_phy_inst'
|
||||
def get_cells(name_part):
|
||||
return list(map(lambda c: c.second, filter(lambda c: name_part in c.first, ctx.cells)))
|
||||
|
||||
def get_cell(name_part):
|
||||
return get_cells(name_part)[0]
|
||||
|
||||
c1=get_cell(ddr3_name + '.genblk5[0].ISERDESE2_train')
|
||||
c3=get_cell(ddr3_name + '.genblk5[0].OSERDESE2_train')
|
||||
|
||||
# c2=get_cell(ddr3_name + '.genblk5[1].ISERDESE2_train')
|
||||
# c4=get_cell(ddr3_name + '.genblk5[1].OSERDESE2_train')
|
||||
|
||||
# Usually, nextpnr-xilinx would place these on X0Y149, but
|
||||
# prjxray has missing PIPs on _SING tiles, so we need to
|
||||
# place these on a non-SING tile to make it work
|
||||
c1.setAttr('BEL', 'ILOGIC_X1Y193/ISERDESE2')
|
||||
c3.setAttr('BEL', 'OLOGIC_X1Y193/OSERDESE2')
|
||||
# c2.setAttr('BEL', 'ILOGIC_X0Y245/ISERDESE2')
|
||||
# c4.setAttr('BEL', 'OLOGIC_X0Y245/OSERDESE2')
|
||||
Binary file not shown.
|
|
@ -93,34 +93,64 @@
|
|||
(* mark_debug = "true" *) wire clk_locked;
|
||||
clk_wiz clk_wiz_inst
|
||||
(
|
||||
// Clock out ports
|
||||
.clk_out1(i_controller_clk), //83.333 Mhz
|
||||
.clk_out2(i_ddr3_clk), // 333.333 MHz
|
||||
.clk_out3(i_ref_clk), //200MHz
|
||||
.clk_out4(i_ddr3_clk_90), // 333.333 MHz with 90degree shift
|
||||
// Status and control signals
|
||||
.reset(i_rst),
|
||||
.locked(clk_locked),
|
||||
// Clock in ports
|
||||
.clk_in1(i_clk)
|
||||
);
|
||||
|
||||
// UART module from https://github.com/alexforencich/verilog-uart
|
||||
uart #(.DATA_WIDTH(8)) uart_m
|
||||
(
|
||||
.clk(i_controller_clk),
|
||||
.rst(i_rst),
|
||||
.s_axis_tdata(o_wb_data),
|
||||
.s_axis_tvalid(o_wb_ack),
|
||||
.s_axis_tready(),
|
||||
.m_axis_tdata(rd_data),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(1),
|
||||
.rxd(rx),
|
||||
.txd(tx),
|
||||
.prescale(1085) //9600 Baud Rate
|
||||
// Clock out ports
|
||||
.clk_out1(i_controller_clk), //83.333 Mhz
|
||||
.clk_out2(i_ddr3_clk), // 333.333 MHz
|
||||
.clk_out3(i_ref_clk), //200MHz
|
||||
.clk_out4(i_ddr3_clk_90), // 333.333 MHz with 90degree shift
|
||||
// Status and control signals
|
||||
.reset(i_rst),
|
||||
.locked(clk_locked),
|
||||
// Clock in ports
|
||||
.clk_in1(i_clk)
|
||||
);
|
||||
|
||||
// UART TX/RXmodule from https://github.com/ben-marshall/uart
|
||||
uart_tx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_tx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(!i_rst && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_txd(tx), // UART transmit pin.
|
||||
.uart_tx_busy(), // Module busy sending previous item.
|
||||
.uart_tx_en(o_wb_ack), // Send the data on uart_tx_data
|
||||
.uart_tx_data(o_wb_data) // The data to be sent
|
||||
);
|
||||
uart_rx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_rx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(!i_rst && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_rxd(rx), // UART Recieve pin.
|
||||
.uart_rx_en(o_debug1[4:0] == 23), // Recieve enable
|
||||
.uart_rx_break(), // Did we get a BREAK message?
|
||||
.uart_rx_valid(m_axis_tvalid), // Valid data recieved/available.
|
||||
.uart_rx_data(rd_data) // The recieved data.
|
||||
);
|
||||
|
||||
|
||||
// UART module from https://github.com/alexforencich/verilog-uart (DOES NOT WORK ON OPENXC7, UberDDR3 cannot finish calibration when this UART is used)
|
||||
// uart #(.DATA_WIDTH(8)) uart_m
|
||||
// (
|
||||
// .clk(i_controller_clk),
|
||||
// .rst(i_rst),
|
||||
// .s_axis_tdata(o_wb_data),
|
||||
// .s_axis_tvalid(o_wb_ack),
|
||||
// .s_axis_tready(),
|
||||
// .m_axis_tdata(rd_data),
|
||||
// .m_axis_tvalid(m_axis_tvalid),
|
||||
// .m_axis_tready(1),
|
||||
// .rxd(rx),
|
||||
// .txd(tx),
|
||||
// .prescale(1085) //9600 Baud Rate (83.33MHz/(8*9600))
|
||||
// );
|
||||
|
||||
|
||||
// DDR3 Controller
|
||||
ddr3_top #(
|
||||
|
|
|
|||
|
|
@ -1,22 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
ddr3_name = 'ddr3_top_inst.ddr3_phy_inst'
|
||||
def get_cells(name_part):
|
||||
return list(map(lambda c: c.second, filter(lambda c: name_part in c.first, ctx.cells)))
|
||||
|
||||
def get_cell(name_part):
|
||||
return get_cells(name_part)[0]
|
||||
|
||||
c1_name = ddr3_name + '.genblk5[0].ISERDESE2_train'
|
||||
# c2_name = ddr3_name + '.genblk5[1].ISERDESE2_train'
|
||||
c3_name = ddr3_name + '.genblk5[0].OSERDESE2_train'
|
||||
# c4_name = ddr3_name + '.genblk5[1].OSERDESE2_train'
|
||||
|
||||
c1=get_cell(c1_name)
|
||||
# c2=get_cell(c2_name)
|
||||
c3=get_cell(c3_name)
|
||||
# c4=get_cell(c4_name)
|
||||
|
||||
print('show_bels: ' + c1_name + ": ", c1.bel)
|
||||
# print('show_bels: ' + c2_name + ": ", c2.bel)
|
||||
print('show_bels: ' + c3_name + ": ", c3.bel)
|
||||
# print('show_bels: ' + c4_name + ": ", c4.bel)
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire tx_busy,
|
||||
output wire rx_busy,
|
||||
output wire rx_overrun_error,
|
||||
output wire rx_frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
|
||||
);
|
||||
|
||||
uart_tx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_tx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi input
|
||||
.s_axis_tdata(s_axis_tdata),
|
||||
.s_axis_tvalid(s_axis_tvalid),
|
||||
.s_axis_tready(s_axis_tready),
|
||||
// output
|
||||
.txd(txd),
|
||||
// status
|
||||
.busy(tx_busy),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
uart_rx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_rx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi output
|
||||
.m_axis_tdata(m_axis_tdata),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(m_axis_tready),
|
||||
// input
|
||||
.rxd(rxd),
|
||||
// status
|
||||
.busy(rx_busy),
|
||||
.overrun_error(rx_overrun_error),
|
||||
.frame_error(rx_frame_error),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
|
@ -1,142 +1,207 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_rx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
output wire overrun_error,
|
||||
output wire frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
//
|
||||
// Module: uart_rx
|
||||
//
|
||||
// Notes:
|
||||
// - UART reciever module.
|
||||
//
|
||||
|
||||
module uart_rx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
input wire uart_rxd , // UART Recieve pin.
|
||||
input wire uart_rx_en , // Recieve enable
|
||||
output wire uart_rx_break, // Did we get a BREAK message?
|
||||
output wire uart_rx_valid, // Valid data recieved and available.
|
||||
output reg [PAYLOAD_BITS-1:0] uart_rx_data // The recieved data.
|
||||
);
|
||||
|
||||
reg [DATA_WIDTH-1:0] m_axis_tdata_reg = 0;
|
||||
reg m_axis_tvalid_reg = 0;
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
reg rxd_reg = 1;
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
reg busy_reg = 0;
|
||||
reg overrun_error_reg = 0;
|
||||
reg frame_error_reg = 0;
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
reg [DATA_WIDTH-1:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
assign m_axis_tdata = m_axis_tdata_reg;
|
||||
assign m_axis_tvalid = m_axis_tvalid_reg;
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
assign busy = busy_reg;
|
||||
assign overrun_error = overrun_error_reg;
|
||||
assign frame_error = frame_error_reg;
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_rxd line. Helps break long timing
|
||||
// paths from input pins into the logic.
|
||||
reg rxd_reg;
|
||||
reg rxd_reg_0;
|
||||
|
||||
//
|
||||
// Storage for the recieved serial data.
|
||||
reg [PAYLOAD_BITS-1:0] recieved_data;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of recieved bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Sample of the UART input line whenever we are in the middle of a bit frame.
|
||||
reg bit_sample;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_RECV = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Output assignment
|
||||
//
|
||||
|
||||
assign uart_rx_break = uart_rx_valid && ~|recieved_data;
|
||||
assign uart_rx_valid = fsm_state == FSM_STOP && n_fsm_state == FSM_IDLE;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
m_axis_tdata_reg <= 0;
|
||||
m_axis_tvalid_reg <= 0;
|
||||
rxd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
end else begin
|
||||
rxd_reg <= rxd;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
if(!resetn) begin
|
||||
uart_rx_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if (fsm_state == FSM_STOP) begin
|
||||
uart_rx_data <= recieved_data;
|
||||
end
|
||||
end
|
||||
|
||||
if (m_axis_tvalid && m_axis_tready) begin
|
||||
m_axis_tvalid_reg <= 0;
|
||||
end
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
if (prescale_reg > 0) begin
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt > 0) begin
|
||||
if (bit_cnt > DATA_WIDTH+1) begin
|
||||
if (!rxd_reg) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
end else begin
|
||||
bit_cnt <= 0;
|
||||
prescale_reg <= 0;
|
||||
end
|
||||
end else if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
data_reg <= {rxd_reg, data_reg[DATA_WIDTH-1:1]};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
if (rxd_reg) begin
|
||||
m_axis_tdata_reg <= data_reg;
|
||||
m_axis_tvalid_reg <= 1;
|
||||
overrun_error_reg <= m_axis_tvalid_reg;
|
||||
end else begin
|
||||
frame_error_reg <= 1;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
busy_reg <= 0;
|
||||
if (!rxd_reg) begin
|
||||
prescale_reg <= (prescale << 2)-2;
|
||||
bit_cnt <= DATA_WIDTH+2;
|
||||
data_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT ||
|
||||
fsm_state == FSM_STOP &&
|
||||
cycle_counter == CYCLES_PER_BIT/2;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = rxd_reg ? FSM_IDLE : FSM_START;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_RECV : FSM_START;
|
||||
FSM_RECV : n_fsm_state = payload_done ? FSM_STOP : FSM_RECV ;
|
||||
FSM_STOP : n_fsm_state = next_bit ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the recieved data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_recieved_data
|
||||
if(!resetn) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE ) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit ) begin
|
||||
recieved_data[PAYLOAD_BITS-1] <= bit_sample;
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
recieved_data[i] <= recieved_data[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Increments the bit counter when recieving.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_RECV) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Sample the recieved bit when in the middle of a bit frame.
|
||||
always @(posedge clk) begin : p_bit_sample
|
||||
if(!resetn) begin
|
||||
bit_sample <= 1'b0;
|
||||
end else if (cycle_counter == CYCLES_PER_BIT/2) begin
|
||||
bit_sample <= rxd_reg;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when recieving.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_RECV ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the rxd_reg.
|
||||
always @(posedge clk) begin : p_rxd_reg
|
||||
if(!resetn) begin
|
||||
rxd_reg <= 1'b1;
|
||||
rxd_reg_0 <= 1'b1;
|
||||
end else if(uart_rx_en) begin
|
||||
rxd_reg <= rxd_reg_0;
|
||||
rxd_reg_0 <= uart_rxd;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -1,115 +1,187 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// Module: uart_tx
|
||||
//
|
||||
// Notes:
|
||||
// - UART transmitter module.
|
||||
//
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_tx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
module uart_tx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
output wire uart_txd , // UART transmit pin.
|
||||
output wire uart_tx_busy, // Module busy sending previous item.
|
||||
input wire uart_tx_en , // Send the data on uart_tx_data
|
||||
input wire [PAYLOAD_BITS-1:0] uart_tx_data // The data to be sent
|
||||
);
|
||||
|
||||
reg s_axis_tready_reg = 0;
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
reg txd_reg = 1;
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
reg busy_reg = 0;
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
reg [DATA_WIDTH:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
assign s_axis_tready = s_axis_tready_reg;
|
||||
assign txd = txd_reg;
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
assign busy = busy_reg;
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
txd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
end else begin
|
||||
if (prescale_reg > 0) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt == 0) begin
|
||||
s_axis_tready_reg <= 1;
|
||||
busy_reg <= 0;
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
if (s_axis_tvalid) begin
|
||||
s_axis_tready_reg <= !s_axis_tready_reg;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
bit_cnt <= DATA_WIDTH+1;
|
||||
data_reg <= {1'b1, s_axis_tdata};
|
||||
txd_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
end else begin
|
||||
if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
{data_reg, txd_reg} <= {1'b0, data_reg};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3);
|
||||
txd_reg <= 1;
|
||||
end
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_txd line. Helps break long timing
|
||||
// paths from the logic to the output pins.
|
||||
reg txd_reg;
|
||||
|
||||
//
|
||||
// Storage for the serial data to be sent.
|
||||
reg [PAYLOAD_BITS-1:0] data_to_send;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of sent bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_SEND = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
assign uart_tx_busy = fsm_state != FSM_IDLE;
|
||||
assign uart_txd = txd_reg;
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
wire stop_done = bit_counter == STOP_BITS && fsm_state == FSM_STOP;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = uart_tx_en ? FSM_START: FSM_IDLE ;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_SEND : FSM_START;
|
||||
FSM_SEND : n_fsm_state = payload_done ? FSM_STOP : FSM_SEND ;
|
||||
FSM_STOP : n_fsm_state = stop_done ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the sent data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_data_to_send
|
||||
if(!resetn) begin
|
||||
data_to_send <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE && uart_tx_en) begin
|
||||
data_to_send <= uart_tx_data;
|
||||
end else if(fsm_state == FSM_SEND && next_bit ) begin
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
data_to_send[i] <= data_to_send[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the bit counter each time a new bit frame is sent.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_SEND && fsm_state != FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_SEND && n_fsm_state == FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_STOP&& next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end else if(fsm_state == FSM_SEND && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when sending.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_SEND ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the txd_reg.
|
||||
always @(posedge clk) begin : p_txd_reg
|
||||
if(!resetn) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_IDLE) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_START) begin
|
||||
txd_reg <= 1'b0;
|
||||
end else if(fsm_state == FSM_SEND) begin
|
||||
txd_reg <= data_to_send[0];
|
||||
end else if(fsm_state == FSM_STOP) begin
|
||||
txd_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -0,0 +1,71 @@
|
|||
PROJECT = wukong_ddr3
|
||||
FAMILY = artix7
|
||||
PART = xc7a100tfgg676-2
|
||||
CHIPDB = ${ARTIX7_CHIPDB}
|
||||
ADDITIONAL_SOURCES = ../../rtl/ddr3_controller.v ../../rtl/ddr3_phy.v ../../rtl/ddr3_top.v uart_rx.v uart_tx.v clk_wiz.v
|
||||
|
||||
|
||||
#############################################################################################
|
||||
NEXTPNR_XILINX_DIR ?= /snap/openxc7/current/opt/nextpnr-xilinx
|
||||
NEXTPNR_XILINX_PYTHON_DIR ?= ${NEXTPNR_XILINX_DIR}/python
|
||||
PRJXRAY_DB_DIR ?= ${NEXTPNR_XILINX_DIR}/external/prjxray-db
|
||||
|
||||
DBPART = $(shell echo ${PART} | sed -e 's/-[0-9]//g')
|
||||
SPEEDGRADE = $(shell echo ${PART} | sed -e 's/.*\-\([0-9]\)/\1/g')
|
||||
|
||||
CHIPDB ?= ./
|
||||
ifeq ($(CHIPDB),)
|
||||
CHIPDB = ./
|
||||
endif
|
||||
|
||||
PYPY3 ?= pypy3
|
||||
|
||||
TOP ?= ${PROJECT}
|
||||
TOP_MODULE ?= ${TOP}
|
||||
TOP_VERILOG ?= ${TOP}.v
|
||||
|
||||
PNR_DEBUG ?= # --verbose --debug
|
||||
|
||||
BOARD ?= UNKNOWN
|
||||
JTAG_LINK ?= --board ${BOARD}
|
||||
|
||||
XDC ?= ${PROJECT}.xdc
|
||||
|
||||
.PHONY: all
|
||||
all: ${PROJECT}.bit
|
||||
|
||||
.PHONY: program
|
||||
program: ${PROJECT}.bit
|
||||
openFPGALoader ${JTAG_LINK} --bitstream $<
|
||||
|
||||
${PROJECT}.json: ${TOP_VERILOG} ${ADDITIONAL_SOURCES}
|
||||
yosys -p "synth_xilinx -flatten -abc9 ${SYNTH_OPTS} -arch xc7 -top ${TOP_MODULE}; write_json ${PROJECT}.json" $< ${ADDITIONAL_SOURCES}
|
||||
|
||||
# The chip database only needs to be generated once
|
||||
# that is why we don't clean it with make clean
|
||||
${CHIPDB}/${DBPART}.bin:
|
||||
${PYPY3} ${NEXTPNR_XILINX_PYTHON_DIR}/bbaexport.py --device ${PART} --bba ${DBPART}.bba
|
||||
bbasm -l ${DBPART}.bba ${CHIPDB}/${DBPART}.bin
|
||||
rm -f ${DBPART}.bba
|
||||
|
||||
${PROJECT}.fasm: ${PROJECT}.json ${CHIPDB}/${DBPART}.bin ${XDC}
|
||||
nextpnr-xilinx --chipdb ${CHIPDB}/${DBPART}.bin --xdc ${XDC} --json ${PROJECT}.json --fasm $@ ${PNR_ARGS} ${PNR_DEBUG}
|
||||
|
||||
${PROJECT}.frames: ${PROJECT}.fasm
|
||||
fasm2frames --part ${PART} --db-root ${PRJXRAY_DB_DIR}/${FAMILY} $< > $@
|
||||
|
||||
${PROJECT}.bit: ${PROJECT}.frames
|
||||
xc7frames2bit --part_file ${PRJXRAY_DB_DIR}/${FAMILY}/${PART}/part.yaml --part_name ${PART} --frm_file $< --output_file $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@rm -f *.bit
|
||||
@rm -f *.frames
|
||||
@rm -f *.fasm
|
||||
@rm -f *.json
|
||||
@rm -f *.bin
|
||||
@rm -f *.bba
|
||||
|
||||
.PHONY: pnrclean
|
||||
pnrclean:
|
||||
rm *.fasm *.frames *.bit
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire tx_busy,
|
||||
output wire rx_busy,
|
||||
output wire rx_overrun_error,
|
||||
output wire rx_frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
|
||||
);
|
||||
|
||||
uart_tx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_tx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi input
|
||||
.s_axis_tdata(s_axis_tdata),
|
||||
.s_axis_tvalid(s_axis_tvalid),
|
||||
.s_axis_tready(s_axis_tready),
|
||||
// output
|
||||
.txd(txd),
|
||||
// status
|
||||
.busy(tx_busy),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
uart_rx #(
|
||||
.DATA_WIDTH(DATA_WIDTH)
|
||||
)
|
||||
uart_rx_inst (
|
||||
.clk(clk),
|
||||
.rst(rst),
|
||||
// axi output
|
||||
.m_axis_tdata(m_axis_tdata),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(m_axis_tready),
|
||||
// input
|
||||
.rxd(rxd),
|
||||
// status
|
||||
.busy(rx_busy),
|
||||
.overrun_error(rx_overrun_error),
|
||||
.frame_error(rx_frame_error),
|
||||
// configuration
|
||||
.prescale(prescale)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
|
@ -1,142 +1,207 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_rx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI output
|
||||
*/
|
||||
output wire [DATA_WIDTH-1:0] m_axis_tdata,
|
||||
output wire m_axis_tvalid,
|
||||
input wire m_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
input wire rxd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
output wire overrun_error,
|
||||
output wire frame_error,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
//
|
||||
// Module: uart_rx
|
||||
//
|
||||
// Notes:
|
||||
// - UART reciever module.
|
||||
//
|
||||
|
||||
module uart_rx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
input wire uart_rxd , // UART Recieve pin.
|
||||
input wire uart_rx_en , // Recieve enable
|
||||
output wire uart_rx_break, // Did we get a BREAK message?
|
||||
output wire uart_rx_valid, // Valid data recieved and available.
|
||||
output reg [PAYLOAD_BITS-1:0] uart_rx_data // The recieved data.
|
||||
);
|
||||
|
||||
reg [DATA_WIDTH-1:0] m_axis_tdata_reg = 0;
|
||||
reg m_axis_tvalid_reg = 0;
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
reg rxd_reg = 1;
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
reg busy_reg = 0;
|
||||
reg overrun_error_reg = 0;
|
||||
reg frame_error_reg = 0;
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
reg [DATA_WIDTH-1:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
assign m_axis_tdata = m_axis_tdata_reg;
|
||||
assign m_axis_tvalid = m_axis_tvalid_reg;
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
assign busy = busy_reg;
|
||||
assign overrun_error = overrun_error_reg;
|
||||
assign frame_error = frame_error_reg;
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_rxd line. Helps break long timing
|
||||
// paths from input pins into the logic.
|
||||
reg rxd_reg;
|
||||
reg rxd_reg_0;
|
||||
|
||||
//
|
||||
// Storage for the recieved serial data.
|
||||
reg [PAYLOAD_BITS-1:0] recieved_data;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of recieved bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Sample of the UART input line whenever we are in the middle of a bit frame.
|
||||
reg bit_sample;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_RECV = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Output assignment
|
||||
//
|
||||
|
||||
assign uart_rx_break = uart_rx_valid && ~|recieved_data;
|
||||
assign uart_rx_valid = fsm_state == FSM_STOP && n_fsm_state == FSM_IDLE;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
m_axis_tdata_reg <= 0;
|
||||
m_axis_tvalid_reg <= 0;
|
||||
rxd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
end else begin
|
||||
rxd_reg <= rxd;
|
||||
overrun_error_reg <= 0;
|
||||
frame_error_reg <= 0;
|
||||
if(!resetn) begin
|
||||
uart_rx_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if (fsm_state == FSM_STOP) begin
|
||||
uart_rx_data <= recieved_data;
|
||||
end
|
||||
end
|
||||
|
||||
if (m_axis_tvalid && m_axis_tready) begin
|
||||
m_axis_tvalid_reg <= 0;
|
||||
end
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
if (prescale_reg > 0) begin
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt > 0) begin
|
||||
if (bit_cnt > DATA_WIDTH+1) begin
|
||||
if (!rxd_reg) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
end else begin
|
||||
bit_cnt <= 0;
|
||||
prescale_reg <= 0;
|
||||
end
|
||||
end else if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
data_reg <= {rxd_reg, data_reg[DATA_WIDTH-1:1]};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
if (rxd_reg) begin
|
||||
m_axis_tdata_reg <= data_reg;
|
||||
m_axis_tvalid_reg <= 1;
|
||||
overrun_error_reg <= m_axis_tvalid_reg;
|
||||
end else begin
|
||||
frame_error_reg <= 1;
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
busy_reg <= 0;
|
||||
if (!rxd_reg) begin
|
||||
prescale_reg <= (prescale << 2)-2;
|
||||
bit_cnt <= DATA_WIDTH+2;
|
||||
data_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT ||
|
||||
fsm_state == FSM_STOP &&
|
||||
cycle_counter == CYCLES_PER_BIT/2;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = rxd_reg ? FSM_IDLE : FSM_START;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_RECV : FSM_START;
|
||||
FSM_RECV : n_fsm_state = payload_done ? FSM_STOP : FSM_RECV ;
|
||||
FSM_STOP : n_fsm_state = next_bit ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the recieved data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_recieved_data
|
||||
if(!resetn) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE ) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit ) begin
|
||||
recieved_data[PAYLOAD_BITS-1] <= bit_sample;
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
recieved_data[i] <= recieved_data[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Increments the bit counter when recieving.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_RECV) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Sample the recieved bit when in the middle of a bit frame.
|
||||
always @(posedge clk) begin : p_bit_sample
|
||||
if(!resetn) begin
|
||||
bit_sample <= 1'b0;
|
||||
end else if (cycle_counter == CYCLES_PER_BIT/2) begin
|
||||
bit_sample <= rxd_reg;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when recieving.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_RECV ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the rxd_reg.
|
||||
always @(posedge clk) begin : p_rxd_reg
|
||||
if(!resetn) begin
|
||||
rxd_reg <= 1'b1;
|
||||
rxd_reg_0 <= 1'b1;
|
||||
end else if(uart_rx_en) begin
|
||||
rxd_reg <= rxd_reg_0;
|
||||
rxd_reg_0 <= uart_rxd;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
|
|
@ -1,115 +1,187 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2014-2017 Alex Forencich
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// Module: uart_tx
|
||||
//
|
||||
// Notes:
|
||||
// - UART transmitter module.
|
||||
//
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
// Language: Verilog 2001
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
/*
|
||||
* AXI4-Stream UART
|
||||
*/
|
||||
module uart_tx #
|
||||
(
|
||||
parameter DATA_WIDTH = 8
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire rst,
|
||||
|
||||
/*
|
||||
* AXI input
|
||||
*/
|
||||
input wire [DATA_WIDTH-1:0] s_axis_tdata,
|
||||
input wire s_axis_tvalid,
|
||||
output wire s_axis_tready,
|
||||
|
||||
/*
|
||||
* UART interface
|
||||
*/
|
||||
output wire txd,
|
||||
|
||||
/*
|
||||
* Status
|
||||
*/
|
||||
output wire busy,
|
||||
|
||||
/*
|
||||
* Configuration
|
||||
*/
|
||||
input wire [15:0] prescale
|
||||
module uart_tx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
output wire uart_txd , // UART transmit pin.
|
||||
output wire uart_tx_busy, // Module busy sending previous item.
|
||||
input wire uart_tx_en , // Send the data on uart_tx_data
|
||||
input wire [PAYLOAD_BITS-1:0] uart_tx_data // The data to be sent
|
||||
);
|
||||
|
||||
reg s_axis_tready_reg = 0;
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
reg txd_reg = 1;
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
reg busy_reg = 0;
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
reg [DATA_WIDTH:0] data_reg = 0;
|
||||
reg [18:0] prescale_reg = 0;
|
||||
reg [3:0] bit_cnt = 0;
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
assign s_axis_tready = s_axis_tready_reg;
|
||||
assign txd = txd_reg;
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
assign busy = busy_reg;
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (rst) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
txd_reg <= 1;
|
||||
prescale_reg <= 0;
|
||||
bit_cnt <= 0;
|
||||
busy_reg <= 0;
|
||||
end else begin
|
||||
if (prescale_reg > 0) begin
|
||||
s_axis_tready_reg <= 0;
|
||||
prescale_reg <= prescale_reg - 1;
|
||||
end else if (bit_cnt == 0) begin
|
||||
s_axis_tready_reg <= 1;
|
||||
busy_reg <= 0;
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
if (s_axis_tvalid) begin
|
||||
s_axis_tready_reg <= !s_axis_tready_reg;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
bit_cnt <= DATA_WIDTH+1;
|
||||
data_reg <= {1'b1, s_axis_tdata};
|
||||
txd_reg <= 0;
|
||||
busy_reg <= 1;
|
||||
end
|
||||
end else begin
|
||||
if (bit_cnt > 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3)-1;
|
||||
{data_reg, txd_reg} <= {1'b0, data_reg};
|
||||
end else if (bit_cnt == 1) begin
|
||||
bit_cnt <= bit_cnt - 1;
|
||||
prescale_reg <= (prescale << 3);
|
||||
txd_reg <= 1;
|
||||
end
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_txd line. Helps break long timing
|
||||
// paths from the logic to the output pins.
|
||||
reg txd_reg;
|
||||
|
||||
//
|
||||
// Storage for the serial data to be sent.
|
||||
reg [PAYLOAD_BITS-1:0] data_to_send;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of sent bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_SEND = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
assign uart_tx_busy = fsm_state != FSM_IDLE;
|
||||
assign uart_txd = txd_reg;
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
wire stop_done = bit_counter == STOP_BITS && fsm_state == FSM_STOP;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = uart_tx_en ? FSM_START: FSM_IDLE ;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_SEND : FSM_START;
|
||||
FSM_SEND : n_fsm_state = payload_done ? FSM_STOP : FSM_SEND ;
|
||||
FSM_STOP : n_fsm_state = stop_done ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the sent data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_data_to_send
|
||||
if(!resetn) begin
|
||||
data_to_send <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE && uart_tx_en) begin
|
||||
data_to_send <= uart_tx_data;
|
||||
end else if(fsm_state == FSM_SEND && next_bit ) begin
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
data_to_send[i] <= data_to_send[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the bit counter each time a new bit frame is sent.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_SEND && fsm_state != FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_SEND && n_fsm_state == FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_STOP&& next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end else if(fsm_state == FSM_SEND && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when sending.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_SEND ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the txd_reg.
|
||||
always @(posedge clk) begin : p_txd_reg
|
||||
if(!resetn) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_IDLE) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_START) begin
|
||||
txd_reg <= 1'b0;
|
||||
end else if(fsm_state == FSM_SEND) begin
|
||||
txd_reg <= data_to_send[0];
|
||||
end else if(fsm_state == FSM_STOP) begin
|
||||
txd_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -75,7 +75,7 @@
|
|||
reg[7:0] i_wb_addr;
|
||||
// o_debug1 taps on value of state_calibrate (can be traced inside ddr3_controller module)
|
||||
assign led[0] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[1] = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
assign led[1] = (o_debug1[4:0] == 23); //light up if not at DONE_CALIBRATE
|
||||
|
||||
always @(posedge i_controller_clk) begin
|
||||
begin
|
||||
|
|
@ -114,20 +114,33 @@
|
|||
.clk_in1(i_clk)
|
||||
);
|
||||
|
||||
// UART module from https://github.com/alexforencich/verilog-uart
|
||||
uart #(.DATA_WIDTH(8)) uart_m
|
||||
(
|
||||
.clk(i_controller_clk),
|
||||
.rst(!i_rst_n),
|
||||
.s_axis_tdata(o_wb_data),
|
||||
.s_axis_tvalid(o_wb_ack),
|
||||
.s_axis_tready(),
|
||||
.m_axis_tdata(rd_data),
|
||||
.m_axis_tvalid(m_axis_tvalid),
|
||||
.m_axis_tready(1),
|
||||
.rxd(rx),
|
||||
.txd(tx),
|
||||
.prescale(1085) //9600 Baud Rate (83.33MHz/(8*9600))
|
||||
// UART TX/RX module from https://github.com/ben-marshall/uart
|
||||
uart_tx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_tx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(i_rst_n && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_txd(tx), // UART transmit pin.
|
||||
.uart_tx_busy(), // Module busy sending previous item.
|
||||
.uart_tx_en(o_wb_ack), // Send the data on uart_tx_data
|
||||
.uart_tx_data(o_wb_data) // The data to be sent
|
||||
);
|
||||
uart_rx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_rx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(i_rst_n && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_rxd(rx), // UART Recieve pin.
|
||||
.uart_rx_en(o_debug1[4:0] == 23), // Recieve enable
|
||||
.uart_rx_break(), // Did we get a BREAK message?
|
||||
.uart_rx_valid(m_axis_tvalid), // Valid data recieved/available.
|
||||
.uart_rx_data(rd_data) // The recieved data.
|
||||
);
|
||||
|
||||
// DDR3 Controller
|
||||
|
|
|
|||
|
|
@ -527,11 +527,11 @@ set_property PACKAGE_PIN E3 [get_ports tx]
|
|||
set_property IOSTANDARD LVCMOS33 [get_ports tx]
|
||||
|
||||
|
||||
set_property INTERNAL_VREF 0.675 [get_iobanks 16]
|
||||
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
|
||||
# set_property INTERNAL_VREF 0.675 [get_iobanks 16]
|
||||
# set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
|
||||
|
||||
|
||||
## Place the IOSERDES_train manually (else the tool will place this blocks which can block the route for CLKB0 (OBUFDS for ddr3_clk_p))
|
||||
set_property LOC OLOGIC_X0Y91 [get_cells {ddr3_top/ddr3_phy_inst/genblk5[1].OSERDESE2_train}]
|
||||
set_property LOC ILOGIC_X0Y94 [get_cells {ddr3_top/ddr3_phy_inst/genblk5[0].ISERDESE2_train}]
|
||||
# ## Place the IOSERDES_train manually (else the tool will place this blocks which can block the route for CLKB0 (OBUFDS for ddr3_clk_p))
|
||||
# set_property LOC OLOGIC_X0Y91 [get_cells {ddr3_top/ddr3_phy_inst/genblk5[1].OSERDESE2_train}]
|
||||
# set_property LOC ILOGIC_X0Y94 [get_cells {ddr3_top/ddr3_phy_inst/genblk5[0].ISERDESE2_train}]
|
||||
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
PROJECT = sechzig_mx2_ddr3
|
||||
FAMILY = artix7
|
||||
PART = xc7a35tftg256-2
|
||||
CHIPDB = ${ARTIX7_CHIPDB}
|
||||
ADDITIONAL_SOURCES = ../../rtl/ddr3_controller.v ../../rtl/ddr3_phy.v ../../rtl/ddr3_top.v uart_rx.v uart_tx.v clk_wiz.v
|
||||
|
||||
#############################################################################################
|
||||
NEXTPNR_XILINX_DIR ?= /snap/openxc7/current/opt/nextpnr-xilinx
|
||||
NEXTPNR_XILINX_PYTHON_DIR ?= ${NEXTPNR_XILINX_DIR}/python
|
||||
PRJXRAY_DB_DIR ?= ${NEXTPNR_XILINX_DIR}/external/prjxray-db
|
||||
|
||||
DBPART = $(shell echo ${PART} | sed -e 's/-[0-9]//g')
|
||||
SPEEDGRADE = $(shell echo ${PART} | sed -e 's/.*\-\([0-9]\)/\1/g')
|
||||
|
||||
CHIPDB ?= ./
|
||||
ifeq ($(CHIPDB),)
|
||||
CHIPDB = ./
|
||||
endif
|
||||
|
||||
PYPY3 ?= pypy3
|
||||
|
||||
TOP ?= ${PROJECT}
|
||||
TOP_MODULE ?= ${TOP}
|
||||
TOP_VERILOG ?= ${TOP}.v
|
||||
|
||||
PNR_DEBUG ?= # --verbose --debug
|
||||
|
||||
BOARD ?= UNKNOWN
|
||||
JTAG_LINK ?= --board ${BOARD}
|
||||
|
||||
XDC ?= ${PROJECT}.xdc
|
||||
|
||||
.PHONY: all
|
||||
all: ${PROJECT}.bit
|
||||
|
||||
.PHONY: program
|
||||
program: ${PROJECT}.bit
|
||||
openFPGALoader ${JTAG_LINK} --bitstream $<
|
||||
|
||||
${PROJECT}.json: ${TOP_VERILOG} ${ADDITIONAL_SOURCES}
|
||||
yosys -p "synth_xilinx -flatten -abc9 ${SYNTH_OPTS} -arch xc7 -top ${TOP_MODULE}; write_json ${PROJECT}.json" $< ${ADDITIONAL_SOURCES}
|
||||
|
||||
# The chip database only needs to be generated once
|
||||
# that is why we don't clean it with make clean
|
||||
${CHIPDB}/${DBPART}.bin:
|
||||
${PYPY3} ${NEXTPNR_XILINX_PYTHON_DIR}/bbaexport.py --device ${PART} --bba ${DBPART}.bba
|
||||
bbasm -l ${DBPART}.bba ${CHIPDB}/${DBPART}.bin
|
||||
rm -f ${DBPART}.bba
|
||||
|
||||
${PROJECT}.fasm: ${PROJECT}.json ${CHIPDB}/${DBPART}.bin ${XDC}
|
||||
nextpnr-xilinx --chipdb ${CHIPDB}/${DBPART}.bin --xdc ${XDC} --json ${PROJECT}.json --fasm $@ ${PNR_ARGS} ${PNR_DEBUG}
|
||||
|
||||
${PROJECT}.frames: ${PROJECT}.fasm
|
||||
fasm2frames --part ${PART} --db-root ${PRJXRAY_DB_DIR}/${FAMILY} $< > $@
|
||||
|
||||
${PROJECT}.bit: ${PROJECT}.frames
|
||||
xc7frames2bit --part_file ${PRJXRAY_DB_DIR}/${FAMILY}/${PART}/part.yaml --part_name ${PART} --frm_file $< --output_file $@
|
||||
|
||||
.PHONY: clean
|
||||
clean:
|
||||
@rm -f *.frames
|
||||
@rm -f *.fasm
|
||||
@rm -f *.json
|
||||
@rm -f *.bin
|
||||
@rm -f *.bba
|
||||
|
||||
.PHONY: pnrclean
|
||||
pnrclean:
|
||||
rm *.fasm *.frames *.bit
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
`timescale 1ps/1ps
|
||||
|
||||
module clk_wiz
|
||||
(
|
||||
input clk_in1,
|
||||
output clk_out1,
|
||||
output clk_out2,
|
||||
output clk_out3,
|
||||
output clk_out4,
|
||||
input reset,
|
||||
output locked
|
||||
);
|
||||
wire clk_out1_clk_wiz_0;
|
||||
wire clk_out2_clk_wiz_0;
|
||||
wire clk_out3_clk_wiz_0;
|
||||
wire clk_out4_clk_wiz_0;
|
||||
|
||||
wire clkfbout;
|
||||
|
||||
PLLE2_ADV
|
||||
#(.BANDWIDTH ("OPTIMIZED"),
|
||||
.COMPENSATION ("INTERNAL"),
|
||||
.STARTUP_WAIT ("FALSE"),
|
||||
.DIVCLK_DIVIDE (1),
|
||||
.CLKFBOUT_MULT (20), // 50 MHz * 20 = 1000 MHz
|
||||
.CLKFBOUT_PHASE (0.000),
|
||||
.CLKOUT0_DIVIDE (12), // 1000 MHz / 12 = 83.333 MHz
|
||||
.CLKOUT0_PHASE (0.000),
|
||||
.CLKOUT0_DUTY_CYCLE (0.500),
|
||||
.CLKOUT1_DIVIDE (3), // 1000 MHz / 3 = 333.333 MHz
|
||||
.CLKOUT1_PHASE (0.000),
|
||||
.CLKOUT1_DUTY_CYCLE (0.500),
|
||||
.CLKOUT2_DIVIDE (5), // 1000 MHz / 5 = 200 MHz
|
||||
.CLKOUT2_PHASE (0.000),
|
||||
.CLKOUT2_DUTY_CYCLE (0.500),
|
||||
.CLKOUT3_DIVIDE (3), // 1000 MHz / 3 = 333.333 MHz, 90 phase
|
||||
.CLKOUT3_PHASE (90.000),
|
||||
.CLKOUT3_DUTY_CYCLE (0.500),
|
||||
.CLKIN1_PERIOD (20.000) // 50 MHz input
|
||||
)
|
||||
plle2_adv_inst
|
||||
(
|
||||
.CLKFBOUT (clkfbout),
|
||||
.CLKOUT0 (clk_out1_clk_wiz_0),
|
||||
.CLKOUT1 (clk_out2_clk_wiz_0),
|
||||
.CLKOUT2 (clk_out3_clk_wiz_0),
|
||||
.CLKOUT3 (clk_out4_clk_wiz_0),
|
||||
.CLKFBIN (clkfbout),
|
||||
.CLKIN1 (clk_in1),
|
||||
.LOCKED (locked),
|
||||
.RST (reset)
|
||||
);
|
||||
BUFG clkout1_buf
|
||||
(.O (clk_out1),
|
||||
.I (clk_out1_clk_wiz_0));
|
||||
BUFG clkout2_buf
|
||||
(.O (clk_out2),
|
||||
.I (clk_out2_clk_wiz_0));
|
||||
BUFG clkout3_buf
|
||||
(.O (clk_out3),
|
||||
.I (clk_out3_clk_wiz_0));
|
||||
BUFG clkout4_buf
|
||||
(.O (clk_out4),
|
||||
.I (clk_out4_clk_wiz_0));
|
||||
|
||||
endmodule
|
||||
|
|
@ -0,0 +1,216 @@
|
|||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Filename: sechzig_mx2_ddr3.v
|
||||
// Project: UberDDR3 - An Open Source DDR3 Controller
|
||||
//
|
||||
// Purpose: Example demo of UberDDR3 for Machdyne Sechzig MX2 (xc7a35tftg256-2). Mechanism:
|
||||
// - two LEDs will light up once UberDDR3 is done calibrating
|
||||
// - if UART (9600 Baud Rate)receives small letter ASCII (a-z), this value will be written to DDR3
|
||||
// - if UART receives capital letter ASCII (A-Z), the small letter equivalent will be retrieved from DDR3 by doing
|
||||
// - a read request, once read data is available this will be sent to UART to be streamed out.
|
||||
// THUS:
|
||||
// - Sendng "abcdefg" to the UART terminal will store that small latter to DDR3
|
||||
// - Then sending "ABCDEFG" to the UART terminal will return the small letter equivalent: "abcdefg"
|
||||
//
|
||||
// Engineer: Angelo C. Jacobo
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Copyright (C) 2023-2024 Angelo Jacobo
|
||||
// Copyright (C) 2024 Lone Dynamics Corporation
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
module sechzig_mx2_ddr3
|
||||
(
|
||||
input wire clk50,
|
||||
// DDR3 I/O Interface
|
||||
output wire ddr3_clk_p, ddr3_clk_n,
|
||||
output wire ddr3_reset_n,
|
||||
output wire ddr3_cke, // CKE
|
||||
//output wire ddr3_cs_n, // no chip select signal
|
||||
output wire ddr3_ras_n, // RAS#
|
||||
output wire ddr3_cas_n, // CAS#
|
||||
output wire ddr3_we_n, // WE#
|
||||
output wire[14-1:0] ddr3_addr,
|
||||
output wire[3-1:0] ddr3_ba,
|
||||
inout wire[16-1:0] ddr3_dq,
|
||||
inout wire[2-1:0] ddr3_dqs_p, ddr3_dqs_n,
|
||||
output wire[2-1:0] ddr3_dm,
|
||||
output wire ddr3_odt, // on-die termination
|
||||
// UART line
|
||||
input wire rx,
|
||||
output wire tx,
|
||||
//Debug LEDs
|
||||
output wire led
|
||||
);
|
||||
|
||||
wire i_controller_clk, i_ddr3_clk, i_ref_clk, i_ddr3_clk_90;
|
||||
wire m_axis_tvalid;
|
||||
wire rx_empty;
|
||||
wire tx_full;
|
||||
wire o_wb_ack;
|
||||
wire[7:0] o_wb_data;
|
||||
wire o_aux;
|
||||
wire[7:0] rd_data;
|
||||
wire o_wb_stall;
|
||||
reg i_wb_stb = 0, i_wb_we;
|
||||
wire[63:0] o_debug1;
|
||||
reg[7:0] i_wb_data;
|
||||
reg[7:0] i_wb_addr;
|
||||
// o_debug1 taps on value of state_calibrate (can be traced inside ddr3_controller module)
|
||||
assign led = !(o_debug1[4:0] == 23); //light up if at DONE_CALIBRATE
|
||||
|
||||
always @(posedge i_controller_clk) begin
|
||||
begin
|
||||
i_wb_stb <= 0;
|
||||
i_wb_we <= 0;
|
||||
i_wb_addr <= 0;
|
||||
i_wb_data <= 0;
|
||||
if(!o_wb_stall && m_axis_tvalid) begin
|
||||
if(rd_data >= 97 && rd_data <= 122) begin //write to DDR3 if ASCII is small letter
|
||||
i_wb_stb <= 1;
|
||||
i_wb_we <= 1;
|
||||
i_wb_addr <= ~rd_data ;
|
||||
i_wb_data <= rd_data;
|
||||
end
|
||||
else if(rd_data >= 65 && rd_data <= 90) begin //read from DDR3 if ASCII is capital letter
|
||||
i_wb_stb <= 1; //make request
|
||||
i_wb_we <= 0; //read
|
||||
i_wb_addr <= ~(rd_data + 8'd32);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
reg i_rst_n = 1;
|
||||
|
||||
(* mark_debug = "true" *) wire clk_locked;
|
||||
clk_wiz clk_wiz_inst
|
||||
(
|
||||
// Clock out ports
|
||||
.clk_out1(i_controller_clk), //83.333 Mhz
|
||||
.clk_out2(i_ddr3_clk), // 333.333 MHz
|
||||
.clk_out3(i_ref_clk), //200MHz
|
||||
.clk_out4(i_ddr3_clk_90), // 333.333 MHz with 90degree shift
|
||||
// Status and control signals
|
||||
.reset(!i_rst_n),
|
||||
.locked(clk_locked),
|
||||
// Clock in ports
|
||||
.clk_in1(clk50)
|
||||
);
|
||||
|
||||
// UART TX/RXmodule from https://github.com/ben-marshall/uart
|
||||
uart_tx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_tx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(i_rst_n && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_txd(tx), // UART transmit pin.
|
||||
.uart_tx_busy(), // Module busy sending previous item.
|
||||
.uart_tx_en(o_wb_ack), // Send the data on uart_tx_data
|
||||
.uart_tx_data(o_wb_data) // The data to be sent
|
||||
);
|
||||
uart_rx #(
|
||||
.BIT_RATE(9600),
|
||||
.CLK_HZ(83_333_333),
|
||||
.PAYLOAD_BITS(8),
|
||||
.STOP_BITS(1)
|
||||
) uart_rx_inst (
|
||||
.clk(i_controller_clk), // Top level system clock input.
|
||||
.resetn(i_rst_n && clk_locked && o_debug1[4:0] == 23), // Asynchronous active low reset.
|
||||
.uart_rxd(rx), // UART Recieve pin.
|
||||
.uart_rx_en(o_debug1[4:0] == 23), // Recieve enable
|
||||
.uart_rx_break(), // Did we get a BREAK message?
|
||||
.uart_rx_valid(m_axis_tvalid), // Valid data recieved/available.
|
||||
.uart_rx_data(rd_data) // The recieved data.
|
||||
);
|
||||
|
||||
// DDR3 Controller
|
||||
ddr3_top #(
|
||||
.CONTROLLER_CLK_PERIOD(12_000), //ps, clock period of the controller interface
|
||||
.DDR3_CLK_PERIOD(3_000), //ps, clock period of the DDR3 RAM device (must be 1/4 of the CONTROLLER_CLK_PERIOD)
|
||||
.ROW_BITS(14), //width of row address
|
||||
.COL_BITS(10), //width of column address
|
||||
.BA_BITS(3), //width of bank address
|
||||
.BYTE_LANES(2), //number of DDR3 modules to be controlled
|
||||
.AUX_WIDTH(4), //width of aux line (must be >= 4)
|
||||
.WB2_ADDR_BITS(32), //width of 2nd wishbone address bus
|
||||
.WB2_DATA_BITS(32), //width of 2nd wishbone data bus
|
||||
.MICRON_SIM(0), //enable faster simulation for micron ddr3 model (shorten POWER_ON_RESET_HIGH and INITIAL_CKE_LOW)
|
||||
.ODELAY_SUPPORTED(0), //set to 1 when ODELAYE2 is supported
|
||||
.SECOND_WISHBONE(0) //set to 1 if 2nd wishbone is needed
|
||||
) ddr3_top_inst
|
||||
(
|
||||
//clock and reset
|
||||
.i_controller_clk(i_controller_clk),
|
||||
.i_ddr3_clk(i_ddr3_clk), //i_controller_clk has period of CONTROLLER_CLK_PERIOD, i_ddr3_clk has period of DDR3_CLK_PERIOD
|
||||
.i_ref_clk(i_ref_clk),
|
||||
.i_ddr3_clk_90(i_ddr3_clk_90),
|
||||
.i_rst_n(i_rst_n && clk_locked),
|
||||
// Wishbone inputs
|
||||
.i_wb_cyc(1), //bus cycle active (1 = normal operation, 0 = all ongoing transaction are to be cancelled)
|
||||
.i_wb_stb(i_wb_stb), //request a transfer
|
||||
.i_wb_we(i_wb_we), //write-enable (1 = write, 0 = read)
|
||||
.i_wb_addr(i_wb_addr), //burst-addressable {row,bank,col}
|
||||
.i_wb_data(i_wb_data), //write data, for a 4:1 controller data width is 8 times the number of pins on the device
|
||||
.i_wb_sel(16'hffff), //byte strobe for write (1 = write the byte)
|
||||
.i_aux(i_wb_we), //for AXI-interface compatibility (given upon strobe)
|
||||
// Wishbone outputs
|
||||
.o_wb_stall(o_wb_stall), //1 = busy, cannot accept requests
|
||||
.o_wb_ack(o_wb_ack), //1 = read/write request has completed
|
||||
.o_wb_data(o_wb_data), //read data, for a 4:1 controller data width is 8 times the number of pins on the device
|
||||
.o_aux(o_aux),
|
||||
// Wishbone 2 (PHY) inputs
|
||||
.i_wb2_cyc(), //bus cycle active (1 = normal operation, 0 = all ongoing transaction are to be cancelled)
|
||||
.i_wb2_stb(), //request a transfer
|
||||
.i_wb2_we(), //write-enable (1 = write, 0 = read)
|
||||
.i_wb2_addr(), //burst-addressable {row,bank,col}
|
||||
.i_wb2_data(), //write data, for a 4:1 controller data width is 8 times the number of pins on the device
|
||||
.i_wb2_sel(), //byte strobe for write (1 = write the byte)
|
||||
// Wishbone 2 (Controller) outputs
|
||||
.o_wb2_stall(), //1 = busy, cannot accept requests
|
||||
.o_wb2_ack(), //1 = read/write request has completed
|
||||
.o_wb2_data(), //read data, for a 4:1 controller data width is 8 times the number of pins on the device
|
||||
// PHY Interface (to be added later)
|
||||
// DDR3 I/O Interface
|
||||
.o_ddr3_clk_p(ddr3_clk_p),
|
||||
.o_ddr3_clk_n(ddr3_clk_n),
|
||||
.o_ddr3_reset_n(ddr3_reset_n),
|
||||
.o_ddr3_cke(ddr3_cke), // CKE
|
||||
.o_ddr3_cs_n(), // chip select signal (controls rank 1 only)
|
||||
.o_ddr3_ras_n(ddr3_ras_n), // RAS#
|
||||
.o_ddr3_cas_n(ddr3_cas_n), // CAS#
|
||||
.o_ddr3_we_n(ddr3_we_n), // WE#
|
||||
.o_ddr3_addr(ddr3_addr),
|
||||
.o_ddr3_ba_addr(ddr3_ba),
|
||||
.io_ddr3_dq(ddr3_dq),
|
||||
.io_ddr3_dqs(ddr3_dqs_p),
|
||||
.io_ddr3_dqs_n(ddr3_dqs_n),
|
||||
.o_ddr3_dm(ddr3_dm),
|
||||
.o_ddr3_odt(ddr3_odt), // on-die termination
|
||||
.o_debug1(o_debug1),
|
||||
.o_debug2(),
|
||||
.o_debug3()
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
|
|
@ -0,0 +1,276 @@
|
|||
################################################################################
|
||||
# IO constraints
|
||||
################################################################################
|
||||
# clk48:0
|
||||
set_property LOC F5 [get_ports {clk48}]
|
||||
set_property IOSTANDARD LVCMOS33 [get_ports {clk48}]
|
||||
|
||||
# clk50:0
|
||||
set_property LOC D4 [get_ports {clk50}]
|
||||
set_property IOSTANDARD LVCMOS33 [get_ports {clk50}]
|
||||
|
||||
# led
|
||||
set_property LOC R16 [get_ports {led}]
|
||||
set_property IOSTANDARD LVCMOS33 [get_ports {led}]
|
||||
|
||||
# led (n/c)
|
||||
set_property LOC T14 [get_ports {led[1]}]
|
||||
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]
|
||||
|
||||
# serial:0.tx
|
||||
set_property LOC L2 [get_ports {tx}]
|
||||
set_property IOSTANDARD LVCMOS33 [get_ports {tx}]
|
||||
|
||||
# serial:0.rx
|
||||
set_property LOC L3 [get_ports {rx}]
|
||||
set_property IOSTANDARD LVCMOS33 [get_ports {rx}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC F12 [get_ports {ddr3_addr[0]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[0]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC D15 [get_ports {ddr3_addr[1]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[1]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC J15 [get_ports {ddr3_addr[2]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[2]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC E16 [get_ports {ddr3_addr[3]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[3]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC G11 [get_ports {ddr3_addr[4]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[4]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC F15 [get_ports {ddr3_addr[5]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[5]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC H13 [get_ports {ddr3_addr[6]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[6]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC G15 [get_ports {ddr3_addr[7]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[7]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC H12 [get_ports {ddr3_addr[8]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[8]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC H16 [get_ports {ddr3_addr[9]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[9]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC H11 [get_ports {ddr3_addr[10]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[10]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC H14 [get_ports {ddr3_addr[11]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[11]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC E12 [get_ports {ddr3_addr[12]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[12]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC G16 [get_ports {ddr3_addr[13]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[13]}]
|
||||
|
||||
# ddr3:0.a
|
||||
set_property LOC J16 [get_ports {ddr3_addr[14]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_addr[14]}]
|
||||
|
||||
# ddr3:0.ba
|
||||
set_property LOC E15 [get_ports {ddr3_ba[0]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_ba[0]}]
|
||||
|
||||
# ddr3:0.ba
|
||||
set_property LOC D11 [get_ports {ddr3_ba[1]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_ba[1]}]
|
||||
|
||||
# ddr3:0.ba
|
||||
set_property LOC F13 [get_ports {ddr3_ba[2]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_ba[2]}]
|
||||
|
||||
# ddr3:0.ras_n
|
||||
set_property LOC D14 [get_ports {ddr3_ras_n}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_ras_n}]
|
||||
|
||||
# ddr3:0.cas_n
|
||||
set_property LOC E13 [get_ports {ddr3_cas_n}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_cas_n}]
|
||||
|
||||
# ddr3:0.we_n
|
||||
set_property LOC G12 [get_ports {ddr3_we_n}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_we_n}]
|
||||
|
||||
# ddr3:0.dm
|
||||
set_property LOC A13 [get_ports {ddr3_dm[0]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dm[0]}]
|
||||
|
||||
# ddr3:0.dm
|
||||
set_property LOC D9 [get_ports {ddr3_dm[1]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dm[1]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC A14 [get_ports {ddr3_dq[0]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[0]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[0]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC C12 [get_ports {ddr3_dq[1]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[1]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[1]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC B14 [get_ports {ddr3_dq[2]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[2]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[2]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC D13 [get_ports {ddr3_dq[3]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[3]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[3]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC B16 [get_ports {ddr3_dq[4]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[4]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[4]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC C11 [get_ports {ddr3_dq[5]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[5]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[5]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC C16 [get_ports {ddr3_dq[6]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[6]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[6]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC C14 [get_ports {ddr3_dq[7]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[7]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[7]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC A9 [get_ports {ddr3_dq[8]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[8]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[8]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC B10 [get_ports {ddr3_dq[9]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[9]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[9]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC C8 [get_ports {ddr3_dq[10]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[10]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[10]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC B12 [get_ports {ddr3_dq[11]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[11]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[11]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC A8 [get_ports {ddr3_dq[12]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[12]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[12]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC A12 [get_ports {ddr3_dq[13]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[13]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[13]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC C9 [get_ports {ddr3_dq[14]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[14]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[14]}]
|
||||
|
||||
# ddr3:0.dq
|
||||
set_property LOC B11 [get_ports {ddr3_dq[15]}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_dq[15]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dq[15]}]
|
||||
|
||||
# ddr3:0.dqs_p
|
||||
set_property LOC B15 [get_ports {ddr3_dqs_p[0]}]
|
||||
set_property IOSTANDARD DIFF_SSTL135 [get_ports {ddr3_dqs_p[0]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dqs_p[0]}]
|
||||
|
||||
# ddr3:0.dqs_p
|
||||
set_property LOC B9 [get_ports {ddr3_dqs_p[1]}]
|
||||
set_property IOSTANDARD DIFF_SSTL135 [get_ports {ddr3_dqs_p[1]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dqs_p[1]}]
|
||||
|
||||
# ddr3:0.dqs_n
|
||||
set_property LOC A15 [get_ports {ddr3_dqs_n[0]}]
|
||||
set_property IOSTANDARD DIFF_SSTL135 [get_ports {ddr3_dqs_n[0]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dqs_n[0]}]
|
||||
|
||||
# ddr3:0.dqs_n
|
||||
set_property LOC A10 [get_ports {ddr3_dqs_n[1]}]
|
||||
set_property IOSTANDARD DIFF_SSTL135 [get_ports {ddr3_dqs_n[1]}]
|
||||
set_property IN_TERM UNTUNED_SPLIT_60 [get_ports {ddr3_dqs_n[1]}]
|
||||
|
||||
# ddr3:0.clk_p
|
||||
set_property LOC G14 [get_ports {ddr3_clk_p}]
|
||||
set_property IOSTANDARD DIFF_SSTL135 [get_ports {ddr3_clk_p}]
|
||||
|
||||
# ddr3:0.clk_n
|
||||
set_property LOC F14 [get_ports {ddr3_clk_n}]
|
||||
set_property IOSTANDARD DIFF_SSTL135 [get_ports {ddr3_clk_n}]
|
||||
|
||||
# ddr3:0.cke
|
||||
set_property LOC E11 [get_ports {ddr3_cke}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_cke}]
|
||||
|
||||
# ddr3:0.odt
|
||||
set_property LOC D16 [get_ports {ddr3_odt}]
|
||||
set_property IOSTANDARD SSTL135 [get_ports {ddr3_odt}]
|
||||
|
||||
# ddr3:0.reset_n
|
||||
set_property LOC M16 [get_ports {ddr3_reset_n}]
|
||||
set_property IOSTANDARD LVCMOS33 [get_ports {ddr3_reset_n}]
|
||||
|
||||
################################################################################
|
||||
# Design constraints
|
||||
################################################################################
|
||||
|
||||
# set_property INTERNAL_VREF 0.675 [get_iobanks 34]
|
||||
|
||||
# set_property INTERNAL_VREF 0.675 [get_iobanks 15]
|
||||
|
||||
################################################################################
|
||||
# Clock constraints
|
||||
################################################################################
|
||||
|
||||
|
||||
# create_clock -name clk48 -period 20.833 [get_ports clk48]
|
||||
|
||||
# create_clock -name clk50 -period 20.0 [get_ports clk50]
|
||||
|
||||
# create_clock -name eth_rx_clk -period 20.0 [get_nets eth_rx_clk]
|
||||
|
||||
# create_clock -name eth_tx_clk -period 20.0 [get_nets eth_tx_clk]
|
||||
|
||||
# set_clock_groups -group [get_clocks -include_generated_clocks -of [get_nets sys_clk]] -group [get_clocks -include_generated_clocks -of [get_nets eth_rx_clk]] -asynchronous
|
||||
|
||||
# set_clock_groups -group [get_clocks -include_generated_clocks -of [get_nets sys_clk]] -group [get_clocks -include_generated_clocks -of [get_nets eth_tx_clk]] -asynchronous
|
||||
|
||||
# set_clock_groups -group [get_clocks -include_generated_clocks -of [get_nets eth_rx_clk]] -group [get_clocks -include_generated_clocks -of [get_nets eth_tx_clk]] -asynchronous
|
||||
|
||||
# ################################################################################
|
||||
# # False path constraints
|
||||
# ################################################################################
|
||||
|
||||
|
||||
# set_false_path -quiet -through [get_nets -hierarchical -filter {mr_ff == TRUE}]
|
||||
|
||||
# set_false_path -quiet -to [get_pins -filter {REF_PIN_NAME == PRE} -of_objects [get_cells -hierarchical -filter {ars_ff1 == TRUE || ars_ff2 == TRUE}]]
|
||||
|
||||
# set_max_delay 2 -quiet -from [get_pins -filter {REF_PIN_NAME == C} -of_objects [get_cells -hierarchical -filter {ars_ff1 == TRUE}]] -to [get_pins -filter {REF_PIN_NAME == D} -of_objects [get_cells -hierarchical -filter {ars_ff2 == TRUE}]]
|
||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1,207 @@
|
|||
|
||||
//
|
||||
// Module: uart_rx
|
||||
//
|
||||
// Notes:
|
||||
// - UART reciever module.
|
||||
//
|
||||
|
||||
module uart_rx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
input wire uart_rxd , // UART Recieve pin.
|
||||
input wire uart_rx_en , // Recieve enable
|
||||
output wire uart_rx_break, // Did we get a BREAK message?
|
||||
output wire uart_rx_valid, // Valid data recieved and available.
|
||||
output reg [PAYLOAD_BITS-1:0] uart_rx_data // The recieved data.
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_rxd line. Helps break long timing
|
||||
// paths from input pins into the logic.
|
||||
reg rxd_reg;
|
||||
reg rxd_reg_0;
|
||||
|
||||
//
|
||||
// Storage for the recieved serial data.
|
||||
reg [PAYLOAD_BITS-1:0] recieved_data;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of recieved bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Sample of the UART input line whenever we are in the middle of a bit frame.
|
||||
reg bit_sample;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_RECV = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Output assignment
|
||||
//
|
||||
|
||||
assign uart_rx_break = uart_rx_valid && ~|recieved_data;
|
||||
assign uart_rx_valid = fsm_state == FSM_STOP && n_fsm_state == FSM_IDLE;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if(!resetn) begin
|
||||
uart_rx_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if (fsm_state == FSM_STOP) begin
|
||||
uart_rx_data <= recieved_data;
|
||||
end
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT ||
|
||||
fsm_state == FSM_STOP &&
|
||||
cycle_counter == CYCLES_PER_BIT/2;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = rxd_reg ? FSM_IDLE : FSM_START;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_RECV : FSM_START;
|
||||
FSM_RECV : n_fsm_state = payload_done ? FSM_STOP : FSM_RECV ;
|
||||
FSM_STOP : n_fsm_state = next_bit ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the recieved data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_recieved_data
|
||||
if(!resetn) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE ) begin
|
||||
recieved_data <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit ) begin
|
||||
recieved_data[PAYLOAD_BITS-1] <= bit_sample;
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
recieved_data[i] <= recieved_data[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Increments the bit counter when recieving.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_RECV) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_RECV && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
//
|
||||
// Sample the recieved bit when in the middle of a bit frame.
|
||||
always @(posedge clk) begin : p_bit_sample
|
||||
if(!resetn) begin
|
||||
bit_sample <= 1'b0;
|
||||
end else if (cycle_counter == CYCLES_PER_BIT/2) begin
|
||||
bit_sample <= rxd_reg;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when recieving.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_RECV ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the rxd_reg.
|
||||
always @(posedge clk) begin : p_rxd_reg
|
||||
if(!resetn) begin
|
||||
rxd_reg <= 1'b1;
|
||||
rxd_reg_0 <= 1'b1;
|
||||
end else if(uart_rx_en) begin
|
||||
rxd_reg <= rxd_reg_0;
|
||||
rxd_reg_0 <= uart_rxd;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
||||
|
|
@ -0,0 +1,187 @@
|
|||
|
||||
|
||||
//
|
||||
// Module: uart_tx
|
||||
//
|
||||
// Notes:
|
||||
// - UART transmitter module.
|
||||
//
|
||||
|
||||
module uart_tx(
|
||||
input wire clk , // Top level system clock input.
|
||||
input wire resetn , // Asynchronous active low reset.
|
||||
output wire uart_txd , // UART transmit pin.
|
||||
output wire uart_tx_busy, // Module busy sending previous item.
|
||||
input wire uart_tx_en , // Send the data on uart_tx_data
|
||||
input wire [PAYLOAD_BITS-1:0] uart_tx_data // The data to be sent
|
||||
);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// External parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Input bit rate of the UART line.
|
||||
parameter BIT_RATE = 9600; // bits / sec
|
||||
localparam BIT_P = 1_000_000_000 * 1/BIT_RATE; // nanoseconds
|
||||
|
||||
//
|
||||
// Clock frequency in hertz.
|
||||
parameter CLK_HZ = 50_000_000;
|
||||
localparam CLK_P = 1_000_000_000 * 1/CLK_HZ; // nanoseconds
|
||||
|
||||
//
|
||||
// Number of data bits recieved per UART packet.
|
||||
parameter PAYLOAD_BITS = 8;
|
||||
|
||||
//
|
||||
// Number of stop bits indicating the end of a packet.
|
||||
parameter STOP_BITS = 1;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal parameters.
|
||||
//
|
||||
|
||||
//
|
||||
// Number of clock cycles per uart bit.
|
||||
localparam CYCLES_PER_BIT = BIT_P / CLK_P;
|
||||
|
||||
//
|
||||
// Size of the registers which store sample counts and bit durations.
|
||||
localparam COUNT_REG_LEN = 1+$clog2(CYCLES_PER_BIT);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal registers.
|
||||
//
|
||||
|
||||
//
|
||||
// Internally latched value of the uart_txd line. Helps break long timing
|
||||
// paths from the logic to the output pins.
|
||||
reg txd_reg;
|
||||
|
||||
//
|
||||
// Storage for the serial data to be sent.
|
||||
reg [PAYLOAD_BITS-1:0] data_to_send;
|
||||
|
||||
//
|
||||
// Counter for the number of cycles over a packet bit.
|
||||
reg [COUNT_REG_LEN-1:0] cycle_counter;
|
||||
|
||||
//
|
||||
// Counter for the number of sent bits of the packet.
|
||||
reg [3:0] bit_counter;
|
||||
|
||||
//
|
||||
// Current and next states of the internal FSM.
|
||||
reg [2:0] fsm_state;
|
||||
reg [2:0] n_fsm_state;
|
||||
|
||||
localparam FSM_IDLE = 0;
|
||||
localparam FSM_START= 1;
|
||||
localparam FSM_SEND = 2;
|
||||
localparam FSM_STOP = 3;
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// FSM next state selection.
|
||||
//
|
||||
|
||||
assign uart_tx_busy = fsm_state != FSM_IDLE;
|
||||
assign uart_txd = txd_reg;
|
||||
|
||||
wire next_bit = cycle_counter == CYCLES_PER_BIT;
|
||||
wire payload_done = bit_counter == PAYLOAD_BITS ;
|
||||
wire stop_done = bit_counter == STOP_BITS && fsm_state == FSM_STOP;
|
||||
|
||||
//
|
||||
// Handle picking the next state.
|
||||
always @(*) begin : p_n_fsm_state
|
||||
case(fsm_state)
|
||||
FSM_IDLE : n_fsm_state = uart_tx_en ? FSM_START: FSM_IDLE ;
|
||||
FSM_START: n_fsm_state = next_bit ? FSM_SEND : FSM_START;
|
||||
FSM_SEND : n_fsm_state = payload_done ? FSM_STOP : FSM_SEND ;
|
||||
FSM_STOP : n_fsm_state = stop_done ? FSM_IDLE : FSM_STOP ;
|
||||
default : n_fsm_state = FSM_IDLE;
|
||||
endcase
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Internal register setting and re-setting.
|
||||
//
|
||||
|
||||
//
|
||||
// Handle updates to the sent data register.
|
||||
integer i = 0;
|
||||
always @(posedge clk) begin : p_data_to_send
|
||||
if(!resetn) begin
|
||||
data_to_send <= {PAYLOAD_BITS{1'b0}};
|
||||
end else if(fsm_state == FSM_IDLE && uart_tx_en) begin
|
||||
data_to_send <= uart_tx_data;
|
||||
end else if(fsm_state == FSM_SEND && next_bit ) begin
|
||||
for ( i = PAYLOAD_BITS-2; i >= 0; i = i - 1) begin
|
||||
data_to_send[i] <= data_to_send[i+1];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the bit counter each time a new bit frame is sent.
|
||||
always @(posedge clk) begin : p_bit_counter
|
||||
if(!resetn) begin
|
||||
bit_counter <= 4'b0;
|
||||
end else if(fsm_state != FSM_SEND && fsm_state != FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_SEND && n_fsm_state == FSM_STOP) begin
|
||||
bit_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_STOP&& next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end else if(fsm_state == FSM_SEND && next_bit) begin
|
||||
bit_counter <= bit_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Increments the cycle counter when sending.
|
||||
always @(posedge clk) begin : p_cycle_counter
|
||||
if(!resetn) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(next_bit) begin
|
||||
cycle_counter <= {COUNT_REG_LEN{1'b0}};
|
||||
end else if(fsm_state == FSM_START ||
|
||||
fsm_state == FSM_SEND ||
|
||||
fsm_state == FSM_STOP ) begin
|
||||
cycle_counter <= cycle_counter + 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Progresses the next FSM state.
|
||||
always @(posedge clk) begin : p_fsm_state
|
||||
if(!resetn) begin
|
||||
fsm_state <= FSM_IDLE;
|
||||
end else begin
|
||||
fsm_state <= n_fsm_state;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//
|
||||
// Responsible for updating the internal value of the txd_reg.
|
||||
always @(posedge clk) begin : p_txd_reg
|
||||
if(!resetn) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_IDLE) begin
|
||||
txd_reg <= 1'b1;
|
||||
end else if(fsm_state == FSM_START) begin
|
||||
txd_reg <= 1'b0;
|
||||
end else if(fsm_state == FSM_SEND) begin
|
||||
txd_reg <= data_to_send[0];
|
||||
end else if(fsm_state == FSM_STOP) begin
|
||||
txd_reg <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
240
rtl/ddr3_phy.v
240
rtl/ddr3_phy.v
|
|
@ -41,6 +41,7 @@ module ddr3_phy #(
|
|||
LANES = 8,
|
||||
parameter[0:0] ODELAY_SUPPORTED = 1, //set to 1 when ODELAYE2 is supported
|
||||
USE_IO_TERMINATION = 0, //use IOBUF_DCIEN and IOBUFDS_DCIEN when 1
|
||||
NO_IOSERDES_LOOPBACK = 1, // don't use IOSERDES loopback for bitslip training
|
||||
// The next parameters act more like a localparam (since user does not have to set this manually) but was added here to simplify port declaration
|
||||
parameter serdes_ratio = 4, // this controller is fixed as a 4:1 memory controller (CONTROLLER_CLK_PERIOD/DDR3_CLK_PERIOD = 4)
|
||||
wb_data_bits = DQ_BITS*LANES*serdes_ratio*2,
|
||||
|
|
@ -138,7 +139,15 @@ module ddr3_phy #(
|
|||
wire ddr3_clk_delayed;
|
||||
wire idelayctrl_rdy;
|
||||
wire dci_locked;
|
||||
reg[LANES*8-1:0] o_controller_iserdes_bitslip_reference_reg;
|
||||
reg[LANES - 1 : 0] shift_bitslip_index;
|
||||
|
||||
// initial value of bitslip reference
|
||||
initial begin
|
||||
o_controller_iserdes_bitslip_reference_reg = {LANES{8'b0001_1110}};
|
||||
shift_bitslip_index = 0;
|
||||
end
|
||||
|
||||
assign o_controller_idelayctrl_rdy = idelayctrl_rdy && dci_locked;
|
||||
|
||||
`ifdef DEBUG_DQS
|
||||
|
|
@ -971,6 +980,7 @@ module ddr3_phy #(
|
|||
);
|
||||
// End of IDELAYE2_inst instantiation
|
||||
|
||||
|
||||
// End of IOBUF_inst instantiation
|
||||
// ISERDESE2: Input SERial/DESerializer with bitslip
|
||||
//7 Series
|
||||
|
|
@ -1038,75 +1048,97 @@ module ddr3_phy #(
|
|||
);
|
||||
// End of ISERDESE2_inst instantiation
|
||||
`endif
|
||||
|
||||
//ISERDES train
|
||||
// End of IOBUF_inst instantiation
|
||||
// ISERDESE2: Input SERial/DESerializer with bitslip
|
||||
//7 Series
|
||||
// Xilinx HDL Libraries Guide, version 13.4
|
||||
ISERDESE2 #(
|
||||
.DATA_RATE("DDR"), // DDR, SDR
|
||||
.DATA_WIDTH(serdes_ratio*2), // Parallel data width (2-8,10,14)
|
||||
// INIT_Q1 - INIT_Q4: Initial value on the Q outputs (0/1)
|
||||
.INIT_Q1(1'b0),
|
||||
.INIT_Q2(1'b0),
|
||||
.INIT_Q3(1'b0),
|
||||
.INIT_Q4(1'b0),
|
||||
.INTERFACE_TYPE("NETWORKING"), // MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
|
||||
.IOBDELAY("NONE"), // NONE, BOTH, IBUF, IFD
|
||||
.NUM_CE(1),// Number of clock enables (1,2)
|
||||
.OFB_USED("TRUE"), // Select OFB path (FALSE, TRUE)
|
||||
// SRVAL_Q1 - SRVAL_Q4: Q output values when SR is used (0/1)
|
||||
.SRVAL_Q1(1'b0),
|
||||
.SRVAL_Q2(1'b0),
|
||||
.SRVAL_Q3(1'b0),
|
||||
.SRVAL_Q4(1'b0)
|
||||
)
|
||||
ISERDESE2_train (
|
||||
.O(),
|
||||
// 1-bit output: Combinatorial output
|
||||
// Q1 - Q8: 1-bit (each) output: Registered data outputs
|
||||
.Q1(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 7]),
|
||||
.Q2(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 6]),
|
||||
.Q3(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 5]),
|
||||
.Q4(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 4]),
|
||||
.Q5(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 3]),
|
||||
.Q6(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 2]),
|
||||
.Q7(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 1]),
|
||||
.Q8(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 0]),
|
||||
// SHIFTOUT1-SHIFTOUT2: 1-bit (each) output: Data width expansion output ports
|
||||
.SHIFTOUT1(),
|
||||
.SHIFTOUT2(),
|
||||
.BITSLIP(i_controller_bitslip[gen_index]),
|
||||
// 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to
|
||||
// CLKDIV when asserted (active High). Subsequently, the data seen on the Q1
|
||||
// to Q8 output ports will shift, as in a barrel-shifter operation, one
|
||||
// position every time Bitslip is invoked (DDR operation is different from
|
||||
// SDR).
|
||||
// CE1, CE2: 1-bit (each) input: Data register clock enable inputs
|
||||
.CE1(1'b1),
|
||||
.CE2(1'b1),
|
||||
.CLKDIVP(), // 1-bit input: TBD
|
||||
// Clocks: 1-bit (each) input: ISERDESE2 clock input ports
|
||||
.CLK(i_ddr3_clk), // 1-bit input: High-speed clock
|
||||
.CLKB(!i_ddr3_clk), // 1-bit input: High-speed secondary clock
|
||||
.CLKDIV(i_controller_clk), // 1-bit input: Divided clock
|
||||
.OCLK(), // 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY"
|
||||
// Dynamic Clock Inversions: 1-bit (each) input: Dynamic clock inversion pins to switch clock polarity
|
||||
.DYNCLKDIVSEL(), // 1-bit input: Dynamic CLKDIV inversion
|
||||
.DYNCLKSEL(), // 1-bit input: Dynamic CLK/CLKB inversion
|
||||
// Input Data: 1-bit (each) input: ISERDESE2 data input ports
|
||||
.D(), // 1-bit input: Data input
|
||||
.DDLY(), // 1-bit input: Serial data from IDELAYE2
|
||||
.OFB(oserdes_bitslip_reference[gen_index]), // 1-bit input: Data feedback from OSERDESE2
|
||||
.OCLKB(), // 1-bit input: High speed negative edge output clock
|
||||
.RST(sync_rst), // 1-bit input: Active high asynchronous reset
|
||||
// SHIFTIN1-SHIFTIN2: 1-bit (each) input: Data width expansion input ports
|
||||
.SHIFTIN1(),
|
||||
.SHIFTIN2()
|
||||
);
|
||||
// End of ISERDESE2_inst instantiation
|
||||
|
||||
// generate IOSERDES loopback or not for bitslip training
|
||||
if(NO_IOSERDES_LOOPBACK) begin
|
||||
// logic that models OSERDES loopback to ISERDES
|
||||
// accdg to IOSELECT (UG471) for 7-series:
|
||||
// " In DDR mode, every Bitslip operation causes the output pattern to alternate between
|
||||
// a shift right by one and shift left by three"
|
||||
always @(posedge i_controller_clk) begin
|
||||
if(!i_rst_n || i_controller_reset) begin
|
||||
o_controller_iserdes_bitslip_reference_reg[(serdes_ratio*2*gen_index + 7) : (serdes_ratio*2*gen_index + 0)] <= 8'b0001_1110;
|
||||
shift_bitslip_index[gen_index] <= 0;
|
||||
end
|
||||
else if(i_controller_bitslip[gen_index]) begin
|
||||
// if shift_bitslip_index high, shift right by 3, else shift left by 1 (this is reverse of the IOSelect document for ISERDES since vector o_controller_iserdes_bitslip_reference is reversed)
|
||||
o_controller_iserdes_bitslip_reference_reg[(serdes_ratio*2*gen_index + 7) : (serdes_ratio*2*gen_index + 0)] <=
|
||||
shift_bitslip_index[gen_index]? {o_controller_iserdes_bitslip_reference_reg[(serdes_ratio*2*gen_index + 2) : (serdes_ratio*2*gen_index + 0)], o_controller_iserdes_bitslip_reference_reg[(serdes_ratio*2*gen_index + 7) : (serdes_ratio*2*gen_index + 3)]}
|
||||
: {o_controller_iserdes_bitslip_reference_reg[(serdes_ratio*2*gen_index + 6) : (serdes_ratio*2*gen_index + 0)], o_controller_iserdes_bitslip_reference_reg[(serdes_ratio*2*gen_index + 7)]};
|
||||
shift_bitslip_index[gen_index] <= !shift_bitslip_index[gen_index];
|
||||
end
|
||||
end
|
||||
assign o_controller_iserdes_bitslip_reference = o_controller_iserdes_bitslip_reference_reg;
|
||||
end
|
||||
else begin // OSERDES will loopback to ISERDES for bitslip training
|
||||
//ISERDES train
|
||||
// End of IOBUF_inst instantiation
|
||||
// ISERDESE2: Input SERial/DESerializer with bitslip
|
||||
//7 Series
|
||||
// Xilinx HDL Libraries Guide, version 13.4
|
||||
ISERDESE2 #(
|
||||
.DATA_RATE("DDR"), // DDR, SDR
|
||||
.DATA_WIDTH(serdes_ratio*2), // Parallel data width (2-8,10,14)
|
||||
// INIT_Q1 - INIT_Q4: Initial value on the Q outputs (0/1)
|
||||
.INIT_Q1(1'b0),
|
||||
.INIT_Q2(1'b0),
|
||||
.INIT_Q3(1'b0),
|
||||
.INIT_Q4(1'b0),
|
||||
.INTERFACE_TYPE("NETWORKING"), // MEMORY, MEMORY_DDR3, MEMORY_QDR, NETWORKING, OVERSAMPLE
|
||||
.IOBDELAY("NONE"), // NONE, BOTH, IBUF, IFD
|
||||
.NUM_CE(1),// Number of clock enables (1,2)
|
||||
.OFB_USED("TRUE"), // Select OFB path (FALSE, TRUE)
|
||||
// SRVAL_Q1 - SRVAL_Q4: Q output values when SR is used (0/1)
|
||||
.SRVAL_Q1(1'b0),
|
||||
.SRVAL_Q2(1'b0),
|
||||
.SRVAL_Q3(1'b0),
|
||||
.SRVAL_Q4(1'b0)
|
||||
)
|
||||
ISERDESE2_train (
|
||||
.O(),
|
||||
// 1-bit output: Combinatorial output
|
||||
// Q1 - Q8: 1-bit (each) output: Registered data outputs
|
||||
.Q1(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 7]),
|
||||
.Q2(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 6]),
|
||||
.Q3(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 5]),
|
||||
.Q4(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 4]),
|
||||
.Q5(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 3]),
|
||||
.Q6(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 2]),
|
||||
.Q7(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 1]),
|
||||
.Q8(o_controller_iserdes_bitslip_reference[gen_index*serdes_ratio*2 + 0]),
|
||||
// SHIFTOUT1-SHIFTOUT2: 1-bit (each) output: Data width expansion output ports
|
||||
.SHIFTOUT1(),
|
||||
.SHIFTOUT2(),
|
||||
.BITSLIP(i_controller_bitslip[gen_index]),
|
||||
// 1-bit input: The BITSLIP pin performs a Bitslip operation synchronous to
|
||||
// CLKDIV when asserted (active High). Subsequently, the data seen on the Q1
|
||||
// to Q8 output ports will shift, as in a barrel-shifter operation, one
|
||||
// position every time Bitslip is invoked (DDR operation is different from
|
||||
// SDR).
|
||||
// CE1, CE2: 1-bit (each) input: Data register clock enable inputs
|
||||
.CE1(1'b1),
|
||||
.CE2(1'b1),
|
||||
.CLKDIVP(), // 1-bit input: TBD
|
||||
// Clocks: 1-bit (each) input: ISERDESE2 clock input ports
|
||||
.CLK(i_ddr3_clk), // 1-bit input: High-speed clock
|
||||
.CLKB(!i_ddr3_clk), // 1-bit input: High-speed secondary clock
|
||||
.CLKDIV(i_controller_clk), // 1-bit input: Divided clock
|
||||
.OCLK(), // 1-bit input: High speed output clock used when INTERFACE_TYPE="MEMORY"
|
||||
// Dynamic Clock Inversions: 1-bit (each) input: Dynamic clock inversion pins to switch clock polarity
|
||||
.DYNCLKDIVSEL(), // 1-bit input: Dynamic CLKDIV inversion
|
||||
.DYNCLKSEL(), // 1-bit input: Dynamic CLK/CLKB inversion
|
||||
// Input Data: 1-bit (each) input: ISERDESE2 data input ports
|
||||
.D(), // 1-bit input: Data input
|
||||
.DDLY(), // 1-bit input: Serial data from IDELAYE2
|
||||
.OFB(oserdes_bitslip_reference[gen_index]), // 1-bit input: Data feedback from OSERDESE2
|
||||
.OCLKB(), // 1-bit input: High speed negative edge output clock
|
||||
.RST(sync_rst), // 1-bit input: Active high asynchronous reset
|
||||
// SHIFTIN1-SHIFTIN2: 1-bit (each) input: Data width expansion input ports
|
||||
.SHIFTIN1(),
|
||||
.SHIFTIN2()
|
||||
);
|
||||
// End of ISERDESE2_inst instantiation
|
||||
|
||||
// OSERDESE2: Output SERial/DESerializer with bitslip
|
||||
//7 Series
|
||||
// Xilinx HDL Libraries Guide, version 13.4
|
||||
|
|
@ -1153,67 +1185,12 @@ module ddr3_phy #(
|
|||
// 1-bit input: 3-state clock enable
|
||||
);
|
||||
// End of OSERDESE2_inst instantiation
|
||||
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
endgenerate
|
||||
|
||||
/*
|
||||
// OSERDESE2: Output SERial/DESerializer with bitslip
|
||||
//7 Series
|
||||
// Xilinx HDL Libraries Guide, version 13.4
|
||||
OSERDESE2 #(
|
||||
.DATA_RATE_OQ("DDR"), // DDR, SDR
|
||||
.DATA_WIDTH(8), // Parallel data width (2-8,10,14)
|
||||
.INIT_OQ(1'b1) // Initial value of OQ output (1'b0,1'b1)
|
||||
)
|
||||
OSERDESE2_train(
|
||||
.OFB(test_OFB), // 1-bit output: Feedback path for data
|
||||
.OQ(), // 1-bit output: Data path output
|
||||
.CLK(i_ddr3_clk), // 1-bit input: High speed clock
|
||||
.CLKDIV(i_controller_clk), // 1-bit input: Divided clock
|
||||
// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
|
||||
.D1(1'b0),
|
||||
.D2(1'b0),
|
||||
.D3(1'b0),
|
||||
.D4(1'b0),
|
||||
.D5(1'b1),
|
||||
.D6(1'b1),
|
||||
.D7(1'b1),
|
||||
.D8(1'b1),
|
||||
.OCE(1'b1), // 1-bit input: Output data clock enable
|
||||
.RST(sync_rst) // 1-bit input: Reset
|
||||
);
|
||||
// End of OSERDESE2_inst instantiation
|
||||
*/
|
||||
/*
|
||||
// OSERDESE2: Output SERial/DESerializer with bitslip
|
||||
//7 Series
|
||||
// Xilinx HDL Libraries Guide, version 13.4
|
||||
OSERDESE2 #(
|
||||
.DATA_RATE_OQ("DDR"), // DDR, SDR
|
||||
.DATA_WIDTH(8), // Parallel data width (2-8,10,14)
|
||||
.INIT_OQ(1'b1) // Initial value of OQ output (1'b0,1'b1)
|
||||
)
|
||||
OSERDESE2_dqs(
|
||||
.OFB(oserdes_dqs), // 1-bit output: Feedback path for data
|
||||
.OQ(), // 1-bit output: Data path output
|
||||
.CLK(i_ddr3_clk), // 1-bit input: High speed clock
|
||||
.CLKDIV(i_controller_clk), // 1-bit input: Divided clock
|
||||
// D1 - D8: 1-bit (each) input: Parallel data inputs (1-bit each)
|
||||
.D1(1'b1 && i_controller_toggle_dqs),
|
||||
.D2(1'b0 && i_controller_toggle_dqs),
|
||||
.D3(1'b1 && i_controller_toggle_dqs),
|
||||
.D4(1'b0 && i_controller_toggle_dqs),
|
||||
.D5(1'b1 && i_controller_toggle_dqs),
|
||||
.D6(1'b0 && i_controller_toggle_dqs),
|
||||
.D7(1'b1 && i_controller_toggle_dqs),
|
||||
.D8(1'b0 && i_controller_toggle_dqs),
|
||||
.OCE(1'b1), // 1-bit input: Output data clock enable
|
||||
.RST(sync_rst) // 1-bit input: Reset
|
||||
);
|
||||
// End of OSERDESE2_inst instantiation
|
||||
*/
|
||||
|
||||
// IDELAYCTRL: IDELAYE2/ODELAYE2 Tap Delay Value Control
|
||||
// 7 Series
|
||||
// Xilinx HDL Libraries Guide, version 13.4
|
||||
|
|
@ -1228,10 +1205,11 @@ module ddr3_phy #(
|
|||
// DCIRESET: Digitially Controlled Impedence Reset Component
|
||||
//7 Series
|
||||
// Xilinx HDL Libraries Guide, version 13.4
|
||||
DCIRESET DCIRESET_inst (
|
||||
.LOCKED(dci_locked), // 1-bit output: LOCK status output (When low, DCI I/O impedance is being calibrated and DCI I/Os are unavailable)
|
||||
.RST(sync_rst) // 1-bit input: Active-high asynchronous reset input
|
||||
);
|
||||
// DCIRESET DCIRESET_inst (
|
||||
// .LOCKED(dci_locked), // 1-bit output: LOCK status output (When low, DCI I/O impedance is being calibrated and DCI I/Os are unavailable)
|
||||
// .RST(sync_rst) // 1-bit input: Active-high asynchronous reset input
|
||||
// );
|
||||
assign dci_locked = 1;
|
||||
// End of DCIRESET_inst instantiation
|
||||
|
||||
endmodule
|
||||
endmodule
|
||||
|
|
|
|||
Loading…
Reference in New Issue