mirror of
https://github.com/MiSTer-devel/MacPlus_MiSTer.git
synced 2025-02-17 01:31:02 +00:00
Initial port.
This commit is contained in:
commit
35a1e5d180
37
.gitignore
vendored
Normal file
37
.gitignore
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
db
|
||||
greybox_tmp
|
||||
incremental_db
|
||||
output_files
|
||||
simulation
|
||||
hc_output
|
||||
scaler
|
||||
hps_isw_handoff
|
||||
vip
|
||||
*_sim
|
||||
.qsys_edit
|
||||
PLLJ_PLLSPE_INFO.txt
|
||||
*.bak
|
||||
*.orig
|
||||
*.rej
|
||||
*.qdf
|
||||
*.rpt
|
||||
*.smsg
|
||||
*.summary
|
||||
*.done
|
||||
*.jdi
|
||||
*.pin
|
||||
*.sof
|
||||
*.qws
|
||||
*.ppf
|
||||
*.ddb
|
||||
build_id.v
|
||||
c5_pin_model_dump.txt
|
||||
*.sopcinfo
|
||||
*.csv
|
||||
*.f
|
||||
*.cmp
|
||||
*.sip
|
||||
*.spd
|
||||
*.bsf
|
||||
*~
|
||||
*.xml
|
376
MacPlus-lite.qsf
Normal file
376
MacPlus-lite.qsf
Normal file
@ -0,0 +1,376 @@
|
||||
# -------------------------------------------------------------------------- #
|
||||
#
|
||||
# Copyright (C) 2017 Intel Corporation. All rights reserved.
|
||||
# Your use of Intel Corporation's design tools, logic functions
|
||||
# and other software and tools, and its AMPP partner logic
|
||||
# functions, and any output files from any of the foregoing
|
||||
# (including device programming or simulation files), and any
|
||||
# associated documentation or information are expressly subject
|
||||
# to the terms and conditions of the Intel Program License
|
||||
# Subscription Agreement, the Intel Quartus Prime License Agreement,
|
||||
# the Intel MegaCore Function License Agreement, or other
|
||||
# applicable license agreement, including, without limitation,
|
||||
# that your use is for the sole purpose of programming logic
|
||||
# devices manufactured by Intel and sold by Intel or its
|
||||
# authorized distributors. Please refer to the applicable
|
||||
# agreement for further details.
|
||||
#
|
||||
# -------------------------------------------------------------------------- #
|
||||
#
|
||||
# Quartus Prime
|
||||
# Version 16.1.2 Build 203 01/18/2017 SJ Standard Edition
|
||||
# Date created = 01:53:32 April 20, 2017
|
||||
#
|
||||
# -------------------------------------------------------------------------- #
|
||||
|
||||
set_global_assignment -name VERILOG_MACRO "LITE=1"
|
||||
|
||||
set_global_assignment -name FAMILY "Cyclone V"
|
||||
set_global_assignment -name DEVICE 5CSEBA6U23I7
|
||||
set_global_assignment -name TOP_LEVEL_ENTITY sys_top
|
||||
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.1.2
|
||||
set_global_assignment -name LAST_QUARTUS_VERSION "17.0.1 Standard Edition"
|
||||
set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017"
|
||||
set_global_assignment -name DEVICE_FILTER_PACKAGE UFBGA
|
||||
set_global_assignment -name DEVICE_FILTER_PIN_COUNT 672
|
||||
set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 7
|
||||
|
||||
set_global_assignment -name GENERATE_RBF_FILE ON
|
||||
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
|
||||
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
|
||||
set_global_assignment -name SAVE_DISK_SPACE OFF
|
||||
set_global_assignment -name SMART_RECOMPILE ON
|
||||
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
|
||||
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
|
||||
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
|
||||
set_global_assignment -name MIN_CORE_JUNCTION_TEMP "-40"
|
||||
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 100
|
||||
set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW"
|
||||
set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)"
|
||||
set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF
|
||||
set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF
|
||||
set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS
|
||||
set_global_assignment -name FITTER_EFFORT "STANDARD FIT"
|
||||
set_global_assignment -name OPTIMIZATION_MODE BALANCED
|
||||
set_global_assignment -name SEED 1
|
||||
|
||||
#============================================================
|
||||
# ADC
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ADC_CONVST
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ADC_SCK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ADC_SDI
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ADC_SDO
|
||||
set_location_assignment PIN_U9 -to ADC_CONVST
|
||||
set_location_assignment PIN_V10 -to ADC_SCK
|
||||
set_location_assignment PIN_AC4 -to ADC_SDI
|
||||
set_location_assignment PIN_AD4 -to ADC_SDO
|
||||
|
||||
#============================================================
|
||||
# ARDUINO
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[3]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[4]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[5]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[6]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[7]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[8]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[9]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[10]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[11]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[12]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[13]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[14]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[15]
|
||||
set_location_assignment PIN_AG9 -to ARDUINO_IO[3]
|
||||
set_location_assignment PIN_U14 -to ARDUINO_IO[4]
|
||||
set_location_assignment PIN_U13 -to ARDUINO_IO[5]
|
||||
set_location_assignment PIN_AG8 -to ARDUINO_IO[6]
|
||||
set_location_assignment PIN_AH8 -to ARDUINO_IO[7]
|
||||
set_location_assignment PIN_AF17 -to ARDUINO_IO[8]
|
||||
set_location_assignment PIN_AE15 -to ARDUINO_IO[9]
|
||||
set_location_assignment PIN_AF15 -to ARDUINO_IO[10]
|
||||
set_location_assignment PIN_AG16 -to ARDUINO_IO[11]
|
||||
set_location_assignment PIN_AH11 -to ARDUINO_IO[12]
|
||||
set_location_assignment PIN_AH12 -to ARDUINO_IO[13]
|
||||
set_location_assignment PIN_AH9 -to ARDUINO_IO[14]
|
||||
set_location_assignment PIN_AG11 -to ARDUINO_IO[15]
|
||||
|
||||
#============================================================
|
||||
# SDIO
|
||||
#============================================================
|
||||
set_location_assignment PIN_AF25 -to SDIO_DAT[0]
|
||||
set_location_assignment PIN_AF23 -to SDIO_DAT[1]
|
||||
set_location_assignment PIN_AD26 -to SDIO_DAT[2]
|
||||
set_location_assignment PIN_AF28 -to SDIO_DAT[3]
|
||||
set_location_assignment PIN_AF27 -to SDIO_CMD
|
||||
set_location_assignment PIN_AH26 -to SDIO_CLK
|
||||
set_location_assignment PIN_AH7 -to SDIO_CD
|
||||
|
||||
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDIO_*
|
||||
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SDIO_*
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SDIO_DAT[*]
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SDIO_CMD
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SDIO_CD
|
||||
|
||||
#============================================================
|
||||
# VGA
|
||||
#============================================================
|
||||
set_location_assignment PIN_AE17 -to VGA_R[0]
|
||||
set_location_assignment PIN_AE20 -to VGA_R[1]
|
||||
set_location_assignment PIN_AF20 -to VGA_R[2]
|
||||
set_location_assignment PIN_AH18 -to VGA_R[3]
|
||||
set_location_assignment PIN_AH19 -to VGA_R[4]
|
||||
set_location_assignment PIN_AF21 -to VGA_R[5]
|
||||
|
||||
set_location_assignment PIN_AE19 -to VGA_G[0]
|
||||
set_location_assignment PIN_AG15 -to VGA_G[1]
|
||||
set_location_assignment PIN_AF18 -to VGA_G[2]
|
||||
set_location_assignment PIN_AG18 -to VGA_G[3]
|
||||
set_location_assignment PIN_AG19 -to VGA_G[4]
|
||||
set_location_assignment PIN_AG20 -to VGA_G[5]
|
||||
|
||||
set_location_assignment PIN_AG21 -to VGA_B[0]
|
||||
set_location_assignment PIN_AA20 -to VGA_B[1]
|
||||
set_location_assignment PIN_AE22 -to VGA_B[2]
|
||||
set_location_assignment PIN_AF22 -to VGA_B[3]
|
||||
set_location_assignment PIN_AH23 -to VGA_B[4]
|
||||
set_location_assignment PIN_AH21 -to VGA_B[5]
|
||||
|
||||
set_location_assignment PIN_AH22 -to VGA_HS
|
||||
set_location_assignment PIN_AG24 -to VGA_VS
|
||||
|
||||
set_location_assignment PIN_AH27 -to VGA_EN
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to VGA_EN
|
||||
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to VGA_*
|
||||
set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_*
|
||||
|
||||
#============================================================
|
||||
# AUDIO
|
||||
#============================================================
|
||||
set_location_assignment PIN_AC24 -to AUDIO_L
|
||||
set_location_assignment PIN_AE25 -to AUDIO_R
|
||||
set_location_assignment PIN_AG26 -to AUDIO_SPDIF
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to AUDIO_*
|
||||
set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to AUDIO_*
|
||||
|
||||
#============================================================
|
||||
# SDRAM
|
||||
#============================================================
|
||||
set_location_assignment PIN_Y11 -to SDRAM_A[0]
|
||||
set_location_assignment PIN_AA26 -to SDRAM_A[1]
|
||||
set_location_assignment PIN_AA13 -to SDRAM_A[2]
|
||||
set_location_assignment PIN_AA11 -to SDRAM_A[3]
|
||||
set_location_assignment PIN_W11 -to SDRAM_A[4]
|
||||
set_location_assignment PIN_Y19 -to SDRAM_A[5]
|
||||
set_location_assignment PIN_AB23 -to SDRAM_A[6]
|
||||
set_location_assignment PIN_AC23 -to SDRAM_A[7]
|
||||
set_location_assignment PIN_AC22 -to SDRAM_A[8]
|
||||
set_location_assignment PIN_C12 -to SDRAM_A[9]
|
||||
set_location_assignment PIN_AB26 -to SDRAM_A[10]
|
||||
set_location_assignment PIN_AD17 -to SDRAM_A[11]
|
||||
set_location_assignment PIN_D12 -to SDRAM_A[12]
|
||||
set_location_assignment PIN_Y17 -to SDRAM_BA[0]
|
||||
set_location_assignment PIN_AB25 -to SDRAM_BA[1]
|
||||
|
||||
set_location_assignment PIN_E8 -to SDRAM_DQ[0]
|
||||
set_location_assignment PIN_V12 -to SDRAM_DQ[1]
|
||||
set_location_assignment PIN_D11 -to SDRAM_DQ[2]
|
||||
set_location_assignment PIN_W12 -to SDRAM_DQ[3]
|
||||
set_location_assignment PIN_AH13 -to SDRAM_DQ[4]
|
||||
set_location_assignment PIN_D8 -to SDRAM_DQ[5]
|
||||
set_location_assignment PIN_AH14 -to SDRAM_DQ[6]
|
||||
set_location_assignment PIN_AF7 -to SDRAM_DQ[7]
|
||||
set_location_assignment PIN_AE24 -to SDRAM_DQ[8]
|
||||
set_location_assignment PIN_AD23 -to SDRAM_DQ[9]
|
||||
set_location_assignment PIN_AE6 -to SDRAM_DQ[10]
|
||||
set_location_assignment PIN_AE23 -to SDRAM_DQ[11]
|
||||
set_location_assignment PIN_AG14 -to SDRAM_DQ[12]
|
||||
set_location_assignment PIN_AD5 -to SDRAM_DQ[13]
|
||||
set_location_assignment PIN_AF4 -to SDRAM_DQ[14]
|
||||
set_location_assignment PIN_AH3 -to SDRAM_DQ[15]
|
||||
set_location_assignment PIN_AG13 -to SDRAM_DQML
|
||||
set_location_assignment PIN_AF13 -to SDRAM_DQMH
|
||||
|
||||
set_location_assignment PIN_AD20 -to SDRAM_CLK
|
||||
set_location_assignment PIN_AG10 -to SDRAM_CKE
|
||||
|
||||
set_location_assignment PIN_AA19 -to SDRAM_nWE
|
||||
set_location_assignment PIN_AA18 -to SDRAM_nCAS
|
||||
set_location_assignment PIN_Y18 -to SDRAM_nCS
|
||||
set_location_assignment PIN_W14 -to SDRAM_nRAS
|
||||
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SDRAM_*
|
||||
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_*
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A*
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA*
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[*]
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQM*
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_n*
|
||||
set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[*]
|
||||
set_instance_assignment -name ALLOW_SYNCH_CTRL_USAGE OFF -to *|SDRAM_*
|
||||
|
||||
#============================================================
|
||||
# I/O
|
||||
#============================================================
|
||||
set_location_assignment PIN_Y15 -to LED_USER
|
||||
set_location_assignment PIN_AA15 -to LED_HDD
|
||||
set_location_assignment PIN_AG28 -to LED_POWER
|
||||
|
||||
set_location_assignment PIN_AH24 -to BTN_USER
|
||||
set_location_assignment PIN_AG25 -to BTN_OSD
|
||||
set_location_assignment PIN_AG23 -to BTN_RESET
|
||||
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED_*
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to BTN_*
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to BTN_*
|
||||
|
||||
#============================================================
|
||||
# CLOCK
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to FPGA_CLK1_50
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to FPGA_CLK2_50
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to FPGA_CLK3_50
|
||||
set_location_assignment PIN_V11 -to FPGA_CLK1_50
|
||||
set_location_assignment PIN_Y13 -to FPGA_CLK2_50
|
||||
set_location_assignment PIN_E11 -to FPGA_CLK3_50
|
||||
|
||||
#============================================================
|
||||
# HDMI
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_I2C_SCL
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_I2C_SDA
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_I2S
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_LRCLK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_MCLK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_SCLK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_CLK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_DE
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[0]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[1]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[2]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[3]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[4]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[5]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[6]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[7]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[8]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[9]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[10]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[11]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[12]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[13]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[14]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[15]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[16]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[17]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[18]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[19]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[20]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[21]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[22]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[23]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_HS
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_INT
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_VS
|
||||
set_location_assignment PIN_U10 -to HDMI_I2C_SCL
|
||||
set_location_assignment PIN_AA4 -to HDMI_I2C_SDA
|
||||
set_location_assignment PIN_T13 -to HDMI_I2S
|
||||
set_location_assignment PIN_T11 -to HDMI_LRCLK
|
||||
set_location_assignment PIN_U11 -to HDMI_MCLK
|
||||
set_location_assignment PIN_T12 -to HDMI_SCLK
|
||||
set_location_assignment PIN_AG5 -to HDMI_TX_CLK
|
||||
set_location_assignment PIN_AD19 -to HDMI_TX_DE
|
||||
set_location_assignment PIN_AD12 -to HDMI_TX_D[0]
|
||||
set_location_assignment PIN_AE12 -to HDMI_TX_D[1]
|
||||
set_location_assignment PIN_W8 -to HDMI_TX_D[2]
|
||||
set_location_assignment PIN_Y8 -to HDMI_TX_D[3]
|
||||
set_location_assignment PIN_AD11 -to HDMI_TX_D[4]
|
||||
set_location_assignment PIN_AD10 -to HDMI_TX_D[5]
|
||||
set_location_assignment PIN_AE11 -to HDMI_TX_D[6]
|
||||
set_location_assignment PIN_Y5 -to HDMI_TX_D[7]
|
||||
set_location_assignment PIN_AF10 -to HDMI_TX_D[8]
|
||||
set_location_assignment PIN_Y4 -to HDMI_TX_D[9]
|
||||
set_location_assignment PIN_AE9 -to HDMI_TX_D[10]
|
||||
set_location_assignment PIN_AB4 -to HDMI_TX_D[11]
|
||||
set_location_assignment PIN_AE7 -to HDMI_TX_D[12]
|
||||
set_location_assignment PIN_AF6 -to HDMI_TX_D[13]
|
||||
set_location_assignment PIN_AF8 -to HDMI_TX_D[14]
|
||||
set_location_assignment PIN_AF5 -to HDMI_TX_D[15]
|
||||
set_location_assignment PIN_AE4 -to HDMI_TX_D[16]
|
||||
set_location_assignment PIN_AH2 -to HDMI_TX_D[17]
|
||||
set_location_assignment PIN_AH4 -to HDMI_TX_D[18]
|
||||
set_location_assignment PIN_AH5 -to HDMI_TX_D[19]
|
||||
set_location_assignment PIN_AH6 -to HDMI_TX_D[20]
|
||||
set_location_assignment PIN_AG6 -to HDMI_TX_D[21]
|
||||
set_location_assignment PIN_AF9 -to HDMI_TX_D[22]
|
||||
set_location_assignment PIN_AE8 -to HDMI_TX_D[23]
|
||||
set_location_assignment PIN_T8 -to HDMI_TX_HS
|
||||
set_location_assignment PIN_AF11 -to HDMI_TX_INT
|
||||
set_location_assignment PIN_V13 -to HDMI_TX_VS
|
||||
|
||||
#============================================================
|
||||
# KEY
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to KEY[0]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to KEY[1]
|
||||
set_location_assignment PIN_AH17 -to KEY[0]
|
||||
set_location_assignment PIN_AH16 -to KEY[1]
|
||||
|
||||
#============================================================
|
||||
# LED
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[0]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[1]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[2]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[3]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[4]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[5]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[6]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[7]
|
||||
set_location_assignment PIN_W15 -to LED[0]
|
||||
set_location_assignment PIN_AA24 -to LED[1]
|
||||
set_location_assignment PIN_V16 -to LED[2]
|
||||
set_location_assignment PIN_V15 -to LED[3]
|
||||
set_location_assignment PIN_AF26 -to LED[4]
|
||||
set_location_assignment PIN_AE26 -to LED[5]
|
||||
set_location_assignment PIN_Y16 -to LED[6]
|
||||
set_location_assignment PIN_AA23 -to LED[7]
|
||||
|
||||
#============================================================
|
||||
# SW
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SW[0]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SW[1]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SW[2]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SW[3]
|
||||
set_location_assignment PIN_Y24 -to SW[0]
|
||||
set_location_assignment PIN_W24 -to SW[1]
|
||||
set_location_assignment PIN_W21 -to SW[2]
|
||||
set_location_assignment PIN_W20 -to SW[3]
|
||||
|
||||
set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:sys/build_id.tcl"
|
||||
|
||||
set_global_assignment -name CDF_FILE jtag_lite.cdf
|
||||
set_global_assignment -name QIP_FILE sys/sys.qip
|
||||
set_global_assignment -name QIP_FILE sys/sysmem.qip
|
||||
set_global_assignment -name VERILOG_FILE scsi.v
|
||||
set_global_assignment -name VERILOG_FILE ncr5380.v
|
||||
set_global_assignment -name VERILOG_FILE floppy_track_encoder.v
|
||||
set_global_assignment -name VERILOG_FILE floppy.v
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE ps2_kbd.sv
|
||||
set_global_assignment -name VERILOG_FILE ps2_mouse.v
|
||||
set_global_assignment -name VHDL_FILE TG68K_Pack.vhd
|
||||
set_global_assignment -name VHDL_FILE TG68K_ALU.vhd
|
||||
set_global_assignment -name VHDL_FILE TG68KdotC_Kernel.vhd
|
||||
set_global_assignment -name VERILOG_FILE scc.v
|
||||
set_global_assignment -name VERILOG_FILE iwm.v
|
||||
set_global_assignment -name VERILOG_FILE via.v
|
||||
set_global_assignment -name VERILOG_FILE addrDecoder.v
|
||||
set_global_assignment -name VERILOG_FILE addrController_top.v
|
||||
set_global_assignment -name VERILOG_FILE dataController_top.v
|
||||
set_global_assignment -name VERILOG_FILE video.v
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE MacPlus.sv
|
||||
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
|
16
MacPlus-lite.srf
Normal file
16
MacPlus-lite.srf
Normal file
@ -0,0 +1,16 @@
|
||||
{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Synthesized away node \"emu:emu\|pll:pll\|pll_0002:pll_inst\|altera_pll:altera_pll_i\|outclk_wire\[2\]\"" { } { } 0 14320 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "RST port on the PLL is not properly connected on instance emu:emu\|pll:pll\|pll_0002:pll_inst\|altera_pll:altera_pll_i\|general\[1\].gpll. The reset port on the PLL should be connected. If the PLL loses lock for any reason, you might need to manually reset the PLL in order to re-establish lock to the reference clock." { } { } 0 0 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "RST port on the PLL is not properly connected on instance emu:emu\|pll:pll\|pll_0002:pll_inst\|altera_pll:altera_pll_i\|general\[0\].gpll. The reset port on the PLL should be connected. If the PLL loses lock for any reason, you might need to manually reset the PLL in order to re-establish lock to the reference clock." { } { } 0 0 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Ignored locations or region assignments to the following nodes" { } { } 0 15705 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "RST port on the PLL is not properly connected on instance emu:emu\|pll:pll\|pll_0002:pll_inst\|altera_pll:altera_pll_i\|general\[2\].gpll. The reset port on the PLL should be connected. If the PLL loses lock for any reason, you might need to manually reset the PLL in order to re-establish lock to the reference clock." { } { } 0 0 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(129): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(134): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "*" { } { } 0 21074 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "sysmem_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
32
MacPlus.qpf
Normal file
32
MacPlus.qpf
Normal file
@ -0,0 +1,32 @@
|
||||
# -------------------------------------------------------------------------- #
|
||||
#
|
||||
# Copyright (C) 2017 Intel Corporation. All rights reserved.
|
||||
# Your use of Intel Corporation's design tools, logic functions
|
||||
# and other software and tools, and its AMPP partner logic
|
||||
# functions, and any output files from any of the foregoing
|
||||
# (including device programming or simulation files), and any
|
||||
# associated documentation or information are expressly subject
|
||||
# to the terms and conditions of the Intel Program License
|
||||
# Subscription Agreement, the Intel Quartus Prime License Agreement,
|
||||
# the Intel MegaCore Function License Agreement, or other
|
||||
# applicable license agreement, including, without limitation,
|
||||
# that your use is for the sole purpose of programming logic
|
||||
# devices manufactured by Intel and sold by Intel or its
|
||||
# authorized distributors. Please refer to the applicable
|
||||
# agreement for further details.
|
||||
#
|
||||
# -------------------------------------------------------------------------- #
|
||||
#
|
||||
# Quartus Prime
|
||||
# Version 17.0.1 Build 598 06/07/2017 SJ Standard Edition
|
||||
# Date created = 04:04:47 October 16, 2017
|
||||
#
|
||||
# -------------------------------------------------------------------------- #
|
||||
|
||||
QUARTUS_VERSION = "17.0"
|
||||
DATE = "04:04:47 October 16, 2017"
|
||||
|
||||
# Revisions
|
||||
|
||||
PROJECT_REVISION = "MacPlus"
|
||||
PROJECT_REVISION = "MacPlus-lite"
|
374
MacPlus.qsf
Normal file
374
MacPlus.qsf
Normal file
@ -0,0 +1,374 @@
|
||||
# -------------------------------------------------------------------------- #
|
||||
#
|
||||
# Copyright (C) 2017 Intel Corporation. All rights reserved.
|
||||
# Your use of Intel Corporation's design tools, logic functions
|
||||
# and other software and tools, and its AMPP partner logic
|
||||
# functions, and any output files from any of the foregoing
|
||||
# (including device programming or simulation files), and any
|
||||
# associated documentation or information are expressly subject
|
||||
# to the terms and conditions of the Intel Program License
|
||||
# Subscription Agreement, the Intel Quartus Prime License Agreement,
|
||||
# the Intel MegaCore Function License Agreement, or other
|
||||
# applicable license agreement, including, without limitation,
|
||||
# that your use is for the sole purpose of programming logic
|
||||
# devices manufactured by Intel and sold by Intel or its
|
||||
# authorized distributors. Please refer to the applicable
|
||||
# agreement for further details.
|
||||
#
|
||||
# -------------------------------------------------------------------------- #
|
||||
#
|
||||
# Quartus Prime
|
||||
# Version 16.1.2 Build 203 01/18/2017 SJ Standard Edition
|
||||
# Date created = 01:53:32 April 20, 2017
|
||||
#
|
||||
# -------------------------------------------------------------------------- #
|
||||
|
||||
set_global_assignment -name FAMILY "Cyclone V"
|
||||
set_global_assignment -name DEVICE 5CSEBA6U23I7
|
||||
set_global_assignment -name TOP_LEVEL_ENTITY sys_top
|
||||
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 16.1.2
|
||||
set_global_assignment -name LAST_QUARTUS_VERSION "17.0.1 Standard Edition"
|
||||
set_global_assignment -name PROJECT_CREATION_TIME_DATE "01:53:30 APRIL 20, 2017"
|
||||
set_global_assignment -name DEVICE_FILTER_PACKAGE UFBGA
|
||||
set_global_assignment -name DEVICE_FILTER_PIN_COUNT 672
|
||||
set_global_assignment -name DEVICE_FILTER_SPEED_GRADE 7
|
||||
|
||||
set_global_assignment -name GENERATE_RBF_FILE ON
|
||||
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
|
||||
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
|
||||
set_global_assignment -name SAVE_DISK_SPACE OFF
|
||||
set_global_assignment -name SMART_RECOMPILE ON
|
||||
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
|
||||
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
|
||||
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
|
||||
set_global_assignment -name MIN_CORE_JUNCTION_TEMP "-40"
|
||||
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 100
|
||||
set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW"
|
||||
set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)"
|
||||
set_global_assignment -name TIMEQUEST_MULTICORNER_ANALYSIS OFF
|
||||
set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING OFF
|
||||
set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS
|
||||
set_global_assignment -name FITTER_EFFORT "STANDARD FIT"
|
||||
set_global_assignment -name OPTIMIZATION_MODE BALANCED
|
||||
set_global_assignment -name SEED 1
|
||||
|
||||
#============================================================
|
||||
# ADC
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ADC_CONVST
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ADC_SCK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ADC_SDI
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ADC_SDO
|
||||
set_location_assignment PIN_U9 -to ADC_CONVST
|
||||
set_location_assignment PIN_V10 -to ADC_SCK
|
||||
set_location_assignment PIN_AC4 -to ADC_SDI
|
||||
set_location_assignment PIN_AD4 -to ADC_SDO
|
||||
|
||||
#============================================================
|
||||
# ARDUINO
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[3]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[4]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[5]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[6]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[7]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[8]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[9]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[10]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[11]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[12]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[13]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[14]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to ARDUINO_IO[15]
|
||||
set_location_assignment PIN_AG9 -to ARDUINO_IO[3]
|
||||
set_location_assignment PIN_U14 -to ARDUINO_IO[4]
|
||||
set_location_assignment PIN_U13 -to ARDUINO_IO[5]
|
||||
set_location_assignment PIN_AG8 -to ARDUINO_IO[6]
|
||||
set_location_assignment PIN_AH8 -to ARDUINO_IO[7]
|
||||
set_location_assignment PIN_AF17 -to ARDUINO_IO[8]
|
||||
set_location_assignment PIN_AE15 -to ARDUINO_IO[9]
|
||||
set_location_assignment PIN_AF15 -to ARDUINO_IO[10]
|
||||
set_location_assignment PIN_AG16 -to ARDUINO_IO[11]
|
||||
set_location_assignment PIN_AH11 -to ARDUINO_IO[12]
|
||||
set_location_assignment PIN_AH12 -to ARDUINO_IO[13]
|
||||
set_location_assignment PIN_AH9 -to ARDUINO_IO[14]
|
||||
set_location_assignment PIN_AG11 -to ARDUINO_IO[15]
|
||||
|
||||
#============================================================
|
||||
# SDIO
|
||||
#============================================================
|
||||
set_location_assignment PIN_AF25 -to SDIO_DAT[0]
|
||||
set_location_assignment PIN_AF23 -to SDIO_DAT[1]
|
||||
set_location_assignment PIN_AD26 -to SDIO_DAT[2]
|
||||
set_location_assignment PIN_AF28 -to SDIO_DAT[3]
|
||||
set_location_assignment PIN_AF27 -to SDIO_CMD
|
||||
set_location_assignment PIN_AH26 -to SDIO_CLK
|
||||
set_location_assignment PIN_AH7 -to SDIO_CD
|
||||
|
||||
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDIO_*
|
||||
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SDIO_*
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SDIO_DAT[*]
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SDIO_CMD
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SDIO_CD
|
||||
|
||||
#============================================================
|
||||
# VGA
|
||||
#============================================================
|
||||
set_location_assignment PIN_AE17 -to VGA_R[0]
|
||||
set_location_assignment PIN_AE20 -to VGA_R[1]
|
||||
set_location_assignment PIN_AF20 -to VGA_R[2]
|
||||
set_location_assignment PIN_AH18 -to VGA_R[3]
|
||||
set_location_assignment PIN_AH19 -to VGA_R[4]
|
||||
set_location_assignment PIN_AF21 -to VGA_R[5]
|
||||
|
||||
set_location_assignment PIN_AE19 -to VGA_G[0]
|
||||
set_location_assignment PIN_AG15 -to VGA_G[1]
|
||||
set_location_assignment PIN_AF18 -to VGA_G[2]
|
||||
set_location_assignment PIN_AG18 -to VGA_G[3]
|
||||
set_location_assignment PIN_AG19 -to VGA_G[4]
|
||||
set_location_assignment PIN_AG20 -to VGA_G[5]
|
||||
|
||||
set_location_assignment PIN_AG21 -to VGA_B[0]
|
||||
set_location_assignment PIN_AA20 -to VGA_B[1]
|
||||
set_location_assignment PIN_AE22 -to VGA_B[2]
|
||||
set_location_assignment PIN_AF22 -to VGA_B[3]
|
||||
set_location_assignment PIN_AH23 -to VGA_B[4]
|
||||
set_location_assignment PIN_AH21 -to VGA_B[5]
|
||||
|
||||
set_location_assignment PIN_AH22 -to VGA_HS
|
||||
set_location_assignment PIN_AG24 -to VGA_VS
|
||||
|
||||
set_location_assignment PIN_AH27 -to VGA_EN
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to VGA_EN
|
||||
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to VGA_*
|
||||
set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to VGA_*
|
||||
|
||||
#============================================================
|
||||
# AUDIO
|
||||
#============================================================
|
||||
set_location_assignment PIN_AC24 -to AUDIO_L
|
||||
set_location_assignment PIN_AE25 -to AUDIO_R
|
||||
set_location_assignment PIN_AG26 -to AUDIO_SPDIF
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to AUDIO_*
|
||||
set_instance_assignment -name CURRENT_STRENGTH_NEW 8MA -to AUDIO_*
|
||||
|
||||
#============================================================
|
||||
# SDRAM
|
||||
#============================================================
|
||||
set_location_assignment PIN_Y11 -to SDRAM_A[0]
|
||||
set_location_assignment PIN_AA26 -to SDRAM_A[1]
|
||||
set_location_assignment PIN_AA13 -to SDRAM_A[2]
|
||||
set_location_assignment PIN_AA11 -to SDRAM_A[3]
|
||||
set_location_assignment PIN_W11 -to SDRAM_A[4]
|
||||
set_location_assignment PIN_Y19 -to SDRAM_A[5]
|
||||
set_location_assignment PIN_AB23 -to SDRAM_A[6]
|
||||
set_location_assignment PIN_AC23 -to SDRAM_A[7]
|
||||
set_location_assignment PIN_AC22 -to SDRAM_A[8]
|
||||
set_location_assignment PIN_C12 -to SDRAM_A[9]
|
||||
set_location_assignment PIN_AB26 -to SDRAM_A[10]
|
||||
set_location_assignment PIN_AD17 -to SDRAM_A[11]
|
||||
set_location_assignment PIN_D12 -to SDRAM_A[12]
|
||||
set_location_assignment PIN_Y17 -to SDRAM_BA[0]
|
||||
set_location_assignment PIN_AB25 -to SDRAM_BA[1]
|
||||
|
||||
set_location_assignment PIN_E8 -to SDRAM_DQ[0]
|
||||
set_location_assignment PIN_V12 -to SDRAM_DQ[1]
|
||||
set_location_assignment PIN_D11 -to SDRAM_DQ[2]
|
||||
set_location_assignment PIN_W12 -to SDRAM_DQ[3]
|
||||
set_location_assignment PIN_AH13 -to SDRAM_DQ[4]
|
||||
set_location_assignment PIN_D8 -to SDRAM_DQ[5]
|
||||
set_location_assignment PIN_AH14 -to SDRAM_DQ[6]
|
||||
set_location_assignment PIN_AF7 -to SDRAM_DQ[7]
|
||||
set_location_assignment PIN_AE24 -to SDRAM_DQ[8]
|
||||
set_location_assignment PIN_AD23 -to SDRAM_DQ[9]
|
||||
set_location_assignment PIN_AE6 -to SDRAM_DQ[10]
|
||||
set_location_assignment PIN_AE23 -to SDRAM_DQ[11]
|
||||
set_location_assignment PIN_AG14 -to SDRAM_DQ[12]
|
||||
set_location_assignment PIN_AD5 -to SDRAM_DQ[13]
|
||||
set_location_assignment PIN_AF4 -to SDRAM_DQ[14]
|
||||
set_location_assignment PIN_AH3 -to SDRAM_DQ[15]
|
||||
set_location_assignment PIN_AG13 -to SDRAM_DQML
|
||||
set_location_assignment PIN_AF13 -to SDRAM_DQMH
|
||||
|
||||
set_location_assignment PIN_AD20 -to SDRAM_CLK
|
||||
set_location_assignment PIN_AG10 -to SDRAM_CKE
|
||||
|
||||
set_location_assignment PIN_AA19 -to SDRAM_nWE
|
||||
set_location_assignment PIN_AA18 -to SDRAM_nCAS
|
||||
set_location_assignment PIN_Y18 -to SDRAM_nCS
|
||||
set_location_assignment PIN_W14 -to SDRAM_nRAS
|
||||
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SDRAM_*
|
||||
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SDRAM_*
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_A*
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_BA*
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQ[*]
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_DQM*
|
||||
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to SDRAM_n*
|
||||
set_instance_assignment -name FAST_OUTPUT_ENABLE_REGISTER ON -to SDRAM_DQ[*]
|
||||
set_instance_assignment -name ALLOW_SYNCH_CTRL_USAGE OFF -to *|SDRAM_*
|
||||
|
||||
#============================================================
|
||||
# I/O
|
||||
#============================================================
|
||||
set_location_assignment PIN_Y15 -to LED_USER
|
||||
set_location_assignment PIN_AA15 -to LED_HDD
|
||||
set_location_assignment PIN_AG28 -to LED_POWER
|
||||
|
||||
set_location_assignment PIN_AH24 -to BTN_USER
|
||||
set_location_assignment PIN_AG25 -to BTN_OSD
|
||||
set_location_assignment PIN_AG23 -to BTN_RESET
|
||||
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED_*
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to BTN_*
|
||||
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to BTN_*
|
||||
|
||||
#============================================================
|
||||
# CLOCK
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to FPGA_CLK1_50
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to FPGA_CLK2_50
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to FPGA_CLK3_50
|
||||
set_location_assignment PIN_V11 -to FPGA_CLK1_50
|
||||
set_location_assignment PIN_Y13 -to FPGA_CLK2_50
|
||||
set_location_assignment PIN_E11 -to FPGA_CLK3_50
|
||||
|
||||
#============================================================
|
||||
# HDMI
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_I2C_SCL
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_I2C_SDA
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_I2S
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_LRCLK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_MCLK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_SCLK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_CLK
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_DE
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[0]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[1]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[2]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[3]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[4]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[5]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[6]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[7]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[8]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[9]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[10]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[11]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[12]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[13]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[14]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[15]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[16]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[17]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[18]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[19]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[20]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[21]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[22]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_D[23]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_HS
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_INT
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to HDMI_TX_VS
|
||||
set_location_assignment PIN_U10 -to HDMI_I2C_SCL
|
||||
set_location_assignment PIN_AA4 -to HDMI_I2C_SDA
|
||||
set_location_assignment PIN_T13 -to HDMI_I2S
|
||||
set_location_assignment PIN_T11 -to HDMI_LRCLK
|
||||
set_location_assignment PIN_U11 -to HDMI_MCLK
|
||||
set_location_assignment PIN_T12 -to HDMI_SCLK
|
||||
set_location_assignment PIN_AG5 -to HDMI_TX_CLK
|
||||
set_location_assignment PIN_AD19 -to HDMI_TX_DE
|
||||
set_location_assignment PIN_AD12 -to HDMI_TX_D[0]
|
||||
set_location_assignment PIN_AE12 -to HDMI_TX_D[1]
|
||||
set_location_assignment PIN_W8 -to HDMI_TX_D[2]
|
||||
set_location_assignment PIN_Y8 -to HDMI_TX_D[3]
|
||||
set_location_assignment PIN_AD11 -to HDMI_TX_D[4]
|
||||
set_location_assignment PIN_AD10 -to HDMI_TX_D[5]
|
||||
set_location_assignment PIN_AE11 -to HDMI_TX_D[6]
|
||||
set_location_assignment PIN_Y5 -to HDMI_TX_D[7]
|
||||
set_location_assignment PIN_AF10 -to HDMI_TX_D[8]
|
||||
set_location_assignment PIN_Y4 -to HDMI_TX_D[9]
|
||||
set_location_assignment PIN_AE9 -to HDMI_TX_D[10]
|
||||
set_location_assignment PIN_AB4 -to HDMI_TX_D[11]
|
||||
set_location_assignment PIN_AE7 -to HDMI_TX_D[12]
|
||||
set_location_assignment PIN_AF6 -to HDMI_TX_D[13]
|
||||
set_location_assignment PIN_AF8 -to HDMI_TX_D[14]
|
||||
set_location_assignment PIN_AF5 -to HDMI_TX_D[15]
|
||||
set_location_assignment PIN_AE4 -to HDMI_TX_D[16]
|
||||
set_location_assignment PIN_AH2 -to HDMI_TX_D[17]
|
||||
set_location_assignment PIN_AH4 -to HDMI_TX_D[18]
|
||||
set_location_assignment PIN_AH5 -to HDMI_TX_D[19]
|
||||
set_location_assignment PIN_AH6 -to HDMI_TX_D[20]
|
||||
set_location_assignment PIN_AG6 -to HDMI_TX_D[21]
|
||||
set_location_assignment PIN_AF9 -to HDMI_TX_D[22]
|
||||
set_location_assignment PIN_AE8 -to HDMI_TX_D[23]
|
||||
set_location_assignment PIN_T8 -to HDMI_TX_HS
|
||||
set_location_assignment PIN_AF11 -to HDMI_TX_INT
|
||||
set_location_assignment PIN_V13 -to HDMI_TX_VS
|
||||
|
||||
#============================================================
|
||||
# KEY
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to KEY[0]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to KEY[1]
|
||||
set_location_assignment PIN_AH17 -to KEY[0]
|
||||
set_location_assignment PIN_AH16 -to KEY[1]
|
||||
|
||||
#============================================================
|
||||
# LED
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[0]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[1]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[2]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[3]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[4]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[5]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[6]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to LED[7]
|
||||
set_location_assignment PIN_W15 -to LED[0]
|
||||
set_location_assignment PIN_AA24 -to LED[1]
|
||||
set_location_assignment PIN_V16 -to LED[2]
|
||||
set_location_assignment PIN_V15 -to LED[3]
|
||||
set_location_assignment PIN_AF26 -to LED[4]
|
||||
set_location_assignment PIN_AE26 -to LED[5]
|
||||
set_location_assignment PIN_Y16 -to LED[6]
|
||||
set_location_assignment PIN_AA23 -to LED[7]
|
||||
|
||||
#============================================================
|
||||
# SW
|
||||
#============================================================
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SW[0]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SW[1]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SW[2]
|
||||
set_instance_assignment -name IO_STANDARD "3.3-V LVTTL" -to SW[3]
|
||||
set_location_assignment PIN_Y24 -to SW[0]
|
||||
set_location_assignment PIN_W24 -to SW[1]
|
||||
set_location_assignment PIN_W21 -to SW[2]
|
||||
set_location_assignment PIN_W20 -to SW[3]
|
||||
|
||||
set_global_assignment -name PRE_FLOW_SCRIPT_FILE "quartus_sh:sys/build_id.tcl"
|
||||
|
||||
set_global_assignment -name CDF_FILE jtag.cdf
|
||||
set_global_assignment -name QIP_FILE sys/sys.qip
|
||||
set_global_assignment -name QIP_FILE sys/vip.qip
|
||||
set_global_assignment -name VERILOG_FILE scsi.v
|
||||
set_global_assignment -name VERILOG_FILE ncr5380.v
|
||||
set_global_assignment -name VERILOG_FILE floppy_track_encoder.v
|
||||
set_global_assignment -name VERILOG_FILE floppy.v
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE ps2_kbd.sv
|
||||
set_global_assignment -name VERILOG_FILE ps2_mouse.v
|
||||
set_global_assignment -name VHDL_FILE TG68K_Pack.vhd
|
||||
set_global_assignment -name VHDL_FILE TG68K_ALU.vhd
|
||||
set_global_assignment -name VHDL_FILE TG68KdotC_Kernel.vhd
|
||||
set_global_assignment -name VERILOG_FILE scc.v
|
||||
set_global_assignment -name VERILOG_FILE iwm.v
|
||||
set_global_assignment -name VERILOG_FILE via.v
|
||||
set_global_assignment -name VERILOG_FILE addrDecoder.v
|
||||
set_global_assignment -name VERILOG_FILE addrController_top.v
|
||||
set_global_assignment -name VERILOG_FILE dataController_top.v
|
||||
set_global_assignment -name VERILOG_FILE video.v
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE MacPlus.sv
|
||||
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
|
51
MacPlus.srf
Normal file
51
MacPlus.srf
Normal file
@ -0,0 +1,51 @@
|
||||
{ "" "" "" "Variable or input pin \"data_b\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Found combinational loop of 47 nodes" { } { } 0 332125 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "LOCKED port on the PLL is not properly connected on instance \"pll_hdmi:pll_hdmi\|pll_hdmi_0002:pll_hdmi_inst\|altera_pll:altera_pll_i\|general\[0\].gpll\". The LOCKED port on the PLL should be connected when the FBOUTCLK port is connected. Although it is unnecessary to connect the LOCKED signal, any logic driven off of an output clock of the PLL will not know when the PLL is locked and ready." { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Net \"soc_system:soc_system\|soc_system_Video_Output:video_output\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1\[1\]\" is missing source, defaulting to GND" { } { } 0 12110 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Inferred RAM node \"zxspectrum:emu\|mist_io:mist_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|h_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_h_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|v_sync_polarity_reg\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_v_sync_polarity\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "No destination clock period was found satisfying the set_net_delay assignment from \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|interlaced_field_reg\[*\]\}\]\" to \"\[get_keepers \{soc_system\|video_output\|cvo_core\|mode_banks\|vid_interlaced_field\[*\]\}\]\". This assignment will be ignored." { } { } 0 17897 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details" { } { } 0 15714 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "55 hierarchies have connectivity warnings - see the Connectivity Checks report folder" { } { } 0 12241 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_kbd_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Inferred RAM node \"emu:emu\|mister_io:mister_io\|ps2_mouse_fifo_rtl_0\" from synchronous design logic. Pass-through logic has been added to match the read-during-write behavior of the original design." { } { } 0 276020 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(97): object \"io_win\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Verilog HDL or VHDL warning at de10_top.v(102): object \"io_sdd\" assigned a value but never read" { } { } 0 10036 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Overwriting existing clock: vip\|hps\|fpga_interfaces\|clocks_resets\|h2f_user0_clk" { } { } 0 332043 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "Variable or input pin \"data_a\" is defined but never used." { } { } 0 287013 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "*" { } { } 0 169085 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "*" { } { } 0 174073 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "*" { } { } 0 332174 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "*" { } { } 0 13009 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "*" { } { } 0 21300 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "alt_vip_cvo_mode_banks" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "hps_sdram_pll.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "alt_vip_common_frame_counter.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "hps_sdram_p0_acv_hard_memphy.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "hps_sdram_p0_acv_ldc.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "hps_sdram_p0_acv_hard_io_pads.v" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "altera_mem_if_hard_memory_controller_top_cyclonev.sv" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "genlock_enable_sync" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "u_calculate_mode" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "genlock_enable" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "reset_value" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "soc_system:soc_system\|soc_system_pll_video:pll_video\|altera_pll:altera_pll_i\|general\[0\].gpll" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "alt_vip_cvo_core.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "alt_vip_packet_transfer.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "hps_sdram_p0.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "alt_vip_common_dc_mixed_widths_fifo.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "altera_mem_if_hhp_qseq_synth_top" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "soc_system:soc_system\|soc_system_vip_vout:vip_vout\|alt_vip_cvo_core:cvo_core\|genlock_enable_sync1" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "soc_system:soc_system\|soc_system_vip_fb:vip_fb\|alt_vip_packet_transfer:pkt_trans_rd\|alt_vip_packet_transfer_read_proc:READ_BLOCK.read_proc_instance\|alt_vip_common_fifo2:output_msg_queue\|scfifo:scfifo_component\|scfifo_scd1:auto_generated\|a_dpfifo_e471:dpfifo\|altsyncram_ums1:FIFOram\|q_b" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "soc_system:soc_system\|soc_system_Video_Input:video_input\|alt_vip_cvi_core:cvi_core\|alt_vip_cvi_write_fifo_buffer:write_fifo_buffer" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "soc_system:soc_system\|soc_system_Frame_Buffer:frame_buffer\|alt_vip_packet_transfer:pkt_trans_rd" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "soc_system_hps_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "soc_system_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "RST" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "alt_vip_scaler_alg_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "cvo_core" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "vip_HPS_fpga_interfaces.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "alt_vip_dil_vof_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
||||
{ "" "" "" "alt_vip_dil_scheduler.sdc" { } { } 0 9999 "" 0 0 "Design Software" 0 -1 0 ""}
|
574
MacPlus.sv
Normal file
574
MacPlus.sv
Normal file
@ -0,0 +1,574 @@
|
||||
//============================================================================
|
||||
// Macintosh Plus
|
||||
//
|
||||
// Port to MiSTer
|
||||
// Copyright (C) 2017 Sorgelig
|
||||
//
|
||||
// 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 2 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, write to the Free Software Foundation, Inc.,
|
||||
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
//============================================================================
|
||||
|
||||
module emu
|
||||
(
|
||||
//Master input clock
|
||||
input CLK_50M,
|
||||
|
||||
//Async reset from top-level module.
|
||||
//Can be used as initial reset.
|
||||
input RESET,
|
||||
|
||||
//Must be passed to hps_io module
|
||||
inout [43:0] HPS_BUS,
|
||||
|
||||
//Base video clock. Usually equals to CLK_SYS.
|
||||
output CLK_VIDEO,
|
||||
|
||||
//Multiple resolutions are supported using different CE_PIXEL rates.
|
||||
//Must be based on CLK_VIDEO
|
||||
output CE_PIXEL,
|
||||
|
||||
//Video aspect ratio for HDMI. Most retro systems have ratio 4:3.
|
||||
output [7:0] VIDEO_ARX,
|
||||
output [7:0] VIDEO_ARY,
|
||||
|
||||
output [7:0] VGA_R,
|
||||
output [7:0] VGA_G,
|
||||
output [7:0] VGA_B,
|
||||
output VGA_HS,
|
||||
output VGA_VS,
|
||||
output VGA_DE, // = ~(VBlank | HBlank)
|
||||
|
||||
output LED_USER, // 1 - ON, 0 - OFF.
|
||||
|
||||
// b[1]: 0 - LED status is system status ORed with b[0]
|
||||
// 1 - LED status is controled solely by b[0]
|
||||
// hint: supply 2'b00 to let the system control the LED.
|
||||
output [1:0] LED_POWER,
|
||||
output [1:0] LED_DISK,
|
||||
|
||||
output [15:0] AUDIO_L,
|
||||
output [15:0] AUDIO_R,
|
||||
output AUDIO_S, // 1 - signed audio samples, 0 - unsigned
|
||||
input TAPE_IN,
|
||||
|
||||
// SD-SPI
|
||||
output SD_SCK,
|
||||
output SD_MOSI,
|
||||
input SD_MISO,
|
||||
output SD_CS,
|
||||
|
||||
//High latency DDR3 RAM interface
|
||||
//Use for non-critical time purposes
|
||||
output DDRAM_CLK,
|
||||
input DDRAM_BUSY,
|
||||
output [7:0] DDRAM_BURSTCNT,
|
||||
output [28:0] DDRAM_ADDR,
|
||||
input [63:0] DDRAM_DOUT,
|
||||
input DDRAM_DOUT_READY,
|
||||
output DDRAM_RD,
|
||||
output [63:0] DDRAM_DIN,
|
||||
output [7:0] DDRAM_BE,
|
||||
output DDRAM_WE,
|
||||
|
||||
//SDRAM interface with lower latency
|
||||
output SDRAM_CLK,
|
||||
output SDRAM_CKE,
|
||||
output [12:0] SDRAM_A,
|
||||
output [1:0] SDRAM_BA,
|
||||
inout [15:0] SDRAM_DQ,
|
||||
output SDRAM_DQML,
|
||||
output SDRAM_DQMH,
|
||||
output SDRAM_nCS,
|
||||
output SDRAM_nCAS,
|
||||
output SDRAM_nRAS,
|
||||
output SDRAM_nWE
|
||||
);
|
||||
|
||||
assign {DDRAM_CLK, DDRAM_BURSTCNT, DDRAM_ADDR, DDRAM_DIN, DDRAM_BE, DDRAM_RD, DDRAM_WE} = 0;
|
||||
assign {SD_SCK, SD_MOSI, SD_CS} = 'Z;
|
||||
|
||||
assign LED_USER = dio_download || (disk_act ^ |diskMotor);
|
||||
assign LED_DISK = 0;
|
||||
assign LED_POWER = 0;
|
||||
|
||||
assign VIDEO_ARX = status[8] ? 8'd16 : 8'd4;
|
||||
assign VIDEO_ARY = status[8] ? 8'd9 : 8'd3;
|
||||
|
||||
`include "build_id.v"
|
||||
localparam CONF_STR = {
|
||||
"MACPLUS;;",
|
||||
"-;",
|
||||
"F,DSK;",
|
||||
"F,DSK;",
|
||||
"S,VHD;",
|
||||
"-;",
|
||||
"O8,Aspect ratio,4:3,16:9;",
|
||||
"-;",
|
||||
"O9A,Memory,512KB,1MB,4MB;",
|
||||
"O5,Speed,Normal,Turbo;",
|
||||
"-;",
|
||||
"T6,Reset;",
|
||||
"V,v1.00.",`BUILD_DATE
|
||||
};
|
||||
|
||||
//////////////////// CLOCKS ///////////////////
|
||||
|
||||
wire clk_sys;
|
||||
wire pll_locked;
|
||||
|
||||
pll pll
|
||||
(
|
||||
.refclk(CLK_50M),
|
||||
.rst(0),
|
||||
.outclk_0(clk_sys),
|
||||
.outclk_1(SDRAM_CLK),
|
||||
.locked(pll_locked)
|
||||
);
|
||||
|
||||
wire cep = (stage == 0);
|
||||
wire cen = (stage == 4);
|
||||
wire cel = (stage == 7);
|
||||
wire cepix = !stage[1:0];
|
||||
|
||||
reg [2:0] stage;
|
||||
always @(negedge clk_sys) stage <= stage + 1'd1;
|
||||
|
||||
///////////////////////////////////////////////////
|
||||
|
||||
// interconnects
|
||||
// CPU
|
||||
wire _cpuReset, _cpuResetOut, _cpuUDS, _cpuLDS, _cpuRW;
|
||||
wire [2:0] _cpuIPL;
|
||||
wire [7:0] cpuAddrHi;
|
||||
wire [23:0] cpuAddr;
|
||||
wire [15:0] cpuDataOut;
|
||||
|
||||
// RAM/ROM
|
||||
wire _romOE;
|
||||
wire _ramOE, _ramWE;
|
||||
wire _memoryUDS, _memoryLDS;
|
||||
wire videoBusControl;
|
||||
wire dioBusControl;
|
||||
wire cpuBusControl;
|
||||
wire [21:0] memoryAddr;
|
||||
wire [15:0] memoryDataOut;
|
||||
|
||||
// peripherals
|
||||
wire memoryOverlayOn, selectSCSI, selectSCC, selectIWM, selectVIA;
|
||||
wire [15:0] dataControllerDataOut;
|
||||
|
||||
// audio
|
||||
wire snd_alt;
|
||||
wire loadSound;
|
||||
|
||||
// floppy disk image interface
|
||||
wire dskReadAckInt;
|
||||
wire [21:0] dskReadAddrInt;
|
||||
wire dskReadAckExt;
|
||||
wire [21:0] dskReadAddrExt;
|
||||
wire [1:0] diskMotor, diskAct, diskEject;
|
||||
|
||||
// the status register is controlled by the on screen display (OSD)
|
||||
wire [31:0] status;
|
||||
wire [1:0] buttons;
|
||||
wire [31:0] sd_lba;
|
||||
wire sd_rd;
|
||||
wire sd_wr;
|
||||
wire sd_ack;
|
||||
wire [8:0] sd_buff_addr;
|
||||
wire [7:0] sd_buff_dout;
|
||||
wire [7:0] sd_buff_din;
|
||||
wire sd_buff_wr;
|
||||
|
||||
wire ioctl_wr;
|
||||
reg ioctl_wait = 0;
|
||||
|
||||
wire [64:0] ps2_key;
|
||||
wire [24:0] ps2_mouse;
|
||||
wire capslock;
|
||||
|
||||
hps_io #(.STRLEN($size(CONF_STR)>>3)) hps_io
|
||||
(
|
||||
.clk_sys(clk_sys),
|
||||
.HPS_BUS(HPS_BUS),
|
||||
|
||||
.conf_str(CONF_STR),
|
||||
|
||||
.buttons(buttons),
|
||||
.status(status),
|
||||
|
||||
.sd_lba(sd_lba),
|
||||
.sd_rd(sd_rd),
|
||||
.sd_wr(sd_wr),
|
||||
.sd_ack(sd_ack),
|
||||
|
||||
.sd_conf(0),
|
||||
.sd_buff_addr(sd_buff_addr),
|
||||
.sd_buff_dout(sd_buff_dout),
|
||||
.sd_buff_din(sd_buff_din),
|
||||
.sd_buff_wr(sd_buff_wr),
|
||||
|
||||
.ioctl_download(dio_download),
|
||||
.ioctl_index(dio_index),
|
||||
.ioctl_wr(ioctl_wr),
|
||||
.ioctl_addr(dio_addr),
|
||||
.ioctl_dout(dio_data),
|
||||
|
||||
.ioctl_wait(ioctl_wait),
|
||||
|
||||
.ps2_key(ps2_key),
|
||||
.ps2_kbd_led_use(3'b001),
|
||||
.ps2_kbd_led_status({2'b00, capslock}),
|
||||
|
||||
.ps2_mouse(ps2_mouse)
|
||||
);
|
||||
|
||||
wire [1:0] cpu_busstate;
|
||||
wire cpu_clkena = cep && (cpuBusControl || (cpu_busstate == 2'b01));
|
||||
reg [15:0] cpuDataIn;
|
||||
always @(posedge clk_sys) if(cel && cpuBusControl && ~cpu_busstate[0] && _cpuRW) cpuDataIn <= dataControllerDataOut;
|
||||
|
||||
TG68KdotC_Kernel #(0,0,0,0,0,0) m68k
|
||||
(
|
||||
.clk ( clk_sys ),
|
||||
.nReset ( _cpuReset ),
|
||||
.clkena_in ( cpu_clkena ),
|
||||
.data_in ( cpuDataIn ),
|
||||
.IPL ( _cpuIPL ),
|
||||
.IPL_autovector ( 1'b1 ),
|
||||
.berr ( 1'b0 ),
|
||||
.clr_berr ( 1'b0 ),
|
||||
.CPU ( 2'b00 ), // 00=68000
|
||||
.addr ( {cpuAddrHi, cpuAddr} ),
|
||||
.data_write ( cpuDataOut ),
|
||||
.nUDS ( _cpuUDS ),
|
||||
.nLDS ( _cpuLDS ),
|
||||
.nWr ( _cpuRW ),
|
||||
.busstate ( cpu_busstate ), // 00-> fetch code 10->read data 11->write data 01->no memaccess
|
||||
.nResetOut ( _cpuResetOut ),
|
||||
.FC ( )
|
||||
);
|
||||
|
||||
assign VGA_R = {8{pixelOut}};
|
||||
assign VGA_G = {8{pixelOut}};
|
||||
assign VGA_B = {8{pixelOut}};
|
||||
assign CLK_VIDEO = clk_sys;
|
||||
assign CE_PIXEL = cepix;
|
||||
|
||||
wire screenWrite;
|
||||
always @(*) begin
|
||||
case(configRAMSize)
|
||||
0: screenWrite = ~_ramWE && &memoryAddr[16:15]; // 01A700 (018000)
|
||||
1: screenWrite = ~_ramWE && &memoryAddr[18:15]; // 07A700 (078000)
|
||||
2: screenWrite = ~_ramWE && &memoryAddr[19:15]; // 0FA700 (0F8000)
|
||||
3: screenWrite = ~_ramWE && &memoryAddr[21:15]; // 3FA700 (3F8000)
|
||||
endcase
|
||||
end
|
||||
|
||||
wire pixelOut, _hblank, _vblank;
|
||||
video video
|
||||
(
|
||||
.clk(clk_sys),
|
||||
.ce(cepix),
|
||||
|
||||
.addr(cpuAddr[15:1]),
|
||||
.dataIn(cpuDataOut),
|
||||
.wr({~_cpuUDS & screenWrite, ~_cpuLDS & screenWrite}),
|
||||
|
||||
._hblank(_hblank),
|
||||
._vblank(_vblank),
|
||||
|
||||
.hsync(VGA_HS),
|
||||
.vsync(VGA_VS),
|
||||
.video_en(VGA_DE),
|
||||
.pixelOut(pixelOut)
|
||||
);
|
||||
|
||||
wire [10:0] audio;
|
||||
assign AUDIO_L = {audio[10:0], 5'b00000};
|
||||
assign AUDIO_R = {audio[10:0], 5'b00000};
|
||||
assign AUDIO_S = 0;
|
||||
|
||||
wire status_turbo = status[5];
|
||||
wire status_reset = status[6];
|
||||
|
||||
wire [1:0] status_mem = status[10:9]; // 128KB, 512KB, 1MB, 4MB
|
||||
reg [1:0] configRAMSize= 3;
|
||||
|
||||
reg n_reset = 0;
|
||||
always @(posedge clk_sys) begin
|
||||
reg [15:0] rst_cnt;
|
||||
|
||||
// various sources can reset the mac
|
||||
if(!pll_locked || status[0] || status_reset || buttons[1] || RESET || ~_cpuResetOut) begin
|
||||
rst_cnt <= '1;
|
||||
n_reset <= 0;
|
||||
end else if(rst_cnt) begin
|
||||
if(cen) rst_cnt <= rst_cnt - 1'd1;
|
||||
configRAMSize <= status_mem + 1'd1;
|
||||
end else n_reset <= 1;
|
||||
end
|
||||
|
||||
addrController_top ac0
|
||||
(
|
||||
.clk(clk_sys),
|
||||
.cep(cep),
|
||||
.cen(cen),
|
||||
|
||||
.cpuAddr(cpuAddr),
|
||||
._cpuUDS(_cpuUDS),
|
||||
._cpuLDS(_cpuLDS),
|
||||
._cpuRW(_cpuRW),
|
||||
.turbo(real_turbo),
|
||||
.configROMSize(1), // 128KB
|
||||
.configRAMSize(configRAMSize),
|
||||
.memoryAddr(memoryAddr),
|
||||
._memoryUDS(_memoryUDS),
|
||||
._memoryLDS(_memoryLDS),
|
||||
._romOE(_romOE),
|
||||
._ramOE(_ramOE),
|
||||
._ramWE(_ramWE),
|
||||
.dioBusControl(dioBusControl),
|
||||
.cpuBusControl(cpuBusControl),
|
||||
.selectSCSI(selectSCSI),
|
||||
.selectSCC(selectSCC),
|
||||
.selectIWM(selectIWM),
|
||||
.selectVIA(selectVIA),
|
||||
._vblank(_vblank),
|
||||
._hblank(_hblank),
|
||||
.memoryOverlayOn(memoryOverlayOn),
|
||||
|
||||
.snd_alt(snd_alt),
|
||||
.loadSound(loadSound),
|
||||
|
||||
.dskReadAddrInt(dskReadAddrInt),
|
||||
.dskReadAckInt(dskReadAckInt),
|
||||
.dskReadAddrExt(dskReadAddrExt),
|
||||
.dskReadAckExt(dskReadAckExt)
|
||||
);
|
||||
|
||||
dataController_top dc0
|
||||
(
|
||||
.clk(clk_sys),
|
||||
.cep(cep),
|
||||
.cen(cen),
|
||||
|
||||
._systemReset(n_reset),
|
||||
._cpuReset(_cpuReset),
|
||||
._cpuIPL(_cpuIPL),
|
||||
._cpuUDS(_cpuUDS),
|
||||
._cpuLDS(_cpuLDS),
|
||||
._cpuRW(_cpuRW),
|
||||
.cpuDataIn(cpuDataOut),
|
||||
.cpuDataOut(dataControllerDataOut),
|
||||
.cpuAddrRegHi(cpuAddr[12:9]),
|
||||
.cpuAddrRegMid(cpuAddr[6:4]), // for SCSI
|
||||
.cpuAddrRegLo(cpuAddr[2:1]),
|
||||
.selectSCSI(selectSCSI),
|
||||
.selectSCC(selectSCC),
|
||||
.selectIWM(selectIWM),
|
||||
.selectVIA(selectVIA),
|
||||
.cpuBusControl(cpuBusControl),
|
||||
.memoryDataOut(memoryDataOut),
|
||||
.memoryDataIn(sdram_do),
|
||||
|
||||
// peripherals
|
||||
.ps2_key(ps2_key),
|
||||
.capslock(capslock),
|
||||
.ps2_mouse(ps2_mouse),
|
||||
.serialIn(0),
|
||||
|
||||
// video
|
||||
._hblank(_hblank),
|
||||
._vblank(_vblank),
|
||||
|
||||
.memoryOverlayOn(memoryOverlayOn),
|
||||
|
||||
.audioOut(audio),
|
||||
.snd_alt(snd_alt),
|
||||
.loadSound(loadSound),
|
||||
|
||||
// floppy disk interface
|
||||
.insertDisk({dsk_ext_ins, dsk_int_ins}),
|
||||
.diskSides({dsk_ext_ds, dsk_int_ds}),
|
||||
.diskEject(diskEject),
|
||||
.dskReadAddrInt(dskReadAddrInt),
|
||||
.dskReadAckInt(dskReadAckInt),
|
||||
.dskReadAddrExt(dskReadAddrExt),
|
||||
.dskReadAckExt(dskReadAckExt),
|
||||
|
||||
.diskMotor(diskMotor),
|
||||
.diskAct(diskAct),
|
||||
|
||||
// block device interface for scsi disk
|
||||
.io_lba(sd_lba),
|
||||
.io_rd(sd_rd),
|
||||
.io_wr(sd_wr),
|
||||
.io_ack(sd_ack),
|
||||
|
||||
.sd_buff_addr(sd_buff_addr),
|
||||
.sd_buff_dout(sd_buff_dout),
|
||||
.sd_buff_din(sd_buff_din),
|
||||
.sd_buff_wr(sd_buff_wr)
|
||||
);
|
||||
|
||||
reg disk_act;
|
||||
always @(posedge clk_sys) begin
|
||||
integer timeout = 0;
|
||||
|
||||
if(timeout) begin
|
||||
timeout <= timeout - 1;
|
||||
disk_act <= 1;
|
||||
end else begin
|
||||
disk_act <= 0;
|
||||
end
|
||||
|
||||
if(|diskAct) timeout <= 1000000;
|
||||
end
|
||||
|
||||
//////////////////////// DOWNLOADING ///////////////////////////
|
||||
|
||||
// include ROM download helper
|
||||
wire dio_download;
|
||||
reg dio_write;
|
||||
wire [23:0] dio_addr;
|
||||
wire [7:0] dio_index;
|
||||
wire [15:0] dio_data;
|
||||
|
||||
// good floppy image sizes are 819200 bytes and 409600 bytes
|
||||
reg dsk_int_ds, dsk_ext_ds; // double sided image inserted
|
||||
reg dsk_int_ss, dsk_ext_ss; // single sided image inserted
|
||||
|
||||
// any known type of disk image inserted?
|
||||
wire dsk_int_ins = dsk_int_ds || dsk_int_ss;
|
||||
wire dsk_ext_ins = dsk_ext_ds || dsk_ext_ss;
|
||||
|
||||
// at the end of a download latch file size
|
||||
// diskEject is set by macos on eject
|
||||
always @(posedge clk_sys) begin
|
||||
reg old_down;
|
||||
|
||||
old_down <= dio_download;
|
||||
if(old_down && ~dio_download && dio_index == 1) begin
|
||||
dsk_int_ds <= (dio_addr == 409600); // double sides disk, addr counts words, not bytes
|
||||
dsk_int_ss <= (dio_addr == 204800); // single sided disk
|
||||
end
|
||||
|
||||
if(diskEject[0]) begin
|
||||
dsk_int_ds <= 0;
|
||||
dsk_int_ss <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge clk_sys) begin
|
||||
reg old_down;
|
||||
|
||||
old_down <= dio_download;
|
||||
if(old_down && ~dio_download && dio_index == 2) begin
|
||||
dsk_ext_ds <= (dio_addr == 409600); // double sided disk, addr counts words, not bytes
|
||||
dsk_ext_ss <= (dio_addr == 204800); // single sided disk
|
||||
end
|
||||
|
||||
if(diskEject[1]) begin
|
||||
dsk_ext_ds <= 0;
|
||||
dsk_ext_ss <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
// disk images are being stored right after os rom at word offset 0x80000 and 0x100000
|
||||
wire [20:0] dio_a =
|
||||
(dio_index == 0)?dio_addr[20:0]: // os rom
|
||||
(dio_index == 1)?{21'h80000 + dio_addr[20:0]}: // first dsk image at 512k word addr
|
||||
{21'h100000 + dio_addr[20:0]}; // second dsk image at 1M word addr
|
||||
|
||||
always @(posedge clk_sys) begin
|
||||
reg old_cyc = 0;
|
||||
|
||||
old_cyc <= dioBusControl;
|
||||
if(ioctl_wr) ioctl_wait <= 1;
|
||||
|
||||
if(~dioBusControl) dio_write <= ioctl_wait;
|
||||
if(old_cyc & ~dioBusControl & dio_write) ioctl_wait <= 0;
|
||||
end
|
||||
|
||||
// sdram used for ram/rom maps directly into 68k address space
|
||||
wire download_cycle = dio_download && dioBusControl;
|
||||
|
||||
////////////////////////// SDRAM /////////////////////////////////
|
||||
|
||||
wire [24:0] sdram_addr = download_cycle ? { 4'b0001, dio_a[20:0] } : { 3'b000, ~_romOE, memoryAddr[21:1] };
|
||||
wire [15:0] sdram_din = download_cycle ? dio_data : memoryDataOut;
|
||||
wire [1:0] sdram_ds = download_cycle ? 2'b11 : { !_memoryUDS, !_memoryLDS };
|
||||
wire sdram_we = download_cycle ? dio_write : !_ramWE;
|
||||
wire sdram_oe = download_cycle ? 1'b0 : (!_ramOE || !_romOE);
|
||||
wire [15:0] sdram_do = download_cycle ? 16'hffff : (dskReadAckInt || dskReadAckExt) ? extra_rom_data_demux : sdram_out;
|
||||
|
||||
// "extra rom" is used to hold the disk image. It's expected to be byte wide and
|
||||
// we thus need to properly demultiplex the word returned from sdram in that case
|
||||
wire [15:0] extra_rom_data_demux = memoryAddr[0]? {sdram_out[7:0],sdram_out[7:0]}:{sdram_out[15:8],sdram_out[15:8]};
|
||||
wire [15:0] sdram_out;
|
||||
|
||||
assign SDRAM_CKE = 1;
|
||||
|
||||
sdram sdram
|
||||
(
|
||||
// system interface
|
||||
.init ( !pll_locked ),
|
||||
.clk ( clk_sys ),
|
||||
.sync ( cep ),
|
||||
|
||||
// interface to the MT48LC16M16 chip
|
||||
.sd_data ( SDRAM_DQ ),
|
||||
.sd_addr ( SDRAM_A ),
|
||||
.sd_dqm ( {SDRAM_DQMH, SDRAM_DQML} ),
|
||||
.sd_cs ( SDRAM_nCS ),
|
||||
.sd_ba ( SDRAM_BA ),
|
||||
.sd_we ( SDRAM_nWE ),
|
||||
.sd_ras ( SDRAM_nRAS ),
|
||||
.sd_cas ( SDRAM_nCAS ),
|
||||
|
||||
// cpu/chipset interface
|
||||
// map rom to sdram word address $200000 - $20ffff
|
||||
.din ( sdram_din ),
|
||||
.addr ( sdram_addr ),
|
||||
.ds ( sdram_ds ),
|
||||
.we ( sdram_we ),
|
||||
.oe ( sdram_oe ),
|
||||
.dout ( sdram_out )
|
||||
);
|
||||
|
||||
|
||||
//////////////////////// TURBO HANDLING //////////////////////////
|
||||
|
||||
// cannot boot from SCSI if turbo enabled
|
||||
// delay the turbo.
|
||||
reg real_turbo = 0;
|
||||
always @(posedge clk_sys) begin
|
||||
reg old_ack;
|
||||
integer ack_cnt = 0;
|
||||
|
||||
old_ack <= sd_ack;
|
||||
if(old_ack && ~sd_ack && ack_cnt) ack_cnt <= ack_cnt - 1'd1;
|
||||
|
||||
//Cancel delay if FDD is accesed.
|
||||
if(diskMotor) ack_cnt <= 0;
|
||||
if(!ack_cnt && dioBusControl) real_turbo <= status_turbo;
|
||||
|
||||
if(~n_reset) begin
|
||||
real_turbo <= 0;
|
||||
ack_cnt <= 20;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
932
TG68K_ALU.vhd
Normal file
932
TG68K_ALU.vhd
Normal file
@ -0,0 +1,932 @@
|
||||
------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------
|
||||
-- --
|
||||
-- Copyright (c) 2009-2011 Tobias Gubener --
|
||||
-- Subdesign fAMpIGA by TobiFlex --
|
||||
-- --
|
||||
-- This source file 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 source file 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 <http://www.gnu.org/licenses/>. --
|
||||
-- --
|
||||
------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
use ieee.std_logic_unsigned.all;
|
||||
use IEEE.numeric_std.all;
|
||||
use work.TG68K_Pack.all;
|
||||
|
||||
entity TG68K_ALU is
|
||||
generic(
|
||||
MUL_Mode : integer := 0; --0=>16Bit, 1=>32Bit, 2=>switchable with CPU(1), 3=>no MUL,
|
||||
DIV_Mode : integer := 0 --0=>16Bit, 1=>32Bit, 2=>switchable with CPU(1), 3=>no DIV,
|
||||
);
|
||||
port(clk : in std_logic;
|
||||
Reset : in std_logic;
|
||||
clkena_lw : in std_logic:='1';
|
||||
execOPC : in bit;
|
||||
exe_condition : in std_logic;
|
||||
exec_tas : in std_logic;
|
||||
long_start : in bit;
|
||||
movem_presub : in bit;
|
||||
set_stop : in bit;
|
||||
Z_error : in bit;
|
||||
rot_bits : in std_logic_vector(1 downto 0);
|
||||
exec : in bit_vector(lastOpcBit downto 0);
|
||||
OP1out : in std_logic_vector(31 downto 0);
|
||||
OP2out : in std_logic_vector(31 downto 0);
|
||||
reg_QA : in std_logic_vector(31 downto 0);
|
||||
reg_QB : in std_logic_vector(31 downto 0);
|
||||
opcode : in std_logic_vector(15 downto 0);
|
||||
datatype : in std_logic_vector(1 downto 0);
|
||||
exe_opcode : in std_logic_vector(15 downto 0);
|
||||
exe_datatype : in std_logic_vector(1 downto 0);
|
||||
sndOPC : in std_logic_vector(15 downto 0);
|
||||
last_data_read : in std_logic_vector(15 downto 0);
|
||||
data_read : in std_logic_vector(15 downto 0);
|
||||
FlagsSR : in std_logic_vector(7 downto 0);
|
||||
micro_state : in micro_states;
|
||||
bf_ext_in : in std_logic_vector(7 downto 0);
|
||||
bf_ext_out : out std_logic_vector(7 downto 0);
|
||||
bf_shift : in std_logic_vector(5 downto 0);
|
||||
bf_width : in std_logic_vector(5 downto 0);
|
||||
bf_loffset : in std_logic_vector(4 downto 0);
|
||||
|
||||
set_V_Flag : buffer bit;
|
||||
Flags : buffer std_logic_vector(7 downto 0);
|
||||
c_out : buffer std_logic_vector(2 downto 0);
|
||||
addsub_q : buffer std_logic_vector(31 downto 0);
|
||||
ALUout : out std_logic_vector(31 downto 0)
|
||||
);
|
||||
end TG68K_ALU;
|
||||
|
||||
architecture logic of TG68K_ALU is
|
||||
-----------------------------------------------------------------------------
|
||||
-----------------------------------------------------------------------------
|
||||
-- ALU and more
|
||||
-----------------------------------------------------------------------------
|
||||
-----------------------------------------------------------------------------
|
||||
signal OP1in : std_logic_vector(31 downto 0);
|
||||
signal addsub_a : std_logic_vector(31 downto 0);
|
||||
signal addsub_b : std_logic_vector(31 downto 0);
|
||||
signal notaddsub_b : std_logic_vector(33 downto 0);
|
||||
signal add_result : std_logic_vector(33 downto 0);
|
||||
signal addsub_ofl : std_logic_vector(2 downto 0);
|
||||
signal opaddsub : bit;
|
||||
signal c_in : std_logic_vector(3 downto 0);
|
||||
signal flag_z : std_logic_vector(2 downto 0);
|
||||
signal set_Flags : std_logic_vector(3 downto 0); --NZVC
|
||||
signal CCRin : std_logic_vector(7 downto 0);
|
||||
|
||||
signal niba_l : std_logic_vector(5 downto 0);
|
||||
signal niba_h : std_logic_vector(5 downto 0);
|
||||
signal niba_lc : std_logic;
|
||||
signal niba_hc : std_logic;
|
||||
signal bcda_lc : std_logic;
|
||||
signal bcda_hc : std_logic;
|
||||
signal nibs_l : std_logic_vector(5 downto 0);
|
||||
signal nibs_h : std_logic_vector(5 downto 0);
|
||||
signal nibs_lc : std_logic;
|
||||
signal nibs_hc : std_logic;
|
||||
|
||||
signal bcd_a : std_logic_vector(8 downto 0);
|
||||
signal bcd_s : std_logic_vector(8 downto 0);
|
||||
signal pack_out : std_logic_vector(15 downto 0);
|
||||
signal pack_a : std_logic_vector(15 downto 0);
|
||||
signal result_mulu : std_logic_vector(63 downto 0);
|
||||
signal result_div : std_logic_vector(63 downto 0);
|
||||
signal set_mV_Flag : std_logic;
|
||||
signal V_Flag : bit;
|
||||
|
||||
signal rot_rot : std_logic;
|
||||
signal rot_lsb : std_logic;
|
||||
signal rot_msb : std_logic;
|
||||
signal rot_X : std_logic;
|
||||
signal rot_C : std_logic;
|
||||
signal rot_out : std_logic_vector(31 downto 0);
|
||||
signal asl_VFlag : std_logic;
|
||||
signal bit_bits : std_logic_vector(1 downto 0);
|
||||
signal bit_number : std_logic_vector(4 downto 0);
|
||||
signal bits_out : std_logic_vector(31 downto 0);
|
||||
signal one_bit_in : std_logic;
|
||||
signal bchg : std_logic;
|
||||
signal bset : std_logic;
|
||||
|
||||
signal mulu_sign : std_logic;
|
||||
signal mulu_signext : std_logic_vector(16 downto 0);
|
||||
signal muls_msb : std_logic;
|
||||
signal mulu_reg : std_logic_vector(63 downto 0);
|
||||
signal FAsign : std_logic;
|
||||
signal faktorA : std_logic_vector(31 downto 0);
|
||||
signal faktorB : std_logic_vector(31 downto 0);
|
||||
|
||||
signal div_reg : std_logic_vector(63 downto 0);
|
||||
signal div_quot : std_logic_vector(63 downto 0);
|
||||
signal div_ovl : std_logic;
|
||||
signal div_neg : std_logic;
|
||||
signal div_bit : std_logic;
|
||||
signal div_sub : std_logic_vector(32 downto 0);
|
||||
signal div_over : std_logic_vector(32 downto 0);
|
||||
signal nozero : std_logic;
|
||||
signal div_qsign : std_logic;
|
||||
signal divisor : std_logic_vector(63 downto 0);
|
||||
signal divs : std_logic;
|
||||
signal signedOP : std_logic;
|
||||
signal OP1_sign : std_logic;
|
||||
signal OP2_sign : std_logic;
|
||||
signal OP2outext : std_logic_vector(15 downto 0);
|
||||
|
||||
signal in_offset : std_logic_vector(5 downto 0);
|
||||
-- signal in_width : std_logic_vector(5 downto 0);
|
||||
signal datareg : std_logic_vector(31 downto 0);
|
||||
signal insert : std_logic_vector(31 downto 0);
|
||||
-- signal bf_result : std_logic_vector(31 downto 0);
|
||||
-- signal bf_offset : std_logic_vector(5 downto 0);
|
||||
-- signal bf_width : std_logic_vector(5 downto 0);
|
||||
-- signal bf_firstbit : std_logic_vector(5 downto 0);
|
||||
signal bf_datareg : std_logic_vector(31 downto 0);
|
||||
-- signal bf_out : std_logic_vector(31 downto 0);
|
||||
signal result : std_logic_vector(39 downto 0);
|
||||
signal result_tmp : std_logic_vector(39 downto 0);
|
||||
signal sign : std_logic_vector(31 downto 0);
|
||||
signal bf_set1 : std_logic_vector(39 downto 0);
|
||||
signal inmux0 : std_logic_vector(39 downto 0);
|
||||
signal inmux1 : std_logic_vector(39 downto 0);
|
||||
signal inmux2 : std_logic_vector(39 downto 0);
|
||||
signal inmux3 : std_logic_vector(31 downto 0);
|
||||
signal copymux0 : std_logic_vector(39 downto 0);
|
||||
signal copymux1 : std_logic_vector(39 downto 0);
|
||||
signal copymux2 : std_logic_vector(39 downto 0);
|
||||
signal copymux3 : std_logic_vector(31 downto 0);
|
||||
signal bf_set2 : std_logic_vector(31 downto 0);
|
||||
-- signal bf_set3 : std_logic_vector(31 downto 0);
|
||||
signal shift : std_logic_vector(39 downto 0);
|
||||
signal copy : std_logic_vector(39 downto 0);
|
||||
-- signal offset : std_logic_vector(5 downto 0);
|
||||
-- signal width : std_logic_vector(5 downto 0);
|
||||
signal bf_firstbit : std_logic_vector(5 downto 0);
|
||||
signal mux : std_logic_vector(3 downto 0);
|
||||
signal bitnr : std_logic_vector(4 downto 0);
|
||||
signal mask : std_logic_vector(31 downto 0);
|
||||
signal bf_bset : std_logic;
|
||||
signal bf_NFlag : std_logic;
|
||||
signal bf_bchg : std_logic;
|
||||
signal bf_ins : std_logic;
|
||||
signal bf_exts : std_logic;
|
||||
signal bf_fffo : std_logic;
|
||||
signal bf_d32 : std_logic;
|
||||
signal bf_s32 : std_logic;
|
||||
signal index : std_logic_vector(4 downto 0);
|
||||
-- signal i : integer range 0 to 31;
|
||||
-- signal i : integer range 0 to 31;
|
||||
-- signal i : std_logic_vector(5 downto 0);
|
||||
BEGIN
|
||||
-----------------------------------------------------------------------------
|
||||
-- set OP1in
|
||||
-----------------------------------------------------------------------------
|
||||
PROCESS (OP2out, reg_QB, opcode, OP1out, OP1in, exe_datatype, addsub_q, execOPC, exec,
|
||||
pack_out, bcd_a, bcd_s, result_mulu, result_div, exe_condition, bf_shift,
|
||||
Flags, FlagsSR, bits_out, exec_tas, rot_out, exe_opcode, result, bf_fffo, bf_firstbit, bf_datareg)
|
||||
BEGIN
|
||||
ALUout <= OP1in;
|
||||
ALUout(7) <= OP1in(7) OR exec_tas;
|
||||
IF exec(opcBFwb)='1' THEN
|
||||
ALUout <= result(31 downto 0);
|
||||
IF bf_fffo='1' THEN
|
||||
ALUout <= (OTHERS =>'0');
|
||||
ALUout(5 downto 0) <= bf_firstbit + bf_shift;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
OP1in <= addsub_q;
|
||||
IF exec(opcABCD)='1' THEN
|
||||
OP1in(7 downto 0) <= bcd_a(7 downto 0);
|
||||
ELSIF exec(opcSBCD)='1' THEN
|
||||
OP1in(7 downto 0) <= bcd_s(7 downto 0);
|
||||
ELSIF exec(opcMULU)='1' AND MUL_Mode/=3 THEN
|
||||
IF exec(write_lowlong)='1' AND (MUL_Mode=1 OR MUL_Mode=2) THEN
|
||||
OP1in <= result_mulu(31 downto 0);
|
||||
ELSE
|
||||
OP1in <= result_mulu(63 downto 32);
|
||||
END IF;
|
||||
ELSIF exec(opcDIVU)='1' AND DIV_Mode/=3 THEN
|
||||
IF exe_opcode(15)='1' OR DIV_Mode=0 THEN
|
||||
-- IF exe_opcode(15)='1' THEN
|
||||
OP1in <= result_div(47 downto 32)&result_div(15 downto 0);
|
||||
ELSE --64bit
|
||||
IF exec(write_reminder)='1' THEN
|
||||
OP1in <= result_div(63 downto 32);
|
||||
ELSE
|
||||
OP1in <= result_div(31 downto 0);
|
||||
END IF;
|
||||
END IF;
|
||||
ELSIF exec(opcOR)='1' THEN
|
||||
OP1in <= OP2out OR OP1out;
|
||||
ELSIF exec(opcAND)='1' THEN
|
||||
OP1in <= OP2out AND OP1out;
|
||||
ELSIF exec(opcScc)='1' THEN
|
||||
OP1in(7 downto 0) <= (others=>exe_condition);
|
||||
ELSIF exec(opcEOR)='1' THEN
|
||||
OP1in <= OP2out XOR OP1out;
|
||||
ELSIF exec(opcMOVE)='1' OR exec(exg)='1' THEN
|
||||
-- OP1in <= OP2out(31 downto 8)&(OP2out(7)OR exec_tas)&OP2out(6 downto 0);
|
||||
OP1in <= OP2out;
|
||||
ELSIF exec(opcROT)='1' THEN
|
||||
OP1in <= rot_out;
|
||||
ELSIF exec(opcSWAP)='1' THEN
|
||||
OP1in <= OP1out(15 downto 0)& OP1out(31 downto 16);
|
||||
ELSIF exec(opcBITS)='1' THEN
|
||||
OP1in <= bits_out;
|
||||
ELSIF exec(opcBF)='1' THEN
|
||||
OP1in <= bf_datareg;
|
||||
ELSIF exec(opcMOVESR)='1' THEN
|
||||
OP1in(7 downto 0) <= Flags;
|
||||
IF exe_datatype="00" THEN
|
||||
OP1in(15 downto 8) <= "00000000";
|
||||
ELSE
|
||||
OP1in(15 downto 8) <= FlagsSR;
|
||||
END IF;
|
||||
ELSIF exec(opcPACK)='1' THEN
|
||||
OP1in(15 downto 0) <= pack_out;
|
||||
END IF;
|
||||
END PROCESS;
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- addsub
|
||||
-----------------------------------------------------------------------------
|
||||
PROCESS (OP1out, OP2out, execOPC, datatype, Flags, long_start, movem_presub, exe_datatype, exec, addsub_a, addsub_b, opaddsub,
|
||||
notaddsub_b, add_result, c_in, sndOPC)
|
||||
BEGIN
|
||||
addsub_a <= OP1out;
|
||||
IF exec(get_bfoffset)='1' THEN
|
||||
IF sndOPC(11)='1' THEN
|
||||
addsub_a <= OP1out(31)&OP1out(31)&OP1out(31)&OP1out(31 downto 3);
|
||||
ELSE
|
||||
addsub_a <= "000000000000000000000000000000"&sndOPC(10 downto 9);
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
IF exec(subidx)='1' THEN
|
||||
opaddsub <= '1';
|
||||
ELSE
|
||||
opaddsub <= '0';
|
||||
END IF;
|
||||
|
||||
c_in(0) <='0';
|
||||
addsub_b <= OP2out;
|
||||
IF execOPC='0' AND exec(OP2out_one)='0' AND exec(get_bfoffset)='0'THEN
|
||||
IF long_start='0' AND datatype="00" AND exec(use_SP)='0' THEN
|
||||
addsub_b <= "00000000000000000000000000000001";
|
||||
ELSIF long_start='0' AND exe_datatype="10" AND (exec(presub) OR exec(postadd) OR movem_presub)='1' THEN
|
||||
IF exec(movem_action)='1' THEN
|
||||
addsub_b <= "00000000000000000000000000000110";
|
||||
ELSE
|
||||
addsub_b <= "00000000000000000000000000000100";
|
||||
END IF;
|
||||
ELSE
|
||||
addsub_b <= "00000000000000000000000000000010";
|
||||
END IF;
|
||||
ELSE
|
||||
IF (exec(use_XZFlag)='1' AND Flags(4)='1') OR exec(opcCHK)='1' THEN
|
||||
c_in(0) <= '1';
|
||||
END IF;
|
||||
opaddsub <= exec(addsub);
|
||||
END IF;
|
||||
|
||||
IF opaddsub='0' OR long_start='1' THEN --ADD
|
||||
notaddsub_b <= '0'&addsub_b&c_in(0);
|
||||
ELSE --SUB
|
||||
notaddsub_b <= NOT ('0'&addsub_b&c_in(0));
|
||||
END IF;
|
||||
add_result <= (('0'&addsub_a¬addsub_b(0))+notaddsub_b);
|
||||
c_in(1) <= add_result(9) XOR addsub_a(8) XOR addsub_b(8);
|
||||
c_in(2) <= add_result(17) XOR addsub_a(16) XOR addsub_b(16);
|
||||
c_in(3) <= add_result(33);
|
||||
addsub_q <= add_result(32 downto 1);
|
||||
addsub_ofl(0) <= (c_in(1) XOR add_result(8) XOR addsub_a(7) XOR addsub_b(7)); --V Byte
|
||||
addsub_ofl(1) <= (c_in(2) XOR add_result(16) XOR addsub_a(15) XOR addsub_b(15)); --V Word
|
||||
addsub_ofl(2) <= (c_in(3) XOR add_result(32) XOR addsub_a(31) XOR addsub_b(31)); --V Long
|
||||
c_out <= c_in(3 downto 1);
|
||||
END PROCESS;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--ALU
|
||||
------------------------------------------------------------------------------
|
||||
PROCESS (OP1out, OP2out, pack_a, niba_hc, niba_h, niba_l, niba_lc, nibs_hc, nibs_h, nibs_l, nibs_lc, Flags, exe_opcode)
|
||||
BEGIN
|
||||
IF exe_opcode(7 downto 6) = "01" THEN
|
||||
-- PACK
|
||||
pack_a <= std_logic_vector(unsigned(OP1out(15 downto 0))+unsigned(OP2out(15 downto 0)));
|
||||
pack_out <= "00000000" & pack_a(11 downto 8) & pack_a(3 downto 0);
|
||||
ELSE
|
||||
-- UNPK
|
||||
pack_a <= "0000" & OP2out(7 downto 4) & "0000" & OP2out(3 downto 0);
|
||||
pack_out <= std_logic_vector(unsigned(OP1out(15 downto 0))+unsigned(pack_a));
|
||||
END IF;
|
||||
|
||||
--BCD_ARITH-------------------------------------------------------------------
|
||||
--ADC
|
||||
bcd_a <= niba_hc&(niba_h(4 downto 1)+('0',niba_hc,niba_hc,'0'))&(niba_l(4 downto 1)+('0',niba_lc,niba_lc,'0'));
|
||||
niba_l <= ('0'&OP1out(3 downto 0)&'1') + ('0'&OP2out(3 downto 0)&Flags(4));
|
||||
niba_lc <= niba_l(5) OR (niba_l(4) AND niba_l(3)) OR (niba_l(4) AND niba_l(2));
|
||||
|
||||
niba_h <= ('0'&OP1out(7 downto 4)&'1') + ('0'&OP2out(7 downto 4)&niba_lc);
|
||||
niba_hc <= niba_h(5) OR (niba_h(4) AND niba_h(3)) OR (niba_h(4) AND niba_h(2));
|
||||
--SBC
|
||||
bcd_s <= nibs_hc&(nibs_h(4 downto 1)-('0',nibs_hc,nibs_hc,'0'))&(nibs_l(4 downto 1)-('0',nibs_lc,nibs_lc,'0'));
|
||||
nibs_l <= ('0'&OP1out(3 downto 0)&'0') - ('0'&OP2out(3 downto 0)&Flags(4));
|
||||
nibs_lc <= nibs_l(5);
|
||||
|
||||
nibs_h <= ('0'&OP1out(7 downto 4)&'0') - ('0'&OP2out(7 downto 4)&nibs_lc);
|
||||
nibs_hc <= nibs_h(5);
|
||||
END PROCESS;
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Bits
|
||||
-----------------------------------------------------------------------------
|
||||
PROCESS (clk, exe_opcode, OP1out, OP2out, one_bit_in, bchg, bset, bit_Number, sndOPC, reg_QB)
|
||||
BEGIN
|
||||
IF rising_edge(clk) THEN
|
||||
IF clkena_lw = '1' THEN
|
||||
bchg <= '0';
|
||||
bset <= '0';
|
||||
CASE opcode(7 downto 6) IS
|
||||
WHEN "01" => --bchg
|
||||
bchg <= '1';
|
||||
WHEN "11" => --bset
|
||||
bset <= '1';
|
||||
WHEN OTHERS => NULL;
|
||||
END CASE;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
IF exe_opcode(8)='0' THEN
|
||||
IF exe_opcode(5 downto 4)="00" THEN
|
||||
bit_number <= sndOPC(4 downto 0);
|
||||
ELSE
|
||||
bit_number <= "00"&sndOPC(2 downto 0);
|
||||
END IF;
|
||||
ELSE
|
||||
IF exe_opcode(5 downto 4)="00" THEN
|
||||
bit_number <= reg_QB(4 downto 0);
|
||||
ELSE
|
||||
bit_number <= "00"®_QB(2 downto 0);
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
one_bit_in <= OP1out(to_integer(unsigned(bit_Number)));
|
||||
bits_out <= OP1out;
|
||||
bits_out(to_integer(unsigned(bit_Number))) <= (bchg AND NOT one_bit_in) OR bset ;
|
||||
END PROCESS;
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Bit Field
|
||||
-----------------------------------------------------------------------------
|
||||
PROCESS (clk, mux, mask, bitnr, bf_ins, bf_bchg, bf_bset, bf_exts, bf_shift, inmux0, inmux1, inmux2, inmux3, bf_set2, OP1out, OP2out, result_tmp, bf_ext_in,
|
||||
shift, datareg, bf_NFlag, result, reg_QB, sign, bf_d32, bf_s32, copy, bf_loffset, copymux0, copymux1, copymux2, copymux3, bf_width)
|
||||
BEGIN
|
||||
IF rising_edge(clk) THEN
|
||||
IF clkena_lw = '1' THEN
|
||||
bf_bset <= '0';
|
||||
bf_bchg <= '0';
|
||||
bf_ins <= '0';
|
||||
bf_exts <= '0';
|
||||
bf_fffo <= '0';
|
||||
bf_d32 <= '0';
|
||||
bf_s32 <= '0';
|
||||
CASE opcode(10 downto 8) IS
|
||||
WHEN "010" => bf_bchg <= '1'; --BFCHG
|
||||
WHEN "011" => bf_exts <= '1'; --BFEXTS
|
||||
-- WHEN "100" => insert <= (OTHERS =>'0'); --BFCLR
|
||||
WHEN "101" => bf_fffo <= '1'; --BFFFO
|
||||
WHEN "110" => bf_bset <= '1'; --BFSET
|
||||
WHEN "111" => bf_ins <= '1'; --BFINS
|
||||
bf_s32 <= '1';
|
||||
WHEN OTHERS => NULL;
|
||||
END CASE;
|
||||
IF opcode(4 downto 3)="00" THEN
|
||||
bf_d32 <= '1';
|
||||
END IF;
|
||||
bf_ext_out <= result(39 downto 32);
|
||||
END IF;
|
||||
END IF;
|
||||
shift <= bf_ext_in&OP2out;
|
||||
IF bf_s32='1' THEN
|
||||
shift(39 downto 32) <= OP2out(7 downto 0);
|
||||
END IF;
|
||||
|
||||
IF bf_shift(0)='1' THEN
|
||||
inmux0 <= shift(0)&shift(39 downto 1);
|
||||
ELSE
|
||||
inmux0 <= shift;
|
||||
END IF;
|
||||
IF bf_shift(1)='1' THEN
|
||||
inmux1 <= inmux0(1 downto 0)&inmux0(39 downto 2);
|
||||
ELSE
|
||||
inmux1 <= inmux0;
|
||||
END IF;
|
||||
IF bf_shift(2)='1' THEN
|
||||
inmux2 <= inmux1(3 downto 0)&inmux1(39 downto 4);
|
||||
ELSE
|
||||
inmux2 <= inmux1;
|
||||
END IF;
|
||||
IF bf_shift(3)='1' THEN
|
||||
inmux3 <= inmux2(7 downto 0)&inmux2(31 downto 8);
|
||||
ELSE
|
||||
inmux3 <= inmux2(31 downto 0);
|
||||
END IF;
|
||||
IF bf_shift(4)='1' THEN
|
||||
bf_set2(31 downto 0) <= inmux3(15 downto 0)&inmux3(31 downto 16);
|
||||
ELSE
|
||||
bf_set2(31 downto 0) <= inmux3;
|
||||
END IF;
|
||||
|
||||
IF bf_loffset(4)='1' THEN
|
||||
copymux3 <= sign(15 downto 0)&sign(31 downto 16);
|
||||
ELSE
|
||||
copymux3 <= sign;
|
||||
END IF;
|
||||
IF bf_loffset(3)='1' THEN
|
||||
copymux2(31 downto 0) <= copymux3(23 downto 0)©mux3(31 downto 24);
|
||||
ELSE
|
||||
copymux2(31 downto 0) <= copymux3;
|
||||
END IF;
|
||||
IF bf_d32='1' THEN
|
||||
copymux2(39 downto 32) <= copymux3(7 downto 0);
|
||||
ELSE
|
||||
copymux2(39 downto 32) <= "11111111";
|
||||
END IF;
|
||||
IF bf_loffset(2)='1' THEN
|
||||
copymux1 <= copymux2(35 downto 0)©mux2(39 downto 36);
|
||||
ELSE
|
||||
copymux1 <= copymux2;
|
||||
END IF;
|
||||
IF bf_loffset(1)='1' THEN
|
||||
copymux0 <= copymux1(37 downto 0)©mux1(39 downto 38);
|
||||
ELSE
|
||||
copymux0 <= copymux1;
|
||||
END IF;
|
||||
IF bf_loffset(0)='1' THEN
|
||||
copy <= copymux0(38 downto 0)©mux0(39);
|
||||
ELSE
|
||||
copy <= copymux0;
|
||||
END IF;
|
||||
|
||||
result_tmp <= bf_ext_in&OP1out;
|
||||
IF bf_ins='1' THEN
|
||||
datareg <= reg_QB;
|
||||
ELSE
|
||||
datareg <= bf_set2;
|
||||
END IF;
|
||||
IF bf_ins='1' THEN
|
||||
result(31 downto 0) <= bf_set2;
|
||||
result(39 downto 32) <= bf_set2(7 downto 0);
|
||||
ELSIF bf_bchg='1' THEN
|
||||
result(31 downto 0) <= NOT OP1out;
|
||||
result(39 downto 32) <= NOT bf_ext_in;
|
||||
ELSE
|
||||
result <= (OTHERS => '0');
|
||||
END IF;
|
||||
IF bf_bset='1' THEN
|
||||
result <= (OTHERS => '1');
|
||||
END IF;
|
||||
|
||||
sign <= (OTHERS => '0');
|
||||
bf_NFlag <= datareg(to_integer(unsigned(bf_width)));
|
||||
FOR i in 0 to 31 LOOP
|
||||
IF i>bf_width(4 downto 0) THEN
|
||||
datareg(i) <= '0';
|
||||
sign(i) <= '1';
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
FOR i in 0 to 39 LOOP
|
||||
IF copy(i)='1' THEN
|
||||
result(i) <= result_tmp(i);
|
||||
END IF;
|
||||
END LOOP;
|
||||
|
||||
IF bf_exts='1' AND bf_NFlag='1' THEN
|
||||
bf_datareg <= datareg OR sign;
|
||||
ELSE
|
||||
bf_datareg <= datareg;
|
||||
END IF;
|
||||
-- bf_datareg <= copy(31 downto 0);
|
||||
-- result(31 downto 0)<=datareg;
|
||||
--BFFFO
|
||||
mask <= datareg;
|
||||
bf_firstbit <= '0'&bitnr;
|
||||
bitnr <= "11111";
|
||||
IF mask(31 downto 28)="0000" THEN
|
||||
IF mask(27 downto 24)="0000" THEN
|
||||
IF mask(23 downto 20)="0000" THEN
|
||||
IF mask(19 downto 16)="0000" THEN
|
||||
bitnr(4) <= '0';
|
||||
IF mask(15 downto 12)="0000" THEN
|
||||
IF mask(11 downto 8)="0000" THEN
|
||||
bitnr(3) <= '0';
|
||||
IF mask(7 downto 4)="0000" THEN
|
||||
bitnr(2) <= '0';
|
||||
mux <= mask(3 downto 0);
|
||||
ELSE
|
||||
mux <= mask(7 downto 4);
|
||||
END IF;
|
||||
ELSE
|
||||
mux <= mask(11 downto 8);
|
||||
bitnr(2) <= '0';
|
||||
END IF;
|
||||
ELSE
|
||||
mux <= mask(15 downto 12);
|
||||
END IF;
|
||||
ELSE
|
||||
mux <= mask(19 downto 16);
|
||||
bitnr(3) <= '0';
|
||||
bitnr(2) <= '0';
|
||||
END IF;
|
||||
ELSE
|
||||
mux <= mask(23 downto 20);
|
||||
bitnr(3) <= '0';
|
||||
END IF;
|
||||
ELSE
|
||||
mux <= mask(27 downto 24);
|
||||
bitnr(2) <= '0';
|
||||
END IF;
|
||||
ELSE
|
||||
mux <= mask(31 downto 28);
|
||||
END IF;
|
||||
|
||||
IF mux(3 downto 2)="00" THEN
|
||||
bitnr(1) <= '0';
|
||||
IF mux(1)='0' THEN
|
||||
bitnr(0) <= '0';
|
||||
END IF;
|
||||
ELSE
|
||||
IF mux(3)='0' THEN
|
||||
bitnr(0) <= '0';
|
||||
END IF;
|
||||
END IF;
|
||||
END PROCESS;
|
||||
|
||||
-----------------------------------------------------------------------------
|
||||
-- Rotation
|
||||
-----------------------------------------------------------------------------
|
||||
PROCESS (exe_opcode, OP1out, Flags, rot_bits, rot_msb, rot_lsb, rot_rot, exec)
|
||||
BEGIN
|
||||
CASE exe_opcode(7 downto 6) IS
|
||||
WHEN "00" => --Byte
|
||||
rot_rot <= OP1out(7);
|
||||
WHEN "01"|"11" => --Word
|
||||
rot_rot <= OP1out(15);
|
||||
WHEN "10" => --Long
|
||||
rot_rot <= OP1out(31);
|
||||
WHEN OTHERS => NULL;
|
||||
END CASE;
|
||||
|
||||
CASE rot_bits IS
|
||||
WHEN "00" => --ASL, ASR
|
||||
rot_lsb <= '0';
|
||||
rot_msb <= rot_rot;
|
||||
WHEN "01" => --LSL, LSR
|
||||
rot_lsb <= '0';
|
||||
rot_msb <= '0';
|
||||
WHEN "10" => --ROXL, ROXR
|
||||
rot_lsb <= Flags(4);
|
||||
rot_msb <= Flags(4);
|
||||
WHEN "11" => --ROL, ROR
|
||||
rot_lsb <= rot_rot;
|
||||
rot_msb <= OP1out(0);
|
||||
WHEN OTHERS => NULL;
|
||||
END CASE;
|
||||
|
||||
IF exec(rot_nop)='1' THEN
|
||||
rot_out <= OP1out;
|
||||
rot_X <= Flags(4);
|
||||
IF rot_bits="10" THEN --ROXL, ROXR
|
||||
rot_C <= Flags(4);
|
||||
ELSE
|
||||
rot_C <= '0';
|
||||
END IF;
|
||||
ELSE
|
||||
IF exe_opcode(8)='1' THEN --left
|
||||
rot_out <= OP1out(30 downto 0)&rot_lsb;
|
||||
rot_X <= rot_rot;
|
||||
rot_C <= rot_rot;
|
||||
ELSE --right
|
||||
rot_X <= OP1out(0);
|
||||
rot_C <= OP1out(0);
|
||||
rot_out <= rot_msb&OP1out(31 downto 1);
|
||||
CASE exe_opcode(7 downto 6) IS
|
||||
WHEN "00" => --Byte
|
||||
rot_out(7) <= rot_msb;
|
||||
WHEN "01"|"11" => --Word
|
||||
rot_out(15) <= rot_msb;
|
||||
WHEN OTHERS => NULL;
|
||||
END CASE;
|
||||
END IF;
|
||||
END IF;
|
||||
END PROCESS;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--CCR op
|
||||
------------------------------------------------------------------------------
|
||||
PROCESS (clk, Reset, exe_opcode, exe_datatype, Flags, last_data_read, OP2out, flag_z, OP1IN, c_out, addsub_ofl,
|
||||
bcd_s, bcd_a, exec)
|
||||
BEGIN
|
||||
IF exec(andiSR)='1' THEN
|
||||
CCRin <= Flags AND last_data_read(7 downto 0);
|
||||
ELSIF exec(eoriSR)='1' THEN
|
||||
CCRin <= Flags XOR last_data_read(7 downto 0);
|
||||
ELSIF exec(oriSR)='1' THEN
|
||||
CCRin <= Flags OR last_data_read(7 downto 0);
|
||||
ELSE
|
||||
CCRin <= OP2out(7 downto 0);
|
||||
END IF;
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
--Flags
|
||||
------------------------------------------------------------------------------
|
||||
flag_z <= "000";
|
||||
IF exec(use_XZFlag)='1' AND flags(2)='0' THEN
|
||||
flag_z <= "000";
|
||||
ELSIF OP1in(7 downto 0)="00000000" THEN
|
||||
flag_z(0) <= '1';
|
||||
IF OP1in(15 downto 8)="00000000" THEN
|
||||
flag_z(1) <= '1';
|
||||
IF OP1in(31 downto 16)="0000000000000000" THEN
|
||||
flag_z(2) <= '1';
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
-- --Flags NZVC
|
||||
IF exe_datatype="00" THEN --Byte
|
||||
set_flags <= OP1IN(7)&flag_z(0)&addsub_ofl(0)&c_out(0);
|
||||
IF exec(opcABCD)='1' THEN
|
||||
set_flags(0) <= bcd_a(8);
|
||||
ELSIF exec(opcSBCD)='1' THEN
|
||||
set_flags(0) <= bcd_s(8);
|
||||
END IF;
|
||||
ELSIF exe_datatype="10" OR exec(opcCPMAW)='1' THEN --Long
|
||||
set_flags <= OP1IN(31)&flag_z(2)&addsub_ofl(2)&c_out(2);
|
||||
ELSE --Word
|
||||
set_flags <= OP1IN(15)&flag_z(1)&addsub_ofl(1)&c_out(1);
|
||||
END IF;
|
||||
|
||||
IF rising_edge(clk) THEN
|
||||
IF clkena_lw = '1' THEN
|
||||
IF exec(directSR)='1' OR set_stop='1' THEN
|
||||
Flags(7 downto 0) <= data_read(7 downto 0);
|
||||
END IF;
|
||||
IF exec(directCCR)='1' THEN
|
||||
Flags(7 downto 0) <= data_read(7 downto 0);
|
||||
END IF;
|
||||
|
||||
IF exec(opcROT)='1' THEN
|
||||
asl_VFlag <= ((set_flags(3) XOR rot_rot) OR asl_VFlag);
|
||||
ELSE
|
||||
asl_VFlag <= '0';
|
||||
END IF;
|
||||
IF exec(to_CCR)='1' THEN
|
||||
Flags(7 downto 0) <= CCRin(7 downto 0); --CCR
|
||||
ELSIF Z_error='1' THEN
|
||||
IF exe_opcode(8)='0' THEN
|
||||
Flags(3 downto 0) <= reg_QA(31)&"000";
|
||||
ELSE
|
||||
Flags(3 downto 0) <= "0100";
|
||||
END IF;
|
||||
ELSIF exec(no_Flags)='0' THEN
|
||||
IF exec(opcADD)='1' THEN
|
||||
Flags(4) <= set_flags(0);
|
||||
ELSIF exec(opcROT)='1' AND rot_bits/="11" AND exec(rot_nop)='0' THEN
|
||||
Flags(4) <= rot_X;
|
||||
END IF;
|
||||
|
||||
IF (exec(opcADD) OR exec(opcCMP))='1' THEN
|
||||
Flags(3 downto 0) <= set_flags;
|
||||
ELSIF exec(opcDIVU)='1' AND DIV_Mode/=3 THEN
|
||||
IF V_Flag='1' THEN
|
||||
Flags(3 downto 0) <= "1010";
|
||||
ELSE
|
||||
Flags(3 downto 0) <= OP1IN(15)&flag_z(1)&"00";
|
||||
END IF;
|
||||
ELSIF exec(write_reminder)='1' AND MUL_Mode/=3 THEN -- z-flag MULU.l
|
||||
Flags(3) <= set_flags(3);
|
||||
Flags(2) <= set_flags(2) AND Flags(2);
|
||||
Flags(1) <= '0';
|
||||
Flags(0) <= '0';
|
||||
ELSIF exec(write_lowlong)='1' AND (MUL_Mode=1 OR MUL_Mode=2) THEN -- flag MULU.l
|
||||
Flags(3) <= set_flags(3);
|
||||
Flags(2) <= set_flags(2);
|
||||
Flags(1) <= set_mV_Flag; --V
|
||||
Flags(0) <= '0';
|
||||
ELSIF exec(opcOR)='1' OR exec(opcAND)='1' OR exec(opcEOR)='1' OR exec(opcMOVE)='1' OR exec(opcMOVEQ)='1' OR exec(opcSWAP)='1' OR exec(opcBF)='1' OR (exec(opcMULU)='1' AND MUL_Mode/=3) THEN
|
||||
Flags(1 downto 0) <= "00";
|
||||
Flags(3 downto 2) <= set_flags(3 downto 2);
|
||||
IF exec(opcBF)='1' THEN
|
||||
Flags(3) <= bf_NFlag;
|
||||
END IF;
|
||||
ELSIF exec(opcROT)='1' THEN
|
||||
Flags(3 downto 2) <= set_flags(3 downto 2);
|
||||
Flags(0) <= rot_C;
|
||||
IF rot_bits="00" AND ((set_flags(3) XOR rot_rot) OR asl_VFlag)='1' THEN --ASL/ASR
|
||||
Flags(1) <= '1';
|
||||
ELSE
|
||||
Flags(1) <= '0';
|
||||
END IF;
|
||||
ELSIF exec(opcBITS)='1' THEN
|
||||
Flags(2) <= NOT one_bit_in;
|
||||
ELSIF exec(opcCHK)='1' THEN
|
||||
IF exe_datatype="01" THEN --Word
|
||||
Flags(3) <= OP1out(15);
|
||||
ELSE
|
||||
Flags(3) <= OP1out(31);
|
||||
END IF;
|
||||
IF OP1out(15 downto 0)=X"0000" AND (exe_datatype="01" OR OP1out(31 downto 16)=X"0000") THEN
|
||||
Flags(2) <='1';
|
||||
ELSE
|
||||
Flags(2) <='0';
|
||||
END IF;
|
||||
Flags(1 downto 0) <= "00";
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
Flags(7 downto 5) <= "000";
|
||||
END IF;
|
||||
END PROCESS;
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
---- MULU/MULS
|
||||
-------------------------------------------------------------------------------
|
||||
PROCESS (exe_opcode, OP2out, muls_msb, mulu_reg, FAsign, mulu_sign, reg_QA, faktorB, result_mulu, signedOP)
|
||||
BEGIN
|
||||
IF (signedOP='1' AND faktorB(31)='1') OR FAsign='1' THEN
|
||||
muls_msb <= mulu_reg(63);
|
||||
ELSE
|
||||
muls_msb <= '0';
|
||||
END IF;
|
||||
|
||||
IF signedOP='1' AND faktorB(31)='1' THEN
|
||||
mulu_sign <= '1';
|
||||
ELSE
|
||||
mulu_sign <= '0';
|
||||
END IF;
|
||||
|
||||
IF MUL_Mode=0 THEN -- 16 Bit
|
||||
result_mulu(63 downto 32) <= muls_msb&mulu_reg(63 downto 33);
|
||||
result_mulu(15 downto 0) <= 'X'&mulu_reg(15 downto 1);
|
||||
IF mulu_reg(0)='1' THEN
|
||||
IF FAsign='1' THEN
|
||||
result_mulu(63 downto 47) <= (muls_msb&mulu_reg(63 downto 48)-(mulu_sign&faktorB(31 downto 16)));
|
||||
ELSE
|
||||
result_mulu(63 downto 47) <= (muls_msb&mulu_reg(63 downto 48)+(mulu_sign&faktorB(31 downto 16)));
|
||||
END IF;
|
||||
END IF;
|
||||
ELSE -- 32 Bit
|
||||
result_mulu <= muls_msb&mulu_reg(63 downto 1);
|
||||
IF mulu_reg(0)='1' THEN
|
||||
IF FAsign='1' THEN
|
||||
result_mulu(63 downto 31) <= (muls_msb&mulu_reg(63 downto 32)-(mulu_sign&faktorB));
|
||||
ELSE
|
||||
result_mulu(63 downto 31) <= (muls_msb&mulu_reg(63 downto 32)+(mulu_sign&faktorB));
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
IF exe_opcode(15)='1' OR MUL_Mode=0 THEN
|
||||
faktorB(31 downto 16) <= OP2out(15 downto 0);
|
||||
faktorB(15 downto 0) <= (OTHERS=>'0');
|
||||
ELSE
|
||||
faktorB <= OP2out;
|
||||
END IF;
|
||||
IF (result_mulu(63 downto 32)=X"00000000" AND (signedOP='0' OR result_mulu(31)='0')) OR
|
||||
(result_mulu(63 downto 32)=X"FFFFFFFF" AND signedOP='1' AND result_mulu(31)='1') THEN
|
||||
set_mV_Flag <= '0';
|
||||
ELSE
|
||||
set_mV_Flag <= '1';
|
||||
END IF;
|
||||
END PROCESS;
|
||||
|
||||
PROCESS (clk)
|
||||
BEGIN
|
||||
IF rising_edge(clk) THEN
|
||||
IF clkena_lw='1' THEN
|
||||
IF micro_state=mul1 THEN
|
||||
mulu_reg(63 downto 32) <= (OTHERS=>'0');
|
||||
IF divs='1' AND ((exe_opcode(15)='1' AND reg_QA(15)='1') OR (exe_opcode(15)='0' AND reg_QA(31)='1')) THEN --MULS Neg faktor
|
||||
FAsign <= '1';
|
||||
mulu_reg(31 downto 0) <= 0-reg_QA;
|
||||
ELSE
|
||||
FAsign <= '0';
|
||||
mulu_reg(31 downto 0) <= reg_QA;
|
||||
END IF;
|
||||
ELSIF exec(opcMULU)='0' THEN
|
||||
mulu_reg <= result_mulu;
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
END PROCESS;
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
---- DIVU/DIVS
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
PROCESS (execOPC, OP1out, OP2out, div_reg, div_neg, div_bit, div_sub, div_quot, OP1_sign, div_over, result_div, reg_QA, opcode, sndOPC, divs, exe_opcode, reg_QB,
|
||||
signedOP, nozero, div_qsign, OP2outext)
|
||||
BEGIN
|
||||
divs <= (opcode(15) AND opcode(8)) OR (NOT opcode(15) AND sndOPC(11));
|
||||
divisor(15 downto 0) <= (OTHERS=> '0');
|
||||
divisor(63 downto 32) <= (OTHERS=> divs AND reg_QA(31));
|
||||
IF exe_opcode(15)='1' OR DIV_Mode=0 THEN
|
||||
divisor(47 downto 16) <= reg_QA;
|
||||
ELSE
|
||||
divisor(31 downto 0) <= reg_QA;
|
||||
IF exe_opcode(14)='1' AND sndOPC(10)='1' THEN
|
||||
divisor(63 downto 32) <= reg_QB;
|
||||
END IF;
|
||||
END IF;
|
||||
IF signedOP='1' OR opcode(15)='0' THEN
|
||||
OP2outext <= OP2out(31 downto 16);
|
||||
ELSE
|
||||
OP2outext <= (OTHERS=> '0');
|
||||
END IF;
|
||||
IF signedOP='1' AND OP2out(31) ='1' THEN
|
||||
div_sub <= (div_reg(63 downto 31))+('1'&OP2out(31 downto 0));
|
||||
ELSE
|
||||
div_sub <= (div_reg(63 downto 31))-('0'&OP2outext(15 downto 0)&OP2out(15 downto 0));
|
||||
END IF;
|
||||
IF DIV_Mode=0 THEN
|
||||
div_bit <= div_sub(16);
|
||||
ELSE
|
||||
div_bit <= div_sub(32);
|
||||
END IF;
|
||||
IF div_bit='1' THEN
|
||||
div_quot(63 downto 32) <= div_reg(62 downto 31);
|
||||
ELSE
|
||||
div_quot(63 downto 32) <= div_sub(31 downto 0);
|
||||
END IF;
|
||||
div_quot(31 downto 0) <= div_reg(30 downto 0)&NOT div_bit;
|
||||
|
||||
|
||||
IF ((nozero='1' AND signedOP='1' AND (OP2out(31) XOR OP1_sign XOR div_neg XOR div_qsign)='1' ) --Overflow DIVS
|
||||
OR (signedOP='0' AND div_over(32)='0')) AND DIV_Mode/=3 THEN --Overflow DIVU
|
||||
set_V_Flag <= '1';
|
||||
ELSE
|
||||
set_V_Flag <= '0';
|
||||
END IF;
|
||||
END PROCESS;
|
||||
|
||||
PROCESS (clk)
|
||||
BEGIN
|
||||
IF rising_edge(clk) THEN
|
||||
IF clkena_lw='1' THEN
|
||||
V_Flag <= set_V_Flag;
|
||||
signedOP <= divs;
|
||||
IF micro_state=div1 THEN
|
||||
nozero <= '0';
|
||||
IF divs='1' AND divisor(63)='1' THEN -- Neg divisor
|
||||
OP1_sign <= '1';
|
||||
div_reg <= 0-divisor;
|
||||
ELSE
|
||||
OP1_sign <= '0';
|
||||
div_reg <= divisor;
|
||||
END IF;
|
||||
ELSE
|
||||
div_reg <= div_quot;
|
||||
nozero <= NOT div_bit OR nozero;
|
||||
END IF;
|
||||
IF micro_state=div2 THEN
|
||||
div_qsign <= NOT div_bit;
|
||||
div_neg <= signedOP AND (OP2out(31) XOR OP1_sign);
|
||||
IF DIV_Mode=0 THEN
|
||||
div_over(32 downto 16) <= ('0'&div_reg(47 downto 32))-('0'&OP2out(15 downto 0));
|
||||
ELSE
|
||||
div_over <= ('0'&div_reg(63 downto 32))-('0'&OP2out);
|
||||
END IF;
|
||||
END IF;
|
||||
IF exec(write_reminder)='0' THEN
|
||||
-- IF exec_DIVU='0' THEN
|
||||
IF div_neg='1' THEN
|
||||
result_div(31 downto 0) <= 0-div_quot(31 downto 0);
|
||||
ELSE
|
||||
result_div(31 downto 0) <= div_quot(31 downto 0);
|
||||
END IF;
|
||||
|
||||
IF OP1_sign='1' THEN
|
||||
result_div(63 downto 32) <= 0-div_quot(63 downto 32);
|
||||
ELSE
|
||||
result_div(63 downto 32) <= div_quot(63 downto 32);
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
END PROCESS;
|
||||
END;
|
250
TG68K_Pack.vhd
Normal file
250
TG68K_Pack.vhd
Normal file
@ -0,0 +1,250 @@
|
||||
------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------
|
||||
-- --
|
||||
-- Copyright (c) 2009-2013 Tobias Gubener --
|
||||
-- Subdesign fAMpIGA by TobiFlex --
|
||||
-- --
|
||||
-- This source file 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 source file 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 <http://www.gnu.org/licenses/>. --
|
||||
-- --
|
||||
------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------
|
||||
library IEEE;
|
||||
use IEEE.std_logic_1164.all;
|
||||
|
||||
package TG68K_Pack is
|
||||
|
||||
type micro_states is (idle, nop, ld_nn, st_nn, ld_dAn1, ld_AnXn1, ld_AnXn2, st_dAn1, ld_AnXnbd1, ld_AnXnbd2, ld_AnXnbd3,
|
||||
ld_229_1, ld_229_2, ld_229_3, ld_229_4, st_229_1, st_229_2, st_229_3, st_229_4,
|
||||
st_AnXn1, st_AnXn2, bra1, bsr1, bsr2, nopnop, dbcc1, movem1, movem2, movem3,
|
||||
andi, op_AxAy, cmpm, link1, link2, unlink1, unlink2, int1, int2, int3, int4, rte1, rte2, rte3, trap0, trap1, trap2, trap3,
|
||||
trap4, trap5, trap6, movec1, movep1, movep2, movep3, movep4, movep5, rota1, bf1,
|
||||
mul1, mul2, mul_end1, mul_end2, div1, div2, div3, div4, div_end1, div_end2, pack1, pack2, pack3);
|
||||
|
||||
constant opcMOVE : integer := 0; --
|
||||
constant opcMOVEQ : integer := 1; --
|
||||
constant opcMOVESR : integer := 2; --
|
||||
constant opcADD : integer := 3; --
|
||||
constant opcADDQ : integer := 4; --
|
||||
constant opcOR : integer := 5; --
|
||||
constant opcAND : integer := 6; --
|
||||
constant opcEOR : integer := 7; --
|
||||
constant opcCMP : integer := 8; --
|
||||
constant opcROT : integer := 9; --
|
||||
constant opcCPMAW : integer := 10;
|
||||
constant opcEXT : integer := 11; --
|
||||
constant opcABCD : integer := 12; --
|
||||
constant opcSBCD : integer := 13; --
|
||||
constant opcBITS : integer := 14; --
|
||||
constant opcSWAP : integer := 15; --
|
||||
constant opcScc : integer := 16; --
|
||||
constant andiSR : integer := 17; --
|
||||
constant eoriSR : integer := 18; --
|
||||
constant oriSR : integer := 19; --
|
||||
constant opcMULU : integer := 20; --
|
||||
constant opcDIVU : integer := 21; --
|
||||
constant dispouter : integer := 22; --
|
||||
constant rot_nop : integer := 23; --
|
||||
constant ld_rot_cnt : integer := 24; --
|
||||
constant writePC_add : integer := 25; --
|
||||
constant ea_data_OP1 : integer := 26; --
|
||||
constant ea_data_OP2 : integer := 27; --
|
||||
constant use_XZFlag : integer := 28; --
|
||||
constant get_bfoffset : integer := 29; --
|
||||
constant save_memaddr : integer := 30; --
|
||||
constant opcCHK : integer := 31; --
|
||||
constant movec_rd : integer := 32; --
|
||||
constant movec_wr : integer := 33; --
|
||||
constant Regwrena : integer := 34; --
|
||||
constant update_FC : integer := 35; --
|
||||
constant linksp : integer := 36; --
|
||||
constant movepl : integer := 37; --
|
||||
constant update_ld : integer := 38; --
|
||||
constant OP1addr : integer := 39; --
|
||||
constant write_reg : integer := 40; --
|
||||
constant changeMode : integer := 41; --
|
||||
constant ea_build : integer := 42; --
|
||||
constant trap_chk : integer := 43; --
|
||||
constant store_ea_data : integer := 44; --
|
||||
constant addrlong : integer := 45; --
|
||||
constant postadd : integer := 46; --
|
||||
constant presub : integer := 47; --
|
||||
constant subidx : integer := 48; --
|
||||
constant no_Flags : integer := 49; --
|
||||
constant use_SP : integer := 50; --
|
||||
constant to_CCR : integer := 51; --
|
||||
constant to_SR : integer := 52; --
|
||||
constant OP2out_one : integer := 53; --
|
||||
constant OP1out_zero : integer := 54; --
|
||||
constant mem_addsub : integer := 55; --
|
||||
constant addsub : integer := 56; --
|
||||
constant directPC : integer := 57; --
|
||||
constant direct_delta : integer := 58; --
|
||||
constant directSR : integer := 59; --
|
||||
constant directCCR : integer := 60; --
|
||||
constant exg : integer := 61; --
|
||||
constant get_ea_now : integer := 62; --
|
||||
constant ea_to_pc : integer := 63; --
|
||||
constant hold_dwr : integer := 64; --
|
||||
constant to_USP : integer := 65; --
|
||||
constant from_USP : integer := 66; --
|
||||
constant write_lowlong : integer := 67; --
|
||||
constant write_reminder : integer := 68; --
|
||||
constant movem_action : integer := 69; --
|
||||
constant briefext : integer := 70; --
|
||||
constant get_2ndOPC : integer := 71; --
|
||||
constant mem_byte : integer := 72; --
|
||||
constant longaktion : integer := 73; --
|
||||
constant opcRESET : integer := 74; --
|
||||
constant opcBF : integer := 75; --
|
||||
constant opcBFwb : integer := 76; --
|
||||
constant s2nd_hbits : integer := 77; --
|
||||
constant opcPACK : integer := 77; --
|
||||
-- constant s2nd_hbits : integer := 77; --
|
||||
|
||||
|
||||
-- constant : integer := 75; --
|
||||
-- constant : integer := 76; --
|
||||
-- constant : integer := 7; --
|
||||
-- constant : integer := 7; --
|
||||
-- constant : integer := 7; --
|
||||
|
||||
constant lastOpcBit : integer := 77;
|
||||
|
||||
type rTG68K_opc is record
|
||||
opcMOVE : bit;
|
||||
opcMOVEQ : bit;
|
||||
opcMOVESR : bit;
|
||||
opcADD : bit;
|
||||
opcADDQ : bit;
|
||||
opcOR : bit;
|
||||
opcAND : bit;
|
||||
opcEOR : bit;
|
||||
opcCMP : bit;
|
||||
opcROT : bit;
|
||||
opcCPMAW : bit;
|
||||
opcEXT : bit;
|
||||
opcABCD : bit;
|
||||
opcSBCD : bit;
|
||||
opcBITS : bit;
|
||||
opcSWAP : bit;
|
||||
opcScc : bit;
|
||||
andiSR : bit;
|
||||
eoriSR : bit;
|
||||
oriSR : bit;
|
||||
opcMULU : bit;
|
||||
opcDIVU : bit;
|
||||
dispouter : bit;
|
||||
rot_nop : bit;
|
||||
ld_rot_cnt : bit;
|
||||
writePC_add : bit;
|
||||
ea_data_OP1 : bit;
|
||||
ea_data_OP2 : bit;
|
||||
use_XZFlag : bit;
|
||||
get_bfoffset : bit;
|
||||
save_memaddr : bit;
|
||||
opcCHK : bit;
|
||||
movec_rd : bit;
|
||||
movec_wr : bit;
|
||||
Regwrena : bit;
|
||||
update_FC : bit;
|
||||
linksp : bit;
|
||||
movepl : bit;
|
||||
update_ld : bit;
|
||||
OP1addr : bit;
|
||||
write_reg : bit;
|
||||
changeMode : bit;
|
||||
ea_build : bit;
|
||||
trap_chk : bit;
|
||||
store_ea_data : bit;
|
||||
addrlong : bit;
|
||||
postadd : bit;
|
||||
presub : bit;
|
||||
subidx : bit;
|
||||
no_Flags : bit;
|
||||
use_SP : bit;
|
||||
to_CCR : bit;
|
||||
to_SR : bit;
|
||||
OP2out_one : bit;
|
||||
OP1out_zero : bit;
|
||||
mem_addsub : bit;
|
||||
addsub : bit;
|
||||
directPC : bit;
|
||||
direct_delta : bit;
|
||||
directSR : bit;
|
||||
directCCR : bit;
|
||||
exg : bit;
|
||||
get_ea_now : bit;
|
||||
ea_to_pc : bit;
|
||||
hold_dwr : bit;
|
||||
to_USP : bit;
|
||||
from_USP : bit;
|
||||
write_lowlong : bit;
|
||||
write_reminder : bit;
|
||||
movem_action : bit;
|
||||
briefext : bit;
|
||||
get_2ndOPC : bit;
|
||||
mem_byte : bit;
|
||||
longaktion : bit;
|
||||
opcRESET : bit;
|
||||
opcBF : bit;
|
||||
opcBFwb : bit;
|
||||
s2nd_hbits : bit;
|
||||
end record;
|
||||
|
||||
component TG68K_ALU
|
||||
generic(
|
||||
MUL_Mode : integer := 0; --0=>16Bit, 1=>32Bit, 2=>switchable with CPU(1), 3=>no MUL,
|
||||
DIV_Mode : integer := 0 --0=>16Bit, 1=>32Bit, 2=>switchable with CPU(1), 3=>no DIV,
|
||||
);
|
||||
port(
|
||||
clk : in std_logic;
|
||||
Reset : in std_logic;
|
||||
clkena_lw : in std_logic:='1';
|
||||
execOPC : in bit;
|
||||
exe_condition : in std_logic;
|
||||
exec_tas : in std_logic;
|
||||
long_start : in bit;
|
||||
movem_presub : in bit;
|
||||
set_stop : in bit;
|
||||
Z_error : in bit;
|
||||
rot_bits : in std_logic_vector(1 downto 0);
|
||||
exec : in bit_vector(lastOpcBit downto 0);
|
||||
OP1out : in std_logic_vector(31 downto 0);
|
||||
OP2out : in std_logic_vector(31 downto 0);
|
||||
reg_QA : in std_logic_vector(31 downto 0);
|
||||
reg_QB : in std_logic_vector(31 downto 0);
|
||||
opcode : in std_logic_vector(15 downto 0);
|
||||
datatype : in std_logic_vector(1 downto 0);
|
||||
exe_opcode : in std_logic_vector(15 downto 0);
|
||||
exe_datatype : in std_logic_vector(1 downto 0);
|
||||
sndOPC : in std_logic_vector(15 downto 0);
|
||||
last_data_read : in std_logic_vector(15 downto 0);
|
||||
data_read : in std_logic_vector(15 downto 0);
|
||||
FlagsSR : in std_logic_vector(7 downto 0);
|
||||
micro_state : in micro_states;
|
||||
bf_ext_in : in std_logic_vector(7 downto 0);
|
||||
bf_ext_out : out std_logic_vector(7 downto 0);
|
||||
bf_shift : in std_logic_vector(5 downto 0);
|
||||
bf_width : in std_logic_vector(5 downto 0);
|
||||
bf_loffset : in std_logic_vector(4 downto 0);
|
||||
|
||||
set_V_Flag : buffer bit;
|
||||
Flags : buffer std_logic_vector(7 downto 0);
|
||||
c_out : buffer std_logic_vector(2 downto 0);
|
||||
addsub_q : buffer std_logic_vector(31 downto 0);
|
||||
ALUout : out std_logic_vector(31 downto 0)
|
||||
);
|
||||
end component;
|
||||
|
||||
end;
|
3318
TG68KdotC_Kernel.vhd
Normal file
3318
TG68KdotC_Kernel.vhd
Normal file
File diff suppressed because it is too large
Load Diff
151
addrController_top.v
Normal file
151
addrController_top.v
Normal file
@ -0,0 +1,151 @@
|
||||
module addrController_top
|
||||
(
|
||||
// clocks:
|
||||
input clk,
|
||||
input cep, // 8.125 MHz CPU clock
|
||||
input cen, // 8.125 MHz CPU clock
|
||||
|
||||
// system config:
|
||||
input turbo, // 0 = normal, 1 = faster
|
||||
input configROMSize, // 0 = 64K ROM, 1 = 128K ROM
|
||||
input [1:0] configRAMSize, // 0 = 128K, 1 = 512K, 2 = 1MB, 3 = 4MB RAM
|
||||
|
||||
// 68000 CPU memory interface:
|
||||
input [23:0] cpuAddr,
|
||||
input _cpuUDS,
|
||||
input _cpuLDS,
|
||||
input _cpuRW,
|
||||
|
||||
// RAM/ROM:
|
||||
output [21:0] memoryAddr,
|
||||
output _memoryUDS,
|
||||
output _memoryLDS,
|
||||
output _romOE,
|
||||
output _ramOE,
|
||||
output _ramWE,
|
||||
output dioBusControl,
|
||||
output cpuBusControl,
|
||||
|
||||
// peripherals:
|
||||
output selectSCSI,
|
||||
output selectSCC,
|
||||
output selectIWM,
|
||||
output selectVIA,
|
||||
|
||||
// video:
|
||||
input _vblank,
|
||||
input _hblank,
|
||||
|
||||
input snd_alt,
|
||||
output loadSound,
|
||||
|
||||
// misc
|
||||
input memoryOverlayOn,
|
||||
|
||||
// interface to read dsk image from ram
|
||||
input [21:0] dskReadAddrInt,
|
||||
output dskReadAckInt,
|
||||
input [21:0] dskReadAddrExt,
|
||||
output dskReadAckExt
|
||||
);
|
||||
|
||||
// -------------- audio engine (may be moved into seperate module) ---------------
|
||||
assign loadSound = audioReq & sndReadAck;
|
||||
|
||||
reg [21:0] audioAddr;
|
||||
reg audioReq;
|
||||
always @(posedge clk) begin
|
||||
reg vblankD;
|
||||
reg hblankD;
|
||||
reg swap;
|
||||
reg sndReadAckD;
|
||||
|
||||
sndReadAckD <= sndReadAck;
|
||||
if(sndReadAckD & ~sndReadAck) begin // prepare for next audio cycle
|
||||
vblankD <= _vblank;
|
||||
hblankD <= _hblank;
|
||||
audioReq <= 0;
|
||||
|
||||
// falling adge of _vblank = begin of vblank phase
|
||||
if(vblankD && !_vblank) swap <= 1;
|
||||
|
||||
if(hblankD && !_hblank) begin
|
||||
if(swap) audioAddr <= snd_alt ? 22'h3FA100 : 22'h3FFD00;
|
||||
else audioAddr <= audioAddr + 22'd2;
|
||||
swap <= 0;
|
||||
audioReq <= 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// interleaved RAM access for CPU and periphery
|
||||
reg [3:0] cycle;
|
||||
wire [1:0] busCycle = cycle[1:0];
|
||||
wire [1:0] subCycle = cycle[3:2];
|
||||
always @(posedge clk) if(cep) cycle <= cycle + 2'd1;
|
||||
|
||||
assign cpuBusControl = turbo ? busCycle[0] : (busCycle == 1);
|
||||
assign dioBusControl = (busCycle == 2);
|
||||
|
||||
assign dskReadAckInt = dioBusControl && (subCycle == 0);
|
||||
assign dskReadAckExt = dioBusControl && (subCycle == 1);
|
||||
wire sndReadAck = (busCycle == 0);
|
||||
|
||||
|
||||
// interconnects
|
||||
wire selectRAM, selectROM;
|
||||
|
||||
// RAM/ROM control signals
|
||||
wire extraRomRead = dskReadAckInt || dskReadAckExt;
|
||||
assign _romOE = ~(extraRomRead || (cpuBusControl && selectROM && _cpuRW));
|
||||
|
||||
assign _ramOE = ~(loadSound || (cpuBusControl && selectRAM && _cpuRW));
|
||||
assign _ramWE = ~(cpuBusControl && selectRAM && !_cpuRW);
|
||||
|
||||
assign _memoryUDS = cpuBusControl ? _cpuUDS : 1'b0;
|
||||
assign _memoryLDS = cpuBusControl ? _cpuLDS : 1'b0;
|
||||
wire [21:0] addrMux = loadSound ? audioAddr : cpuAddr[21:0];
|
||||
wire [21:0] macAddr;
|
||||
assign macAddr[15:0] = addrMux[15:0];
|
||||
|
||||
// video and sound always addresses ram
|
||||
wire ram_access = (cpuBusControl && selectRAM) || loadSound;
|
||||
wire rom_access = (cpuBusControl && selectROM);
|
||||
|
||||
// simulate smaller RAM/ROM sizes
|
||||
assign macAddr[16] = rom_access && configROMSize == 1'b0 ? 1'b0 : // force A16 to 0 for 64K ROM access
|
||||
addrMux[16];
|
||||
assign macAddr[17] = ram_access && configRAMSize == 2'b00 ? 1'b0 : // force A17 to 0 for 128K RAM access
|
||||
rom_access && configROMSize == 1'b1 ? 1'b0 : // force A17 to 0 for 128K ROM access
|
||||
rom_access && configROMSize == 1'b0 ? 1'b1 : // force A17 to 1 for 64K ROM access (64K ROM image is at $20000)
|
||||
addrMux[17];
|
||||
assign macAddr[18] = ram_access && configRAMSize == 2'b00 ? 1'b0 : // force A18 to 0 for 128K RAM access
|
||||
rom_access ? 1'b0 : // force A18 to 0 for ROM access
|
||||
addrMux[18];
|
||||
assign macAddr[19] = ram_access && configRAMSize[1] == 1'b0 ? 1'b0 : // force A19 to 0 for 128K or 512K RAM access
|
||||
rom_access ? 1'b0 : // force A19 to 0 for ROM access
|
||||
addrMux[19];
|
||||
assign macAddr[20] = ram_access && configRAMSize != 2'b11 ? 1'b0 : // force A20 to 0 for all but 4MB RAM access
|
||||
rom_access ? 1'b0 : // force A20 to 0 for ROM access
|
||||
addrMux[20];
|
||||
assign macAddr[21] = ram_access && configRAMSize != 2'b11 ? 1'b0 : // force A21 to 0 for all but 4MB RAM access
|
||||
rom_access ? 1'b0 : // force A21 to 0 for ROM access
|
||||
addrMux[21];
|
||||
|
||||
assign memoryAddr =
|
||||
dskReadAckInt ? dskReadAddrInt + 22'h100000: // first dsk image at 1MB
|
||||
dskReadAckExt ? dskReadAddrExt + 22'h200000: // second dsk image at 2MB
|
||||
macAddr;
|
||||
|
||||
// address decoding
|
||||
addrDecoder ad(
|
||||
.address(cpuAddr),
|
||||
.memoryOverlayOn(memoryOverlayOn),
|
||||
.selectRAM(selectRAM),
|
||||
.selectROM(selectROM),
|
||||
.selectSCSI(selectSCSI),
|
||||
.selectSCC(selectSCC),
|
||||
.selectIWM(selectIWM),
|
||||
.selectVIA(selectVIA));
|
||||
|
||||
endmodule
|
132
addrDecoder.v
Normal file
132
addrDecoder.v
Normal file
@ -0,0 +1,132 @@
|
||||
/*
|
||||
($000000 - $03FFFF) RAM 4MB, or Overlay ROM 4MB
|
||||
|
||||
($400000 - $4FFFFF) ROM 1MB
|
||||
64K Mac 128K/512K ROM is $400000 - $40FFFF
|
||||
128K Mac 512Ke/Plus ROM is $400000 - $41FFFF
|
||||
If ROM is mirrored when A17 is 1, then SCSI is assumed to be unavailable
|
||||
|
||||
($580000 - $580FFF) SCSI (Mac Plus only, not implemented here)
|
||||
|
||||
($600000 - $7FFFFF) Overlay RAM 2MB
|
||||
|
||||
($9FFFF8 - $BFFFFF) SCC
|
||||
The SCC is on the upper byte of the data bus, so you must use only even-addressed byte reads.
|
||||
When writing, you must use only odd-addressed byte writes (the MC68000 puts your data on both bytes of the bus, so it works correctly).
|
||||
A byte read of an odd SCC read address tries to reset the entire SCC.
|
||||
A word access to any SCC address will shift the phase of the computer's high-frequency timing by 128 ns.
|
||||
|
||||
($9FFFF8) SCC read channel B control
|
||||
($9FFFFA) SCC read channel A control
|
||||
($9FFFFC) SCC read channel B data in/out
|
||||
($9FFFFE) SCC read channel A data in/out
|
||||
|
||||
($BFFFF9) SCC write channel B control
|
||||
($BFFFFB) SCC write channel A control
|
||||
($BFFFFD) SCC write channel B data in/out
|
||||
($BFFFFF) SCC write channel A data in/out
|
||||
|
||||
($DFE1FF - $DFFFFF) IWM
|
||||
The IWM is on the lower byte of the data bus, so use odd-addressed byte accesses only.
|
||||
The 16 IWM registers are {8'hDF, 8'b111xxxx1, 8'hFF}:
|
||||
0 $0 ph0L CA0 off (0)
|
||||
1 $200 ph0H CA0 on (1)
|
||||
2 $400 ph1L CA1 off (0)
|
||||
3 $600 ph1H CA1 on (1)
|
||||
4 $800 h2L CA2 off (0)
|
||||
5 $A00 ph2H CA2 on (1)
|
||||
6 $C00 ph3L LSTRB off (low)
|
||||
7 $E00 ph3H LSTRB on (high)
|
||||
8 $1000 mtrOff disk enable off
|
||||
9 $1200 mtrOn disk enable on
|
||||
10 $1400 intDrive select internal drive
|
||||
11 $1600 extDrive select external drive
|
||||
12 $1800 q6L Q6 off
|
||||
13 $1A00 q6H Q6 on
|
||||
14 $1C00 q7L Q7 off, read register
|
||||
15 $1E00 q7H Q7 on, write register
|
||||
|
||||
($EFE1FE - $EFFFFE) VIA
|
||||
The VIA is on the upper byte of the data bus, so use even-addressed byte accesses only.
|
||||
The 16 VIA registers are {8'hEF, 8'b111xxxx1, 8'hFE}:
|
||||
0 $0 vBufB register B
|
||||
1 $200 ????? not used?
|
||||
2 $400 vDirB register B direction register
|
||||
3 $600 vDirA register A direction register
|
||||
4 $800 vT1C timer 1 counter (low-order byte)
|
||||
5 $A00 vT1CH timer 1 counter (high-order byte)
|
||||
6 $C00 vT1L timer 1 latch (low-order byte)
|
||||
7 $E00 vT1LH timer 1 latch (high-order byte)
|
||||
8 $1000 vT2C timer 2 counter (low-order byte)
|
||||
9 $1200 vT2CH timer 2 counter (high-order byte)
|
||||
10 $1400 vSR shift register (keyboard)
|
||||
11 $1600 vACR auxiliary control register
|
||||
12 $1800 vPCR peripheral control register
|
||||
13 $1A00 vIFR interrupt flag register
|
||||
14 $1C00 vIER interrupt enable register
|
||||
15 $1E00 vBufA register A
|
||||
|
||||
($F00000 - $F00005) memory phase read test
|
||||
|
||||
($F80000 - $FFFFEF) space for test software
|
||||
|
||||
($FFFFF0 - $FFFFFF) interrupt vectors
|
||||
|
||||
Note: This can all be decoded using only the highest 4 address bits, if SCSI, phase read test, and test software are not used.
|
||||
7 other address bits are used by peripherals to determine which register to access:
|
||||
A12-A9 - IWM and VIA
|
||||
A2-A0 - SCC
|
||||
|
||||
*/
|
||||
|
||||
module addrDecoder(
|
||||
input [23:0] address,
|
||||
input memoryOverlayOn,
|
||||
output reg selectRAM,
|
||||
output reg selectROM,
|
||||
output reg selectSCSI,
|
||||
output reg selectSCC,
|
||||
output reg selectIWM,
|
||||
output reg selectVIA
|
||||
);
|
||||
|
||||
always @(*) begin
|
||||
selectRAM = 0;
|
||||
selectROM = 0;
|
||||
selectSCSI = 0;
|
||||
selectSCC = 0;
|
||||
selectIWM = 0;
|
||||
selectVIA = 0;
|
||||
|
||||
casez (address[23:20])
|
||||
4'b00??: begin
|
||||
if (memoryOverlayOn == 0)
|
||||
selectRAM = 1'b1;
|
||||
else begin
|
||||
if (address[23:20] == 0) begin
|
||||
// Mac Plus: repeated images of overlay ROM only extend to $0F0000
|
||||
// Mac 512K: more repeated ROM images at $020000-$02FFFF
|
||||
selectROM = 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
4'b0100:
|
||||
if( address[17] == 1'b0) // <- this detects SCSI!!!
|
||||
selectROM = 1'b1;
|
||||
4'b0101:
|
||||
if (address[19:12] == 8'h80)
|
||||
selectSCSI = 1'b1;
|
||||
4'b0110:
|
||||
if (memoryOverlayOn)
|
||||
selectRAM = 1'b1;
|
||||
4'b10?1:
|
||||
selectSCC = 1'b1;
|
||||
4'b1101:
|
||||
selectIWM = 1'b1;
|
||||
4'b1110:
|
||||
selectVIA = 1'b1;
|
||||
default:
|
||||
; // select nothing
|
||||
endcase
|
||||
end
|
||||
endmodule
|
37
clean.bat
Normal file
37
clean.bat
Normal file
@ -0,0 +1,37 @@
|
||||
@echo off
|
||||
del /s *.bak
|
||||
del /s *.orig
|
||||
del /s *.rej
|
||||
del /s *~
|
||||
rmdir /s /q db
|
||||
rmdir /s /q incremental_db
|
||||
rmdir /s /q output_files
|
||||
rmdir /s /q simulation
|
||||
rmdir /s /q greybox_tmp
|
||||
rmdir /s /q hc_output
|
||||
rmdir /s /q .qsys_edit
|
||||
rmdir /s /q hps_isw_handoff
|
||||
rmdir /s /q sys\.qsys_edit
|
||||
rmdir /s /q sys\vip
|
||||
cd sys
|
||||
for /d %%i in (*_sim) do rmdir /s /q "%%~nxi"
|
||||
cd ..
|
||||
for /d %%i in (*_sim) do rmdir /s /q "%%~nxi"
|
||||
del build_id.v
|
||||
del c5_pin_model_dump.txt
|
||||
del PLLJ_PLLSPE_INFO.txt
|
||||
del /s *.qws
|
||||
del /s *.ppf
|
||||
del /s *.ddb
|
||||
del /s *.csv
|
||||
del /s *.cmp
|
||||
del /s *.sip
|
||||
del /s *.spd
|
||||
del /s *.bsf
|
||||
del /s *.f
|
||||
del /s *.sopcinfo
|
||||
del /s *.xml
|
||||
del /s new_rtl_netlist
|
||||
del /s old_rtl_netlist
|
||||
|
||||
pause
|
299
dataController_top.v
Normal file
299
dataController_top.v
Normal file
@ -0,0 +1,299 @@
|
||||
module dataController_top(
|
||||
// clocks:
|
||||
input clk,
|
||||
input cep,
|
||||
input cen,
|
||||
|
||||
// system control:
|
||||
input _systemReset,
|
||||
|
||||
// 68000 CPU control:
|
||||
output _cpuReset,
|
||||
output [2:0] _cpuIPL,
|
||||
|
||||
// 68000 CPU memory interface:
|
||||
input [15:0] cpuDataIn,
|
||||
input [3:0] cpuAddrRegHi, // A12-A9
|
||||
input [2:0] cpuAddrRegMid, // A6-A4
|
||||
input [1:0] cpuAddrRegLo, // A2-A1
|
||||
input _cpuUDS,
|
||||
input _cpuLDS,
|
||||
input _cpuRW,
|
||||
output reg [15:0] cpuDataOut,
|
||||
|
||||
// peripherals:
|
||||
input selectSCSI,
|
||||
input selectSCC,
|
||||
input selectIWM,
|
||||
input selectVIA,
|
||||
|
||||
// RAM/ROM:
|
||||
input cpuBusControl,
|
||||
input [15:0] memoryDataIn,
|
||||
output [15:0] memoryDataOut,
|
||||
|
||||
// keyboard:
|
||||
input [64:0] ps2_key,
|
||||
output capslock,
|
||||
|
||||
// mouse:
|
||||
input [24:0] ps2_mouse,
|
||||
|
||||
// serial:
|
||||
input serialIn,
|
||||
output serialOut,
|
||||
|
||||
// video:
|
||||
input _hblank,
|
||||
input _vblank,
|
||||
|
||||
// audio
|
||||
output [10:0] audioOut, // 8 bit audio + 3 bit volume
|
||||
output snd_alt,
|
||||
input loadSound,
|
||||
|
||||
// misc
|
||||
output memoryOverlayOn,
|
||||
input [1:0] insertDisk,
|
||||
input [1:0] diskSides,
|
||||
output [1:0] diskEject,
|
||||
|
||||
output [1:0] diskMotor,
|
||||
output [1:0] diskAct,
|
||||
|
||||
output [21:0] dskReadAddrInt,
|
||||
input dskReadAckInt,
|
||||
output [21:0] dskReadAddrExt,
|
||||
input dskReadAckExt,
|
||||
|
||||
// connections to io controller
|
||||
output [31:0] io_lba,
|
||||
output io_rd,
|
||||
output io_wr,
|
||||
input io_ack,
|
||||
|
||||
input [8:0] sd_buff_addr,
|
||||
input [7:0] sd_buff_dout,
|
||||
output [7:0] sd_buff_din,
|
||||
input sd_buff_wr
|
||||
);
|
||||
|
||||
// add binary volume levels according to volume setting
|
||||
assign audioOut =
|
||||
(snd_vol[0] ? audio_latch : 11'd0) +
|
||||
(snd_vol[1] ? audio_latch<<1 : 11'd0) +
|
||||
(snd_vol[2] ? audio_latch<<2 : 11'd0);
|
||||
|
||||
reg [10:0] audio_latch;
|
||||
always @(posedge clk) begin
|
||||
reg loadSoundD;
|
||||
if(cen) loadSoundD <= loadSound;
|
||||
if(cep && loadSoundD) begin
|
||||
if(snd_ena) audio_latch <= 0;
|
||||
else audio_latch <= memoryDataIn[15:8];
|
||||
end
|
||||
end
|
||||
|
||||
// CPU reset generation
|
||||
// For initial CPU reset, RESET and HALT must be asserted for at least 100ms = 800,000 clocks of clk8
|
||||
reg [19:0] resetDelay; // 20 bits = 1 million
|
||||
wire isResetting = resetDelay != 0;
|
||||
|
||||
initial begin
|
||||
// force a reset when the FPGA configuration is completed
|
||||
resetDelay <= 20'hFFFFF;
|
||||
end
|
||||
|
||||
always @(posedge clk or negedge _systemReset) begin
|
||||
if (_systemReset == 1'b0) begin
|
||||
resetDelay <= 20'hFFFFF;
|
||||
end
|
||||
else if(cep && isResetting) begin
|
||||
resetDelay <= resetDelay - 1'b1;
|
||||
end
|
||||
end
|
||||
assign _cpuReset = isResetting ? 1'b0 : 1'b1;
|
||||
|
||||
// interconnects
|
||||
wire SEL;
|
||||
wire _viaIrq, _sccIrq, sccWReq;
|
||||
wire [15:0] viaDataOut;
|
||||
wire [15:0] iwmDataOut;
|
||||
wire [7:0] sccDataOut;
|
||||
wire [7:0] scsiDataOut;
|
||||
wire mouseX1, mouseX2, mouseY1, mouseY2, mouseButton;
|
||||
|
||||
// interrupt control
|
||||
assign _cpuIPL =
|
||||
!_viaIrq?3'b110:
|
||||
!_sccIrq?3'b101:
|
||||
3'b111;
|
||||
|
||||
// Serial port
|
||||
assign serialOut = 0;
|
||||
|
||||
// CPU-side data output mux
|
||||
always @(*) begin
|
||||
casex({selectIWM, selectVIA, selectSCC, selectSCSI})
|
||||
'b1xxx: cpuDataOut = iwmDataOut;
|
||||
'b01xx: cpuDataOut = viaDataOut;
|
||||
'b001x: cpuDataOut = { sccDataOut, 8'hEF };
|
||||
'b0001: cpuDataOut = { scsiDataOut, 8'hEF };
|
||||
'b0000: cpuDataOut = memoryDataIn;
|
||||
endcase
|
||||
end
|
||||
|
||||
// Memory-side
|
||||
assign memoryDataOut = cpuDataIn;
|
||||
|
||||
// SCSI
|
||||
ncr5380 scsi
|
||||
(
|
||||
.clk(clk),
|
||||
.ce(cep),
|
||||
|
||||
.reset(!_cpuReset),
|
||||
.bus_cs(selectSCSI && cpuBusControl),
|
||||
.bus_we(!_cpuRW),
|
||||
.bus_rs(cpuAddrRegMid),
|
||||
.dack(cpuAddrRegHi[0]), // A9
|
||||
.wdata(cpuDataIn[15:8]),
|
||||
.rdata(scsiDataOut),
|
||||
|
||||
// connections to io controller
|
||||
.io_lba ( io_lba ),
|
||||
.io_rd ( io_rd ),
|
||||
.io_wr ( io_wr ),
|
||||
.io_ack ( io_ack ),
|
||||
|
||||
.sd_buff_addr(sd_buff_addr),
|
||||
.sd_buff_dout(sd_buff_dout),
|
||||
.sd_buff_din(sd_buff_din),
|
||||
.sd_buff_wr(sd_buff_wr)
|
||||
);
|
||||
|
||||
|
||||
// VIA
|
||||
wire [2:0] snd_vol;
|
||||
wire snd_ena;
|
||||
|
||||
via v
|
||||
(
|
||||
.clk(clk),
|
||||
.cep(cep),
|
||||
.cen(cen),
|
||||
|
||||
._reset(_cpuReset),
|
||||
.selectVIA(selectVIA && cpuBusControl),
|
||||
._cpuRW(_cpuRW),
|
||||
._cpuUDS(_cpuUDS),
|
||||
.dataIn(cpuDataIn),
|
||||
.cpuAddrRegHi(cpuAddrRegHi),
|
||||
._hblank(_hblank),
|
||||
._vblank(_vblank),
|
||||
.mouseY2(mouseY2),
|
||||
.mouseX2(mouseX2),
|
||||
.mouseButton(mouseButton),
|
||||
.sccWReq(sccWReq),
|
||||
._irq(_viaIrq),
|
||||
.dataOut(viaDataOut),
|
||||
.memoryOverlayOn(memoryOverlayOn),
|
||||
.SEL(SEL),
|
||||
|
||||
.snd_vol(snd_vol),
|
||||
.snd_ena(snd_ena),
|
||||
.snd_alt(snd_alt),
|
||||
|
||||
.kbd_in_data(kbd_in_data),
|
||||
.kbd_in_strobe(kbd_in_strobe),
|
||||
.kbd_out_data(kbd_out_data),
|
||||
.kbd_out_strobe(kbd_out_strobe)
|
||||
);
|
||||
|
||||
// IWM
|
||||
iwm i
|
||||
(
|
||||
.clk(clk),
|
||||
.cep(cep),
|
||||
.cen(cen),
|
||||
|
||||
._reset(_cpuReset),
|
||||
.selectIWM(selectIWM && cpuBusControl),
|
||||
._cpuRW(_cpuRW),
|
||||
._cpuLDS(_cpuLDS),
|
||||
.dataIn(cpuDataIn),
|
||||
.cpuAddrRegHi(cpuAddrRegHi),
|
||||
.SEL(SEL),
|
||||
.dataOut(iwmDataOut),
|
||||
.insertDisk(insertDisk),
|
||||
.diskSides(diskSides),
|
||||
.diskEject(diskEject),
|
||||
.diskMotor(diskMotor),
|
||||
.diskAct(diskAct),
|
||||
|
||||
.dskReadAddrInt(dskReadAddrInt),
|
||||
.dskReadAckInt(dskReadAckInt),
|
||||
.dskReadAddrExt(dskReadAddrExt),
|
||||
.dskReadAckExt(dskReadAckExt),
|
||||
.dskReadData(memoryDataIn[7:0])
|
||||
);
|
||||
|
||||
// SCC
|
||||
scc s
|
||||
(
|
||||
.clk(clk),
|
||||
.cep(cep),
|
||||
.cen(cen),
|
||||
|
||||
.reset_hw(~_cpuReset),
|
||||
.cs(selectSCC && (_cpuLDS == 1'b0 || _cpuUDS == 1'b0) && cpuBusControl),
|
||||
.we(!_cpuRW),
|
||||
.rs(cpuAddrRegLo),
|
||||
.wdata(cpuDataIn[15:8]),
|
||||
.rdata(sccDataOut),
|
||||
._irq(_sccIrq),
|
||||
.dcd_a(mouseX1),
|
||||
.dcd_b(mouseY1),
|
||||
.wreq(sccWReq)
|
||||
);
|
||||
|
||||
// Mouse
|
||||
ps2_mouse mouse
|
||||
(
|
||||
.reset(~_cpuReset),
|
||||
|
||||
.clk(clk),
|
||||
.ce(cep),
|
||||
|
||||
.ps2_mouse(ps2_mouse),
|
||||
|
||||
.x1(mouseX1),
|
||||
.y1(mouseY1),
|
||||
.x2(mouseX2),
|
||||
.y2(mouseY2),
|
||||
.button(mouseButton)
|
||||
);
|
||||
|
||||
wire [7:0] kbd_in_data;
|
||||
wire kbd_in_strobe;
|
||||
wire [7:0] kbd_out_data;
|
||||
wire kbd_out_strobe;
|
||||
|
||||
// Keyboard
|
||||
ps2_kbd kbd
|
||||
(
|
||||
.reset(~_cpuReset),
|
||||
|
||||
.clk(clk),
|
||||
.ce(cep),
|
||||
|
||||
.ps2_key(ps2_key),
|
||||
.capslock(capslock),
|
||||
|
||||
.data_out(kbd_out_data), // data from mac
|
||||
.strobe_out(kbd_out_strobe),
|
||||
.data_in(kbd_in_data), // data to mac
|
||||
.strobe_in(kbd_in_strobe)
|
||||
);
|
||||
|
||||
endmodule
|
340
floppy.v
Normal file
340
floppy.v
Normal file
@ -0,0 +1,340 @@
|
||||
/* Synchronous 8-bit replica of 3.5 inch floppy disk drive.
|
||||
|
||||
Differences from the true floppy interace at the Mac's DB-19 port:
|
||||
True interface has a writeReq control line, only 1-bit readData and writeData, and no clk.
|
||||
True interface does not have newByteReady signal. Instead the IWM must watch the data in bit and synchronize with it to
|
||||
determine the timing and framing of bytes.
|
||||
|
||||
*/
|
||||
|
||||
/* Disk register (read):
|
||||
State-control lines Register
|
||||
CA2 CA1 CA0 SEL addressed Information in register
|
||||
|
||||
0 0 0 0 DIRTN Head step direction (0=toward track 79, 1=toward track 0)
|
||||
0 0 0 1 CSTIN Disk in place (0=disk is inserted)
|
||||
0 0 1 0 STEP Drive head stepping (setting to 0 performs a step, returns to 1 when step is complete)
|
||||
0 0 1 1 WRTPRT Disk locked (0=locked)
|
||||
0 1 0 0 MOTORON Drive motor running (0=on, 1=off)
|
||||
0 1 0 1 TKO Head at track 0 (0=at track 0)
|
||||
0 1 1 0 SWITCHED Disk switched (1=yes?)
|
||||
0 1 1 1 TACH Tachometer (produces 60 pulses for each rotation of the drive motor)
|
||||
1 0 0 0 RDDATA0 Read data, lower head, side 0
|
||||
1 0 0 1 RDDATA1 Read data, upper head, side 1
|
||||
1 0 1 0 SUPERDR Drive is a Superdrive (0=no, 1=yes)
|
||||
1 1 0 0 SIDES Single- or double-sided drive (0=single side, 1=double side)
|
||||
1 1 0 1 READY 0 = yes
|
||||
1 1 1 0 INSTALLED 0 = yes
|
||||
1 1 1 1 DRVIN 400K/800K: Drive installed (0=drive is present), Superdrive: Inserted disk capacity (0=HD, 1=DD)
|
||||
|
||||
Disk registers (write):
|
||||
Control lines Register
|
||||
CA1 CA0 SEL addressed Register function
|
||||
|
||||
0 0 0 DIRTN Set stepping direction (0=toward track 79, 1=toward track 0)
|
||||
0 0 1 SWITCHED Reset disk switched flag (writing 1 sets switch flag to 0)
|
||||
0 1 0 STEP Step the drive head one track (setting to 0 performs a step, returns to 1 when step is complete)
|
||||
1 0 0 MOTORON Turn on/off drive motor (0=on, 1=off)
|
||||
1 1 0 EJECT Eject the disk (writing 1 ejects the disk)
|
||||
|
||||
*/
|
||||
|
||||
`define DRIVE_REG_DIRTN 0 /* R/W: step direction (0=toward track 79, 1=toward track 0) */
|
||||
`define DRIVE_REG_CSTIN 1 /* R: disk in place (1 = no disk) */
|
||||
/* W: ?? reset disk switch flag ? */
|
||||
`define DRIVE_REG_STEP 2 /* R: drive head is stepping (1 = complete) */
|
||||
/* W: 0 = step drive head */
|
||||
`define DRIVE_REG_WRTPRT 3 /* R: 0 = disk is write-protected */
|
||||
`define DRIVE_REG_MOTORON 4 /* R/W: 0 = motor on */
|
||||
`define DRIVE_REG_TK0 5 /* R: 0 = head at track 0 */
|
||||
`define DRIVE_REG_EJECT 6 /* R: disk switched (1=yes?)*/
|
||||
/* W: 1 = eject the disk */
|
||||
`define DRIVE_REG_TACH 7 /* R: tach-o-meter */
|
||||
`define DRIVE_REG_RDDATA0 8 /* R: activate lower head: side 0 */
|
||||
`define DRIVE_REG_RDDATA1 9 /* R: activate upper head: side 1 */
|
||||
`define DRIVE_REG_SUPERDR 10 /* R: drive is a superdrive (0=no, 1=yes) */
|
||||
`define DRIVE_REG_SIDES 12 /* R: number of sides (0=single, 1=dbl) */
|
||||
`define DRIVE_REG_READY 13 /* R: drive ready (head loaded) (0=ready) */
|
||||
`define DRIVE_REG_INSTALLED 14 /* R: drive present (0 = yes ??) */
|
||||
`define DRIVE_REG_DRVIN 15 /* R: 400K/800k: drive present (0=yes, 1=no), Superdrive: disk capacity (0=HD, 1=DD) */
|
||||
|
||||
module floppy
|
||||
(
|
||||
input clk,
|
||||
input cep,
|
||||
input cen,
|
||||
|
||||
input _reset,
|
||||
input ca0, // PH0
|
||||
input ca1, // PH1
|
||||
input ca2, // PH2
|
||||
input SEL, // HDSEL from VIA
|
||||
input lstrb, // aka PH3
|
||||
input _enable,
|
||||
input [7:0] writeData,
|
||||
output [7:0] readData,
|
||||
|
||||
input advanceDriveHead, // prevents overrun when debugging, does not exist on a real Mac!
|
||||
output reg newByteReady,
|
||||
input insertDisk,
|
||||
input diskSides,
|
||||
output diskEject,
|
||||
|
||||
output motor,
|
||||
output act,
|
||||
|
||||
output [21:0] dskReadAddr,
|
||||
input dskReadAck,
|
||||
input [7:0] dskReadData
|
||||
);
|
||||
|
||||
assign motor = ~driveRegs[`DRIVE_REG_MOTORON];
|
||||
assign act = lstrbEdge;
|
||||
|
||||
reg [15:0] driveRegs;
|
||||
reg [6:0] driveTrack;
|
||||
reg driveSide;
|
||||
reg [7:0] diskDataIn; // incoming byte from the floppy disk
|
||||
|
||||
// read drive registers
|
||||
wire [15:0] driveRegsAsRead = {
|
||||
1'b0, // DRVIN = yes
|
||||
1'b0, // INSTALLED = yes
|
||||
1'b0, // READY = yes
|
||||
1'b1, // SIDES = double-sided drive
|
||||
1'b0, // UNUSED
|
||||
1'b0, // SUPERDR
|
||||
1'b0, // RDDATA1
|
||||
1'b0, // RDDATA0
|
||||
driveRegs[`DRIVE_REG_TACH], // TACH: 60 pules for each rotation of the drive motor
|
||||
1'b0, // disk switched?
|
||||
~(driveTrack == 7'h00), // TK0: track 0 indicator
|
||||
driveRegs[`DRIVE_REG_MOTORON], // motor on
|
||||
1'b0, // WRTPRT = locked
|
||||
1'b1, // STEP = complete
|
||||
driveRegs[`DRIVE_REG_CSTIN], // disk in drive
|
||||
driveRegs[`DRIVE_REG_DIRTN] // step direction
|
||||
};
|
||||
|
||||
reg dskReadAckD;
|
||||
always @(posedge clk) if(cen) dskReadAckD <= dskReadAck;
|
||||
|
||||
// latch incoming data
|
||||
reg [7:0] dskReadDataLatch;
|
||||
always @(posedge clk) if(cep && dskReadAckD) dskReadDataLatch <= dskReadData;
|
||||
|
||||
wire [7:0] dskReadDataEnc;
|
||||
|
||||
reg old_newByteReady;
|
||||
always @(posedge clk) old_newByteReady <= newByteReady;
|
||||
|
||||
// include track encoder
|
||||
floppy_track_encoder enc
|
||||
(
|
||||
|
||||
.clk ( clk ),
|
||||
.ready ( ~old_newByteReady & newByteReady ),
|
||||
|
||||
.rst ( !_reset ),
|
||||
|
||||
.side ( driveSide ),
|
||||
.sides ( doubleSidedDisk ),
|
||||
.track ( driveTrack ),
|
||||
|
||||
.addr ( dskReadAddr ),
|
||||
.idata ( dskReadDataLatch ),
|
||||
.odata ( dskReadDataEnc )
|
||||
);
|
||||
|
||||
// TODO: auto-detect doubleSidedDisk from image file size
|
||||
wire doubleSidedDisk = diskSides;
|
||||
|
||||
wire [3:0] driveReadAddr = {ca2,ca1,ca0,SEL};
|
||||
|
||||
// a byte is read or written every 128 clocks (2 us per bit * 8 bits = 16 us, @ 8 MHz = 128 clocks)
|
||||
// The CPU must poll for data at least this often, or else an overrun will occur.
|
||||
reg [6:0] diskDataByteTimer;
|
||||
reg [7:0] diskImageData;
|
||||
reg readyToAdvanceHead;
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 0) begin
|
||||
driveSide <= 0;
|
||||
diskImageData <= 8'h00;
|
||||
diskDataIn <= 8'hFF;
|
||||
diskDataByteTimer <= 0;
|
||||
readyToAdvanceHead <= 1;
|
||||
newByteReady <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
if(cep) begin
|
||||
// at time 0, latch a new byte and advance the drive head
|
||||
if (diskDataByteTimer == 0 && readyToAdvanceHead && diskImageData != 0) begin
|
||||
diskDataIn <= diskImageData;
|
||||
newByteReady <= 1;
|
||||
diskDataByteTimer <= 1; // make timer run again
|
||||
|
||||
// clear diskImageData after it's used, so we can tell when we get a new one from the disk
|
||||
diskImageData <= 0;
|
||||
|
||||
// for debugging, don't advance the head until the IWM says it's ready
|
||||
readyToAdvanceHead <= 1'b1; // TEMP: treat IWM as always ready
|
||||
end
|
||||
|
||||
// extraRomReadAck comes every hsync which is every 21us. The iwm data rates
|
||||
// is 8MHZ/128 = 16us
|
||||
else begin
|
||||
// a timer governs when the next disk byte will become available
|
||||
diskDataByteTimer <= diskDataByteTimer + 1'b1;
|
||||
|
||||
newByteReady <= 1'b0;
|
||||
|
||||
if (dskReadAck) begin
|
||||
// whenever ACK is received, store the data from the current diskImageAddr
|
||||
diskImageData <= dskReadDataEnc; // xyz
|
||||
end
|
||||
|
||||
if (advanceDriveHead) begin
|
||||
readyToAdvanceHead <= 1'b1;
|
||||
end
|
||||
end
|
||||
|
||||
// switch drive sides if DRIVE_REG_RDDATA0 or DRIVE_REG_RDDATA1 are read
|
||||
// TODO: we don't know if this is a true read, since we don't know if IWM is selected or
|
||||
// could be bad if we use this test to flush a cache of encoded disk data
|
||||
if (driveReadAddr == `DRIVE_REG_RDDATA0 && lstrb == 1'b0)
|
||||
driveSide <= 0;
|
||||
if (driveReadAddr == `DRIVE_REG_RDDATA1 && lstrb == 1'b0)
|
||||
driveSide <= 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// create a signal on the falling edge of lstrb
|
||||
reg lstrbPrev;
|
||||
always @(posedge clk) if(cep) lstrbPrev <= lstrb;
|
||||
|
||||
wire lstrbEdge = lstrb == 1'b0 && lstrbPrev == 1'b1;
|
||||
|
||||
assign readData = (driveReadAddr == `DRIVE_REG_RDDATA0 || driveReadAddr == `DRIVE_REG_RDDATA1) ? diskDataIn :
|
||||
{ driveRegsAsRead[driveReadAddr], 7'h00 };
|
||||
|
||||
// write drive registers
|
||||
wire [2:0] driveWriteAddr = {ca1,ca0,SEL};
|
||||
|
||||
// DRIVE_REG_DIRTN 0 /* R/W: step direction (0=toward track 79, 1=toward track 0) */
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0) begin
|
||||
driveRegs[`DRIVE_REG_DIRTN] <= 1'b0;
|
||||
end
|
||||
else if(cep && _enable == 1'b0 && lstrbEdge == 1'b1 && driveWriteAddr == `DRIVE_REG_DIRTN) begin
|
||||
driveRegs[`DRIVE_REG_DIRTN] <= ca2;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
// DRIVE_REG_CSTIN 1 /* R: disk in place (1 = no disk) */
|
||||
/* W: ?? reset disk switch flag ? */
|
||||
// disk in drive indicators
|
||||
reg [23:0] ejectIndicatorTimer;
|
||||
assign diskEject = (ejectIndicatorTimer != 0);
|
||||
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0) begin
|
||||
driveRegs[`DRIVE_REG_CSTIN] <= 1'b1;
|
||||
ejectIndicatorTimer <= 24'd0;
|
||||
end
|
||||
else if(cep) begin
|
||||
if (_enable == 1'b0 && lstrbEdge == 1'b1 && driveWriteAddr == `DRIVE_REG_EJECT && ca2 == 1'b1) begin
|
||||
// eject the disk
|
||||
driveRegs[`DRIVE_REG_CSTIN] <= 1'b1;
|
||||
ejectIndicatorTimer <= 24'hFFFFFF;
|
||||
end
|
||||
else if (insertDisk) begin
|
||||
// insert a disk
|
||||
driveRegs[`DRIVE_REG_CSTIN] <= 1'b0;
|
||||
end
|
||||
else begin
|
||||
if (ejectIndicatorTimer != 0)
|
||||
ejectIndicatorTimer <= ejectIndicatorTimer - 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//`define DRIVE_REG_STEP 2 /* R: drive head stepping (1 = complete) */
|
||||
/* W: 0 = step drive head */
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0) begin
|
||||
driveTrack <= 0;
|
||||
end
|
||||
else if(cep && _enable == 1'b0 && lstrbEdge == 1'b1 && driveWriteAddr == `DRIVE_REG_STEP && ca2 == 1'b0) begin
|
||||
if (driveRegs[`DRIVE_REG_DIRTN] == 1'b0 && driveTrack != 7'h4F) begin
|
||||
driveTrack <= driveTrack + 1'b1;
|
||||
end
|
||||
if (driveRegs[`DRIVE_REG_DIRTN] == 1'b1 && driveTrack != 0) begin
|
||||
driveTrack <= driveTrack - 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// DRIVE_REG_MOTORON 4 /* R/W: 0 = motor on */
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0) begin
|
||||
driveRegs[`DRIVE_REG_MOTORON] <= 1'b1;
|
||||
end
|
||||
else if (cep && _enable == 1'b0 && lstrbEdge == 1'b1 && driveWriteAddr == `DRIVE_REG_MOTORON) begin
|
||||
driveRegs[`DRIVE_REG_MOTORON] <= ca2;
|
||||
end
|
||||
end
|
||||
|
||||
// DRIVE_REG_TACH 7 Tachometer (produces 60 pulses for each rotation of the drive motor)
|
||||
/* Data from MESS, sonydriv.c:
|
||||
Tracks RPM Timing Value
|
||||
00-15: 500 timing value $117B (acceptable range {1135-11E9})
|
||||
16-31: 550 timing value $???? (acceptable range {12C6-138A})
|
||||
32-47: 600 timing value $???? (acceptable range {14A7-157F})
|
||||
48-63: 675 timing value $???? (acceptable range {16F2-17E2})
|
||||
64-79: 750 timing value $???? (acceptable range {19D0-1ADE})
|
||||
|
||||
Experimentally determined toggle rates for Plus Too with 8.125 MHz CPU clock:
|
||||
TACH Half Period Clocks Resulting Timing Value
|
||||
9996 $117B (4475)
|
||||
9122 $1328 (4904)
|
||||
8292 $1513 (5395)
|
||||
7463 $176A (5994)
|
||||
6634 $1A56 (6742)
|
||||
*/
|
||||
|
||||
reg [13:0] driveTachTimer;
|
||||
reg [13:0] driveTachPeriod;
|
||||
|
||||
always @(*) begin
|
||||
case (driveTrack[6:4])
|
||||
0: // tracks 0-15
|
||||
driveTachPeriod <= 9996;
|
||||
1: // tracks 16-31
|
||||
driveTachPeriod <= 9122;
|
||||
2: // tracks 32-47
|
||||
driveTachPeriod <= 8292;
|
||||
3: // tracks 48-63
|
||||
driveTachPeriod <= 7463;
|
||||
default: // tracks 64-79
|
||||
driveTachPeriod <= 6634;
|
||||
endcase
|
||||
end
|
||||
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0) begin
|
||||
driveRegs[`DRIVE_REG_TACH] <= 1'b0;
|
||||
driveTachTimer <= 0;
|
||||
end
|
||||
else if(cep) begin
|
||||
if (driveTachTimer == driveTachPeriod) begin
|
||||
driveTachTimer <= 0;
|
||||
driveRegs[`DRIVE_REG_TACH] <= ~driveRegs[`DRIVE_REG_TACH];
|
||||
end
|
||||
else begin
|
||||
driveTachTimer <= driveTachTimer + 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
endmodule
|
367
floppy_track_encoder.v
Normal file
367
floppy_track_encoder.v
Normal file
@ -0,0 +1,367 @@
|
||||
/*
|
||||
floppy_track_encoder.v
|
||||
|
||||
encode a full floppy track from raw sector data on the fly
|
||||
|
||||
*/
|
||||
|
||||
/* verilator lint_off UNUSED */
|
||||
/* verilator lint_off UNDRIVEN */
|
||||
/* verilator lint_off CASEINCOMPLETE */
|
||||
|
||||
module floppy_track_encoder (
|
||||
// system signals
|
||||
input clk, // clock at which data bytes are delivered via odata
|
||||
input ready,
|
||||
input rst,
|
||||
|
||||
input side,
|
||||
input sides,
|
||||
input [6:0] track, // current track
|
||||
|
||||
output [21:0] addr, // address to fetch from
|
||||
input [7:0] idata,
|
||||
|
||||
output [7:0] odata
|
||||
);
|
||||
|
||||
assign addr =
|
||||
{ 3'b00, soff, 9'd0 } + // sector offset * 512 for two sides
|
||||
(sides?{ 3'b00, soff, 9'd0 }:22'd0) + // another sector offset * 512 for two sides
|
||||
(side?{ 9'd0, spt, 9'd0 }:22'd0) + // side * sectors * 512
|
||||
{ 9'd0, sector, src_offset }; // offset within track
|
||||
|
||||
// number of sectors on current track
|
||||
wire [3:0] spt =
|
||||
(track[6:4] == 3'd0)?4'd12: // track 0 - 15
|
||||
(track[6:4] == 3'd1)?4'd11: // track 16 - 31
|
||||
(track[6:4] == 3'd2)?4'd10: // track 32 - 47
|
||||
(track[6:4] == 3'd3)?4'd9: // track 48 - 63
|
||||
4'd8; // track 64 - ...
|
||||
|
||||
// all possible tack*sector factors
|
||||
wire [9:0] track_times_12 = // x*12 = x*8 + x*4
|
||||
{ track, 3'b000 } + // x<<3 +
|
||||
{ 1'b0, track, 2'b00 }; // x<<2
|
||||
|
||||
wire [9:0] track_times_11 = // x*11 = x*8 + x*2 + x*1
|
||||
{ track, 3'b000 } + // x<<3 +
|
||||
{ 2'b00, track, 1'b0 } + // x<<1 +
|
||||
{ 3'b000, track }; // x<<0
|
||||
|
||||
wire [9:0] track_times_10 = // x*10 = x*8 + x*2
|
||||
{ track, 3'b000 } + // x<<3 +
|
||||
{ 2'b00, track, 1'b0 }; // x<<1
|
||||
|
||||
wire [9:0] track_times_9 = // x*9 = x*8 + x*1
|
||||
{ track, 3'b000 } + // x<<3 +
|
||||
{ 3'b000, track }; // x<<0
|
||||
|
||||
wire [9:0] track_times_8 = // x*8
|
||||
{ track, 3'b000 }; // x<<3
|
||||
|
||||
// sector offset of current track is the sum of all sectors on all tracks before
|
||||
wire [6:0] trackm1 = track - 7'd1;
|
||||
wire [9:0] soff =
|
||||
(track == 0)?10'd0: // track 0
|
||||
(trackm1[6:4] == 3'd0)?track_times_12: // track 1 - 16
|
||||
(trackm1[6:4] == 3'd1)?(track_times_11 + 10'd16): // track 17 - 32
|
||||
(trackm1[6:4] == 3'd2)?(track_times_10 + 10'd32 + 10'd16): // track 33 - 48
|
||||
(trackm1[6:4] == 3'd3)?(track_times_9 + 10'd48 + 10'd32 + 10'd16): // track 49 - 64
|
||||
(track_times_8 + 10'd64 + 10'd48 + 10'd32 + 10'd16); // track 65 -
|
||||
|
||||
// parts of an address block
|
||||
wire [5:0] sec_in_tr = {2'b00, sector};
|
||||
wire [5:0] track_low = track[5:0];
|
||||
wire [5:0] track_hi = { side, 4'b0000, track[6] };
|
||||
wire [5:0] format = { sides, 5'h2 }; // double sided = 22, single sided = 2
|
||||
wire [5:0] checksum = track_low ^ sec_in_tr ^ track_hi ^ format;
|
||||
|
||||
// data input to the sony encoder during address block
|
||||
wire [5:0] sony_addr_in =
|
||||
(count == 3)?track_low:
|
||||
(count == 4)?sec_in_tr:
|
||||
(count == 5)?track_hi:
|
||||
(count == 6)?format:
|
||||
checksum;
|
||||
|
||||
// data input to the sony encoder during data header
|
||||
wire [5:0] sony_dhdr_in = sec_in_tr;
|
||||
|
||||
wire [5:0] sony_dsum_in =
|
||||
(count == 0)?{ c3[7:6], c2[7:6], c1[7:6] }:
|
||||
(count == 1)?c3[5:0]:
|
||||
(count == 2)?c2[5:0]:
|
||||
c1[5:0];
|
||||
|
||||
// feed data into sony encoder
|
||||
wire [5:0] si =
|
||||
(state == STATE_ADDR)?sony_addr_in:
|
||||
(state == STATE_DHDR)?sony_dhdr_in:
|
||||
(state == STATE_DZRO)?nib_out:
|
||||
(state == STATE_DPRE)?nib_out:
|
||||
(state == STATE_DATA)?nib_out:
|
||||
(state == STATE_DSUM)?sony_dsum_in:
|
||||
6'h3f;
|
||||
|
||||
// encoder table taken from MESS emulator
|
||||
wire [7:0] sony_to_disk_byte =
|
||||
(si==6'h00)?8'h96:(si==6'h01)?8'h97:(si==6'h02)?8'h9a:(si==6'h03)?8'h9b: // 0x00
|
||||
(si==6'h04)?8'h9d:(si==6'h05)?8'h9e:(si==6'h06)?8'h9f:(si==6'h07)?8'ha6:
|
||||
(si==6'h08)?8'ha7:(si==6'h09)?8'hab:(si==6'h0a)?8'hac:(si==6'h0b)?8'had:
|
||||
(si==6'h0c)?8'hae:(si==6'h0d)?8'haf:(si==6'h0e)?8'hb2:(si==6'h0f)?8'hb3:
|
||||
|
||||
(si==6'h10)?8'hb4:(si==6'h11)?8'hb5:(si==6'h12)?8'hb6:(si==6'h13)?8'hb7: // 0x10
|
||||
(si==6'h14)?8'hb9:(si==6'h15)?8'hba:(si==6'h16)?8'hbb:(si==6'h17)?8'hbc:
|
||||
(si==6'h18)?8'hbd:(si==6'h19)?8'hbe:(si==6'h1a)?8'hbf:(si==6'h1b)?8'hcb:
|
||||
(si==6'h1c)?8'hcd:(si==6'h1d)?8'hce:(si==6'h1e)?8'hcf:(si==6'h1f)?8'hd3:
|
||||
|
||||
(si==6'h20)?8'hd6:(si==6'h21)?8'hd7:(si==6'h22)?8'hd9:(si==6'h23)?8'hda: // 0x20
|
||||
(si==6'h24)?8'hdb:(si==6'h25)?8'hdc:(si==6'h26)?8'hdd:(si==6'h27)?8'hde:
|
||||
(si==6'h28)?8'hdf:(si==6'h29)?8'he5:(si==6'h2a)?8'he6:(si==6'h2b)?8'he7:
|
||||
(si==6'h2c)?8'he9:(si==6'h2d)?8'hea:(si==6'h2e)?8'heb:(si==6'h2f)?8'hec:
|
||||
|
||||
(si==6'h30)?8'hed:(si==6'h31)?8'hee:(si==6'h32)?8'hef:(si==6'h33)?8'hf2: // 0x30
|
||||
(si==6'h34)?8'hf3:(si==6'h35)?8'hf4:(si==6'h36)?8'hf5:(si==6'h37)?8'hf6:
|
||||
(si==6'h38)?8'hf7:(si==6'h39)?8'hf9:(si==6'h3a)?8'hfa:(si==6'h3b)?8'hfb:
|
||||
(si==6'h3c)?8'hfc:(si==6'h3d)?8'hfd:(si==6'h3e)?8'hfe: 8'hff;
|
||||
|
||||
// states of encoder state machine
|
||||
localparam STATE_SYN0 = 4'd0; // 56 bytes sync pattern (0xff)
|
||||
localparam STATE_ADDR = 4'd1; // 10 bytes address block
|
||||
localparam STATE_SYN1 = 4'd2; // 5 bytes sync pattern (0xff)
|
||||
localparam STATE_DHDR = 4'd3; // 4 bytes data block header
|
||||
localparam STATE_DZRO = 4'd4; // 8 encoded zero bytes in data block
|
||||
localparam STATE_DPRE = 4'd5; // 4 bytes data prefetch
|
||||
localparam STATE_DATA = 4'd6; // the payload itself
|
||||
localparam STATE_DSUM = 4'd7; // 4 bytes data checksum
|
||||
localparam STATE_DTRL = 4'd8; // 3 bytes data block trailer
|
||||
localparam STATE_WAIT = 4'd15; // wait until start of next sector
|
||||
|
||||
// output data during address block
|
||||
wire [7:0] odata_addr =
|
||||
(count == 0)?8'hd5:
|
||||
(count == 1)?8'haa:
|
||||
(count == 2)?8'h96:
|
||||
(count == 8)?8'hde:
|
||||
(count == 9)?8'haa:
|
||||
sony_to_disk_byte;
|
||||
|
||||
wire [7:0] odata_dhdr =
|
||||
(count == 0)?8'hd5:
|
||||
(count == 1)?8'haa:
|
||||
(count == 2)?8'had:
|
||||
sony_to_disk_byte;
|
||||
|
||||
wire [7:0] odata_dtrl =
|
||||
(count == 0)?8'hde:
|
||||
(count == 1)?8'haa:
|
||||
8'hff;
|
||||
|
||||
// demultiplex output data
|
||||
assign odata = (state == STATE_ADDR)?odata_addr:
|
||||
(state == STATE_DHDR)?odata_dhdr:
|
||||
(state == STATE_DZRO)?sony_to_disk_byte:
|
||||
(state == STATE_DPRE)?sony_to_disk_byte:
|
||||
(state == STATE_DATA)?sony_to_disk_byte:
|
||||
(state == STATE_DSUM)?sony_to_disk_byte:
|
||||
(state == STATE_DTRL)?odata_dtrl:
|
||||
8'hff;
|
||||
|
||||
// ------------------------ nibbler ----------------------------
|
||||
|
||||
reg [7:0] c1;
|
||||
reg [7:0] c2;
|
||||
reg c2x;
|
||||
reg [7:0] c3;
|
||||
reg c3x;
|
||||
|
||||
wire nibbler_reset = (state == STATE_DHDR);
|
||||
reg [1:0] cnt;
|
||||
|
||||
reg [7:0] nib_xor_0;
|
||||
reg [7:0] nib_xor_1;
|
||||
reg [7:0] nib_xor_2;
|
||||
|
||||
// request an input byte. this happens 4 byte ahead of output.
|
||||
// only three bytes are read while four bytes are written due
|
||||
// to 6:2 encoding
|
||||
wire strobe = ((state == STATE_DPRE) ||
|
||||
((state == STATE_DATA) && (count < 683-4-1)))
|
||||
&& (cnt != 3);
|
||||
|
||||
reg [7:0] data_latch;
|
||||
always @(posedge clk) if(ready && strobe) data_latch <= idata;
|
||||
|
||||
always @(posedge clk or posedge nibbler_reset) begin
|
||||
if(nibbler_reset) begin
|
||||
c1 <= 8'h00;
|
||||
c2 <= 8'h00;
|
||||
c2x <= 1'b0;
|
||||
c3 <= 8'h00;
|
||||
c3x <= 1'b0;
|
||||
cnt <= 2'd0;
|
||||
nib_xor_0 <= 8'h00;
|
||||
nib_xor_1 <= 8'h00;
|
||||
nib_xor_2 <= 8'h00;
|
||||
end else if(ready && ((state == STATE_DPRE) || (state == STATE_DATA))) begin
|
||||
cnt <= cnt + 2'd1;
|
||||
|
||||
// memory read during cnt 0-3
|
||||
if(count < 683-4) begin
|
||||
|
||||
// encode first byte
|
||||
if(cnt == 1) begin
|
||||
c1 <= { c1[6:0], c1[7] };
|
||||
{ c3x, c3 } <= { 1'b0, c3 } + { 1'b0, nib_in } + { 8'd0, c1[7] };
|
||||
nib_xor_0 <= nib_in ^ { c1[6:0], c1[7] };
|
||||
end
|
||||
|
||||
// encode second byte
|
||||
if(cnt == 2) begin
|
||||
{ c2x, c2 } <= { 1'b0, c2 } + { 1'b0, nib_in } + { 8'd0, c3x };
|
||||
c3x <= 1'b0;
|
||||
nib_xor_1 <= nib_in ^ c3;
|
||||
end
|
||||
|
||||
// encode third byte
|
||||
if(cnt == 3) begin
|
||||
c1 <= c1 + nib_in + { 7'd0, c2x };
|
||||
c2x <= 1'b0;
|
||||
nib_xor_2 <= nib_in ^ c2;
|
||||
end
|
||||
end else begin
|
||||
// since there are 512/3 = 170 2/3 three byte blocks in a sector the
|
||||
// last run has to be filled up with zeros
|
||||
if(cnt == 3)
|
||||
nib_xor_2 <= 8'h00;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// bytes going into the nibbler
|
||||
wire [7:0] nib_in =
|
||||
(state == STATE_DZRO)?8'h00:
|
||||
data_latch;
|
||||
|
||||
// four six bit units come out of the nibbler
|
||||
wire [5:0] nib_out =
|
||||
(cnt == 1)?nib_xor_0[5:0]:
|
||||
(cnt == 2)?nib_xor_1[5:0]:
|
||||
(cnt == 3)?nib_xor_2[5:0]:
|
||||
{ nib_xor_0[7:6], nib_xor_1[7:6], nib_xor_2[7:6] };
|
||||
|
||||
// count bytes per sector
|
||||
reg [3:0] state;
|
||||
reg [9:0] count;
|
||||
reg [3:0] sector;
|
||||
reg [8:0] src_offset;
|
||||
always @(posedge clk or posedge rst) begin
|
||||
if(rst) begin
|
||||
count <= 10'd0;
|
||||
state <= STATE_SYN0;
|
||||
sector <= 4'd0;
|
||||
src_offset <= 9'd0;
|
||||
end else if(ready) begin
|
||||
count <= count + 10'd1;
|
||||
|
||||
if(strobe)
|
||||
src_offset <= src_offset + 9'd1;
|
||||
|
||||
case(state)
|
||||
|
||||
// send 14*4=56 sync bytes
|
||||
STATE_SYN0: begin
|
||||
if(count == 55) begin
|
||||
state <= STATE_ADDR;
|
||||
count <= 10'd0;
|
||||
end
|
||||
end
|
||||
|
||||
// send 10 bytes address block
|
||||
STATE_ADDR: begin
|
||||
if(count == 9) begin
|
||||
state <= STATE_SYN1;
|
||||
count <= 10'd0;
|
||||
end
|
||||
end
|
||||
|
||||
// send 5 sync bytes
|
||||
STATE_SYN1: begin
|
||||
if(count == 4) begin
|
||||
state <= STATE_DHDR;
|
||||
count <= 10'd0;
|
||||
end
|
||||
end
|
||||
|
||||
// send 4 bytes data block hdr
|
||||
STATE_DHDR: begin
|
||||
if(count == 3) begin
|
||||
state <= STATE_DZRO;
|
||||
count <= 10'd0;
|
||||
end
|
||||
end
|
||||
|
||||
// send 8 zero bytes before data block
|
||||
STATE_DZRO: begin
|
||||
if(count == 11) begin
|
||||
state <= STATE_DPRE;
|
||||
count <= 10'd0;
|
||||
end
|
||||
end
|
||||
|
||||
// start prefetching 4 bytes data
|
||||
STATE_DPRE: begin
|
||||
if(count == 3) begin
|
||||
state <= STATE_DATA;
|
||||
count <= 10'd0;
|
||||
end
|
||||
end
|
||||
|
||||
// send 512 bytes data block 6:2 encoded in 683 bytes
|
||||
STATE_DATA: begin
|
||||
if(count == 682) begin
|
||||
state <= STATE_DSUM;
|
||||
count <= 10'd0;
|
||||
end
|
||||
end
|
||||
|
||||
// send 4 bytes data checksum
|
||||
STATE_DSUM: begin
|
||||
if(count == 3) begin
|
||||
state <= STATE_DTRL;
|
||||
count <= 10'd0;
|
||||
end
|
||||
end
|
||||
|
||||
// send 3 bytes data block trailer
|
||||
STATE_DTRL: begin
|
||||
if(count == 2) begin
|
||||
state <= STATE_WAIT;
|
||||
count <= 10'd0;
|
||||
end
|
||||
end
|
||||
|
||||
// fill sector up to 1024 bytes
|
||||
STATE_WAIT: begin
|
||||
// if(count == 1023-56-10-5-4-12-4-683-4-3)
|
||||
begin
|
||||
count <= 10'd0;
|
||||
state <= STATE_SYN0;
|
||||
src_offset <= 9'd0;
|
||||
|
||||
// interleave of 1
|
||||
// if(sector != spt-4'd1) sector <= sector + 4'd1;
|
||||
// else sector <= 4'd0;
|
||||
|
||||
// interleave of 2
|
||||
if((sector == spt-4'd2) ||
|
||||
(sector == spt-4'd1)) sector <= { 3'd0, !sector[0] };
|
||||
else sector <= sector + 4'd2;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
308
iwm.v
Normal file
308
iwm.v
Normal file
@ -0,0 +1,308 @@
|
||||
/* IWM
|
||||
|
||||
Mapped to $DFE1FF - $DFFFFF
|
||||
|
||||
The 16 IWM one-bit registers are {8'hDF, 8'b111xxxx1, 8'hFF}:
|
||||
0 $0 ca0L CA0 off (0)
|
||||
1 $200 ca0H CA0 on (1)
|
||||
2 $400 ca1L CA1 off (0)
|
||||
3 $600 ca1H CA1 on (1)
|
||||
4 $800 ca2L CA2 off (0)
|
||||
5 $A00 ca2H CA2 on (1)
|
||||
6 $C00 ph3L LSTRB off (low)
|
||||
7 $E00 ph3H LSTRB on (high)
|
||||
8 $1000 mtrOff ENABLE disk enable off
|
||||
9 $1200 mtrOn ENABLE disk enable on
|
||||
10 $1400 intDrive SELECT select internal drive
|
||||
11 $1600 extDrive SELECT select external drive
|
||||
12 $1800 q6L Q6 off
|
||||
13 $1A00 q6H Q6 on
|
||||
14 $1C00 q7L Q7 off, read register
|
||||
15 $1E00 q7H Q7 on, write register
|
||||
|
||||
Notes from IWM manual:
|
||||
Serial data is shifted in/out MSB first, with a bit transferred every 2 microseconds.
|
||||
When writing data, a 1 is written as a transition on writeData at a bit cell boundary time, and a 0 is written as no transition.
|
||||
When reading data, a falling transition within a bit cell window is considered to be a 1, and no falling transition is considered a 0.
|
||||
When reading data, the read data register will latch the shift register when a 1 is shifted into the MSB.
|
||||
The read data register will be cleared 14 fclk periods (about 2 microseconds) after a valid data read takes place-- a valid data read
|
||||
being defined as both /DEV being low and D7 (the MSB) outputting a one from the read data register for at least one fclk period.
|
||||
*/
|
||||
|
||||
module iwm
|
||||
(
|
||||
input clk,
|
||||
input cep,
|
||||
input cen,
|
||||
|
||||
input clk8,
|
||||
|
||||
input _reset,
|
||||
input selectIWM,
|
||||
input _cpuRW,
|
||||
input _cpuLDS,
|
||||
input [15:0] dataIn,
|
||||
input [3:0] cpuAddrRegHi,
|
||||
input SEL, // from VIA
|
||||
output [15:0] dataOut,
|
||||
input [1:0] insertDisk,
|
||||
output [1:0] diskEject,
|
||||
input [1:0] diskSides,
|
||||
|
||||
output [1:0] diskMotor,
|
||||
output [1:0] diskAct,
|
||||
|
||||
// interface to fetch data for internal drive
|
||||
output [21:0] dskReadAddrInt,
|
||||
input dskReadAckInt,
|
||||
output [21:0] dskReadAddrExt,
|
||||
input dskReadAckExt,
|
||||
input [7:0] dskReadData
|
||||
);
|
||||
|
||||
wire [7:0] dataInLo = dataIn[7:0];
|
||||
reg [7:0] dataOutLo;
|
||||
assign dataOut = { 8'hBE, dataOutLo };
|
||||
|
||||
// IWM state
|
||||
reg ca0, ca1, ca2, lstrb, selectExternalDrive, q6, q7;
|
||||
reg ca0Next, ca1Next, ca2Next, lstrbNext, selectExternalDriveNext, q6Next, q7Next;
|
||||
wire advanceDriveHead; // prevents overrun when debugging, does not exit on a real Mac!
|
||||
reg [7:0] writeData;
|
||||
reg [7:0] readDataLatch;
|
||||
wire _iwmBusy, _writeUnderrun;
|
||||
assign _iwmBusy = 1'b1; // for writes, a value of 1 here indicates the IWM write buffer is empty
|
||||
assign _writeUnderrun = 1'b1;
|
||||
|
||||
// floppy disk drives
|
||||
reg diskEnableExt, diskEnableInt;
|
||||
reg diskEnableExtNext, diskEnableIntNext;
|
||||
wire newByteReadyInt;
|
||||
wire [7:0] readDataInt;
|
||||
wire senseInt = readDataInt[7]; // bit 7 doubles as the sense line here
|
||||
wire newByteReadyExt;
|
||||
wire [7:0] readDataExt;
|
||||
wire senseExt = readDataExt[7]; // bit 7 doubles as the sense line here
|
||||
|
||||
floppy floppyInt
|
||||
(
|
||||
.clk(clk),
|
||||
.cep(cep),
|
||||
.cen(cen),
|
||||
|
||||
._reset(_reset),
|
||||
.ca0(ca0),
|
||||
.ca1(ca1),
|
||||
.ca2(ca2),
|
||||
.SEL(SEL),
|
||||
.lstrb(lstrb),
|
||||
._enable(~diskEnableInt),
|
||||
.writeData(writeData),
|
||||
.readData(readDataInt),
|
||||
.advanceDriveHead(advanceDriveHead),
|
||||
.newByteReady(newByteReadyInt),
|
||||
.insertDisk(insertDisk[0]),
|
||||
.diskSides(diskSides[0]),
|
||||
.diskEject(diskEject[0]),
|
||||
|
||||
.motor(diskMotor[0]),
|
||||
.act(diskAct[0]),
|
||||
|
||||
.dskReadAddr(dskReadAddrInt),
|
||||
.dskReadAck(dskReadAckInt),
|
||||
.dskReadData(dskReadData)
|
||||
);
|
||||
|
||||
floppy floppyExt
|
||||
(
|
||||
.clk(clk),
|
||||
.cep(cep),
|
||||
.cen(cen),
|
||||
|
||||
._reset(_reset),
|
||||
.ca0(ca0),
|
||||
.ca1(ca1),
|
||||
.ca2(ca2),
|
||||
.SEL(SEL),
|
||||
.lstrb(lstrb),
|
||||
._enable(~diskEnableExt),
|
||||
.writeData(writeData),
|
||||
.readData(readDataExt),
|
||||
.advanceDriveHead(advanceDriveHead),
|
||||
.newByteReady(newByteReadyExt),
|
||||
.insertDisk(insertDisk[1]),
|
||||
.diskSides(diskSides[1]),
|
||||
.diskEject(diskEject[1]),
|
||||
|
||||
.motor(diskMotor[1]),
|
||||
.act(diskAct[1]),
|
||||
|
||||
.dskReadAddr(dskReadAddrExt),
|
||||
.dskReadAck(dskReadAckExt),
|
||||
.dskReadData(dskReadData)
|
||||
);
|
||||
|
||||
wire [7:0] readData = selectExternalDrive ? readDataExt : readDataInt;
|
||||
wire newByteReady = selectExternalDrive ? newByteReadyExt : newByteReadyInt;
|
||||
|
||||
reg [4:0] iwmMode;
|
||||
/* IWM mode register: S C M H L
|
||||
S Clock speed:
|
||||
0 = 7 MHz
|
||||
1 = 8 MHz
|
||||
Should always be 1 for Macintosh.
|
||||
C Bit cell time:
|
||||
0 = 4 usec/bit (for 5.25 drives)
|
||||
1 = 2 usec/bit (for 3.5 drives) (Macintosh mode)
|
||||
M Motor-off timer:
|
||||
0 = leave drive on for 1 sec after program turns
|
||||
it off
|
||||
1 = no delay (Macintosh mode)
|
||||
Should be 0 for 5.25 and 1 for 3.5.
|
||||
H Handshake protocol:
|
||||
0 = synchronous (software must supply proper
|
||||
timing for writing data)
|
||||
1 = asynchronous (IWM supplies timing) (Macintosh Mode)
|
||||
Should be 0 for 5.25 and 1 for 3.5.
|
||||
L Latch mode:
|
||||
0 = read-data stays valid for about 7 usec
|
||||
1 = read-data stays valid for full byte time (Macintosh mode)
|
||||
Should be 0 for 5.25 and 1 for 3.5.
|
||||
*/
|
||||
|
||||
// any read/write access to IWM bit registers will change their values
|
||||
always @(*) begin
|
||||
ca0Next <= ca0;
|
||||
ca1Next <= ca1;
|
||||
ca2Next <= ca2;
|
||||
lstrbNext <= lstrb;
|
||||
diskEnableExtNext <= diskEnableExt;
|
||||
diskEnableIntNext <= diskEnableInt;
|
||||
selectExternalDriveNext <= selectExternalDrive;
|
||||
q6Next <= q6;
|
||||
q7Next <= q7;
|
||||
|
||||
if (selectIWM == 1'b1 && _cpuLDS == 1'b0) begin
|
||||
case (cpuAddrRegHi[3:1])
|
||||
3'h0: // ca0
|
||||
ca0Next <= cpuAddrRegHi[0];
|
||||
3'h1: // ca1
|
||||
ca1Next <= cpuAddrRegHi[0];
|
||||
3'h2: // ca2
|
||||
ca2Next <= cpuAddrRegHi[0];
|
||||
3'h3: // lstrb
|
||||
lstrbNext <= cpuAddrRegHi[0];
|
||||
3'h4: // disk enable
|
||||
if (selectExternalDrive)
|
||||
diskEnableExtNext <= cpuAddrRegHi[0];
|
||||
else
|
||||
diskEnableIntNext <= cpuAddrRegHi[0];
|
||||
3'h5: // external drive
|
||||
selectExternalDriveNext <= cpuAddrRegHi[0];
|
||||
3'h6: // Q6
|
||||
q6Next <= cpuAddrRegHi[0];
|
||||
3'h7: // Q7
|
||||
q7Next <= cpuAddrRegHi[0];
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
// update IWM bit registers
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0) begin
|
||||
ca0 <= 0;
|
||||
ca1 <= 0;
|
||||
ca2 <= 0;
|
||||
lstrb <= 0;
|
||||
diskEnableExt <= 0;
|
||||
diskEnableInt <= 0;
|
||||
selectExternalDrive <= 0;
|
||||
q6 <= 0;
|
||||
q7 <= 0;
|
||||
end
|
||||
else if(cen) begin
|
||||
ca0 <= ca0Next;
|
||||
ca1 <= ca1Next;
|
||||
ca2 <= ca2Next;
|
||||
lstrb <= lstrbNext;
|
||||
diskEnableExt <= diskEnableExtNext;
|
||||
diskEnableInt <= diskEnableIntNext;
|
||||
selectExternalDrive <= selectExternalDriveNext;
|
||||
q6 <= q6Next;
|
||||
q7 <= q7Next;
|
||||
end
|
||||
end
|
||||
|
||||
// read IWM state
|
||||
always @(*) begin
|
||||
dataOutLo = 8'hEF;
|
||||
|
||||
// reading any IWM address returns state as selected by Q7 and Q6
|
||||
case ({q7Next,q6Next})
|
||||
2'b00: // data-in register (from disk drive) - MSB is 1 when data is valid
|
||||
dataOutLo <= readDataLatch;
|
||||
2'b01: // IWM status register - read only
|
||||
dataOutLo <= { (selectExternalDriveNext ? senseExt : senseInt), 1'b0, diskEnableExt & diskEnableInt, iwmMode };
|
||||
2'b10: // handshake - read only
|
||||
dataOutLo <= { _iwmBusy, _writeUnderrun, 6'b000000 };
|
||||
2'b11: // IWM mode register when not enabled (write-only), or (write?) data register when enabled
|
||||
dataOutLo <= 0;
|
||||
endcase
|
||||
end
|
||||
|
||||
// write IWM state
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0) begin
|
||||
iwmMode <= 0;
|
||||
writeData <= 0;
|
||||
end
|
||||
else if(cen) begin
|
||||
if (_cpuRW == 0 && selectIWM == 1'b1 && _cpuLDS == 1'b0) begin
|
||||
// writing to any IWM address modifies state as selected by Q7 and Q6
|
||||
case ({q7Next,q6Next})
|
||||
2'b11: begin
|
||||
if (diskEnableExt | diskEnableInt)
|
||||
writeData <= dataInLo;
|
||||
else
|
||||
iwmMode <= dataInLo[4:0];
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// Manage incoming bytes from the disk drive
|
||||
wire iwmRead = (_cpuRW == 1'b1 && selectIWM == 1'b1 && _cpuLDS == 1'b0);
|
||||
reg iwmReadPrev;
|
||||
reg [3:0] readLatchClearTimer;
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0) begin
|
||||
readDataLatch <= 0;
|
||||
readLatchClearTimer <= 0;
|
||||
iwmReadPrev <= 0;
|
||||
end
|
||||
else if(cen) begin
|
||||
// a countdown timer governs how long after a data latch read before the latch is cleared
|
||||
if (readLatchClearTimer != 0) begin
|
||||
readLatchClearTimer <= readLatchClearTimer - 1'b1;
|
||||
end
|
||||
|
||||
// the conclusion of a valid CPU read from the IWM will start the timer to clear the latch
|
||||
if (iwmReadPrev && !iwmRead && readDataLatch[7]) begin
|
||||
readLatchClearTimer <= 4'hD; // clear latch 14 clocks after the conclusion of a valid read
|
||||
end
|
||||
|
||||
// when the drive indicates that a new byte is ready, latch it
|
||||
// NOTE: the real IWM must self-synchronize with the incoming data to determine when to latch it
|
||||
if (newByteReady) begin
|
||||
readDataLatch <= readData;
|
||||
end
|
||||
else if (readLatchClearTimer == 1'b1) begin
|
||||
readDataLatch <= 0;
|
||||
end
|
||||
|
||||
iwmReadPrev <= iwmRead;
|
||||
end
|
||||
end
|
||||
assign advanceDriveHead = readLatchClearTimer == 1'b1; // prevents overrun when debugging, does not exist on a real Mac!
|
||||
endmodule
|
15
jtag.cdf
Normal file
15
jtag.cdf
Normal file
@ -0,0 +1,15 @@
|
||||
/* Quartus Prime Version 17.0.1 Build 598 06/07/2017 SJ Standard Edition */
|
||||
JedecChain;
|
||||
FileRevision(JESD32A);
|
||||
DefaultMfr(6E);
|
||||
|
||||
P ActionCode(Ign)
|
||||
Device PartName(SOCVHPS) MfrSpec(OpMask(0));
|
||||
P ActionCode(Cfg)
|
||||
Device PartName(5CSEBA6U23) Path("output_files/") File("MacPlus.sof") MfrSpec(OpMask(1));
|
||||
|
||||
ChainEnd;
|
||||
|
||||
AlteraBegin;
|
||||
ChainType(JTAG);
|
||||
AlteraEnd;
|
15
jtag_lite.cdf
Normal file
15
jtag_lite.cdf
Normal file
@ -0,0 +1,15 @@
|
||||
/* Quartus Prime Version 17.0.1 Build 598 06/07/2017 SJ Standard Edition */
|
||||
JedecChain;
|
||||
FileRevision(JESD32A);
|
||||
DefaultMfr(6E);
|
||||
|
||||
P ActionCode(Ign)
|
||||
Device PartName(SOCVHPS) MfrSpec(OpMask(0));
|
||||
P ActionCode(Cfg)
|
||||
Device PartName(5CSEBA6U23) Path("output_files/") File("MacPlus-lite.sof") MfrSpec(OpMask(1));
|
||||
|
||||
ChainEnd;
|
||||
|
||||
AlteraBegin;
|
||||
ChainType(JTAG);
|
||||
AlteraEnd;
|
297
ncr5380.v
Normal file
297
ncr5380.v
Normal file
@ -0,0 +1,297 @@
|
||||
/* verilator lint_off UNUSED */
|
||||
|
||||
/* based on minimigmac by Benjamin Herrenschmidt */
|
||||
|
||||
/* Read registers */
|
||||
`define RREG_CDR 3'h0 /* Current SCSI data */
|
||||
`define RREG_ICR 3'h1 /* Initiator Command */
|
||||
`define RREG_MR 3'h2 /* Mode register */
|
||||
`define RREG_TCR 3'h3 /* Target Command */
|
||||
`define RREG_CSR 3'h4 /* SCSI bus status */
|
||||
`define RREG_BSR 3'h5 /* Bus and status */
|
||||
`define RREG_IDR 3'h6 /* Input data */
|
||||
`define RREG_RST 3'h7 /* Reset */
|
||||
|
||||
/* Write registers */
|
||||
`define WREG_ODR 3'h0 /* Ouptut data */
|
||||
`define WREG_ICR 3'h1 /* Initiator Command */
|
||||
`define WREG_MR 3'h2 /* Mode register */
|
||||
`define WREG_TCR 3'h3 /* Target Command */
|
||||
`define WREG_SER 3'h4 /* Select Enable */
|
||||
`define WREG_DMAS 3'h5 /* Start DMA Send */
|
||||
`define WREG_DMATR 3'h6 /* Start DMA Target receive */
|
||||
`define WREG_IDMAR 3'h7 /* Start DMA Initiator receive */
|
||||
|
||||
/* MR bit numbers */
|
||||
`define MR_DMA_MODE 1
|
||||
`define MR_ARB 0
|
||||
|
||||
/* ICR bit numbers */
|
||||
`define ICR_A_RST 7
|
||||
`define ICR_TEST_MODE 6
|
||||
`define ICR_DIFF_ENBL 5
|
||||
`define ICR_A_ACK 4
|
||||
`define ICR_A_BSY 3
|
||||
`define ICR_A_SEL 2
|
||||
`define ICR_A_ATN 1
|
||||
`define ICR_A_DATA 0
|
||||
|
||||
/* TCR bit numbers */
|
||||
`define TCR_A_REQ 3
|
||||
`define TCR_A_MSG 2
|
||||
`define TCR_A_CD 1
|
||||
`define TCR_A_IO 0
|
||||
|
||||
module ncr5380
|
||||
(
|
||||
input clk,
|
||||
input ce,
|
||||
|
||||
input reset,
|
||||
|
||||
/* Bus interface. 3-bit address, to be wired
|
||||
* appropriately upstream (to A4..A6) plus one
|
||||
* more bit (A9) wired as dack.
|
||||
*/
|
||||
input bus_cs,
|
||||
input bus_we,
|
||||
input [2:0] bus_rs,
|
||||
input dack,
|
||||
input [7:0] wdata,
|
||||
output [7:0] rdata,
|
||||
|
||||
|
||||
// connections to io controller
|
||||
output [31:0] io_lba,
|
||||
output io_rd,
|
||||
output io_wr,
|
||||
input io_ack,
|
||||
|
||||
input [8:0] sd_buff_addr,
|
||||
input [7:0] sd_buff_dout,
|
||||
output [7:0] sd_buff_din,
|
||||
input sd_buff_wr
|
||||
);
|
||||
|
||||
reg [7:0] mr; /* Mode Register */
|
||||
reg [7:0] icr; /* Initiator Command Register */
|
||||
reg [3:0] tcr; /* Target Command Register */
|
||||
wire [7:0] csr; /* SCSI bus status register */
|
||||
|
||||
/* Data in and out latches and associated
|
||||
* control logic for DMA
|
||||
*/
|
||||
wire [7:0] din;
|
||||
reg [7:0] dout;
|
||||
reg dphase;
|
||||
reg dma_en;
|
||||
|
||||
/* --- Main host-side interface --- */
|
||||
|
||||
/* Register & DMA accesses decodes */
|
||||
reg dma_rd;
|
||||
reg dma_wr;
|
||||
reg reg_wr;
|
||||
|
||||
wire i_dma_rd = bus_cs & dack & ~bus_we;
|
||||
wire i_dma_wr = bus_cs & dack & bus_we;
|
||||
wire i_reg_wr = bus_cs & ~dack & bus_we;
|
||||
|
||||
always @(posedge clk) begin
|
||||
reg old_dma_rd, old_dma_wr, old_reg_wr;
|
||||
|
||||
old_dma_rd <= i_dma_rd;
|
||||
old_dma_wr <= i_dma_wr;
|
||||
old_reg_wr <= i_reg_wr;
|
||||
|
||||
dma_rd <= 0;
|
||||
dma_wr <= 0;
|
||||
reg_wr <= 0;
|
||||
|
||||
if(~old_dma_wr & i_dma_wr) dma_wr <= 1;
|
||||
else if(~old_dma_rd & i_dma_rd) dma_rd <= 1;
|
||||
else if(~old_reg_wr & i_reg_wr) reg_wr <= 1;
|
||||
end
|
||||
|
||||
/* System bus reads */
|
||||
assign rdata = dack ? cur_data :
|
||||
bus_rs == `RREG_CDR ? cur_data :
|
||||
bus_rs == `RREG_ICR ? icr_read :
|
||||
bus_rs == `RREG_MR ? mr :
|
||||
bus_rs == `RREG_TCR ? { 4'h0, tcr } :
|
||||
bus_rs == `RREG_CSR ? csr :
|
||||
bus_rs == `RREG_BSR ? bsr :
|
||||
bus_rs == `RREG_IDR ? cur_data :
|
||||
bus_rs == `RREG_RST ? 8'hff :
|
||||
8'hff;
|
||||
|
||||
/* DMA handhsaking logic. Two phase logic, in phase 0
|
||||
* DRQ follows SCSI _REQ until we see DACK. In phase 1
|
||||
* we just wait for SCSI _REQ to go down and go back to
|
||||
* phase 0. We assert SCSI _ACK in phase 1.
|
||||
*/
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) begin
|
||||
dphase <= 0;
|
||||
end else begin
|
||||
if (!dma_en) begin
|
||||
dphase <= 0;
|
||||
end else if (dphase == 0) begin
|
||||
/* Be careful to do that in bus phase 1,
|
||||
* not phase 0, or we would incorrectly
|
||||
* assert bus_hold and lock up the system
|
||||
*/
|
||||
if ((dma_rd || dma_wr) && scsi_req) begin
|
||||
dphase <= 1;
|
||||
end
|
||||
end else if (!scsi_req) begin
|
||||
dphase <= 0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
/* Data out latch (in DMA mode, this is one cycle after we've
|
||||
* asserted ACK)
|
||||
*/
|
||||
always@(posedge clk) if((reg_wr && bus_rs == `WREG_ODR) || dma_wr) dout <= wdata;
|
||||
|
||||
/* Current data register. Simplified logic: We loop back the
|
||||
* output data if we are asserting the bus, else we get the
|
||||
* input latch
|
||||
*/
|
||||
wire [7:0] cur_data = out_en ? dout : din;
|
||||
|
||||
/* Logic for "asserting the bus" simplified */
|
||||
wire out_en = icr[`ICR_A_DATA] | mr[`MR_ARB];
|
||||
|
||||
/* ICR read wires */
|
||||
wire [7:0] icr_read = { icr[`ICR_A_RST],
|
||||
icr_aip,
|
||||
icr_la,
|
||||
icr[`ICR_A_ACK],
|
||||
icr[`ICR_A_BSY],
|
||||
icr[`ICR_A_SEL],
|
||||
icr[`ICR_A_ATN],
|
||||
icr[`ICR_A_DATA] };
|
||||
|
||||
/* ICR write */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) begin
|
||||
icr <= 0;
|
||||
end else if (reg_wr && (bus_rs == `WREG_ICR)) begin
|
||||
icr <= wdata;
|
||||
end
|
||||
end
|
||||
|
||||
/* MR write */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) mr <= 8'b0;
|
||||
else if (reg_wr && (bus_rs == `WREG_MR)) mr <= wdata;
|
||||
end
|
||||
|
||||
/* TCR write */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) tcr <= 4'b0;
|
||||
else if (reg_wr && (bus_rs == `WREG_TCR)) tcr <= wdata[3:0];
|
||||
end
|
||||
|
||||
/* DMA start send & receive registers. We currently ignore
|
||||
* the direction.
|
||||
*/
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) begin
|
||||
dma_en <= 0;
|
||||
end else begin
|
||||
if (!mr[`MR_DMA_MODE]) begin
|
||||
dma_en <= 0;
|
||||
end else if (reg_wr && (bus_rs == `WREG_DMAS)) begin
|
||||
dma_en <= 1;
|
||||
end else if (reg_wr && (bus_rs == `WREG_IDMAR)) begin
|
||||
dma_en <= 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
/* CSR (read only). We don't do parity */
|
||||
assign csr = { scsi_rst, scsi_bsy, scsi_req, scsi_msg,
|
||||
scsi_cd, scsi_io, scsi_sel, 1'b0 };
|
||||
|
||||
/* Bus and Status register */
|
||||
/* BSR (read only). We don't do a few things... */
|
||||
wire bsr_eodma = 1'b0; /* We don't do EOP */
|
||||
wire bsr_dmarq = scsi_req & dma_en;
|
||||
wire bsr_perr = 1'b0; /* We don't do parity */
|
||||
wire bsr_irq = 1'b0; /* XXX ? Does MacOS use this ? */
|
||||
wire bsr_pmatch =
|
||||
tcr[`TCR_A_MSG] == scsi_msg &&
|
||||
tcr[`TCR_A_CD ] == scsi_cd &&
|
||||
tcr[`TCR_A_IO ] == scsi_io;
|
||||
|
||||
wire bsr_berr = 1'b0; /* XXX ? Does MacOS use this ? */
|
||||
wire [7:0] bsr = { bsr_eodma, bsr_dmarq, bsr_perr, bsr_irq,
|
||||
bsr_pmatch, bsr_berr, scsi_atn, scsi_ack };
|
||||
|
||||
/* --- Simulated SCSI Signals --- */
|
||||
|
||||
/* BSY logic (simplified arbitration, see notes) */
|
||||
wire scsi_bsy =
|
||||
icr[`ICR_A_BSY] |
|
||||
scsi2_bsy |
|
||||
mr[`MR_ARB];
|
||||
|
||||
/* Remains of simplified arbitration logic */
|
||||
wire icr_aip = mr[`MR_ARB];
|
||||
wire icr_la = 0;
|
||||
|
||||
reg dma_ack;
|
||||
always @(posedge clk) if(ce) dma_ack <= dphase;
|
||||
|
||||
/* Other ORed SCSI signals */
|
||||
wire scsi_sel = icr[`ICR_A_SEL];
|
||||
wire scsi_rst = icr[`ICR_A_RST];
|
||||
wire scsi_ack = icr[`ICR_A_ACK] | dma_ack;
|
||||
wire scsi_atn = icr[`ICR_A_ATN];
|
||||
|
||||
/* Other trivial lines set by target */
|
||||
wire scsi_cd = scsi2_cd;
|
||||
wire scsi_io = scsi2_io;
|
||||
wire scsi_msg = scsi2_msg;
|
||||
wire scsi_req = scsi2_req;
|
||||
|
||||
assign din = scsi2_bsy?scsi2_dout:8'h55;
|
||||
|
||||
// input signals from target 2
|
||||
wire scsi2_bsy, scsi2_msg, scsi2_io, scsi2_cd, scsi2_req;
|
||||
wire [7:0] scsi2_dout;
|
||||
|
||||
// connect a target
|
||||
scsi #(.ID(2)) scsi2
|
||||
(
|
||||
.clk ( clk ),
|
||||
.rst ( scsi_rst ),
|
||||
.sel ( scsi_sel ),
|
||||
.atn ( scsi_atn ),
|
||||
.bsy ( scsi2_bsy ),
|
||||
.msg ( scsi2_msg ),
|
||||
.cd ( scsi2_cd ),
|
||||
.io ( scsi2_io ),
|
||||
.req ( scsi2_req ),
|
||||
.ack ( scsi_ack ),
|
||||
.dout ( scsi2_dout ),
|
||||
.din ( dout ),
|
||||
|
||||
// connection to io controller to read and write sectors
|
||||
// to sd card
|
||||
.io_lba ( io_lba ),
|
||||
.io_rd ( io_rd ),
|
||||
.io_wr ( io_wr ),
|
||||
.io_ack ( io_ack ),
|
||||
|
||||
.sd_buff_addr(sd_buff_addr),
|
||||
.sd_buff_dout(sd_buff_dout),
|
||||
.sd_buff_din(sd_buff_din),
|
||||
.sd_buff_wr(sd_buff_wr)
|
||||
);
|
||||
|
||||
|
||||
endmodule
|
654
ps2_kbd.sv
Normal file
654
ps2_kbd.sv
Normal file
@ -0,0 +1,654 @@
|
||||
`timescale 1ns / 100ps
|
||||
|
||||
/*
|
||||
* PS2 Keyboard to Mac interface module
|
||||
*/
|
||||
module ps2_kbd
|
||||
(
|
||||
input clk,
|
||||
input ce,
|
||||
|
||||
input reset,
|
||||
|
||||
input [64:0] ps2_key,
|
||||
output reg capslock,
|
||||
|
||||
input [7:0] data_out,
|
||||
input strobe_out,
|
||||
|
||||
output [7:0] data_in,
|
||||
output strobe_in
|
||||
);
|
||||
|
||||
reg [8:0] keymac;
|
||||
reg key_pending;
|
||||
reg [21:0] pacetimer;
|
||||
reg inquiry_active;
|
||||
reg cmd_inquiry;
|
||||
reg cmd_instant;
|
||||
reg cmd_model;
|
||||
reg cmd_test;
|
||||
|
||||
/* Latch commands from Mac */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) begin
|
||||
cmd_inquiry <= 0;
|
||||
cmd_instant <= 0;
|
||||
cmd_model <= 0;
|
||||
cmd_test <= 0;
|
||||
end else if(ce) begin
|
||||
if (strobe_out) begin
|
||||
cmd_inquiry <= 0;
|
||||
cmd_instant <= 0;
|
||||
cmd_model <= 0;
|
||||
cmd_test <= 0;
|
||||
case(data_out)
|
||||
8'h10: cmd_inquiry <= 1;
|
||||
8'h14: cmd_instant <= 1;
|
||||
8'h16: cmd_model <= 1;
|
||||
8'h36: cmd_test <= 1;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
/* Divide our clock to pace our responses to the Mac. tick_short ticks
|
||||
* when we can respond to a command, and tick_long ticks when an inquiry
|
||||
* command shall timeout
|
||||
*/
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset)
|
||||
pacetimer <= 0;
|
||||
else if(ce) begin
|
||||
/* reset counter on command from Mac */
|
||||
if (strobe_out)
|
||||
pacetimer <= 0;
|
||||
else if (!tick_long)
|
||||
pacetimer <= pacetimer + 1'd1;
|
||||
end
|
||||
end
|
||||
|
||||
wire tick_long = pacetimer == 22'h3fffff;
|
||||
wire tick_short = pacetimer == 22'h000fff;
|
||||
|
||||
/* Delay inquiry responses to after tick_short */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset)
|
||||
inquiry_active <= 0;
|
||||
else if(ce) begin
|
||||
if (strobe_out | strobe_in)
|
||||
inquiry_active <= 0;
|
||||
else if (tick_short)
|
||||
inquiry_active <= cmd_inquiry;
|
||||
end
|
||||
end
|
||||
|
||||
wire pop_key = (cmd_instant & tick_short) | (inquiry_active & tick_long) | (inquiry_active & key_pending);
|
||||
|
||||
/* Reply to Mac */
|
||||
assign strobe_in = ((cmd_model | cmd_test) & tick_short) | pop_key;
|
||||
|
||||
/* Data to Mac */
|
||||
assign data_in = cmd_test ? 8'h7d :
|
||||
cmd_model ? 8'h03 :
|
||||
key_pending ? (keymac[8] ? 8'h79 : keymac[7:0]) :
|
||||
8'h7b;
|
||||
|
||||
wire depress = (ps2_key[15:8] == 8'hf0) /* synthesis keep */;
|
||||
wire extended = (depress ? (ps2_key[23:16] == 8'he0) : (ps2_key[15:8] == 8'he0)) /* synthesis keep */;
|
||||
wire ignore_capslock = {extended,ps2_key[7:0]} == 9'h058 && capslock;
|
||||
|
||||
/* Handle key_pending, and multi-byte keypad responses */
|
||||
always @(posedge clk) begin
|
||||
reg old_stb;
|
||||
|
||||
if (reset) begin
|
||||
key_pending <= 0;
|
||||
old_stb <= ps2_key[64];
|
||||
capslock <= 0;
|
||||
end
|
||||
else if(ce) begin
|
||||
if (cmd_model | cmd_test) key_pending <= 0;
|
||||
else if (pop_key) begin
|
||||
if (keymac[8]) keymac[8] <= 0;
|
||||
else key_pending <= 0;
|
||||
end else begin
|
||||
|
||||
old_stb <= ps2_key[64];
|
||||
if(old_stb != ps2_key[64]) begin
|
||||
|
||||
/* Capslock handling */
|
||||
if(ps2_key[7:0] == 8'h58 && !extended && !depress) capslock <= ~capslock;
|
||||
|
||||
if(!key_pending && !ignore_capslock && !ps2_key[63:24]) begin
|
||||
key_pending <= 1;
|
||||
keymac <= {key_code[8],depress,key_code[6:0]};
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
//use BRAM for table
|
||||
wire [8:0] key_code = code[key_addr];
|
||||
reg [8:0] key_addr;
|
||||
always @(posedge clk) key_addr <= {extended,ps2_key[7:0]};
|
||||
|
||||
wire [8:0] code[512] =
|
||||
'{
|
||||
/* 000 */ 9'h07b,
|
||||
/* 001 */ 9'h07b, //F9
|
||||
/* 002 */ 9'h07b,
|
||||
/* 003 */ 9'h07b, //F5
|
||||
/* 004 */ 9'h07b, //F3
|
||||
/* 005 */ 9'h07b, //F1
|
||||
/* 006 */ 9'h07b, //F2
|
||||
/* 007 */ 9'h07b, //F12 <OSD>
|
||||
/* 008 */ 9'h07b,
|
||||
/* 009 */ 9'h07b, //F10
|
||||
/* 00a */ 9'h07b, //F8
|
||||
/* 00b */ 9'h07b, //F6
|
||||
/* 00c */ 9'h07b, //F4
|
||||
/* 00d */ 9'h061, //TAB
|
||||
/* 00e */ 9'h065, //~ (`)
|
||||
/* 00f */ 9'h07b,
|
||||
/* 010 */ 9'h07b,
|
||||
/* 011 */ 9'h06f, //LEFT ALT (command)
|
||||
/* 012 */ 9'h071, //LEFT SHIFT
|
||||
/* 013 */ 9'h07b,
|
||||
/* 014 */ 9'h07b, //CTRL (not mapped)
|
||||
/* 015 */ 9'h019, //q
|
||||
/* 016 */ 9'h025, //1
|
||||
/* 017 */ 9'h07b,
|
||||
/* 018 */ 9'h07b,
|
||||
/* 019 */ 9'h07b,
|
||||
/* 01a */ 9'h00d, //z
|
||||
/* 01b */ 9'h003, //s
|
||||
/* 01c */ 9'h001, //a
|
||||
/* 01d */ 9'h01b, //w
|
||||
/* 01e */ 9'h027, //2
|
||||
/* 01f */ 9'h07b,
|
||||
/* 020 */ 9'h07b,
|
||||
/* 021 */ 9'h011, //c
|
||||
/* 022 */ 9'h00f, //x
|
||||
/* 023 */ 9'h005, //d
|
||||
/* 024 */ 9'h01d, //e
|
||||
/* 025 */ 9'h02b, //4
|
||||
/* 026 */ 9'h029, //3
|
||||
/* 027 */ 9'h07b,
|
||||
/* 028 */ 9'h07b,
|
||||
/* 029 */ 9'h063, //SPACE
|
||||
/* 02a */ 9'h013, //v
|
||||
/* 02b */ 9'h007, //f
|
||||
/* 02c */ 9'h023, //t
|
||||
/* 02d */ 9'h01f, //r
|
||||
/* 02e */ 9'h02f, //5
|
||||
/* 02f */ 9'h07b,
|
||||
/* 030 */ 9'h07b,
|
||||
/* 031 */ 9'h05b, //n
|
||||
/* 032 */ 9'h017, //b
|
||||
/* 033 */ 9'h009, //h
|
||||
/* 034 */ 9'h00b, //g
|
||||
/* 035 */ 9'h021, //y
|
||||
/* 036 */ 9'h02d, //6
|
||||
/* 037 */ 9'h07b,
|
||||
/* 038 */ 9'h07b,
|
||||
/* 039 */ 9'h07b,
|
||||
/* 03a */ 9'h05d, //m
|
||||
/* 03b */ 9'h04d, //j
|
||||
/* 03c */ 9'h041, //u
|
||||
/* 03d */ 9'h035, //7
|
||||
/* 03e */ 9'h039, //8
|
||||
/* 03f */ 9'h07b,
|
||||
/* 040 */ 9'h07b,
|
||||
/* 041 */ 9'h057, //<,
|
||||
/* 042 */ 9'h051, //k
|
||||
/* 043 */ 9'h045, //i
|
||||
/* 044 */ 9'h03f, //o
|
||||
/* 045 */ 9'h03b, //0
|
||||
/* 046 */ 9'h033, //9
|
||||
/* 047 */ 9'h07b,
|
||||
/* 048 */ 9'h07b,
|
||||
/* 049 */ 9'h05f, //>.
|
||||
/* 04a */ 9'h059, //FORWARD SLASH
|
||||
/* 04b */ 9'h04b, //l
|
||||
/* 04c */ 9'h053, //;
|
||||
/* 04d */ 9'h047, //p
|
||||
/* 04e */ 9'h037, //-
|
||||
/* 04f */ 9'h07b,
|
||||
/* 050 */ 9'h07b,
|
||||
/* 051 */ 9'h07b,
|
||||
/* 052 */ 9'h04f, //'"
|
||||
/* 053 */ 9'h07b,
|
||||
/* 054 */ 9'h043, //[
|
||||
/* 055 */ 9'h031, // =
|
||||
/* 056 */ 9'h07b,
|
||||
/* 057 */ 9'h07b,
|
||||
/* 058 */ 9'h073, //CAPSLOCK
|
||||
/* 059 */ 9'h071, //RIGHT SHIFT
|
||||
/* 05a */ 9'h049, //ENTER
|
||||
/* 05b */ 9'h03d, //]
|
||||
/* 05c */ 9'h07b,
|
||||
/* 05d */ 9'h055, //BACKSLASH
|
||||
/* 05e */ 9'h07b,
|
||||
/* 05f */ 9'h07b,
|
||||
/* 060 */ 9'h07b,
|
||||
/* 061 */ 9'h071, //international left shift cut out (German '<>' key), 0x56 Set#1 code
|
||||
/* 062 */ 9'h07b,
|
||||
/* 063 */ 9'h07b,
|
||||
/* 064 */ 9'h07b,
|
||||
/* 065 */ 9'h07b,
|
||||
/* 066 */ 9'h067, //BACKSPACE
|
||||
/* 067 */ 9'h07b,
|
||||
/* 068 */ 9'h07b,
|
||||
/* 069 */ 9'h127, //KP 1
|
||||
/* 06a */ 9'h07b,
|
||||
/* 06b */ 9'h12d, //KP 4
|
||||
/* 06c */ 9'h133, //KP 7
|
||||
/* 06d */ 9'h07b,
|
||||
/* 06e */ 9'h07b,
|
||||
/* 06f */ 9'h07b,
|
||||
/* 070 */ 9'h125, //KP 0
|
||||
/* 071 */ 9'h103, //KP .
|
||||
/* 072 */ 9'h129, //KP 2
|
||||
/* 073 */ 9'h12f, //KP 5
|
||||
/* 074 */ 9'h131, //KP 6
|
||||
/* 075 */ 9'h137, //KP 8
|
||||
/* 076 */ 9'h07b, //ESCAPE
|
||||
/* 077 */ 9'h07b, //NUMLOCK (Mac keypad clear?)
|
||||
/* 078 */ 9'h07b, //F11 <OSD>
|
||||
/* 079 */ 9'h10d, //KP +
|
||||
/* 07a */ 9'h12b, //KP 3
|
||||
/* 07b */ 9'h11d, //KP -
|
||||
/* 07c */ 9'h105, //KP *
|
||||
/* 07d */ 9'h139, //KP 9
|
||||
/* 07e */ 9'h07b, //SCROLL LOCK / KP )
|
||||
/* 07f */ 9'h07b,
|
||||
/* 080 */ 9'h07b,
|
||||
/* 081 */ 9'h07b,
|
||||
/* 082 */ 9'h07b,
|
||||
/* 083 */ 9'h07b, //F7
|
||||
/* 084 */ 9'h07b,
|
||||
/* 085 */ 9'h07b,
|
||||
/* 086 */ 9'h07b,
|
||||
/* 087 */ 9'h07b,
|
||||
/* 088 */ 9'h07b,
|
||||
/* 089 */ 9'h07b,
|
||||
/* 08a */ 9'h07b,
|
||||
/* 08b */ 9'h07b,
|
||||
/* 08c */ 9'h07b,
|
||||
/* 08d */ 9'h07b,
|
||||
/* 08e */ 9'h07b,
|
||||
/* 08f */ 9'h07b,
|
||||
/* 090 */ 9'h07b,
|
||||
/* 091 */ 9'h07b,
|
||||
/* 092 */ 9'h07b,
|
||||
/* 093 */ 9'h07b,
|
||||
/* 094 */ 9'h07b,
|
||||
/* 095 */ 9'h07b,
|
||||
/* 096 */ 9'h07b,
|
||||
/* 097 */ 9'h07b,
|
||||
/* 098 */ 9'h07b,
|
||||
/* 099 */ 9'h07b,
|
||||
/* 09a */ 9'h07b,
|
||||
/* 09b */ 9'h07b,
|
||||
/* 09c */ 9'h07b,
|
||||
/* 09d */ 9'h07b,
|
||||
/* 09e */ 9'h07b,
|
||||
/* 09f */ 9'h07b,
|
||||
/* 0a0 */ 9'h07b,
|
||||
/* 0a1 */ 9'h07b,
|
||||
/* 0a2 */ 9'h07b,
|
||||
/* 0a3 */ 9'h07b,
|
||||
/* 0a4 */ 9'h07b,
|
||||
/* 0a5 */ 9'h07b,
|
||||
/* 0a6 */ 9'h07b,
|
||||
/* 0a7 */ 9'h07b,
|
||||
/* 0a8 */ 9'h07b,
|
||||
/* 0a9 */ 9'h07b,
|
||||
/* 0aa */ 9'h07b,
|
||||
/* 0ab */ 9'h07b,
|
||||
/* 0ac */ 9'h07b,
|
||||
/* 0ad */ 9'h07b,
|
||||
/* 0ae */ 9'h07b,
|
||||
/* 0af */ 9'h07b,
|
||||
/* 0b0 */ 9'h07b,
|
||||
/* 0b1 */ 9'h07b,
|
||||
/* 0b2 */ 9'h07b,
|
||||
/* 0b3 */ 9'h07b,
|
||||
/* 0b4 */ 9'h07b,
|
||||
/* 0b5 */ 9'h07b,
|
||||
/* 0b6 */ 9'h07b,
|
||||
/* 0b7 */ 9'h07b,
|
||||
/* 0b8 */ 9'h07b,
|
||||
/* 0b9 */ 9'h07b,
|
||||
/* 0ba */ 9'h07b,
|
||||
/* 0bb */ 9'h07b,
|
||||
/* 0bc */ 9'h07b,
|
||||
/* 0bd */ 9'h07b,
|
||||
/* 0be */ 9'h07b,
|
||||
/* 0bf */ 9'h07b,
|
||||
/* 0c0 */ 9'h07b,
|
||||
/* 0c1 */ 9'h07b,
|
||||
/* 0c2 */ 9'h07b,
|
||||
/* 0c3 */ 9'h07b,
|
||||
/* 0c4 */ 9'h07b,
|
||||
/* 0c5 */ 9'h07b,
|
||||
/* 0c6 */ 9'h07b,
|
||||
/* 0c7 */ 9'h07b,
|
||||
/* 0c8 */ 9'h07b,
|
||||
/* 0c9 */ 9'h07b,
|
||||
/* 0ca */ 9'h07b,
|
||||
/* 0cb */ 9'h07b,
|
||||
/* 0cc */ 9'h07b,
|
||||
/* 0cd */ 9'h07b,
|
||||
/* 0ce */ 9'h07b,
|
||||
/* 0cf */ 9'h07b,
|
||||
/* 0d0 */ 9'h07b,
|
||||
/* 0d1 */ 9'h07b,
|
||||
/* 0d2 */ 9'h07b,
|
||||
/* 0d3 */ 9'h07b,
|
||||
/* 0d4 */ 9'h07b,
|
||||
/* 0d5 */ 9'h07b,
|
||||
/* 0d6 */ 9'h07b,
|
||||
/* 0d7 */ 9'h07b,
|
||||
/* 0d8 */ 9'h07b,
|
||||
/* 0d9 */ 9'h07b,
|
||||
/* 0da */ 9'h07b,
|
||||
/* 0db */ 9'h07b,
|
||||
/* 0dc */ 9'h07b,
|
||||
/* 0dd */ 9'h07b,
|
||||
/* 0de */ 9'h07b,
|
||||
/* 0df */ 9'h07b,
|
||||
/* 0e0 */ 9'h07b, //ps2 extended key
|
||||
/* 0e1 */ 9'h07b,
|
||||
/* 0e2 */ 9'h07b,
|
||||
/* 0e3 */ 9'h07b,
|
||||
/* 0e4 */ 9'h07b,
|
||||
/* 0e5 */ 9'h07b,
|
||||
/* 0e6 */ 9'h07b,
|
||||
/* 0e7 */ 9'h07b,
|
||||
/* 0e8 */ 9'h07b,
|
||||
/* 0e9 */ 9'h07b,
|
||||
/* 0ea */ 9'h07b,
|
||||
/* 0eb */ 9'h07b,
|
||||
/* 0ec */ 9'h07b,
|
||||
/* 0ed */ 9'h07b,
|
||||
/* 0ee */ 9'h07b,
|
||||
/* 0ef */ 9'h07b,
|
||||
/* 0f0 */ 9'h07b, //ps2 release code
|
||||
/* 0f1 */ 9'h07b,
|
||||
/* 0f2 */ 9'h07b,
|
||||
/* 0f3 */ 9'h07b,
|
||||
/* 0f4 */ 9'h07b,
|
||||
/* 0f5 */ 9'h07b,
|
||||
/* 0f6 */ 9'h07b,
|
||||
/* 0f7 */ 9'h07b,
|
||||
/* 0f8 */ 9'h07b,
|
||||
/* 0f9 */ 9'h07b,
|
||||
/* 0fa */ 9'h07b, //ps2 ack code
|
||||
/* 0fb */ 9'h07b,
|
||||
/* 0fc */ 9'h07b,
|
||||
/* 0fd */ 9'h07b,
|
||||
/* 0fe */ 9'h07b,
|
||||
/* 0ff */ 9'h07b,
|
||||
/* 100 */ 9'h07b,
|
||||
/* 101 */ 9'h07b,
|
||||
/* 102 */ 9'h07b,
|
||||
/* 103 */ 9'h07b,
|
||||
/* 104 */ 9'h07b,
|
||||
/* 105 */ 9'h07b,
|
||||
/* 106 */ 9'h07b,
|
||||
/* 107 */ 9'h07b,
|
||||
/* 108 */ 9'h07b,
|
||||
/* 109 */ 9'h07b,
|
||||
/* 10a */ 9'h07b,
|
||||
/* 10b */ 9'h07b,
|
||||
/* 10c */ 9'h07b,
|
||||
/* 10d */ 9'h07b,
|
||||
/* 10e */ 9'h07b,
|
||||
/* 10f */ 9'h07b,
|
||||
/* 110 */ 9'h07b,
|
||||
/* 111 */ 9'h06f, //RIGHT ALT (command)
|
||||
/* 112 */ 9'h07b,
|
||||
/* 113 */ 9'h07b,
|
||||
/* 114 */ 9'h07b,
|
||||
/* 115 */ 9'h07b,
|
||||
/* 116 */ 9'h07b,
|
||||
/* 117 */ 9'h07b,
|
||||
/* 118 */ 9'h07b,
|
||||
/* 119 */ 9'h07b,
|
||||
/* 11a */ 9'h07b,
|
||||
/* 11b */ 9'h07b,
|
||||
/* 11c */ 9'h07b,
|
||||
/* 11d */ 9'h07b,
|
||||
/* 11e */ 9'h07b,
|
||||
/* 11f */ 9'h075, //WINDOWS OR APPLICATION KEY (option)
|
||||
/* 120 */ 9'h07b,
|
||||
/* 121 */ 9'h07b,
|
||||
/* 122 */ 9'h07b,
|
||||
/* 123 */ 9'h07b,
|
||||
/* 124 */ 9'h07b,
|
||||
/* 125 */ 9'h07b,
|
||||
/* 126 */ 9'h07b,
|
||||
/* 127 */ 9'h07b,
|
||||
/* 128 */ 9'h07b,
|
||||
/* 129 */ 9'h07b,
|
||||
/* 12a */ 9'h07b,
|
||||
/* 12b */ 9'h07b,
|
||||
/* 12c */ 9'h07b,
|
||||
/* 12d */ 9'h07b,
|
||||
/* 12e */ 9'h07b,
|
||||
/* 12f */ 9'h07b,
|
||||
/* 130 */ 9'h07b,
|
||||
/* 131 */ 9'h07b,
|
||||
/* 132 */ 9'h07b,
|
||||
/* 133 */ 9'h07b,
|
||||
/* 134 */ 9'h07b,
|
||||
/* 135 */ 9'h07b,
|
||||
/* 136 */ 9'h07b,
|
||||
/* 137 */ 9'h07b,
|
||||
/* 138 */ 9'h07b,
|
||||
/* 139 */ 9'h07b,
|
||||
/* 13a */ 9'h07b,
|
||||
/* 13b */ 9'h07b,
|
||||
/* 13c */ 9'h07b,
|
||||
/* 13d */ 9'h07b,
|
||||
/* 13e */ 9'h07b,
|
||||
/* 13f */ 9'h07b,
|
||||
/* 140 */ 9'h07b,
|
||||
/* 141 */ 9'h07b,
|
||||
/* 142 */ 9'h07b,
|
||||
/* 143 */ 9'h07b,
|
||||
/* 144 */ 9'h07b,
|
||||
/* 145 */ 9'h07b,
|
||||
/* 146 */ 9'h07b,
|
||||
/* 147 */ 9'h07b,
|
||||
/* 148 */ 9'h07b,
|
||||
/* 149 */ 9'h07b,
|
||||
/* 14a */ 9'h11b, //KP /
|
||||
/* 14b */ 9'h07b,
|
||||
/* 14c */ 9'h07b,
|
||||
/* 14d */ 9'h07b,
|
||||
/* 14e */ 9'h07b,
|
||||
/* 14f */ 9'h07b,
|
||||
/* 150 */ 9'h07b,
|
||||
/* 151 */ 9'h07b,
|
||||
/* 152 */ 9'h07b,
|
||||
/* 153 */ 9'h07b,
|
||||
/* 154 */ 9'h07b,
|
||||
/* 155 */ 9'h07b,
|
||||
/* 156 */ 9'h07b,
|
||||
/* 157 */ 9'h07b,
|
||||
/* 158 */ 9'h07b,
|
||||
/* 159 */ 9'h07b,
|
||||
/* 15a */ 9'h119, //KP ENTER
|
||||
/* 15b */ 9'h07b,
|
||||
/* 15c */ 9'h07b,
|
||||
/* 15d */ 9'h07b,
|
||||
/* 15e */ 9'h07b,
|
||||
/* 15f */ 9'h07b,
|
||||
/* 160 */ 9'h07b,
|
||||
/* 161 */ 9'h07b,
|
||||
/* 162 */ 9'h07b,
|
||||
/* 163 */ 9'h07b,
|
||||
/* 164 */ 9'h07b,
|
||||
/* 165 */ 9'h07b,
|
||||
/* 166 */ 9'h07b,
|
||||
/* 167 */ 9'h07b,
|
||||
/* 168 */ 9'h07b,
|
||||
/* 169 */ 9'h07b, //END
|
||||
/* 16a */ 9'h07b,
|
||||
/* 16b */ 9'h10d, //ARROW LEFT
|
||||
/* 16c */ 9'h07b, //HOME
|
||||
/* 16d */ 9'h07b,
|
||||
/* 16e */ 9'h07b,
|
||||
/* 16f */ 9'h07b,
|
||||
/* 170 */ 9'h07b, //INSERT = HELP
|
||||
/* 171 */ 9'h10f, //DELETE (KP clear?)
|
||||
/* 172 */ 9'h111, //ARROW DOWN
|
||||
/* 173 */ 9'h07b,
|
||||
/* 174 */ 9'h105, //ARROW RIGHT
|
||||
/* 175 */ 9'h11b, //ARROW UP
|
||||
/* 176 */ 9'h07b,
|
||||
/* 177 */ 9'h07b,
|
||||
/* 178 */ 9'h07b,
|
||||
/* 179 */ 9'h07b,
|
||||
/* 17a */ 9'h07b, //PGDN <OSD>
|
||||
/* 17b */ 9'h07b,
|
||||
/* 17c */ 9'h07b, //PRTSCR <OSD>
|
||||
/* 17d */ 9'h07b, //PGUP <OSD>
|
||||
/* 17e */ 9'h07b, //ctrl+break
|
||||
/* 17f */ 9'h07b,
|
||||
/* 180 */ 9'h07b,
|
||||
/* 181 */ 9'h07b,
|
||||
/* 182 */ 9'h07b,
|
||||
/* 183 */ 9'h07b,
|
||||
/* 184 */ 9'h07b,
|
||||
/* 185 */ 9'h07b,
|
||||
/* 186 */ 9'h07b,
|
||||
/* 187 */ 9'h07b,
|
||||
/* 188 */ 9'h07b,
|
||||
/* 189 */ 9'h07b,
|
||||
/* 18a */ 9'h07b,
|
||||
/* 18b */ 9'h07b,
|
||||
/* 18c */ 9'h07b,
|
||||
/* 18d */ 9'h07b,
|
||||
/* 18e */ 9'h07b,
|
||||
/* 18f */ 9'h07b,
|
||||
/* 190 */ 9'h07b,
|
||||
/* 191 */ 9'h07b,
|
||||
/* 192 */ 9'h07b,
|
||||
/* 193 */ 9'h07b,
|
||||
/* 194 */ 9'h07b,
|
||||
/* 195 */ 9'h07b,
|
||||
/* 196 */ 9'h07b,
|
||||
/* 197 */ 9'h07b,
|
||||
/* 198 */ 9'h07b,
|
||||
/* 199 */ 9'h07b,
|
||||
/* 19a */ 9'h07b,
|
||||
/* 19b */ 9'h07b,
|
||||
/* 19c */ 9'h07b,
|
||||
/* 19d */ 9'h07b,
|
||||
/* 19e */ 9'h07b,
|
||||
/* 19f */ 9'h07b,
|
||||
/* 1a0 */ 9'h07b,
|
||||
/* 1a1 */ 9'h07b,
|
||||
/* 1a2 */ 9'h07b,
|
||||
/* 1a3 */ 9'h07b,
|
||||
/* 1a4 */ 9'h07b,
|
||||
/* 1a5 */ 9'h07b,
|
||||
/* 1a6 */ 9'h07b,
|
||||
/* 1a7 */ 9'h07b,
|
||||
/* 1a8 */ 9'h07b,
|
||||
/* 1a9 */ 9'h07b,
|
||||
/* 1aa */ 9'h07b,
|
||||
/* 1ab */ 9'h07b,
|
||||
/* 1ac */ 9'h07b,
|
||||
/* 1ad */ 9'h07b,
|
||||
/* 1ae */ 9'h07b,
|
||||
/* 1af */ 9'h07b,
|
||||
/* 1b0 */ 9'h07b,
|
||||
/* 1b1 */ 9'h07b,
|
||||
/* 1b2 */ 9'h07b,
|
||||
/* 1b3 */ 9'h07b,
|
||||
/* 1b4 */ 9'h07b,
|
||||
/* 1b5 */ 9'h07b,
|
||||
/* 1b6 */ 9'h07b,
|
||||
/* 1b7 */ 9'h07b,
|
||||
/* 1b8 */ 9'h07b,
|
||||
/* 1b9 */ 9'h07b,
|
||||
/* 1ba */ 9'h07b,
|
||||
/* 1bb */ 9'h07b,
|
||||
/* 1bc */ 9'h07b,
|
||||
/* 1bd */ 9'h07b,
|
||||
/* 1be */ 9'h07b,
|
||||
/* 1bf */ 9'h07b,
|
||||
/* 1c0 */ 9'h07b,
|
||||
/* 1c1 */ 9'h07b,
|
||||
/* 1c2 */ 9'h07b,
|
||||
/* 1c3 */ 9'h07b,
|
||||
/* 1c4 */ 9'h07b,
|
||||
/* 1c5 */ 9'h07b,
|
||||
/* 1c6 */ 9'h07b,
|
||||
/* 1c7 */ 9'h07b,
|
||||
/* 1c8 */ 9'h07b,
|
||||
/* 1c9 */ 9'h07b,
|
||||
/* 1ca */ 9'h07b,
|
||||
/* 1cb */ 9'h07b,
|
||||
/* 1cc */ 9'h07b,
|
||||
/* 1cd */ 9'h07b,
|
||||
/* 1ce */ 9'h07b,
|
||||
/* 1cf */ 9'h07b,
|
||||
/* 1d0 */ 9'h07b,
|
||||
/* 1d1 */ 9'h07b,
|
||||
/* 1d2 */ 9'h07b,
|
||||
/* 1d3 */ 9'h07b,
|
||||
/* 1d4 */ 9'h07b,
|
||||
/* 1d5 */ 9'h07b,
|
||||
/* 1d6 */ 9'h07b,
|
||||
/* 1d7 */ 9'h07b,
|
||||
/* 1d8 */ 9'h07b,
|
||||
/* 1d9 */ 9'h07b,
|
||||
/* 1da */ 9'h07b,
|
||||
/* 1db */ 9'h07b,
|
||||
/* 1dc */ 9'h07b,
|
||||
/* 1dd */ 9'h07b,
|
||||
/* 1de */ 9'h07b,
|
||||
/* 1df */ 9'h07b,
|
||||
/* 1e0 */ 9'h07b, //ps2 extended key(duplicate, see $e0)
|
||||
/* 1e1 */ 9'h07b,
|
||||
/* 1e2 */ 9'h07b,
|
||||
/* 1e3 */ 9'h07b,
|
||||
/* 1e4 */ 9'h07b,
|
||||
/* 1e5 */ 9'h07b,
|
||||
/* 1e6 */ 9'h07b,
|
||||
/* 1e7 */ 9'h07b,
|
||||
/* 1e8 */ 9'h07b,
|
||||
/* 1e9 */ 9'h07b,
|
||||
/* 1ea */ 9'h07b,
|
||||
/* 1eb */ 9'h07b,
|
||||
/* 1ec */ 9'h07b,
|
||||
/* 1ed */ 9'h07b,
|
||||
/* 1ee */ 9'h07b,
|
||||
/* 1ef */ 9'h07b,
|
||||
/* 1f0 */ 9'h07b, //ps2 release code(duplicate, see $f0)
|
||||
/* 1f1 */ 9'h07b,
|
||||
/* 1f2 */ 9'h07b,
|
||||
/* 1f3 */ 9'h07b,
|
||||
/* 1f4 */ 9'h07b,
|
||||
/* 1f5 */ 9'h07b,
|
||||
/* 1f6 */ 9'h07b,
|
||||
/* 1f7 */ 9'h07b,
|
||||
/* 1f8 */ 9'h07b,
|
||||
/* 1f9 */ 9'h07b,
|
||||
/* 1fa */ 9'h07b, //ps2 ack code(duplicate see $fa)
|
||||
/* 1fb */ 9'h07b,
|
||||
/* 1fc */ 9'h07b,
|
||||
/* 1fd */ 9'h07b,
|
||||
/* 1fe */ 9'h07b,
|
||||
/* 1ff */ 9'h07b
|
||||
};
|
||||
|
||||
endmodule
|
94
ps2_mouse.v
Normal file
94
ps2_mouse.v
Normal file
@ -0,0 +1,94 @@
|
||||
`timescale 1ns / 100ps
|
||||
|
||||
/*
|
||||
* PS2 mouse protocol
|
||||
* Bit 7 6 5 4 3 2 1 0
|
||||
* Byte 0: YOVR XOVR YSGN XSGN 1 MBUT RBUT LBUT
|
||||
* Byte 1: XMOVE
|
||||
* Byte 2: YMOVE
|
||||
*/
|
||||
|
||||
/*
|
||||
* PS2 Mouse to Mac interface module
|
||||
*/
|
||||
module ps2_mouse
|
||||
(
|
||||
input clk,
|
||||
input ce,
|
||||
|
||||
input reset,
|
||||
|
||||
input [24:0] ps2_mouse,
|
||||
|
||||
output reg x1,
|
||||
output reg y1,
|
||||
output reg x2,
|
||||
output reg y2,
|
||||
output reg button
|
||||
);
|
||||
|
||||
reg [9:0] xacc;
|
||||
reg [9:0] yacc;
|
||||
reg [11:0] clkdiv;
|
||||
|
||||
wire strobe = (old_stb != ps2_mouse[24]);
|
||||
reg old_stb = 0;
|
||||
always @(posedge clk) old_stb <= ps2_mouse[24];
|
||||
|
||||
/* Capture button state */
|
||||
always@(posedge clk or posedge reset)
|
||||
if (reset) button <= 1;
|
||||
else if (strobe) button <= ~(|ps2_mouse[2:0]);
|
||||
|
||||
/* Clock divider to flush accumulators */
|
||||
always@(posedge clk or posedge reset)
|
||||
if (reset) clkdiv <= 0;
|
||||
else if(ce) clkdiv <= clkdiv + 1'b1;
|
||||
|
||||
wire tick = (ce && clkdiv == 0);
|
||||
|
||||
/* Toggle output lines base on accumulator */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) begin
|
||||
x1 <= 0;
|
||||
x2 <= 0;
|
||||
end else if (tick && xacc != 0) begin
|
||||
x1 <= ~x1;
|
||||
x2 <= ~x1 ^ ~xacc[9];
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) begin
|
||||
y1 <= 0;
|
||||
y2 <= 0;
|
||||
end else if (tick && yacc != 0) begin
|
||||
y1 <= ~y1;
|
||||
y2 <= ~y1 ^ ~yacc[9];
|
||||
end
|
||||
end
|
||||
|
||||
/* Movement accumulators. Needs tuning ! */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) xacc <= 0;
|
||||
else begin
|
||||
/* Add movement, convert to a 10-bit number if not over */
|
||||
if (strobe && xacc[8] == xacc[9]) xacc <= xacc + { ps2_mouse[4], ps2_mouse[4], ps2_mouse[15:8] };
|
||||
else
|
||||
/* Decrement */
|
||||
if (tick && xacc != 0) xacc <= xacc + { {9{~xacc[9]}}, 1'b1 };
|
||||
end
|
||||
end
|
||||
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) yacc <= 0;
|
||||
else begin
|
||||
/* Add movement, convert to a 10-bit number if not over*/
|
||||
if (strobe && yacc[8] == yacc[9]) yacc <= yacc + { ps2_mouse[5], ps2_mouse[5], ps2_mouse[23:16] };
|
||||
else
|
||||
/* Decrement */
|
||||
if (tick && yacc != 0) yacc <= yacc + { {9{~yacc[9]}}, 1'b1 };
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
51
readme.md
Normal file
51
readme.md
Normal file
@ -0,0 +1,51 @@
|
||||
# Macintosh Plus for the [MiSTer Board](https://github.com/MiSTer-devel/Main_MiSTer/wiki)
|
||||
|
||||
This is a port of the [Plus Too core](https://github.com/mist-devel/mist-binaries/tree/master/cores/plus_too) from MiST which is the port of the [Plus Too project](http://www.bigmessowires.com/plus-too/).
|
||||
|
||||
I've tried to optimize the code with converting to synchronous style and fixing some glitches and instabilities.
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
* Copy the [*.rbf](https://github.com/MiSTer-devel/MacPlus_MiSTer/tree/master/releases) onto the root of SD card
|
||||
* Copy the [boot.rom](https://github.com/MiSTer-devel/MacPlus_MiSTer/tree/master/releases) to MacPlus folder
|
||||
* Copy disk images in dsk format (e.g. Disk605.dsk) to MacPlus folder
|
||||
|
||||
After a few seconds the floppy disk icon should
|
||||
appear. Open the on screen display using the F12 key and select the
|
||||
a disk image. The upload of the disk image will take a few seconds. MacPlus will then boot into the MacOS desktop.
|
||||
|
||||
## Floppy disk image format
|
||||
|
||||
Floppy disk images need to be in raw disk format. Double sided 800k disk images have to be exactly 819200 bytes in size. Single sided 400k disk images have to be exactly 409600 bytes in size.
|
||||
|
||||
Both the internal as well as the external floppy disk are supported. The first entry in the OSD refers to the internal floppy disk, the second one to the external floppy disk.
|
||||
|
||||
Currently floppy disk images cannot be loaded while the Mac accesses a floppy disk. Thus it's recommended to wait for the desktop to appear until a second floppy can be inserted.
|
||||
|
||||
Before loading a different disk image it's recommended to eject the previously inserted disk image from within MacOS.
|
||||
|
||||
Some system floppy disk images in matching dsk format can be found at [here](http://www.rolli.ch/MacPlus/welcome.html). Some nice applicatons on 400k dsk images can be found [here](http://tkc8800.com/page/Macintosh-128k-512k-disk-images). Official system disk images are available from apple e.g. via [ftp](http://ftp.iinet.net.au/pub/apple/US/Macintosh/System/Older_System/System_6.0.x/). Under Linux these can be converted into the desired dsk format using [Linux stuffit](http://web.archive.org/web/20060205025441/http://www.stuffit.com/downloads/files/stuffit520.611linux-i386.tar.gz), unar and [dc2dsk](http://www.bigmessowires.com/dc2dsk.c) in that order.
|
||||
|
||||
## Hard disk support
|
||||
|
||||
This MacPlus core implements the SCSI interface of the Macintosh Plus together with a 20MB harddisk. The core implements only a subset of the SCSI commands. This is currently sufficient to read and write the disk, to boot from it and to format it using the setup tools that come with MacOS 6.0.8.
|
||||
|
||||
The harddisk image to be used can be selected from the "Mount *.vhd" entry in the on-screen-display. Copy the boot.vhd to MacPlus folder and it will be automatically mounted at start. The format of the disk image is the same as being used by the SCSI2SD project which is documented [here](http://www.codesrc.com/mediawiki/index.php?title=HFSFromScratch).
|
||||
|
||||
Unlike the floppy the SCSI disk is writable and data can be written to the disk from within the core.
|
||||
|
||||
It has been tested that OS 6.0.8 can format the SCSI disk as well as doing a full installation from floppy disk to the harddisk. But keep in mind that this is an early work in progress and expect data loss when working with HDD images.
|
||||
|
||||
A matching harddisk image file can be found [here](https://github.com/MiSTer-devel/MacPlus_MiSTer/tree/master/releases). This is a 20MB harddisk image with correct partitioning information and a basic SCSI driver installed. The data partition itself is empty and unformatted. After booting the Mac will thus ask whether the disk is to be initialized. Saying yes and giving the disk a name will result im a usable file system. You don't need to use the Setup tool to format this disk as it is already formatted. But you can format it if you want to. This is only been tested with OS 6.0.8.
|
||||
|
||||
## CPU Speed
|
||||
|
||||
The CPU speed can be adjusted from "normal" which is roughly Mac Plus speed to "Fast" which is about 2.5 times faster. Original core couldn't boot from SCSI in turbo mode. This port has workaround to let it boot even with turbo mode.
|
||||
|
||||
## Memory
|
||||
|
||||
512KB, 1MB and 4MB memory configs are available. Cold boot with 4MB RAM selected takes some time before it start to boot from FDD/SCSI, so be patient. Warm boot won't take long time.
|
||||
|
||||
## Keyboard
|
||||
The Alt key is mapped to the Mac's command key, and the Windows key is mapped to the Mac's option key. Core emulates keyboard with keypad.
|
BIN
release/Disk605.dsk
Normal file
BIN
release/Disk605.dsk
Normal file
Binary file not shown.
BIN
release/boot.rom
Normal file
BIN
release/boot.rom
Normal file
Binary file not shown.
BIN
release/empty_hdd.zip
Normal file
BIN
release/empty_hdd.zip
Normal file
Binary file not shown.
587
scc.v
Normal file
587
scc.v
Normal file
@ -0,0 +1,587 @@
|
||||
`timescale 1ns / 100ps
|
||||
|
||||
/*
|
||||
* Zilog 8530 SCC module for minimigmac.
|
||||
*
|
||||
* Located on high data bus, but writes are done at odd addresses as
|
||||
* LDS is used as WR signals or something like that on a Mac Plus.
|
||||
*
|
||||
* We don't care here and just ignore which side was used.
|
||||
*
|
||||
* NOTE: We don't implement the 85C30 or ESCC additions such as WR7'
|
||||
* for now, it's all very simplified
|
||||
*/
|
||||
|
||||
module scc
|
||||
(
|
||||
input clk,
|
||||
input cep,
|
||||
input cen,
|
||||
|
||||
input reset_hw,
|
||||
|
||||
/* Bus interface. 2-bit address, to be wired
|
||||
* appropriately upstream (to A1..A2).
|
||||
*/
|
||||
input cs,
|
||||
input we,
|
||||
input [1:0] rs, /* [1] = data(1)/ctl [0] = a_side(1)/b_side */
|
||||
input [7:0] wdata,
|
||||
output [7:0] rdata,
|
||||
output _irq,
|
||||
|
||||
/* A single serial port on Minimig */
|
||||
input rxd,
|
||||
output txd,
|
||||
input cts, /* normally wired to device DTR output
|
||||
* on Mac cables. That same line is also
|
||||
* connected to the TRxC input of the SCC
|
||||
* to do fast clocking but we don't do that
|
||||
* here
|
||||
*/
|
||||
output rts, /* on a real mac this activates line
|
||||
* drivers when low */
|
||||
|
||||
/* DCD for both ports are hijacked by mouse interface */
|
||||
input dcd_a, /* We don't synchronize those inputs */
|
||||
input dcd_b,
|
||||
|
||||
/* Write request */
|
||||
output wreq
|
||||
);
|
||||
|
||||
/* Register access is semi-insane */
|
||||
reg [3:0] rindex;
|
||||
reg [3:0] rindex_latch;
|
||||
wire wreg_a;
|
||||
wire wreg_b;
|
||||
|
||||
/* Resets via WR9, one clk pulses */
|
||||
wire reset_a;
|
||||
wire reset_b;
|
||||
wire reset;
|
||||
|
||||
/* Data registers */
|
||||
reg [7:0] data_a = 0;
|
||||
reg [7:0] data_b = 0;
|
||||
|
||||
/* Read registers */
|
||||
wire [7:0] rr0_a;
|
||||
wire [7:0] rr0_b;
|
||||
wire [7:0] rr1_a;
|
||||
wire [7:0] rr1_b;
|
||||
wire [7:0] rr2_b;
|
||||
wire [7:0] rr3_a;
|
||||
wire [7:0] rr10_a;
|
||||
wire [7:0] rr10_b;
|
||||
wire [7:0] rr15_a;
|
||||
wire [7:0] rr15_b;
|
||||
|
||||
/* Write registers. Only some are implemented,
|
||||
* some result in actions on write and don't
|
||||
* store anything
|
||||
*/
|
||||
reg [7:0] wr1_a;
|
||||
reg [7:0] wr1_b;
|
||||
reg [7:0] wr2;
|
||||
reg [7:0] wr5_a;
|
||||
reg [7:0] wr5_b;
|
||||
reg [7:0] wr6_a;
|
||||
reg [7:0] wr6_b;
|
||||
reg [7:0] wr8_a;
|
||||
reg [7:0] wr8_b;
|
||||
reg [5:0] wr9;
|
||||
reg [7:0] wr10_a;
|
||||
reg [7:0] wr10_b;
|
||||
reg [7:0] wr12_a;
|
||||
reg [7:0] wr12_b;
|
||||
reg [7:0] wr13_a;
|
||||
reg [7:0] wr13_b;
|
||||
reg [7:0] wr14_a;
|
||||
reg [7:0] wr14_b;
|
||||
reg [7:0] wr15_a;
|
||||
reg [7:0] wr15_b;
|
||||
|
||||
/* Status latches */
|
||||
reg latch_open_a;
|
||||
reg latch_open_b;
|
||||
reg dcd_latch_a;
|
||||
reg dcd_latch_b;
|
||||
wire dcd_ip_a;
|
||||
wire dcd_ip_b;
|
||||
wire do_latch_a;
|
||||
wire do_latch_b;
|
||||
wire do_extreset_a;
|
||||
wire do_extreset_b;
|
||||
|
||||
/* IRQ stuff */
|
||||
wire rx_irq_pend_a;
|
||||
wire rx_irq_pend_b;
|
||||
wire tx_irq_pend_a;
|
||||
wire tx_irq_pend_b;
|
||||
wire ex_irq_pend_a;
|
||||
wire ex_irq_pend_b;
|
||||
reg ex_irq_ip_a;
|
||||
reg ex_irq_ip_b;
|
||||
wire [2:0] rr2_vec_stat;
|
||||
|
||||
/* Register/Data access helpers */
|
||||
assign wreg_a = cs & we & (~rs[1]) & rs[0];
|
||||
assign wreg_b = cs & we & (~rs[1]) & ~rs[0];
|
||||
|
||||
// make sure rindex changes after the cpu cycle has ended so
|
||||
// read data is still stable while cpu advances
|
||||
always@(posedge clk) if(cen) rindex <= rindex_latch;
|
||||
|
||||
/* Register index is set by a write to WR0 and reset
|
||||
* after any subsequent write. We ignore the side
|
||||
*/
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset)
|
||||
rindex_latch <= 0;
|
||||
else if (cen && cs && !rs[1]) begin
|
||||
/* Default, reset index */
|
||||
rindex_latch <= 0;
|
||||
|
||||
/* Write to WR0 */
|
||||
if (we && rindex == 0) begin
|
||||
/* Get low index bits */
|
||||
rindex_latch[2:0] <= wdata[2:0];
|
||||
|
||||
/* Add point high */
|
||||
rindex_latch[3] <= (wdata[5:3] == 3'b001);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
/* Reset logic (write to WR9 cmd)
|
||||
*
|
||||
* Note about resets: Some bits are documented as unchanged/undefined on
|
||||
* HW reset by the doc. We apply this to channel and soft resets, however
|
||||
* we _do_ reset every bit on an external HW reset in this implementation
|
||||
* to make the FPGA & synthesis tools happy.
|
||||
*/
|
||||
assign reset = ((wreg_a | wreg_b) & (rindex == 9) & (wdata[7:6] == 2'b11)) | reset_hw;
|
||||
assign reset_a = ((wreg_a | wreg_b) & (rindex == 9) & (wdata[7:6] == 2'b10)) | reset;
|
||||
assign reset_b = ((wreg_a | wreg_b) & (rindex == 9) & (wdata[7:6] == 2'b01)) | reset;
|
||||
|
||||
/* WR1
|
||||
* Reset: bit 5 and 2 unchanged */
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr1_a <= 0;
|
||||
else if(cen) begin
|
||||
if (reset_a)
|
||||
wr1_a <= { 2'b00, wr1_a[5], 2'b00, wr1_a[2], 2'b00 };
|
||||
else if (wreg_a && rindex == 1)
|
||||
wr1_a <= wdata;
|
||||
end
|
||||
end
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr1_b <= 0;
|
||||
else if(cen) begin
|
||||
if (reset_b)
|
||||
wr1_b <= { 2'b00, wr1_b[5], 2'b00, wr1_b[2], 2'b00 };
|
||||
else if (wreg_b && rindex == 1)
|
||||
wr1_b <= wdata;
|
||||
end
|
||||
end
|
||||
|
||||
/* WR2
|
||||
* Reset: unchanged
|
||||
*/
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr2 <= 0;
|
||||
else if (cen && (wreg_a || wreg_b) && rindex == 2)
|
||||
wr2 <= wdata;
|
||||
end
|
||||
|
||||
/* WR5
|
||||
* Reset: Bits 7,4,3,2,1 to 0
|
||||
*/
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr5_a <= 0;
|
||||
else if(cen) begin
|
||||
if (reset_a)
|
||||
wr5_a <= { 1'b0, wr5_a[6:5], 4'b0000, wr5_a[0] };
|
||||
else if (wreg_a && rindex == 5)
|
||||
wr5_a <= wdata;
|
||||
end
|
||||
end
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr5_b <= 0;
|
||||
else if(cen) begin
|
||||
if (reset_b)
|
||||
wr5_b <= { 1'b0, wr5_b[6:5], 4'b0000, wr5_b[0] };
|
||||
else if (wreg_b && rindex == 5)
|
||||
wr5_b <= wdata;
|
||||
end
|
||||
end
|
||||
|
||||
/* WR9. Special: top bits are reset, handled separately, bottom
|
||||
* bits are only reset by a hw reset
|
||||
*/
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr9 <= 0;
|
||||
else if (cen && (wreg_a || wreg_b) && rindex == 9)
|
||||
wr9 <= wdata[5:0];
|
||||
end
|
||||
|
||||
/* WR10
|
||||
* Reset: all 0, except chanel reset retains 6 and 5
|
||||
*/
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset)
|
||||
wr10_a <= 0;
|
||||
else if(cen) begin
|
||||
if (reset_a)
|
||||
wr10_a <= { 1'b0, wr10_a[6:5], 5'b00000 };
|
||||
else if (wreg_a && rindex == 10)
|
||||
wr10_a <= wdata;
|
||||
end
|
||||
end
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset)
|
||||
wr10_b <= 0;
|
||||
else if(cen) begin
|
||||
if (reset_b)
|
||||
wr10_b <= { 1'b0, wr10_b[6:5], 5'b00000 };
|
||||
else if (wreg_b && rindex == 10)
|
||||
wr10_b <= wdata;
|
||||
end
|
||||
end
|
||||
|
||||
/* WR12
|
||||
* Reset: Unchanged
|
||||
*/
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr12_a <= 0;
|
||||
else if (cen && wreg_a && rindex == 12)
|
||||
wr12_a <= wdata;
|
||||
end
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr12_b <= 0;
|
||||
else if (cen && wreg_b && rindex == 12)
|
||||
wr12_b <= wdata;
|
||||
end
|
||||
|
||||
/* WR13
|
||||
* Reset: Unchanged
|
||||
*/
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr13_a <= 0;
|
||||
else if (cen && wreg_a && rindex == 13)
|
||||
wr13_a <= wdata;
|
||||
end
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr13_b <= 0;
|
||||
else if (cen && wreg_b && rindex == 13)
|
||||
wr13_b <= wdata;
|
||||
end
|
||||
|
||||
/* WR14
|
||||
* Reset: Full reset maintains top 2 bits,
|
||||
* Chan reset also maitains bottom 2 bits, bit 4 also
|
||||
* reset to a different value
|
||||
*/
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr14_a <= 0;
|
||||
else if(cen) begin
|
||||
if (reset)
|
||||
wr14_a <= { wr14_a[7:6], 6'b110000 };
|
||||
else if (reset_a)
|
||||
wr14_a <= { wr14_a[7:6], 4'b1000, wr14_a[1:0] };
|
||||
else if (wreg_a && rindex == 14)
|
||||
wr14_a <= wdata;
|
||||
end
|
||||
end
|
||||
always@(posedge clk or posedge reset_hw) begin
|
||||
if (reset_hw)
|
||||
wr14_b <= 0;
|
||||
else if(cen) begin
|
||||
if (reset)
|
||||
wr14_b <= { wr14_b[7:6], 6'b110000 };
|
||||
else if (reset_b)
|
||||
wr14_b <= { wr14_b[7:6], 4'b1000, wr14_b[1:0] };
|
||||
else if (wreg_b && rindex == 14)
|
||||
wr14_b <= wdata;
|
||||
end
|
||||
end
|
||||
|
||||
/* WR15 */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) begin
|
||||
wr15_a <= 8'b11111000;
|
||||
wr15_b <= 8'b11111000;
|
||||
end else if (cen && rindex == 15) begin
|
||||
if(wreg_a) wr15_a <= wdata;
|
||||
if(wreg_b) wr15_b <= wdata;
|
||||
end
|
||||
end
|
||||
|
||||
/* Read data mux */
|
||||
assign rdata = rs[1] && rs[0] ? data_a :
|
||||
rs[1] ? data_b :
|
||||
rindex == 0 && rs[0] ? rr0_a :
|
||||
rindex == 0 ? rr0_b :
|
||||
rindex == 1 && rs[0] ? rr1_a :
|
||||
rindex == 1 ? rr1_b :
|
||||
rindex == 2 && rs[0] ? wr2 :
|
||||
rindex == 2 ? rr2_b :
|
||||
rindex == 3 && rs[0] ? rr3_a :
|
||||
rindex == 3 ? 8'h00 :
|
||||
rindex == 4 && rs[0] ? rr0_a :
|
||||
rindex == 4 ? rr0_b :
|
||||
rindex == 5 && rs[0] ? rr1_a :
|
||||
rindex == 5 ? rr1_b :
|
||||
rindex == 6 && rs[0] ? wr2 :
|
||||
rindex == 6 ? rr2_b :
|
||||
rindex == 7 && rs[0] ? rr3_a :
|
||||
rindex == 7 ? 8'h00 :
|
||||
|
||||
rindex == 8 && rs[0] ? data_a :
|
||||
rindex == 8 ? data_b :
|
||||
rindex == 9 && rs[0] ? wr13_a :
|
||||
rindex == 9 ? wr13_b :
|
||||
rindex == 10 && rs[0] ? rr10_a :
|
||||
rindex == 10 ? rr10_b :
|
||||
rindex == 11 && rs[0] ? rr15_a :
|
||||
rindex == 11 ? rr15_b :
|
||||
rindex == 12 && rs[0] ? wr12_a :
|
||||
rindex == 12 ? wr12_b :
|
||||
rindex == 13 && rs[0] ? wr13_a :
|
||||
rindex == 13 ? wr13_b :
|
||||
rindex == 14 && rs[0] ? rr10_a :
|
||||
rindex == 14 ? rr10_b :
|
||||
rindex == 15 && rs[0] ? rr15_a :
|
||||
rindex == 15 ? rr15_b : 8'hff;
|
||||
|
||||
/* RR0 */
|
||||
assign rr0_a = { 1'b0, /* Break */
|
||||
1'b1, /* Tx Underrun/EOM */
|
||||
1'b0, /* CTS */
|
||||
1'b0, /* Sync/Hunt */
|
||||
wr15_a[3] ? dcd_latch_a : dcd_a, /* DCD */
|
||||
1'b1, /* Tx Empty */
|
||||
1'b0, /* Zero Count */
|
||||
1'b0 /* Rx Available */
|
||||
};
|
||||
assign rr0_b = { 1'b0, /* Break */
|
||||
1'b1, /* Tx Underrun/EOM */
|
||||
1'b0, /* CTS */
|
||||
1'b0, /* Sync/Hunt */
|
||||
wr15_b[3] ? dcd_latch_b : dcd_b, /* DCD */
|
||||
1'b1, /* Tx Empty */
|
||||
1'b0, /* Zero Count */
|
||||
1'b0 /* Rx Available */
|
||||
};
|
||||
|
||||
/* RR1 */
|
||||
assign rr1_a = { 1'b0, /* End of frame */
|
||||
1'b0, /* CRC/Framing error */
|
||||
1'b0, /* Rx Overrun error */
|
||||
1'b0, /* Parity error */
|
||||
1'b0, /* Residue code 0 */
|
||||
1'b1, /* Residue code 1 */
|
||||
1'b1, /* Residue code 2 */
|
||||
1'b1 /* All sent */
|
||||
};
|
||||
|
||||
assign rr1_b = { 1'b0, /* End of frame */
|
||||
1'b0, /* CRC/Framing error */
|
||||
1'b0, /* Rx Overrun error */
|
||||
1'b0, /* Parity error */
|
||||
1'b0, /* Residue code 0 */
|
||||
1'b1, /* Residue code 1 */
|
||||
1'b1, /* Residue code 2 */
|
||||
1'b1 /* All sent */
|
||||
};
|
||||
|
||||
/* RR2 (Chan B only, A is just WR2) */
|
||||
assign rr2_b = { wr2[7],
|
||||
wr9[4] ? rr2_vec_stat[0] : wr2[6],
|
||||
wr9[4] ? rr2_vec_stat[1] : wr2[5],
|
||||
wr9[4] ? rr2_vec_stat[2] : wr2[4],
|
||||
wr9[4] ? wr2[3] : rr2_vec_stat[2],
|
||||
wr9[4] ? wr2[2] : rr2_vec_stat[1],
|
||||
wr9[4] ? wr2[1] : rr2_vec_stat[0],
|
||||
wr2[0]
|
||||
};
|
||||
|
||||
|
||||
/* RR3 (Chan A only) */
|
||||
assign rr3_a = { 2'b0,
|
||||
rx_irq_pend_a, /* Rx interrupt pending */
|
||||
tx_irq_pend_a, /* Tx interrupt pending */
|
||||
ex_irq_pend_a, /* Status/Ext interrupt pending */
|
||||
rx_irq_pend_b,
|
||||
tx_irq_pend_b,
|
||||
ex_irq_pend_b
|
||||
};
|
||||
|
||||
/* RR10 */
|
||||
assign rr10_a = { 1'b0, /* One clock missing */
|
||||
1'b0, /* Two clocks missing */
|
||||
1'b0,
|
||||
1'b0, /* Loop sending */
|
||||
1'b0,
|
||||
1'b0,
|
||||
1'b0, /* On Loop */
|
||||
1'b0
|
||||
};
|
||||
assign rr10_b = { 1'b0, /* One clock missing */
|
||||
1'b0, /* Two clocks missing */
|
||||
1'b0,
|
||||
1'b0, /* Loop sending */
|
||||
1'b0,
|
||||
1'b0,
|
||||
1'b0, /* On Loop */
|
||||
1'b0
|
||||
};
|
||||
|
||||
/* RR15 */
|
||||
assign rr15_a = { wr15_a[7],
|
||||
wr15_a[6],
|
||||
wr15_a[5],
|
||||
wr15_a[4],
|
||||
wr15_a[3],
|
||||
1'b0,
|
||||
wr15_a[1],
|
||||
1'b0
|
||||
};
|
||||
|
||||
assign rr15_b = { wr15_b[7],
|
||||
wr15_b[6],
|
||||
wr15_b[5],
|
||||
wr15_b[4],
|
||||
wr15_b[3],
|
||||
1'b0,
|
||||
wr15_b[1],
|
||||
1'b0
|
||||
};
|
||||
|
||||
/* Interrupts. Simplified for now
|
||||
*
|
||||
* Need to add latches. Tx irq is latched when buffer goes from full->empty,
|
||||
* it's not a permanent state. For now keep it clear. Will have to fix that.
|
||||
*/
|
||||
assign rx_irq_pend_a = 0;
|
||||
assign tx_irq_pend_a = 0 /*& wr1_a[1]*/; /* Tx always empty for now */
|
||||
assign ex_irq_pend_a = ex_irq_ip_a;
|
||||
assign rx_irq_pend_b = 0;
|
||||
assign tx_irq_pend_b = 0 /*& wr1_b[1]*/; /* Tx always empty for now */
|
||||
assign ex_irq_pend_b = ex_irq_ip_b;
|
||||
|
||||
assign _irq = ~(wr9[3] & (rx_irq_pend_a |
|
||||
rx_irq_pend_b |
|
||||
tx_irq_pend_a |
|
||||
tx_irq_pend_b |
|
||||
ex_irq_pend_a |
|
||||
ex_irq_pend_b));
|
||||
|
||||
/* XXX Verify that... also missing special receive condition */
|
||||
assign rr2_vec_stat = rx_irq_pend_a ? 3'b110 :
|
||||
tx_irq_pend_a ? 3'b100 :
|
||||
ex_irq_pend_a ? 3'b101 :
|
||||
rx_irq_pend_b ? 3'b010 :
|
||||
tx_irq_pend_b ? 3'b000 :
|
||||
ex_irq_pend_b ? 3'b001 : 3'b011;
|
||||
|
||||
/* External/Status interrupt & latch logic */
|
||||
assign do_extreset_a = wreg_a & (rindex == 0) & (wdata[5:3] == 3'b010);
|
||||
assign do_extreset_b = wreg_b & (rindex == 0) & (wdata[5:3] == 3'b010);
|
||||
|
||||
/* Internal IP bit set if latch different from source and
|
||||
* corresponding interrupt is enabled in WR15
|
||||
*/
|
||||
assign dcd_ip_a = (dcd_a != dcd_latch_a) & wr15_a[3];
|
||||
assign dcd_ip_b = (dcd_b != dcd_latch_b) & wr15_b[3];
|
||||
|
||||
/* Latches close when an enabled IP bit is set and latches
|
||||
* are currently open
|
||||
*/
|
||||
assign do_latch_a = latch_open_a & (dcd_ip_a /* | cts... */);
|
||||
assign do_latch_b = latch_open_b & (dcd_ip_b /* | cts... */);
|
||||
|
||||
/* "Master" interrupt, set when latch close & WR1[0] is set */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset)
|
||||
ex_irq_ip_a <= 0;
|
||||
else if(cep) begin
|
||||
if (do_extreset_a)
|
||||
ex_irq_ip_a <= 0;
|
||||
else if (do_latch_a && wr1_a[0])
|
||||
ex_irq_ip_a <= 1;
|
||||
end
|
||||
end
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset)
|
||||
ex_irq_ip_b <= 0;
|
||||
else if(cep) begin
|
||||
if (do_extreset_b)
|
||||
ex_irq_ip_b <= 0;
|
||||
else if (do_latch_b && wr1_b[0])
|
||||
ex_irq_ip_b <= 1;
|
||||
end
|
||||
end
|
||||
|
||||
/* Latch open/close control */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset)
|
||||
latch_open_a <= 1;
|
||||
else if(cep) begin
|
||||
if (do_extreset_a)
|
||||
latch_open_a <= 1;
|
||||
else if (do_latch_a)
|
||||
latch_open_a <= 0;
|
||||
end
|
||||
end
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset)
|
||||
latch_open_b <= 1;
|
||||
else if(cep) begin
|
||||
if (do_extreset_b)
|
||||
latch_open_b <= 1;
|
||||
else if (do_latch_b)
|
||||
latch_open_b <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
/* Latches proper */
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) begin
|
||||
dcd_latch_a <= 0;
|
||||
/* cts ... */
|
||||
end else if(cep) begin
|
||||
if (do_latch_a)
|
||||
dcd_latch_a <= dcd_a;
|
||||
/* cts ... */
|
||||
end
|
||||
end
|
||||
always@(posedge clk or posedge reset) begin
|
||||
if (reset) begin
|
||||
dcd_latch_b <= 0;
|
||||
/* cts ... */
|
||||
end else if(cep) begin
|
||||
if (do_latch_b)
|
||||
dcd_latch_b <= dcd_b;
|
||||
/* cts ... */
|
||||
end
|
||||
end
|
||||
|
||||
/* NYI */
|
||||
assign txd = 1;
|
||||
assign rts = 1;
|
||||
|
||||
assign wreq = 1;
|
||||
endmodule
|
340
scsi.v
Normal file
340
scsi.v
Normal file
@ -0,0 +1,340 @@
|
||||
/* verilator lint_off UNUSED */
|
||||
/* verilator lint_off SYNCASYNCNET */
|
||||
|
||||
// scsi.v
|
||||
// implements a target only scsi device
|
||||
|
||||
module scsi
|
||||
(
|
||||
input clk,
|
||||
|
||||
// scsi interface
|
||||
input rst, // bus reset from initiator
|
||||
input sel,
|
||||
input atn, // initiator requests to send a message
|
||||
output bsy, // target holds bus
|
||||
|
||||
output msg,
|
||||
output cd,
|
||||
output io,
|
||||
|
||||
output req,
|
||||
input ack, // initiator acknowledges a request
|
||||
|
||||
input [7:0] din, // data from initiator to target
|
||||
output [7:0] dout, // data from target to initiator
|
||||
|
||||
// interface to io controller
|
||||
output [31:0] io_lba,
|
||||
output reg io_rd,
|
||||
output reg io_wr,
|
||||
input io_ack,
|
||||
|
||||
input [8:0] sd_buff_addr,
|
||||
input [7:0] sd_buff_dout,
|
||||
output reg [7:0] sd_buff_din,
|
||||
input sd_buff_wr
|
||||
);
|
||||
|
||||
|
||||
// SCSI device id
|
||||
parameter ID = 0;
|
||||
|
||||
`define PHASE_IDLE 3'd0
|
||||
`define PHASE_CMD_IN 3'd1
|
||||
`define PHASE_DATA_OUT 3'd2
|
||||
`define PHASE_DATA_IN 3'd3
|
||||
`define PHASE_STATUS_OUT 3'd4
|
||||
`define PHASE_MESSAGE_OUT 3'd5
|
||||
reg [2:0] phase;
|
||||
|
||||
// ---------------- buffer read engine -----------------------
|
||||
// the buffer itself. Can hold one sector
|
||||
reg [7:0] buffer_out [512];
|
||||
always @(posedge clk) sd_buff_din <= buffer_out[sd_buff_addr];
|
||||
|
||||
// ---------------- buffer write engine ----------------------
|
||||
// the buffer itself. Can hold one sector
|
||||
reg [7:0] buffer_in [512];
|
||||
always @(posedge clk) if(sd_buff_wr) buffer_in[sd_buff_addr] <= sd_buff_dout;
|
||||
|
||||
// -----------------------------------------------------------
|
||||
|
||||
// status replies
|
||||
reg [7:0] status;
|
||||
`define STATUS_OK 8'h00
|
||||
`define STATUS_CHECK_CONDITION 8'h02
|
||||
|
||||
// message codes
|
||||
`define MSG_CMD_COMPLETE 8'h00
|
||||
|
||||
// drive scsi signals according to phase
|
||||
assign msg = (phase == `PHASE_MESSAGE_OUT);
|
||||
assign cd = (phase == `PHASE_CMD_IN) || (phase == `PHASE_STATUS_OUT) || (phase == `PHASE_MESSAGE_OUT);
|
||||
assign io = (phase == `PHASE_DATA_OUT) || (phase == `PHASE_STATUS_OUT) || (phase == `PHASE_MESSAGE_OUT);
|
||||
assign req = (phase != `PHASE_IDLE) && !ack && !io_rd && !io_wr && !io_ack;
|
||||
assign bsy = (phase != `PHASE_IDLE);
|
||||
|
||||
assign dout = (phase == `PHASE_STATUS_OUT)?status:
|
||||
(phase == `PHASE_MESSAGE_OUT)?`MSG_CMD_COMPLETE:
|
||||
(phase == `PHASE_DATA_OUT)?cmd_dout:
|
||||
8'h00;
|
||||
|
||||
// de-multiplex different data sources
|
||||
wire [7:0] cmd_dout =
|
||||
cmd_read?buffer_dout:
|
||||
cmd_inquiry?inquiry_dout:
|
||||
cmd_read_capacity?read_capacity_dout:
|
||||
cmd_mode_sense?mode_sense_dout:
|
||||
8'h00;
|
||||
|
||||
// output of inquiry command, identify as "SEAGATE ST225N"
|
||||
wire [7:0] inquiry_dout =
|
||||
(data_cnt == 32'd4 )?8'd32: // length
|
||||
|
||||
(data_cnt == 32'd8 )?" ":(data_cnt == 32'd9 )?"S":
|
||||
(data_cnt == 32'd10)?"E":(data_cnt == 32'd11)?"A":
|
||||
(data_cnt == 32'd12)?"G":(data_cnt == 32'd13)?"A":
|
||||
(data_cnt == 32'd14)?"T":(data_cnt == 32'd15)?"E":
|
||||
(data_cnt == 32'd16)?" ":(data_cnt == 32'd17)?" ":
|
||||
(data_cnt == 32'd18)?" ":(data_cnt == 32'd19)?" ":
|
||||
(data_cnt == 32'd20)?" ":(data_cnt == 32'd21)?" ":
|
||||
(data_cnt == 32'd22)?" ":(data_cnt == 32'd23)?" ":
|
||||
(data_cnt == 32'd24)?" ":(data_cnt == 32'd25)?" ":
|
||||
|
||||
(data_cnt == 32'd26)?"S":(data_cnt == 32'd27)?"T":
|
||||
(data_cnt == 32'd28)?"2":(data_cnt == 32'd29)?"2":
|
||||
(data_cnt == 32'd30)?"5":(data_cnt == 32'd31)?"N":
|
||||
8'h00;
|
||||
|
||||
// output of read capacity command
|
||||
wire [31:0] capacity = 32'd41056; // 40960 + 96 blocks = 20MB
|
||||
wire [31:0] capacity_m1 = capacity - 32'd1;
|
||||
wire [7:0] read_capacity_dout =
|
||||
(data_cnt == 32'd0 )?capacity_m1[31:24]:
|
||||
(data_cnt == 32'd1 )?capacity_m1[23:16]:
|
||||
(data_cnt == 32'd2 )?capacity_m1[15:8]:
|
||||
(data_cnt == 32'd3 )?capacity_m1[7:0]:
|
||||
(data_cnt == 32'd6 )?8'd2: // 512 bytes per sector
|
||||
8'h00;
|
||||
|
||||
wire [7:0] mode_sense_dout =
|
||||
(data_cnt == 32'd3 )?8'd8:
|
||||
(data_cnt == 32'd5 )?capacity[23:16]:
|
||||
(data_cnt == 32'd6 )?capacity[15:8]:
|
||||
(data_cnt == 32'd7 )?capacity[7:0]:
|
||||
(data_cnt == 32'd10 )?8'd2:
|
||||
8'h00;
|
||||
|
||||
// clock data out of buffer to allow for embedded ram
|
||||
reg [7:0] buffer_dout;
|
||||
always @(posedge clk) buffer_dout <= buffer_in[data_cnt];
|
||||
|
||||
// buffer to store incoming commands
|
||||
reg [3:0] cmd_cnt;
|
||||
reg [7:0] cmd [9:0];
|
||||
|
||||
/* ----------------------- request data from/to io controller ----------------------- */
|
||||
|
||||
// base address of current block. Subtract one when writing since the writing happens
|
||||
// after a block has been transferred and data_cnt has thus already been increased by 512
|
||||
assign io_lba = lba + { 9'd0, data_cnt[31:9] } -
|
||||
(cmd_write ? 32'd1 : 32'd0);
|
||||
|
||||
wire req_rd = ((phase == `PHASE_DATA_OUT) && cmd_read && (data_cnt[8:0] == 0) && !data_complete);
|
||||
wire req_wr = ((((phase == `PHASE_DATA_IN) && (data_cnt[8:0] == 0) && (data_cnt != 0)) || (phase == `PHASE_STATUS_OUT)) && cmd_write);
|
||||
always @(posedge clk) begin
|
||||
reg old_rd, old_wr;
|
||||
|
||||
old_rd <= req_rd;
|
||||
old_wr <= req_wr;
|
||||
|
||||
if(io_ack) begin
|
||||
io_rd <= 1'b0;
|
||||
io_wr <= 1'b0;
|
||||
end else begin
|
||||
// generate an io_rd signal whenever the first byte of a 512 byte block is required and io_wr whenever
|
||||
// the last byte of a 512 byte block has been revceived
|
||||
if(~old_rd & req_rd) io_rd <= 1;
|
||||
|
||||
// generate an io_wr signal whenever a 512 byte block has been received or when the status
|
||||
// phase of a write command has been reached
|
||||
if(~old_wr & req_wr) io_wr <= 1;
|
||||
end
|
||||
end
|
||||
|
||||
reg stb_ack;
|
||||
reg stb_adv;
|
||||
always @(posedge clk) begin
|
||||
reg old_ack;
|
||||
|
||||
old_ack <= ack;
|
||||
stb_ack <= (~old_ack & ack);
|
||||
stb_adv <= stb_ack;
|
||||
end
|
||||
|
||||
// store data on rising edge of ack, ...
|
||||
always @(posedge clk) begin
|
||||
if(stb_ack) begin
|
||||
if(phase == `PHASE_CMD_IN) cmd[cmd_cnt] <= din;
|
||||
if(phase == `PHASE_DATA_IN) buffer_out[data_cnt] <= din;
|
||||
end
|
||||
end
|
||||
|
||||
// ... advance counter on falling edge
|
||||
always @(posedge clk) begin
|
||||
if(phase == `PHASE_IDLE) cmd_cnt <= 4'd0;
|
||||
else if(stb_adv && (phase == `PHASE_CMD_IN) && (cmd_cnt != 15)) cmd_cnt <= cmd_cnt + 4'd1;
|
||||
end
|
||||
|
||||
// count data bytes. don't increase counter while we are waiting for data from
|
||||
// the io controller
|
||||
reg [31:0] data_cnt;
|
||||
reg data_complete;
|
||||
|
||||
// For block transfers tlen contains the number of 512 bytes blocks to transfer.
|
||||
// Most other commands have the bytes length stored in the transfer length field.
|
||||
// And some have a fixed length idependent from any header field.
|
||||
// The data transfer has finished once the data counter reaches this
|
||||
// number.
|
||||
wire [31:0] data_len =
|
||||
cmd_read_capacity?32'd8:
|
||||
cmd_read?{ 7'd0, tlen, 9'd0 }: // read command length is in 512 bytes blocks
|
||||
cmd_write?{ 7'd0, tlen, 9'd0 }: // write command length is in 512 bytes blocks
|
||||
{ 16'd0, tlen }; // inquiry etc have length in bytes
|
||||
|
||||
always @(posedge clk) begin
|
||||
if((phase != `PHASE_DATA_OUT) && (phase != `PHASE_DATA_IN) && (phase != `PHASE_STATUS_OUT) && (phase != `PHASE_MESSAGE_OUT)) begin
|
||||
data_cnt <= 0;
|
||||
data_complete <= 0;
|
||||
end else begin
|
||||
if(stb_adv)begin
|
||||
if(!data_complete) data_cnt <= data_cnt + 1'd1;
|
||||
data_complete <= (data_len - 1'd1) == data_cnt;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
// check whether status byte has been sent
|
||||
reg status_sent;
|
||||
always @(posedge clk) begin
|
||||
if(phase != `PHASE_STATUS_OUT) status_sent <= 0;
|
||||
else if(stb_adv) status_sent <= 1;
|
||||
end
|
||||
|
||||
// check whether message byte has been sent
|
||||
reg message_sent;
|
||||
always @(posedge clk) begin
|
||||
if(phase != `PHASE_MESSAGE_OUT) message_sent <= 0;
|
||||
else if(stb_adv) message_sent <= 1;
|
||||
end
|
||||
|
||||
/* ----------------------- command decoding ------------------------------- */
|
||||
|
||||
|
||||
// parse commands
|
||||
wire [7:0] op_code = cmd[0];
|
||||
wire [2:0] cmd_group = op_code[7:5];
|
||||
|
||||
// check if a complete command has been received
|
||||
wire cmd_cpl = cmd6_cpl || cmd10_cpl;
|
||||
wire cmd6_cpl = (cmd_group == 3'b000) && (cmd_cnt == 6);
|
||||
wire cmd10_cpl = ((cmd_group == 3'b010) || (cmd_group == 3'b001)) && (cmd_cnt == 10);
|
||||
|
||||
// https://en.wikipedia.org/wiki/SCSI_command
|
||||
wire cmd_read = cmd_read6 || cmd_read10;
|
||||
wire cmd_read6 = (op_code == 8'h08);
|
||||
wire cmd_read10 = (op_code == 8'h28);
|
||||
wire cmd_write = cmd_write6 || cmd_write10;
|
||||
wire cmd_write6 = (op_code == 8'h0a);
|
||||
wire cmd_write10 = (op_code == 8'h2a);
|
||||
wire cmd_inquiry = (op_code == 8'h12);
|
||||
wire cmd_format = (op_code == 8'h04);
|
||||
wire cmd_mode_select = (op_code == 8'h15);
|
||||
wire cmd_mode_sense = (op_code == 8'h1a);
|
||||
wire cmd_test_unit_ready = (op_code == 8'h00);
|
||||
wire cmd_read_capacity = (op_code == 8'h25);
|
||||
|
||||
// valid command in buffer? TODO: check for valid command parameters
|
||||
wire cmd_ok = cmd_read || cmd_write || cmd_inquiry || cmd_test_unit_ready ||
|
||||
cmd_read_capacity || cmd_mode_select || cmd_format || cmd_mode_sense;
|
||||
|
||||
// latch parameters once command is complete
|
||||
reg [31:0] lba;
|
||||
reg [15:0] tlen;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if(cmd_cpl && (phase == `PHASE_CMD_IN)) begin
|
||||
lba <= cmd6_cpl?{11'd0, lba6}:lba10;
|
||||
tlen <= cmd6_cpl?{7'd0, tlen6}:tlen10;
|
||||
end
|
||||
end
|
||||
|
||||
// logical block address
|
||||
wire [7:0] cmd1 = cmd[1];
|
||||
wire [20:0] lba6 = { cmd1[4:0], cmd[2], cmd[3] };
|
||||
wire [31:0] lba10 = { cmd[2], cmd[3], cmd[4], cmd[5] };
|
||||
|
||||
// transfer length
|
||||
wire [8:0] tlen6 = (cmd[4] == 0)?9'd256:{1'b0,cmd[4]};
|
||||
wire [15:0] tlen10 = { cmd[7], cmd[8] };
|
||||
|
||||
|
||||
// the 5380 changes phase in the falling edge, thus we monitor it
|
||||
// on the rising edge
|
||||
always @(posedge clk) begin
|
||||
if(rst) begin
|
||||
phase <= `PHASE_IDLE;
|
||||
end else begin
|
||||
if(phase == `PHASE_IDLE) begin
|
||||
if(sel && din[ID]) // own id on bus during selection?
|
||||
phase <= `PHASE_CMD_IN;
|
||||
end
|
||||
|
||||
else if(phase == `PHASE_CMD_IN) begin
|
||||
// check if a full command is in the buffer
|
||||
if(cmd_cpl) begin
|
||||
// is this a supported and valid command?
|
||||
if(cmd_ok) begin
|
||||
// yes, continue
|
||||
status <= `STATUS_OK;
|
||||
|
||||
// continue according to command
|
||||
|
||||
// these commands return data
|
||||
if(cmd_read || cmd_inquiry || cmd_read_capacity || cmd_mode_sense) phase <= `PHASE_DATA_OUT;
|
||||
// these commands receive dataa
|
||||
else if(cmd_write || cmd_mode_select) phase <= `PHASE_DATA_IN;
|
||||
// and all other valid commands are just "ok"
|
||||
else phase <= `PHASE_STATUS_OUT;
|
||||
end else begin
|
||||
// no, report failure
|
||||
status <= `STATUS_CHECK_CONDITION;
|
||||
phase <= `PHASE_STATUS_OUT;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
else if(phase == `PHASE_DATA_OUT) begin
|
||||
if(data_complete) phase <= `PHASE_STATUS_OUT;
|
||||
end
|
||||
|
||||
else if(phase == `PHASE_DATA_IN) begin
|
||||
if(data_complete) phase <= `PHASE_STATUS_OUT;
|
||||
end
|
||||
|
||||
else if(phase == `PHASE_STATUS_OUT) begin
|
||||
if(status_sent) phase <= `PHASE_MESSAGE_OUT;
|
||||
end
|
||||
|
||||
else if(phase == `PHASE_MESSAGE_OUT) begin
|
||||
if(message_sent) phase <= `PHASE_IDLE;
|
||||
end
|
||||
|
||||
else
|
||||
phase <= `PHASE_IDLE; // should never happen
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
endmodule
|
35
sys/build_id.tcl
Normal file
35
sys/build_id.tcl
Normal file
@ -0,0 +1,35 @@
|
||||
# ================================================================================
|
||||
#
|
||||
# Build ID Verilog Module Script
|
||||
# Jeff Wiencrot - 8/1/2011
|
||||
#
|
||||
# Generates a Verilog module that contains a timestamp,
|
||||
# from the current build. These values are available from the build_date, build_time,
|
||||
# physical_address, and host_name output ports of the build_id module in the build_id.v
|
||||
# Verilog source file.
|
||||
#
|
||||
# ================================================================================
|
||||
|
||||
proc generateBuildID_Verilog {} {
|
||||
|
||||
# Get the timestamp (see: http://www.altera.com/support/examples/tcl/tcl-date-time-stamp.html)
|
||||
set buildDate [ clock format [ clock seconds ] -format %y%m%d ]
|
||||
set buildTime [ clock format [ clock seconds ] -format %H%M%S ]
|
||||
|
||||
# Create a Verilog file for output
|
||||
set outputFileName "build_id.v"
|
||||
set outputFile [open $outputFileName "w"]
|
||||
|
||||
# Output the Verilog source
|
||||
puts $outputFile "`define BUILD_DATE \"$buildDate\""
|
||||
puts $outputFile "`define BUILD_TIME \"$buildTime\""
|
||||
close $outputFile
|
||||
|
||||
# Send confirmation message to the Messages window
|
||||
post_message "Generated build identification Verilog module: [pwd]/$outputFileName"
|
||||
post_message "Date: $buildDate"
|
||||
post_message "Time: $buildTime"
|
||||
}
|
||||
|
||||
# Comment out this line to prevent the process from automatically executing when the file is sourced:
|
||||
generateBuildID_Verilog
|
153
sys/ddram.sv
Normal file
153
sys/ddram.sv
Normal file
@ -0,0 +1,153 @@
|
||||
//
|
||||
// ddram.v
|
||||
//
|
||||
// DE10-nano DDR3 memory interface
|
||||
//
|
||||
// Copyright (c) 2017 Sorgelig
|
||||
//
|
||||
//
|
||||
// This source file 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 source file 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 <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
// ------------------------------------------
|
||||
//
|
||||
|
||||
module ddram
|
||||
(
|
||||
input RESET,
|
||||
input DDRAM_CLK,
|
||||
|
||||
input DDRAM_BUSY,
|
||||
output [7:0] DDRAM_BURSTCNT,
|
||||
output [28:0] DDRAM_ADDR,
|
||||
input [63:0] DDRAM_DOUT,
|
||||
input DDRAM_DOUT_READY,
|
||||
output DDRAM_RD,
|
||||
output [63:0] DDRAM_DIN,
|
||||
output [7:0] DDRAM_BE,
|
||||
output DDRAM_WE,
|
||||
|
||||
input wb_clk, // chipset clock to which sdram state machine is synchonized
|
||||
input [31:0] wb_dat_i, // data input from chipset/cpu
|
||||
output reg [31:0] wb_dat_o, // data output to chipset/cpu
|
||||
input [27:0] wb_adr, // lower 2 bits are ignored.
|
||||
input [3:0] wb_sel, //
|
||||
input [2:0] wb_cti, // cycle type.
|
||||
input wb_stb, //
|
||||
input wb_cyc, // cpu/chipset requests cycle
|
||||
input wb_we, // cpu/chipset requests write
|
||||
output reg wb_ack
|
||||
);
|
||||
|
||||
assign DDRAM_BURSTCNT = burst;
|
||||
assign DDRAM_BE = ({wb_sel&{4{wb_adr[2]}},wb_sel&{4{~wb_adr[2]}}}) | {8{ram_read}};
|
||||
assign DDRAM_ADDR = {4'b0011, wb_adr[27:3]}; // RAM at 0x30000000
|
||||
assign DDRAM_DIN = {wb_dat_i,wb_dat_i};
|
||||
assign DDRAM_RD = ram_read;
|
||||
assign DDRAM_WE = ram_write;
|
||||
|
||||
reg [31:0] ram_q[4];
|
||||
reg ram_read;
|
||||
reg ram_write;
|
||||
|
||||
reg op_req = 0, op_ack = 0;
|
||||
reg op_we;
|
||||
|
||||
always @(posedge DDRAM_CLK)
|
||||
begin
|
||||
reg state = 0;
|
||||
reg opr;
|
||||
reg [7:0] c;
|
||||
|
||||
opr <= op_req;
|
||||
|
||||
if(RESET)
|
||||
begin
|
||||
state <= 0;
|
||||
ram_write <= 0;
|
||||
ram_read <= 0;
|
||||
end
|
||||
else
|
||||
if(!DDRAM_BUSY)
|
||||
begin
|
||||
ram_write <= 0;
|
||||
ram_read <= 0;
|
||||
|
||||
case(state)
|
||||
0: if(op_ack != opr) begin
|
||||
ram_write <= op_we;
|
||||
ram_read <= ~op_we;
|
||||
state <= 1;
|
||||
c <= 1;
|
||||
end
|
||||
1: if(op_we)
|
||||
begin
|
||||
op_ack <= opr;
|
||||
state <= 0;
|
||||
end
|
||||
else
|
||||
if(DDRAM_DOUT_READY) begin
|
||||
if(c[1]) {ram_q[3], ram_q[2]} <= DDRAM_DOUT;
|
||||
else {ram_q[1], ram_q[0]} <= DDRAM_DOUT;
|
||||
|
||||
c <= c + 1'd1;
|
||||
if(c >= burst) begin
|
||||
state <= 0;
|
||||
op_ack <= opr;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
reg [7:0] burst;
|
||||
always @(negedge wb_clk) begin
|
||||
reg ack = 0;
|
||||
reg state = 0;
|
||||
reg [1:0] sz;
|
||||
reg [1:0] cnt;
|
||||
|
||||
ack <= op_ack;
|
||||
|
||||
if(RESET) begin
|
||||
state <= 0;
|
||||
wb_ack <= 0;
|
||||
end
|
||||
else
|
||||
case(state)
|
||||
0: begin
|
||||
wb_ack <= 0;
|
||||
if(~wb_ack & wb_stb & wb_cyc) begin
|
||||
op_we <= wb_we;
|
||||
sz <= 0;
|
||||
burst <= 1;
|
||||
if((wb_cti == 2) && ~wb_we) begin
|
||||
sz <= 3;
|
||||
burst <= 2;
|
||||
end
|
||||
cnt <= wb_adr[2];
|
||||
op_req <= ~op_req;
|
||||
state <= 1;
|
||||
end
|
||||
end
|
||||
1: if(ack == op_req)
|
||||
begin
|
||||
wb_ack <= 1;
|
||||
if(~op_we) wb_dat_o <= ram_q[cnt];
|
||||
cnt <= cnt + 1'd1;
|
||||
if(cnt >= sz) state <= 0;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
|
||||
endmodule
|
265
sys/hdmi_config.sv
Normal file
265
sys/hdmi_config.sv
Normal file
@ -0,0 +1,265 @@
|
||||
|
||||
module hdmi_config
|
||||
(
|
||||
// Host Side
|
||||
input iCLK,
|
||||
input iRST_N,
|
||||
|
||||
// 0 - 480i
|
||||
// 1 - 480p
|
||||
// 2 - 576i
|
||||
// 3 - 576p
|
||||
// 4 - 720p
|
||||
// 5-7 - reserved
|
||||
input [2:0] iRES,
|
||||
|
||||
// 0 - 4:3
|
||||
// 1 - 16:9
|
||||
input iAR,
|
||||
|
||||
input audio_48k,
|
||||
|
||||
// I2C Side
|
||||
output I2C_SCL,
|
||||
inout I2C_SDA
|
||||
);
|
||||
|
||||
// Internal Registers/Wires
|
||||
reg mI2C_GO = 0;
|
||||
wire mI2C_END;
|
||||
wire mI2C_ACK;
|
||||
reg [15:0] LUT_DATA;
|
||||
reg [7:0] LUT_INDEX = 0;
|
||||
|
||||
I2C_Controller #(50_000_000, 400_000) i2c_av
|
||||
(
|
||||
.CLK(iCLK),
|
||||
|
||||
.I2C_SCL(I2C_SCL), // I2C CLOCK
|
||||
.I2C_SDA(I2C_SDA), // I2C DATA
|
||||
|
||||
.I2C_DATA({8'h72,init_data[LUT_INDEX]}), // DATA:[SLAVE_ADDR,SUB_ADDR,DATA]. 0x72 is the Slave Address of the ADV7513 chip!
|
||||
.START(mI2C_GO), // START transfer
|
||||
.END(mI2C_END), // END transfer
|
||||
.ACK(mI2C_ACK) // ACK
|
||||
);
|
||||
|
||||
////////////////////// Config Control ////////////////////////////
|
||||
always@(posedge iCLK or negedge iRST_N) begin
|
||||
reg [1:0] mSetup_ST = 0;
|
||||
|
||||
if(!iRST_N) begin
|
||||
LUT_INDEX <= 0;
|
||||
mSetup_ST <= 0;
|
||||
mI2C_GO <= 0;
|
||||
end else begin
|
||||
if(init_data[LUT_INDEX] != 16'hFFFF) begin
|
||||
case(mSetup_ST)
|
||||
0: begin
|
||||
mI2C_GO <= 1;
|
||||
mSetup_ST <= 1;
|
||||
end
|
||||
1: if(~mI2C_END) mSetup_ST <= 2;
|
||||
2: begin
|
||||
mI2C_GO <= 0;
|
||||
if(mI2C_END) begin
|
||||
mSetup_ST <= 0;
|
||||
if(!mI2C_ACK) LUT_INDEX <= LUT_INDEX + 8'd1;
|
||||
end
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
wire [15:0] res480i[6] = '{'h35_1D, 'h36_92, 'h37_05, 'h38_A0, 'h39_0F, 'h3A_00};
|
||||
wire [15:0] res480p[6] = '{'h35_1F, 'h36_E8, 'h37_05, 'h38_A0, 'h39_1E, 'h3A_00};
|
||||
wire [15:0] res576i[6] = '{'h35_20, 'h36_D6, 'h37_05, 'h38_A0, 'h39_12, 'h3A_00};
|
||||
wire [15:0] res576p[6] = '{'h35_20, 'h36_EC, 'h37_05, 'h38_A0, 'h39_24, 'h3A_00};
|
||||
wire [15:0] res720p[6] = '{'h35_40, 'h36_D9, 'h37_0A, 'h38_00, 'h39_2D, 'h3A_00};
|
||||
|
||||
reg [15:0] resVar[6];
|
||||
always_comb begin
|
||||
case(iRES)
|
||||
0: resVar <= res480i;
|
||||
1: resVar <= res480p;
|
||||
2: resVar <= res576i;
|
||||
3: resVar <= res576p;
|
||||
4: resVar <= res720p;
|
||||
default: resVar <= res720p;
|
||||
endcase
|
||||
end
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
///////////////////// Config Data LUT //////////////////////////
|
||||
|
||||
wire [15:0] init_data[58] =
|
||||
'{
|
||||
16'h4110, // Power Down control
|
||||
16'h9803, // ADI required Write.
|
||||
16'h9A70, // ADI required Write.
|
||||
16'h9C30, // ADI required Write.
|
||||
{8'h9D, 8'b0110_0001}, // [7:4] must be b0110!.
|
||||
// [3:2] b00 = Input clock not divided. b01 = Clk divided by 2. b10 = Clk divided by 4. b11 = invalid!
|
||||
// [1:0] must be b01!
|
||||
16'hA2A4, // ADI required Write.
|
||||
16'hA3A4, // ADI required Write.
|
||||
16'hE0D0, // ADI required Write.
|
||||
|
||||
|
||||
resVar[0],
|
||||
resVar[1],
|
||||
resVar[2],
|
||||
resVar[3],
|
||||
resVar[4],
|
||||
resVar[5],
|
||||
|
||||
{8'h16, 8'b0011_1000}, // Output Format 444 [7]=0.
|
||||
// [6] must be 0!
|
||||
// Colour Depth for Input Video data [5:4] b11 = 8-bit.
|
||||
// Input Style [3:2] b10 = Style 1 (ignored when using 444 input).
|
||||
// DDR Input Edge falling [1]=0 (not using DDR atm).
|
||||
// Output Colour Space RGB [0]=0.
|
||||
|
||||
// {8'h16, 8'b1011_0101}, // Output Format 422 [7]=1.
|
||||
// [6] must be 0!
|
||||
// Colour Depth for Input Video data [5:4] b11 = 8-bit.
|
||||
// Input Style [3:2] b01 = Style 2.
|
||||
// DDR Input Edge falling [1]=0 (not using DDR atm).
|
||||
// Output Colour Space YPrPb [0]=1.
|
||||
|
||||
// {8'h17, 8'b0110_0000}, // Aspect ratio 4:3 [1]=0. DE Generation DISabled [0]=0.
|
||||
// Vsync polarity HIGH [6]=0, LOW [6]=1.
|
||||
// Hsync polarity HIGH [5]=0, LOW [5]=1.
|
||||
|
||||
// {8'h17, 8'b0110_0001}, // Aspect ratio 4:3 [1]=0. DE Generation ENabled [0]=1.
|
||||
|
||||
// {8'h17, 8'b0110_0011}, // Aspect ratio 16:9 [1]=1. DE Generation ENabled [0]=1.
|
||||
|
||||
{8'h17, 6'b011000, iAR, 1'b0}, // Aspect ratio 16:9 [1]=1, 4:3 [1]=0
|
||||
|
||||
{8'h18, 8'b0100_0110}, // CSC disabled [7]=0.
|
||||
// CSC Scaling Factor [6:5] b10 = +/- 4.0, -16384 - 16380.
|
||||
// CSC Equation 3 [4:0] b00110.
|
||||
|
||||
|
||||
// {8'h3B, 8'b0000_1010}, // Pixel repetition [6:5] b00 AUTO. [4:3] b01 x2 mult of input clock. [2:1] b01 x2 pixel rep to send to HDMI Rx.
|
||||
|
||||
{8'h3B, 8'b0000_0000}, // Pixel repetition [6:5] b00 AUTO. [4:3] b00 x1 mult of input clock. [2:1] b00 x1 pixel rep to send to HDMI Rx.
|
||||
|
||||
// {8'h3B, 8'b0110_1010}, // Pixel repetition [6:5] b11 MANUAL. [4:3] b01 x2 mult of input clock. [2:1] b01 x2 pixel rep to send to HDMI Rx.
|
||||
|
||||
// {8'h3C, 8'b0000_0110}, // VIC#6 480i-60, 2x clk, 4:3.
|
||||
// {8'h3C, 8'b0000_0001}, // VIC#1 VGA (640x480), 2x clk, 4:3.
|
||||
|
||||
// {8'h3C, 8'b0000_0010}, // VIC#2 480p (720x480), 2x clk, 4:3.
|
||||
|
||||
16'h4000, // General Control Packet Enable
|
||||
|
||||
{8'h48, 8'b0000_1000}, // [6]=0 Normal bus order!
|
||||
// [5] DDR Alignment.
|
||||
// [4:3] b01 Data right justified (for YCbCr 422 input modes).
|
||||
|
||||
16'h49A8, // ADI required Write.
|
||||
16'h4C00, // ADI required Write.
|
||||
|
||||
{8'h55, 8'b0001_0000}, // [7] must be 0!. Set RGB444 in AVinfo Frame [6:5], Set active format [4].
|
||||
// {8'h55, 8'b0101_0000}, // [7] must be 0!. Set YCbCr 444 in AVinfo Frame [6:5], Set active format [4].
|
||||
// {8'h55, 8'b0011_0001}, // [7] must be 0!. Set YCbCr 422 in AVinfo Frame [6:5].
|
||||
// AVI InfoFrame Valid [4].
|
||||
// Bar Info [3:2] b00 Bars invalid. b01 Bars vertical. b10 Bars horizontal. b11 Bars both.
|
||||
// Scan Info [1:0] b00 (No data). b01 TV. b10 PC. b11 None.
|
||||
|
||||
// {8'h94, 8'b1000_0000}, // [7]=1 HPD Interrupt ENabled.
|
||||
|
||||
16'h7301,
|
||||
|
||||
16'h9400, // HPD Interrupt disabled.
|
||||
|
||||
16'h9902, // ADI required Write.
|
||||
16'h9B18, // ADI required Write.
|
||||
|
||||
16'h9F00, // ADI required Write.
|
||||
|
||||
{8'hA1, 8'b0100_0000}, // [6]=1 Monitor Sense Power Down DISabled.
|
||||
|
||||
16'hA408, // ADI required Write.
|
||||
16'hA504, // ADI required Write.
|
||||
16'hA600, // ADI required Write.
|
||||
16'hA700, // ADI required Write.
|
||||
16'hA800, // ADI required Write.
|
||||
16'hA900, // ADI required Write.
|
||||
16'hAA00, // ADI required Write.
|
||||
16'hAB40, // ADI required Write.
|
||||
|
||||
{8'hAF, 8'b0001_0110}, // [7]=0 HDCP Disabled.
|
||||
// [6:5] must be b00!
|
||||
// [4]=1 Current frame IS HDCP encrypted!??? (HDCP disabled anyway?)
|
||||
// [3:2] must be b01!
|
||||
// [1]=1 HDMI Mode.
|
||||
// [0] must be b0!
|
||||
|
||||
16'hB900, // ADI required Write.
|
||||
|
||||
{8'hBA, 8'b0110_0000}, // [7:5] Input Clock delay...
|
||||
// b000 = -1.2ns.
|
||||
// b001 = -0.8ns.
|
||||
// b010 = -0.4ns.
|
||||
// b011 = No delay.
|
||||
// b100 = 0.4ns.
|
||||
// b101 = 0.8ns.
|
||||
// b110 = 1.2ns.
|
||||
// b111 = 1.6ns.
|
||||
|
||||
16'hBB00, // ADI required Write.
|
||||
|
||||
{8'hD6, 8'b1100_0000}, // [7:6] HPD Control...
|
||||
// 00 = HPD is from both HPD pin or CDC HPD
|
||||
// 01 = HPD is from CDC HPD
|
||||
// 10 = HPD is from HPD pin
|
||||
// 11 = HPD is always high
|
||||
|
||||
16'hDE9C, // ADI required Write.
|
||||
16'hE460, // ADI required Write.
|
||||
16'hFA7D, // Nbr of times to search for good phase
|
||||
|
||||
|
||||
// (Audio stuff on Programming Guide, Page 66)...
|
||||
|
||||
{8'h0A, 8'b0000_0000}, // [6:4] Audio Select. b000 = I2S.
|
||||
// [3:2] Audio Mode. (HBR stuff, leave at 00!).
|
||||
|
||||
{8'h0B, 8'b0000_1110}, //
|
||||
|
||||
{8'h0C, 8'b0000_0100}, // [7] 0 = Use sampling rate from I2S stream. 1 = Use samp rate from I2C Register.
|
||||
// [6] 0 = Use Channel Status bits from stream. 1 = Use Channel Status bits from I2C register.
|
||||
// [2] 1 = I2S0 Enable.
|
||||
// [1:0] I2S Format: 00 = Standard. 01 = Right Justified. 10 = Left Justified. 11 = AES.
|
||||
|
||||
{8'h0D, 8'b0001_0000}, // [4:0] I2S Bit (Word) Width for Right-Justified.
|
||||
{8'h14, 8'b0000_0010}, // [3:0] Audio Word Length. b0010 = 16 bits.
|
||||
{8'h15, ~audio_48k, 7'b010_0000}, // I2S Sampling Rate [7:4]. b0000 = (44.1KHz). b0010 = 48KHz.
|
||||
// Input ID [3:1] b000 (0) = 24-bit RGB 444 or YCrCb 444 with Separate Syncs.
|
||||
|
||||
// {8'h15, 8'b0010_0001}, // I2S Sampling Rate [7:4]. b0000 = (44.1KHz). b0010 = 48KHz.
|
||||
// Input ID [3:0] b0001 (1) = 16, 20, 24 bit YCbCr 4:2:2 with Separate Syncs.
|
||||
|
||||
// {8'h15, 8'b0010_0011}, // I2S Sampling Rate [7:4]. b0000 = (44.1KHz). b0010 = 48KHz.
|
||||
// Input ID [3:0] b0011 (3) = 16, 20, 24 bit YCbCr 4:2:2 (2x Pixel Clock, with Separate Syncs).
|
||||
|
||||
// Audio Clock Config
|
||||
16'h0100, //
|
||||
audio_48k ? 16'h0218 : 16'h0230, // Set N Value 12288/6144
|
||||
16'h0300, //
|
||||
|
||||
16'h0701, //
|
||||
16'h0822, // Set CTS Value 74250
|
||||
16'h090A, //
|
||||
|
||||
16'hFFFF // END
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
||||
endmodule
|
642
sys/hps_io.v
Normal file
642
sys/hps_io.v
Normal file
@ -0,0 +1,642 @@
|
||||
//
|
||||
// hps_io.v
|
||||
//
|
||||
// mist_io-like module for the Terasic DE10 board
|
||||
//
|
||||
// Copyright (c) 2014 Till Harbaum <till@harbaum.org>
|
||||
// Copyright (c) 2017 Sorgelig (port to DE10-nano)
|
||||
//
|
||||
// This source file 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 source file 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 <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////
|
||||
|
||||
//
|
||||
// Use buffer to access SD card. It's time-critical part.
|
||||
//
|
||||
// for synchronous projects default value for PS2DIV is fine for any frequency of system clock.
|
||||
// clk_ps2 = CLK_SYS/(PS2DIV*2)
|
||||
//
|
||||
|
||||
// WIDE=1 for 16 bit file I/O
|
||||
// VDNUM 1-4
|
||||
module hps_io #(parameter STRLEN=0, PS2DIV=2000, WIDE=0, VDNUM=1, PS2WE=0)
|
||||
(
|
||||
input clk_sys,
|
||||
inout [43:0] HPS_BUS,
|
||||
|
||||
// parameter STRLEN and the actual length of conf_str have to match
|
||||
input [(8*STRLEN)-1:0] conf_str,
|
||||
|
||||
output reg [15:0] joystick_0,
|
||||
output reg [15:0] joystick_1,
|
||||
output reg [15:0] joystick_analog_0,
|
||||
output reg [15:0] joystick_analog_1,
|
||||
|
||||
output [1:0] buttons,
|
||||
output forced_scandoubler,
|
||||
|
||||
output reg [31:0] status,
|
||||
|
||||
// SD config
|
||||
output reg [VD:0] img_mounted, // signaling that new image has been mounted
|
||||
output reg img_readonly, // mounted as read only. valid only for active bit in img_mounted
|
||||
output reg [63:0] img_size, // size of image in bytes. valid only for active bit in img_mounted
|
||||
|
||||
// SD block level access
|
||||
input [31:0] sd_lba,
|
||||
input [VD:0] sd_rd, // only single sd_rd can be active at any given time
|
||||
input [VD:0] sd_wr, // only single sd_wr can be active at any given time
|
||||
output reg sd_ack,
|
||||
|
||||
// do not use in new projects.
|
||||
// CID and CSD are fake except CSD image size field.
|
||||
input sd_conf,
|
||||
output reg sd_ack_conf,
|
||||
|
||||
// SD byte level access. Signals for 2-PORT altsyncram.
|
||||
output reg [AW:0] sd_buff_addr,
|
||||
output reg [DW:0] sd_buff_dout,
|
||||
input [DW:0] sd_buff_din,
|
||||
output reg sd_buff_wr,
|
||||
|
||||
// ARM -> FPGA download
|
||||
output reg ioctl_download = 0, // signal indicating an active download
|
||||
output reg [7:0] ioctl_index, // menu index used to upload the file
|
||||
output reg ioctl_wr,
|
||||
output reg [23:0] ioctl_addr, // in WIDE mode address will be incremented by 2
|
||||
output reg [15:0] ioctl_dout,
|
||||
input ioctl_wait,
|
||||
|
||||
// RTC MSM6242B layout
|
||||
output reg [63:0] RTC,
|
||||
|
||||
// ps2 keyboard emulation
|
||||
output ps2_kbd_clk_out,
|
||||
output ps2_kbd_data_out,
|
||||
input ps2_kbd_clk_in,
|
||||
input ps2_kbd_data_in,
|
||||
|
||||
input [2:0] ps2_kbd_led_status,
|
||||
input [2:0] ps2_kbd_led_use,
|
||||
|
||||
output ps2_mouse_clk_out,
|
||||
output ps2_mouse_data_out,
|
||||
input ps2_mouse_clk_in,
|
||||
input ps2_mouse_data_in,
|
||||
|
||||
// ps2 alternative interface.
|
||||
output reg [64:0] ps2_key = 0, // up to 8 bytes per key (pause)
|
||||
output reg [24:0] ps2_mouse = 0
|
||||
);
|
||||
|
||||
localparam DW = (WIDE) ? 15 : 7;
|
||||
localparam AW = (WIDE) ? 7 : 8;
|
||||
localparam VD = VDNUM-1;
|
||||
|
||||
wire io_wait = ioctl_wait;
|
||||
wire io_enable= |HPS_BUS[35:34];
|
||||
wire io_strobe= HPS_BUS[33];
|
||||
wire io_wide = (WIDE) ? 1'b1 : 1'b0;
|
||||
wire [15:0] io_din = HPS_BUS[31:16];
|
||||
reg [15:0] io_dout;
|
||||
|
||||
assign HPS_BUS[37] = io_wait;
|
||||
assign HPS_BUS[36] = clk_sys;
|
||||
assign HPS_BUS[32] = io_wide;
|
||||
assign HPS_BUS[15:0] = io_dout;
|
||||
|
||||
reg [7:0] cfg;
|
||||
assign buttons = cfg[1:0];
|
||||
//cfg[2] - vga_scaler handled in sys_top
|
||||
//cfg[3] - csync handled in sys_top
|
||||
assign forced_scandoubler = cfg[4];
|
||||
//cfg[5] - ypbpr handled in sys_top
|
||||
|
||||
// command byte read by the io controller
|
||||
wire [15:0] sd_cmd =
|
||||
{
|
||||
2'b00,
|
||||
(VDNUM>=4) ? sd_wr[3] : 1'b0,
|
||||
(VDNUM>=3) ? sd_wr[2] : 1'b0,
|
||||
(VDNUM>=2) ? sd_wr[1] : 1'b0,
|
||||
|
||||
(VDNUM>=4) ? sd_rd[3] : 1'b0,
|
||||
(VDNUM>=3) ? sd_rd[2] : 1'b0,
|
||||
(VDNUM>=2) ? sd_rd[1] : 1'b0,
|
||||
|
||||
4'h5, sd_conf, 1'b1,
|
||||
sd_wr[0],
|
||||
sd_rd[0]
|
||||
};
|
||||
|
||||
///////////////// calc video parameters //////////////////
|
||||
|
||||
wire clk_100 = HPS_BUS[43];
|
||||
wire clk_vid = HPS_BUS[42];
|
||||
wire ce_pix = HPS_BUS[41];
|
||||
wire de = HPS_BUS[40];
|
||||
wire hs = HPS_BUS[39];
|
||||
wire vs = HPS_BUS[38];
|
||||
|
||||
reg [31:0] vid_hcnt = 0;
|
||||
reg [31:0] vid_vcnt = 0;
|
||||
reg [7:0] vid_nres = 0;
|
||||
integer hcnt;
|
||||
|
||||
always @(posedge clk_vid) begin
|
||||
integer vcnt;
|
||||
reg old_vs= 0, old_de = 0;
|
||||
reg calch = 0;
|
||||
|
||||
if(ce_pix) begin
|
||||
old_vs <= vs;
|
||||
old_de <= de;
|
||||
|
||||
if(~vs & ~old_de & de) vcnt <= vcnt + 1;
|
||||
if(calch & de) hcnt <= hcnt + 1;
|
||||
if(old_de & ~de) calch <= 0;
|
||||
|
||||
if(old_vs & ~vs) begin
|
||||
if(hcnt && vcnt) begin
|
||||
if(vid_hcnt != hcnt || vid_vcnt != vcnt) vid_nres <= vid_nres + 1'd1;
|
||||
vid_hcnt <= hcnt;
|
||||
vid_vcnt <= vcnt;
|
||||
end
|
||||
vcnt <= 0;
|
||||
hcnt <= 0;
|
||||
calch <= 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
reg [31:0] vid_htime = 0;
|
||||
reg [31:0] vid_vtime = 0;
|
||||
reg [31:0] vid_pix = 0;
|
||||
|
||||
always @(posedge clk_100) begin
|
||||
integer vtime, htime, hcnt;
|
||||
reg old_vs, old_hs, old_vs2, old_hs2, old_de, old_de2;
|
||||
reg calch = 0;
|
||||
|
||||
old_vs <= vs;
|
||||
old_hs <= hs;
|
||||
|
||||
old_vs2 <= old_vs;
|
||||
old_hs2 <= old_hs;
|
||||
|
||||
vtime <= vtime + 1'd1;
|
||||
htime <= htime + 1'd1;
|
||||
|
||||
if(~old_vs2 & old_vs) begin
|
||||
vid_pix <= hcnt;
|
||||
vid_vtime <= vtime;
|
||||
vtime <= 0;
|
||||
hcnt <= 0;
|
||||
end
|
||||
|
||||
if(old_vs2 & ~old_vs) calch <= 1;
|
||||
|
||||
if(~old_hs2 & old_hs) begin
|
||||
vid_htime <= htime;
|
||||
htime <= 0;
|
||||
end
|
||||
|
||||
old_de <= de;
|
||||
old_de2 <= old_de;
|
||||
|
||||
if(calch & old_de) hcnt <= hcnt + 1;
|
||||
if(old_de2 & ~old_de) calch <= 0;
|
||||
end
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
|
||||
always@(posedge clk_sys) begin
|
||||
reg [15:0] cmd;
|
||||
reg [9:0] byte_cnt; // counts bytes
|
||||
reg [2:0] b_wr;
|
||||
reg [2:0] stick_idx;
|
||||
|
||||
sd_buff_wr <= b_wr[0];
|
||||
if(b_wr[2] && (~&sd_buff_addr)) sd_buff_addr <= sd_buff_addr + 1'b1;
|
||||
b_wr <= (b_wr<<1);
|
||||
|
||||
{kbd_rd,kbd_we,mouse_rd,mouse_we} <= 0;
|
||||
|
||||
if(~io_enable) begin
|
||||
if(cmd == 4 && !PS2WE) ps2_mouse[24] <= ~ps2_mouse[24];
|
||||
if(cmd == 5 && !PS2WE) ps2_key[64] <= ~ps2_key[64];
|
||||
cmd <= 0;
|
||||
byte_cnt <= 0;
|
||||
sd_ack <= 0;
|
||||
sd_ack_conf <= 0;
|
||||
io_dout <= 0;
|
||||
end else begin
|
||||
if(io_strobe) begin
|
||||
|
||||
io_dout <= 0;
|
||||
if(~&byte_cnt) byte_cnt <= byte_cnt + 1'd1;
|
||||
|
||||
if(byte_cnt == 0) begin
|
||||
cmd <= io_din;
|
||||
|
||||
case(io_din)
|
||||
'h19: sd_ack_conf <= 1;
|
||||
'h17,
|
||||
'h18: sd_ack <= 1;
|
||||
endcase
|
||||
|
||||
sd_buff_addr <= 0;
|
||||
img_mounted <= 0;
|
||||
if(io_din == 5) ps2_key[63:0] <= 0;
|
||||
end else begin
|
||||
|
||||
case(cmd)
|
||||
// buttons and switches
|
||||
'h01: cfg <= io_din[7:0];
|
||||
'h02: joystick_0 <= io_din;
|
||||
'h03: joystick_1 <= io_din;
|
||||
|
||||
// store incoming ps2 mouse bytes
|
||||
'h04: begin
|
||||
mouse_data <= io_din[7:0];
|
||||
mouse_we <= 1;
|
||||
if(!PS2WE) begin
|
||||
case(byte_cnt)
|
||||
1: ps2_mouse[7:0] <= io_din[7:0];
|
||||
2: ps2_mouse[15:8] <= io_din[7:0];
|
||||
3: ps2_mouse[23:16] <= io_din[7:0];
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
// store incoming ps2 keyboard bytes
|
||||
'h05: begin
|
||||
if(!PS2WE) ps2_key[63:0] <= {ps2_key[55:0], io_din[7:0]};
|
||||
kbd_data <= io_din[7:0];
|
||||
kbd_we <= 1;
|
||||
end
|
||||
|
||||
// reading config string
|
||||
'h14: begin
|
||||
// returning a byte from string
|
||||
if(byte_cnt < STRLEN + 1) io_dout[7:0] <= conf_str[(STRLEN - byte_cnt)<<3 +:8];
|
||||
end
|
||||
|
||||
// reading sd card status
|
||||
'h16: begin
|
||||
case(byte_cnt)
|
||||
1: io_dout <= sd_cmd;
|
||||
2: io_dout <= sd_lba[15:0];
|
||||
3: io_dout <= sd_lba[31:16];
|
||||
endcase
|
||||
end
|
||||
|
||||
// send SD config IO -> FPGA
|
||||
// flag that download begins
|
||||
// sd card knows data is config if sd_dout_strobe is asserted
|
||||
// with sd_ack still being inactive (low)
|
||||
'h19,
|
||||
// send sector IO -> FPGA
|
||||
// flag that download begins
|
||||
'h17: begin
|
||||
sd_buff_dout <= io_din[DW:0];
|
||||
b_wr <= 1;
|
||||
end
|
||||
|
||||
// reading sd card write data
|
||||
'h18: begin
|
||||
if(~&sd_buff_addr) sd_buff_addr <= sd_buff_addr + 1'b1;
|
||||
io_dout <= sd_buff_din;
|
||||
end
|
||||
|
||||
// joystick analog
|
||||
'h1a: begin
|
||||
// first byte is joystick index
|
||||
if(byte_cnt == 1) stick_idx <= io_din[2:0];
|
||||
if(byte_cnt == 2) begin
|
||||
if(stick_idx == 0) joystick_analog_0 <= io_din;
|
||||
if(stick_idx == 1) joystick_analog_1 <= io_din;
|
||||
end
|
||||
end
|
||||
|
||||
// notify image selection
|
||||
'h1c: begin
|
||||
img_mounted <= io_din[VD:0] ? io_din[VD:0] : 1'b1;
|
||||
img_readonly <= io_din[7];
|
||||
end
|
||||
|
||||
// send image info
|
||||
'h1d: if(byte_cnt<5) img_size[{byte_cnt-1'b1, 4'b0000} +:16] <= io_din;
|
||||
|
||||
// status, 32bit version
|
||||
'h1e: if(byte_cnt==1) status[15:0] <= io_din;
|
||||
else if(byte_cnt==2) status[31:16] <= io_din;
|
||||
|
||||
// reading keyboard LED status
|
||||
'h1f: io_dout <= {|PS2WE, 2'b01, ps2_kbd_led_status[2], ps2_kbd_led_use[2], ps2_kbd_led_status[1], ps2_kbd_led_use[1], ps2_kbd_led_status[0], ps2_kbd_led_use[0]};
|
||||
|
||||
// reading ps2 keyboard/mouse control
|
||||
'h21: begin
|
||||
if(byte_cnt == 1) begin
|
||||
io_dout <= kbd_data_host;
|
||||
kbd_rd <= 1;
|
||||
end
|
||||
|
||||
if(byte_cnt == 2) begin
|
||||
io_dout <= mouse_data_host;
|
||||
mouse_rd <= 1;
|
||||
end
|
||||
end
|
||||
//RTC
|
||||
'h22: RTC[(byte_cnt-6'd1)<<4 +:16] <= io_din;
|
||||
|
||||
//Video res.
|
||||
'h23: begin
|
||||
case(byte_cnt)
|
||||
1: io_dout <= vid_nres;
|
||||
2: io_dout <= vid_hcnt[15:0];
|
||||
3: io_dout <= vid_hcnt[31:16];
|
||||
4: io_dout <= vid_vcnt[15:0];
|
||||
5: io_dout <= vid_vcnt[31:16];
|
||||
6: io_dout <= vid_htime[15:0];
|
||||
7: io_dout <= vid_htime[31:16];
|
||||
8: io_dout <= vid_vtime[15:0];
|
||||
9: io_dout <= vid_vtime[31:16];
|
||||
10: io_dout <= vid_pix[15:0];
|
||||
11: io_dout <= vid_pix[31:16];
|
||||
endcase
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
/////////////////////////////// PS2 ///////////////////////////////
|
||||
reg clk_ps2;
|
||||
always @(negedge clk_sys) begin
|
||||
integer cnt;
|
||||
cnt <= cnt + 1'd1;
|
||||
if(cnt == PS2DIV) begin
|
||||
clk_ps2 <= ~clk_ps2;
|
||||
cnt <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
reg [7:0] kbd_data;
|
||||
reg kbd_we;
|
||||
wire [8:0] kbd_data_host;
|
||||
reg kbd_rd;
|
||||
|
||||
ps2_device keyboard
|
||||
(
|
||||
.clk_sys(clk_sys),
|
||||
|
||||
.wdata(kbd_data),
|
||||
.we(kbd_we),
|
||||
|
||||
.ps2_clk(clk_ps2),
|
||||
.ps2_clk_out(ps2_kbd_clk_out),
|
||||
.ps2_dat_out(ps2_kbd_data_out),
|
||||
|
||||
.ps2_clk_in(ps2_kbd_clk_in || !PS2WE),
|
||||
.ps2_dat_in(ps2_kbd_data_in || !PS2WE),
|
||||
|
||||
.rdata(kbd_data_host),
|
||||
.rd(kbd_rd)
|
||||
);
|
||||
|
||||
reg [7:0] mouse_data;
|
||||
reg mouse_we;
|
||||
wire [8:0] mouse_data_host;
|
||||
reg mouse_rd;
|
||||
|
||||
ps2_device mouse
|
||||
(
|
||||
.clk_sys(clk_sys),
|
||||
|
||||
.wdata(mouse_data),
|
||||
.we(mouse_we),
|
||||
|
||||
.ps2_clk(clk_ps2),
|
||||
.ps2_clk_out(ps2_mouse_clk_out),
|
||||
.ps2_dat_out(ps2_mouse_data_out),
|
||||
|
||||
.ps2_clk_in(ps2_mouse_clk_in || !PS2WE),
|
||||
.ps2_dat_in(ps2_mouse_data_in || !PS2WE),
|
||||
|
||||
.rdata(mouse_data_host),
|
||||
.rd(mouse_rd)
|
||||
);
|
||||
|
||||
|
||||
/////////////////////////////// DOWNLOADING ///////////////////////////////
|
||||
|
||||
localparam UIO_FILE_TX = 8'h53;
|
||||
localparam UIO_FILE_TX_DAT = 8'h54;
|
||||
localparam UIO_FILE_INDEX = 8'h55;
|
||||
|
||||
always@(posedge clk_sys) begin
|
||||
reg [15:0] cmd;
|
||||
reg has_cmd;
|
||||
reg [24:0] addr;
|
||||
reg wr;
|
||||
reg [7:0] tmp;
|
||||
|
||||
ioctl_wr <= wr;
|
||||
wr <= 0;
|
||||
|
||||
if(~io_enable) has_cmd <= 0;
|
||||
else begin
|
||||
if(io_strobe) begin
|
||||
|
||||
if(!has_cmd) begin
|
||||
cmd <= io_din;
|
||||
has_cmd <= 1;
|
||||
end else begin
|
||||
|
||||
case(cmd)
|
||||
UIO_FILE_INDEX:
|
||||
begin
|
||||
ioctl_index <= io_din[7:0];
|
||||
end
|
||||
|
||||
UIO_FILE_TX:
|
||||
begin
|
||||
if(io_din[7:0]) begin
|
||||
addr <= 0;
|
||||
ioctl_download <= 1;
|
||||
end else begin
|
||||
ioctl_addr <= addr[24:1];
|
||||
ioctl_download <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
UIO_FILE_TX_DAT:
|
||||
begin
|
||||
if(addr[0]) begin
|
||||
ioctl_addr <= addr[24:1];
|
||||
ioctl_dout <= {tmp, io_din[7:0]};
|
||||
wr <= 1;
|
||||
end
|
||||
tmp <= io_din[7:0];
|
||||
addr <= addr + 1'd1;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
module ps2_device #(parameter PS2_FIFO_BITS=5)
|
||||
(
|
||||
input clk_sys,
|
||||
|
||||
input [7:0] wdata,
|
||||
input we,
|
||||
|
||||
input ps2_clk,
|
||||
output reg ps2_clk_out,
|
||||
output reg ps2_dat_out,
|
||||
|
||||
input ps2_clk_in,
|
||||
input ps2_dat_in,
|
||||
|
||||
output [8:0] rdata,
|
||||
input rd
|
||||
);
|
||||
|
||||
|
||||
(* ramstyle = "logic" *) reg [7:0] fifo[1<<PS2_FIFO_BITS];
|
||||
|
||||
reg [PS2_FIFO_BITS-1:0] wptr;
|
||||
reg [PS2_FIFO_BITS-1:0] rptr;
|
||||
|
||||
reg [2:0] rx_state = 0;
|
||||
reg [3:0] tx_state = 0;
|
||||
|
||||
reg has_data;
|
||||
reg [7:0] data;
|
||||
assign rdata = {has_data, data};
|
||||
|
||||
always@(posedge clk_sys) begin
|
||||
reg [7:0] tx_byte;
|
||||
reg parity;
|
||||
reg r_inc;
|
||||
reg old_clk;
|
||||
reg [1:0] timeout;
|
||||
|
||||
reg [3:0] rx_cnt;
|
||||
|
||||
reg c1,c2,d1;
|
||||
|
||||
if(we) begin
|
||||
fifo[wptr] <= wdata;
|
||||
wptr <= wptr + 1'd1;
|
||||
end
|
||||
|
||||
if(rd) has_data <= 0;
|
||||
|
||||
c1 <= ps2_clk_in;
|
||||
c2 <= c1;
|
||||
d1 <= ps2_dat_in;
|
||||
if(!rx_state && !tx_state && ~c2 && c1 && ~d1) begin
|
||||
rx_state <= rx_state + 1'b1;
|
||||
ps2_dat_out <= 1;
|
||||
end
|
||||
|
||||
old_clk <= ps2_clk;
|
||||
if(~old_clk & ps2_clk) begin
|
||||
|
||||
if(rx_state) begin
|
||||
case(rx_state)
|
||||
1: begin
|
||||
rx_state <= rx_state + 1'b1;
|
||||
rx_cnt <= 0;
|
||||
end
|
||||
|
||||
2: begin
|
||||
if(rx_cnt <= 7) data <= {d1, data[7:1]};
|
||||
else rx_state <= rx_state + 1'b1;
|
||||
rx_cnt <= rx_cnt + 1'b1;
|
||||
end
|
||||
|
||||
3: if(d1) begin
|
||||
rx_state <= rx_state + 1'b1;
|
||||
ps2_dat_out <= 0;
|
||||
end
|
||||
|
||||
4: begin
|
||||
ps2_dat_out <= 1;
|
||||
has_data <= 1;
|
||||
rx_state <= 0;
|
||||
end
|
||||
endcase
|
||||
end else begin
|
||||
|
||||
// transmitter is idle?
|
||||
if(tx_state == 0) begin
|
||||
// data in fifo present?
|
||||
if(c2 && c1 && d1 && wptr != rptr) begin
|
||||
|
||||
timeout <= timeout - 1'd1;
|
||||
if(!timeout) begin
|
||||
tx_byte <= fifo[rptr];
|
||||
rptr <= rptr + 1'd1;
|
||||
|
||||
// reset parity
|
||||
parity <= 1;
|
||||
|
||||
// start transmitter
|
||||
tx_state <= 1;
|
||||
|
||||
// put start bit on data line
|
||||
ps2_dat_out <= 0; // start bit is 0
|
||||
end
|
||||
end
|
||||
end else begin
|
||||
|
||||
// transmission of 8 data bits
|
||||
if((tx_state >= 1)&&(tx_state < 9)) begin
|
||||
ps2_dat_out <= tx_byte[0]; // data bits
|
||||
tx_byte[6:0] <= tx_byte[7:1]; // shift down
|
||||
if(tx_byte[0])
|
||||
parity <= !parity;
|
||||
end
|
||||
|
||||
// transmission of parity
|
||||
if(tx_state == 9) ps2_dat_out <= parity;
|
||||
|
||||
// transmission of stop bit
|
||||
if(tx_state == 10) ps2_dat_out <= 1; // stop bit is 1
|
||||
|
||||
// advance state machine
|
||||
if(tx_state < 11) tx_state <= tx_state + 1'd1;
|
||||
else tx_state <= 0;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(~old_clk & ps2_clk) ps2_clk_out <= 1;
|
||||
if(old_clk & ~ps2_clk) ps2_clk_out <= ((tx_state == 0) && (rx_state<2));
|
||||
|
||||
end
|
||||
|
||||
endmodule
|
416
sys/hq2x.sv
Normal file
416
sys/hq2x.sv
Normal file
@ -0,0 +1,416 @@
|
||||
//
|
||||
//
|
||||
// Copyright (c) 2012-2013 Ludvig Strigeus
|
||||
// Copyright (c) 2017 Sorgelig
|
||||
//
|
||||
// This program is GPL Licensed. See COPYING for the full license.
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// synopsys translate_off
|
||||
`timescale 1 ps / 1 ps
|
||||
// synopsys translate_on
|
||||
|
||||
`define BITS_TO_FIT(N) ( \
|
||||
N <= 2 ? 0 : \
|
||||
N <= 4 ? 1 : \
|
||||
N <= 8 ? 2 : \
|
||||
N <= 16 ? 3 : \
|
||||
N <= 32 ? 4 : \
|
||||
N <= 64 ? 5 : \
|
||||
N <= 128 ? 6 : \
|
||||
N <= 256 ? 7 : \
|
||||
N <= 512 ? 8 : \
|
||||
N <= 1024 ? 9 : \
|
||||
N <= 2048 ?10 : 11 )
|
||||
|
||||
module Hq2x #(parameter LENGTH, parameter HALF_DEPTH)
|
||||
(
|
||||
input clk,
|
||||
input ce_x4,
|
||||
input [DWIDTH:0] inputpixel,
|
||||
input mono,
|
||||
input disable_hq2x,
|
||||
input reset_frame,
|
||||
input reset_line,
|
||||
input [1:0] read_y,
|
||||
input [AWIDTH+1:0] read_x,
|
||||
output [DWIDTH:0] outpixel
|
||||
);
|
||||
|
||||
|
||||
localparam AWIDTH = `BITS_TO_FIT(LENGTH);
|
||||
localparam DWIDTH = HALF_DEPTH ? 11 : 23;
|
||||
|
||||
wire [5:0] hqTable[256] = '{
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 47, 35, 23, 15, 55, 39,
|
||||
19, 19, 26, 58, 19, 19, 26, 58, 23, 15, 35, 35, 23, 15, 7, 35,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 55, 39, 23, 15, 51, 43,
|
||||
19, 19, 26, 58, 19, 19, 26, 58, 23, 15, 51, 35, 23, 15, 7, 43,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 61, 35, 35, 23, 61, 51, 35,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 35,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 61, 7, 35, 23, 61, 7, 43,
|
||||
19, 19, 26, 11, 19, 19, 26, 58, 23, 15, 51, 35, 23, 61, 7, 43,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 47, 35, 23, 15, 55, 39,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 35,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 55, 39, 23, 15, 51, 43,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 39, 23, 15, 7, 43,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 51, 39,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 7, 35,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 51, 35, 23, 15, 7, 43,
|
||||
19, 19, 26, 11, 19, 19, 26, 11, 23, 15, 7, 35, 23, 15, 7, 43
|
||||
};
|
||||
|
||||
reg [23:0] Prev0, Prev1, Prev2, Curr0, Curr1, Next0, Next1, Next2;
|
||||
reg [23:0] A, B, D, F, G, H;
|
||||
reg [7:0] pattern, nextpatt;
|
||||
reg [1:0] i;
|
||||
reg [7:0] y;
|
||||
|
||||
wire curbuf = y[0];
|
||||
reg prevbuf = 0;
|
||||
wire iobuf = !curbuf;
|
||||
|
||||
wire diff0, diff1;
|
||||
DiffCheck diffcheck0(Curr1, (i == 0) ? Prev0 : (i == 1) ? Curr0 : (i == 2) ? Prev2 : Next1, diff0);
|
||||
DiffCheck diffcheck1(Curr1, (i == 0) ? Prev1 : (i == 1) ? Next0 : (i == 2) ? Curr2 : Next2, diff1);
|
||||
|
||||
wire [7:0] new_pattern = {diff1, diff0, pattern[7:2]};
|
||||
|
||||
wire [23:0] X = (i == 0) ? A : (i == 1) ? Prev1 : (i == 2) ? Next1 : G;
|
||||
wire [23:0] blend_result;
|
||||
Blend blender(hqTable[nextpatt], disable_hq2x, Curr0, X, B, D, F, H, blend_result);
|
||||
|
||||
reg Curr2_addr1;
|
||||
reg [AWIDTH:0] Curr2_addr2;
|
||||
wire [23:0] Curr2 = HALF_DEPTH ? h2rgb(Curr2tmp) : Curr2tmp;
|
||||
wire [DWIDTH:0] Curr2tmp;
|
||||
|
||||
reg [AWIDTH:0] wrin_addr2;
|
||||
reg [DWIDTH:0] wrpix;
|
||||
reg wrin_en;
|
||||
|
||||
function [23:0] h2rgb;
|
||||
input [11:0] v;
|
||||
begin
|
||||
h2rgb = mono ? {v[7:0], v[7:0], v[7:0]} : {v[11:8],v[11:8],v[7:4],v[7:4],v[3:0],v[3:0]};
|
||||
end
|
||||
endfunction
|
||||
|
||||
function [11:0] rgb2h;
|
||||
input [23:0] v;
|
||||
begin
|
||||
rgb2h = mono ? {4'b0000, v[23:20], v[19:16]} : {v[23:20], v[15:12], v[7:4]};
|
||||
end
|
||||
endfunction
|
||||
|
||||
hq2x_in #(.LENGTH(LENGTH), .DWIDTH(DWIDTH)) hq2x_in
|
||||
(
|
||||
.clk(clk),
|
||||
|
||||
.rdaddr(Curr2_addr2),
|
||||
.rdbuf(Curr2_addr1),
|
||||
.q(Curr2tmp),
|
||||
|
||||
.wraddr(wrin_addr2),
|
||||
.wrbuf(iobuf),
|
||||
.data(wrpix),
|
||||
.wren(wrin_en)
|
||||
);
|
||||
|
||||
reg [1:0] wrout_addr1;
|
||||
reg [AWIDTH+1:0] wrout_addr2;
|
||||
reg wrout_en;
|
||||
reg [DWIDTH:0] wrdata;
|
||||
|
||||
hq2x_out #(.LENGTH(LENGTH), .DWIDTH(DWIDTH)) hq2x_out
|
||||
(
|
||||
.clk(clk),
|
||||
|
||||
.rdaddr(read_x),
|
||||
.rdbuf(read_y),
|
||||
.q(outpixel),
|
||||
|
||||
.wraddr(wrout_addr2),
|
||||
.wrbuf(wrout_addr1),
|
||||
.data(wrdata),
|
||||
.wren(wrout_en)
|
||||
);
|
||||
|
||||
always @(posedge clk) begin
|
||||
reg [AWIDTH:0] offs;
|
||||
reg old_reset_line;
|
||||
reg old_reset_frame;
|
||||
|
||||
wrout_en <= 0;
|
||||
wrin_en <= 0;
|
||||
|
||||
if(ce_x4) begin
|
||||
|
||||
pattern <= new_pattern;
|
||||
|
||||
if(~&offs) begin
|
||||
if (i == 0) begin
|
||||
Curr2_addr1 <= prevbuf;
|
||||
Curr2_addr2 <= offs;
|
||||
end
|
||||
if (i == 1) begin
|
||||
Prev2 <= Curr2;
|
||||
Curr2_addr1 <= curbuf;
|
||||
Curr2_addr2 <= offs;
|
||||
end
|
||||
if (i == 2) begin
|
||||
Next2 <= HALF_DEPTH ? h2rgb(inputpixel) : inputpixel;
|
||||
wrpix <= inputpixel;
|
||||
wrin_addr2 <= offs;
|
||||
wrin_en <= 1;
|
||||
end
|
||||
if (i == 3) begin
|
||||
offs <= offs + 1'd1;
|
||||
end
|
||||
|
||||
if(HALF_DEPTH) wrdata <= rgb2h(blend_result);
|
||||
else wrdata <= blend_result;
|
||||
|
||||
wrout_addr1 <= {curbuf, i[1]};
|
||||
wrout_addr2 <= {offs, i[1]^i[0]};
|
||||
wrout_en <= 1;
|
||||
end
|
||||
|
||||
if(i==3) begin
|
||||
nextpatt <= {new_pattern[7:6], new_pattern[3], new_pattern[5], new_pattern[2], new_pattern[4], new_pattern[1:0]};
|
||||
{A, G} <= {Prev0, Next0};
|
||||
{B, F, H, D} <= {Prev1, Curr2, Next1, Curr0};
|
||||
{Prev0, Prev1} <= {Prev1, Prev2};
|
||||
{Curr0, Curr1} <= {Curr1, Curr2};
|
||||
{Next0, Next1} <= {Next1, Next2};
|
||||
end else begin
|
||||
nextpatt <= {nextpatt[5], nextpatt[3], nextpatt[0], nextpatt[6], nextpatt[1], nextpatt[7], nextpatt[4], nextpatt[2]};
|
||||
{B, F, H, D} <= {F, H, D, B};
|
||||
end
|
||||
|
||||
i <= i + 1'b1;
|
||||
if(old_reset_line && ~reset_line) begin
|
||||
old_reset_frame <= reset_frame;
|
||||
offs <= 0;
|
||||
i <= 0;
|
||||
y <= y + 1'd1;
|
||||
prevbuf <= curbuf;
|
||||
if(old_reset_frame & ~reset_frame) begin
|
||||
y <= 0;
|
||||
prevbuf <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
old_reset_line <= reset_line;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
module hq2x_in #(parameter LENGTH, parameter DWIDTH)
|
||||
(
|
||||
input clk,
|
||||
|
||||
input [AWIDTH:0] rdaddr,
|
||||
input rdbuf,
|
||||
output[DWIDTH:0] q,
|
||||
|
||||
input [AWIDTH:0] wraddr,
|
||||
input wrbuf,
|
||||
input [DWIDTH:0] data,
|
||||
input wren
|
||||
);
|
||||
|
||||
localparam AWIDTH = `BITS_TO_FIT(LENGTH);
|
||||
wire [DWIDTH:0] out[2];
|
||||
assign q = out[rdbuf];
|
||||
|
||||
hq2x_buf #(.NUMWORDS(LENGTH), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf0(clk,data,rdaddr,wraddr,wren && (wrbuf == 0),out[0]);
|
||||
hq2x_buf #(.NUMWORDS(LENGTH), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf1(clk,data,rdaddr,wraddr,wren && (wrbuf == 1),out[1]);
|
||||
endmodule
|
||||
|
||||
|
||||
module hq2x_out #(parameter LENGTH, parameter DWIDTH)
|
||||
(
|
||||
input clk,
|
||||
|
||||
input [AWIDTH:0] rdaddr,
|
||||
input [1:0] rdbuf,
|
||||
output[DWIDTH:0] q,
|
||||
|
||||
input [AWIDTH:0] wraddr,
|
||||
input [1:0] wrbuf,
|
||||
input [DWIDTH:0] data,
|
||||
input wren
|
||||
);
|
||||
|
||||
localparam AWIDTH = `BITS_TO_FIT(LENGTH*2);
|
||||
wire [DWIDTH:0] out[4];
|
||||
assign q = out[rdbuf];
|
||||
|
||||
hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf0(clk,data,rdaddr,wraddr,wren && (wrbuf == 0),out[0]);
|
||||
hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf1(clk,data,rdaddr,wraddr,wren && (wrbuf == 1),out[1]);
|
||||
hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf2(clk,data,rdaddr,wraddr,wren && (wrbuf == 2),out[2]);
|
||||
hq2x_buf #(.NUMWORDS(LENGTH*2), .AWIDTH(AWIDTH), .DWIDTH(DWIDTH)) buf3(clk,data,rdaddr,wraddr,wren && (wrbuf == 3),out[3]);
|
||||
endmodule
|
||||
|
||||
|
||||
module hq2x_buf #(parameter NUMWORDS, parameter AWIDTH, parameter DWIDTH)
|
||||
(
|
||||
input clock,
|
||||
input [DWIDTH:0] data,
|
||||
input [AWIDTH:0] rdaddress,
|
||||
input [AWIDTH:0] wraddress,
|
||||
input wren,
|
||||
output logic [DWIDTH:0] q
|
||||
);
|
||||
|
||||
logic [DWIDTH:0] ram[0:NUMWORDS-1];
|
||||
|
||||
always_ff@(posedge clock) begin
|
||||
if(wren) ram[wraddress] <= data;
|
||||
q <= ram[rdaddress];
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
module DiffCheck
|
||||
(
|
||||
input [23:0] rgb1,
|
||||
input [23:0] rgb2,
|
||||
output result
|
||||
);
|
||||
|
||||
wire [7:0] r = rgb1[7:1] - rgb2[7:1];
|
||||
wire [7:0] g = rgb1[15:9] - rgb2[15:9];
|
||||
wire [7:0] b = rgb1[23:17] - rgb2[23:17];
|
||||
wire [8:0] t = $signed(r) + $signed(b);
|
||||
wire [8:0] gx = {g[7], g};
|
||||
wire [9:0] y = $signed(t) + $signed(gx);
|
||||
wire [8:0] u = $signed(r) - $signed(b);
|
||||
wire [9:0] v = $signed({g, 1'b0}) - $signed(t);
|
||||
|
||||
// if y is inside (-96..96)
|
||||
wire y_inside = (y < 10'h60 || y >= 10'h3a0);
|
||||
|
||||
// if u is inside (-16, 16)
|
||||
wire u_inside = (u < 9'h10 || u >= 9'h1f0);
|
||||
|
||||
// if v is inside (-24, 24)
|
||||
wire v_inside = (v < 10'h18 || v >= 10'h3e8);
|
||||
assign result = !(y_inside && u_inside && v_inside);
|
||||
endmodule
|
||||
|
||||
module InnerBlend
|
||||
(
|
||||
input [8:0] Op,
|
||||
input [7:0] A,
|
||||
input [7:0] B,
|
||||
input [7:0] C,
|
||||
output [7:0] O
|
||||
);
|
||||
|
||||
function [10:0] mul8x3;
|
||||
input [7:0] op1;
|
||||
input [2:0] op2;
|
||||
begin
|
||||
mul8x3 = 11'd0;
|
||||
if(op2[0]) mul8x3 = mul8x3 + op1;
|
||||
if(op2[1]) mul8x3 = mul8x3 + {op1, 1'b0};
|
||||
if(op2[2]) mul8x3 = mul8x3 + {op1, 2'b00};
|
||||
end
|
||||
endfunction
|
||||
|
||||
wire OpOnes = Op[4];
|
||||
wire [10:0] Amul = mul8x3(A, Op[7:5]);
|
||||
wire [10:0] Bmul = mul8x3(B, {Op[3:2], 1'b0});
|
||||
wire [10:0] Cmul = mul8x3(C, {Op[1:0], 1'b0});
|
||||
wire [10:0] At = Amul;
|
||||
wire [10:0] Bt = (OpOnes == 0) ? Bmul : {3'b0, B};
|
||||
wire [10:0] Ct = (OpOnes == 0) ? Cmul : {3'b0, C};
|
||||
wire [11:0] Res = {At, 1'b0} + Bt + Ct;
|
||||
assign O = Op[8] ? A : Res[11:4];
|
||||
endmodule
|
||||
|
||||
module Blend
|
||||
(
|
||||
input [5:0] rule,
|
||||
input disable_hq2x,
|
||||
input [23:0] E,
|
||||
input [23:0] A,
|
||||
input [23:0] B,
|
||||
input [23:0] D,
|
||||
input [23:0] F,
|
||||
input [23:0] H,
|
||||
output [23:0] Result
|
||||
);
|
||||
|
||||
reg [1:0] input_ctrl;
|
||||
reg [8:0] op;
|
||||
localparam BLEND0 = 9'b1_xxx_x_xx_xx; // 0: A
|
||||
localparam BLEND1 = 9'b0_110_0_10_00; // 1: (A * 12 + B * 4) >> 4
|
||||
localparam BLEND2 = 9'b0_100_0_10_10; // 2: (A * 8 + B * 4 + C * 4) >> 4
|
||||
localparam BLEND3 = 9'b0_101_0_10_01; // 3: (A * 10 + B * 4 + C * 2) >> 4
|
||||
localparam BLEND4 = 9'b0_110_0_01_01; // 4: (A * 12 + B * 2 + C * 2) >> 4
|
||||
localparam BLEND5 = 9'b0_010_0_11_11; // 5: (A * 4 + (B + C) * 6) >> 4
|
||||
localparam BLEND6 = 9'b0_111_1_xx_xx; // 6: (A * 14 + B + C) >> 4
|
||||
localparam AB = 2'b00;
|
||||
localparam AD = 2'b01;
|
||||
localparam DB = 2'b10;
|
||||
localparam BD = 2'b11;
|
||||
wire is_diff;
|
||||
DiffCheck diff_checker(rule[1] ? B : H, rule[0] ? D : F, is_diff);
|
||||
|
||||
always @* begin
|
||||
case({!is_diff, rule[5:2]})
|
||||
1,17: {op, input_ctrl} = {BLEND1, AB};
|
||||
2,18: {op, input_ctrl} = {BLEND1, DB};
|
||||
3,19: {op, input_ctrl} = {BLEND1, BD};
|
||||
4,20: {op, input_ctrl} = {BLEND2, DB};
|
||||
5,21: {op, input_ctrl} = {BLEND2, AB};
|
||||
6,22: {op, input_ctrl} = {BLEND2, AD};
|
||||
|
||||
8: {op, input_ctrl} = {BLEND0, 2'bxx};
|
||||
9: {op, input_ctrl} = {BLEND0, 2'bxx};
|
||||
10: {op, input_ctrl} = {BLEND0, 2'bxx};
|
||||
11: {op, input_ctrl} = {BLEND1, AB};
|
||||
12: {op, input_ctrl} = {BLEND1, AB};
|
||||
13: {op, input_ctrl} = {BLEND1, AB};
|
||||
14: {op, input_ctrl} = {BLEND1, DB};
|
||||
15: {op, input_ctrl} = {BLEND1, BD};
|
||||
|
||||
24: {op, input_ctrl} = {BLEND2, DB};
|
||||
25: {op, input_ctrl} = {BLEND5, DB};
|
||||
26: {op, input_ctrl} = {BLEND6, DB};
|
||||
27: {op, input_ctrl} = {BLEND2, DB};
|
||||
28: {op, input_ctrl} = {BLEND4, DB};
|
||||
29: {op, input_ctrl} = {BLEND5, DB};
|
||||
30: {op, input_ctrl} = {BLEND3, BD};
|
||||
31: {op, input_ctrl} = {BLEND3, DB};
|
||||
default: {op, input_ctrl} = {11{1'bx}};
|
||||
endcase
|
||||
|
||||
// Setting op[8] effectively disables HQ2X because blend will always return E.
|
||||
if (disable_hq2x) op[8] = 1;
|
||||
end
|
||||
|
||||
// Generate inputs to the inner blender. Valid combinations.
|
||||
// 00: E A B
|
||||
// 01: E A D
|
||||
// 10: E D B
|
||||
// 11: E B D
|
||||
wire [23:0] Input1 = E;
|
||||
wire [23:0] Input2 = !input_ctrl[1] ? A :
|
||||
!input_ctrl[0] ? D : B;
|
||||
|
||||
wire [23:0] Input3 = !input_ctrl[0] ? B : D;
|
||||
InnerBlend inner_blend1(op, Input1[7:0], Input2[7:0], Input3[7:0], Result[7:0]);
|
||||
InnerBlend inner_blend2(op, Input1[15:8], Input2[15:8], Input3[15:8], Result[15:8]);
|
||||
InnerBlend inner_blend3(op, Input1[23:16], Input2[23:16], Input3[23:16], Result[23:16]);
|
||||
endmodule
|
69
sys/i2c.v
Normal file
69
sys/i2c.v
Normal file
@ -0,0 +1,69 @@
|
||||
|
||||
module I2C_Controller
|
||||
(
|
||||
input CLK,
|
||||
|
||||
input START,
|
||||
input [23:0] I2C_DATA,
|
||||
output reg END = 1,
|
||||
output reg ACK = 0,
|
||||
|
||||
//I2C bus
|
||||
output I2C_SCL,
|
||||
inout I2C_SDA
|
||||
);
|
||||
|
||||
|
||||
// Clock Setting
|
||||
parameter CLK_Freq = 50_000_000; // 50 MHz
|
||||
parameter I2C_Freq = 400_000; // 400 KHz
|
||||
|
||||
reg I2C_CLOCK;
|
||||
always@(negedge CLK) begin
|
||||
integer mI2C_CLK_DIV = 0;
|
||||
if(mI2C_CLK_DIV < (CLK_Freq/I2C_Freq)) begin
|
||||
mI2C_CLK_DIV <= mI2C_CLK_DIV + 1;
|
||||
end else begin
|
||||
mI2C_CLK_DIV <= 0;
|
||||
I2C_CLOCK <= ~I2C_CLOCK;
|
||||
end
|
||||
end
|
||||
|
||||
assign I2C_SCL = SCLK | I2C_CLOCK;
|
||||
assign I2C_SDA = SDO ? 1'bz : 1'b0;
|
||||
|
||||
reg SCLK = 1, SDO = 1;
|
||||
|
||||
always @(posedge CLK) begin
|
||||
reg old_clk;
|
||||
reg old_st;
|
||||
|
||||
reg [5:0] SD_COUNTER = 'b111111;
|
||||
reg [0:31] SD;
|
||||
|
||||
old_clk <= I2C_CLOCK;
|
||||
old_st <= START;
|
||||
|
||||
if(~old_st && START) begin
|
||||
SCLK <= 1;
|
||||
SDO <= 1;
|
||||
ACK <= 0;
|
||||
END <= 0;
|
||||
SD <= {2'b10, I2C_DATA[23:16], 1'b1, I2C_DATA[15:8], 1'b1, I2C_DATA[7:0], 4'b1011};
|
||||
SD_COUNTER <= 0;
|
||||
end else begin
|
||||
if(~old_clk && I2C_CLOCK && ~&SD_COUNTER) begin
|
||||
SD_COUNTER <= SD_COUNTER + 6'd1;
|
||||
case(SD_COUNTER)
|
||||
01: SCLK <= 0;
|
||||
10,19,28: ACK <= ACK | I2C_SDA;
|
||||
29: SCLK <= 1;
|
||||
32: END <= 1;
|
||||
endcase
|
||||
end
|
||||
|
||||
if(old_clk && ~I2C_CLOCK && ~SD_COUNTER[5]) SDO <= SD[SD_COUNTER[4:0]];
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
85
sys/i2s.v
Normal file
85
sys/i2s.v
Normal file
@ -0,0 +1,85 @@
|
||||
|
||||
module i2s
|
||||
#(
|
||||
parameter CLK_RATE = 50000000,
|
||||
parameter AUDIO_DW = 16,
|
||||
parameter AUDIO_RATE = 96000
|
||||
)
|
||||
(
|
||||
input reset,
|
||||
input clk_sys,
|
||||
input half_rate,
|
||||
|
||||
output reg sclk,
|
||||
output reg lrclk,
|
||||
output reg sdata,
|
||||
|
||||
input [AUDIO_DW-1:0] left_chan,
|
||||
input [AUDIO_DW-1:0] right_chan
|
||||
);
|
||||
|
||||
localparam WHOLE_CYCLES = (CLK_RATE) / (AUDIO_RATE*AUDIO_DW*4);
|
||||
localparam ERROR_BASE = 10000;
|
||||
localparam [63:0] ERRORS_PER_BIT = ((CLK_RATE * ERROR_BASE) / (AUDIO_RATE*AUDIO_DW*4)) - (WHOLE_CYCLES * ERROR_BASE);
|
||||
|
||||
always @(posedge clk_sys) begin
|
||||
reg [31:0] count_q;
|
||||
reg [31:0] error_q;
|
||||
reg [7:0] bit_cnt;
|
||||
|
||||
reg [AUDIO_DW-1:0] left;
|
||||
reg [AUDIO_DW-1:0] right;
|
||||
|
||||
reg msclk;
|
||||
reg ce;
|
||||
|
||||
if (reset) begin
|
||||
count_q <= 0;
|
||||
error_q <= 0;
|
||||
ce <= 0;
|
||||
bit_cnt <= 1;
|
||||
lrclk <= 1;
|
||||
sclk <= 1;
|
||||
msclk <= 1;
|
||||
end
|
||||
else
|
||||
begin
|
||||
if(count_q == WHOLE_CYCLES-1) begin
|
||||
if (error_q < (ERROR_BASE - ERRORS_PER_BIT)) begin
|
||||
error_q <= error_q + ERRORS_PER_BIT[31:0];
|
||||
count_q <= 0;
|
||||
end else begin
|
||||
error_q <= error_q + ERRORS_PER_BIT[31:0] - ERROR_BASE;
|
||||
count_q <= count_q + 1;
|
||||
end
|
||||
end else if(count_q == WHOLE_CYCLES) begin
|
||||
count_q <= 0;
|
||||
end else begin
|
||||
count_q <= count_q + 1;
|
||||
end
|
||||
|
||||
sclk <= msclk;
|
||||
if(!count_q) begin
|
||||
ce <= ~ce;
|
||||
if(~half_rate || ce) begin
|
||||
msclk <= ~msclk;
|
||||
if(msclk) begin
|
||||
if(bit_cnt >= AUDIO_DW) begin
|
||||
bit_cnt <= 1;
|
||||
lrclk <= ~lrclk;
|
||||
if(lrclk) begin
|
||||
left <= left_chan;
|
||||
right <= right_chan;
|
||||
end
|
||||
end
|
||||
else begin
|
||||
bit_cnt <= bit_cnt + 1'd1;
|
||||
end
|
||||
sdata <= lrclk ? right[AUDIO_DW - bit_cnt] : left[AUDIO_DW - bit_cnt];
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
60
sys/ip/avalon_combiner.v
Normal file
60
sys/ip/avalon_combiner.v
Normal file
@ -0,0 +1,60 @@
|
||||
// avalon_combiner.v
|
||||
|
||||
`timescale 1 ps / 1 ps
|
||||
module avalon_combiner
|
||||
(
|
||||
input wire clk, // clock.clk
|
||||
input wire rst, // reset.reset
|
||||
|
||||
output wire [6:0] mixer_address, // ctl_mixer.address
|
||||
output wire [3:0] mixer_byteenable, // .byteenable
|
||||
output wire mixer_write, // .write
|
||||
output wire [31:0] mixer_writedata, // .writedata
|
||||
input wire mixer_waitrequest, // .waitrequest
|
||||
|
||||
output wire [6:0] scaler_address, // ctl_scaler.address
|
||||
output wire [3:0] scaler_byteenable, // .byteenable
|
||||
input wire scaler_waitrequest, // .waitrequest
|
||||
output wire scaler_write, // .write
|
||||
output wire [31:0] scaler_writedata, // .writedata
|
||||
|
||||
output wire [7:0] video_address, // ctl_video.address
|
||||
output wire [3:0] video_byteenable, // .byteenable
|
||||
input wire video_waitrequest, // .waitrequest
|
||||
output wire video_write, // .write
|
||||
output wire [31:0] video_writedata, // .writedata
|
||||
|
||||
output wire clock, // control.clock
|
||||
output wire reset, // .reset
|
||||
input wire [8:0] address, // .address
|
||||
input wire write, // .write
|
||||
input wire [31:0] writedata, // .writedata
|
||||
output wire waitrequest // .waitrequest
|
||||
);
|
||||
|
||||
assign clock = clk;
|
||||
assign reset = rst;
|
||||
|
||||
assign mixer_address = address[6:0];
|
||||
assign scaler_address = address[6:0];
|
||||
assign video_address = address[7:0];
|
||||
|
||||
assign mixer_byteenable = 4'b1111;
|
||||
assign scaler_byteenable = 4'b1111;
|
||||
assign video_byteenable = 4'b1111;
|
||||
|
||||
wire en_scaler = (address[8:7] == 0);
|
||||
wire en_mixer = (address[8:7] == 1);
|
||||
wire en_video = address[8];
|
||||
|
||||
assign mixer_write = en_mixer & write;
|
||||
assign scaler_write = en_scaler & write;
|
||||
assign video_write = en_video & write;
|
||||
|
||||
assign mixer_writedata = writedata;
|
||||
assign scaler_writedata = writedata;
|
||||
assign video_writedata = writedata;
|
||||
|
||||
assign waitrequest = (en_mixer & mixer_waitrequest) | (en_scaler & scaler_waitrequest) | (en_video & video_waitrequest);
|
||||
|
||||
endmodule
|
204
sys/ip/avalon_combiner_hw.tcl
Normal file
204
sys/ip/avalon_combiner_hw.tcl
Normal file
@ -0,0 +1,204 @@
|
||||
# TCL File Generated by Component Editor 16.1
|
||||
# Sat Mar 25 22:55:53 CST 2017
|
||||
# DO NOT MODIFY
|
||||
|
||||
|
||||
#
|
||||
# avalon_combiner "avalon_combiner" v1.0
|
||||
# 2017.03.25.22:55:53
|
||||
#
|
||||
#
|
||||
|
||||
#
|
||||
# request TCL package from ACDS 16.1
|
||||
#
|
||||
package require -exact qsys 16.1
|
||||
|
||||
|
||||
#
|
||||
# module avalon_combiner
|
||||
#
|
||||
set_module_property DESCRIPTION ""
|
||||
set_module_property NAME avalon_combiner
|
||||
set_module_property VERSION 1.0
|
||||
set_module_property INTERNAL false
|
||||
set_module_property OPAQUE_ADDRESS_MAP true
|
||||
set_module_property AUTHOR sorgelig
|
||||
set_module_property DISPLAY_NAME avalon_combiner
|
||||
set_module_property INSTANTIATE_IN_SYSTEM_MODULE true
|
||||
set_module_property EDITABLE true
|
||||
set_module_property REPORT_TO_TALKBACK false
|
||||
set_module_property ALLOW_GREYBOX_GENERATION false
|
||||
set_module_property REPORT_HIERARCHY false
|
||||
|
||||
|
||||
#
|
||||
# file sets
|
||||
#
|
||||
add_fileset QUARTUS_SYNTH QUARTUS_SYNTH "" ""
|
||||
set_fileset_property QUARTUS_SYNTH TOP_LEVEL avalon_combiner
|
||||
set_fileset_property QUARTUS_SYNTH ENABLE_RELATIVE_INCLUDE_PATHS false
|
||||
set_fileset_property QUARTUS_SYNTH ENABLE_FILE_OVERWRITE_MODE true
|
||||
add_fileset_file avalon_combiner.v VERILOG PATH avalon_combiner.v TOP_LEVEL_FILE
|
||||
|
||||
|
||||
#
|
||||
# parameters
|
||||
#
|
||||
|
||||
|
||||
#
|
||||
# display items
|
||||
#
|
||||
|
||||
|
||||
#
|
||||
# connection point clock
|
||||
#
|
||||
add_interface clock clock end
|
||||
set_interface_property clock clockRate 0
|
||||
set_interface_property clock ENABLED true
|
||||
set_interface_property clock EXPORT_OF ""
|
||||
set_interface_property clock PORT_NAME_MAP ""
|
||||
set_interface_property clock CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property clock SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port clock clk clk Input 1
|
||||
|
||||
|
||||
#
|
||||
# connection point reset
|
||||
#
|
||||
add_interface reset reset end
|
||||
set_interface_property reset associatedClock clock
|
||||
set_interface_property reset synchronousEdges DEASSERT
|
||||
set_interface_property reset ENABLED true
|
||||
set_interface_property reset EXPORT_OF ""
|
||||
set_interface_property reset PORT_NAME_MAP ""
|
||||
set_interface_property reset CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property reset SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port reset rst reset Input 1
|
||||
|
||||
|
||||
#
|
||||
# connection point ctl_mixer
|
||||
#
|
||||
add_interface ctl_mixer avalon start
|
||||
set_interface_property ctl_mixer addressUnits WORDS
|
||||
set_interface_property ctl_mixer associatedClock clock
|
||||
set_interface_property ctl_mixer associatedReset reset
|
||||
set_interface_property ctl_mixer bitsPerSymbol 8
|
||||
set_interface_property ctl_mixer burstOnBurstBoundariesOnly false
|
||||
set_interface_property ctl_mixer burstcountUnits WORDS
|
||||
set_interface_property ctl_mixer doStreamReads false
|
||||
set_interface_property ctl_mixer doStreamWrites false
|
||||
set_interface_property ctl_mixer holdTime 0
|
||||
set_interface_property ctl_mixer linewrapBursts false
|
||||
set_interface_property ctl_mixer maximumPendingReadTransactions 0
|
||||
set_interface_property ctl_mixer maximumPendingWriteTransactions 0
|
||||
set_interface_property ctl_mixer readLatency 0
|
||||
set_interface_property ctl_mixer readWaitTime 1
|
||||
set_interface_property ctl_mixer setupTime 0
|
||||
set_interface_property ctl_mixer timingUnits Cycles
|
||||
set_interface_property ctl_mixer writeWaitTime 0
|
||||
set_interface_property ctl_mixer ENABLED true
|
||||
set_interface_property ctl_mixer EXPORT_OF ""
|
||||
set_interface_property ctl_mixer PORT_NAME_MAP ""
|
||||
set_interface_property ctl_mixer CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property ctl_mixer SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port ctl_mixer mixer_address address Output 7
|
||||
add_interface_port ctl_mixer mixer_byteenable byteenable Output 4
|
||||
add_interface_port ctl_mixer mixer_write write Output 1
|
||||
add_interface_port ctl_mixer mixer_writedata writedata Output 32
|
||||
add_interface_port ctl_mixer mixer_waitrequest waitrequest Input 1
|
||||
|
||||
|
||||
#
|
||||
# connection point ctl_scaler
|
||||
#
|
||||
add_interface ctl_scaler avalon start
|
||||
set_interface_property ctl_scaler addressUnits WORDS
|
||||
set_interface_property ctl_scaler associatedClock clock
|
||||
set_interface_property ctl_scaler associatedReset reset
|
||||
set_interface_property ctl_scaler bitsPerSymbol 8
|
||||
set_interface_property ctl_scaler burstOnBurstBoundariesOnly false
|
||||
set_interface_property ctl_scaler burstcountUnits WORDS
|
||||
set_interface_property ctl_scaler doStreamReads false
|
||||
set_interface_property ctl_scaler doStreamWrites false
|
||||
set_interface_property ctl_scaler holdTime 0
|
||||
set_interface_property ctl_scaler linewrapBursts false
|
||||
set_interface_property ctl_scaler maximumPendingReadTransactions 0
|
||||
set_interface_property ctl_scaler maximumPendingWriteTransactions 0
|
||||
set_interface_property ctl_scaler readLatency 0
|
||||
set_interface_property ctl_scaler readWaitTime 1
|
||||
set_interface_property ctl_scaler setupTime 0
|
||||
set_interface_property ctl_scaler timingUnits Cycles
|
||||
set_interface_property ctl_scaler writeWaitTime 0
|
||||
set_interface_property ctl_scaler ENABLED true
|
||||
set_interface_property ctl_scaler EXPORT_OF ""
|
||||
set_interface_property ctl_scaler PORT_NAME_MAP ""
|
||||
set_interface_property ctl_scaler CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property ctl_scaler SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port ctl_scaler scaler_address address Output 7
|
||||
add_interface_port ctl_scaler scaler_byteenable byteenable Output 4
|
||||
add_interface_port ctl_scaler scaler_waitrequest waitrequest Input 1
|
||||
add_interface_port ctl_scaler scaler_write write Output 1
|
||||
add_interface_port ctl_scaler scaler_writedata writedata Output 32
|
||||
|
||||
|
||||
#
|
||||
# connection point ctl_video
|
||||
#
|
||||
add_interface ctl_video avalon start
|
||||
set_interface_property ctl_video addressUnits WORDS
|
||||
set_interface_property ctl_video associatedClock clock
|
||||
set_interface_property ctl_video associatedReset reset
|
||||
set_interface_property ctl_video bitsPerSymbol 8
|
||||
set_interface_property ctl_video burstOnBurstBoundariesOnly false
|
||||
set_interface_property ctl_video burstcountUnits WORDS
|
||||
set_interface_property ctl_video doStreamReads false
|
||||
set_interface_property ctl_video doStreamWrites false
|
||||
set_interface_property ctl_video holdTime 0
|
||||
set_interface_property ctl_video linewrapBursts false
|
||||
set_interface_property ctl_video maximumPendingReadTransactions 0
|
||||
set_interface_property ctl_video maximumPendingWriteTransactions 0
|
||||
set_interface_property ctl_video readLatency 0
|
||||
set_interface_property ctl_video readWaitTime 1
|
||||
set_interface_property ctl_video setupTime 0
|
||||
set_interface_property ctl_video timingUnits Cycles
|
||||
set_interface_property ctl_video writeWaitTime 0
|
||||
set_interface_property ctl_video ENABLED true
|
||||
set_interface_property ctl_video EXPORT_OF ""
|
||||
set_interface_property ctl_video PORT_NAME_MAP ""
|
||||
set_interface_property ctl_video CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property ctl_video SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port ctl_video video_address address Output 8
|
||||
add_interface_port ctl_video video_byteenable byteenable Output 4
|
||||
add_interface_port ctl_video video_waitrequest waitrequest Input 1
|
||||
add_interface_port ctl_video video_write write Output 1
|
||||
add_interface_port ctl_video video_writedata writedata Output 32
|
||||
|
||||
|
||||
#
|
||||
# connection point control
|
||||
#
|
||||
add_interface control conduit end
|
||||
set_interface_property control associatedClock clock
|
||||
set_interface_property control associatedReset reset
|
||||
set_interface_property control ENABLED true
|
||||
set_interface_property control EXPORT_OF ""
|
||||
set_interface_property control PORT_NAME_MAP ""
|
||||
set_interface_property control CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property control SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port control address address Input 9
|
||||
add_interface_port control write write Input 1
|
||||
add_interface_port control writedata writedata Input 32
|
||||
add_interface_port control waitrequest waitrequest Output 1
|
||||
add_interface_port control clock clock Output 1
|
||||
add_interface_port control reset reset Output 1
|
||||
|
3706
sys/ip/de10_hps_hw.tcl
Normal file
3706
sys/ip/de10_hps_hw.tcl
Normal file
File diff suppressed because it is too large
Load Diff
48
sys/ip/reset_source.v
Normal file
48
sys/ip/reset_source.v
Normal file
@ -0,0 +1,48 @@
|
||||
// reset_source.v
|
||||
|
||||
// This file was auto-generated as a prototype implementation of a module
|
||||
// created in component editor. It ties off all outputs to ground and
|
||||
// ignores all inputs. It needs to be edited to make it do something
|
||||
// useful.
|
||||
//
|
||||
// This file will not be automatically regenerated. You should check it in
|
||||
// to your version control system if you want to keep it.
|
||||
|
||||
`timescale 1 ps / 1 ps
|
||||
module reset_source
|
||||
(
|
||||
input wire clk, // clock.clk
|
||||
input wire reset_hps, // reset_hps.reset
|
||||
output wire reset_sys, // reset_sys.reset
|
||||
output wire reset_cold, // reset_cold.reset
|
||||
input wire cold_req, // reset_ctl.cold_req
|
||||
output wire reset, // .reset
|
||||
input wire reset_req, // .reset_req
|
||||
input wire warm_req, // .warm_req
|
||||
output wire reset_warm // reset_warm.reset
|
||||
);
|
||||
|
||||
assign reset_cold = cold_req;
|
||||
assign reset_warm = warm_req;
|
||||
|
||||
assign reset = reset_sys;
|
||||
assign reset_sys = sys_reset | reset_hps | reset_req;
|
||||
|
||||
reg sys_reset = 1;
|
||||
always @(posedge clk) begin
|
||||
integer timeout = 0;
|
||||
reg reset_lock = 0;
|
||||
|
||||
reset_lock <= reset_lock | cold_req;
|
||||
|
||||
if(timeout < 2000000) begin
|
||||
sys_reset <= 1;
|
||||
timeout <= timeout + 1;
|
||||
reset_lock <= 0;
|
||||
end
|
||||
else begin
|
||||
sys_reset <= reset_lock;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
151
sys/ip/reset_source_hw.tcl
Normal file
151
sys/ip/reset_source_hw.tcl
Normal file
@ -0,0 +1,151 @@
|
||||
# TCL File Generated by Component Editor 16.1
|
||||
# Thu Apr 20 14:20:36 CST 2017
|
||||
# DO NOT MODIFY
|
||||
|
||||
|
||||
#
|
||||
# reset_source "reset_source" v1.0
|
||||
# Sorgelig 2017.04.20.14:20:36
|
||||
#
|
||||
#
|
||||
|
||||
#
|
||||
# request TCL package from ACDS 16.1
|
||||
#
|
||||
package require -exact qsys 16.1
|
||||
|
||||
|
||||
#
|
||||
# module reset_source
|
||||
#
|
||||
set_module_property DESCRIPTION ""
|
||||
set_module_property NAME reset_source
|
||||
set_module_property VERSION 1.0
|
||||
set_module_property INTERNAL false
|
||||
set_module_property OPAQUE_ADDRESS_MAP true
|
||||
set_module_property AUTHOR Sorgelig
|
||||
set_module_property DISPLAY_NAME reset_source
|
||||
set_module_property INSTANTIATE_IN_SYSTEM_MODULE true
|
||||
set_module_property EDITABLE true
|
||||
set_module_property REPORT_TO_TALKBACK false
|
||||
set_module_property ALLOW_GREYBOX_GENERATION false
|
||||
set_module_property REPORT_HIERARCHY false
|
||||
|
||||
|
||||
#
|
||||
# file sets
|
||||
#
|
||||
add_fileset QUARTUS_SYNTH QUARTUS_SYNTH "" ""
|
||||
set_fileset_property QUARTUS_SYNTH TOP_LEVEL reset_source
|
||||
set_fileset_property QUARTUS_SYNTH ENABLE_RELATIVE_INCLUDE_PATHS false
|
||||
set_fileset_property QUARTUS_SYNTH ENABLE_FILE_OVERWRITE_MODE true
|
||||
add_fileset_file reset_source.v VERILOG PATH reset_source.v TOP_LEVEL_FILE
|
||||
|
||||
|
||||
#
|
||||
# parameters
|
||||
#
|
||||
|
||||
|
||||
#
|
||||
# display items
|
||||
#
|
||||
|
||||
|
||||
#
|
||||
# connection point clock
|
||||
#
|
||||
add_interface clock clock end
|
||||
set_interface_property clock clockRate 0
|
||||
set_interface_property clock ENABLED true
|
||||
set_interface_property clock EXPORT_OF ""
|
||||
set_interface_property clock PORT_NAME_MAP ""
|
||||
set_interface_property clock CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property clock SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port clock clk clk Input 1
|
||||
|
||||
|
||||
#
|
||||
# connection point reset_hps
|
||||
#
|
||||
add_interface reset_hps reset end
|
||||
set_interface_property reset_hps associatedClock ""
|
||||
set_interface_property reset_hps synchronousEdges NONE
|
||||
set_interface_property reset_hps ENABLED true
|
||||
set_interface_property reset_hps EXPORT_OF ""
|
||||
set_interface_property reset_hps PORT_NAME_MAP ""
|
||||
set_interface_property reset_hps CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property reset_hps SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port reset_hps reset_hps reset Input 1
|
||||
|
||||
|
||||
#
|
||||
# connection point reset_sys
|
||||
#
|
||||
add_interface reset_sys reset start
|
||||
set_interface_property reset_sys associatedClock ""
|
||||
set_interface_property reset_sys associatedDirectReset ""
|
||||
set_interface_property reset_sys associatedResetSinks ""
|
||||
set_interface_property reset_sys synchronousEdges NONE
|
||||
set_interface_property reset_sys ENABLED true
|
||||
set_interface_property reset_sys EXPORT_OF ""
|
||||
set_interface_property reset_sys PORT_NAME_MAP ""
|
||||
set_interface_property reset_sys CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property reset_sys SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port reset_sys reset_sys reset Output 1
|
||||
|
||||
|
||||
#
|
||||
# connection point reset_ctl
|
||||
#
|
||||
add_interface reset_ctl conduit end
|
||||
set_interface_property reset_ctl associatedClock ""
|
||||
set_interface_property reset_ctl associatedReset ""
|
||||
set_interface_property reset_ctl ENABLED true
|
||||
set_interface_property reset_ctl EXPORT_OF ""
|
||||
set_interface_property reset_ctl PORT_NAME_MAP ""
|
||||
set_interface_property reset_ctl CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property reset_ctl SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port reset_ctl cold_req cold_req Input 1
|
||||
add_interface_port reset_ctl reset reset Output 1
|
||||
add_interface_port reset_ctl reset_req reset_req Input 1
|
||||
add_interface_port reset_ctl warm_req warm_req Input 1
|
||||
|
||||
|
||||
#
|
||||
# connection point reset_warm
|
||||
#
|
||||
add_interface reset_warm reset start
|
||||
set_interface_property reset_warm associatedClock ""
|
||||
set_interface_property reset_warm associatedDirectReset ""
|
||||
set_interface_property reset_warm associatedResetSinks ""
|
||||
set_interface_property reset_warm synchronousEdges NONE
|
||||
set_interface_property reset_warm ENABLED true
|
||||
set_interface_property reset_warm EXPORT_OF ""
|
||||
set_interface_property reset_warm PORT_NAME_MAP ""
|
||||
set_interface_property reset_warm CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property reset_warm SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port reset_warm reset_warm reset Output 1
|
||||
|
||||
|
||||
#
|
||||
# connection point reset_cold
|
||||
#
|
||||
add_interface reset_cold reset start
|
||||
set_interface_property reset_cold associatedClock ""
|
||||
set_interface_property reset_cold associatedDirectReset ""
|
||||
set_interface_property reset_cold associatedResetSinks ""
|
||||
set_interface_property reset_cold synchronousEdges NONE
|
||||
set_interface_property reset_cold ENABLED true
|
||||
set_interface_property reset_cold EXPORT_OF ""
|
||||
set_interface_property reset_cold PORT_NAME_MAP ""
|
||||
set_interface_property reset_cold CMSIS_SVD_VARIABLES ""
|
||||
set_interface_property reset_cold SVD_ADDRESS_GROUP ""
|
||||
|
||||
add_interface_port reset_cold reset_cold reset Output 1
|
||||
|
100
sys/lpf48k.sv
Normal file
100
sys/lpf48k.sv
Normal file
@ -0,0 +1,100 @@
|
||||
// low pass filter
|
||||
// Revision 1.00
|
||||
//
|
||||
// Copyright (c) 2008 Takayuki Hara.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use of this source code or any derivative works, are
|
||||
// permitted provided that the following conditions are met:
|
||||
//
|
||||
// 1. Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
// 2. Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
// 3. Redistributions may not be sold, nor may they be used in a commercial
|
||||
// product or activity without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
|
||||
// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//
|
||||
//
|
||||
// LPF (cut off 48kHz at 3.58MHz)
|
||||
|
||||
module lpf48k #(parameter MSB = 15)
|
||||
(
|
||||
input RESET,
|
||||
input CLK,
|
||||
input CE,
|
||||
input ENABLE,
|
||||
|
||||
input [MSB:0] IDATA,
|
||||
output [MSB:0] ODATA
|
||||
);
|
||||
|
||||
wire [7:0] LPF_TAP_DATA[0:71] =
|
||||
'{
|
||||
8'h51, 8'h07, 8'h07, 8'h08, 8'h08, 8'h08, 8'h09, 8'h09,
|
||||
8'h09, 8'h0A, 8'h0A, 8'h0A, 8'h0A, 8'h0B, 8'h0B, 8'h0B,
|
||||
8'h0B, 8'h0C, 8'h0C, 8'h0C, 8'h0C, 8'h0D, 8'h0D, 8'h0D,
|
||||
8'h0D, 8'h0D, 8'h0D, 8'h0E, 8'h0E, 8'h0E, 8'h0E, 8'h0E,
|
||||
8'h0E, 8'h0E, 8'h0E, 8'h0E, 8'h0E, 8'h0E, 8'h0E, 8'h0E,
|
||||
8'h0E, 8'h0E, 8'h0E, 8'h0E, 8'h0E, 8'h0D, 8'h0D, 8'h0D,
|
||||
8'h0D, 8'h0D, 8'h0D, 8'h0C, 8'h0C, 8'h0C, 8'h0C, 8'h0B,
|
||||
8'h0B, 8'h0B, 8'h0B, 8'h0A, 8'h0A, 8'h0A, 8'h0A, 8'h09,
|
||||
8'h09, 8'h09, 8'h08, 8'h08, 8'h08, 8'h07, 8'h07, 8'h51
|
||||
};
|
||||
|
||||
reg [7:0] FF_ADDR = 0;
|
||||
reg [MSB+10:0] FF_INTEG = 0;
|
||||
wire [MSB+8:0] W_DATA;
|
||||
wire W_ADDR_END;
|
||||
|
||||
assign W_ADDR_END = ((FF_ADDR == 71));
|
||||
|
||||
reg [MSB:0] OUT;
|
||||
|
||||
assign ODATA = ENABLE ? OUT : IDATA;
|
||||
|
||||
always @(posedge RESET or posedge CLK) begin
|
||||
if (RESET) FF_ADDR <= 0;
|
||||
else
|
||||
begin
|
||||
if (CE) begin
|
||||
if (W_ADDR_END) FF_ADDR <= 0;
|
||||
else FF_ADDR <= FF_ADDR + 1'd1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
assign W_DATA = LPF_TAP_DATA[FF_ADDR] * IDATA;
|
||||
|
||||
always @(posedge RESET or posedge CLK) begin
|
||||
if (RESET) FF_INTEG <= 0;
|
||||
else
|
||||
begin
|
||||
if (CE) begin
|
||||
if (W_ADDR_END) FF_INTEG <= 0;
|
||||
else FF_INTEG <= FF_INTEG + W_DATA;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always @(posedge RESET or posedge CLK) begin
|
||||
if (RESET) OUT <= 0;
|
||||
else
|
||||
begin
|
||||
if (CE && W_ADDR_END) OUT <= FF_INTEG[MSB + 10:10];
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
168
sys/osd.v
Normal file
168
sys/osd.v
Normal file
@ -0,0 +1,168 @@
|
||||
// A simple OSD implementation. Can be hooked up between a cores
|
||||
// VGA output and the physical VGA pins
|
||||
|
||||
module osd
|
||||
(
|
||||
input clk_sys,
|
||||
|
||||
input io_osd,
|
||||
input io_strobe,
|
||||
input [7:0] io_din,
|
||||
|
||||
input clk_video,
|
||||
input [23:0] din,
|
||||
output [23:0] dout,
|
||||
input de
|
||||
);
|
||||
|
||||
parameter OSD_COLOR = 3'd4;
|
||||
parameter OSD_X_OFFSET = 12'd0;
|
||||
parameter OSD_Y_OFFSET = 12'd0;
|
||||
|
||||
localparam OSD_WIDTH = 12'd256;
|
||||
localparam OSD_HEIGHT = 12'd64;
|
||||
|
||||
// this core supports only the display related OSD commands
|
||||
// of the minimig v1
|
||||
reg osd_enable;
|
||||
(* ramstyle = "no_rw_check" *) reg [7:0] osd_buffer[4096]; // the OSD buffer itself
|
||||
|
||||
reg highres = 0;
|
||||
|
||||
// the OSD has its own SPI interface to the io controller
|
||||
always@(posedge clk_sys) begin
|
||||
reg [11:0] bcnt;
|
||||
reg [7:0] cmd;
|
||||
reg has_cmd;
|
||||
reg old_strobe;
|
||||
|
||||
old_strobe <= io_strobe;
|
||||
|
||||
if(~io_osd) begin
|
||||
bcnt <= 0;
|
||||
has_cmd <= 0;
|
||||
end else begin
|
||||
if(~old_strobe & io_strobe) begin
|
||||
if(!has_cmd) begin
|
||||
has_cmd <= 1;
|
||||
cmd <= io_din;
|
||||
// command 0x40: OSDCMDENABLE, OSDCMDDISABLE
|
||||
if(io_din[7:4] == 4'b0100) begin
|
||||
osd_enable <= io_din[0];
|
||||
if(!io_din[0]) highres <= 0;
|
||||
end
|
||||
bcnt <= {io_din[3:0], 8'h00};
|
||||
if(io_din[7:3] == 5'b00101) highres <= 1;
|
||||
end else begin
|
||||
// command 0x20: OSDCMDWRITE
|
||||
if(cmd[7:4] == 4'b0010) begin
|
||||
osd_buffer[bcnt] <= io_din;
|
||||
bcnt <= bcnt + 1'd1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
reg ce_pix;
|
||||
always @(negedge clk_video) begin
|
||||
integer cnt = 0;
|
||||
integer pixsz, pixcnt;
|
||||
reg deD;
|
||||
|
||||
cnt <= cnt + 1;
|
||||
deD <= de;
|
||||
|
||||
pixcnt <= pixcnt + 1;
|
||||
if(pixcnt == pixsz) pixcnt <= 0;
|
||||
ce_pix <= !pixcnt;
|
||||
|
||||
if(~deD && de) cnt <= 0;
|
||||
|
||||
if(deD && ~de) begin
|
||||
pixsz <= (((cnt+1'b1) >> 9) > 1) ? (((cnt+1'b1) >> 9) - 1) : 0;
|
||||
pixcnt <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
reg [23:0] h_cnt;
|
||||
reg [21:0] v_cnt;
|
||||
reg [21:0] dsp_width;
|
||||
reg [21:0] dsp_height;
|
||||
reg [7:0] osd_byte;
|
||||
reg [21:0] osd_vcnt;
|
||||
reg [21:0] fheight;
|
||||
|
||||
wire [21:0] hrheight = (OSD_HEIGHT<<highres);
|
||||
|
||||
always @(posedge clk_video) begin
|
||||
reg deD;
|
||||
reg [1:0] osd_div;
|
||||
reg [1:0] multiscan;
|
||||
|
||||
if(ce_pix) begin
|
||||
|
||||
deD <= de;
|
||||
if(~&h_cnt) h_cnt <= h_cnt + 1'd1;
|
||||
|
||||
// falling edge of de
|
||||
if(!de && deD) dsp_width <= h_cnt[21:0];
|
||||
|
||||
// rising edge of de
|
||||
if(de && !deD) begin
|
||||
v_cnt <= v_cnt + 1'd1;
|
||||
if(h_cnt > {dsp_width, 2'b00}) begin
|
||||
v_cnt <= 0;
|
||||
dsp_height <= v_cnt;
|
||||
|
||||
if(v_cnt<320) begin
|
||||
multiscan <= 0;
|
||||
fheight <= hrheight;
|
||||
end
|
||||
else if(v_cnt<640) begin
|
||||
multiscan <= 1;
|
||||
fheight <= hrheight << 1;
|
||||
end
|
||||
else if(v_cnt<960) begin
|
||||
multiscan <= 2;
|
||||
fheight <= hrheight + (hrheight<<1);
|
||||
end
|
||||
else begin
|
||||
multiscan <= 3;
|
||||
fheight <= hrheight << 2;
|
||||
end
|
||||
end
|
||||
h_cnt <= 0;
|
||||
|
||||
osd_div <= osd_div + 1'd1;
|
||||
if(osd_div == multiscan) begin
|
||||
osd_div <= 0;
|
||||
osd_vcnt <= osd_vcnt + 1'd1;
|
||||
end
|
||||
if(v_osd_start == (v_cnt+1'b1)) {osd_div, osd_vcnt} <= 0;
|
||||
end
|
||||
|
||||
osd_byte <= osd_buffer[{osd_vcnt[6:3], osd_hcnt[7:0]}];
|
||||
end
|
||||
end
|
||||
|
||||
// area in which OSD is being displayed
|
||||
wire [21:0] h_osd_start = ((dsp_width - OSD_WIDTH)>>1) + OSD_X_OFFSET;
|
||||
wire [21:0] h_osd_end = h_osd_start + OSD_WIDTH;
|
||||
wire [21:0] v_osd_start = ((dsp_height- fheight)>>1) + OSD_Y_OFFSET;
|
||||
wire [21:0] v_osd_end = v_osd_start + fheight;
|
||||
|
||||
wire [21:0] osd_hcnt = h_cnt[21:0] - h_osd_start + 1'd1;
|
||||
|
||||
wire osd_de = osd_enable &&
|
||||
(h_cnt >= h_osd_start) && (h_cnt < h_osd_end) &&
|
||||
(v_cnt >= v_osd_start) && (v_cnt < v_osd_end);
|
||||
|
||||
wire osd_pixel = osd_byte[osd_vcnt[2:0]];
|
||||
|
||||
|
||||
assign dout = !osd_de ? din : {{osd_pixel, osd_pixel, OSD_COLOR[2], din[23:19]},
|
||||
{osd_pixel, osd_pixel, OSD_COLOR[1], din[15:11]},
|
||||
{osd_pixel, osd_pixel, OSD_COLOR[0], din[7:3]}};
|
||||
|
||||
endmodule
|
120
sys/pattern_vg.v
Normal file
120
sys/pattern_vg.v
Normal file
@ -0,0 +1,120 @@
|
||||
module pattern_vg
|
||||
#(
|
||||
parameter B=8, // number of bits per channel
|
||||
X_BITS=13,
|
||||
Y_BITS=13,
|
||||
FRACTIONAL_BITS = 12
|
||||
)
|
||||
|
||||
(
|
||||
input reset, clk_in,
|
||||
input wire [X_BITS-1:0] x,
|
||||
input wire [Y_BITS-1:0] y,
|
||||
input wire vn_in, hn_in, dn_in,
|
||||
input wire [B-1:0] r_in, g_in, b_in,
|
||||
output reg vn_out, hn_out, den_out,
|
||||
output reg [B-1:0] r_out, g_out, b_out,
|
||||
input wire [X_BITS-1:0] total_active_pix,
|
||||
input wire [Y_BITS-1:0] total_active_lines,
|
||||
input wire [7:0] pattern,
|
||||
input wire [B+FRACTIONAL_BITS-1:0] ramp_step
|
||||
);
|
||||
|
||||
reg [B+FRACTIONAL_BITS-1:0] ramp_values; // 12-bit fractional end for ramp values
|
||||
|
||||
|
||||
//wire bar_0 = y<90;
|
||||
wire bar_1 = y>=90 & y<180;
|
||||
wire bar_2 = y>=180 & y<270;
|
||||
wire bar_3 = y>=270 & y<360;
|
||||
wire bar_4 = y>=360 & y<450;
|
||||
wire bar_5 = y>=450 & y<540;
|
||||
wire bar_6 = y>=540 & y<630;
|
||||
wire bar_7 = y>=630 & y<720;
|
||||
|
||||
|
||||
wire red_enable = bar_1 | bar_3 | bar_5 | bar_7;
|
||||
wire green_enable = bar_2 | bar_3 | bar_6 | bar_7;
|
||||
wire blue_enable = bar_4 | bar_5 | bar_6 | bar_7;
|
||||
|
||||
always @(posedge clk_in)
|
||||
begin
|
||||
vn_out <= vn_in;
|
||||
hn_out <= hn_in;
|
||||
den_out <= dn_in;
|
||||
if (reset)
|
||||
ramp_values <= 0;
|
||||
else if (pattern == 8'b0) // no pattern
|
||||
begin
|
||||
r_out <= r_in;
|
||||
g_out <= g_in;
|
||||
b_out <= b_in;
|
||||
end
|
||||
else if (pattern == 8'b1) // border
|
||||
begin
|
||||
if (dn_in && ((y == 12'b0) || (x == 12'b0) || (x == total_active_pix - 1) || (y == total_active_lines - 1)))
|
||||
begin
|
||||
r_out <= 8'hFF;
|
||||
g_out <= 8'hFF;
|
||||
b_out <= 8'hFF;
|
||||
end
|
||||
else // Double-border (OzOnE)...
|
||||
if (dn_in && ((y == 12'b0+20) || (x == 12'b0+20) || (x == total_active_pix - 1 - 20) || (y == total_active_lines - 1 - 20)))
|
||||
begin
|
||||
r_out <= 8'hD0;
|
||||
g_out <= 8'hB0;
|
||||
b_out <= 8'hB0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
r_out <= r_in;
|
||||
g_out <= g_in;
|
||||
b_out <= b_in;
|
||||
end
|
||||
end
|
||||
else if (pattern == 8'd2) // moireX
|
||||
begin
|
||||
if ((dn_in) && x[0] == 1'b1)
|
||||
begin
|
||||
r_out <= 8'hFF;
|
||||
g_out <= 8'hFF;
|
||||
b_out <= 8'hFF;
|
||||
end
|
||||
else
|
||||
begin
|
||||
r_out <= 8'b0;
|
||||
g_out <= 8'b0;
|
||||
b_out <= 8'b0;
|
||||
end
|
||||
end
|
||||
else if (pattern == 8'd3) // moireY
|
||||
begin
|
||||
if ((dn_in) && y[0] == 1'b1)
|
||||
begin
|
||||
r_out <= 8'hFF;
|
||||
g_out <= 8'hFF;
|
||||
b_out <= 8'hFF;
|
||||
end
|
||||
else
|
||||
begin
|
||||
r_out <= 8'b0;
|
||||
g_out <= 8'b0;
|
||||
b_out <= 8'b0;
|
||||
end
|
||||
end
|
||||
else if (pattern == 8'd4) // Simple RAMP
|
||||
begin
|
||||
r_out <= (red_enable) ? ramp_values[B+FRACTIONAL_BITS-1:FRACTIONAL_BITS] : 8'h00;
|
||||
g_out <= (green_enable) ? ramp_values[B+FRACTIONAL_BITS-1:FRACTIONAL_BITS] : 8'h00;
|
||||
b_out <= (blue_enable) ? ramp_values[B+FRACTIONAL_BITS-1:FRACTIONAL_BITS] : 8'h00;
|
||||
|
||||
if ((x == total_active_pix - 1) && (dn_in))
|
||||
ramp_values <= 0;
|
||||
else if ((x == 0) && (dn_in))
|
||||
ramp_values <= ramp_step;
|
||||
else if (dn_in)
|
||||
ramp_values <= ramp_values + ramp_step;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
337
sys/pll.qip
Normal file
337
sys/pll.qip
Normal file
@ -0,0 +1,337 @@
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_TOOL_NAME "altera_pll"
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_TOOL_VERSION "17.0"
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_TOOL_ENV "mwpim"
|
||||
set_global_assignment -library "pll" -name MISC_FILE [file join $::quartus(qip_path) "pll.cmp"]
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_TARGETED_DEVICE_FAMILY "Cyclone V"
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_GENERATED_DEVICE_FAMILY "{Cyclone V}"
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_QSYS_MODE "UNKNOWN"
|
||||
set_global_assignment -name SYNTHESIS_ONLY_QIP ON
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_COMPONENT_NAME "cGxs"
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_COMPONENT_DISPLAY_NAME "QWx0ZXJhIFBMTA=="
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_COMPONENT_REPORT_HIERARCHY "Off"
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_COMPONENT_INTERNAL "Off"
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_COMPONENT_AUTHOR "QWx0ZXJhIENvcnBvcmF0aW9u"
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_COMPONENT_VERSION "MTcuMA=="
|
||||
set_global_assignment -entity "pll" -library "pll" -name IP_COMPONENT_DESCRIPTION "QWx0ZXJhIFBoYXNlLUxvY2tlZCBMb29wIChBTFRFUkFfUExMKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_NAME "cGxsXzAwMDI="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_DISPLAY_NAME "QWx0ZXJhIFBMTA=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_REPORT_HIERARCHY "Off"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_INTERNAL "Off"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_AUTHOR "QWx0ZXJhIENvcnBvcmF0aW9u"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_VERSION "MTcuMA=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_DESCRIPTION "QWx0ZXJhIFBoYXNlLUxvY2tlZCBMb29wIChBTFRFUkFfUExMKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZGVidWdfcHJpbnRfb3V0cHV0::ZmFsc2U=::ZGVidWdfcHJpbnRfb3V0cHV0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZGVidWdfdXNlX3JiY190YWZfbWV0aG9k::ZmFsc2U=::ZGVidWdfdXNlX3JiY190YWZfbWV0aG9k"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZGV2aWNl::NUNFQkEyRjE3QTc=::ZGV2aWNl"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BsbF9tb2Rl::RnJhY3Rpb25hbC1OIFBMTA==::UExMIE1vZGU="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZnJhY3Rpb25hbF92Y29fbXVsdGlwbGllcg==::dHJ1ZQ==::ZnJhY3Rpb25hbF92Y29fbXVsdGlwbGllcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3JlZmVyZW5jZV9jbG9ja19mcmVxdWVuY3k=::NTAuMA==::UmVmZXJlbmNlIENsb2NrIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cmVmZXJlbmNlX2Nsb2NrX2ZyZXF1ZW5jeQ==::NTAuMCBNSHo=::cmVmZXJlbmNlX2Nsb2NrX2ZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2NoYW5uZWxfc3BhY2luZw==::MC4w::Q2hhbm5lbCBTcGFjaW5n"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX29wZXJhdGlvbl9tb2Rl::ZGlyZWN0::T3BlcmF0aW9uIE1vZGU="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2ZlZWRiYWNrX2Nsb2Nr::R2xvYmFsIENsb2Nr::RmVlZGJhY2sgQ2xvY2s="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2ZyYWN0aW9uYWxfY291dA==::MzI=::RnJhY3Rpb25hbCBjYXJyeSBvdXQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RzbV9vdXRfc2Vs::MXN0X29yZGVy::RFNNIE9yZGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3BlcmF0aW9uX21vZGU=::ZGlyZWN0::b3BlcmF0aW9uX21vZGU="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3VzZV9sb2NrZWQ=::dHJ1ZQ==::RW5hYmxlIGxvY2tlZCBvdXRwdXQgcG9ydA=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2VuX2Fkdl9wYXJhbXM=::ZmFsc2U=::RW5hYmxlIHBoeXNpY2FsIG91dHB1dCBjbG9jayBwYXJhbWV0ZXJz"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX251bWJlcl9vZl9jbG9ja3M=::Mg==::TnVtYmVyIE9mIENsb2Nrcw=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "bnVtYmVyX29mX2Nsb2Nrcw==::Mg==::bnVtYmVyX29mX2Nsb2Nrcw=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX211bHRpcGx5X2ZhY3Rvcg==::MTM=::TXVsdGlwbHkgRmFjdG9yIChNLUNvdW50ZXIp"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2ZyYWNfbXVsdGlwbHlfZmFjdG9y::MQ==::RnJhY3Rpb25hbCBNdWx0aXBseSBGYWN0b3IgKEsp"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3Jfbg==::MQ==::RGl2aWRlIEZhY3RvciAoTi1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjA=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kw::NjIuNjY4OA==::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzA=::MTA=::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3Iw::MTM=::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjA=::MzM4MDcyMzM3OA==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMA==::MTE=::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MA==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMA==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MA==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzA=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDA=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUw::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kx::NjIuNjY4OA==::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE=::MTA=::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3Ix::MTM=::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE=::MzM4MDcyMzM3OA==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMQ==::MTE=::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MQ==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMQ==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MQ==::LTQzNTI=::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE=::MTgwLjA=::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUx::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjI=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3ky::MzIuNQ==::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzI=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3Iy::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjI=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMg==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5Mg==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMg==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0Mg==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzI=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDI=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUy::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjM=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kz::OC4xMjU=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzM=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3Iz::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjM=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMw==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5Mw==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMw==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0Mw==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzM=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDM=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUz::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjQ=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k0::NDguMA==::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzQ=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I0::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjQ=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yNA==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5NA==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzNA==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0NA==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzQ=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDQ=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU0::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjU=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k1::OC4zMzM=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzU=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I1::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjU=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yNQ==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5NQ==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzNQ==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0NQ==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzU=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDU=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU1::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjY=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k2::OC4w::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzY=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I2::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjY=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yNg==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5Ng==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzNg==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0Ng==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzY=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDY=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU2::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjc=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k3::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzc=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I3::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3Rvcjc=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yNw==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5Nw==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzNw==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0Nw==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzc=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDc=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU3::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjg=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k4::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzg=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I4::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3Rvcjg=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yOA==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5OA==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzOA==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0OA==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzg=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDg=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU4::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjk=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k5::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzk=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I5::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3Rvcjk=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yOQ==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5OQ==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzOQ==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0OQ==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzk=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDk=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU5::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjEw::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxMA==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzEw::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxMA==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjEw::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTA=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTA=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTA=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTA=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzEw::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDEw::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxMA==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjEx::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxMQ==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzEx::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxMQ==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjEx::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTE=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTE=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTE=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTE=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzEx::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDEx::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxMQ==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjEy::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxMg==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzEy::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxMg==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjEy::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTI=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTI=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTI=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTI=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzEy::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDEy::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxMg==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjEz::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxMw==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzEz::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxMw==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjEz::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTM=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTM=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTM=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTM=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzEz::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDEz::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxMw==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE0::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxNA==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE0::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxNA==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE0::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTQ=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTQ=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTQ=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTQ=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE0::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE0::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxNA==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE1::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxNQ==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE1::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxNQ==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE1::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTU=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTU=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTU=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTU=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE1::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE1::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxNQ==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE2::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxNg==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE2::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxNg==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE2::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTY=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTY=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTY=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTY=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE2::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE2::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxNg==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE3::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxNw==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE3::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxNw==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE3::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTc=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTc=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTc=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTc=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE3::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE3::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxNw==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTA=::NjIuNjY4ODAwIE1Ieg==::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTA="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQw::MCBwcw==::cGhhc2Vfc2hpZnQw"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTA=::NTA=::ZHV0eV9jeWNsZTA="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE=::NjIuNjY4ODAwIE1Ieg==::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQx::LTQzNTEgcHM=::cGhhc2Vfc2hpZnQx"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE=::NTA=::ZHV0eV9jeWNsZTE="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTI=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTI="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQy::MCBwcw==::cGhhc2Vfc2hpZnQy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTI=::NTA=::ZHV0eV9jeWNsZTI="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTM=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQz::MCBwcw==::cGhhc2Vfc2hpZnQz"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTM=::NTA=::ZHV0eV9jeWNsZTM="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTQ=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ0::MCBwcw==::cGhhc2Vfc2hpZnQ0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTQ=::NTA=::ZHV0eV9jeWNsZTQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTU=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTU="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ1::MCBwcw==::cGhhc2Vfc2hpZnQ1"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTU=::NTA=::ZHV0eV9jeWNsZTU="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTY=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTY="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ2::MCBwcw==::cGhhc2Vfc2hpZnQ2"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTY=::NTA=::ZHV0eV9jeWNsZTY="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTc=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTc="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ3::MCBwcw==::cGhhc2Vfc2hpZnQ3"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTc=::NTA=::ZHV0eV9jeWNsZTc="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTg=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTg="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ4::MCBwcw==::cGhhc2Vfc2hpZnQ4"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTg=::NTA=::ZHV0eV9jeWNsZTg="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTk=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTk="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ5::MCBwcw==::cGhhc2Vfc2hpZnQ5"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTk=::NTA=::ZHV0eV9jeWNsZTk="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEw::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEw"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxMA==::MCBwcw==::cGhhc2Vfc2hpZnQxMA=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTEw::NTA=::ZHV0eV9jeWNsZTEw"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEx::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEx"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxMQ==::MCBwcw==::cGhhc2Vfc2hpZnQxMQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTEx::NTA=::ZHV0eV9jeWNsZTEx"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEy::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxMg==::MCBwcw==::cGhhc2Vfc2hpZnQxMg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTEy::NTA=::ZHV0eV9jeWNsZTEy"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEz::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEz"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxMw==::MCBwcw==::cGhhc2Vfc2hpZnQxMw=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTEz::NTA=::ZHV0eV9jeWNsZTEz"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE0::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxNA==::MCBwcw==::cGhhc2Vfc2hpZnQxNA=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE0::NTA=::ZHV0eV9jeWNsZTE0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE1::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE1"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxNQ==::MCBwcw==::cGhhc2Vfc2hpZnQxNQ=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE1::NTA=::ZHV0eV9jeWNsZTE1"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE2::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE2"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxNg==::MCBwcw==::cGhhc2Vfc2hpZnQxNg=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE2::NTA=::ZHV0eV9jeWNsZTE2"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE3::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE3"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxNw==::MCBwcw==::cGhhc2Vfc2hpZnQxNw=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE3::NTA=::ZHV0eV9jeWNsZTE3"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BsbF9hdXRvX3Jlc2V0::T24=::UExMIEF1dG8gUmVzZXQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BsbF9iYW5kd2lkdGhfcHJlc2V0::QXV0bw==::UExMIEJhbmR3aWR0aCBQcmVzZXQ="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2VuX3JlY29uZg==::ZmFsc2U=::RW5hYmxlIGR5bmFtaWMgcmVjb25maWd1cmF0aW9uIG9mIFBMTA=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2VuX2Rwc19wb3J0cw==::ZmFsc2U=::RW5hYmxlIGFjY2VzcyB0byBkeW5hbWljIHBoYXNlIHNoaWZ0IHBvcnRz"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2VuX3Bob3V0X3BvcnRz::ZmFsc2U=::RW5hYmxlIGFjY2VzcyB0byBQTEwgRFBBIG91dHB1dCBwb3J0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGxsX3R5cGU=::R2VuZXJhbA==::UExMIFRZUEU="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "cGxsX3N1YnR5cGU=::R2VuZXJhbA==::UExMIFNVQlRZUEU="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BhcmFtZXRlcl9saXN0::TS1Db3VudGVyIEhpIERpdmlkZSxNLUNvdW50ZXIgTG93IERpdmlkZSxOLUNvdW50ZXIgSGkgRGl2aWRlLE4tQ291bnRlciBMb3cgRGl2aWRlLE0tQ291bnRlciBCeXBhc3MgRW5hYmxlLE4tQ291bnRlciBCeXBhc3MgRW5hYmxlLE0tQ291bnRlciBPZGQgRGl2aWRlIEVuYWJsZSxOLUNvdW50ZXIgT2RkIERpdmlkZSBFbmFibGUsQy1Db3VudGVyLTAgSGkgRGl2aWRlLEMtQ291bnRlci0wIExvdyBEaXZpZGUsQy1Db3VudGVyLTAgQ29hcnNlIFBoYXNlIFNoaWZ0LEMtQ291bnRlci0wIFZDTyBQaGFzZSBUYXAsQy1Db3VudGVyLTAgSW5wdXQgU291cmNlLEMtQ291bnRlci0wIEJ5cGFzcyBFbmFibGUsQy1Db3VudGVyLTAgT2RkIERpdmlkZSBFbmFibGUsQy1Db3VudGVyLTEgSGkgRGl2aWRlLEMtQ291bnRlci0xIExvdyBEaXZpZGUsQy1Db3VudGVyLTEgQ29hcnNlIFBoYXNlIFNoaWZ0LEMtQ291bnRlci0xIFZDTyBQaGFzZSBUYXAsQy1Db3VudGVyLTEgSW5wdXQgU291cmNlLEMtQ291bnRlci0xIEJ5cGFzcyBFbmFibGUsQy1Db3VudGVyLTEgT2RkIERpdmlkZSBFbmFibGUsVkNPIFBvc3QgRGl2aWRlIENvdW50ZXIgRW5hYmxlLENoYXJnZSBQdW1wIGN1cnJlbnQgKHVBKSxMb29wIEZpbHRlciBCYW5kd2lkdGggUmVzaXN0b3IgKE9obXMpICxQTEwgT3V0cHV0IFZDTyBGcmVxdWVuY3ksSy1GcmFjdGlvbmFsIERpdmlzaW9uIFZhbHVlIChEU00pLEZlZWRiYWNrIENsb2NrIFR5cGUsRmVlZGJhY2sgQ2xvY2sgTVVYIDEsRmVlZGJhY2sgQ2xvY2sgTVVYIDIsTSBDb3VudGVyIFNvdXJjZSBNVVgsUExMIEF1dG8gUmVzZXQ=::UGFyYW1ldGVyIE5hbWVz"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3BhcmFtZXRlcl92YWx1ZXM=::Nyw2LDI1NiwyNTYsZmFsc2UsdHJ1ZSx0cnVlLGZhbHNlLDYsNSwxLDAscGhfbXV4X2NsayxmYWxzZSx0cnVlLDYsNSw5LDAscGhfbXV4X2NsayxmYWxzZSx0cnVlLDEsMzAsMjAwMCw2ODkuMzU2OCBNSHosMzM4MDcyMzM3OCxub25lLGdsYixtX2NudCxwaF9tdXhfY2xrLHRydWU=::UGFyYW1ldGVyIFZhbHVlcw=="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX21pZl9nZW5lcmF0ZQ==::ZmFsc2U=::R2VuZXJhdGUgTUlGIGZpbGU="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2VuYWJsZV9taWZfZHBz::ZmFsc2U=::RW5hYmxlIER5bmFtaWMgUGhhc2UgU2hpZnQgZm9yIE1JRiBzdHJlYW1pbmc="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Rwc19jbnRy::QzA=::RFBTIENvdW50ZXIgU2VsZWN0aW9u"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Rwc19udW0=::MQ==::TnVtYmVyIG9mIER5bmFtaWMgUGhhc2UgU2hpZnRz"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2Rwc19kaXI=::UG9zaXRpdmU=::RHluYW1pYyBQaGFzZSBTaGlmdCBEaXJlY3Rpb24="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX3JlZmNsa19zd2l0Y2g=::ZmFsc2U=::Q3JlYXRlIGEgc2Vjb25kIGlucHV0IGNsayAncmVmY2xrMSc="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2VuYWJsZV9jYXNjYWRlX291dA==::ZmFsc2U=::Q3JlYXRlIGEgJ2Nhc2NhZGVfb3V0JyBzaWduYWwgdG8gY29ubmVjdCB3aXRoIGEgZG93bnN0cmVhbSBQTEw="
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_COMPONENT_PARAMETER "Z3VpX2VuYWJsZV9jYXNjYWRlX2lu::ZmFsc2U=::Q3JlYXRlIGFuIGFkanBsbGluIG9yIGNjbGsgc2lnbmFsIHRvIGNvbm5lY3Qgd2l0aCBhbiB1cHN0cmVhbSBQTEw="
|
||||
|
||||
set_global_assignment -library "pll" -name VERILOG_FILE [file join $::quartus(qip_path) "pll.v"]
|
||||
set_global_assignment -library "pll" -name VERILOG_FILE [file join $::quartus(qip_path) "pll/pll_0002.v"]
|
||||
set_global_assignment -library "pll" -name QIP_FILE [file join $::quartus(qip_path) "pll/pll_0002.qip"]
|
||||
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_TOOL_NAME "altera_pll"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_TOOL_VERSION "17.0"
|
||||
set_global_assignment -entity "pll_0002" -library "pll" -name IP_TOOL_ENV "mwpim"
|
255
sys/pll.v
Normal file
255
sys/pll.v
Normal file
@ -0,0 +1,255 @@
|
||||
// megafunction wizard: %Altera PLL v17.0%
|
||||
// GENERATION: XML
|
||||
// pll.v
|
||||
|
||||
// Generated using ACDS version 17.0 598
|
||||
|
||||
`timescale 1 ps / 1 ps
|
||||
module pll (
|
||||
input wire refclk, // refclk.clk
|
||||
input wire rst, // reset.reset
|
||||
output wire outclk_0, // outclk0.clk
|
||||
output wire outclk_1, // outclk1.clk
|
||||
output wire locked // locked.export
|
||||
);
|
||||
|
||||
pll_0002 pll_inst (
|
||||
.refclk (refclk), // refclk.clk
|
||||
.rst (rst), // reset.reset
|
||||
.outclk_0 (outclk_0), // outclk0.clk
|
||||
.outclk_1 (outclk_1), // outclk1.clk
|
||||
.locked (locked) // locked.export
|
||||
);
|
||||
|
||||
endmodule
|
||||
// Retrieval info: <?xml version="1.0"?>
|
||||
//<!--
|
||||
// Generated by Altera MegaWizard Launcher Utility version 1.0
|
||||
// ************************************************************
|
||||
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
|
||||
// ************************************************************
|
||||
// Copyright (C) 1991-2017 Altera Corporation
|
||||
// Any megafunction design, and related net list (encrypted or decrypted),
|
||||
// support information, device programming or simulation file, and any other
|
||||
// associated documentation or information provided by Altera or a partner
|
||||
// under Altera's Megafunction Partnership Program may be used only to
|
||||
// program PLD devices (but not masked PLD devices) from Altera. Any other
|
||||
// use of such megafunction design, net list, support information, device
|
||||
// programming or simulation file, or any other related documentation or
|
||||
// information is prohibited for any other purpose, including, but not
|
||||
// limited to modification, reverse engineering, de-compiling, or use with
|
||||
// any other silicon devices, unless such use is explicitly licensed under
|
||||
// a separate agreement with Altera or a megafunction partner. Title to
|
||||
// the intellectual property, including patents, copyrights, trademarks,
|
||||
// trade secrets, or maskworks, embodied in any such megafunction design,
|
||||
// net list, support information, device programming or simulation file, or
|
||||
// any other related documentation or information provided by Altera or a
|
||||
// megafunction partner, remains with Altera, the megafunction partner, or
|
||||
// their respective licensors. No other licenses, including any licenses
|
||||
// needed under any third party's intellectual property, are provided herein.
|
||||
//-->
|
||||
// Retrieval info: <instance entity-name="altera_pll" version="17.0" >
|
||||
// Retrieval info: <generic name="debug_print_output" value="false" />
|
||||
// Retrieval info: <generic name="debug_use_rbc_taf_method" value="false" />
|
||||
// Retrieval info: <generic name="device_family" value="Cyclone V" />
|
||||
// Retrieval info: <generic name="device" value="5CEBA2F17A7" />
|
||||
// Retrieval info: <generic name="gui_device_speed_grade" value="2" />
|
||||
// Retrieval info: <generic name="gui_pll_mode" value="Fractional-N PLL" />
|
||||
// Retrieval info: <generic name="gui_reference_clock_frequency" value="50.0" />
|
||||
// Retrieval info: <generic name="gui_channel_spacing" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_operation_mode" value="direct" />
|
||||
// Retrieval info: <generic name="gui_feedback_clock" value="Global Clock" />
|
||||
// Retrieval info: <generic name="gui_fractional_cout" value="32" />
|
||||
// Retrieval info: <generic name="gui_dsm_out_sel" value="1st_order" />
|
||||
// Retrieval info: <generic name="gui_use_locked" value="true" />
|
||||
// Retrieval info: <generic name="gui_en_adv_params" value="false" />
|
||||
// Retrieval info: <generic name="gui_number_of_clocks" value="2" />
|
||||
// Retrieval info: <generic name="gui_multiply_factor" value="13" />
|
||||
// Retrieval info: <generic name="gui_frac_multiply_factor" value="1" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_n" value="1" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter0" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency0" value="62.6688" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c0" value="10" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency0" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units0" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift0" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg0" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift0" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle0" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter1" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency1" value="62.6688" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c1" value="10" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency1" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units1" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift1" value="-4352" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg1" value="180.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift1" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle1" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter2" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency2" value="32.5" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c2" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency2" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units2" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift2" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg2" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift2" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle2" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter3" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency3" value="8.125" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c3" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency3" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units3" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift3" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg3" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift3" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle3" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter4" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency4" value="48.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c4" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency4" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units4" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift4" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg4" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift4" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle4" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter5" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency5" value="8.333" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c5" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency5" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units5" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift5" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg5" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift5" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle5" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter6" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency6" value="8.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c6" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency6" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units6" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift6" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg6" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift6" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle6" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter7" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency7" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c7" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency7" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units7" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift7" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg7" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift7" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle7" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter8" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency8" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c8" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency8" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units8" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift8" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg8" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift8" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle8" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter9" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency9" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c9" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency9" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units9" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift9" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg9" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift9" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle9" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter10" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency10" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c10" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency10" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units10" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift10" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg10" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift10" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle10" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter11" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency11" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c11" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency11" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units11" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift11" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg11" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift11" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle11" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter12" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency12" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c12" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency12" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units12" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift12" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg12" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift12" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle12" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter13" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency13" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c13" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency13" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units13" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift13" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg13" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift13" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle13" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter14" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency14" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c14" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency14" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units14" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift14" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg14" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift14" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle14" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter15" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency15" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c15" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency15" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units15" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift15" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg15" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift15" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle15" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter16" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency16" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c16" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency16" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units16" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift16" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg16" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift16" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle16" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter17" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency17" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c17" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency17" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units17" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift17" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg17" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift17" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle17" value="50" />
|
||||
// Retrieval info: <generic name="gui_pll_auto_reset" value="On" />
|
||||
// Retrieval info: <generic name="gui_pll_bandwidth_preset" value="Auto" />
|
||||
// Retrieval info: <generic name="gui_en_reconf" value="false" />
|
||||
// Retrieval info: <generic name="gui_en_dps_ports" value="false" />
|
||||
// Retrieval info: <generic name="gui_en_phout_ports" value="false" />
|
||||
// Retrieval info: <generic name="gui_phout_division" value="1" />
|
||||
// Retrieval info: <generic name="gui_mif_generate" value="false" />
|
||||
// Retrieval info: <generic name="gui_enable_mif_dps" value="false" />
|
||||
// Retrieval info: <generic name="gui_dps_cntr" value="C0" />
|
||||
// Retrieval info: <generic name="gui_dps_num" value="1" />
|
||||
// Retrieval info: <generic name="gui_dps_dir" value="Positive" />
|
||||
// Retrieval info: <generic name="gui_refclk_switch" value="false" />
|
||||
// Retrieval info: <generic name="gui_refclk1_frequency" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_switchover_mode" value="Automatic Switchover" />
|
||||
// Retrieval info: <generic name="gui_switchover_delay" value="0" />
|
||||
// Retrieval info: <generic name="gui_active_clk" value="false" />
|
||||
// Retrieval info: <generic name="gui_clk_bad" value="false" />
|
||||
// Retrieval info: <generic name="gui_enable_cascade_out" value="false" />
|
||||
// Retrieval info: <generic name="gui_cascade_outclk_index" value="0" />
|
||||
// Retrieval info: <generic name="gui_enable_cascade_in" value="false" />
|
||||
// Retrieval info: <generic name="gui_pll_cascading_mode" value="Create an adjpllin signal to connect with an upstream PLL" />
|
||||
// Retrieval info: </instance>
|
||||
// IPFS_FILES : pll.vo
|
||||
// RELATED_FILES: pll.v, pll_0002.v
|
4
sys/pll/pll_0002.qip
Normal file
4
sys/pll/pll_0002.qip
Normal file
@ -0,0 +1,4 @@
|
||||
set_instance_assignment -name PLL_COMPENSATION_MODE DIRECT -to "*pll_0002*|altera_pll:altera_pll_i*|*"
|
||||
set_instance_assignment -name PLL_CHANNEL_SPACING "0.0 KHz" -to "*pll_0002*|altera_pll:altera_pll_i*|*"
|
||||
set_instance_assignment -name PLL_AUTO_RESET ON -to "*pll_0002*|altera_pll:altera_pll_i*|*"
|
||||
set_instance_assignment -name PLL_BANDWIDTH_PRESET AUTO -to "*pll_0002*|altera_pll:altera_pll_i*|*"
|
90
sys/pll/pll_0002.v
Normal file
90
sys/pll/pll_0002.v
Normal file
@ -0,0 +1,90 @@
|
||||
`timescale 1ns/10ps
|
||||
module pll_0002(
|
||||
|
||||
// interface 'refclk'
|
||||
input wire refclk,
|
||||
|
||||
// interface 'reset'
|
||||
input wire rst,
|
||||
|
||||
// interface 'outclk0'
|
||||
output wire outclk_0,
|
||||
|
||||
// interface 'outclk1'
|
||||
output wire outclk_1,
|
||||
|
||||
// interface 'locked'
|
||||
output wire locked
|
||||
);
|
||||
|
||||
altera_pll #(
|
||||
.fractional_vco_multiplier("true"),
|
||||
.reference_clock_frequency("50.0 MHz"),
|
||||
.operation_mode("direct"),
|
||||
.number_of_clocks(2),
|
||||
.output_clock_frequency0("62.668800 MHz"),
|
||||
.phase_shift0("0 ps"),
|
||||
.duty_cycle0(50),
|
||||
.output_clock_frequency1("62.668800 MHz"),
|
||||
.phase_shift1("-4351 ps"),
|
||||
.duty_cycle1(50),
|
||||
.output_clock_frequency2("0 MHz"),
|
||||
.phase_shift2("0 ps"),
|
||||
.duty_cycle2(50),
|
||||
.output_clock_frequency3("0 MHz"),
|
||||
.phase_shift3("0 ps"),
|
||||
.duty_cycle3(50),
|
||||
.output_clock_frequency4("0 MHz"),
|
||||
.phase_shift4("0 ps"),
|
||||
.duty_cycle4(50),
|
||||
.output_clock_frequency5("0 MHz"),
|
||||
.phase_shift5("0 ps"),
|
||||
.duty_cycle5(50),
|
||||
.output_clock_frequency6("0 MHz"),
|
||||
.phase_shift6("0 ps"),
|
||||
.duty_cycle6(50),
|
||||
.output_clock_frequency7("0 MHz"),
|
||||
.phase_shift7("0 ps"),
|
||||
.duty_cycle7(50),
|
||||
.output_clock_frequency8("0 MHz"),
|
||||
.phase_shift8("0 ps"),
|
||||
.duty_cycle8(50),
|
||||
.output_clock_frequency9("0 MHz"),
|
||||
.phase_shift9("0 ps"),
|
||||
.duty_cycle9(50),
|
||||
.output_clock_frequency10("0 MHz"),
|
||||
.phase_shift10("0 ps"),
|
||||
.duty_cycle10(50),
|
||||
.output_clock_frequency11("0 MHz"),
|
||||
.phase_shift11("0 ps"),
|
||||
.duty_cycle11(50),
|
||||
.output_clock_frequency12("0 MHz"),
|
||||
.phase_shift12("0 ps"),
|
||||
.duty_cycle12(50),
|
||||
.output_clock_frequency13("0 MHz"),
|
||||
.phase_shift13("0 ps"),
|
||||
.duty_cycle13(50),
|
||||
.output_clock_frequency14("0 MHz"),
|
||||
.phase_shift14("0 ps"),
|
||||
.duty_cycle14(50),
|
||||
.output_clock_frequency15("0 MHz"),
|
||||
.phase_shift15("0 ps"),
|
||||
.duty_cycle15(50),
|
||||
.output_clock_frequency16("0 MHz"),
|
||||
.phase_shift16("0 ps"),
|
||||
.duty_cycle16(50),
|
||||
.output_clock_frequency17("0 MHz"),
|
||||
.phase_shift17("0 ps"),
|
||||
.duty_cycle17(50),
|
||||
.pll_type("General"),
|
||||
.pll_subtype("General")
|
||||
) altera_pll_i (
|
||||
.rst (rst),
|
||||
.outclk ({outclk_1, outclk_0}),
|
||||
.locked (locked),
|
||||
.fboutclk ( ),
|
||||
.fbclk (1'b0),
|
||||
.refclk (refclk)
|
||||
);
|
||||
endmodule
|
||||
|
337
sys/pll_hdmi.qip
Normal file
337
sys/pll_hdmi.qip
Normal file
@ -0,0 +1,337 @@
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_TOOL_NAME "altera_pll"
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_TOOL_VERSION "17.0"
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_TOOL_ENV "mwpim"
|
||||
set_global_assignment -library "pll_hdmi" -name MISC_FILE [file join $::quartus(qip_path) "pll_hdmi.cmp"]
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_TARGETED_DEVICE_FAMILY "Cyclone V"
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_GENERATED_DEVICE_FAMILY "{Cyclone V}"
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_QSYS_MODE "UNKNOWN"
|
||||
set_global_assignment -name SYNTHESIS_ONLY_QIP ON
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_COMPONENT_NAME "cGxsX2hkbWk="
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_COMPONENT_DISPLAY_NAME "QWx0ZXJhIFBMTA=="
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_COMPONENT_REPORT_HIERARCHY "Off"
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_COMPONENT_INTERNAL "Off"
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_COMPONENT_AUTHOR "QWx0ZXJhIENvcnBvcmF0aW9u"
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_COMPONENT_VERSION "MTcuMA=="
|
||||
set_global_assignment -entity "pll_hdmi" -library "pll_hdmi" -name IP_COMPONENT_DESCRIPTION "QWx0ZXJhIFBoYXNlLUxvY2tlZCBMb29wIChBTFRFUkFfUExMKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_NAME "cGxsX2hkbWlfMDAwMg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_DISPLAY_NAME "QWx0ZXJhIFBMTA=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_REPORT_HIERARCHY "Off"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_INTERNAL "Off"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_AUTHOR "QWx0ZXJhIENvcnBvcmF0aW9u"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_VERSION "MTcuMA=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_DESCRIPTION "QWx0ZXJhIFBoYXNlLUxvY2tlZCBMb29wIChBTFRFUkFfUExMKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZGVidWdfcHJpbnRfb3V0cHV0::ZmFsc2U=::ZGVidWdfcHJpbnRfb3V0cHV0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZGVidWdfdXNlX3JiY190YWZfbWV0aG9k::ZmFsc2U=::ZGVidWdfdXNlX3JiY190YWZfbWV0aG9k"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZGV2aWNl::NUNFQkEyRjE3QTc=::ZGV2aWNl"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BsbF9tb2Rl::RnJhY3Rpb25hbC1OIFBMTA==::UExMIE1vZGU="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZnJhY3Rpb25hbF92Y29fbXVsdGlwbGllcg==::dHJ1ZQ==::ZnJhY3Rpb25hbF92Y29fbXVsdGlwbGllcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3JlZmVyZW5jZV9jbG9ja19mcmVxdWVuY3k=::NTAuMA==::UmVmZXJlbmNlIENsb2NrIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cmVmZXJlbmNlX2Nsb2NrX2ZyZXF1ZW5jeQ==::NTAuMCBNSHo=::cmVmZXJlbmNlX2Nsb2NrX2ZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2NoYW5uZWxfc3BhY2luZw==::MC4w::Q2hhbm5lbCBTcGFjaW5n"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX29wZXJhdGlvbl9tb2Rl::ZGlyZWN0::T3BlcmF0aW9uIE1vZGU="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2ZlZWRiYWNrX2Nsb2Nr::R2xvYmFsIENsb2Nr::RmVlZGJhY2sgQ2xvY2s="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2ZyYWN0aW9uYWxfY291dA==::MzI=::RnJhY3Rpb25hbCBjYXJyeSBvdXQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RzbV9vdXRfc2Vs::MXN0X29yZGVy::RFNNIE9yZGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3BlcmF0aW9uX21vZGU=::ZGlyZWN0::b3BlcmF0aW9uX21vZGU="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3VzZV9sb2NrZWQ=::ZmFsc2U=::RW5hYmxlIGxvY2tlZCBvdXRwdXQgcG9ydA=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2VuX2Fkdl9wYXJhbXM=::ZmFsc2U=::RW5hYmxlIHBoeXNpY2FsIG91dHB1dCBjbG9jayBwYXJhbWV0ZXJz"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX251bWJlcl9vZl9jbG9ja3M=::MQ==::TnVtYmVyIE9mIENsb2Nrcw=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "bnVtYmVyX29mX2Nsb2Nrcw==::MQ==::bnVtYmVyX29mX2Nsb2Nrcw=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX211bHRpcGx5X2ZhY3Rvcg==::MQ==::TXVsdGlwbHkgRmFjdG9yIChNLUNvdW50ZXIp"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2ZyYWNfbXVsdGlwbHlfZmFjdG9y::MQ==::RnJhY3Rpb25hbCBNdWx0aXBseSBGYWN0b3IgKEsp"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3Jfbg==::MQ==::RGl2aWRlIEZhY3RvciAoTi1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjA=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kw::NzQuMjU=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzA=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3Iw::OA==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjA=::MzkwODQyMDE1Mw==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMA==::Ng==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MA==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMA==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MA==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzA=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDA=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUw::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kx::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3Ix::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMQ==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MQ==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMQ==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MQ==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUx::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjI=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3ky::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzI=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3Iy::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjI=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMg==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5Mg==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMg==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0Mg==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzI=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDI=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUy::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjM=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kz::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzM=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3Iz::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjM=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMw==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5Mw==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMw==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0Mw==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzM=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDM=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUz::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjQ=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k0::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzQ=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I0::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjQ=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yNA==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5NA==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzNA==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0NA==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzQ=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDQ=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU0::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjU=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k1::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzU=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I1::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjU=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yNQ==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5NQ==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzNQ==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0NQ==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzU=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDU=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU1::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjY=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k2::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzY=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I2::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjY=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yNg==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5Ng==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzNg==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0Ng==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzY=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDY=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU2::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjc=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k3::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzc=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I3::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3Rvcjc=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yNw==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5Nw==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzNw==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0Nw==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzc=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDc=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU3::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjg=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k4::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzg=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I4::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3Rvcjg=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yOA==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5OA==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzOA==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0OA==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzg=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDg=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU4::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjk=::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3k5::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzk=::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3I5::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3Rvcjk=::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yOQ==::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5OQ==::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzOQ==::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0OQ==::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzk=::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDk=::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGU5::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjEw::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxMA==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzEw::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxMA==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjEw::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTA=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTA=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTA=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTA=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzEw::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDEw::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxMA==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjEx::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxMQ==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzEx::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxMQ==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjEx::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTE=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTE=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTE=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTE=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzEx::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDEx::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxMQ==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjEy::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxMg==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzEy::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxMg==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjEy::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTI=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTI=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTI=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTI=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzEy::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDEy::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxMg==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjEz::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxMw==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzEz::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxMw==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjEz::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTM=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTM=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTM=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTM=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzEz::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDEz::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxMw==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE0::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxNA==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE0::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxNA==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE0::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTQ=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTQ=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTQ=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTQ=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE0::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE0::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxNA==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE1::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxNQ==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE1::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxNQ==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE1::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTU=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTU=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTU=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTU=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE1::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE1::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxNQ==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE2::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxNg==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE2::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxNg==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE2::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTY=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTY=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTY=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTY=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE2::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE2::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxNg==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Nhc2NhZGVfY291bnRlcjE3::ZmFsc2U=::TWFrZSB0aGlzIGEgY2FzY2FkZSBjb3VudGVy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX291dHB1dF9jbG9ja19mcmVxdWVuY3kxNw==::MTAwLjA=::RGVzaXJlZCBGcmVxdWVuY3k="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2RpdmlkZV9mYWN0b3JfYzE3::MQ==::RGl2aWRlIEZhY3RvciAoQy1Db3VudGVyKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9tdWx0aXBseV9mYWN0b3IxNw==::MQ==::QWN0dWFsIE11bHRpcGx5IEZhY3Rvcg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9mcmFjX211bHRpcGx5X2ZhY3RvcjE3::MQ==::QWN0dWFsIEZyYWN0aW9uYWwgTXVsdGlwbHkgRmFjdG9yIChLKQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9kaXZpZGVfZmFjdG9yMTc=::MQ==::QWN0dWFsIERpdmlkZSBGYWN0b3I="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9vdXRwdXRfY2xvY2tfZnJlcXVlbmN5MTc=::MCBNSHo=::QWN0dWFsIEZyZXF1ZW5jeQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BzX3VuaXRzMTc=::cHM=::UGhhc2UgU2hpZnQgdW5pdHM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0MTc=::MA==::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BoYXNlX3NoaWZ0X2RlZzE3::MC4w::UGhhc2UgU2hpZnQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2FjdHVhbF9waGFzZV9zaGlmdDE3::MA==::QWN0dWFsIFBoYXNlIFNoaWZ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2R1dHlfY3ljbGUxNw==::NTA=::RHV0eSBDeWNsZQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTA=::NzQuMjUwMDAwIE1Ieg==::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTA="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQw::MCBwcw==::cGhhc2Vfc2hpZnQw"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTA=::NTA=::ZHV0eV9jeWNsZTA="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQx::MCBwcw==::cGhhc2Vfc2hpZnQx"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE=::NTA=::ZHV0eV9jeWNsZTE="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTI=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTI="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQy::MCBwcw==::cGhhc2Vfc2hpZnQy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTI=::NTA=::ZHV0eV9jeWNsZTI="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTM=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQz::MCBwcw==::cGhhc2Vfc2hpZnQz"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTM=::NTA=::ZHV0eV9jeWNsZTM="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTQ=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ0::MCBwcw==::cGhhc2Vfc2hpZnQ0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTQ=::NTA=::ZHV0eV9jeWNsZTQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTU=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTU="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ1::MCBwcw==::cGhhc2Vfc2hpZnQ1"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTU=::NTA=::ZHV0eV9jeWNsZTU="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTY=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTY="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ2::MCBwcw==::cGhhc2Vfc2hpZnQ2"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTY=::NTA=::ZHV0eV9jeWNsZTY="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTc=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTc="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ3::MCBwcw==::cGhhc2Vfc2hpZnQ3"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTc=::NTA=::ZHV0eV9jeWNsZTc="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTg=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTg="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ4::MCBwcw==::cGhhc2Vfc2hpZnQ4"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTg=::NTA=::ZHV0eV9jeWNsZTg="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTk=::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTk="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQ5::MCBwcw==::cGhhc2Vfc2hpZnQ5"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTk=::NTA=::ZHV0eV9jeWNsZTk="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEw::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEw"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxMA==::MCBwcw==::cGhhc2Vfc2hpZnQxMA=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTEw::NTA=::ZHV0eV9jeWNsZTEw"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEx::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEx"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxMQ==::MCBwcw==::cGhhc2Vfc2hpZnQxMQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTEx::NTA=::ZHV0eV9jeWNsZTEx"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEy::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxMg==::MCBwcw==::cGhhc2Vfc2hpZnQxMg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTEy::NTA=::ZHV0eV9jeWNsZTEy"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEz::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTEz"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxMw==::MCBwcw==::cGhhc2Vfc2hpZnQxMw=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTEz::NTA=::ZHV0eV9jeWNsZTEz"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE0::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxNA==::MCBwcw==::cGhhc2Vfc2hpZnQxNA=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE0::NTA=::ZHV0eV9jeWNsZTE0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE1::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE1"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxNQ==::MCBwcw==::cGhhc2Vfc2hpZnQxNQ=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE1::NTA=::ZHV0eV9jeWNsZTE1"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE2::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE2"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxNg==::MCBwcw==::cGhhc2Vfc2hpZnQxNg=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE2::NTA=::ZHV0eV9jeWNsZTE2"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE3::MCBNSHo=::b3V0cHV0X2Nsb2NrX2ZyZXF1ZW5jeTE3"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGhhc2Vfc2hpZnQxNw==::MCBwcw==::cGhhc2Vfc2hpZnQxNw=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "ZHV0eV9jeWNsZTE3::NTA=::ZHV0eV9jeWNsZTE3"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BsbF9hdXRvX3Jlc2V0::T24=::UExMIEF1dG8gUmVzZXQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BsbF9iYW5kd2lkdGhfcHJlc2V0::QXV0bw==::UExMIEJhbmR3aWR0aCBQcmVzZXQ="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2VuX3JlY29uZg==::ZmFsc2U=::RW5hYmxlIGR5bmFtaWMgcmVjb25maWd1cmF0aW9uIG9mIFBMTA=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2VuX2Rwc19wb3J0cw==::ZmFsc2U=::RW5hYmxlIGFjY2VzcyB0byBkeW5hbWljIHBoYXNlIHNoaWZ0IHBvcnRz"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2VuX3Bob3V0X3BvcnRz::ZmFsc2U=::RW5hYmxlIGFjY2VzcyB0byBQTEwgRFBBIG91dHB1dCBwb3J0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGxsX3R5cGU=::R2VuZXJhbA==::UExMIFRZUEU="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "cGxsX3N1YnR5cGU=::R2VuZXJhbA==::UExMIFNVQlRZUEU="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BhcmFtZXRlcl9saXN0::TS1Db3VudGVyIEhpIERpdmlkZSxNLUNvdW50ZXIgTG93IERpdmlkZSxOLUNvdW50ZXIgSGkgRGl2aWRlLE4tQ291bnRlciBMb3cgRGl2aWRlLE0tQ291bnRlciBCeXBhc3MgRW5hYmxlLE4tQ291bnRlciBCeXBhc3MgRW5hYmxlLE0tQ291bnRlciBPZGQgRGl2aWRlIEVuYWJsZSxOLUNvdW50ZXIgT2RkIERpdmlkZSBFbmFibGUsQy1Db3VudGVyLTAgSGkgRGl2aWRlLEMtQ291bnRlci0wIExvdyBEaXZpZGUsQy1Db3VudGVyLTAgQ29hcnNlIFBoYXNlIFNoaWZ0LEMtQ291bnRlci0wIFZDTyBQaGFzZSBUYXAsQy1Db3VudGVyLTAgSW5wdXQgU291cmNlLEMtQ291bnRlci0wIEJ5cGFzcyBFbmFibGUsQy1Db3VudGVyLTAgT2RkIERpdmlkZSBFbmFibGUsVkNPIFBvc3QgRGl2aWRlIENvdW50ZXIgRW5hYmxlLENoYXJnZSBQdW1wIGN1cnJlbnQgKHVBKSxMb29wIEZpbHRlciBCYW5kd2lkdGggUmVzaXN0b3IgKE9obXMpICxQTEwgT3V0cHV0IFZDTyBGcmVxdWVuY3ksSy1GcmFjdGlvbmFsIERpdmlzaW9uIFZhbHVlIChEU00pLEZlZWRiYWNrIENsb2NrIFR5cGUsRmVlZGJhY2sgQ2xvY2sgTVVYIDEsRmVlZGJhY2sgQ2xvY2sgTVVYIDIsTSBDb3VudGVyIFNvdXJjZSBNVVgsUExMIEF1dG8gUmVzZXQ=::UGFyYW1ldGVyIE5hbWVz"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3BhcmFtZXRlcl92YWx1ZXM=::NCw0LDI1NiwyNTYsZmFsc2UsdHJ1ZSxmYWxzZSxmYWxzZSwzLDMsMSwwLHBoX211eF9jbGssZmFsc2UsZmFsc2UsMiwyMCw0MDAwLDQ0NS40OTk5OTkgTUh6LDM5MDg0MjAxNTMsbm9uZSxnbGIsbV9jbnQscGhfbXV4X2Nsayx0cnVl::UGFyYW1ldGVyIFZhbHVlcw=="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX21pZl9nZW5lcmF0ZQ==::ZmFsc2U=::R2VuZXJhdGUgTUlGIGZpbGU="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2VuYWJsZV9taWZfZHBz::ZmFsc2U=::RW5hYmxlIER5bmFtaWMgUGhhc2UgU2hpZnQgZm9yIE1JRiBzdHJlYW1pbmc="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Rwc19jbnRy::QzA=::RFBTIENvdW50ZXIgU2VsZWN0aW9u"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Rwc19udW0=::MQ==::TnVtYmVyIG9mIER5bmFtaWMgUGhhc2UgU2hpZnRz"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2Rwc19kaXI=::UG9zaXRpdmU=::RHluYW1pYyBQaGFzZSBTaGlmdCBEaXJlY3Rpb24="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX3JlZmNsa19zd2l0Y2g=::ZmFsc2U=::Q3JlYXRlIGEgc2Vjb25kIGlucHV0IGNsayAncmVmY2xrMSc="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2VuYWJsZV9jYXNjYWRlX291dA==::ZmFsc2U=::Q3JlYXRlIGEgJ2Nhc2NhZGVfb3V0JyBzaWduYWwgdG8gY29ubmVjdCB3aXRoIGEgZG93bnN0cmVhbSBQTEw="
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_COMPONENT_PARAMETER "Z3VpX2VuYWJsZV9jYXNjYWRlX2lu::ZmFsc2U=::Q3JlYXRlIGFuIGFkanBsbGluIG9yIGNjbGsgc2lnbmFsIHRvIGNvbm5lY3Qgd2l0aCBhbiB1cHN0cmVhbSBQTEw="
|
||||
|
||||
set_global_assignment -library "pll_hdmi" -name VERILOG_FILE [file join $::quartus(qip_path) "pll_hdmi.v"]
|
||||
set_global_assignment -library "pll_hdmi" -name VERILOG_FILE [file join $::quartus(qip_path) "pll_hdmi/pll_hdmi_0002.v"]
|
||||
set_global_assignment -library "pll_hdmi" -name QIP_FILE [file join $::quartus(qip_path) "pll_hdmi/pll_hdmi_0002.qip"]
|
||||
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_TOOL_NAME "altera_pll"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_TOOL_VERSION "17.0"
|
||||
set_global_assignment -entity "pll_hdmi_0002" -library "pll_hdmi" -name IP_TOOL_ENV "mwpim"
|
252
sys/pll_hdmi.v
Normal file
252
sys/pll_hdmi.v
Normal file
@ -0,0 +1,252 @@
|
||||
// megafunction wizard: %Altera PLL v17.0%
|
||||
// GENERATION: XML
|
||||
// pll_hdmi.v
|
||||
|
||||
// Generated using ACDS version 17.0 598
|
||||
|
||||
`timescale 1 ps / 1 ps
|
||||
module pll_hdmi (
|
||||
input wire refclk, // refclk.clk
|
||||
input wire rst, // reset.reset
|
||||
output wire outclk_0 // outclk0.clk
|
||||
);
|
||||
|
||||
pll_hdmi_0002 pll_hdmi_inst (
|
||||
.refclk (refclk), // refclk.clk
|
||||
.rst (rst), // reset.reset
|
||||
.outclk_0 (outclk_0), // outclk0.clk
|
||||
.locked () // (terminated)
|
||||
);
|
||||
|
||||
endmodule
|
||||
// Retrieval info: <?xml version="1.0"?>
|
||||
//<!--
|
||||
// Generated by Altera MegaWizard Launcher Utility version 1.0
|
||||
// ************************************************************
|
||||
// THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE!
|
||||
// ************************************************************
|
||||
// Copyright (C) 1991-2017 Altera Corporation
|
||||
// Any megafunction design, and related net list (encrypted or decrypted),
|
||||
// support information, device programming or simulation file, and any other
|
||||
// associated documentation or information provided by Altera or a partner
|
||||
// under Altera's Megafunction Partnership Program may be used only to
|
||||
// program PLD devices (but not masked PLD devices) from Altera. Any other
|
||||
// use of such megafunction design, net list, support information, device
|
||||
// programming or simulation file, or any other related documentation or
|
||||
// information is prohibited for any other purpose, including, but not
|
||||
// limited to modification, reverse engineering, de-compiling, or use with
|
||||
// any other silicon devices, unless such use is explicitly licensed under
|
||||
// a separate agreement with Altera or a megafunction partner. Title to
|
||||
// the intellectual property, including patents, copyrights, trademarks,
|
||||
// trade secrets, or maskworks, embodied in any such megafunction design,
|
||||
// net list, support information, device programming or simulation file, or
|
||||
// any other related documentation or information provided by Altera or a
|
||||
// megafunction partner, remains with Altera, the megafunction partner, or
|
||||
// their respective licensors. No other licenses, including any licenses
|
||||
// needed under any third party's intellectual property, are provided herein.
|
||||
//-->
|
||||
// Retrieval info: <instance entity-name="altera_pll" version="17.0" >
|
||||
// Retrieval info: <generic name="debug_print_output" value="false" />
|
||||
// Retrieval info: <generic name="debug_use_rbc_taf_method" value="false" />
|
||||
// Retrieval info: <generic name="device_family" value="Cyclone V" />
|
||||
// Retrieval info: <generic name="device" value="5CEBA2F17A7" />
|
||||
// Retrieval info: <generic name="gui_device_speed_grade" value="2" />
|
||||
// Retrieval info: <generic name="gui_pll_mode" value="Fractional-N PLL" />
|
||||
// Retrieval info: <generic name="gui_reference_clock_frequency" value="50.0" />
|
||||
// Retrieval info: <generic name="gui_channel_spacing" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_operation_mode" value="direct" />
|
||||
// Retrieval info: <generic name="gui_feedback_clock" value="Global Clock" />
|
||||
// Retrieval info: <generic name="gui_fractional_cout" value="32" />
|
||||
// Retrieval info: <generic name="gui_dsm_out_sel" value="1st_order" />
|
||||
// Retrieval info: <generic name="gui_use_locked" value="false" />
|
||||
// Retrieval info: <generic name="gui_en_adv_params" value="false" />
|
||||
// Retrieval info: <generic name="gui_number_of_clocks" value="1" />
|
||||
// Retrieval info: <generic name="gui_multiply_factor" value="1" />
|
||||
// Retrieval info: <generic name="gui_frac_multiply_factor" value="1" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_n" value="1" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter0" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency0" value="74.25" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c0" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency0" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units0" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift0" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg0" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift0" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle0" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter1" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency1" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c1" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency1" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units1" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift1" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg1" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift1" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle1" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter2" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency2" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c2" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency2" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units2" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift2" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg2" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift2" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle2" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter3" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency3" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c3" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency3" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units3" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift3" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg3" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift3" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle3" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter4" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency4" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c4" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency4" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units4" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift4" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg4" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift4" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle4" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter5" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency5" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c5" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency5" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units5" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift5" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg5" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift5" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle5" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter6" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency6" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c6" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency6" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units6" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift6" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg6" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift6" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle6" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter7" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency7" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c7" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency7" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units7" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift7" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg7" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift7" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle7" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter8" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency8" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c8" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency8" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units8" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift8" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg8" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift8" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle8" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter9" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency9" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c9" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency9" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units9" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift9" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg9" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift9" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle9" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter10" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency10" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c10" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency10" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units10" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift10" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg10" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift10" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle10" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter11" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency11" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c11" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency11" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units11" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift11" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg11" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift11" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle11" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter12" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency12" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c12" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency12" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units12" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift12" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg12" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift12" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle12" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter13" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency13" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c13" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency13" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units13" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift13" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg13" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift13" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle13" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter14" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency14" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c14" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency14" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units14" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift14" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg14" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift14" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle14" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter15" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency15" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c15" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency15" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units15" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift15" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg15" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift15" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle15" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter16" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency16" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c16" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency16" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units16" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift16" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg16" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift16" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle16" value="50" />
|
||||
// Retrieval info: <generic name="gui_cascade_counter17" value="false" />
|
||||
// Retrieval info: <generic name="gui_output_clock_frequency17" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_divide_factor_c17" value="1" />
|
||||
// Retrieval info: <generic name="gui_actual_output_clock_frequency17" value="0 MHz" />
|
||||
// Retrieval info: <generic name="gui_ps_units17" value="ps" />
|
||||
// Retrieval info: <generic name="gui_phase_shift17" value="0" />
|
||||
// Retrieval info: <generic name="gui_phase_shift_deg17" value="0.0" />
|
||||
// Retrieval info: <generic name="gui_actual_phase_shift17" value="0" />
|
||||
// Retrieval info: <generic name="gui_duty_cycle17" value="50" />
|
||||
// Retrieval info: <generic name="gui_pll_auto_reset" value="On" />
|
||||
// Retrieval info: <generic name="gui_pll_bandwidth_preset" value="Auto" />
|
||||
// Retrieval info: <generic name="gui_en_reconf" value="false" />
|
||||
// Retrieval info: <generic name="gui_en_dps_ports" value="false" />
|
||||
// Retrieval info: <generic name="gui_en_phout_ports" value="false" />
|
||||
// Retrieval info: <generic name="gui_phout_division" value="1" />
|
||||
// Retrieval info: <generic name="gui_mif_generate" value="false" />
|
||||
// Retrieval info: <generic name="gui_enable_mif_dps" value="false" />
|
||||
// Retrieval info: <generic name="gui_dps_cntr" value="C0" />
|
||||
// Retrieval info: <generic name="gui_dps_num" value="1" />
|
||||
// Retrieval info: <generic name="gui_dps_dir" value="Positive" />
|
||||
// Retrieval info: <generic name="gui_refclk_switch" value="false" />
|
||||
// Retrieval info: <generic name="gui_refclk1_frequency" value="100.0" />
|
||||
// Retrieval info: <generic name="gui_switchover_mode" value="Automatic Switchover" />
|
||||
// Retrieval info: <generic name="gui_switchover_delay" value="0" />
|
||||
// Retrieval info: <generic name="gui_active_clk" value="false" />
|
||||
// Retrieval info: <generic name="gui_clk_bad" value="false" />
|
||||
// Retrieval info: <generic name="gui_enable_cascade_out" value="false" />
|
||||
// Retrieval info: <generic name="gui_cascade_outclk_index" value="0" />
|
||||
// Retrieval info: <generic name="gui_enable_cascade_in" value="false" />
|
||||
// Retrieval info: <generic name="gui_pll_cascading_mode" value="Create an adjpllin signal to connect with an upstream PLL" />
|
||||
// Retrieval info: </instance>
|
||||
// IPFS_FILES : pll_hdmi.vo
|
||||
// RELATED_FILES: pll_hdmi.v, pll_hdmi_0002.v
|
4
sys/pll_hdmi/pll_hdmi_0002.qip
Normal file
4
sys/pll_hdmi/pll_hdmi_0002.qip
Normal file
@ -0,0 +1,4 @@
|
||||
set_instance_assignment -name PLL_COMPENSATION_MODE DIRECT -to "*pll_hdmi_0002*|altera_pll:altera_pll_i*|*"
|
||||
set_instance_assignment -name PLL_CHANNEL_SPACING "0.0 KHz" -to "*pll_hdmi_0002*|altera_pll:altera_pll_i*|*"
|
||||
set_instance_assignment -name PLL_AUTO_RESET ON -to "*pll_hdmi_0002*|altera_pll:altera_pll_i*|*"
|
||||
set_instance_assignment -name PLL_BANDWIDTH_PRESET AUTO -to "*pll_hdmi_0002*|altera_pll:altera_pll_i*|*"
|
87
sys/pll_hdmi/pll_hdmi_0002.v
Normal file
87
sys/pll_hdmi/pll_hdmi_0002.v
Normal file
@ -0,0 +1,87 @@
|
||||
`timescale 1ns/10ps
|
||||
module pll_hdmi_0002(
|
||||
|
||||
// interface 'refclk'
|
||||
input wire refclk,
|
||||
|
||||
// interface 'reset'
|
||||
input wire rst,
|
||||
|
||||
// interface 'outclk0'
|
||||
output wire outclk_0,
|
||||
|
||||
// interface 'locked'
|
||||
output wire locked
|
||||
);
|
||||
|
||||
altera_pll #(
|
||||
.fractional_vco_multiplier("true"),
|
||||
.reference_clock_frequency("50.0 MHz"),
|
||||
.operation_mode("direct"),
|
||||
.number_of_clocks(1),
|
||||
.output_clock_frequency0("74.250000 MHz"),
|
||||
.phase_shift0("0 ps"),
|
||||
.duty_cycle0(50),
|
||||
.output_clock_frequency1("0 MHz"),
|
||||
.phase_shift1("0 ps"),
|
||||
.duty_cycle1(50),
|
||||
.output_clock_frequency2("0 MHz"),
|
||||
.phase_shift2("0 ps"),
|
||||
.duty_cycle2(50),
|
||||
.output_clock_frequency3("0 MHz"),
|
||||
.phase_shift3("0 ps"),
|
||||
.duty_cycle3(50),
|
||||
.output_clock_frequency4("0 MHz"),
|
||||
.phase_shift4("0 ps"),
|
||||
.duty_cycle4(50),
|
||||
.output_clock_frequency5("0 MHz"),
|
||||
.phase_shift5("0 ps"),
|
||||
.duty_cycle5(50),
|
||||
.output_clock_frequency6("0 MHz"),
|
||||
.phase_shift6("0 ps"),
|
||||
.duty_cycle6(50),
|
||||
.output_clock_frequency7("0 MHz"),
|
||||
.phase_shift7("0 ps"),
|
||||
.duty_cycle7(50),
|
||||
.output_clock_frequency8("0 MHz"),
|
||||
.phase_shift8("0 ps"),
|
||||
.duty_cycle8(50),
|
||||
.output_clock_frequency9("0 MHz"),
|
||||
.phase_shift9("0 ps"),
|
||||
.duty_cycle9(50),
|
||||
.output_clock_frequency10("0 MHz"),
|
||||
.phase_shift10("0 ps"),
|
||||
.duty_cycle10(50),
|
||||
.output_clock_frequency11("0 MHz"),
|
||||
.phase_shift11("0 ps"),
|
||||
.duty_cycle11(50),
|
||||
.output_clock_frequency12("0 MHz"),
|
||||
.phase_shift12("0 ps"),
|
||||
.duty_cycle12(50),
|
||||
.output_clock_frequency13("0 MHz"),
|
||||
.phase_shift13("0 ps"),
|
||||
.duty_cycle13(50),
|
||||
.output_clock_frequency14("0 MHz"),
|
||||
.phase_shift14("0 ps"),
|
||||
.duty_cycle14(50),
|
||||
.output_clock_frequency15("0 MHz"),
|
||||
.phase_shift15("0 ps"),
|
||||
.duty_cycle15(50),
|
||||
.output_clock_frequency16("0 MHz"),
|
||||
.phase_shift16("0 ps"),
|
||||
.duty_cycle16(50),
|
||||
.output_clock_frequency17("0 MHz"),
|
||||
.phase_shift17("0 ps"),
|
||||
.duty_cycle17(50),
|
||||
.pll_type("General"),
|
||||
.pll_subtype("General")
|
||||
) altera_pll_i (
|
||||
.rst (rst),
|
||||
.outclk ({outclk_0}),
|
||||
.locked (locked),
|
||||
.fboutclk ( ),
|
||||
.fbclk (1'b0),
|
||||
.refclk (refclk)
|
||||
);
|
||||
endmodule
|
||||
|
186
sys/scandoubler.v
Normal file
186
sys/scandoubler.v
Normal file
@ -0,0 +1,186 @@
|
||||
//
|
||||
// scandoubler.v
|
||||
//
|
||||
// Copyright (c) 2015 Till Harbaum <till@harbaum.org>
|
||||
// Copyright (c) 2017 Sorgelig
|
||||
//
|
||||
// This source file 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 source file 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 <http://www.gnu.org/licenses/>.
|
||||
|
||||
// TODO: Delay vsync one line
|
||||
|
||||
module scandoubler #(parameter LENGTH, parameter HALF_DEPTH)
|
||||
(
|
||||
// system interface
|
||||
input clk_sys,
|
||||
input ce_pix,
|
||||
output ce_pix_out,
|
||||
|
||||
input hq2x,
|
||||
|
||||
// shifter video interface
|
||||
input hs_in,
|
||||
input vs_in,
|
||||
input hb_in,
|
||||
input vb_in,
|
||||
|
||||
input [DWIDTH:0] r_in,
|
||||
input [DWIDTH:0] g_in,
|
||||
input [DWIDTH:0] b_in,
|
||||
input mono,
|
||||
|
||||
// output interface
|
||||
output reg hs_out,
|
||||
output vs_out,
|
||||
output hb_out,
|
||||
output vb_out,
|
||||
output [DWIDTH:0] r_out,
|
||||
output [DWIDTH:0] g_out,
|
||||
output [DWIDTH:0] b_out
|
||||
);
|
||||
|
||||
|
||||
localparam DWIDTH = HALF_DEPTH ? 3 : 7;
|
||||
|
||||
assign vs_out = vs_in;
|
||||
assign ce_pix_out = ce_x4;
|
||||
|
||||
//Compensate picture shift after HQ2x
|
||||
assign vb_out = vbo[2];
|
||||
assign hb_out = &hbo[5:4];
|
||||
|
||||
reg [7:0] pix_len = 0;
|
||||
wire [7:0] pl = pix_len + 1'b1;
|
||||
|
||||
reg ce_x1, ce_x4;
|
||||
reg req_line_reset;
|
||||
always @(negedge clk_sys) begin
|
||||
reg old_ce;
|
||||
reg [2:0] ce_cnt;
|
||||
|
||||
reg [7:0] pixsz2, pixsz4 = 0;
|
||||
|
||||
old_ce <= ce_pix;
|
||||
if(~&pix_len) pix_len <= pix_len + 1'd1;
|
||||
|
||||
ce_x4 <= 0;
|
||||
ce_x1 <= 0;
|
||||
|
||||
// use such odd comparison to place ce_x4 evenly if master clock isn't multiple 4.
|
||||
if((pl == pixsz4) || (pl == pixsz2) || (pl == (pixsz2+pixsz4))) begin
|
||||
ce_x4 <= 1;
|
||||
end
|
||||
|
||||
if(~old_ce & ce_pix) begin
|
||||
pixsz2 <= {1'b0, pl[7:1]};
|
||||
pixsz4 <= {2'b00, pl[7:2]};
|
||||
ce_x1 <= 1;
|
||||
ce_x4 <= 1;
|
||||
pix_len <= 0;
|
||||
req_line_reset <= 0;
|
||||
|
||||
if(hb_in) req_line_reset <= 1;
|
||||
end
|
||||
end
|
||||
|
||||
localparam AWIDTH = `BITS_TO_FIT(LENGTH);
|
||||
Hq2x #(.LENGTH(LENGTH), .HALF_DEPTH(HALF_DEPTH)) Hq2x
|
||||
(
|
||||
.clk(clk_sys),
|
||||
.ce_x4(ce_x4),
|
||||
.inputpixel({b_d,g_d,r_d}),
|
||||
.mono(mono),
|
||||
.disable_hq2x(~hq2x),
|
||||
.reset_frame(vs_in),
|
||||
.reset_line(req_line_reset),
|
||||
.read_y(sd_line),
|
||||
.read_x(sd_h),
|
||||
.outpixel({b_out,g_out,r_out})
|
||||
);
|
||||
|
||||
reg [10:0] sd_h;
|
||||
reg [1:0] sd_line;
|
||||
reg [2:0] vbo;
|
||||
reg [5:0] hbo;
|
||||
|
||||
reg [DWIDTH:0] r_d;
|
||||
reg [DWIDTH:0] g_d;
|
||||
reg [DWIDTH:0] b_d;
|
||||
|
||||
|
||||
always @(posedge clk_sys) begin
|
||||
|
||||
reg [11:0] hs_max,hs_rise;
|
||||
reg [10:0] hcnt;
|
||||
reg [11:0] sd_hcnt;
|
||||
reg [11:0] hde_start, hde_end;
|
||||
|
||||
reg hs, hs2, vs, hb;
|
||||
|
||||
if(ce_x1) begin
|
||||
hs <= hs_in;
|
||||
hb <= hb_in;
|
||||
|
||||
r_d <= r_in;
|
||||
g_d <= g_in;
|
||||
b_d <= b_in;
|
||||
|
||||
if(hb && !hb_in) begin
|
||||
hde_start <= {hcnt,1'b0};
|
||||
vbo <= {vbo[1:0], vb_in};
|
||||
end
|
||||
if(!hb && hb_in) hde_end <= {hcnt,1'b0};
|
||||
|
||||
// falling edge of hsync indicates start of line
|
||||
if(hs && !hs_in) begin
|
||||
hs_max <= {hcnt,1'b1};
|
||||
hcnt <= 0;
|
||||
end else begin
|
||||
hcnt <= hcnt + 1'd1;
|
||||
end
|
||||
|
||||
// save position of rising edge
|
||||
if(!hs && hs_in) hs_rise <= {hcnt,1'b1};
|
||||
|
||||
vs <= vs_in;
|
||||
if(vs && ~vs_in) sd_line <= 0;
|
||||
end
|
||||
|
||||
if(ce_x4) begin
|
||||
hs2 <= hs_in;
|
||||
hbo[5:1] <= hbo[4:0];
|
||||
|
||||
// output counter synchronous to input and at twice the rate
|
||||
sd_hcnt <= sd_hcnt + 1'd1;
|
||||
if(~&hbo) sd_h <= sd_h + 1'd1;
|
||||
|
||||
if(hs2 && !hs_in) sd_hcnt <= hs_max;
|
||||
if(sd_hcnt == hs_max) sd_hcnt <= 0;
|
||||
|
||||
|
||||
//prepare to read in advance
|
||||
if(sd_hcnt == (hde_start-2)) begin
|
||||
sd_h <= 0;
|
||||
sd_line <= sd_line + 1'd1;
|
||||
end
|
||||
|
||||
if(sd_hcnt == hde_start) hbo[0] <= 0;
|
||||
if(sd_hcnt == hde_end) hbo[0] <= 1;
|
||||
|
||||
// replicate horizontal sync at twice the speed
|
||||
if(sd_hcnt == hs_max) hs_out <= 0;
|
||||
if(sd_hcnt == hs_rise) hs_out <= 1;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
194
sys/sdram.sv
Normal file
194
sys/sdram.sv
Normal file
@ -0,0 +1,194 @@
|
||||
//
|
||||
//
|
||||
// sdram controller implementation for the MiST/MiSTer boards
|
||||
//
|
||||
// Copyright (c) 2015 Till Harbaum <till@harbaum.org>
|
||||
// Copyright (c) 2017 Sorgelig
|
||||
//
|
||||
// This source file 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 source file 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 <http://www.gnu.org/licenses/>.
|
||||
//
|
||||
|
||||
//
|
||||
//
|
||||
// This SDRAM module provides/writes the data in 8 cycles of clock.
|
||||
// So, with 64MHz of system clock, it can emulate 8MHz asynchronous DRAM.
|
||||
//
|
||||
//
|
||||
|
||||
module sdram
|
||||
(
|
||||
|
||||
// interface to the MT48LC16M16 chip
|
||||
inout [15:0] sd_data, // 16 bit bidirectional data bus
|
||||
output reg [12:0] sd_addr, // 13 bit multiplexed address bus
|
||||
output reg [1:0] sd_dqm, // two byte masks
|
||||
output reg [1:0] sd_ba, // two banks
|
||||
output sd_cs, // a single chip select
|
||||
output sd_we, // write enable
|
||||
output sd_ras, // row address select
|
||||
output sd_cas, // columns address select
|
||||
|
||||
// cpu/chipset interface
|
||||
input init, // init signal after FPGA config to initialize RAM
|
||||
input clk, // sdram is accessed at 64MHz
|
||||
input sync,
|
||||
|
||||
input [15:0] din, // data input from chipset/cpu
|
||||
output reg [15:0] dout, // data output to chipset/cpu
|
||||
input [23:0] addr, // 24 bit word address
|
||||
input [1:0] ds, // upper/lower data strobe
|
||||
input oe, // cpu/chipset requests read
|
||||
input we // cpu/chipset requests write
|
||||
);
|
||||
|
||||
localparam RASCAS_DELAY = 3'd2; // tRCD=20ns -> 3 cycles@128MHz
|
||||
localparam BURST_LENGTH = 3'b000; // 000=1, 001=2, 010=4, 011=8
|
||||
localparam ACCESS_TYPE = 1'b0; // 0=sequential, 1=interleaved
|
||||
localparam CAS_LATENCY = 3'd2; // 2/3 allowed
|
||||
localparam OP_MODE = 2'b00; // only 00 (standard operation) allowed
|
||||
localparam NO_WRITE_BURST = 1'b1; // 0= write burst enabled, 1=only single access write
|
||||
|
||||
localparam MODE = { 3'b000, NO_WRITE_BURST, OP_MODE, CAS_LATENCY, ACCESS_TYPE, BURST_LENGTH};
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// ------------------------ cycle state machine ------------------------
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
// The state machine runs at 128Mhz synchronous to the 8 Mhz chipset clock.
|
||||
// It wraps from T15 to T0 on the rising edge of clk_8
|
||||
|
||||
localparam STATE_FIRST = 3'd0; // first state in cycle
|
||||
localparam STATE_CMD_START = 3'd1; // state in which a new command can be started
|
||||
localparam STATE_CMD_CONT = STATE_CMD_START + RASCAS_DELAY; // command can be continued
|
||||
localparam STATE_READ = STATE_CMD_CONT + CAS_LATENCY + 4'd1;
|
||||
localparam STATE_HIGHZ = STATE_READ - 4'd1; // disable output to prevent contention
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// --------------------------- startup/reset ---------------------------
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
// wait 1ms (32 8Mhz cycles) after FPGA config is done before going
|
||||
// into normal operation. Initialize the ram in the last 16 reset cycles (cycles 15-0)
|
||||
reg [4:0] reset;
|
||||
always @(posedge clk) begin
|
||||
if(init) reset <= 5'h1f;
|
||||
else if((stage == STATE_FIRST) && (reset != 0))
|
||||
reset <= reset - 5'd1;
|
||||
end
|
||||
|
||||
// ---------------------------------------------------------------------
|
||||
// ------------------ generate ram control signals ---------------------
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
// all possible commands
|
||||
localparam CMD_INHIBIT = 4'b1111;
|
||||
localparam CMD_NOP = 4'b0111;
|
||||
localparam CMD_ACTIVE = 4'b0011;
|
||||
localparam CMD_READ = 4'b0101;
|
||||
localparam CMD_WRITE = 4'b0100;
|
||||
localparam CMD_BURST_TERMINATE = 4'b0110;
|
||||
localparam CMD_PRECHARGE = 4'b0010;
|
||||
localparam CMD_AUTO_REFRESH = 4'b0001;
|
||||
localparam CMD_LOAD_MODE = 4'b0000;
|
||||
|
||||
reg [3:0] sd_cmd; // current command sent to sd ram
|
||||
|
||||
// drive control signals according to current command
|
||||
assign sd_cs = sd_cmd[3];
|
||||
assign sd_ras = sd_cmd[2];
|
||||
assign sd_cas = sd_cmd[1];
|
||||
assign sd_we = sd_cmd[0];
|
||||
|
||||
// drive ram data lines when writing, set them as inputs otherwise
|
||||
assign sd_data = mode[1] ? din_r : 16'bZZZZZZZZZZZZZZZZ;
|
||||
|
||||
reg [1:0] mode;
|
||||
reg [15:0] din_r;
|
||||
reg [2:0] stage;
|
||||
|
||||
always @(posedge clk) begin
|
||||
reg [12:0] addr_r;
|
||||
reg [1:0] ds_r;
|
||||
reg old_sync;
|
||||
|
||||
if(|stage) stage <= stage + 1'd1;
|
||||
|
||||
old_sync <= sync;
|
||||
if(~old_sync & sync) stage <= 1;
|
||||
|
||||
sd_cmd <= CMD_INHIBIT; // default: idle
|
||||
|
||||
if(reset != 0) begin
|
||||
// initialization takes place at the end of the reset phase
|
||||
if(stage == STATE_CMD_START) begin
|
||||
|
||||
if(reset == 13) begin
|
||||
sd_cmd <= CMD_PRECHARGE;
|
||||
sd_addr[10] <= 1'b1; // precharge all banks
|
||||
end
|
||||
|
||||
if(reset == 2) begin
|
||||
sd_cmd <= CMD_LOAD_MODE;
|
||||
sd_addr <= MODE;
|
||||
end
|
||||
|
||||
end
|
||||
mode <= 0;
|
||||
sd_dqm <= 2'b11;
|
||||
end else begin
|
||||
|
||||
// normal operation
|
||||
if(stage == STATE_CMD_START) begin
|
||||
if(we || oe) begin
|
||||
|
||||
mode <= {we, oe};
|
||||
|
||||
// RAS phase
|
||||
sd_cmd <= CMD_ACTIVE;
|
||||
sd_addr <= { 1'b0, addr[19:8] };
|
||||
sd_ba <= addr[21:20];
|
||||
|
||||
ds_r <= ds;
|
||||
din_r <= din;
|
||||
addr_r <= { 4'b0010, addr[22], addr[7:0] }; // auto precharge
|
||||
end
|
||||
else begin
|
||||
sd_cmd <= CMD_AUTO_REFRESH;
|
||||
mode <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
// CAS phase
|
||||
if(stage == STATE_CMD_CONT && mode) begin
|
||||
sd_cmd <= mode[1] ? CMD_WRITE : CMD_READ;
|
||||
sd_addr <= addr_r;
|
||||
|
||||
if(mode[1]) sd_dqm <= ~ds_r;
|
||||
else sd_dqm <= 2'b00;
|
||||
end
|
||||
|
||||
if(stage == STATE_HIGHZ) begin
|
||||
sd_dqm <= 2'b11; // disable chip output
|
||||
mode[1] <= 0; // disable data output
|
||||
end
|
||||
|
||||
if(stage == STATE_READ && mode) begin
|
||||
dout <= sd_data;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
33
sys/sigma_delta_dac.v
Normal file
33
sys/sigma_delta_dac.v
Normal file
@ -0,0 +1,33 @@
|
||||
//
|
||||
// PWM DAC
|
||||
//
|
||||
// MSBI is the highest bit number. NOT amount of bits!
|
||||
//
|
||||
module sigma_delta_dac #(parameter MSBI=7, parameter INV=1'b1)
|
||||
(
|
||||
output reg DACout, //Average Output feeding analog lowpass
|
||||
input [MSBI:0] DACin, //DAC input (excess 2**MSBI)
|
||||
input CLK,
|
||||
input RESET
|
||||
);
|
||||
|
||||
reg [MSBI+2:0] DeltaAdder; //Output of Delta Adder
|
||||
reg [MSBI+2:0] SigmaAdder; //Output of Sigma Adder
|
||||
reg [MSBI+2:0] SigmaLatch; //Latches output of Sigma Adder
|
||||
reg [MSBI+2:0] DeltaB; //B input of Delta Adder
|
||||
|
||||
always @(*) DeltaB = {SigmaLatch[MSBI+2], SigmaLatch[MSBI+2]} << (MSBI+1);
|
||||
always @(*) DeltaAdder = DACin + DeltaB;
|
||||
always @(*) SigmaAdder = DeltaAdder + SigmaLatch;
|
||||
|
||||
always @(posedge CLK or posedge RESET) begin
|
||||
if(RESET) begin
|
||||
SigmaLatch <= 1'b1 << (MSBI+1);
|
||||
DACout <= INV;
|
||||
end else begin
|
||||
SigmaLatch <= SigmaAdder;
|
||||
DACout <= SigmaLatch[MSBI+2] ^ INV;
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
392
sys/spdif.v
Normal file
392
sys/spdif.v
Normal file
@ -0,0 +1,392 @@
|
||||
//-----------------------------------------------------------------
|
||||
// SPDIF Transmitter
|
||||
// V0.1
|
||||
// Ultra-Embedded.com
|
||||
// Copyright 2012
|
||||
//
|
||||
// Email: admin@ultra-embedded.com
|
||||
//
|
||||
// License: GPL
|
||||
// If you would like a version with a more permissive license for
|
||||
// use in closed source commercial applications please contact me
|
||||
// for details.
|
||||
//-----------------------------------------------------------------
|
||||
//
|
||||
// This file is open source HDL; 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 2 of
|
||||
// the License, or (at your option) any later version.
|
||||
//
|
||||
// This file 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 file; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
// USA
|
||||
//-----------------------------------------------------------------
|
||||
// altera message_off 10762
|
||||
// altera message_off 10240
|
||||
|
||||
module spdif
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Params
|
||||
//-----------------------------------------------------------------
|
||||
#(
|
||||
parameter CLK_RATE = 50000000,
|
||||
parameter AUDIO_RATE = 48000,
|
||||
|
||||
// Generated params
|
||||
parameter WHOLE_CYCLES = (CLK_RATE) / (AUDIO_RATE*128),
|
||||
parameter ERROR_BASE = 10000,
|
||||
parameter [63:0] ERRORS_PER_BIT = ((CLK_RATE * ERROR_BASE) / (AUDIO_RATE*128)) - (WHOLE_CYCLES * ERROR_BASE)
|
||||
)
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Ports
|
||||
//-----------------------------------------------------------------
|
||||
(
|
||||
input clk_i,
|
||||
input rst_i,
|
||||
input half_rate,
|
||||
|
||||
// Output
|
||||
output spdif_o,
|
||||
|
||||
// Audio interface (16-bit x 2 = RL)
|
||||
input [15:0] audio_r,
|
||||
input [15:0] audio_l,
|
||||
output sample_req_o
|
||||
);
|
||||
|
||||
reg bit_clk_q;
|
||||
|
||||
// Clock pulse generator
|
||||
always @ (posedge rst_i or posedge clk_i) begin
|
||||
reg [31:0] count_q;
|
||||
reg [31:0] error_q;
|
||||
reg ce;
|
||||
|
||||
if (rst_i) begin
|
||||
count_q <= 0;
|
||||
error_q <= 0;
|
||||
bit_clk_q <= 1;
|
||||
ce <= 0;
|
||||
end
|
||||
else
|
||||
begin
|
||||
if(count_q == WHOLE_CYCLES-1) begin
|
||||
if (error_q < (ERROR_BASE - ERRORS_PER_BIT)) begin
|
||||
error_q <= error_q + ERRORS_PER_BIT[31:0];
|
||||
count_q <= 0;
|
||||
end else begin
|
||||
error_q <= error_q + ERRORS_PER_BIT[31:0] - ERROR_BASE;
|
||||
count_q <= count_q + 1;
|
||||
end
|
||||
end else if(count_q == WHOLE_CYCLES) begin
|
||||
count_q <= 0;
|
||||
end else begin
|
||||
count_q <= count_q + 1;
|
||||
end
|
||||
|
||||
bit_clk_q <= 0;
|
||||
if(!count_q) begin
|
||||
ce <= ~ce;
|
||||
if(~half_rate || ce) bit_clk_q <= 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Core SPDIF
|
||||
//-----------------------------------------------------------------
|
||||
|
||||
wire [31:0] sample_i = {audio_r, audio_l};
|
||||
|
||||
spdif_core
|
||||
u_core
|
||||
(
|
||||
.clk_i(clk_i),
|
||||
.rst_i(rst_i),
|
||||
|
||||
.bit_out_en_i(bit_clk_q),
|
||||
|
||||
.spdif_o(spdif_o),
|
||||
|
||||
.sample_i(sample_i),
|
||||
.sample_req_o(sample_req_o)
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
module spdif_core
|
||||
(
|
||||
input clk_i,
|
||||
input rst_i,
|
||||
|
||||
// SPDIF bit output enable
|
||||
// Single cycle pulse synchronous to clk_i which drives
|
||||
// the output bit rate.
|
||||
// For 44.1KHz, 44100×32×2×2 = 5,644,800Hz
|
||||
// For 48KHz, 48000×32×2×2 = 6,144,000Hz
|
||||
input bit_out_en_i,
|
||||
|
||||
// Output
|
||||
output spdif_o,
|
||||
|
||||
// Audio interface (16-bit x 2 = RL)
|
||||
input [31:0] sample_i,
|
||||
output reg sample_req_o
|
||||
);
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Registers
|
||||
//-----------------------------------------------------------------
|
||||
reg [15:0] audio_sample_q;
|
||||
reg [8:0] subframe_count_q;
|
||||
|
||||
reg load_subframe_q;
|
||||
reg [7:0] preamble_q;
|
||||
wire [31:0] subframe_w;
|
||||
|
||||
reg [5:0] bit_count_q;
|
||||
reg bit_toggle_q;
|
||||
|
||||
reg spdif_out_q;
|
||||
|
||||
reg [5:0] parity_count_q;
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Subframe Counter
|
||||
//-----------------------------------------------------------------
|
||||
always @ (posedge rst_i or posedge clk_i )
|
||||
begin
|
||||
if (rst_i == 1'b1)
|
||||
subframe_count_q <= 9'd0;
|
||||
else if (load_subframe_q)
|
||||
begin
|
||||
// 192 frames (384 subframes) in an audio block
|
||||
if (subframe_count_q == 9'd383)
|
||||
subframe_count_q <= 9'd0;
|
||||
else
|
||||
subframe_count_q <= subframe_count_q + 9'd1;
|
||||
end
|
||||
end
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Sample capture
|
||||
//-----------------------------------------------------------------
|
||||
reg [15:0] sample_buf_q;
|
||||
|
||||
always @ (posedge rst_i or posedge clk_i )
|
||||
begin
|
||||
if (rst_i == 1'b1)
|
||||
begin
|
||||
audio_sample_q <= 16'h0000;
|
||||
sample_buf_q <= 16'h0000;
|
||||
sample_req_o <= 1'b0;
|
||||
end
|
||||
else if (load_subframe_q)
|
||||
begin
|
||||
// Start of frame (first subframe)?
|
||||
if (subframe_count_q[0] == 1'b0)
|
||||
begin
|
||||
// Use left sample
|
||||
audio_sample_q <= sample_i[15:0];
|
||||
|
||||
// Store right sample
|
||||
sample_buf_q <= sample_i[31:16];
|
||||
|
||||
// Request next sample
|
||||
sample_req_o <= 1'b1;
|
||||
end
|
||||
else
|
||||
begin
|
||||
// Use right sample
|
||||
audio_sample_q <= sample_buf_q;
|
||||
|
||||
sample_req_o <= 1'b0;
|
||||
end
|
||||
end
|
||||
else
|
||||
sample_req_o <= 1'b0;
|
||||
end
|
||||
|
||||
// Timeslots 3 - 0 = Preamble
|
||||
assign subframe_w[3:0] = 4'b0000;
|
||||
|
||||
// Timeslots 7 - 4 = 24-bit audio LSB
|
||||
assign subframe_w[7:4] = 4'b0000;
|
||||
|
||||
// Timeslots 11 - 8 = 20-bit audio LSB
|
||||
assign subframe_w[11:8] = 4'b0000;
|
||||
|
||||
// Timeslots 27 - 12 = 16-bit audio
|
||||
assign subframe_w[27:12] = audio_sample_q;
|
||||
|
||||
// Timeslots 28 = Validity
|
||||
assign subframe_w[28] = 1'b0; // Valid
|
||||
|
||||
// Timeslots 29 = User bit
|
||||
assign subframe_w[29] = 1'b0;
|
||||
|
||||
// Timeslots 30 = Channel status bit
|
||||
assign subframe_w[30] = 1'b0;
|
||||
|
||||
// Timeslots 31 = Even Parity bit (31:4)
|
||||
assign subframe_w[31] = 1'b0;
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Preamble
|
||||
//-----------------------------------------------------------------
|
||||
localparam PREAMBLE_Z = 8'b00010111;
|
||||
localparam PREAMBLE_Y = 8'b00100111;
|
||||
localparam PREAMBLE_X = 8'b01000111;
|
||||
|
||||
reg [7:0] preamble_r;
|
||||
|
||||
always @ *
|
||||
begin
|
||||
// Start of audio block?
|
||||
// Z(B) - Left channel
|
||||
if (subframe_count_q == 9'd0)
|
||||
preamble_r = PREAMBLE_Z; // Z(B)
|
||||
// Right Channel?
|
||||
else if (subframe_count_q[0] == 1'b1)
|
||||
preamble_r = PREAMBLE_Y; // Y(W)
|
||||
// Left Channel (but not start of block)?
|
||||
else
|
||||
preamble_r = PREAMBLE_X; // X(M)
|
||||
end
|
||||
|
||||
always @ (posedge rst_i or posedge clk_i )
|
||||
if (rst_i == 1'b1)
|
||||
preamble_q <= 8'h00;
|
||||
else if (load_subframe_q)
|
||||
preamble_q <= preamble_r;
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Parity Counter
|
||||
//-----------------------------------------------------------------
|
||||
always @ (posedge rst_i or posedge clk_i )
|
||||
begin
|
||||
if (rst_i == 1'b1)
|
||||
begin
|
||||
parity_count_q <= 6'd0;
|
||||
end
|
||||
// Time to output a bit?
|
||||
else if (bit_out_en_i)
|
||||
begin
|
||||
// Preamble bits?
|
||||
if (bit_count_q < 6'd8)
|
||||
begin
|
||||
parity_count_q <= 6'd0;
|
||||
end
|
||||
// Normal timeslots
|
||||
else if (bit_count_q < 6'd62)
|
||||
begin
|
||||
// On first pass through this timeslot, count number of high bits
|
||||
if (bit_count_q[0] == 0 && subframe_w[bit_count_q / 2] == 1'b1)
|
||||
parity_count_q <= parity_count_q + 6'd1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Bit Counter
|
||||
//-----------------------------------------------------------------
|
||||
always @ (posedge rst_i or posedge clk_i)
|
||||
begin
|
||||
if (rst_i == 1'b1)
|
||||
begin
|
||||
bit_count_q <= 6'b0;
|
||||
load_subframe_q <= 1'b1;
|
||||
end
|
||||
// Time to output a bit?
|
||||
else if (bit_out_en_i)
|
||||
begin
|
||||
// 32 timeslots (x2 for double frequency)
|
||||
if (bit_count_q == 6'd63)
|
||||
begin
|
||||
bit_count_q <= 6'd0;
|
||||
load_subframe_q <= 1'b1;
|
||||
end
|
||||
else
|
||||
begin
|
||||
bit_count_q <= bit_count_q + 6'd1;
|
||||
load_subframe_q <= 1'b0;
|
||||
end
|
||||
end
|
||||
else
|
||||
load_subframe_q <= 1'b0;
|
||||
end
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Bit half toggle
|
||||
//-----------------------------------------------------------------
|
||||
always @ (posedge rst_i or posedge clk_i)
|
||||
if (rst_i == 1'b1)
|
||||
bit_toggle_q <= 1'b0;
|
||||
// Time to output a bit?
|
||||
else if (bit_out_en_i)
|
||||
bit_toggle_q <= ~bit_toggle_q;
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
// Output bit (BMC encoded)
|
||||
//-----------------------------------------------------------------
|
||||
reg bit_r;
|
||||
|
||||
always @ *
|
||||
begin
|
||||
bit_r = spdif_out_q;
|
||||
|
||||
// Time to output a bit?
|
||||
if (bit_out_en_i)
|
||||
begin
|
||||
// Preamble bits?
|
||||
if (bit_count_q < 6'd8)
|
||||
begin
|
||||
bit_r = preamble_q[bit_count_q[2:0]];
|
||||
end
|
||||
// Normal timeslots
|
||||
else if (bit_count_q < 6'd62)
|
||||
begin
|
||||
if (subframe_w[bit_count_q / 2] == 1'b0)
|
||||
begin
|
||||
if (bit_toggle_q == 1'b0)
|
||||
bit_r = ~spdif_out_q;
|
||||
else
|
||||
bit_r = spdif_out_q;
|
||||
end
|
||||
else
|
||||
bit_r = ~spdif_out_q;
|
||||
end
|
||||
// Parity timeslot
|
||||
else
|
||||
begin
|
||||
// Even number of high bits, make odd
|
||||
if (parity_count_q[0] == 1'b0)
|
||||
begin
|
||||
if (bit_toggle_q == 1'b0)
|
||||
bit_r = ~spdif_out_q;
|
||||
else
|
||||
bit_r = spdif_out_q;
|
||||
end
|
||||
else
|
||||
bit_r = ~spdif_out_q;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
always @ (posedge rst_i or posedge clk_i )
|
||||
if (rst_i == 1'b1)
|
||||
spdif_out_q <= 1'b0;
|
||||
else
|
||||
spdif_out_q <= bit_r;
|
||||
|
||||
assign spdif_o = spdif_out_q;
|
||||
|
||||
endmodule
|
123
sys/sync_vg.v
Normal file
123
sys/sync_vg.v
Normal file
@ -0,0 +1,123 @@
|
||||
module sync_vg
|
||||
#(
|
||||
parameter X_BITS=12,
|
||||
Y_BITS=12
|
||||
)
|
||||
(
|
||||
input wire clk,
|
||||
input wire reset,
|
||||
input wire interlaced,
|
||||
input wire [Y_BITS-1:0] v_total_0,
|
||||
input wire [Y_BITS-1:0] v_fp_0,
|
||||
input wire [Y_BITS-1:0] v_bp_0,
|
||||
input wire [Y_BITS-1:0] v_sync_0,
|
||||
input wire [Y_BITS-1:0] v_total_1,
|
||||
input wire [Y_BITS-1:0] v_fp_1,
|
||||
input wire [Y_BITS-1:0] v_bp_1,
|
||||
input wire [Y_BITS-1:0] v_sync_1,
|
||||
input wire [X_BITS-1:0] h_total,
|
||||
input wire [X_BITS-1:0] h_fp,
|
||||
input wire [X_BITS-1:0] h_bp,
|
||||
input wire [X_BITS-1:0] h_sync,
|
||||
input wire [X_BITS-1:0] hv_offset_0,
|
||||
input wire [X_BITS-1:0] hv_offset_1,
|
||||
output reg vs_out,
|
||||
output reg hs_out,
|
||||
output reg hde_out,
|
||||
output reg vde_out,
|
||||
output reg [Y_BITS:0] v_count_out,
|
||||
output reg [X_BITS-1:0] h_count_out,
|
||||
output reg [X_BITS-1:0] x_out,
|
||||
output reg [Y_BITS:0] y_out,
|
||||
output reg field_out,
|
||||
output wire clk_out
|
||||
);
|
||||
|
||||
reg [X_BITS-1:0] h_count;
|
||||
reg [Y_BITS-1:0] v_count;
|
||||
reg field;
|
||||
reg [Y_BITS-1:0] v_total;
|
||||
reg [Y_BITS-1:0] v_fp;
|
||||
reg [Y_BITS-1:0] v_bp;
|
||||
reg [Y_BITS-1:0] v_sync;
|
||||
reg [X_BITS-1:0] hv_offset;
|
||||
|
||||
assign clk_out = !clk;
|
||||
|
||||
/* horizontal counter */
|
||||
always @(posedge clk)
|
||||
if (reset)
|
||||
h_count <= 0;
|
||||
else
|
||||
if (h_count < h_total - 1)
|
||||
h_count <= h_count + 1'd1;
|
||||
else
|
||||
h_count <= 0;
|
||||
|
||||
/* vertical counter */
|
||||
always @(posedge clk)
|
||||
if (reset)
|
||||
v_count <= 0;
|
||||
else
|
||||
if (h_count == h_total - 1)
|
||||
begin
|
||||
if (v_count == v_total - 1)
|
||||
v_count <= 0;
|
||||
else
|
||||
v_count <= v_count + 1'd1;
|
||||
end
|
||||
|
||||
/* field */
|
||||
always @(posedge clk)
|
||||
if (reset)
|
||||
begin
|
||||
field <= 0;
|
||||
v_total <= v_total_0;
|
||||
v_fp <= interlaced ? v_fp_1 : v_fp_0; // In the interlaced mode this value must be inverted as v_fp_1 is still in field0
|
||||
v_bp <= v_bp_0;
|
||||
v_sync <= v_sync_0;
|
||||
hv_offset <= hv_offset_0;
|
||||
end
|
||||
else
|
||||
if ((interlaced) && ((v_count == v_total - 1) && (h_count == h_total - 1)))
|
||||
begin
|
||||
field <= field + interlaced;
|
||||
v_total <= field ? v_total_0 : v_total_1;
|
||||
v_fp <= field ? v_fp_1 : v_fp_0; // This order is inverted as v_fp_1 is still in field0
|
||||
v_bp <= field ? v_bp_0 : v_bp_1;
|
||||
v_sync <= field ? v_sync_0 : v_sync_1;
|
||||
hv_offset <= field ? hv_offset_0 : hv_offset_1;
|
||||
end
|
||||
|
||||
always @(posedge clk)
|
||||
if (reset)
|
||||
{ vs_out, hs_out, hde_out, vde_out, field_out } <= 4'b0;
|
||||
else begin
|
||||
hs_out <= ((h_count < h_sync));
|
||||
|
||||
hde_out <= (h_count >= h_sync + h_bp) && (h_count <= h_total - h_fp - 1);
|
||||
vde_out <= (v_count >= v_sync + v_bp) && (v_count <= v_total - v_fp - 1);
|
||||
|
||||
if ((v_count == 0) && (h_count == hv_offset))
|
||||
vs_out <= 1'b1;
|
||||
else if ((v_count == v_sync) && (h_count == hv_offset))
|
||||
vs_out <= 1'b0;
|
||||
|
||||
/* H_COUNT_OUT and V_COUNT_OUT */
|
||||
h_count_out <= h_count;
|
||||
if (field)
|
||||
v_count_out <= v_count + v_total_0;
|
||||
else
|
||||
v_count_out <= v_count;
|
||||
|
||||
/* X and Y coords <EFBFBD> for a backend pattern generator */
|
||||
x_out <= h_count - (h_sync + h_bp);
|
||||
if (interlaced)
|
||||
y_out <= { (v_count - (v_sync + v_bp)) , field };
|
||||
else
|
||||
y_out <= { 1'b0, (v_count - (v_sync + v_bp)) };
|
||||
field_out <= field;
|
||||
|
||||
end
|
||||
|
||||
endmodule
|
20
sys/sys.qip
Normal file
20
sys/sys.qip
Normal file
@ -0,0 +1,20 @@
|
||||
set_global_assignment -name VERILOG_FILE sys/sys_top.v
|
||||
set_global_assignment -name SDC_FILE sys/sys_top.sdc
|
||||
set_global_assignment -name QIP_FILE sys/pll.qip
|
||||
set_global_assignment -name QIP_FILE sys/pll_hdmi.qip
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE sys/sdram.sv
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE sys/ddram.sv
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE sys/hq2x.sv
|
||||
set_global_assignment -name VERILOG_FILE sys/scandoubler.v
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE sys/video_mixer.sv
|
||||
set_global_assignment -name VERILOG_FILE sys/osd.v
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE sys/vga_out.sv
|
||||
set_global_assignment -name VERILOG_FILE sys/sync_vg.v
|
||||
set_global_assignment -name VERILOG_FILE sys/pattern_vg.v
|
||||
set_global_assignment -name VERILOG_FILE sys/i2c.v
|
||||
set_global_assignment -name VERILOG_FILE sys/i2s.v
|
||||
set_global_assignment -name VERILOG_FILE sys/spdif.v
|
||||
set_global_assignment -name VERILOG_FILE sys/sigma_delta_dac.v
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE sys/lpf48k.sv
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE sys/hdmi_config.sv
|
||||
set_global_assignment -name VERILOG_FILE sys/hps_io.v
|
27
sys/sys_top.sdc
Normal file
27
sys/sys_top.sdc
Normal file
@ -0,0 +1,27 @@
|
||||
create_clock -period "50.0 MHz" [get_ports FPGA_CLK1_50]
|
||||
create_clock -period "50.0 MHz" [get_ports FPGA_CLK2_50]
|
||||
create_clock -period "50.0 MHz" [get_ports FPGA_CLK3_50]
|
||||
create_clock -period "100.0 MHz" [get_pins -compatibility_mode *|h2f_user0_clk]
|
||||
|
||||
derive_pll_clocks
|
||||
|
||||
create_generated_clock -source [get_pins -compatibility_mode {*|pll|pll_inst|altera_pll_i|general[1].gpll~PLL_OUTPUT_COUNTER|divclk}] \
|
||||
-name SDRAM_CLK [get_ports {SDRAM_CLK}]
|
||||
|
||||
derive_clock_uncertainty
|
||||
|
||||
set_input_delay -max -clock SDRAM_CLK 6.4ns [get_ports SDRAM_DQ[*]]
|
||||
set_input_delay -min -clock SDRAM_CLK 3.7ns [get_ports SDRAM_DQ[*]]
|
||||
|
||||
set_multicycle_path -from [get_clocks {SDRAM_CLK}] \
|
||||
-to [get_clocks {*|pll|pll_inst|altera_pll_i|general[0].gpll~PLL_OUTPUT_COUNTER|divclk}] \
|
||||
-setup 2
|
||||
|
||||
set_output_delay -max -clock SDRAM_CLK 1.6ns [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}]
|
||||
set_output_delay -min -clock SDRAM_CLK -0.9ns [get_ports {SDRAM_D* SDRAM_A* SDRAM_BA* SDRAM_n* SDRAM_CKE}]
|
||||
|
||||
set_false_path -from * -to [get_ports {LED_*}]
|
||||
set_false_path -from * -to [get_ports {BTN_*}]
|
||||
set_false_path -from * -to [get_ports {VGA_*}]
|
||||
set_false_path -from * -to [get_ports {AUDIO_L}]
|
||||
set_false_path -from * -to [get_ports {AUDIO_R}]
|
681
sys/sys_top.v
Normal file
681
sys/sys_top.v
Normal file
@ -0,0 +1,681 @@
|
||||
//============================================================================
|
||||
//
|
||||
// DE10-nano HAL top module
|
||||
// (c)2017 Sorgelig
|
||||
//
|
||||
// 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 2 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, write to the Free Software Foundation, Inc.,
|
||||
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
//
|
||||
//============================================================================
|
||||
|
||||
module sys_top
|
||||
(
|
||||
/////////// CLOCK //////////
|
||||
input FPGA_CLK1_50,
|
||||
input FPGA_CLK2_50,
|
||||
input FPGA_CLK3_50,
|
||||
|
||||
//////////// VGA ///////////
|
||||
output [5:0] VGA_R,
|
||||
output [5:0] VGA_G,
|
||||
output [5:0] VGA_B,
|
||||
output VGA_HS,
|
||||
output VGA_VS,
|
||||
input VGA_EN,
|
||||
|
||||
/////////// AUDIO //////////
|
||||
output AUDIO_L,
|
||||
output AUDIO_R,
|
||||
output AUDIO_SPDIF,
|
||||
|
||||
//////////// HDMI //////////
|
||||
output HDMI_I2C_SCL,
|
||||
inout HDMI_I2C_SDA,
|
||||
|
||||
output HDMI_MCLK,
|
||||
output HDMI_SCLK,
|
||||
output HDMI_LRCLK,
|
||||
output HDMI_I2S,
|
||||
|
||||
output HDMI_TX_CLK,
|
||||
output HDMI_TX_DE,
|
||||
output [23:0] HDMI_TX_D,
|
||||
output HDMI_TX_HS,
|
||||
output HDMI_TX_VS,
|
||||
|
||||
//////////// SDR ///////////
|
||||
output [12:0] SDRAM_A,
|
||||
inout [15:0] SDRAM_DQ,
|
||||
output SDRAM_DQML,
|
||||
output SDRAM_DQMH,
|
||||
output SDRAM_nWE,
|
||||
output SDRAM_nCAS,
|
||||
output SDRAM_nRAS,
|
||||
output SDRAM_nCS,
|
||||
output [1:0] SDRAM_BA,
|
||||
output SDRAM_CLK,
|
||||
output SDRAM_CKE,
|
||||
|
||||
//////////// I/O ///////////
|
||||
output LED_USER,
|
||||
output LED_HDD,
|
||||
output LED_POWER,
|
||||
input BTN_USER,
|
||||
input BTN_OSD,
|
||||
input BTN_RESET,
|
||||
|
||||
//////////// SDIO ///////////
|
||||
inout [3:0] SDIO_DAT,
|
||||
inout SDIO_CMD,
|
||||
output SDIO_CLK,
|
||||
input SDIO_CD,
|
||||
|
||||
////////// MB KEY ///////////
|
||||
input [1:0] KEY,
|
||||
|
||||
////////// MB LED ///////////
|
||||
output [7:0] LED
|
||||
);
|
||||
|
||||
|
||||
assign SDIO_DAT[2:1] = 2'bZZ;
|
||||
|
||||
////////////////////////// LEDs ///////////////////////////////////////
|
||||
|
||||
wire led_p = led_power[1] ? ~led_power[0] : 1'b0;
|
||||
wire led_d = led_disk[1] ? ~led_disk[0] : ~(led_disk[0] | gp_out[29]);
|
||||
wire led_u = ~led_user;
|
||||
|
||||
assign LED_POWER = led_p ? 1'bZ : 1'b0;
|
||||
assign LED_HDD = led_d ? 1'bZ : 1'b0;
|
||||
assign LED_USER = led_u ? 1'bZ : 1'b0;
|
||||
|
||||
//LEDs on main board
|
||||
assign LED = {3'b000, ~led_p, 1'b0, ~led_d, 1'b0, ~led_u};
|
||||
|
||||
|
||||
////////////////////////// Buttons ///////////////////////////////////
|
||||
reg btn_user, btn_osd;
|
||||
always @(posedge FPGA_CLK2_50) begin
|
||||
integer div;
|
||||
reg [7:0] deb_user;
|
||||
reg [7:0] deb_osd;
|
||||
|
||||
div <= div + 1'b1;
|
||||
if(div > 100000) div <= 0;
|
||||
|
||||
if(!div) begin
|
||||
deb_user <= {deb_user[6:0], ~(BTN_USER & KEY[1])};
|
||||
if(&deb_user) btn_user <= 1;
|
||||
if(!deb_user) btn_user <= 0;
|
||||
|
||||
deb_osd <= {deb_osd[6:0], ~(BTN_OSD & KEY[0])};
|
||||
if(&deb_osd) btn_osd <= 1;
|
||||
if(!deb_osd) btn_osd <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
reg btn_reset = 1;
|
||||
always @(posedge FPGA_CLK2_50) btn_reset <= BTN_RESET;
|
||||
|
||||
|
||||
///////////////////////// HPS I/O /////////////////////////////////////
|
||||
|
||||
// gp_in[31] = 0 - quick flag that FPGA is initialized (HPS reads 1 when FPGA is not in user mode)
|
||||
// used to avoid lockups while JTAG loading
|
||||
wire [31:0] gp_in = {1'b0, btn_user, btn_osd, 9'd0, io_ver, io_ack, io_wide, io_dout};
|
||||
wire [31:0] gp_out;
|
||||
|
||||
wire [1:0] io_ver = 1; // 0 - standard MiST I/O (for quick porting of complex MiST cores). 1 - optimized HPS I/O. 2,3 - reserved for future.
|
||||
wire io_wait;
|
||||
wire io_wide;
|
||||
wire [15:0] io_dout;
|
||||
wire [15:0] io_din = gp_outr[15:0];
|
||||
wire io_clk = gp_outr[17];
|
||||
wire io_fpga = gp_outr[18];
|
||||
wire io_osd = gp_outr[19];
|
||||
wire io_uio = gp_outr[20];
|
||||
//wire io_sdd = gp_outr[21]; // used only in ST core
|
||||
|
||||
reg io_ack;
|
||||
reg rack;
|
||||
wire io_strobe = ~rack & io_clk;
|
||||
|
||||
always @(posedge clk_sys) begin
|
||||
if(~io_wait | io_strobe) begin
|
||||
rack <= io_clk;
|
||||
io_ack <= rack;
|
||||
end
|
||||
end
|
||||
|
||||
reg [31:0] gp_outr;
|
||||
always @(posedge clk_sys) begin
|
||||
reg [31:0] gp_outd;
|
||||
gp_outr <= gp_outd;
|
||||
gp_outd <= gp_out;
|
||||
end
|
||||
|
||||
wire [7:0] core_type = 'hA4; // A4 - generic core.
|
||||
|
||||
// HPS will not communicate to core if magic is different
|
||||
wire [31:0] core_magic = {24'h5CA623, core_type};
|
||||
|
||||
cyclonev_hps_interface_mpu_general_purpose h2f_gp
|
||||
(
|
||||
.gp_in({~gp_out[31] ? core_magic : gp_in}),
|
||||
.gp_out(gp_out)
|
||||
);
|
||||
|
||||
|
||||
reg [15:0] cfg;
|
||||
|
||||
reg cfg_ready = 0;
|
||||
wire audio_96k = cfg[6];
|
||||
wire ypbpr_en = cfg[5];
|
||||
wire csync = cfg[3];
|
||||
`ifndef LITE
|
||||
wire vga_scaler= cfg[2];
|
||||
`endif
|
||||
|
||||
always@(posedge clk_sys) begin
|
||||
reg [7:0] cmd;
|
||||
reg has_cmd;
|
||||
reg old_strobe;
|
||||
|
||||
old_strobe <= io_strobe;
|
||||
|
||||
if(~io_uio) has_cmd <= 0;
|
||||
else
|
||||
if(~old_strobe & io_strobe) begin
|
||||
if(!has_cmd) begin
|
||||
has_cmd <= 1;
|
||||
cmd <= io_din[7:0];
|
||||
end
|
||||
else
|
||||
if(cmd == 1) begin
|
||||
cfg <= io_din;
|
||||
cfg_ready <= 1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
/////////////////////////// RESET ///////////////////////////////////
|
||||
|
||||
reg reset_req = 0;
|
||||
always @(posedge FPGA_CLK2_50) begin
|
||||
reg [1:0] resetd, resetd2;
|
||||
reg old_reset;
|
||||
|
||||
//latch the reset
|
||||
old_reset <= reset;
|
||||
if(~old_reset & reset) reset_req <= 1;
|
||||
|
||||
//special combination to set/clear the reset
|
||||
//preventing of accidental reset control
|
||||
if(resetd==1) reset_req <= 1;
|
||||
if(resetd==2 && resetd2==0) reset_req <= 0;
|
||||
|
||||
resetd <= gp_out[31:30];
|
||||
resetd2 <= resetd;
|
||||
end
|
||||
|
||||
// 100MHz
|
||||
wire ctl_clk;
|
||||
|
||||
///////////////////////// VIP version ///////////////////////////////
|
||||
|
||||
`ifndef LITE
|
||||
|
||||
wire reset;
|
||||
vip vip
|
||||
(
|
||||
//Reset/Clock
|
||||
.reset_reset_req(reset_req),
|
||||
.reset_reset(reset),
|
||||
|
||||
//DE10-nano has no reset signal on GPIO, so core has to emulate cold reset button.
|
||||
.reset_cold_req(~btn_reset),
|
||||
.reset_warm_req(0),
|
||||
|
||||
//control
|
||||
.ctl_address(ctl_address),
|
||||
.ctl_write(ctl_write),
|
||||
.ctl_writedata(ctl_writedata),
|
||||
.ctl_waitrequest(ctl_waitrequest),
|
||||
.ctl_clock(ctl_clk),
|
||||
.ctl_reset(ctl_reset),
|
||||
|
||||
//64-bit DDR3 RAM access
|
||||
.ramclk1_clk(ram_clk),
|
||||
.ram1_address(ram_address),
|
||||
.ram1_burstcount(ram_burstcount),
|
||||
.ram1_waitrequest(ram_waitrequest),
|
||||
.ram1_readdata(ram_readdata),
|
||||
.ram1_readdatavalid(ram_readdatavalid),
|
||||
.ram1_read(ram_read),
|
||||
.ram1_writedata(ram_writedata),
|
||||
.ram1_byteenable(ram_byteenable),
|
||||
.ram1_write(ram_write),
|
||||
|
||||
//Spare 64-bit DDR3 RAM access
|
||||
//currently unused
|
||||
//can combine with ram1 to make a wider RAM bus (although will increase the latency)
|
||||
.ramclk2_clk(0),
|
||||
.ram2_address(0),
|
||||
.ram2_burstcount(0),
|
||||
.ram2_waitrequest(),
|
||||
.ram2_readdata(),
|
||||
.ram2_readdatavalid(),
|
||||
.ram2_read(0),
|
||||
.ram2_writedata(0),
|
||||
.ram2_byteenable(0),
|
||||
.ram2_write(0),
|
||||
|
||||
//Video input
|
||||
.in_vid_clk(clk_vid),
|
||||
.in_vid_data({r_out, g_out, b_out}),
|
||||
.in_vid_de(de),
|
||||
.in_vid_v_sync(vs),
|
||||
.in_vid_h_sync(hs),
|
||||
.in_vid_datavalid(ce_pix),
|
||||
.in_vid_locked(1),
|
||||
.in_vid_f(0),
|
||||
.in_vid_color_encoding(0),
|
||||
.in_vid_bit_width(0),
|
||||
|
||||
//HDMI output
|
||||
.hdmi_vid_clk(~HDMI_TX_CLK),
|
||||
.hdmi_vid_data(hdmi_data),
|
||||
.hdmi_vid_datavalid(HDMI_TX_DE),
|
||||
.hdmi_vid_v_sync(HDMI_TX_VS),
|
||||
.hdmi_vid_h_sync(HDMI_TX_HS)
|
||||
);
|
||||
|
||||
wire [8:0] ctl_address;
|
||||
wire ctl_write;
|
||||
wire [31:0] ctl_writedata;
|
||||
wire ctl_waitrequest;
|
||||
wire ctl_reset;
|
||||
wire [7:0] ARX, ARY;
|
||||
|
||||
vip_config vip_config
|
||||
(
|
||||
.clk(ctl_clk),
|
||||
.reset(ctl_reset),
|
||||
|
||||
.ARX(ARX),
|
||||
.ARY(ARY),
|
||||
|
||||
.address(ctl_address),
|
||||
.write(ctl_write),
|
||||
.writedata(ctl_writedata),
|
||||
.waitrequest(ctl_waitrequest)
|
||||
);
|
||||
`endif
|
||||
|
||||
|
||||
///////////////////////// Lite version ////////////////////////////////
|
||||
|
||||
`ifdef LITE
|
||||
|
||||
wire INTERLACED = 0;
|
||||
wire [11:0] V_TOTAL_0 = 750;
|
||||
wire [11:0] V_FP_0 = 5;
|
||||
wire [11:0] V_BP_0 = 20;
|
||||
wire [11:0] V_SYNC_0 = 5;
|
||||
wire [11:0] V_TOTAL_1 = 0;
|
||||
wire [11:0] V_FP_1 = 0;
|
||||
wire [11:0] V_BP_1 = 0;
|
||||
wire [11:0] V_SYNC_1 = 0;
|
||||
wire [11:0] H_TOTAL = 1650;
|
||||
wire [11:0] H_FP = 110;
|
||||
wire [11:0] H_BP = 220;
|
||||
wire [11:0] H_SYNC = 40;
|
||||
wire [11:0] HV_OFFSET_0 = 0;
|
||||
wire [11:0] HV_OFFSET_1 = 0;
|
||||
|
||||
wire [11:0] x;
|
||||
wire [12:0] y;
|
||||
|
||||
sync_vg #(.X_BITS(12), .Y_BITS(12)) sync_vg
|
||||
(
|
||||
.clk(HDMI_TX_CLK),
|
||||
.reset(reset),
|
||||
.interlaced(INTERLACED),
|
||||
.clk_out(), // inverted output clock - unconnected
|
||||
.v_total_0(V_TOTAL_0),
|
||||
.v_fp_0(V_FP_0),
|
||||
.v_bp_0(V_BP_0),
|
||||
.v_sync_0(V_SYNC_0),
|
||||
.v_total_1(V_TOTAL_1),
|
||||
.v_fp_1(V_FP_1),
|
||||
.v_bp_1(V_BP_1),
|
||||
.v_sync_1(V_SYNC_1),
|
||||
.h_total(H_TOTAL),
|
||||
.h_fp(H_FP),
|
||||
.h_bp(H_BP),
|
||||
.h_sync(H_SYNC),
|
||||
.hv_offset_0(HV_OFFSET_0),
|
||||
.hv_offset_1(HV_OFFSET_1),
|
||||
.vde_out(vde),
|
||||
.hde_out(hde),
|
||||
.vs_out(vs_hdmi),
|
||||
.v_count_out(),
|
||||
.h_count_out(),
|
||||
.x_out(x),
|
||||
.y_out(y),
|
||||
.hs_out(hs_hdmi),
|
||||
.field_out(field)
|
||||
);
|
||||
|
||||
wire vde, hde;
|
||||
wire vs_hdmi;
|
||||
wire hs_hdmi;
|
||||
wire field;
|
||||
|
||||
pattern_vg
|
||||
#(
|
||||
.B(8), // Bits per channel
|
||||
.X_BITS(12),
|
||||
.Y_BITS(12),
|
||||
.FRACTIONAL_BITS(12) // Number of fractional bits for ramp pattern
|
||||
)
|
||||
pattern_vg
|
||||
(
|
||||
.reset(reset),
|
||||
.clk_in(HDMI_TX_CLK),
|
||||
.x(x),
|
||||
.y(y[11:0]),
|
||||
.vn_in(vs_hdmi),
|
||||
.hn_in(hs_hdmi),
|
||||
.dn_in(vde & hde),
|
||||
.r_in(0),
|
||||
.g_in(0),
|
||||
.b_in(0),
|
||||
.vn_out(HDMI_TX_VS),
|
||||
.hn_out(HDMI_TX_HS),
|
||||
.den_out(HDMI_TX_DE),
|
||||
.r_out(hdmi_data[23:16]),
|
||||
.g_out(hdmi_data[15:8]),
|
||||
.b_out(hdmi_data[7:0]),
|
||||
.total_active_pix(H_TOTAL - (H_FP + H_BP + H_SYNC)),
|
||||
.total_active_lines(INTERLACED ? (V_TOTAL_0 - (V_FP_0 + V_BP_0 + V_SYNC_0)) + (V_TOTAL_1 - (V_FP_1 + V_BP_1 + V_SYNC_1)) : (V_TOTAL_0 - (V_FP_0 + V_BP_0 + V_SYNC_0))), // originally: 13'd480
|
||||
.pattern(4),
|
||||
.ramp_step(20'h0333)
|
||||
);
|
||||
|
||||
wire reset;
|
||||
sysmem_lite sysmem
|
||||
(
|
||||
//Reset/Clock
|
||||
.reset_reset_req(reset_req),
|
||||
.reset_reset(reset),
|
||||
.ctl_clock(ctl_clk),
|
||||
|
||||
//DE10-nano has no reset signal on GPIO, so core has to emulate cold reset button.
|
||||
.reset_cold_req(~btn_reset),
|
||||
.reset_warm_req(0),
|
||||
|
||||
//64-bit DDR3 RAM access
|
||||
.ramclk1_clk(ram_clk),
|
||||
.ram1_address(ram_address),
|
||||
.ram1_burstcount(ram_burstcount),
|
||||
.ram1_waitrequest(ram_waitrequest),
|
||||
.ram1_readdata(ram_readdata),
|
||||
.ram1_readdatavalid(ram_readdatavalid),
|
||||
.ram1_read(ram_read),
|
||||
.ram1_writedata(ram_writedata),
|
||||
.ram1_byteenable(ram_byteenable),
|
||||
.ram1_write(ram_write),
|
||||
|
||||
//Spare 64-bit DDR3 RAM access
|
||||
//currently unused
|
||||
//can combine with ram1 to make a wider RAM bus (although will increase the latency)
|
||||
.ramclk2_clk(0),
|
||||
.ram2_address(0),
|
||||
.ram2_burstcount(0),
|
||||
.ram2_waitrequest(),
|
||||
.ram2_readdata(),
|
||||
.ram2_readdatavalid(),
|
||||
.ram2_read(0),
|
||||
.ram2_writedata(0),
|
||||
.ram2_byteenable(0),
|
||||
.ram2_write(0)
|
||||
);
|
||||
|
||||
`endif
|
||||
|
||||
|
||||
///////////////////////// HDMI output /////////////////////////////////
|
||||
|
||||
pll_hdmi pll_hdmi
|
||||
(
|
||||
.refclk(FPGA_CLK1_50),
|
||||
.rst(reset),
|
||||
.outclk_0(HDMI_TX_CLK)
|
||||
);
|
||||
|
||||
hdmi_config hdmi_config
|
||||
(
|
||||
.iCLK(FPGA_CLK1_50),
|
||||
.iRST_N(cfg_ready),
|
||||
.I2C_SCL(HDMI_I2C_SCL),
|
||||
.I2C_SDA(HDMI_I2C_SDA),
|
||||
|
||||
.audio_48k(~audio_96k),
|
||||
.iRES(4), // 720p
|
||||
.iAR(1) // Aspect Ratio
|
||||
);
|
||||
|
||||
wire [23:0] hdmi_data;
|
||||
osd hdmi_osd
|
||||
(
|
||||
.clk_sys(clk_sys),
|
||||
|
||||
.io_osd(io_osd),
|
||||
.io_strobe(io_strobe),
|
||||
.io_din(io_din[7:0]),
|
||||
|
||||
.clk_video(HDMI_TX_CLK),
|
||||
.din(hdmi_data),
|
||||
.dout(HDMI_TX_D),
|
||||
.de(HDMI_TX_DE)
|
||||
);
|
||||
|
||||
assign HDMI_MCLK = 0;
|
||||
i2s i2s
|
||||
(
|
||||
.reset(~cfg_ready),
|
||||
.clk_sys(FPGA_CLK1_50),
|
||||
.half_rate(~audio_96k),
|
||||
|
||||
.sclk(HDMI_SCLK),
|
||||
.lrclk(HDMI_LRCLK),
|
||||
.sdata(HDMI_I2S),
|
||||
|
||||
//Could inverse the MSB but it will shift 0 level to -MAX level
|
||||
.left_chan (audio_l >> !audio_s),
|
||||
.right_chan(audio_r >> !audio_s)
|
||||
);
|
||||
|
||||
|
||||
///////////////////////// VGA output //////////////////////////////////
|
||||
|
||||
wire [23:0] vga_q;
|
||||
osd vga_osd
|
||||
(
|
||||
.clk_sys(clk_sys),
|
||||
|
||||
.io_osd(io_osd),
|
||||
.io_strobe(io_strobe),
|
||||
.io_din(io_din[7:0]),
|
||||
|
||||
.clk_video(clk_vid),
|
||||
.din(de ? {r_out, g_out, b_out} : 24'd0),
|
||||
.dout(vga_q),
|
||||
.de(de)
|
||||
);
|
||||
|
||||
wire [23:0] vga_o;
|
||||
|
||||
vga_out vga_out
|
||||
(
|
||||
.ypbpr_full(1),
|
||||
.ypbpr_en(ypbpr_en),
|
||||
.dout(vga_o),
|
||||
`ifdef LITE
|
||||
.din(vga_q)
|
||||
`else
|
||||
.din(vga_scaler ? HDMI_TX_D : vga_q)
|
||||
`endif
|
||||
);
|
||||
|
||||
`ifdef LITE
|
||||
wire vs1 = vs;
|
||||
wire hs1 = hs;
|
||||
`else
|
||||
wire vs1 = vga_scaler ? HDMI_TX_VS : vs;
|
||||
wire hs1 = vga_scaler ? HDMI_TX_HS : hs;
|
||||
`endif
|
||||
|
||||
assign VGA_VS = VGA_EN ? 1'bZ : csync ? 1'b1 : ~vs1;
|
||||
assign VGA_HS = VGA_EN ? 1'bZ : csync ? ~(vs1 ^ hs1) : ~hs1;
|
||||
assign VGA_R = VGA_EN ? 6'bZZZZZZ : vga_o[23:18];
|
||||
assign VGA_G = VGA_EN ? 6'bZZZZZZ : vga_o[15:10];
|
||||
assign VGA_B = VGA_EN ? 6'bZZZZZZ : vga_o[7:2];
|
||||
|
||||
|
||||
///////////////////////// Audio output ////////////////////////////////
|
||||
|
||||
sigma_delta_dac #(15) dac_l
|
||||
(
|
||||
.CLK(FPGA_CLK3_50),
|
||||
.RESET(reset),
|
||||
.DACin({audio_l[15] ^ audio_s, audio_l[14:0]}),
|
||||
.DACout(AUDIO_L)
|
||||
);
|
||||
|
||||
sigma_delta_dac #(15) dac_r
|
||||
(
|
||||
.CLK(FPGA_CLK3_50),
|
||||
.RESET(reset),
|
||||
.DACin({audio_r[15] ^ audio_s, audio_r[14:0]}),
|
||||
.DACout(AUDIO_R)
|
||||
);
|
||||
|
||||
spdif toslink
|
||||
(
|
||||
.clk_i(FPGA_CLK3_50),
|
||||
|
||||
.rst_i(reset),
|
||||
.half_rate(0),
|
||||
|
||||
.audio_l(audio_l >> !audio_s),
|
||||
.audio_r(audio_r >> !audio_s),
|
||||
|
||||
.spdif_o(AUDIO_SPDIF)
|
||||
);
|
||||
|
||||
|
||||
/////////////////// User module connection ////////////////////////////
|
||||
|
||||
wire [15:0] audio_l, audio_r;
|
||||
wire audio_s;
|
||||
wire [7:0] r_out, g_out, b_out;
|
||||
wire vs, hs, de;
|
||||
wire clk_sys, clk_vid, ce_pix;
|
||||
|
||||
wire ram_clk;
|
||||
wire [28:0] ram_address;
|
||||
wire [7:0] ram_burstcount;
|
||||
wire ram_waitrequest;
|
||||
wire [63:0] ram_readdata;
|
||||
wire ram_readdatavalid;
|
||||
wire ram_read;
|
||||
wire [63:0] ram_writedata;
|
||||
wire [7:0] ram_byteenable;
|
||||
wire ram_write;
|
||||
|
||||
wire led_user;
|
||||
wire [1:0] led_power;
|
||||
wire [1:0] led_disk;
|
||||
|
||||
emu emu
|
||||
(
|
||||
.CLK_50M(FPGA_CLK3_50),
|
||||
.RESET(reset),
|
||||
.HPS_BUS({ctl_clk, clk_vid, ce_pix, de, hs, vs, io_wait, clk_sys, io_fpga, io_uio, io_strobe, io_wide, io_din, io_dout}),
|
||||
|
||||
.CLK_VIDEO(clk_vid),
|
||||
.CE_PIXEL(ce_pix),
|
||||
|
||||
.VGA_R(r_out),
|
||||
.VGA_G(g_out),
|
||||
.VGA_B(b_out),
|
||||
.VGA_HS(hs),
|
||||
.VGA_VS(vs),
|
||||
.VGA_DE(de),
|
||||
|
||||
.LED_USER(led_user),
|
||||
.LED_POWER(led_power),
|
||||
.LED_DISK(led_disk),
|
||||
|
||||
`ifndef LITE
|
||||
.VIDEO_ARX(ARX),
|
||||
.VIDEO_ARY(ARY),
|
||||
`endif
|
||||
|
||||
.AUDIO_L(audio_l),
|
||||
.AUDIO_R(audio_r),
|
||||
.AUDIO_S(audio_s),
|
||||
.TAPE_IN(0),
|
||||
|
||||
// SCK -> CLK
|
||||
// MOSI -> CMD
|
||||
// MISO <- DAT0
|
||||
// Z -> DAT1
|
||||
// Z -> DAT2
|
||||
// CS -> DAT3
|
||||
|
||||
.SD_SCK(SDIO_CLK),
|
||||
.SD_MOSI(SDIO_CMD),
|
||||
.SD_MISO(SDIO_DAT[0]),
|
||||
.SD_CS(SDIO_DAT[3]),
|
||||
|
||||
.DDRAM_CLK(ram_clk),
|
||||
.DDRAM_ADDR(ram_address),
|
||||
.DDRAM_BURSTCNT(ram_burstcount),
|
||||
.DDRAM_BUSY(ram_waitrequest),
|
||||
.DDRAM_DOUT(ram_readdata),
|
||||
.DDRAM_DOUT_READY(ram_readdatavalid),
|
||||
.DDRAM_RD(ram_read),
|
||||
.DDRAM_DIN(ram_writedata),
|
||||
.DDRAM_BE(ram_byteenable),
|
||||
.DDRAM_WE(ram_write),
|
||||
|
||||
.SDRAM_DQ(SDRAM_DQ),
|
||||
.SDRAM_A(SDRAM_A),
|
||||
.SDRAM_DQML(SDRAM_DQML),
|
||||
.SDRAM_DQMH(SDRAM_DQMH),
|
||||
.SDRAM_BA(SDRAM_BA),
|
||||
.SDRAM_nCS(SDRAM_nCS),
|
||||
.SDRAM_nWE(SDRAM_nWE),
|
||||
.SDRAM_nRAS(SDRAM_nRAS),
|
||||
.SDRAM_nCAS(SDRAM_nCAS),
|
||||
.SDRAM_CLK(SDRAM_CLK),
|
||||
.SDRAM_CKE(SDRAM_CKE)
|
||||
);
|
||||
|
||||
endmodule
|
2
sys/sysmem.qip
Normal file
2
sys/sysmem.qip
Normal file
@ -0,0 +1,2 @@
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE sys/sysmem.sv
|
||||
set_global_assignment -name VERILOG_FILE sys/ip/reset_source.v
|
519
sys/sysmem.sv
Normal file
519
sys/sysmem.sv
Normal file
@ -0,0 +1,519 @@
|
||||
`timescale 1 ps / 1 ps
|
||||
module sysmem_lite
|
||||
(
|
||||
input ramclk1_clk, // ramclk1.clk
|
||||
input [28:0] ram1_address, // ram1.address
|
||||
input [7:0] ram1_burstcount, // .burstcount
|
||||
output ram1_waitrequest, // .waitrequest
|
||||
output [63:0] ram1_readdata, // .readdata
|
||||
output ram1_readdatavalid, // .readdatavalid
|
||||
input ram1_read, // .read
|
||||
input [63:0] ram1_writedata, // .writedata
|
||||
input [7:0] ram1_byteenable, // .byteenable
|
||||
input ram1_write, // .write
|
||||
|
||||
input ramclk2_clk, // ramclk2.clk
|
||||
input [28:0] ram2_address, // ram2.address
|
||||
input [7:0] ram2_burstcount, // .burstcount
|
||||
output ram2_waitrequest, // .waitrequest
|
||||
output [63:0] ram2_readdata, // .readdata
|
||||
output ram2_readdatavalid, // .readdatavalid
|
||||
input ram2_read, // .read
|
||||
input [63:0] ram2_writedata, // .writedata
|
||||
input [7:0] ram2_byteenable, // .byteenable
|
||||
input ram2_write, // .write
|
||||
|
||||
output ctl_clock,
|
||||
input reset_cold_req, // reset.cold_req
|
||||
output reset_reset, // .reset
|
||||
input reset_reset_req, // .reset_req
|
||||
input reset_warm_req // .warm_req
|
||||
);
|
||||
|
||||
assign ctl_clock = clk_vip_clk;
|
||||
|
||||
wire hps_h2f_reset_reset; // HPS:h2f_rst_n -> Reset_Source:reset_hps
|
||||
wire reset_source_reset_cold_reset; // Reset_Source:reset_cold -> HPS:f2h_cold_rst_req_n
|
||||
wire reset_source_reset_warm_reset; // Reset_Source:reset_warm -> HPS:f2h_warm_rst_req_n
|
||||
wire clk_vip_clk;
|
||||
|
||||
sysmem_HPS_fpga_interfaces fpga_interfaces (
|
||||
.f2h_cold_rst_req_n (~reset_source_reset_cold_reset), // f2h_cold_reset_req.reset_n
|
||||
.f2h_warm_rst_req_n (~reset_source_reset_warm_reset), // f2h_warm_reset_req.reset_n
|
||||
.h2f_user0_clk (clk_vip_clk), // h2f_user0_clock.clk
|
||||
.h2f_rst_n (hps_h2f_reset_reset), // h2f_reset.reset_n
|
||||
.f2h_sdram0_clk (clk_vip_clk), // f2h_sdram0_clock.clk
|
||||
.f2h_sdram0_ADDRESS (0), // f2h_sdram0_data.address
|
||||
.f2h_sdram0_BURSTCOUNT (0), // .burstcount
|
||||
.f2h_sdram0_WAITREQUEST (), // .waitrequest
|
||||
.f2h_sdram0_READDATA (), // .readdata
|
||||
.f2h_sdram0_READDATAVALID (), // .readdatavalid
|
||||
.f2h_sdram0_READ (0), // .read
|
||||
.f2h_sdram0_WRITEDATA (0), // .writedata
|
||||
.f2h_sdram0_BYTEENABLE (0), // .byteenable
|
||||
.f2h_sdram0_WRITE (0), // .write
|
||||
.f2h_sdram1_clk (ramclk1_clk), // f2h_sdram1_clock.clk
|
||||
.f2h_sdram1_ADDRESS (ram1_address), // f2h_sdram1_data.address
|
||||
.f2h_sdram1_BURSTCOUNT (ram1_burstcount), // .burstcount
|
||||
.f2h_sdram1_WAITREQUEST (ram1_waitrequest), // .waitrequest
|
||||
.f2h_sdram1_READDATA (ram1_readdata), // .readdata
|
||||
.f2h_sdram1_READDATAVALID (ram1_readdatavalid), // .readdatavalid
|
||||
.f2h_sdram1_READ (ram1_read), // .read
|
||||
.f2h_sdram1_WRITEDATA (ram1_writedata), // .writedata
|
||||
.f2h_sdram1_BYTEENABLE (ram1_byteenable), // .byteenable
|
||||
.f2h_sdram1_WRITE (ram1_write), // .write
|
||||
.f2h_sdram2_clk (ramclk2_clk), // f2h_sdram2_clock.clk
|
||||
.f2h_sdram2_ADDRESS (ram2_address), // f2h_sdram2_data.address
|
||||
.f2h_sdram2_BURSTCOUNT (ram2_burstcount), // .burstcount
|
||||
.f2h_sdram2_WAITREQUEST (ram2_waitrequest), // .waitrequest
|
||||
.f2h_sdram2_READDATA (ram2_readdata), // .readdata
|
||||
.f2h_sdram2_READDATAVALID (ram2_readdatavalid), // .readdatavalid
|
||||
.f2h_sdram2_READ (ram2_read), // .read
|
||||
.f2h_sdram2_WRITEDATA (ram2_writedata), // .writedata
|
||||
.f2h_sdram2_BYTEENABLE (ram2_byteenable), // .byteenable
|
||||
.f2h_sdram2_WRITE (ram2_write) // .write
|
||||
);
|
||||
|
||||
reset_source reset_source (
|
||||
.clk (clk_vip_clk), // clock.clk
|
||||
.reset_hps (~hps_h2f_reset_reset), // reset_hps.reset
|
||||
.reset_sys (), // reset_sys.reset
|
||||
.cold_req (reset_cold_req), // reset_ctl.cold_req
|
||||
.reset (reset_reset), // .reset
|
||||
.reset_req (reset_reset_req), // .reset_req
|
||||
.warm_req (reset_warm_req), // .warm_req
|
||||
.reset_warm (reset_source_reset_warm_reset), // reset_warm.reset
|
||||
.reset_cold (reset_source_reset_cold_reset) // reset_cold.reset
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
`timescale 1 ps / 1 ps
|
||||
module sysmem
|
||||
(
|
||||
input ramclk1_clk, // ramclk1.clk
|
||||
input [28:0] ram1_address, // ram1.address
|
||||
input [7:0] ram1_burstcount, // .burstcount
|
||||
output ram1_waitrequest, // .waitrequest
|
||||
output [63:0] ram1_readdata, // .readdata
|
||||
output ram1_readdatavalid, // .readdatavalid
|
||||
input ram1_read, // .read
|
||||
input [63:0] ram1_writedata, // .writedata
|
||||
input [7:0] ram1_byteenable, // .byteenable
|
||||
input ram1_write, // .write
|
||||
|
||||
input ramclk2_clk, // ramclk2.clk
|
||||
input [28:0] ram2_address, // ram2.address
|
||||
input [7:0] ram2_burstcount, // .burstcount
|
||||
output ram2_waitrequest, // .waitrequest
|
||||
output [63:0] ram2_readdata, // .readdata
|
||||
output ram2_readdatavalid, // .readdatavalid
|
||||
input ram2_read, // .read
|
||||
input [63:0] ram2_writedata, // .writedata
|
||||
input [7:0] ram2_byteenable, // .byteenable
|
||||
input ram2_write, // .write
|
||||
|
||||
input reset_cold_req, // reset.cold_req
|
||||
output reset_reset, // .reset
|
||||
input reset_reset_req, // .reset_req
|
||||
input reset_warm_req, // .warm_req
|
||||
|
||||
input [27:0] ram_vip_address, // ram_vip.address
|
||||
input [7:0] ram_vip_burstcount, // .burstcount
|
||||
output ram_vip_waitrequest, // .waitrequest
|
||||
output [127:0] ram_vip_readdata, // .readdata
|
||||
output ram_vip_readdatavalid, // .readdatavalid
|
||||
input ram_vip_read, // .read
|
||||
input [127:0] ram_vip_writedata, // .writedata
|
||||
input [15:0] ram_vip_byteenable, // .byteenable
|
||||
input ram_vip_write, // .write
|
||||
|
||||
output clk_vip_clk, // clk_vip.clk
|
||||
output reset_vip_reset // reset_vip.reset
|
||||
);
|
||||
|
||||
wire hps_h2f_reset_reset; // HPS:h2f_rst_n -> Reset_Source:reset_hps
|
||||
wire reset_source_reset_cold_reset; // Reset_Source:reset_cold -> HPS:f2h_cold_rst_req_n
|
||||
wire reset_source_reset_warm_reset; // Reset_Source:reset_warm -> HPS:f2h_warm_rst_req_n
|
||||
|
||||
sysmem_HPS_fpga_interfaces fpga_interfaces (
|
||||
.f2h_cold_rst_req_n (~reset_source_reset_cold_reset), // f2h_cold_reset_req.reset_n
|
||||
.f2h_warm_rst_req_n (~reset_source_reset_warm_reset), // f2h_warm_reset_req.reset_n
|
||||
.h2f_user0_clk (clk_vip_clk), // h2f_user0_clock.clk
|
||||
.h2f_rst_n (hps_h2f_reset_reset), // h2f_reset.reset_n
|
||||
.f2h_sdram0_clk (clk_vip_clk), // f2h_sdram0_clock.clk
|
||||
.f2h_sdram0_ADDRESS (ram_vip_address), // f2h_sdram0_data.address
|
||||
.f2h_sdram0_BURSTCOUNT (ram_vip_burstcount), // .burstcount
|
||||
.f2h_sdram0_WAITREQUEST (ram_vip_waitrequest), // .waitrequest
|
||||
.f2h_sdram0_READDATA (ram_vip_readdata), // .readdata
|
||||
.f2h_sdram0_READDATAVALID (ram_vip_readdatavalid), // .readdatavalid
|
||||
.f2h_sdram0_READ (ram_vip_read), // .read
|
||||
.f2h_sdram0_WRITEDATA (ram_vip_writedata), // .writedata
|
||||
.f2h_sdram0_BYTEENABLE (ram_vip_byteenable), // .byteenable
|
||||
.f2h_sdram0_WRITE (ram_vip_write), // .write
|
||||
.f2h_sdram1_clk (ramclk1_clk), // f2h_sdram1_clock.clk
|
||||
.f2h_sdram1_ADDRESS (ram1_address), // f2h_sdram1_data.address
|
||||
.f2h_sdram1_BURSTCOUNT (ram1_burstcount), // .burstcount
|
||||
.f2h_sdram1_WAITREQUEST (ram1_waitrequest), // .waitrequest
|
||||
.f2h_sdram1_READDATA (ram1_readdata), // .readdata
|
||||
.f2h_sdram1_READDATAVALID (ram1_readdatavalid), // .readdatavalid
|
||||
.f2h_sdram1_READ (ram1_read), // .read
|
||||
.f2h_sdram1_WRITEDATA (ram1_writedata), // .writedata
|
||||
.f2h_sdram1_BYTEENABLE (ram1_byteenable), // .byteenable
|
||||
.f2h_sdram1_WRITE (ram1_write), // .write
|
||||
.f2h_sdram2_clk (ramclk2_clk), // f2h_sdram2_clock.clk
|
||||
.f2h_sdram2_ADDRESS (ram2_address), // f2h_sdram2_data.address
|
||||
.f2h_sdram2_BURSTCOUNT (ram2_burstcount), // .burstcount
|
||||
.f2h_sdram2_WAITREQUEST (ram2_waitrequest), // .waitrequest
|
||||
.f2h_sdram2_READDATA (ram2_readdata), // .readdata
|
||||
.f2h_sdram2_READDATAVALID (ram2_readdatavalid), // .readdatavalid
|
||||
.f2h_sdram2_READ (ram2_read), // .read
|
||||
.f2h_sdram2_WRITEDATA (ram2_writedata), // .writedata
|
||||
.f2h_sdram2_BYTEENABLE (ram2_byteenable), // .byteenable
|
||||
.f2h_sdram2_WRITE (ram2_write) // .write
|
||||
);
|
||||
|
||||
reset_source reset_source (
|
||||
.clk (clk_vip_clk), // clock.clk
|
||||
.reset_hps (~hps_h2f_reset_reset), // reset_hps.reset
|
||||
.reset_sys (reset_vip_reset), // reset_sys.reset
|
||||
.cold_req (reset_cold_req), // reset_ctl.cold_req
|
||||
.reset (reset_reset), // .reset
|
||||
.reset_req (reset_reset_req), // .reset_req
|
||||
.warm_req (reset_warm_req), // .warm_req
|
||||
.reset_warm (reset_source_reset_warm_reset), // reset_warm.reset
|
||||
.reset_cold (reset_source_reset_cold_reset) // reset_cold.reset
|
||||
);
|
||||
|
||||
endmodule
|
||||
|
||||
module sysmem_HPS_fpga_interfaces
|
||||
(
|
||||
// h2f_reset
|
||||
output wire [1 - 1 : 0 ] h2f_rst_n
|
||||
|
||||
// f2h_cold_reset_req
|
||||
,input wire [1 - 1 : 0 ] f2h_cold_rst_req_n
|
||||
|
||||
// f2h_warm_reset_req
|
||||
,input wire [1 - 1 : 0 ] f2h_warm_rst_req_n
|
||||
|
||||
// h2f_user0_clock
|
||||
,output wire [1 - 1 : 0 ] h2f_user0_clk
|
||||
|
||||
// f2h_sdram0_data
|
||||
,input wire [28 - 1 : 0 ] f2h_sdram0_ADDRESS
|
||||
,input wire [8 - 1 : 0 ] f2h_sdram0_BURSTCOUNT
|
||||
,output wire [1 - 1 : 0 ] f2h_sdram0_WAITREQUEST
|
||||
,output wire [128 - 1 : 0 ] f2h_sdram0_READDATA
|
||||
,output wire [1 - 1 : 0 ] f2h_sdram0_READDATAVALID
|
||||
,input wire [1 - 1 : 0 ] f2h_sdram0_READ
|
||||
,input wire [128 - 1 : 0 ] f2h_sdram0_WRITEDATA
|
||||
,input wire [16 - 1 : 0 ] f2h_sdram0_BYTEENABLE
|
||||
,input wire [1 - 1 : 0 ] f2h_sdram0_WRITE
|
||||
|
||||
// f2h_sdram0_clock
|
||||
,input wire [1 - 1 : 0 ] f2h_sdram0_clk
|
||||
|
||||
// f2h_sdram1_data
|
||||
,input wire [29 - 1 : 0 ] f2h_sdram1_ADDRESS
|
||||
,input wire [8 - 1 : 0 ] f2h_sdram1_BURSTCOUNT
|
||||
,output wire [1 - 1 : 0 ] f2h_sdram1_WAITREQUEST
|
||||
,output wire [64 - 1 : 0 ] f2h_sdram1_READDATA
|
||||
,output wire [1 - 1 : 0 ] f2h_sdram1_READDATAVALID
|
||||
,input wire [1 - 1 : 0 ] f2h_sdram1_READ
|
||||
,input wire [64 - 1 : 0 ] f2h_sdram1_WRITEDATA
|
||||
,input wire [8 - 1 : 0 ] f2h_sdram1_BYTEENABLE
|
||||
,input wire [1 - 1 : 0 ] f2h_sdram1_WRITE
|
||||
|
||||
// f2h_sdram1_clock
|
||||
,input wire [1 - 1 : 0 ] f2h_sdram1_clk
|
||||
|
||||
// f2h_sdram2_data
|
||||
,input wire [29 - 1 : 0 ] f2h_sdram2_ADDRESS
|
||||
,input wire [8 - 1 : 0 ] f2h_sdram2_BURSTCOUNT
|
||||
,output wire [1 - 1 : 0 ] f2h_sdram2_WAITREQUEST
|
||||
,output wire [64 - 1 : 0 ] f2h_sdram2_READDATA
|
||||
,output wire [1 - 1 : 0 ] f2h_sdram2_READDATAVALID
|
||||
,input wire [1 - 1 : 0 ] f2h_sdram2_READ
|
||||
,input wire [64 - 1 : 0 ] f2h_sdram2_WRITEDATA
|
||||
,input wire [8 - 1 : 0 ] f2h_sdram2_BYTEENABLE
|
||||
,input wire [1 - 1 : 0 ] f2h_sdram2_WRITE
|
||||
|
||||
// f2h_sdram2_clock
|
||||
,input wire [1 - 1 : 0 ] f2h_sdram2_clk
|
||||
);
|
||||
|
||||
|
||||
wire [29 - 1 : 0] intermediate;
|
||||
assign intermediate[0:0] = ~intermediate[1:1];
|
||||
assign intermediate[8:8] = intermediate[4:4]|intermediate[7:7];
|
||||
assign intermediate[2:2] = intermediate[9:9];
|
||||
assign intermediate[3:3] = intermediate[9:9];
|
||||
assign intermediate[5:5] = intermediate[9:9];
|
||||
assign intermediate[6:6] = intermediate[9:9];
|
||||
assign intermediate[10:10] = intermediate[9:9];
|
||||
assign intermediate[11:11] = ~intermediate[12:12];
|
||||
assign intermediate[17:17] = intermediate[14:14]|intermediate[16:16];
|
||||
assign intermediate[13:13] = intermediate[18:18];
|
||||
assign intermediate[15:15] = intermediate[18:18];
|
||||
assign intermediate[19:19] = intermediate[18:18];
|
||||
assign intermediate[20:20] = ~intermediate[21:21];
|
||||
assign intermediate[26:26] = intermediate[23:23]|intermediate[25:25];
|
||||
assign intermediate[22:22] = intermediate[27:27];
|
||||
assign intermediate[24:24] = intermediate[27:27];
|
||||
assign intermediate[28:28] = intermediate[27:27];
|
||||
assign f2h_sdram0_WAITREQUEST[0:0] = intermediate[0:0];
|
||||
assign f2h_sdram1_WAITREQUEST[0:0] = intermediate[11:11];
|
||||
assign f2h_sdram2_WAITREQUEST[0:0] = intermediate[20:20];
|
||||
assign intermediate[4:4] = f2h_sdram0_READ[0:0];
|
||||
assign intermediate[7:7] = f2h_sdram0_WRITE[0:0];
|
||||
assign intermediate[9:9] = f2h_sdram0_clk[0:0];
|
||||
assign intermediate[14:14] = f2h_sdram1_READ[0:0];
|
||||
assign intermediate[16:16] = f2h_sdram1_WRITE[0:0];
|
||||
assign intermediate[18:18] = f2h_sdram1_clk[0:0];
|
||||
assign intermediate[23:23] = f2h_sdram2_READ[0:0];
|
||||
assign intermediate[25:25] = f2h_sdram2_WRITE[0:0];
|
||||
assign intermediate[27:27] = f2h_sdram2_clk[0:0];
|
||||
|
||||
cyclonev_hps_interface_clocks_resets clocks_resets(
|
||||
.f2h_warm_rst_req_n({
|
||||
f2h_warm_rst_req_n[0:0] // 0:0
|
||||
})
|
||||
,.f2h_pending_rst_ack({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
,.f2h_dbg_rst_req_n({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
,.h2f_rst_n({
|
||||
h2f_rst_n[0:0] // 0:0
|
||||
})
|
||||
,.f2h_cold_rst_req_n({
|
||||
f2h_cold_rst_req_n[0:0] // 0:0
|
||||
})
|
||||
,.h2f_user0_clk({
|
||||
h2f_user0_clk[0:0] // 0:0
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
cyclonev_hps_interface_dbg_apb debug_apb(
|
||||
.DBG_APB_DISABLE({
|
||||
1'b0 // 0:0
|
||||
})
|
||||
,.P_CLK_EN({
|
||||
1'b0 // 0:0
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
cyclonev_hps_interface_tpiu_trace tpiu(
|
||||
.traceclk_ctl({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
cyclonev_hps_interface_boot_from_fpga boot_from_fpga(
|
||||
.boot_from_fpga_ready({
|
||||
1'b0 // 0:0
|
||||
})
|
||||
,.boot_from_fpga_on_failure({
|
||||
1'b0 // 0:0
|
||||
})
|
||||
,.bsel_en({
|
||||
1'b0 // 0:0
|
||||
})
|
||||
,.csel_en({
|
||||
1'b0 // 0:0
|
||||
})
|
||||
,.csel({
|
||||
2'b01 // 1:0
|
||||
})
|
||||
,.bsel({
|
||||
3'b001 // 2:0
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
cyclonev_hps_interface_fpga2hps fpga2hps(
|
||||
.port_size_config({
|
||||
2'b11 // 1:0
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
cyclonev_hps_interface_hps2fpga hps2fpga(
|
||||
.port_size_config({
|
||||
2'b11 // 1:0
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
cyclonev_hps_interface_fpga2sdram f2sdram(
|
||||
.cfg_rfifo_cport_map({
|
||||
16'b0010000100000000 // 15:0
|
||||
})
|
||||
,.cfg_wfifo_cport_map({
|
||||
16'b0010000100000000 // 15:0
|
||||
})
|
||||
,.rd_ready_3({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
,.cmd_port_clk_2({
|
||||
intermediate[28:28] // 0:0
|
||||
})
|
||||
,.rd_ready_2({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
,.cmd_port_clk_1({
|
||||
intermediate[19:19] // 0:0
|
||||
})
|
||||
,.rd_ready_1({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
,.cmd_port_clk_0({
|
||||
intermediate[10:10] // 0:0
|
||||
})
|
||||
,.rd_ready_0({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
,.wrack_ready_2({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
,.wrack_ready_1({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
,.wrack_ready_0({
|
||||
1'b1 // 0:0
|
||||
})
|
||||
,.cmd_ready_2({
|
||||
intermediate[21:21] // 0:0
|
||||
})
|
||||
,.cmd_ready_1({
|
||||
intermediate[12:12] // 0:0
|
||||
})
|
||||
,.cmd_ready_0({
|
||||
intermediate[1:1] // 0:0
|
||||
})
|
||||
,.cfg_port_width({
|
||||
12'b000000010110 // 11:0
|
||||
})
|
||||
,.rd_valid_3({
|
||||
f2h_sdram2_READDATAVALID[0:0] // 0:0
|
||||
})
|
||||
,.rd_valid_2({
|
||||
f2h_sdram1_READDATAVALID[0:0] // 0:0
|
||||
})
|
||||
,.rd_valid_1({
|
||||
f2h_sdram0_READDATAVALID[0:0] // 0:0
|
||||
})
|
||||
,.rd_clk_3({
|
||||
intermediate[22:22] // 0:0
|
||||
})
|
||||
,.rd_data_3({
|
||||
f2h_sdram2_READDATA[63:0] // 63:0
|
||||
})
|
||||
,.rd_clk_2({
|
||||
intermediate[13:13] // 0:0
|
||||
})
|
||||
,.rd_data_2({
|
||||
f2h_sdram1_READDATA[63:0] // 63:0
|
||||
})
|
||||
,.rd_clk_1({
|
||||
intermediate[3:3] // 0:0
|
||||
})
|
||||
,.rd_data_1({
|
||||
f2h_sdram0_READDATA[127:64] // 63:0
|
||||
})
|
||||
,.rd_clk_0({
|
||||
intermediate[2:2] // 0:0
|
||||
})
|
||||
,.rd_data_0({
|
||||
f2h_sdram0_READDATA[63:0] // 63:0
|
||||
})
|
||||
,.cfg_axi_mm_select({
|
||||
6'b000000 // 5:0
|
||||
})
|
||||
,.cmd_valid_2({
|
||||
intermediate[26:26] // 0:0
|
||||
})
|
||||
,.cmd_valid_1({
|
||||
intermediate[17:17] // 0:0
|
||||
})
|
||||
,.cmd_valid_0({
|
||||
intermediate[8:8] // 0:0
|
||||
})
|
||||
,.cfg_cport_rfifo_map({
|
||||
18'b000000000011010000 // 17:0
|
||||
})
|
||||
,.wr_data_3({
|
||||
2'b00 // 89:88
|
||||
,f2h_sdram2_BYTEENABLE[7:0] // 87:80
|
||||
,16'b0000000000000000 // 79:64
|
||||
,f2h_sdram2_WRITEDATA[63:0] // 63:0
|
||||
})
|
||||
,.wr_data_2({
|
||||
2'b00 // 89:88
|
||||
,f2h_sdram1_BYTEENABLE[7:0] // 87:80
|
||||
,16'b0000000000000000 // 79:64
|
||||
,f2h_sdram1_WRITEDATA[63:0] // 63:0
|
||||
})
|
||||
,.wr_data_1({
|
||||
2'b00 // 89:88
|
||||
,f2h_sdram0_BYTEENABLE[15:8] // 87:80
|
||||
,16'b0000000000000000 // 79:64
|
||||
,f2h_sdram0_WRITEDATA[127:64] // 63:0
|
||||
})
|
||||
,.cfg_cport_type({
|
||||
12'b000000111111 // 11:0
|
||||
})
|
||||
,.wr_data_0({
|
||||
2'b00 // 89:88
|
||||
,f2h_sdram0_BYTEENABLE[7:0] // 87:80
|
||||
,16'b0000000000000000 // 79:64
|
||||
,f2h_sdram0_WRITEDATA[63:0] // 63:0
|
||||
})
|
||||
,.cfg_cport_wfifo_map({
|
||||
18'b000000000011010000 // 17:0
|
||||
})
|
||||
,.wr_clk_3({
|
||||
intermediate[24:24] // 0:0
|
||||
})
|
||||
,.wr_clk_2({
|
||||
intermediate[15:15] // 0:0
|
||||
})
|
||||
,.wr_clk_1({
|
||||
intermediate[6:6] // 0:0
|
||||
})
|
||||
,.wr_clk_0({
|
||||
intermediate[5:5] // 0:0
|
||||
})
|
||||
,.cmd_data_2({
|
||||
18'b000000000000000000 // 59:42
|
||||
,f2h_sdram2_BURSTCOUNT[7:0] // 41:34
|
||||
,3'b000 // 33:31
|
||||
,f2h_sdram2_ADDRESS[28:0] // 30:2
|
||||
,intermediate[25:25] // 1:1
|
||||
,intermediate[23:23] // 0:0
|
||||
})
|
||||
,.cmd_data_1({
|
||||
18'b000000000000000000 // 59:42
|
||||
,f2h_sdram1_BURSTCOUNT[7:0] // 41:34
|
||||
,3'b000 // 33:31
|
||||
,f2h_sdram1_ADDRESS[28:0] // 30:2
|
||||
,intermediate[16:16] // 1:1
|
||||
,intermediate[14:14] // 0:0
|
||||
})
|
||||
,.cmd_data_0({
|
||||
18'b000000000000000000 // 59:42
|
||||
,f2h_sdram0_BURSTCOUNT[7:0] // 41:34
|
||||
,4'b0000 // 33:30
|
||||
,f2h_sdram0_ADDRESS[27:0] // 29:2
|
||||
,intermediate[7:7] // 1:1
|
||||
,intermediate[4:4] // 0:0
|
||||
})
|
||||
);
|
||||
|
||||
endmodule
|
65
sys/vga_out.sv
Normal file
65
sys/vga_out.sv
Normal file
@ -0,0 +1,65 @@
|
||||
|
||||
module vga_out
|
||||
(
|
||||
input ypbpr_full,
|
||||
input ypbpr_en,
|
||||
|
||||
input [23:0] din,
|
||||
output [23:0] dout
|
||||
);
|
||||
|
||||
wire [5:0] yuv_full[225] = '{
|
||||
6'd0, 6'd0, 6'd0, 6'd0, 6'd1, 6'd1, 6'd1, 6'd1,
|
||||
6'd2, 6'd2, 6'd2, 6'd3, 6'd3, 6'd3, 6'd3, 6'd4,
|
||||
6'd4, 6'd4, 6'd5, 6'd5, 6'd5, 6'd5, 6'd6, 6'd6,
|
||||
6'd6, 6'd7, 6'd7, 6'd7, 6'd7, 6'd8, 6'd8, 6'd8,
|
||||
6'd9, 6'd9, 6'd9, 6'd9, 6'd10, 6'd10, 6'd10, 6'd11,
|
||||
6'd11, 6'd11, 6'd11, 6'd12, 6'd12, 6'd12, 6'd13, 6'd13,
|
||||
6'd13, 6'd13, 6'd14, 6'd14, 6'd14, 6'd15, 6'd15, 6'd15,
|
||||
6'd15, 6'd16, 6'd16, 6'd16, 6'd17, 6'd17, 6'd17, 6'd17,
|
||||
6'd18, 6'd18, 6'd18, 6'd19, 6'd19, 6'd19, 6'd19, 6'd20,
|
||||
6'd20, 6'd20, 6'd21, 6'd21, 6'd21, 6'd21, 6'd22, 6'd22,
|
||||
6'd22, 6'd23, 6'd23, 6'd23, 6'd23, 6'd24, 6'd24, 6'd24,
|
||||
6'd25, 6'd25, 6'd25, 6'd25, 6'd26, 6'd26, 6'd26, 6'd27,
|
||||
6'd27, 6'd27, 6'd27, 6'd28, 6'd28, 6'd28, 6'd29, 6'd29,
|
||||
6'd29, 6'd29, 6'd30, 6'd30, 6'd30, 6'd31, 6'd31, 6'd31,
|
||||
6'd31, 6'd32, 6'd32, 6'd32, 6'd33, 6'd33, 6'd33, 6'd33,
|
||||
6'd34, 6'd34, 6'd34, 6'd35, 6'd35, 6'd35, 6'd35, 6'd36,
|
||||
6'd36, 6'd36, 6'd36, 6'd37, 6'd37, 6'd37, 6'd38, 6'd38,
|
||||
6'd38, 6'd38, 6'd39, 6'd39, 6'd39, 6'd40, 6'd40, 6'd40,
|
||||
6'd40, 6'd41, 6'd41, 6'd41, 6'd42, 6'd42, 6'd42, 6'd42,
|
||||
6'd43, 6'd43, 6'd43, 6'd44, 6'd44, 6'd44, 6'd44, 6'd45,
|
||||
6'd45, 6'd45, 6'd46, 6'd46, 6'd46, 6'd46, 6'd47, 6'd47,
|
||||
6'd47, 6'd48, 6'd48, 6'd48, 6'd48, 6'd49, 6'd49, 6'd49,
|
||||
6'd50, 6'd50, 6'd50, 6'd50, 6'd51, 6'd51, 6'd51, 6'd52,
|
||||
6'd52, 6'd52, 6'd52, 6'd53, 6'd53, 6'd53, 6'd54, 6'd54,
|
||||
6'd54, 6'd54, 6'd55, 6'd55, 6'd55, 6'd56, 6'd56, 6'd56,
|
||||
6'd56, 6'd57, 6'd57, 6'd57, 6'd58, 6'd58, 6'd58, 6'd58,
|
||||
6'd59, 6'd59, 6'd59, 6'd60, 6'd60, 6'd60, 6'd60, 6'd61,
|
||||
6'd61, 6'd61, 6'd62, 6'd62, 6'd62, 6'd62, 6'd63, 6'd63,
|
||||
6'd63
|
||||
};
|
||||
|
||||
wire [5:0] red = din[23:18];
|
||||
wire [5:0] green = din[15:10];
|
||||
wire [5:0] blue = din[7:2];
|
||||
|
||||
// http://marsee101.blog19.fc2.com/blog-entry-2311.html
|
||||
// Y = 16 + 0.257*R + 0.504*G + 0.098*B (Y = 0.299*R + 0.587*G + 0.114*B)
|
||||
// Pb = 128 - 0.148*R - 0.291*G + 0.439*B (Pb = -0.169*R - 0.331*G + 0.500*B)
|
||||
// Pr = 128 + 0.439*R - 0.368*G - 0.071*B (Pr = 0.500*R - 0.419*G - 0.081*B)
|
||||
|
||||
wire [18:0] y_8 = 19'd04096 + ({red, 8'd0} + {red, 3'd0}) + ({green, 9'd0} + {green, 2'd0}) + ({blue, 6'd0} + {blue, 5'd0} + {blue, 2'd0});
|
||||
wire [18:0] pb_8 = 19'd32768 - ({red, 7'd0} + {red, 4'd0} + {red, 3'd0}) - ({green, 8'd0} + {green, 5'd0} + {green, 3'd0}) + ({blue, 8'd0} + {blue, 7'd0} + {blue, 6'd0});
|
||||
wire [18:0] pr_8 = 19'd32768 + ({red, 8'd0} + {red, 7'd0} + {red, 6'd0}) - ({green, 8'd0} + {green, 6'd0} + {green, 5'd0} + {green, 4'd0} + {green, 3'd0}) - ({blue, 6'd0} + {blue , 3'd0});
|
||||
|
||||
wire [7:0] y = ( y_8[17:8] < 16) ? 8'd16 : ( y_8[17:8] > 235) ? 8'd235 : y_8[15:8];
|
||||
wire [7:0] pb = (pb_8[17:8] < 16) ? 8'd16 : (pb_8[17:8] > 240) ? 8'd240 : pb_8[15:8];
|
||||
wire [7:0] pr = (pr_8[17:8] < 16) ? 8'd16 : (pr_8[17:8] > 240) ? 8'd240 : pr_8[15:8];
|
||||
|
||||
assign dout[23:16] = ypbpr_en ? {(ypbpr_full ? yuv_full[pr-8'd16] : pr[7:2]), 2'b00} : din[23:16];
|
||||
assign dout[15:8] = ypbpr_en ? {(ypbpr_full ? yuv_full[y -8'd16] : y[7:2]), 2'b00} : din[15:8];
|
||||
assign dout[7:0] = ypbpr_en ? {(ypbpr_full ? yuv_full[pb-8'd16] : pb[7:2]), 2'b00} : din[7:0];
|
||||
|
||||
|
||||
endmodule
|
167
sys/video_mixer.sv
Normal file
167
sys/video_mixer.sv
Normal file
@ -0,0 +1,167 @@
|
||||
//
|
||||
//
|
||||
// Copyright (c) 2017 Sorgelig
|
||||
//
|
||||
// This program is GPL Licensed. See COPYING for the full license.
|
||||
//
|
||||
//
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
`timescale 1ns / 1ps
|
||||
|
||||
//
|
||||
// LINE_LENGTH: Length of display line in pixels
|
||||
// Usually it's length from HSync to HSync.
|
||||
// May be less if line_start is used.
|
||||
//
|
||||
// HALF_DEPTH: If =1 then color dept is 4 bits per component
|
||||
// For half depth 8 bits monochrome is available with
|
||||
// mono signal enabled and color = {G, R}
|
||||
|
||||
module video_mixer
|
||||
#(
|
||||
parameter LINE_LENGTH = 768,
|
||||
parameter HALF_DEPTH = 0
|
||||
)
|
||||
(
|
||||
// master clock
|
||||
// it should be multiple by (ce_pix*4).
|
||||
input clk_sys,
|
||||
|
||||
// Pixel clock or clock_enable (both are accepted).
|
||||
input ce_pix,
|
||||
output ce_pix_out,
|
||||
|
||||
input scandoubler,
|
||||
|
||||
// scanlines (00-none 01-25% 10-50% 11-75%)
|
||||
input [1:0] scanlines,
|
||||
|
||||
// High quality 2x scaling
|
||||
input hq2x,
|
||||
|
||||
// color
|
||||
input [DWIDTH:0] R,
|
||||
input [DWIDTH:0] G,
|
||||
input [DWIDTH:0] B,
|
||||
|
||||
// Monochrome mode (for HALF_DEPTH only)
|
||||
input mono,
|
||||
|
||||
// Positive pulses.
|
||||
input HSync,
|
||||
input VSync,
|
||||
input HBlank,
|
||||
input VBlank,
|
||||
|
||||
// video output signals
|
||||
output reg [7:0] VGA_R,
|
||||
output reg [7:0] VGA_G,
|
||||
output reg [7:0] VGA_B,
|
||||
output reg VGA_VS,
|
||||
output reg VGA_HS,
|
||||
output reg VGA_DE
|
||||
);
|
||||
|
||||
localparam DWIDTH = HALF_DEPTH ? 3 : 7;
|
||||
|
||||
wire [DWIDTH:0] R_sd;
|
||||
wire [DWIDTH:0] G_sd;
|
||||
wire [DWIDTH:0] B_sd;
|
||||
wire hs_sd, vs_sd, hb_sd, vb_sd, ce_pix_sd;
|
||||
|
||||
scandoubler #(.LENGTH(LINE_LENGTH), .HALF_DEPTH(HALF_DEPTH)) sd
|
||||
(
|
||||
.*,
|
||||
.hs_in(HSync),
|
||||
.vs_in(VSync),
|
||||
.hb_in(HBlank),
|
||||
.vb_in(VBlank),
|
||||
.r_in(R),
|
||||
.g_in(G),
|
||||
.b_in(B),
|
||||
|
||||
.ce_pix_out(ce_pix_sd),
|
||||
.hs_out(hs_sd),
|
||||
.vs_out(vs_sd),
|
||||
.hb_out(hb_sd),
|
||||
.vb_out(vb_sd),
|
||||
.r_out(R_sd),
|
||||
.g_out(G_sd),
|
||||
.b_out(B_sd)
|
||||
);
|
||||
|
||||
wire [DWIDTH:0] rt = (scandoubler ? R_sd : R);
|
||||
wire [DWIDTH:0] gt = (scandoubler ? G_sd : G);
|
||||
wire [DWIDTH:0] bt = (scandoubler ? B_sd : B);
|
||||
|
||||
generate
|
||||
if(HALF_DEPTH) begin
|
||||
wire [7:0] r = mono ? {gt,rt} : {rt,rt};
|
||||
wire [7:0] g = mono ? {gt,rt} : {gt,gt};
|
||||
wire [7:0] b = mono ? {gt,rt} : {bt,bt};
|
||||
end else begin
|
||||
wire [7:0] r = rt;
|
||||
wire [7:0] g = gt;
|
||||
wire [7:0] b = bt;
|
||||
end
|
||||
endgenerate
|
||||
|
||||
wire hs = (scandoubler ? hs_sd : HSync);
|
||||
wire vs = (scandoubler ? vs_sd : VSync);
|
||||
|
||||
assign ce_pix_out = scandoubler ? ce_pix_sd : ce_pix;
|
||||
|
||||
|
||||
reg scanline = 0;
|
||||
always @(posedge clk_sys) begin
|
||||
reg old_hs, old_vs;
|
||||
|
||||
old_hs <= hs;
|
||||
old_vs <= vs;
|
||||
|
||||
if(old_hs && ~hs) scanline <= ~scanline;
|
||||
if(old_vs && ~vs) scanline <= 0;
|
||||
end
|
||||
|
||||
wire hde = scandoubler ? ~hb_sd : ~HBlank;
|
||||
wire vde = scandoubler ? ~vb_sd : ~VBlank;
|
||||
|
||||
always @(posedge clk_sys) begin
|
||||
reg old_hde;
|
||||
|
||||
case(scanlines & {scanline, scanline})
|
||||
1: begin // reduce 25% = 1/2 + 1/4
|
||||
VGA_R <= {1'b0, r[7:1]} + {2'b00, r[7:2]};
|
||||
VGA_G <= {1'b0, g[7:1]} + {2'b00, g[7:2]};
|
||||
VGA_B <= {1'b0, b[7:1]} + {2'b00, b[7:2]};
|
||||
end
|
||||
|
||||
2: begin // reduce 50% = 1/2
|
||||
VGA_R <= {1'b0, r[7:1]};
|
||||
VGA_G <= {1'b0, g[7:1]};
|
||||
VGA_B <= {1'b0, b[7:1]};
|
||||
end
|
||||
|
||||
3: begin // reduce 75% = 1/4
|
||||
VGA_R <= {2'b00, r[7:2]};
|
||||
VGA_G <= {2'b00, g[7:2]};
|
||||
VGA_B <= {2'b00, b[7:2]};
|
||||
end
|
||||
|
||||
default: begin
|
||||
VGA_R <= r;
|
||||
VGA_G <= g;
|
||||
VGA_B <= b;
|
||||
end
|
||||
endcase
|
||||
|
||||
VGA_VS <= vs;
|
||||
VGA_HS <= hs;
|
||||
|
||||
old_hde <= hde;
|
||||
if(~old_hde && hde && vde) VGA_DE <= 1;
|
||||
if(old_hde && ~hde) VGA_DE <= 0;
|
||||
end
|
||||
|
||||
endmodule
|
2
sys/vip.qip
Normal file
2
sys/vip.qip
Normal file
@ -0,0 +1,2 @@
|
||||
set_global_assignment -name SYSTEMVERILOG_FILE sys/vip_config.sv
|
||||
set_global_assignment -name QIP_FILE sys/vip/synthesis/vip.qip
|
1097
sys/vip.qsys
Normal file
1097
sys/vip.qsys
Normal file
File diff suppressed because it is too large
Load Diff
169
sys/vip_config.sv
Normal file
169
sys/vip_config.sv
Normal file
@ -0,0 +1,169 @@
|
||||
|
||||
module vip_config
|
||||
(
|
||||
input clk,
|
||||
input reset,
|
||||
|
||||
input [7:0] ARX,
|
||||
input [7:0] ARY,
|
||||
|
||||
output reg [8:0] address,
|
||||
output reg write,
|
||||
output reg [31:0] writedata,
|
||||
input waitrequest
|
||||
);
|
||||
|
||||
//Any input video resolution up to 1920x1080 is supported.
|
||||
|
||||
//Output video parameters.
|
||||
//It's good to keep 1280x720@60 resolution among all cores as most compatible resolution.
|
||||
parameter WIDTH = 1280;
|
||||
parameter HEIGHT = 720;
|
||||
parameter HFP = 110;
|
||||
parameter HBP = 220;
|
||||
parameter HS = 40;
|
||||
parameter VFP = 5;
|
||||
parameter VBP = 20;
|
||||
parameter VS = 5;
|
||||
|
||||
|
||||
reg [31:0] wcalc;
|
||||
reg [31:0] hcalc;
|
||||
|
||||
wire [31:0] videow = (wcalc > WIDTH) ? WIDTH : wcalc;
|
||||
wire [31:0] videoh = (hcalc > HEIGHT) ? HEIGHT : hcalc;
|
||||
|
||||
wire [31:0] posx = (WIDTH - videow)>>1;
|
||||
wire [31:0] posy = (HEIGHT- videoh)>>1;
|
||||
|
||||
|
||||
always @(posedge clk) begin
|
||||
reg [7:0] state = 0;
|
||||
reg [7:0] arx, ary;
|
||||
integer timeout = 0;
|
||||
|
||||
if(reset || (!state && ((arx != ARX) || (ary != ARY)))) begin
|
||||
arx <= ARX;
|
||||
ary <= ARY;
|
||||
timeout <= 0;
|
||||
write <= 0;
|
||||
end
|
||||
else
|
||||
if(timeout < 1000000)
|
||||
begin
|
||||
timeout <= timeout + 1;
|
||||
write <= 0;
|
||||
state <= 1;
|
||||
end
|
||||
else
|
||||
if(~waitrequest && state)
|
||||
begin
|
||||
state <= state + 1'd1;
|
||||
write <= 1;
|
||||
|
||||
case(state)
|
||||
01: begin
|
||||
wcalc <= (HEIGHT*arx)/ary;
|
||||
hcalc <= (WIDTH*ary)/arx;
|
||||
end
|
||||
endcase
|
||||
|
||||
if(state&3) write <= 0;
|
||||
else
|
||||
case(state>>2)
|
||||
//scaler
|
||||
01: begin
|
||||
address <= 'h003; //Output Width
|
||||
writedata <= videow;
|
||||
end
|
||||
02: begin
|
||||
address <= 'h004; //Output Height
|
||||
writedata <= videoh;
|
||||
end
|
||||
03: begin
|
||||
address <= 'h000; //Go
|
||||
writedata <= 1;
|
||||
end
|
||||
|
||||
//mixer
|
||||
10: begin
|
||||
address <= 'h083; //Bkg Width
|
||||
writedata <= WIDTH;
|
||||
end
|
||||
11: begin
|
||||
address <= 'h084; //Bkg Height
|
||||
writedata <= HEIGHT;
|
||||
end
|
||||
12: begin
|
||||
address <= 'h088; //Pos X
|
||||
writedata <= posx;
|
||||
end
|
||||
13: begin
|
||||
address <= 'h089; //Pos Y
|
||||
writedata <= posy;
|
||||
end
|
||||
14: begin
|
||||
address <= 'h08A; //Enable Video 0
|
||||
writedata <= 1;
|
||||
end
|
||||
15: begin
|
||||
address <= 'h080; //Go
|
||||
writedata <= 1;
|
||||
end
|
||||
|
||||
//video mode
|
||||
20: begin
|
||||
address <= 'h104; //Bank
|
||||
writedata <= 0;
|
||||
end
|
||||
21: begin
|
||||
address <= 'h105; //Progressive/Interlaced
|
||||
writedata <= 0;
|
||||
end
|
||||
22: begin
|
||||
address <= 'h106; //Active pixel count
|
||||
writedata <= WIDTH;
|
||||
end
|
||||
23: begin
|
||||
address <= 'h107; //Active line count
|
||||
writedata <= HEIGHT;
|
||||
end
|
||||
24: begin
|
||||
address <= 'h109; //Horizontal Front Porch
|
||||
writedata <= HFP;
|
||||
end
|
||||
25: begin
|
||||
address <= 'h10A; //Horizontal Sync Length
|
||||
writedata <= HS;
|
||||
end
|
||||
26: begin
|
||||
address <= 'h10B; //Horizontal Blanking (HFP+HBP+HSync)
|
||||
writedata <= HFP+HBP+HS;
|
||||
end
|
||||
27: begin
|
||||
address <= 'h10C; //Vertical Front Porch
|
||||
writedata <= VFP;
|
||||
end
|
||||
28: begin
|
||||
address <= 'h10D; //Vertical Sync Length
|
||||
writedata <= VS;
|
||||
end
|
||||
29: begin
|
||||
address <= 'h10E; //Vertical blanking (VFP+VBP+VSync)
|
||||
writedata <= VFP+VBP+VS;
|
||||
end
|
||||
30: begin
|
||||
address <= 'h11E; //Valid
|
||||
writedata <= 1;
|
||||
end
|
||||
31: begin
|
||||
address <= 'h100; //Go
|
||||
writedata <= 1;
|
||||
end
|
||||
|
||||
default: write <= 0;
|
||||
endcase
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
365
via.v
Normal file
365
via.v
Normal file
@ -0,0 +1,365 @@
|
||||
/* VIA
|
||||
|
||||
This implementation assumes the I/O data directions and PCR edge triggers used in the Macintosh,
|
||||
and ignores most writes to the VIA data direction registers and the PCR.
|
||||
|
||||
The 16 VIA registers are mapped to addresses {8'hEF, 8'b111xxxx1, 8'hFE}:
|
||||
0 $0 vBufB register B
|
||||
1 $200 ????? register A (controls handshake)
|
||||
2 $400 vDirB register B direction register
|
||||
3 $600 vDirA register A direction register
|
||||
4 $800 vT1C timer 1 counter (low-order byte) - for sound?
|
||||
5 $A00 vT1CH timer 1 counter (high-order byte)
|
||||
6 $C00 vT1L timer 1 latch (low-order byte)
|
||||
7 $E00 vT1LH timer 1 latch (high-order byte)
|
||||
8 $1000 vT2C timer 2 counter (low-order byte) - W: writes T2L-L R: read T2C-L and clear interrupt flag
|
||||
9 $1200 vT2CH timer 2 counter (high-order byte) - W: write T2C-H, transfer T2L-L to T2C-L, clear interrupt flag R: read T2C-H
|
||||
10 $1400 vSR shift register (keyboard)
|
||||
11 $1600 vACR auxiliary control register
|
||||
12 $1800 vPCR peripheral control register
|
||||
13 $1A00 vIFR interrupt flag register
|
||||
14 $1C00 vIER interrupt enable register
|
||||
15 $1E00 vBufA register A (no handshake)
|
||||
|
||||
Register A:
|
||||
Bit(s) Name Dir Description
|
||||
|
||||
7 vSCCWReq in SCC wait/request
|
||||
6 vPage2 out Alternate screen buffer (1 = main buffer)
|
||||
5 vHeadSel out Disk SEL line
|
||||
4 vOverlay out ROM low-memory overlay (1 = overlay on)
|
||||
3 vSndPg2 out Alternate sound buffer (1 = main buffer)
|
||||
0-2 vSound (mask) out Sound volume
|
||||
|
||||
Register B:
|
||||
Bit Name Dir Description
|
||||
|
||||
7 vSndEnb out Sound enable/disable
|
||||
6 vH4 in Horizontal blanking
|
||||
5 vY2 in Mouse Y2
|
||||
4 vX2 in Mouse X2
|
||||
3 vSW in Mouse switch
|
||||
2 rTCEnb out Real-time clock serial enable (active low I think)
|
||||
1 rTCClk out Real-time clock data-clock line
|
||||
0 rTCData in/out Real-time clock serial data
|
||||
|
||||
Interrupt flag and enable registers:
|
||||
IFR bit 7: remains set (and the IRQ line to the processor is held low) as long as any enabled VIA
|
||||
interrupt is occurring.
|
||||
IER bit 7: "enable/disable": If bit 7 is a 1, each 1 in bits 0-6 enables the corresponding interrupt;
|
||||
if bit 7 is a 0, each 1 in bits 0-6 disables that interrupt. In either case, 0's in bits 0-6 do not
|
||||
change the status of those interrupts. Bit 7 is always read as a 1.
|
||||
|
||||
Bit Interrupting device
|
||||
|
||||
7 IRQ (IFR) or enable (IER)
|
||||
6 Timer 1 timeout
|
||||
5 Timer 2 timeout
|
||||
4 Keyboard clock (CB1)
|
||||
3 Keyboard data bit (CB2)
|
||||
2 Keyboard data ready (completion of 8 shifts) (SR)
|
||||
1 Vertical blanking interrupt (CA1)
|
||||
0 One-second interrupt (CA2)
|
||||
|
||||
Peripheral control register:
|
||||
Bit Description
|
||||
|
||||
5-7 CB2 control (keyboard data bit)
|
||||
4 CB1 control (keyboard clock)
|
||||
1-3 CA2 control (one-second interrupt)
|
||||
0 CA1 control (vertical blanking interrupt)
|
||||
|
||||
1-bit controls: 0 = negative edge trigger (normal Macintosh mode), 1 = positive edge trigger
|
||||
3-bit controls:
|
||||
000 set IFR on negative edge, clear IFR on read/write from register A/B. Normal Macintosh mode.
|
||||
001 set IFR on negative edge
|
||||
010 set IFR on positive edge, clear IFR on read/write from register A/B
|
||||
011 set IFR on positive edge
|
||||
100-111 not used in Macintosh (output mode)
|
||||
|
||||
Auxiliary control register:
|
||||
Bit Description
|
||||
6-7 T1 control, 00 = one-shot mode, output to PB7 disabled, 11 = free running mode, output to PB7 enabled
|
||||
5 T2 control, 0 = interval timer in one-shot mode (Mac mode), 1 = counts a predetermined number of pulses on pin PB6 (not used)
|
||||
2-4 shift register control
|
||||
1 PB latch enable
|
||||
0 PA latch enable
|
||||
|
||||
Timer 2:
|
||||
For Macintosh, always operates as a one-shot inerval timer.
|
||||
8 $1000 vT2C W: write T2L-L R: read T2C-L and clear interrupt flag
|
||||
9 $1200 vT2CH W: write T2C-H, transfer T2L-L to T2C-L, clear interrupt, arms timer flag R: read T2C-H
|
||||
*/
|
||||
|
||||
`define INT_ONESEC 0
|
||||
`define INT_VBLANK 1
|
||||
`define INT_KEYREADY 2
|
||||
`define INT_KEYBIT 3
|
||||
`define INT_KEYCLK 4
|
||||
`define INT_T2 5
|
||||
`define INT_T1 6
|
||||
|
||||
module via
|
||||
(
|
||||
input clk,
|
||||
input cep,
|
||||
input cen,
|
||||
|
||||
input _reset,
|
||||
input selectVIA,
|
||||
input _cpuRW,
|
||||
input _cpuUDS,
|
||||
input [15:0] dataIn,
|
||||
input [3:0] cpuAddrRegHi,
|
||||
input _hblank,
|
||||
input _vblank,
|
||||
input mouseY2,
|
||||
input mouseX2,
|
||||
input mouseButton,
|
||||
input rtcData,
|
||||
input sccWReq,
|
||||
output _irq,
|
||||
output [15:0] dataOut,
|
||||
output memoryOverlayOn,
|
||||
output SEL, // to IWM
|
||||
|
||||
output snd_ena,
|
||||
output snd_alt,
|
||||
output [2:0] snd_vol,
|
||||
|
||||
input [7:0] kbd_in_data,
|
||||
input kbd_in_strobe,
|
||||
output [7:0] kbd_out_data,
|
||||
output reg kbd_out_strobe
|
||||
);
|
||||
|
||||
wire [7:0] dataInHi = dataIn[15:8];
|
||||
reg [7:0] dataOutHi;
|
||||
assign dataOut = { dataOutHi, 8'hEF };
|
||||
|
||||
reg [7:0] viaADataOut;
|
||||
reg [7:0] viaBDataOut;
|
||||
reg viaB0DDR;
|
||||
reg [6:0] viaIFR;
|
||||
reg [6:0] viaIER;
|
||||
reg [7:0] viaACR;
|
||||
reg [7:0] viaSR;
|
||||
reg [15:0] viaTimer1Count;
|
||||
reg [15:0] viaTimer1Latch;
|
||||
reg [15:0] viaTimer2Count;
|
||||
reg [7:0] viaTimer2LatchLow;
|
||||
reg viaTimer2Armed;
|
||||
|
||||
|
||||
// shift register can be written by CPU and by external source
|
||||
/* Write to SR (including external input) */
|
||||
assign kbd_out_data = viaSR;
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0)
|
||||
viaSR <= 8'b0;
|
||||
else if(cen) begin
|
||||
if((selectVIA == 1'b1) && (_cpuUDS == 1'b0) &&
|
||||
(_cpuRW == 1'b0) && (cpuAddrRegHi == 4'hA))
|
||||
viaSR <= dataInHi;
|
||||
|
||||
if (viaACR[4:2] == 3'b011 && kbd_in_strobe)
|
||||
viaSR <= kbd_in_data;
|
||||
end
|
||||
end
|
||||
|
||||
/* Generate sr_out_strobe */
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0)
|
||||
kbd_out_strobe <= 1'b0;
|
||||
else if(cen) begin
|
||||
if((selectVIA == 1'b1) && (_cpuUDS == 1'b0) &&
|
||||
(_cpuRW == 1'b0) && (cpuAddrRegHi == 4'hA) &&
|
||||
(viaACR[4:2] == 3'b111))
|
||||
kbd_out_strobe <= 1;
|
||||
else
|
||||
kbd_out_strobe <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
// divide by 10 clock divider for the VIA timers: 0.78336 MHz
|
||||
reg [3:0] clkDiv;
|
||||
always @(posedge clk) begin
|
||||
if(cep) begin
|
||||
if (clkDiv == 4'h9)
|
||||
clkDiv <= 0;
|
||||
else
|
||||
clkDiv <= clkDiv + 1'b1;
|
||||
end
|
||||
end
|
||||
wire timerStrobe = (clkDiv == 0);
|
||||
|
||||
// store previous vblank value, for edge detection
|
||||
reg _lastVblank;
|
||||
always @(posedge clk) if(cen) _lastVblank <= _vblank;
|
||||
|
||||
// count vblanks, and set 1 second interrupt after 60 vblanks
|
||||
reg [5:0] vblankCount;
|
||||
always @(posedge clk) begin
|
||||
if(cen) begin
|
||||
if (_vblank == 1'b0 && _lastVblank == 1'b1) begin
|
||||
if (vblankCount != 59) begin
|
||||
vblankCount <= vblankCount + 1'b1;
|
||||
end
|
||||
else begin
|
||||
vblankCount <= 6'h0;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
assign _irq = (viaIFR & viaIER) == 0 ? 1'b1 : 1'b0;
|
||||
|
||||
// register write
|
||||
wire loadT2 = selectVIA == 1'b1 && _cpuUDS == 1'b0 && _cpuRW == 1'b0 && cpuAddrRegHi == 4'h9;
|
||||
always @(posedge clk or negedge _reset) begin
|
||||
if (_reset == 1'b0) begin
|
||||
viaB0DDR <= 1'b1;
|
||||
viaADataOut <= 8'b01111111;
|
||||
viaBDataOut <= 8'b11111111;
|
||||
viaIFR <= 7'b0000000;
|
||||
viaIER <= 7'b0000000;
|
||||
viaACR <= 8'b00000000;
|
||||
viaTimer1Count <= 16'h0000;
|
||||
viaTimer1Latch <= 16'h0000;
|
||||
viaTimer2Count <= 16'h0000;
|
||||
viaTimer2LatchLow <= 8'h00;
|
||||
viaTimer2Armed <= 0;
|
||||
end
|
||||
else if(cen) begin
|
||||
if (selectVIA == 1'b1 && _cpuUDS == 1'b0) begin
|
||||
if (_cpuRW == 1'b0) begin
|
||||
// normal register writes
|
||||
case (cpuAddrRegHi)
|
||||
4'h0: // B
|
||||
viaBDataOut <= dataInHi;
|
||||
4'h2: // B DDR
|
||||
viaB0DDR <= dataInHi[0];
|
||||
// 4'h3: ignore A DDR
|
||||
4'h4: // timer 1 count low
|
||||
viaTimer1Count[7:0] <= dataInHi;
|
||||
4'h5: // timer 1 count high
|
||||
viaTimer1Count[15:8] <= dataInHi;
|
||||
4'h6: // timer 1 latch low
|
||||
viaTimer1Latch[7:0] <= dataInHi;
|
||||
4'h7: // timer 1 latch high
|
||||
viaTimer1Latch[15:8] <= dataInHi;
|
||||
4'h8: // timer 2 latch low
|
||||
viaTimer2LatchLow <= dataInHi;
|
||||
4'h9: begin // timer 2 count high
|
||||
viaTimer2Count[15:8] <= dataInHi;
|
||||
viaTimer2Count[7:0] <= viaTimer2LatchLow;
|
||||
viaTimer2Armed = 1'b1;
|
||||
viaIFR[`INT_T2] <= 1'b0;
|
||||
end
|
||||
4'hA: begin // shift register
|
||||
if( viaACR[4:2] == 3'b111 )
|
||||
viaIFR[`INT_KEYREADY] <= 1'b1;
|
||||
end
|
||||
4'hB: // Aux control register
|
||||
viaACR <= dataInHi;
|
||||
// 4'hC: ignore PCR
|
||||
4'hD: // IFR
|
||||
viaIFR <= viaIFR & ~dataInHi[6:0];
|
||||
4'hE: // IER
|
||||
if (dataInHi[7])
|
||||
viaIER <= viaIER | dataInHi[6:0];
|
||||
else
|
||||
viaIER <= viaIER & ~dataInHi[6:0];
|
||||
4'hF: // A
|
||||
viaADataOut <= dataInHi;
|
||||
endcase
|
||||
end
|
||||
else begin
|
||||
// interrupt flag modifications due to register reads
|
||||
case (cpuAddrRegHi)
|
||||
4'h0: begin // reading (and writing?) register B clears KEYCLK and KEYBIT interrupt flags
|
||||
viaIFR[`INT_KEYCLK] <= 1'b0;
|
||||
viaIFR[`INT_KEYBIT] <= 1'b0;
|
||||
end
|
||||
4'h8: // reading T2C-L clears the T2 interrupt flag
|
||||
viaIFR[`INT_T2] <= 1'b0;
|
||||
4'hA: // reading SR clears the SR interrupt flag
|
||||
viaIFR[`INT_KEYREADY] <= 1'b0;
|
||||
4'hF: begin // reading (and writing?) register A clears VBLANK and ONESEC interrupt flags
|
||||
viaIFR[`INT_ONESEC] <= 1'b0;
|
||||
viaIFR[`INT_VBLANK] <= 1'b0;
|
||||
end
|
||||
endcase
|
||||
end
|
||||
end
|
||||
// external interrupts
|
||||
if (_vblank == 1'b0 && _lastVblank == 1'b1) begin
|
||||
viaIFR[`INT_VBLANK] <= 1'b1; // set vblank interrupt
|
||||
if (vblankCount == 59)
|
||||
viaIFR[`INT_ONESEC] <= 1'b1; // set one second interrupt after 60 vblanks
|
||||
end
|
||||
// timer 2
|
||||
if (timerStrobe && !loadT2) begin
|
||||
if (viaTimer2Armed && viaTimer2Count == 0) begin
|
||||
viaIFR[`INT_T2] <= 1'b1;
|
||||
viaTimer2Armed <= 0;
|
||||
end
|
||||
viaTimer2Count <= viaTimer2Count - 1'b1;
|
||||
end
|
||||
|
||||
// Shift in under control of external clock
|
||||
if (viaACR[4:2] == 3'b011 && kbd_in_strobe)
|
||||
viaIFR[`INT_KEYREADY] <= 1;
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
// register read
|
||||
always @(*) begin
|
||||
dataOutHi = 8'hBE;
|
||||
|
||||
case (cpuAddrRegHi)
|
||||
4'h0: // B
|
||||
// TODO: clear CB1 and CB2 interrupts
|
||||
dataOutHi = { viaBDataOut[7], ~_hblank, mouseY2, mouseX2, mouseButton, viaBDataOut[2:1], viaB0DDR == 1'b1 ? viaBDataOut[0] : rtcData };
|
||||
4'h2: // B DDR
|
||||
dataOutHi = { 7'b1000011, viaB0DDR };
|
||||
4'h3: // A DDR
|
||||
dataOutHi = 8'b01111111;
|
||||
4'h4: // timer 1 count low
|
||||
dataOutHi = viaTimer1Count[7:0];
|
||||
4'h5: // timer 1 count high
|
||||
dataOutHi = viaTimer1Count[15:8];
|
||||
4'h6: // timer 1 latch low
|
||||
dataOutHi = viaTimer1Latch[7:0];
|
||||
4'h7: // timer 1 latch high
|
||||
dataOutHi = viaTimer1Latch[15:8];
|
||||
4'h8: // timer 2 count low
|
||||
dataOutHi = viaTimer2Count[7:0];
|
||||
4'h9: // timer 2 count high
|
||||
dataOutHi = viaTimer2Count[15:8];
|
||||
4'hA: // shift register
|
||||
dataOutHi = viaSR;
|
||||
4'hB: // Aux control register
|
||||
dataOutHi = viaACR;
|
||||
4'hC: // PCR
|
||||
dataOutHi = 0;
|
||||
4'hD: // IFR
|
||||
dataOutHi = { viaIFR & viaIER == 0 ? 1'b0 : 1'b1, viaIFR };
|
||||
4'hE: // IER
|
||||
dataOutHi = { 1'b1, viaIER };
|
||||
4'hF: // A
|
||||
// TODO: clear CA1 and CA2 interrupts
|
||||
dataOutHi = { sccWReq, viaADataOut[6:0] };
|
||||
default:
|
||||
dataOutHi = 8'hBE;
|
||||
endcase
|
||||
end
|
||||
|
||||
assign snd_vol = viaADataOut[2:0];
|
||||
assign snd_alt = !viaADataOut[3];
|
||||
assign snd_ena = viaBDataOut[7];
|
||||
|
||||
assign memoryOverlayOn = viaADataOut[4];
|
||||
assign SEL = viaADataOut[5];
|
||||
|
||||
endmodule
|
163
video.v
Normal file
163
video.v
Normal file
@ -0,0 +1,163 @@
|
||||
|
||||
module video
|
||||
(
|
||||
input clk,
|
||||
input ce,
|
||||
|
||||
input [14:0] addr,
|
||||
input [15:0] dataIn,
|
||||
input [1:0] wr,
|
||||
|
||||
output reg hsync,
|
||||
output reg vsync,
|
||||
output _hblank,
|
||||
output _vblank,
|
||||
|
||||
output video_en,
|
||||
output pixelOut
|
||||
);
|
||||
|
||||
localparam kVisibleWidth = 128,
|
||||
kTotalWidth = 176,
|
||||
kVisibleHeightStart = 21,
|
||||
kVisibleHeightEnd = 362,
|
||||
kTotalHeight = 370,
|
||||
kHsyncStart = 135,
|
||||
kHsyncEnd = 151,
|
||||
kVsyncStart = 365,
|
||||
kVsyncEnd = 369,
|
||||
kPixelLatency = 1; // number of clk8 cycles from xpos==0 to when pixel data actually exits the video shift register
|
||||
|
||||
localparam videoStart = 'hA700 - (kVisibleHeightStart * kVisibleWidth/2);
|
||||
|
||||
reg [7:0] xpos;
|
||||
reg [9:0] ypos;
|
||||
|
||||
assign _hblank = ~(xpos >= kVisibleWidth);
|
||||
assign _vblank = ~(ypos < kVisibleHeightStart || ypos > kVisibleHeightEnd);
|
||||
|
||||
wire [15:0] scrData;
|
||||
vram buff
|
||||
(
|
||||
.clock(clk),
|
||||
|
||||
.data(dataIn),
|
||||
.wraddress(addr[13:0]),
|
||||
.byteena_a(wr),
|
||||
.wren(ram_wr),
|
||||
|
||||
.rdaddress(videoStart[14:1] + {ypos[8:0], xpos[6:2]}),
|
||||
.q(scrData)
|
||||
);
|
||||
|
||||
reg ram_wr;
|
||||
always @(posedge clk) begin
|
||||
reg old_wr;
|
||||
|
||||
old_wr <= |wr;
|
||||
ram_wr <= (~old_wr & |wr);
|
||||
end
|
||||
|
||||
reg [3:0] cycle;
|
||||
always @(posedge clk) if(ce) cycle <= cycle + 1'd1;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if(ce && !cycle[1:0]) begin
|
||||
if (xpos == kTotalWidth-1) begin
|
||||
xpos <= 0;
|
||||
if (ypos == kTotalHeight-1) ypos <= 0;
|
||||
else ypos <= ypos + 1'b1;
|
||||
end else if (!xpos && cycle) begin
|
||||
xpos <= 0;
|
||||
end else begin
|
||||
xpos <= xpos + 1'b1;
|
||||
end
|
||||
|
||||
hsync <= (xpos >= kHsyncStart+kPixelLatency && xpos <= kHsyncEnd+kPixelLatency);
|
||||
vsync <= (ypos >= kVsyncStart && ypos <= kVsyncEnd);
|
||||
end
|
||||
end
|
||||
|
||||
// a 0 bit is white, and a 1 bit is black
|
||||
// data is shifted out MSB first
|
||||
assign pixelOut = ~shiftRegister[15];
|
||||
assign video_en = paper[15];
|
||||
|
||||
reg [15:0] shiftRegister;
|
||||
reg [15:0] paper;
|
||||
always @(posedge clk) begin
|
||||
if(ce) begin
|
||||
if(_vblank && _hblank && cycle == 2) begin
|
||||
shiftRegister <= scrData;
|
||||
paper <= 16'hFFFF;
|
||||
end
|
||||
else begin
|
||||
shiftRegister <= { shiftRegister[14:0], 1'b1 };
|
||||
paper <= { paper[14:0], 1'b0 };
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
module vram
|
||||
(
|
||||
input clock,
|
||||
|
||||
input [15:0] data,
|
||||
input [13:0] wraddress,
|
||||
input [1:0] byteena_a,
|
||||
input wren,
|
||||
|
||||
input [13:0] rdaddress,
|
||||
output [15:0] q
|
||||
);
|
||||
|
||||
altsyncram altsyncram_component (
|
||||
.address_a (wraddress),
|
||||
.address_b (rdaddress),
|
||||
.byteena_a (byteena_a),
|
||||
.clock0 (clock),
|
||||
.data_a (data),
|
||||
.wren_a (wren),
|
||||
.q_b (q),
|
||||
.aclr0 (1'b0),
|
||||
.aclr1 (1'b0),
|
||||
.addressstall_a (1'b0),
|
||||
.addressstall_b (1'b0),
|
||||
.byteena_b (1'b1),
|
||||
.clock1 (1'b1),
|
||||
.clocken0 (1'b1),
|
||||
.clocken1 (1'b1),
|
||||
.clocken2 (1'b1),
|
||||
.clocken3 (1'b1),
|
||||
.data_b ({16{1'b1}}),
|
||||
.eccstatus (),
|
||||
.q_a (),
|
||||
.rden_a (1'b1),
|
||||
.rden_b (1'b1),
|
||||
.wren_b (1'b0));
|
||||
defparam
|
||||
altsyncram_component.address_aclr_b = "NONE",
|
||||
altsyncram_component.address_reg_b = "CLOCK0",
|
||||
altsyncram_component.byte_size = 8,
|
||||
altsyncram_component.clock_enable_input_a = "BYPASS",
|
||||
altsyncram_component.clock_enable_input_b = "BYPASS",
|
||||
altsyncram_component.clock_enable_output_b = "BYPASS",
|
||||
altsyncram_component.intended_device_family = "Cyclone V",
|
||||
altsyncram_component.lpm_type = "altsyncram",
|
||||
altsyncram_component.numwords_a = 16384,
|
||||
altsyncram_component.numwords_b = 16384,
|
||||
altsyncram_component.operation_mode = "DUAL_PORT",
|
||||
altsyncram_component.outdata_aclr_b = "NONE",
|
||||
altsyncram_component.outdata_reg_b = "UNREGISTERED",
|
||||
altsyncram_component.power_up_uninitialized = "FALSE",
|
||||
altsyncram_component.read_during_write_mode_mixed_ports = "DONT_CARE",
|
||||
altsyncram_component.widthad_a = 14,
|
||||
altsyncram_component.widthad_b = 14,
|
||||
altsyncram_component.width_a = 16,
|
||||
altsyncram_component.width_b = 16,
|
||||
altsyncram_component.width_byteena_a = 2;
|
||||
|
||||
|
||||
endmodule
|
Loading…
x
Reference in New Issue
Block a user