Skip to content

Adding support for Qmtech Kintex-7 dev board. - #1601

Open
juanschroeder wants to merge 6 commits into
openhwgroup:mainfrom
juanschroeder:add_qmtechK7_dev_board_support
Open

Adding support for Qmtech Kintex-7 dev board.#1601
juanschroeder wants to merge 6 commits into
openhwgroup:mainfrom
juanschroeder:add_qmtechK7_dev_board_support

Conversation

@juanschroeder

Copy link
Copy Markdown
Contributor

MIG .prj file was generated in Vivado.
Digilent SD card Pmod is assumed in J13.
Running at 40 MHz (not fully meeting constraints
but boots without issues).

Board: http://www.aliexpress.com/item/1005006765717166.html

@juanschroeder
juanschroeder force-pushed the add_qmtechK7_dev_board_support branch 3 times, most recently from f020e99 to 3ebde03 Compare January 5, 2026 11:19
@davidharrishmc
davidharrishmc requested a review from Copilot May 20, 2026 11:09

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new FPGA/Linux configuration target to run the Wally SoC on the Qmtech Kintex-7 (xc7k325t) development board, including Vivado IP generation and board-specific constraints/device-tree.

Changes:

  • Introduces a new fpgaTopQmtechk7 top-level and Vivado generator targets/scripts for qmtechk7 (MMCM + DDR3 MIG).
  • Adds a Qmtech-specific XDC constraints file and Linux device tree for booting at 40 MHz with 256 MB DDR3.
  • Extends the config derivation list to include fpgaqmtechk7.

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
linux/devicetree/wally-qmtechk7.dts New device tree describing the qmtechk7 memory map and peripherals at 40 MHz.
fpga/src/fpgaTopQmtechk7.sv New FPGA top-level integrating Wally SoC + DDR3 MIG + clocking for qmtechk7.
fpga/generator/xlnx_ddr3-qmtechk7-mig.prj MIG project settings for the qmtechk7 DDR3 configuration.
fpga/generator/wally.tcl Adds qmtechk7 selection for top + constraints + DDR3/MMCM IP import.
fpga/generator/sysrst.tcl Skips board_part assignment for non-Xilinx qmtechk7 board identifier.
fpga/generator/mmcm-qmtechk7.tcl New MMCM IP configuration for 50 MHz input and required output clocks.
fpga/generator/Makefile Adds qmtechk7 make targets for IP generation and FPGA build flow.
fpga/generator/ddr3-qmtechk7.tcl New DDR3 MIG IP generation script using the qmtechk7 MIG .prj.
fpga/generator/clkconverter.tcl Skips board_part assignment for qmtechk7.
fpga/generator/ahbaxibridge.tcl Skips board_part assignment for qmtechk7.
fpga/constraints/constraints-qmtechk7.xdc New board constraints for clocks, IO pinout, SD, UART, DDR3.
config/derivlist.txt Adds fpgaqmtechk7 derivation entry and external memory range.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

set_property IOSTANDARD LVCMOS33 [get_ports default_50mhz_clk]

# Clocks and Resets (adjust to match board)
set_property IOSTANDARD LVCMOS33 [get_ports default_200mhz_clk]
Comment on lines +18 to +20
create_clock -period 5.000 -name sys_clk [get_ports sys_clk_i]
create_clock -period 5.000 -name idelay_refclk [get_ports clk_ref_i]
#create_clock -period 5.000 -name mig_clk_200m [get_ports sys_clk_i]
create_clock -period 5.000 -name idelay_refclk [get_ports clk_ref_i]
#create_clock -period 5.000 -name mig_clk_200m [get_ports sys_clk_i]

set_property CLOCK_BUFFER_TYPE BUFG [get_nets wallypipelinedsoc/clk_out3_mmcm]
Comment on lines +127 to +142
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[15]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[16]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[17]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[18]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[19]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[20]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[21]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[22]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[23]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[24]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[25]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[26]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[27]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[28]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[29]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dq[30]}]
Comment on lines +146 to +148
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[2]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_dm[3]}]
set_property IOSTANDARD SSTL15 [get_ports {ddr3_addr[14]}]

set_property PACKAGE_PIN AF3 [get_ports ddr3_odt[0]]
set_property PACKAGE_PIN AC3 [get_ports ddr3_ras_n]
set_property W4 [get_ports ddr3_reset_n]
Comment on lines +213 to +219
assign GPIOIN = {25'b0, SDCCD, SDCWP, 1'b0, GPI};
assign ahblite_resetn = peripheral_aresetn;
assign cpu_reset = bus_struct_reset;
assign calib = c0_init_calib_complete;

logic [3:0] SDCCSin;
assign SDCCS = SDCCSin[0];
Comment on lines +428 to +434
.ddr3_reset_n(ddr3_reset_n),
.ddr3_ck_p(ddr3_ck_p),
.ddr3_ck_n(ddr3_ck_n),
.ddr3_cke(ddr3_cke),
// ddr3_cs_n: always pulled down in this board?
.ddr3_dm(ddr3_dm),
.ddr3_odt(ddr3_odt),
@@ -0,0 +1,154 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
@davidharrishmc

Copy link
Copy Markdown
Contributor

@juanschroeder would you be able to review the Copilot feedback above and click resolve conversation on each item when you are satisfied it is either fixed or irrelevant?

I don't have the FPGA expertise to review this well and Rose is not very active reviewing right now, but this is valuable work worth incorporating, so I will merge it when you have resolved the copilot feedback.

@juanschroeder

Copy link
Copy Markdown
Contributor Author

Hi @davidharrishmc , yes, I will look into this after I finish the Nexys A7 one.

@rosethompson

Copy link
Copy Markdown
Contributor

@juanschroeder I would be happy to merge this PR once the merge conflicts are resolved. We've merged the Nexys A7 PR.

MIG .prj file was generated in Vivado.
Digilent SD card Pmod is assumed in J13.
Running at 40 MHz (not fully meeting  constraints
but boots without issues).

Board: http://www.aliexpress.com/item/1005006765717166.html
Plus some necessary commit hook cleanup (tabs).

Signed-off-by: Juan Schroeder <jcschroeder@gmail.com>
Removed some critical warnings and warnings related to .xdc file.
Added CDC for async calibration signal.
Fixed other stuff in .xdc and top file.

Signed-off-by: Juan Schroeder <jcschroeder@gmail.com>
The 40 MHz frequency target is not realistic with this
grade -1 FPGA.
Left commented an extra optimization that normally makes
the timing requirements to be met.

Fixed tabs in DTS that are not accepted.

Signed-off-by: Juan Schroeder <jcschroeder@gmail.com>
@juanschroeder
juanschroeder force-pushed the add_qmtechK7_dev_board_support branch from 3ebde03 to b3520e0 Compare July 16, 2026 12:42
@juanschroeder

Copy link
Copy Markdown
Contributor Author

Hi @rosethompson, I've rebased this on a recent 'main' branch, applied Copilot suggestions, some fixes to eliminate critical warnings and warnings in the .xdc file and reduced the ambitious target clock frequency to 32 MHz. I've tested the updates in Buildroot and it seems to work.

Regarding the clock frequency, even if this FPGA is very similar to the one in Genesys 2, the speed grade is 'slower', and somehow for the same design there's way more routing congestion in the critical path area. The build without any extra optimization is 'close' to meet timing requirements and with the extra commented code in wally.tcl it would normally meet the timing requirements (build takes a bit longer).

Just some extra comments on this board:

  • serial RX/TX pins are in the J3 50-pin connector
  • Digilent micro SD card PMOD should be connected to 'J13' PMOD connector
  • JTAG programming is done with the JTAG connector in the middle of the board.
  • For programming and ILA within Vivado I've used an FT232H programmer like this one and xvcd tool running in the background (communication is a bit slow). In my Vivado versions I have issues with 'cs_server' and 'hw_server' and normally I need to disable the first one and often start manually the second one.
  • Bear in mind that (as far as I know) all the 'peripherals' in this Qmtech board are only accessible from the RPi compute module, which is a waste for pure FPGA development. Only the PMODs and the 50-pin connector are useful for connecting other hardware.

Signed-off-by: Juan Schroeder <jcschroeder@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants