610 lines
24 KiB
Markdown
610 lines
24 KiB
Markdown
---
|
|
name: vivado-prj-create
|
|
description: 'DIRECT EXECUTION - Auto-create Vivado FPGA projects. Triggers: "create Vivado project", "Vivado工程", "FPGA project", "Xilinx project", "setup Vivado". When triggered, IMMEDIATELY execute Step 0 without listing skills or asking for confirmation.'
|
|
---
|
|
|
|
# Vivado Project TCL Generator
|
|
|
|
## AI ASSISTANT BEHAVIOR RULES (CRITICAL)
|
|
|
|
**When this skill is triggered, you MUST:**
|
|
1. **DO NOT** list available skills
|
|
2. **DO NOT** ask user "which skill do you want?"
|
|
3. **DO NOT** ask for confirmation before proceeding
|
|
4. **IMMEDIATELY** start with **Step 0: Check Vivado installation**
|
|
5. Follow the complete workflow without interruption
|
|
|
|
**Trigger Keywords:** "创建Vivado工程", "create Vivado project", "FPGA工程", "setup FPGA project", "Xilinx project", "Vivado TCL"
|
|
|
|
This skill helps you generate TCL scripts for automatically creating Xilinx Vivado FPGA projects on Windows. The generated TCL script can be sourced directly in Vivado to create a complete project with proper device configuration.
|
|
|
|
## How it works
|
|
|
|
1. **Check Vivado installation (Step 0)**
|
|
2. **Collect required information via interactive questions**
|
|
3. Generate a complete TCL script
|
|
4. Save the script to a file
|
|
5. Provide instructions for running it
|
|
|
|
## IMPORTANT: Vivado Installation Check (Step 0 - REQUIRED)
|
|
|
|
**Before asking any questions, you MUST first check if Vivado is installed at the default location.**
|
|
|
|
Use the Bash tool to check if the default Vivado installation path exists:
|
|
|
|
```bash
|
|
test -d "d:/Xilinx/Vivado/2018.1/bin" && echo "EXISTS" || echo "NOT_FOUND"
|
|
```
|
|
|
|
- If the result is `EXISTS`: Proceed to Step 1 (interactive questions)
|
|
- If the result is `NOT_FOUND`: **Stop and report error to the user:**
|
|
|
|
```
|
|
错误 / Error: Vivado 没有正确安装!
|
|
|
|
请确认 Vivado 已安装在默认路径: d:\Xilinx\Vivado\2018.1\bin\
|
|
|
|
Please ensure Vivado is installed at: d:\Xilinx\Vivado\2018.1\bin\
|
|
```
|
|
|
|
## IMPORTANT: Interactive Question Requirements
|
|
|
|
**After Vivado installation is confirmed, use the `AskUserQuestion` tool to collect the following required information.**
|
|
|
|
### Step 1: Ask for FPGA Device/Part Number (REQUIRED)
|
|
|
|
Use `AskUserQuestion` to let the user select their target FPGA device. Only these four devices are supported:
|
|
|
|
```javascript
|
|
AskUserQuestion({
|
|
questions: [{
|
|
question: "请选择你的FPGA器件型号 / Select your target FPGA device:",
|
|
header: "FPGA Device",
|
|
options: [
|
|
{ label: "xc7z100ffg900-2", description: "Zynq-7000, 用于3.0激励器 / 3.0 Exciter" },
|
|
{ label: "xc7z035ffg676-2", description: "Zynq-7000, 用于ipots" },
|
|
{ label: "xc7a200tfbg676-2", description: "Artix-7, EMV7.1 / SMOD 激励器" },
|
|
{ label: "xc7z020cfg400-2", description: "Zynq-7000, 用于RFSwitch" }
|
|
],
|
|
multiSelect: false
|
|
}]
|
|
})
|
|
```
|
|
|
|
**Note:** If you need other FPGA models, you must modify this skill file to add them.
|
|
|
|
### Step 2: Ask for Project Name
|
|
|
|
Ask the user for the project name. This can be done with a simple text prompt (no AskUserQuestion needed unless you want to provide preset options):
|
|
|
|
**Example prompts:**
|
|
- "请输入项目名称 / What would you like to name your project?"
|
|
- "项目名称 / Enter the project name"
|
|
|
|
## Zynq PS Configuration
|
|
|
|
**IMPORTANT**: Determine if the selected device is a Zynq series (device starts with `xc7z`).
|
|
|
|
- **Zynq devices** (xc7z100ffg900-2, xc7z035ffg676-2, xc7z020cfg400-2): **MUST** configure the Processing System (PS)
|
|
- **Artix-7 devices** (xc7a200tfbg676-2): No PS configuration needed
|
|
|
|
### Zynq Device PS Configurations
|
|
|
|
For Zynq devices, use the corresponding PS configuration from the reference TCL files in this skill directory:
|
|
|
|
| Device | Reference File | DDR Freq | FPGA0 Freq |
|
|
|--------|---------------|----------|------------|
|
|
| xc7z100ffg900-2 | emv9_atsc3_bd.tcl | 533.33 MHz | 250 MHz |
|
|
| xc7z035ffg676-2 | ipots_bd.tcl | 266.67 MHz | 50 MHz |
|
|
| xc7z020cfg400-2 | RF_switch_bd.tcl | 266.67 MHz | 50 MHz |
|
|
|
|
### PS Configuration Template for Zynq Devices
|
|
|
|
For Zynq devices, add the following Block Design creation with PS configuration to the TCL script:
|
|
|
|
```tcl
|
|
# =============================================================================
|
|
# Create Block Design with Zynq PS Configuration
|
|
# =============================================================================
|
|
|
|
# Create Block Design
|
|
set design_name "design_1"
|
|
create_bd_design $design_name
|
|
|
|
# Create Processing System instance
|
|
set processing_system7_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 ]
|
|
|
|
# Apply PS configuration based on device type
|
|
# {{PS_CONFIG_PROPERTIES}}
|
|
|
|
# Create interface ports
|
|
set DDR [ create_bd_intf_port -mode Master -vlnv xilinx.com:interface:ddrx_rtl:1.0 DDR ]
|
|
set FIXED_IO [ create_bd_intf_port -mode Master -vlnv xilinx.com:display_processing_system7:fixedio_rtl:1.0 FIXED_IO ]
|
|
|
|
# Connect interfaces
|
|
connect_bd_intf_net [get_bd_intf_pins processing_system7_0/DDR] [get_bd_intf_ports DDR]
|
|
connect_bd_intf_net [get_bd_intf_pins processing_system7_0/FIXED_IO] [get_bd_intf_ports FIXED_IO]
|
|
|
|
# Create and connect reset
|
|
set rst_ps7_0_50M [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 rst_ps7_0_50M ]
|
|
connect_bd_net [get_bd_pins processing_system7_0/FCLK_CLK0] [get_bd_pins rst_ps7_0_50M/slowest_sync_clk]
|
|
connect_bd_net [get_bd_pins processing_system7_0/FCLK_RESET0_N] [get_bd_pins rst_ps7_0_50M/ext_reset_in]
|
|
|
|
# Save Block Design
|
|
save_bd_design
|
|
|
|
# Make Block Design available
|
|
make_wrapper -files [get_files ${design_name}.bd] -top
|
|
add_files -norecurse {{PROJECT_NAME}}/{{PROJECT_NAME}}.srcs/sources_1/bd/${design_name}/hdl/${design_name}_wrapper.v
|
|
update_compile_order -fileset sources_1
|
|
```
|
|
|
|
### PS Configuration Properties by Device
|
|
|
|
Replace `{{PS_CONFIG_PROPERTIES}}` with the appropriate device configuration:
|
|
|
|
**For xc7z100ffg900-2 (3.0 Exciter):**
|
|
```tcl
|
|
set_property -dict [list \
|
|
CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {250} \
|
|
CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {250} \
|
|
CONFIG.PCW_FPGA_FCLK0_ENABLE {1} \
|
|
CONFIG.PCW_UIPARAM_DDR_FREQ_MHZ {533.333333} \
|
|
CONFIG.PCW_UIPARAM_DDR_PARTNO {MT41K256M16 RE-15E} \
|
|
CONFIG.PCW_UIPARAM_DDR_DEVICE_CAPACITY {4096 MBits} \
|
|
CONFIG.PCW_UIPARAM_DDR_SPEED_BIN {DDR3_1066F} \
|
|
CONFIG.PCW_USE_M_AXI_GP0 {1} \
|
|
CONFIG.PCW_EN_RST0_PORT {1} \
|
|
CONFIG.PCW_EN_CLK0_PORT {1} \
|
|
] $processing_system7_0
|
|
```
|
|
|
|
**For xc7z035ffg676-2 (ipots):**
|
|
```tcl
|
|
set_property -dict [list \
|
|
CONFIG.PCW_ACT_APU_PERIPHERAL_FREQMHZ {666.666687} \
|
|
CONFIG.PCW_ACT_CAN_PERIPHERAL_FREQMHZ {10.000000} \
|
|
CONFIG.PCW_ACT_DCI_PERIPHERAL_FREQMHZ {10.158730} \
|
|
CONFIG.PCW_ACT_ENET0_PERIPHERAL_FREQMHZ {125.000000} \
|
|
CONFIG.PCW_ACT_ENET1_PERIPHERAL_FREQMHZ {10.000000} \
|
|
CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {50.000000} \
|
|
CONFIG.PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ {10.000000} \
|
|
CONFIG.PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ {10.000000} \
|
|
CONFIG.PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ {10.000000} \
|
|
CONFIG.PCW_ACT_PCAP_PERIPHERAL_FREQMHZ {200.000000} \
|
|
CONFIG.PCW_ACT_QSPI_PERIPHERAL_FREQMHZ {200.000000} \
|
|
CONFIG.PCW_ACT_SDIO_PERIPHERAL_FREQMHZ {100.000000} \
|
|
CONFIG.PCW_ACT_SMC_PERIPHERAL_FREQMHZ {10.000000} \
|
|
CONFIG.PCW_ACT_SPI_PERIPHERAL_FREQMHZ {166.666672} \
|
|
CONFIG.PCW_ACT_TPIU_PERIPHERAL_FREQMHZ {200.000000} \
|
|
CONFIG.PCW_ACT_TTC0_CLK0_PERIPHERAL_FREQMHZ {111.111115} \
|
|
CONFIG.PCW_ACT_TTC0_CLK1_PERIPHERAL_FREQMHZ {111.111115} \
|
|
CONFIG.PCW_ACT_TTC0_CLK2_PERIPHERAL_FREQMHZ {111.111115} \
|
|
CONFIG.PCW_ACT_TTC1_CLK0_PERIPHERAL_FREQMHZ {111.111115} \
|
|
CONFIG.PCW_ACT_TTC1_CLK1_PERIPHERAL_FREQMHZ {111.111115} \
|
|
CONFIG.PCW_ACT_TTC1_CLK2_PERIPHERAL_FREQMHZ {111.111115} \
|
|
CONFIG.PCW_ACT_UART_PERIPHERAL_FREQMHZ {100.000000} \
|
|
CONFIG.PCW_ACT_WDT_PERIPHERAL_FREQMHZ {111.111115} \
|
|
CONFIG.PCW_ARMPLL_CTRL_FBDIV {40} \
|
|
CONFIG.PCW_CAN_PERIPHERAL_DIVISOR0 {1} \
|
|
CONFIG.PCW_CAN_PERIPHERAL_DIVISOR1 {1} \
|
|
CONFIG.PCW_CLK0_FREQ {50000000} \
|
|
CONFIG.PCW_CLK1_FREQ {10000000} \
|
|
CONFIG.PCW_CLK2_FREQ {10000000} \
|
|
CONFIG.PCW_CLK3_FREQ {10000000} \
|
|
CONFIG.PCW_CPU_CPU_PLL_FREQMHZ {1333.333} \
|
|
CONFIG.PCW_CPU_PERIPHERAL_DIVISOR0 {2} \
|
|
CONFIG.PCW_DCI_PERIPHERAL_DIVISOR0 {15} \
|
|
CONFIG.PCW_DCI_PERIPHERAL_DIVISOR1 {7} \
|
|
CONFIG.PCW_DDRPLL_CTRL_FBDIV {32} \
|
|
CONFIG.PCW_DDR_DDR_PLL_FREQMHZ {1066.667} \
|
|
CONFIG.PCW_DDR_PERIPHERAL_DIVISOR0 {4} \
|
|
CONFIG.PCW_DDR_RAM_HIGHADDR {0x1FFFFFFF} \
|
|
CONFIG.PCW_ENET0_ENET0_IO {MIO 16 .. 27} \
|
|
CONFIG.PCW_ENET0_GRP_MDIO_ENABLE {1} \
|
|
CONFIG.PCW_ENET0_GRP_MDIO_IO {MIO 52 .. 53} \
|
|
CONFIG.PCW_ENET0_PERIPHERAL_CLKSRC {IO PLL} \
|
|
CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR0 {8} \
|
|
CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR1 {1} \
|
|
CONFIG.PCW_ENET0_PERIPHERAL_ENABLE {1} \
|
|
CONFIG.PCW_ENET0_PERIPHERAL_FREQMHZ {1000 Mbps} \
|
|
CONFIG.PCW_ENET0_RESET_ENABLE {0} \
|
|
CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR0 {1} \
|
|
CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR1 {1} \
|
|
CONFIG.PCW_ENET1_RESET_ENABLE {0} \
|
|
CONFIG.PCW_ENET_RESET_ENABLE {0} \
|
|
CONFIG.PCW_EN_CLK0_PORT {1} \
|
|
CONFIG.PCW_EN_EMIO_CD_SDIO1 {0} \
|
|
CONFIG.PCW_EN_EMIO_GPIO {1} \
|
|
CONFIG.PCW_EN_EMIO_SDIO1 {0} \
|
|
CONFIG.PCW_EN_EMIO_SPI0 {1} \
|
|
CONFIG.PCW_EN_EMIO_SPI1 {1} \
|
|
CONFIG.PCW_EN_EMIO_UART0 {0} \
|
|
CONFIG.PCW_EN_EMIO_WP_SDIO1 {0} \
|
|
CONFIG.PCW_EN_ENET0 {1} \
|
|
CONFIG.PCW_EN_QSPI {1} \
|
|
CONFIG.PCW_EN_RST0_PORT {1} \
|
|
CONFIG.PCW_EN_SDIO0 {0} \
|
|
CONFIG.PCW_EN_SDIO1 {1} \
|
|
CONFIG.PCW_EN_SPI0 {1} \
|
|
CONFIG.PCW_EN_SPI1 {1} \
|
|
CONFIG.PCW_EN_UART0 {1} \
|
|
CONFIG.PCW_EN_UART1 {1} \
|
|
CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR0 {5} \
|
|
CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR1 {4} \
|
|
CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR0 {1} \
|
|
CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR1 {1} \
|
|
CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR0 {1} \
|
|
CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR1 {1} \
|
|
CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR0 {1} \
|
|
CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR1 {1} \
|
|
CONFIG.PCW_FCLK_CLK0_BUF {TRUE} \
|
|
CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {50} \
|
|
CONFIG.PCW_FPGA_FCLK0_ENABLE {1} \
|
|
CONFIG.PCW_FPGA_FCLK1_ENABLE {0} \
|
|
CONFIG.PCW_FPGA_FCLK2_ENABLE {0} \
|
|
CONFIG.PCW_FPGA_FCLK3_ENABLE {0} \
|
|
CONFIG.PCW_GPIO_EMIO_GPIO_ENABLE {1} \
|
|
CONFIG.PCW_GPIO_EMIO_GPIO_IO {64} \
|
|
CONFIG.PCW_GPIO_EMIO_GPIO_WIDTH {64} \
|
|
CONFIG.PCW_I2C_PERIPHERAL_FREQMHZ {25} \
|
|
CONFIG.PCW_IOPLL_CTRL_FBDIV {30} \
|
|
CONFIG.PCW_IO_IO_PLL_FREQMHZ {1000.000} \
|
|
CONFIG.PCW_IRQ_F2P_INTR {0} \
|
|
CONFIG.PCW_MIO_14_DIRECTION {in} \
|
|
CONFIG.PCW_MIO_14_IOTYPE {<Select>} \
|
|
CONFIG.PCW_MIO_14_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_14_SLEW {slow} \
|
|
CONFIG.PCW_MIO_15_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_15_IOTYPE {<Select>} \
|
|
CONFIG.PCW_MIO_15_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_15_SLEW {slow} \
|
|
CONFIG.PCW_MIO_16_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_16_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_16_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_16_SLEW {fast} \
|
|
CONFIG.PCW_MIO_17_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_17_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_17_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_17_SLEW {fast} \
|
|
CONFIG.PCW_MIO_18_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_18_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_18_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_18_SLEW {fast} \
|
|
CONFIG.PCW_MIO_19_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_19_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_19_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_19_SLEW {fast} \
|
|
CONFIG.PCW_MIO_1_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_1_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_1_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_1_SLEW {slow} \
|
|
CONFIG.PCW_MIO_20_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_20_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_20_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_20_SLEW {fast} \
|
|
CONFIG.PCW_MIO_21_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_21_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_21_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_21_SLEW {fast} \
|
|
CONFIG.PCW_MIO_22_DIRECTION {in} \
|
|
CONFIG.PCW_MIO_22_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_22_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_22_SLEW {fast} \
|
|
CONFIG.PCW_MIO_23_DIRECTION {in} \
|
|
CONFIG.PCW_MIO_23_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_23_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_23_SLEW {fast} \
|
|
CONFIG.PCW_MIO_24_DIRECTION {in} \
|
|
CONFIG.PCW_MIO_24_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_24_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_24_SLEW {fast} \
|
|
CONFIG.PCW_MIO_25_DIRECTION {in} \
|
|
CONFIG.PCW_MIO_25_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_25_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_25_SLEW {fast} \
|
|
CONFIG.PCW_MIO_26_DIRECTION {in} \
|
|
CONFIG.PCW_MIO_26_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_26_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_26_SLEW {fast} \
|
|
CONFIG.PCW_MIO_27_DIRECTION {in} \
|
|
CONFIG.PCW_MIO_27_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_27_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_27_SLEW {fast} \
|
|
CONFIG.PCW_MIO_2_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_2_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_2_PULLUP {disabled} \
|
|
CONFIG.PCW_MIO_2_SLEW {slow} \
|
|
CONFIG.PCW_MIO_3_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_3_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_3_PULLUP {disabled} \
|
|
CONFIG.PCW_MIO_3_SLEW {slow} \
|
|
CONFIG.PCW_MIO_40_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_40_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_40_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_40_SLEW {slow} \
|
|
CONFIG.PCW_MIO_41_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_41_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_41_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_41_SLEW {slow} \
|
|
CONFIG.PCW_MIO_42_DIRECTION {in} \
|
|
CONFIG.PCW_MIO_42_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_42_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_42_SLEW {slow} \
|
|
CONFIG.PCW_MIO_43_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_43_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_43_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_43_SLEW {slow} \
|
|
CONFIG.PCW_MIO_44_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_44_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_44_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_44_SLEW {slow} \
|
|
CONFIG.PCW_MIO_45_DIRECTION {in} \
|
|
CONFIG.PCW_MIO_45_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_45_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_45_SLEW {slow} \
|
|
CONFIG.PCW_MIO_46_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_46_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_46_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_46_SLEW {slow} \
|
|
CONFIG.PCW_MIO_47_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_47_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_47_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_47_SLEW {slow} \
|
|
CONFIG.PCW_MIO_48_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_48_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_48_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_48_SLEW {slow} \
|
|
CONFIG.PCW_MIO_49_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_49_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_49_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_49_SLEW {slow} \
|
|
CONFIG.PCW_MIO_4_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_4_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_4_PULLUP {disabled} \
|
|
CONFIG.PCW_MIO_4_SLEW {slow} \
|
|
CONFIG.PCW_MIO_50_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_50_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_50_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_50_SLEW {slow} \
|
|
CONFIG.PCW_MIO_51_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_51_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_51_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_51_SLEW {slow} \
|
|
CONFIG.PCW_MIO_52_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_52_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_52_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_52_SLEW {fast} \
|
|
CONFIG.PCW_MIO_53_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_53_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_53_PULLUP {enabled} \
|
|
CONFIG.PCW_MIO_53_SLEW {fast} \
|
|
CONFIG.PCW_MIO_5_DIRECTION {inout} \
|
|
CONFIG.PCW_MIO_5_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_5_PULLUP {disabled} \
|
|
CONFIG.PCW_MIO_5_SLEW {slow} \
|
|
CONFIG.PCW_MIO_6_DIRECTION {out} \
|
|
CONFIG.PCW_MIO_6_IOTYPE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_MIO_6_PULLUP {disabled} \
|
|
CONFIG.PCW_MIO_6_SLEW {slow} \
|
|
CONFIG.PCW_MIO_TREE_PERIPHERALS {unassigned#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#unassigned#Quad SPI Flash#Quad SPI Flash#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#Enet 0#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#UART 0#UART 0#UART 1#UART 1#SD 1#SD 1#SD 1#SD 1#SD 1#SD 1#Enet 0#Enet 0} \
|
|
CONFIG.PCW_MIO_TREE_SIGNALS {unassigned#qspi0_ss_b#qspi0_io[0]#qspi0_io[1]#unassigned#qspi0_io[3]/HOLD_B#qspi0_sclk#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#tx_clk#txd[0]#txd[1]#txd[2]#txd[3]#tx_ctl#rx_clk#rxd[0]#rxd[1]#rxd[2]#rxd[3]#rx_ctl#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#unassigned#rx#tx#tx#rx#data[0]#cmd#clk#data[1]#data[2]#data[3]#mdc#mdio} \
|
|
CONFIG.PCW_NAND_GRP_D8_ENABLE {0} \
|
|
CONFIG.PCW_NAND_PERIPHERAL_ENABLE {0} \
|
|
CONFIG.PCW_NOR_GRP_A25_ENABLE {0} \
|
|
CONFIG.PCW_NOR_GRP_CS0_ENABLE {0} \
|
|
CONFIG.PCW_NOR_GRP_CS1_ENABLE {0} \
|
|
CONFIG.PCW_NOR_GRP_SRAM_CS0_ENABLE {0} \
|
|
CONFIG.PCW_NOR_GRP_SRAM_CS1_ENABLE {0} \
|
|
CONFIG.PCW_NOR_GRP_SRAM_INT_ENABLE {0} \
|
|
CONFIG.PCW_NOR_PERIPHERAL_ENABLE {0} \
|
|
CONFIG.PCW_PCAP_PERIPHERAL_DIVISOR0 {5} \
|
|
CONFIG.PCW_PJTAG_PERIPHERAL_ENABLE {0} \
|
|
CONFIG.PCW_PRESET_BANK0_VOLTAGE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_PRESET_BANK1_VOLTAGE {LVCMOS 1.8V} \
|
|
CONFIG.PCW_QSPI_GRP_FBCLK_ENABLE {0} \
|
|
CONFIG.PCW_QSPI_GRP_IO1_ENABLE {0} \
|
|
CONFIG.PCW_QSPI_GRP_SINGLE_SS_ENABLE {1} \
|
|
CONFIG.PCW_QSPI_GRP_SINGLE_SS_IO {MIO 1 .. 6} \
|
|
CONFIG.PCW_QSPI_GRP_SS1_ENABLE {0} \
|
|
CONFIG.PCW_QSPI_PERIPHERAL_DIVISOR0 {5} \
|
|
CONFIG.PCW_QSPI_PERIPHERAL_ENABLE {1} \
|
|
CONFIG.PCW_QSPI_PERIPHERAL_FREQMHZ {200} \
|
|
CONFIG.PCW_QSPI_QSPI_IO {MIO 1 .. 6} \
|
|
CONFIG.PCW_SD0_GRP_CD_ENABLE {0} \
|
|
CONFIG.PCW_SD0_GRP_POW_ENABLE {0} \
|
|
CONFIG.PCW_SD0_GRP_WP_ENABLE {0} \
|
|
CONFIG.PCW_SD0_PERIPHERAL_ENABLE {0} \
|
|
CONFIG.PCW_SD0_SD0_IO {<Select>} \
|
|
CONFIG.PCW_SD1_GRP_CD_ENABLE {0} \
|
|
CONFIG.PCW_SD1_GRP_POW_ENABLE {0} \
|
|
CONFIG.PCW_SD1_GRP_WP_ENABLE {0} \
|
|
CONFIG.PCW_SD1_PERIPHERAL_ENABLE {1} \
|
|
CONFIG.PCW_SD1_SD1_IO {MIO 46 .. 51} \
|
|
CONFIG.PCW_SDIO_PERIPHERAL_DIVISOR0 {10} \
|
|
CONFIG.PCW_SDIO_PERIPHERAL_FREQMHZ {100} \
|
|
CONFIG.PCW_SDIO_PERIPHERAL_VALID {1} \
|
|
CONFIG.PCW_SINGLE_QSPI_DATA_MODE {x2} \
|
|
CONFIG.PCW_SMC_PERIPHERAL_DIVISOR0 {1} \
|
|
CONFIG.PCW_SPI0_GRP_SS0_ENABLE {1} \
|
|
CONFIG.PCW_SPI0_GRP_SS0_IO {EMIO} \
|
|
CONFIG.PCW_SPI0_GRP_SS1_ENABLE {1} \
|
|
CONFIG.PCW_SPI0_GRP_SS1_IO {EMIO} \
|
|
CONFIG.PCW_SPI0_GRP_SS2_ENABLE {1} \
|
|
CONFIG.PCW_SPI0_GRP_SS2_IO {EMIO} \
|
|
CONFIG.PCW_SPI0_PERIPHERAL_ENABLE {1} \
|
|
CONFIG.PCW_SPI0_SPI0_IO {EMIO} \
|
|
CONFIG.PCW_SPI1_GRP_SS0_ENABLE {1} \
|
|
CONFIG.PCW_SPI1_GRP_SS0_IO {EMIO} \
|
|
CONFIG.PCW_SPI1_GRP_SS1_ENABLE {1} \
|
|
CONFIG.PCW_SPI1_GRP_SS1_IO {EMIO} \
|
|
CONFIG.PCW_SPI1_GRP_SS2_ENABLE {1} \
|
|
CONFIG.PCW_SPI1_GRP_SS2_IO {EMIO} \
|
|
CONFIG.PCW_SPI1_PERIPHERAL_ENABLE {1} \
|
|
CONFIG.PCW_SPI1_SPI1_IO {EMIO} \
|
|
CONFIG.PCW_SPI_PERIPHERAL_DIVISOR0 {6} \
|
|
CONFIG.PCW_SPI_PERIPHERAL_FREQMHZ {166.666666} \
|
|
CONFIG.PCW_SPI_PERIPHERAL_VALID {1} \
|
|
CONFIG.PCW_TPIU_PERIPHERAL_DIVISOR0 {1} \
|
|
CONFIG.PCW_UART0_GRP_FULL_ENABLE {0} \
|
|
CONFIG.PCW_UART0_PERIPHERAL_ENABLE {1} \
|
|
CONFIG.PCW_UART0_UART0_IO {MIO 42 .. 43} \
|
|
CONFIG.PCW_UART1_GRP_FULL_ENABLE {0} \
|
|
CONFIG.PCW_UART1_PERIPHERAL_ENABLE {1} \
|
|
CONFIG.PCW_UART1_UART1_IO {MIO 44 .. 45} \
|
|
CONFIG.PCW_UART_PERIPHERAL_DIVISOR0 {10} \
|
|
CONFIG.PCW_UART_PERIPHERAL_FREQMHZ {100} \
|
|
CONFIG.PCW_UART_PERIPHERAL_VALID {1} \
|
|
CONFIG.PCW_UIPARAM_ACT_DDR_FREQ_MHZ {266.666687} \
|
|
CONFIG.PCW_UIPARAM_DDR_BANK_ADDR_COUNT {3} \
|
|
CONFIG.PCW_UIPARAM_DDR_BUS_WIDTH {16 Bit} \
|
|
CONFIG.PCW_UIPARAM_DDR_CL {7} \
|
|
CONFIG.PCW_UIPARAM_DDR_COL_ADDR_COUNT {10} \
|
|
CONFIG.PCW_UIPARAM_DDR_CWL {6} \
|
|
CONFIG.PCW_UIPARAM_DDR_DEVICE_CAPACITY {4096 MBits} \
|
|
CONFIG.PCW_UIPARAM_DDR_DRAM_WIDTH {16 Bits} \
|
|
CONFIG.PCW_UIPARAM_DDR_ECC {Disabled} \
|
|
CONFIG.PCW_UIPARAM_DDR_FREQ_MHZ {266.6666666} \
|
|
CONFIG.PCW_UIPARAM_DDR_PARTNO {MT41K256M16 RE-15E} \
|
|
CONFIG.PCW_UIPARAM_DDR_ROW_ADDR_COUNT {15} \
|
|
CONFIG.PCW_UIPARAM_DDR_SPEED_BIN {DDR3_1066F} \
|
|
CONFIG.PCW_UIPARAM_DDR_T_FAW {45.0} \
|
|
CONFIG.PCW_UIPARAM_DDR_T_RAS_MIN {36.0} \
|
|
CONFIG.PCW_UIPARAM_DDR_T_RC {49.5} \
|
|
CONFIG.PCW_UIPARAM_DDR_T_RCD {7} \
|
|
CONFIG.PCW_UIPARAM_DDR_T_RP {7} \
|
|
CONFIG.PCW_UIPARAM_DDR_USE_INTERNAL_VREF {1} \
|
|
CONFIG.PCW_USE_FABRIC_INTERRUPT {0} \
|
|
CONFIG.PCW_USE_M_AXI_GP0 {1} \
|
|
CONFIG.PCW_USE_M_AXI_GP1 {0} \
|
|
CONFIG.PCW_USE_S_AXI_HP0 {0} \
|
|
] $processing_system7_0
|
|
```
|
|
|
|
**For xc7z020cfg400-2 (RFSwitch):**
|
|
|
|
## TCL Script Template
|
|
|
|
After collecting all required information via `AskUserQuestion`, generate a TCL script using this template structure:
|
|
|
|
```tcl
|
|
# =============================================================================
|
|
# Vivado Project Auto-Generation Script
|
|
# Project: {{PROJECT_NAME}}
|
|
# Generated: {{TIMESTAMP}}
|
|
# =============================================================================
|
|
|
|
# Set Vivado installation path
|
|
set vivado_path "{{VIVADO_PATH}}"
|
|
|
|
# Create project
|
|
create_project {{PROJECT_NAME}} ./{{PROJECT_NAME}} -part {{DEVICE_PART}} -force
|
|
|
|
# Set project parameters
|
|
set_property target_language Verilog [current_project]
|
|
|
|
# Check if device is Zynq series (starts with xc7z)
|
|
set device_part "{{DEVICE_PART}}"
|
|
set is_zynq [regexp {^xc7z} $device_part]
|
|
|
|
# Create Block Design for Zynq devices
|
|
if {$is_zynq} {
|
|
# Add PS configuration based on device type
|
|
# See "Zynq PS Configuration" section above for device-specific configs
|
|
{{ZYNQ_PS_CONFIG_BLOCK}}
|
|
}
|
|
|
|
# Create default constraint file
|
|
set constraint_file "{{PROJECT_NAME}}_constraints.xdc"
|
|
set constr_file_obj [open ./{{PROJECT_NAME}}/$constraint_file w]
|
|
puts $constr_file_obj "# Timing constraints for {{PROJECT_NAME}}"
|
|
puts $constr_file_obj "# Add your constraints here"
|
|
close $constr_file_obj
|
|
|
|
add_files -fileset constrs_1 -norecurse ./{{PROJECT_NAME}}/$constraint_file
|
|
|
|
# Create source directories
|
|
file mkdir ./{{PROJECT_NAME}}/src
|
|
file mkdir ./{{PROJECT_NAME}}/sim
|
|
file mkdir ./{{PROJECT_NAME}}/synth
|
|
|
|
# Print project info
|
|
puts "=========================================="
|
|
puts "Project '{{PROJECT_NAME}}' created successfully!"
|
|
puts "Device: {{DEVICE_PART}}"
|
|
if {$is_zynq} {
|
|
puts "PS Configured: Yes"
|
|
} else {
|
|
puts "PS Configured: No (Pure FPGA device)"
|
|
}
|
|
puts "=========================================="
|
|
|
|
# Save project
|
|
save_project_as {{PROJECT_NAME}} ./{{PROJECT_NAME}}
|
|
```
|
|
|
|
## Variable Replacement
|
|
|
|
Replace the template variables with user-provided values:
|
|
|
|
| Variable | Description |
|
|
|----------|-------------|
|
|
| `{{VIVADO_PATH}}` | Vivado installation path (always: `D:/Xilinx/Vivado/2018.1`) |
|
|
| `{{PROJECT_NAME}}` | Project name |
|
|
| `{{DEVICE_PART}}` | FPGA part number |
|
|
| `{{TIMESTAMP}}` | Current date/time |
|
|
| `{{ZYNQ_PS_CONFIG_BLOCK}}` | For Zynq devices only: Block Design PS configuration (see above) |
|
|
|
|
## Output File
|
|
|
|
Save the generated TCL script as:
|
|
- Default: `create_vivado_project.tcl` in the current working directory
|
|
- Or use the project name: `create_{PROJECT_NAME}_project.tcl`
|
|
|
|
## Usage Instructions
|
|
|
|
After generating the script, provide the user with clear instructions:
|
|
|
|
```
|
|
To run this script in Vivado:
|
|
|
|
1. Open Vivado:
|
|
- Start Menu → Xilinx Vivado [version]
|
|
|
|
2. In the Vivado Tcl Console, run:
|
|
source /path/to/create_vivado_project.tcl
|
|
|
|
3. Or from command line:
|
|
cd /path/to/script/directory
|
|
vivado -mode tcl -source create_vivado_project.tcl
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Validate the part number**: The TCL script uses the part number directly. Ensure the user enters a valid Xilinx part number format.
|
|
|
|
2. **Path handling**: Windows paths in TCL use forward slashes `/` even though Windows uses backslashes `\`. Convert backslashes to forward slashes if the user provides them.
|
|
|
|
3. **Project location**: The script creates the project in a subdirectory named after the project. This keeps the workspace organized.
|
|
|
|
4. **Force flag**: The `-force` flag in `create_project` overwrites existing projects. Warn users if they already have a project with the same name.
|
|
|
|
## Error Handling
|
|
|
|
If the script execution fails, common causes include:
|
|
|
|
1. **Invalid part number** - Check the part number format matches Xilinx naming convention
|
|
2. **Path issues** - Ensure Vivado path uses forward slashes
|
|
3. **Permissions** - Ensure write permissions in the target directory
|
|
4. **Vivado version** - Some features may vary between Vivado versions
|
|
|
|
## Optional Extensions
|
|
|
|
After the basic project is created, you can offer to help with:
|
|
|
|
- Adding IP integrator blocks
|
|
- Setting up simulation waveforms
|
|
- Creating custom constraints
|
|
- Adding existing source files
|
|
- Configuring synthesis and implementation settings
|