From 682207dfa1eebf2f9f8e42b71d226b8e80f99f48 Mon Sep 17 00:00:00 2001 From: Imants Pulkstenis Date: Tue, 9 Jun 2020 22:28:53 +0300 Subject: [PATCH] Add files for FIR and IIR filter - not tested --- ld3/dds_vhdl/IIF.vhd | 226 ++++ ld3/dds_vhdl/fir.bsf | 114 ++ ld3/dds_vhdl/fir.cmp | 13 + ld3/dds_vhdl/fir.qip | 102 ++ ld3/dds_vhdl/fir.sip | 25 + ld3/dds_vhdl/fir.spd | 29 + ld3/dds_vhdl/fir.vhd | 123 ++ ld3/dds_vhdl/fir/altera_avalon_sc_fifo.v | 915 +++++++++++++++ ...spip_avalon_streaming_controller_hpfir.vhd | 88 ++ .../auk_dspip_avalon_streaming_sink_hpfir.vhd | 545 +++++++++ ...uk_dspip_avalon_streaming_source_hpfir.vhd | 467 ++++++++ ld3/dds_vhdl/fir/auk_dspip_lib_pkg_hpfir.vhd | 583 ++++++++++ ld3/dds_vhdl/fir/auk_dspip_math_pkg_hpfir.vhd | 370 ++++++ ld3/dds_vhdl/fir/auk_dspip_roundsat_hpfir.vhd | 187 +++ ld3/dds_vhdl/fir/dspba_library.vhd | 377 ++++++ ld3/dds_vhdl/fir/dspba_library_package.vhd | 72 ++ ld3/dds_vhdl/fir/fir_0002.vhd | 82 ++ ld3/dds_vhdl/fir/fir_0002_ast.vhd | 273 +++++ ld3/dds_vhdl/fir/fir_0002_rtl_core.vhd | 1033 +++++++++++++++++ ld3/dds_vhdl/fir_import_coef.txt | 3 + ld3/dds_vhdl/fir_sim.f | 20 + .../fir_sim/aldec/rivierapro_setup.tcl | 319 +++++ ld3/dds_vhdl/fir_sim/altera_avalon_sc_fifo.v | 915 +++++++++++++++ ...spip_avalon_streaming_controller_hpfir.vhd | 88 ++ .../auk_dspip_avalon_streaming_sink_hpfir.vhd | 545 +++++++++ ...uk_dspip_avalon_streaming_source_hpfir.vhd | 467 ++++++++ .../fir_sim/auk_dspip_lib_pkg_hpfir.vhd | 583 ++++++++++ .../fir_sim/auk_dspip_math_pkg_hpfir.vhd | 370 ++++++ .../fir_sim/auk_dspip_roundsat_hpfir.vhd | 187 +++ ld3/dds_vhdl/fir_sim/cadence/cds.lib | 24 + ld3/dds_vhdl/fir_sim/cadence/hdl.var | 2 + ld3/dds_vhdl/fir_sim/cadence/ncsim_setup.sh | 227 ++++ ld3/dds_vhdl/fir_sim/dspba_library.vhd | 377 ++++++ .../fir_sim/dspba_library_package.vhd | 72 ++ ld3/dds_vhdl/fir_sim/fir.vhd | 82 ++ ld3/dds_vhdl/fir_sim/fir_ast.vhd | 273 +++++ ld3/dds_vhdl/fir_sim/fir_coef_int.txt | 41 + ld3/dds_vhdl/fir_sim/fir_input.txt | 165 +++ ld3/dds_vhdl/fir_sim/fir_mlab.m | 165 +++ ld3/dds_vhdl/fir_sim/fir_model.m | 139 +++ ld3/dds_vhdl/fir_sim/fir_msim.tcl | 176 +++ ld3/dds_vhdl/fir_sim/fir_nativelink.tcl | 58 + ld3/dds_vhdl/fir_sim/fir_param.txt | 19 + ld3/dds_vhdl/fir_sim/fir_rtl_core.vhd | 1033 +++++++++++++++++ ld3/dds_vhdl/fir_sim/fir_tb.vhd | 472 ++++++++ ld3/dds_vhdl/fir_sim/mentor/msim_setup.tcl | 313 +++++ .../fir_sim/synopsys/vcsmx/synopsys_sim.setup | 19 + .../fir_sim/synopsys/vcsmx/vcsmx_setup.sh | 230 ++++ ld3/dds_vhdl/sin_gen.qsf | 4 +- ld3/dds_vhdl/sin_gen.qws | Bin 0 -> 2663 bytes ld3/dds_vhdl/sin_gen_sum.vhd | 20 +- ld3/iif_hdl/ld3_fixed_point2/IIF.vhd | 231 ++++ ld3/iif_hdl/ld3_fixed_point2/IIF_compile.do | 2 + ld3/iif_hdl/ld3_fixed_point2/IIF_map.txt | 1 + ld3/iif_hdl/ld3_fixed_point2/IIF_report.html | 105 ++ .../ld3_fixed_point2/clearhighlighting.m | 2 + .../ld3_fixed_point2/gm_ld3_fixed_point2.slx | Bin 0 -> 31372 bytes .../ld3_fixed_point2/hdlcodegenstatus.mat | Bin 0 -> 5523 bytes .../ld3_fixed_point2/highlightFeedbackLoop.m | 38 + ld3/ld3.m | 8 +- ld3/ld3_fixed_point.slx | Bin 0 -> 23888 bytes ld3/ld3_fixed_point2.slx | Bin 0 -> 25313 bytes ...loting_point.slx => ld3_floting_point.slx} | Bin 22014 -> 22022 bytes ld3/lookuptable.vhd | 516 ++++++++ ld3/ls3_fixed_point.slx | Bin 23930 -> 0 bytes ld3/table_gen.m | 38 +- 66 files changed, 13930 insertions(+), 43 deletions(-) create mode 100644 ld3/dds_vhdl/IIF.vhd create mode 100644 ld3/dds_vhdl/fir.bsf create mode 100644 ld3/dds_vhdl/fir.cmp create mode 100644 ld3/dds_vhdl/fir.qip create mode 100644 ld3/dds_vhdl/fir.sip create mode 100644 ld3/dds_vhdl/fir.spd create mode 100644 ld3/dds_vhdl/fir.vhd create mode 100644 ld3/dds_vhdl/fir/altera_avalon_sc_fifo.v create mode 100644 ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_controller_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_sink_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_source_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir/auk_dspip_lib_pkg_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir/auk_dspip_math_pkg_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir/auk_dspip_roundsat_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir/dspba_library.vhd create mode 100644 ld3/dds_vhdl/fir/dspba_library_package.vhd create mode 100644 ld3/dds_vhdl/fir/fir_0002.vhd create mode 100644 ld3/dds_vhdl/fir/fir_0002_ast.vhd create mode 100644 ld3/dds_vhdl/fir/fir_0002_rtl_core.vhd create mode 100644 ld3/dds_vhdl/fir_import_coef.txt create mode 100644 ld3/dds_vhdl/fir_sim.f create mode 100644 ld3/dds_vhdl/fir_sim/aldec/rivierapro_setup.tcl create mode 100644 ld3/dds_vhdl/fir_sim/altera_avalon_sc_fifo.v create mode 100644 ld3/dds_vhdl/fir_sim/auk_dspip_avalon_streaming_controller_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir_sim/auk_dspip_avalon_streaming_sink_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir_sim/auk_dspip_avalon_streaming_source_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir_sim/auk_dspip_lib_pkg_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir_sim/auk_dspip_math_pkg_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir_sim/auk_dspip_roundsat_hpfir.vhd create mode 100644 ld3/dds_vhdl/fir_sim/cadence/cds.lib create mode 100644 ld3/dds_vhdl/fir_sim/cadence/hdl.var create mode 100644 ld3/dds_vhdl/fir_sim/cadence/ncsim_setup.sh create mode 100644 ld3/dds_vhdl/fir_sim/dspba_library.vhd create mode 100644 ld3/dds_vhdl/fir_sim/dspba_library_package.vhd create mode 100644 ld3/dds_vhdl/fir_sim/fir.vhd create mode 100644 ld3/dds_vhdl/fir_sim/fir_ast.vhd create mode 100644 ld3/dds_vhdl/fir_sim/fir_coef_int.txt create mode 100644 ld3/dds_vhdl/fir_sim/fir_input.txt create mode 100644 ld3/dds_vhdl/fir_sim/fir_mlab.m create mode 100644 ld3/dds_vhdl/fir_sim/fir_model.m create mode 100644 ld3/dds_vhdl/fir_sim/fir_msim.tcl create mode 100644 ld3/dds_vhdl/fir_sim/fir_nativelink.tcl create mode 100644 ld3/dds_vhdl/fir_sim/fir_param.txt create mode 100644 ld3/dds_vhdl/fir_sim/fir_rtl_core.vhd create mode 100644 ld3/dds_vhdl/fir_sim/fir_tb.vhd create mode 100644 ld3/dds_vhdl/fir_sim/mentor/msim_setup.tcl create mode 100644 ld3/dds_vhdl/fir_sim/synopsys/vcsmx/synopsys_sim.setup create mode 100644 ld3/dds_vhdl/fir_sim/synopsys/vcsmx/vcsmx_setup.sh create mode 100644 ld3/dds_vhdl/sin_gen.qws create mode 100644 ld3/iif_hdl/ld3_fixed_point2/IIF.vhd create mode 100644 ld3/iif_hdl/ld3_fixed_point2/IIF_compile.do create mode 100644 ld3/iif_hdl/ld3_fixed_point2/IIF_map.txt create mode 100644 ld3/iif_hdl/ld3_fixed_point2/IIF_report.html create mode 100644 ld3/iif_hdl/ld3_fixed_point2/clearhighlighting.m create mode 100644 ld3/iif_hdl/ld3_fixed_point2/gm_ld3_fixed_point2.slx create mode 100644 ld3/iif_hdl/ld3_fixed_point2/hdlcodegenstatus.mat create mode 100644 ld3/iif_hdl/ld3_fixed_point2/highlightFeedbackLoop.m create mode 100644 ld3/ld3_fixed_point.slx create mode 100644 ld3/ld3_fixed_point2.slx rename ld3/{ls3_floting_point.slx => ld3_floting_point.slx} (65%) create mode 100644 ld3/lookuptable.vhd delete mode 100644 ld3/ls3_fixed_point.slx diff --git a/ld3/dds_vhdl/IIF.vhd b/ld3/dds_vhdl/IIF.vhd new file mode 100644 index 0000000..1797f1e --- /dev/null +++ b/ld3/dds_vhdl/IIF.vhd @@ -0,0 +1,226 @@ +-- ------------------------------------------------------------- +-- +-- File Name: iif_hdl\ld3_fixed_point2\IIF.vhd +-- Created: 2020-06-09 20:33:43 +-- +-- Generated by MATLAB 9.3 and HDL Coder 3.11 +-- +-- +-- ------------------------------------------------------------- +-- Rate and Clocking Details +-- ------------------------------------------------------------- +-- Model base rate: 4.53515e-05 +-- Target subsystem base rate: 4.53515e-05 +-- +-- +-- Clock Enable Sample Time +-- ------------------------------------------------------------- +-- ce_out 4.53515e-05 +-- ------------------------------------------------------------- +-- +-- +-- Output Signal Clock Enable Sample Time +-- ------------------------------------------------------------- +-- Out1 ce_out 4.53515e-05 +-- ------------------------------------------------------------- +-- +-- ------------------------------------------------------------- + + +-- ------------------------------------------------------------- +-- +-- Module: IIF +-- Source Path: ld3_fixed_point2/IIF +-- Hierarchy Level: 0 +-- +-- ------------------------------------------------------------- +LIBRARY IEEE; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; + +ENTITY IIF IS + PORT( clk : IN std_logic; + reset : IN std_logic; + clk_enable : IN std_logic; + In1 : IN std_logic_vector(15 DOWNTO 0); -- sfix16_En14 + ce_out : OUT std_logic; + Out1 : OUT std_logic_vector(15 DOWNTO 0) -- sfix16_En14 + ); +END IIF; + + +ARCHITECTURE rtl OF IIF IS + + -- Signals + SIGNAL enb : std_logic; + SIGNAL kconst : signed(15 DOWNTO 0); -- sfix16_En20 + SIGNAL kconst_1 : signed(15 DOWNTO 0); -- sfix16_En20 + SIGNAL In1_signed : signed(15 DOWNTO 0); -- sfix16_En14 + SIGNAL Subtract1_out1 : signed(15 DOWNTO 0); -- sfix16_En9 + SIGNAL Delay1_out1 : signed(15 DOWNTO 0); -- sfix16_En9 + SIGNAL a_3_mul_temp : signed(31 DOWNTO 0); -- sfix32_En24 + SIGNAL a_3_out1 : signed(15 DOWNTO 0); -- sfix16_En10 + SIGNAL a_2_mul_temp : signed(31 DOWNTO 0); -- sfix32_En23 + SIGNAL a_2_out1 : signed(15 DOWNTO 0); -- sfix16_En9 + SIGNAL Subtract2_sub_cast : signed(31 DOWNTO 0); -- sfix32_En14 + SIGNAL Subtract2_sub_cast_1 : signed(31 DOWNTO 0); -- sfix32_En14 + SIGNAL Subtract2_sub_temp : signed(31 DOWNTO 0); -- sfix32_En14 + SIGNAL Subtract2_out1 : signed(15 DOWNTO 0); -- sfix16_En9 + SIGNAL Subtract1_sub_cast : signed(31 DOWNTO 0); -- sfix32_En10 + SIGNAL Subtract1_sub_cast_1 : signed(31 DOWNTO 0); -- sfix32_En10 + SIGNAL Subtract1_sub_temp : signed(31 DOWNTO 0); -- sfix32_En10 + SIGNAL Subtract1_out1_1 : signed(15 DOWNTO 0); -- sfix16_En9 + SIGNAL b_1_mul_temp : signed(31 DOWNTO 0); -- sfix32_En29 + SIGNAL b_1_out1 : signed(15 DOWNTO 0); -- sfix16_En15 + SIGNAL b_1_out1_1 : signed(15 DOWNTO 0); -- sfix16_En15 + SIGNAL b_2_out1 : signed(15 DOWNTO 0); -- sfix16_En14 + SIGNAL Sum_add_cast : signed(31 DOWNTO 0); -- sfix32_En15 + SIGNAL Sum_add_cast_1 : signed(31 DOWNTO 0); -- sfix32_En15 + SIGNAL Sum_add_temp : signed(31 DOWNTO 0); -- sfix32_En15 + SIGNAL Sum_out1 : signed(15 DOWNTO 0); -- sfix16_En15 + SIGNAL kconst_2 : signed(15 DOWNTO 0); -- sfix16_En20 + SIGNAL kconst_3 : signed(15 DOWNTO 0); -- sfix16_En20 + SIGNAL Delay1_out1_1 : signed(15 DOWNTO 0); -- sfix16_En9 + SIGNAL b_3_mul_temp : signed(31 DOWNTO 0); -- sfix32_En29 + SIGNAL b_3_out1 : signed(15 DOWNTO 0); -- sfix16_En15 + SIGNAL b_3_out1_1 : signed(15 DOWNTO 0); -- sfix16_En15 + SIGNAL Sum1_add_cast : signed(31 DOWNTO 0); -- sfix32_En15 + SIGNAL Sum1_add_cast_1 : signed(31 DOWNTO 0); -- sfix32_En15 + SIGNAL Sum1_add_temp : signed(31 DOWNTO 0); -- sfix32_En15 + SIGNAL Sum1_out1 : signed(15 DOWNTO 0); -- sfix16_En14 + + ATTRIBUTE multstyle : string; + +BEGIN + kconst <= to_signed(16#6CF4#, 16); + + enb <= clk_enable; + + HwModeRegister_process : PROCESS (clk, reset) + BEGIN + IF reset = '1' THEN + kconst_1 <= to_signed(16#0000#, 16); + ELSIF clk'EVENT AND clk = '1' THEN + IF enb = '1' THEN + kconst_1 <= kconst; + END IF; + END IF; + END PROCESS HwModeRegister_process; + + + In1_signed <= signed(In1); + + Delay1_process : PROCESS (clk, reset) + BEGIN + IF reset = '1' THEN + Delay1_out1 <= to_signed(16#0000#, 16); + ELSIF clk'EVENT AND clk = '1' THEN + IF enb = '1' THEN + Delay1_out1 <= Subtract1_out1; + END IF; + END IF; + END PROCESS Delay1_process; + + + a_3_mul_temp <= to_signed(16#7934#, 16) * Delay1_out1; + a_3_out1 <= a_3_mul_temp(29 DOWNTO 14); + + a_2_mul_temp <= to_signed(-16#5E65#, 16) * Subtract1_out1; + a_2_out1 <= a_2_mul_temp(29 DOWNTO 14); + + Subtract2_sub_cast <= resize(In1_signed, 32); + Subtract2_sub_cast_1 <= resize(a_2_out1 & '0' & '0' & '0' & '0' & '0', 32); + Subtract2_sub_temp <= Subtract2_sub_cast - Subtract2_sub_cast_1; + Subtract2_out1 <= Subtract2_sub_temp(20 DOWNTO 5); + + Subtract1_sub_cast <= resize(Subtract2_out1 & '0', 32); + Subtract1_sub_cast_1 <= resize(a_3_out1, 32); + Subtract1_sub_temp <= Subtract1_sub_cast - Subtract1_sub_cast_1; + Subtract1_out1_1 <= Subtract1_sub_temp(16 DOWNTO 1); + + reduced_process : PROCESS (clk, reset) + BEGIN + IF reset = '1' THEN + Subtract1_out1 <= to_signed(16#0000#, 16); + ELSIF clk'EVENT AND clk = '1' THEN + IF enb = '1' THEN + Subtract1_out1 <= Subtract1_out1_1; + END IF; + END IF; + END PROCESS reduced_process; + + + b_1_mul_temp <= kconst_1 * Subtract1_out1; + b_1_out1 <= b_1_mul_temp(29 DOWNTO 14); + + PipelineRegister_process : PROCESS (clk, reset) + BEGIN + IF reset = '1' THEN + b_1_out1_1 <= to_signed(16#0000#, 16); + ELSIF clk'EVENT AND clk = '1' THEN + IF enb = '1' THEN + b_1_out1_1 <= b_1_out1; + END IF; + END IF; + END PROCESS PipelineRegister_process; + + + b_2_out1 <= to_signed(16#0000#, 16); + + Sum_add_cast <= resize(b_1_out1_1, 32); + Sum_add_cast_1 <= resize(b_2_out1 & '0', 32); + Sum_add_temp <= Sum_add_cast + Sum_add_cast_1; + Sum_out1 <= Sum_add_temp(15 DOWNTO 0); + + kconst_2 <= to_signed(-16#6CF4#, 16); + + HwModeRegister2_process : PROCESS (clk, reset) + BEGIN + IF reset = '1' THEN + kconst_3 <= to_signed(16#0000#, 16); + ELSIF clk'EVENT AND clk = '1' THEN + IF enb = '1' THEN + kconst_3 <= kconst_2; + END IF; + END IF; + END PROCESS HwModeRegister2_process; + + + HwModeRegister3_process : PROCESS (clk, reset) + BEGIN + IF reset = '1' THEN + Delay1_out1_1 <= to_signed(16#0000#, 16); + ELSIF clk'EVENT AND clk = '1' THEN + IF enb = '1' THEN + Delay1_out1_1 <= Delay1_out1; + END IF; + END IF; + END PROCESS HwModeRegister3_process; + + + b_3_mul_temp <= kconst_3 * Delay1_out1_1; + b_3_out1 <= b_3_mul_temp(29 DOWNTO 14); + + PipelineRegister1_process : PROCESS (clk, reset) + BEGIN + IF reset = '1' THEN + b_3_out1_1 <= to_signed(16#0000#, 16); + ELSIF clk'EVENT AND clk = '1' THEN + IF enb = '1' THEN + b_3_out1_1 <= b_3_out1; + END IF; + END IF; + END PROCESS PipelineRegister1_process; + + + Sum1_add_cast <= resize(Sum_out1, 32); + Sum1_add_cast_1 <= resize(b_3_out1_1, 32); + Sum1_add_temp <= Sum1_add_cast + Sum1_add_cast_1; + Sum1_out1 <= Sum1_add_temp(16 DOWNTO 1); + + Out1 <= std_logic_vector(Sum1_out1); + + ce_out <= clk_enable; + +END rtl; + diff --git a/ld3/dds_vhdl/fir.bsf b/ld3/dds_vhdl/fir.bsf new file mode 100644 index 0000000..52e1602 --- /dev/null +++ b/ld3/dds_vhdl/fir.bsf @@ -0,0 +1,114 @@ +/* +WARNING: Do NOT edit the input and output ports in this file in a text +editor if you plan to continue editing the block that represents it in +the Block Editor! File corruption is VERY likely to occur. +*/ +/* +Copyright (C) 2019 Intel Corporation. All rights reserved. +Your use of Intel Corporation's design tools, logic functions +and other software and tools, and any 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 FPGA IP 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, at +https://fpgasoftware.intel.com/eula. +*/ +(header "symbol" (version "1.1")) +(symbol + (rect 0 0 384 216) + (text "fir" (rect 186 -1 194 11)(font "Arial" (font_size 10))) + (text "inst" (rect 8 200 20 212)(font "Arial" )) + (port + (pt 0 72) + (input) + (text "clk" (rect 0 0 10 12)(font "Arial" (font_size 8))) + (text "clk" (rect 4 61 22 72)(font "Arial" (font_size 8))) + (line (pt 0 72)(pt 144 72)(line_width 1)) + ) + (port + (pt 0 112) + (input) + (text "reset_n" (rect 0 0 30 12)(font "Arial" (font_size 8))) + (text "reset_n" (rect 4 101 46 112)(font "Arial" (font_size 8))) + (line (pt 0 112)(pt 144 112)(line_width 1)) + ) + (port + (pt 0 152) + (input) + (text "ast_sink_data[15..0]" (rect 0 0 79 12)(font "Arial" (font_size 8))) + (text "ast_sink_data[15..0]" (rect 4 141 124 152)(font "Arial" (font_size 8))) + (line (pt 0 152)(pt 144 152)(line_width 3)) + ) + (port + (pt 0 168) + (input) + (text "ast_sink_valid" (rect 0 0 56 12)(font "Arial" (font_size 8))) + (text "ast_sink_valid" (rect 4 157 88 168)(font "Arial" (font_size 8))) + (line (pt 0 168)(pt 144 168)(line_width 1)) + ) + (port + (pt 0 184) + (input) + (text "ast_sink_error[1..0]" (rect 0 0 77 12)(font "Arial" (font_size 8))) + (text "ast_sink_error[1..0]" (rect 4 173 124 184)(font "Arial" (font_size 8))) + (line (pt 0 184)(pt 144 184)(line_width 3)) + ) + (port + (pt 384 72) + (output) + (text "ast_source_data[36..0]" (rect 0 0 92 12)(font "Arial" (font_size 8))) + (text "ast_source_data[36..0]" (rect 268 61 400 72)(font "Arial" (font_size 8))) + (line (pt 384 72)(pt 224 72)(line_width 3)) + ) + (port + (pt 384 88) + (output) + (text "ast_source_valid" (rect 0 0 68 12)(font "Arial" (font_size 8))) + (text "ast_source_valid" (rect 297 77 393 88)(font "Arial" (font_size 8))) + (line (pt 384 88)(pt 224 88)(line_width 1)) + ) + (port + (pt 384 104) + (output) + (text "ast_source_error[1..0]" (rect 0 0 89 12)(font "Arial" (font_size 8))) + (text "ast_source_error[1..0]" (rect 273 93 405 104)(font "Arial" (font_size 8))) + (line (pt 384 104)(pt 224 104)(line_width 3)) + ) + (drawing + (text "clk" (rect 129 43 276 99)(font "Arial" (color 128 0 0)(font_size 9))) + (text "clk" (rect 149 67 316 144)(font "Arial" (color 0 0 0))) + (text "rst" (rect 129 83 276 179)(font "Arial" (color 128 0 0)(font_size 9))) + (text "reset_n" (rect 149 107 340 224)(font "Arial" (color 0 0 0))) + (text "avalon_streaming_sink" (rect 10 123 146 259)(font "Arial" (color 128 0 0)(font_size 9))) + (text "data" (rect 149 147 322 304)(font "Arial" (color 0 0 0))) + (text "valid" (rect 149 163 328 336)(font "Arial" (color 0 0 0))) + (text "error" (rect 149 179 328 368)(font "Arial" (color 0 0 0))) + (text "avalon_streaming_source" (rect 225 43 588 99)(font "Arial" (color 128 0 0)(font_size 9))) + (text "data" (rect 203 67 430 144)(font "Arial" (color 0 0 0))) + (text "valid" (rect 201 83 432 176)(font "Arial" (color 0 0 0))) + (text "error" (rect 199 99 428 208)(font "Arial" (color 0 0 0))) + (text " altera_fir_compiler_ii " (rect 289 200 722 410)(font "Arial" )) + (line (pt 144 32)(pt 224 32)(line_width 1)) + (line (pt 224 32)(pt 224 200)(line_width 1)) + (line (pt 144 200)(pt 224 200)(line_width 1)) + (line (pt 144 32)(pt 144 200)(line_width 1)) + (line (pt 145 52)(pt 145 76)(line_width 1)) + (line (pt 146 52)(pt 146 76)(line_width 1)) + (line (pt 145 92)(pt 145 116)(line_width 1)) + (line (pt 146 92)(pt 146 116)(line_width 1)) + (line (pt 145 132)(pt 145 188)(line_width 1)) + (line (pt 146 132)(pt 146 188)(line_width 1)) + (line (pt 223 52)(pt 223 108)(line_width 1)) + (line (pt 222 52)(pt 222 108)(line_width 1)) + (line (pt 0 0)(pt 384 0)(line_width 1)) + (line (pt 384 0)(pt 384 216)(line_width 1)) + (line (pt 0 216)(pt 384 216)(line_width 1)) + (line (pt 0 0)(pt 0 216)(line_width 1)) + ) +) diff --git a/ld3/dds_vhdl/fir.cmp b/ld3/dds_vhdl/fir.cmp new file mode 100644 index 0000000..7dbddab --- /dev/null +++ b/ld3/dds_vhdl/fir.cmp @@ -0,0 +1,13 @@ + component fir is + port ( + clk : in std_logic := 'X'; -- clk + reset_n : in std_logic := 'X'; -- reset_n + ast_sink_data : in std_logic_vector(15 downto 0) := (others => 'X'); -- data + ast_sink_valid : in std_logic := 'X'; -- valid + ast_sink_error : in std_logic_vector(1 downto 0) := (others => 'X'); -- error + ast_source_data : out std_logic_vector(36 downto 0); -- data + ast_source_valid : out std_logic; -- valid + ast_source_error : out std_logic_vector(1 downto 0) -- error + ); + end component fir; + diff --git a/ld3/dds_vhdl/fir.qip b/ld3/dds_vhdl/fir.qip new file mode 100644 index 0000000..89e45e4 --- /dev/null +++ b/ld3/dds_vhdl/fir.qip @@ -0,0 +1,102 @@ +set_global_assignment -entity "fir" -library "fir" -name IP_TOOL_NAME "altera_fir_compiler_ii" +set_global_assignment -entity "fir" -library "fir" -name IP_TOOL_VERSION "19.1" +set_global_assignment -entity "fir" -library "fir" -name IP_TOOL_ENV "mwpim" +set_global_assignment -library "fir" -name MISC_FILE [file join $::quartus(qip_path) "fir.cmp"] +set_global_assignment -entity "fir" -library "fir" -name IP_TARGETED_DEVICE_FAMILY "Cyclone V" +set_global_assignment -entity "fir" -library "fir" -name IP_GENERATED_DEVICE_FAMILY "{Cyclone V}" +set_global_assignment -entity "fir" -library "fir" -name IP_QSYS_MODE "UNKNOWN" +set_global_assignment -name SYNTHESIS_ONLY_QIP ON +set_global_assignment -entity "fir" -library "fir" -name IP_COMPONENT_NAME "Zmly" +set_global_assignment -entity "fir" -library "fir" -name IP_COMPONENT_DISPLAY_NAME "RklSIElJ" +set_global_assignment -entity "fir" -library "fir" -name IP_COMPONENT_REPORT_HIERARCHY "Off" +set_global_assignment -entity "fir" -library "fir" -name IP_COMPONENT_INTERNAL "Off" +set_global_assignment -entity "fir" -library "fir" -name IP_COMPONENT_AUTHOR "SW50ZWwgQ29ycG9yYXRpb24=" +set_global_assignment -entity "fir" -library "fir" -name IP_COMPONENT_VERSION "MTkuMQ==" +set_global_assignment -entity "fir" -library "fir" -name IP_COMPONENT_DESCRIPTION "RklSIElJIEludGVsIEZQR0EgSVA=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_NAME "ZmlyXzAwMDI=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_DISPLAY_NAME "RklSIElJ" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_REPORT_HIERARCHY "Off" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_INTERNAL "Off" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_AUTHOR "SW50ZWwgQ29ycG9yYXRpb24=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_VERSION "MTkuMQ==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_DESCRIPTION "RklSIElJIEludGVsIEZQR0EgSVA=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "ZmlsdGVyVHlwZQ==::c2luZ2xl::RmlsdGVyIFR5cGU=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "aW50ZXJwRmFjdG9y::MQ==::SW50ZXJwb2xhdGlvbiBGYWN0b3I=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "ZGVjaW1GYWN0b3I=::MQ==::RGVjaW1hdGlvbiBGYWN0b3I=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "c3ltbWV0cnlNb2Rl::bnN5bQ==::U3ltbWV0cnk=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "TF9iYW5kc0ZpbHRlcg==::MQ==::TC10aCBCYW5kIEZpbHRlcg==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "aW5wdXRDaGFubmVsTnVt::MQ==::TWF4IE51bWJlciBvZiBDaGFubmVscw==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y2xvY2tSYXRl::MTAw::Q2xvY2sgUmF0ZQ==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y2xvY2tTbGFjaw==::MA==::Q2xvY2sgU2xhY2s=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "aW5wdXRSYXRl::MTAw::SW5wdXQgU2FtcGxlIFJhdGUgKE1TUFMp" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZSZWxvYWQ=::ZmFsc2U=::Q29lZmZpY2llbnRzIFJlbG9hZA==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZpY2llbnRSZWFkYmFjaw==::ZmFsc2U=::Y29lZmZpY2llbnRSZWFkYmFjaw==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZpY2llbnRXcml0ZWFibGU=::ZmFsc2U=::Y29lZmZpY2llbnRXcml0ZWFibGU=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "YnVzRGF0YVdpZHRo::MTY=::YnVzRGF0YVdpZHRo" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "YmFja1ByZXNzdXJl::ZmFsc2U=::QmFjayBQcmVzc3VyZSBTdXBwb3J0" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "ZGV2aWNlRmFtaWx5::Q3ljbG9uZSBW::RGV2aWNlIEZhbWlseQ==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "c3BlZWRHcmFkZQ==::bWVkaXVt::U3BlZWQgR3JhZGU=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "ZGVsYXlSQU1CbG9ja1RocmVzaG9sZA==::MjA=::TWVtb3J5IEJsb2NrIFRocmVzaG9sZA==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "ZHVhbE1lbURpc3RSQU1UaHJlc2hvbGQ=::MTI4MA==::RHVhbCBQb3J0IFJBTSBUaHJlc2hvbGQ=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "bVJBTVRocmVzaG9sZA==::MTAwMDAwMA==::TGFyZ2UgUkFNIFRocmVzaG9sZA==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "aGFyZE11bHRpcGxpZXJUaHJlc2hvbGQ=::LTE=::SGFyZCBNdWx0aXBsaWVyIFRocmVzaG9sZA==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "cmVjb25maWd1cmFibGU=::ZmFsc2U=::UmVjb25maWd1cmFibGUgQ2FycmllciBNb2Rl" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "bnVtX21vZGVz::Mg==::TnVtYmVyIG9mIE1vZGVz" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "TW9kZVdpZHRo::MA==::TW9kZVdpZHRo" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "cmVjb25maWd1cmFibGVfbGlzdA==::MA==::Q2hvb3NlIE1vZGUgdG8gRWRpdA==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "TU9ERV9TVFJJTkc=::Tm9uZSBTZXQ=::TU9ERV9TVFJJTkdfRElTUExBWQ==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "bW9kZUZvcm1hdHRlZA==::LS0=::bW9kZUZvcm1hdHRlZA==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y2hhbm5lbE1vZGVz::MCwxLDIsMw==::Q2hhbm5lbCBNb2RlIE9yZGVy" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "aW5wdXRUeXBl::ZnJhYw==::SW5wdXQgVHlwZQ==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "aW5wdXRCaXRXaWR0aA==::MTY=::SW5wdXQgV2lkdGg=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "aW5wdXRGcmFjQml0V2lkdGg=::MTQ=::SW5wdXQgRnJhY3Rpb25hbCBXaWR0aA==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZTZXRSZWFsVmFsdWU=::LTAuMDA3MywtMC4wMDcxLC0wLjAwNTksLTAuMDAyNCwwLjAwNCwwLjAxMzIsMC4wMjMxLDAuMDMwMSwwLjAzMDIsMC4wMjA3LDAuMDAxNSwtMC4wMjQyLC0wLjA0OTgsLTAuMDY3NywtMC4wNzEyLC0wLjA1NzEsLTAuMDI2OSwwLjAxMjksMC4wNTI1LDAuMDgxNCwwLjA5MiwwLjA4MTQsMC4wNTI1LDAuMDEyOSwtMC4wMjY5LC0wLjA1NzEsLTAuMDcxMiwtMC4wNjc3LC0wLjA0OTgsLTAuMDI0MiwwLjAwMTUsMC4wMjA3LDAuMDMwMiwwLjAzMDEsMC4wMjMxLDAuMDEzMiwwLjAwNCwtMC4wMDI0LC0wLjAwNTksLTAuMDA3MSwtMC4wMDcz::UmVhbCBDb2VmZmljaWVudCBWYWx1ZXM=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZOdW0=::NDE=::TnVtYmVyIG9mIENvZWZmaWNpZW50cw==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZTZXRSZWFsVmFsdWVJbWFn::MC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgLTAuMDUzMDA5MywgLTAuMDQ0OTgsIDAuMCwgMC4wNzQ5NjkzLCAwLjE1OTAzNCwgMC4yMjQ5MDcsIDAuMjQ5ODA5LCAwLjIyNDkwNywgMC4xNTkwMzQsIDAuMDc0OTY5MywgMC4wLCAtMC4wNDQ5OCwgLTAuMDUzMDA5MywgLTAuMDMyMTI4MywgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjA=::UmVhbCBDb2VmZmljaWVudCBWYWx1ZXMgKEltYWdpbmFyeSBDb21wb25lbnQp" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZTZXRTY2FsZVZhbHVl::LTAuMDA3Mjk0NjM0NjgyMjkyNjIxLC0wLjAwNzA5ODA4OTQ4MzAwMDY3MiwtMC4wMDU4OTYzNTU5Nzg3NTg0NjksLTAuMDAyMzk3ODUxNDMxMzYxNzc4LDAuMDAzOTk4MjkwOTExMzEwNTA1LDAuMDEzMTk2NjA2MjM4MTczNzE4LDAuMDIzMDk2ODY4NzA1MzY1MzE4LDAuMDMwMDk5NDkzMzc3MjgxMzMsMC4wMzAxOTQ5NTgxODgzNjU5OSwwLjAyMDY5OTAxNzI3NDAwMzU0MiwwLjAwMTQ5OTM1OTA5MTc0MTQzOTMsLTAuMDI0MTk3NTIxODIxNDAwMjMyLC0wLjA0OTc5ODkzNzkyMzQ1NzI0LC0wLjA2NzY5NTc4MjIxMzI2OTg2LC0wLjA3MTE5OTkwMjMzNzc4OTE4LC0wLjA1NzA5OTE4ODE4Mjg3MjQ5LC0wLjAyNjg5ODYxNDQxNzM4Mzg3NSwwLjAxMjg5ODk4MDY1MDY3NDQ4LDAuMDUyNDk0NDE0OTQyMzE4MjYsMC4wODEzOTc3OTAzOTI0ODAwMiwwLjA5MTk5NDM4NDQyMjg3NzM4LDAuMDgxMzk3NzkwMzkyNDgwMDIsMC4wNTI0OTQ0MTQ5NDIzMTgyNiwwLjAxMjg5ODk4MDY1MDY3NDQ4LC0wLjAyNjg5ODYxNDQxNzM4Mzg3NSwtMC4wNTcwOTkxODgxODI4NzI0OSwtMC4wNzExOTk5MDIzMzc3ODkxOCwtMC4wNjc2OTU3ODIyMTMyNjk4NiwtMC4wNDk3OTg5Mzc5MjM0NTcyNCwtMC4wMjQxOTc1MjE4MjE0MDAyMzIsMC4wMDE0OTkzNTkwOTE3NDE0MzkzLDAuMDIwNjk5MDE3Mjc0MDAzNTQyLDAuMDMwMTk0OTU4MTg4MzY1OTksMC4wMzAwOTk0OTMzNzcyODEzMywwLjAyMzA5Njg2ODcwNTM2NTMxOCwwLjAxMzE5NjYwNjIzODE3MzcxOCwwLjAwMzk5ODI5MDkxMTMxMDUwNSwtMC4wMDIzOTc4NTE0MzEzNjE3NzgsLTAuMDA1ODk2MzU1OTc4NzU4NDY5LC0wLjAwNzA5ODA4OTQ4MzAwMDY3MiwtMC4wMDcyOTQ2MzQ2ODIyOTI2MjE=::U2NhbGVkIENvZWZmaWNpZW50IFZhbHVlcw==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZTZXRTY2FsZVZhbHVlSW1hZw==::MC4wLDAuMCwwLjAsMC4wLDAuMCwwLjAsMC4wLDAuMA==::U2NhbGVkIENvZWZmaWNpZW50IFZhbHVlcyAoSW1hZ2luYXJ5IENvbXBvbmVudCk=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZTZXRGaXhlZFZhbHVl::LTEyOTksLTEyNjQsLTEwNTAsLTQyNyw3MTIsMjM1MCw0MTEzLDUzNjAsNTM3NywzNjg2LDI2NywtNDMwOSwtODg2OCwtMTIwNTUsLTEyNjc5LC0xMDE2OCwtNDc5MCwyMjk3LDkzNDgsMTQ0OTUsMTYzODIsMTQ0OTUsOTM0OCwyMjk3LC00NzkwLC0xMDE2OCwtMTI2NzksLTEyMDU1LC04ODY4LC00MzA5LDI2NywzNjg2LDUzNzcsNTM2MCw0MTEzLDIzNTAsNzEyLC00MjcsLTEwNTAsLTEyNjQsLTEyOTk=::Rml4ZWQtcG9pbnQgQ29lZmZpY2llbnQgVmFsdWVz" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZTZXRGaXhlZFZhbHVlSW1hZw==::MCwwLDAsMCwwLDAsMCww::Rml4ZWQtcG9pbnQgQ29lZmZpY2llbnQgVmFsdWVzIChJbWFnaW5hcnkgQ29tcG9uZW50KQ==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZTY2FsaW5n::YXV0bw==::Q29lZmZpY2llbnQgU2NhbGluZw==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZUeXBl::ZnJhYw==::Q29lZmZpY2llbnQgRGF0YSBUeXBl" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZGcmFjQml0V2lkdGg=::MTQ=::Q29lZmZpY2llbnQgRnJhY3Rpb25hbCBXaWR0aA==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y29lZmZDb21wbGV4::ZmFsc2U=::Q29tcGxleCBDb2VmZmljaWVudHM=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "a2FyYXRzdWJh::ZmFsc2U=::S2FyYXRzdWJhIEltcGxlbWVudGF0aW9u" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "b3V0VHlwZQ==::ZnJhYw==::T3V0cHV0IFR5cGU=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "b3V0TVNCUm91bmQ=::dHJ1bmM=::U3BlY2lmaWVzIHdoZXRoZXIgdG8gdHJ1bmNhdGUgb3Igc2F0dXJhdGUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IChNU0IpLg==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "b3V0TXNiQml0UmVt::MA==::TVNCIEJpdHMgdG8gUmVtb3Zl" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "b3V0TFNCUm91bmQ=::dHJ1bmM=::U3BlY2lmaWVzIHdoZXRoZXIgdG8gdHJ1bmNhdGUgb3Igcm91bmQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCAoTFNCKS4=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "b3V0THNiQml0UmVt::MA==::TFNCIEJpdHMgdG8gUmVtb3Zl" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "aW5wdXRJbnRlcmZhY2VOdW0=::MQ==::TnVtYmVyIG9mIFBhcmFsbGVsIElucHV0IFN5bWJvbHM=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "b3V0cHV0SW50ZXJmYWNlTnVt::MQ==::TnVtYmVyIG9mIFBhcmFsbGVsIE91dHB1dCBTeW1ib2xz" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y2hhblBlcklucHV0SW50ZXJmYWNl::MQ==::TnVtYmVyIG9mIENoYW5uZWxzIHBlciBJbnB1dCBJbnRlcmZhY2U=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "Y2hhblBlck91dHB1dEludGVyZmFjZQ==::MQ==::TnVtYmVyIG9mIENoYW5uZWxzIHBlciBPdXRwdXQgSW50ZXJmYWNl" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "bGF0ZW5jeQ==::MTM=::bGF0ZW5jeQ==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "b3V0cHV0Zmlmb2RlcHRo::OA==::b3V0cHV0Zmlmb2RlcHRo" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "ZnVuY1Jlc3VsdA==::LWludGVycD0xIC1kZWNpbT0xIC1pbmN5Y2xlcz0xIC1sZW49NDEgLWJhbmtjb3VudD0xIC1uc3ltIC1uYmFuZD0xIC1jaGFucz0xIC1mYW1pbHk9IkN5Y2xvbmUgViIgCnx7fXwxfDF8MXwxfDM3fDI4fDEzfDR8bm9Db2RlfExVVFM6IDgzIERTUHM6IDQyIFJBTSBCaXRzOiAwfA==::ZnVuY1Jlc3VsdA==" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "YnVzQWRkcmVzc1dpZHRo::Ng==::YnVzQWRkcmVzc1dpZHRo" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "YmFua0NvdW50::MQ==::TnVtYmVyIG9mIENvZWZmaWNpZW50IEJhbmtz" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "YmFua0luV2lkdGg=::MA==::YmFua0luV2lkdGg=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "YmFua0Rpc3BsYXk=::MA==::YmFua0Rpc3BsYXk=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "bHV0Q291bnQ=::ODM=::TnVtYmVyIG9mIExVVHM=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "ZHNwQ291bnQ=::NDI=::TnVtYmVyIG9mIERTUHM=" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "bWVtQml0Q291bnQ=::MA==::TnVtYmVyIG9mIE1lbW9yeSBCaXRz" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_COMPONENT_PARAMETER "ZXJyb3JMaXN0::MA==::ZXJyb3JMaXN0" + +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/dspba_library_package.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/dspba_library.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/auk_dspip_math_pkg_hpfir.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/auk_dspip_lib_pkg_hpfir.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/auk_dspip_avalon_streaming_controller_hpfir.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/auk_dspip_avalon_streaming_sink_hpfir.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/auk_dspip_avalon_streaming_source_hpfir.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/auk_dspip_roundsat_hpfir.vhd"] +set_global_assignment -library "fir" -name VERILOG_FILE [file join $::quartus(qip_path) "fir/altera_avalon_sc_fifo.v"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/fir_0002_rtl_core.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/fir_0002_ast.vhd"] +set_global_assignment -library "fir" -name VHDL_FILE [file join $::quartus(qip_path) "fir/fir_0002.vhd"] + +set_global_assignment -entity "fir_0002" -library "fir" -name IP_TOOL_NAME "altera_fir_compiler_ii" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_TOOL_VERSION "19.1" +set_global_assignment -entity "fir_0002" -library "fir" -name IP_TOOL_ENV "mwpim" diff --git a/ld3/dds_vhdl/fir.sip b/ld3/dds_vhdl/fir.sip new file mode 100644 index 0000000..722b263 --- /dev/null +++ b/ld3/dds_vhdl/fir.sip @@ -0,0 +1,25 @@ +set_global_assignment -entity "fir" -library "lib_fir" -name IP_TOOL_NAME "altera_fir_compiler_ii" +set_global_assignment -entity "fir" -library "lib_fir" -name IP_TOOL_VERSION "19.1" +set_global_assignment -entity "fir" -library "lib_fir" -name IP_TOOL_ENV "mwpim" +set_global_assignment -library "lib_fir" -name SPD_FILE [file join $::quartus(sip_path) "fir.spd"] + +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/dspba_library_package.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/dspba_library.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/auk_dspip_math_pkg_hpfir.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/auk_dspip_lib_pkg_hpfir.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/auk_dspip_avalon_streaming_controller_hpfir.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/auk_dspip_avalon_streaming_sink_hpfir.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/auk_dspip_avalon_streaming_source_hpfir.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/auk_dspip_roundsat_hpfir.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/altera_avalon_sc_fifo.v"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_rtl_core.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_ast.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_nativelink.tcl"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_msim.tcl"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_tb.vhd"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_mlab.m"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_model.m"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_coef_int.txt"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_input.txt"] +set_global_assignment -library "lib_fir" -name MISC_FILE [file join $::quartus(sip_path) "fir_sim/fir_param.txt"] diff --git a/ld3/dds_vhdl/fir.spd b/ld3/dds_vhdl/fir.spd new file mode 100644 index 0000000..cd3ff80 --- /dev/null +++ b/ld3/dds_vhdl/fir.spd @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ld3/dds_vhdl/fir.vhd b/ld3/dds_vhdl/fir.vhd new file mode 100644 index 0000000..96df429 --- /dev/null +++ b/ld3/dds_vhdl/fir.vhd @@ -0,0 +1,123 @@ +-- megafunction wizard: %FIR II v19.1% +-- GENERATION: XML +-- fir.vhd + +-- Generated using ACDS version 19.1 670 + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.numeric_std.all; + +entity fir is + port ( + clk : in std_logic := '0'; -- clk.clk + reset_n : in std_logic := '0'; -- rst.reset_n + ast_sink_data : in std_logic_vector(15 downto 0) := (others => '0'); -- avalon_streaming_sink.data + ast_sink_valid : in std_logic := '0'; -- .valid + ast_sink_error : in std_logic_vector(1 downto 0) := (others => '0'); -- .error + ast_source_data : out std_logic_vector(36 downto 0); -- avalon_streaming_source.data + ast_source_valid : out std_logic; -- .valid + ast_source_error : out std_logic_vector(1 downto 0) -- .error + ); +end entity fir; + +architecture rtl of fir is + component fir_0002 is + port ( + clk : in std_logic := 'X'; -- clk + reset_n : in std_logic := 'X'; -- reset_n + ast_sink_data : in std_logic_vector(15 downto 0) := (others => 'X'); -- data + ast_sink_valid : in std_logic := 'X'; -- valid + ast_sink_error : in std_logic_vector(1 downto 0) := (others => 'X'); -- error + ast_source_data : out std_logic_vector(36 downto 0); -- data + ast_source_valid : out std_logic; -- valid + ast_source_error : out std_logic_vector(1 downto 0) -- error + ); + end component fir_0002; + +begin + + fir_inst : component fir_0002 + port map ( + clk => clk, -- clk.clk + reset_n => reset_n, -- rst.reset_n + ast_sink_data => ast_sink_data, -- avalon_streaming_sink.data + ast_sink_valid => ast_sink_valid, -- .valid + ast_sink_error => ast_sink_error, -- .error + ast_source_data => ast_source_data, -- avalon_streaming_source.data + ast_source_valid => ast_source_valid, -- .valid + ast_source_error => ast_source_error -- .error + ); + +end architecture rtl; -- of fir +-- Retrieval info: +-- +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- Retrieval info: +-- IPFS_FILES : NONE diff --git a/ld3/dds_vhdl/fir/altera_avalon_sc_fifo.v b/ld3/dds_vhdl/fir/altera_avalon_sc_fifo.v new file mode 100644 index 0000000..0d57cc2 --- /dev/null +++ b/ld3/dds_vhdl/fir/altera_avalon_sc_fifo.v @@ -0,0 +1,915 @@ +// ----------------------------------------------------------- +// Legal Notice: (C)2007 Altera Corporation. All rights reserved. Your +// use of Altera Corporation's design tools, logic functions and other +// software and tools, and its AMPP partner logic functions, and any +// output files 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 Altera Program +// License Subscription Agreement or other applicable license agreement, +// including, without limitation, that your use is for the sole purpose +// of programming logic devices manufactured by Altera and sold by Altera +// or its authorized distributors. Please refer to the applicable +// agreement for further details. +// +// Description: Single clock Avalon-ST FIFO. +// ----------------------------------------------------------- + +`timescale 1 ns / 1 ns + + +//altera message_off 10036 +module altera_avalon_sc_fifo +#( + // -------------------------------------------------- + // Parameters + // -------------------------------------------------- + parameter SYMBOLS_PER_BEAT = 1, + parameter BITS_PER_SYMBOL = 8, + parameter FIFO_DEPTH = 16, + parameter CHANNEL_WIDTH = 0, + parameter ERROR_WIDTH = 0, + parameter USE_PACKETS = 0, + parameter USE_FILL_LEVEL = 0, + parameter USE_STORE_FORWARD = 0, + parameter USE_ALMOST_FULL_IF = 0, + parameter USE_ALMOST_EMPTY_IF = 0, + + // -------------------------------------------------- + // Empty latency is defined as the number of cycles + // required for a write to deassert the empty flag. + // For example, a latency of 1 means that the empty + // flag is deasserted on the cycle after a write. + // + // Another way to think of it is the latency for a + // write to propagate to the output. + // + // An empty latency of 0 implies lookahead, which is + // only implemented for the register-based FIFO. + // -------------------------------------------------- + parameter EMPTY_LATENCY = 3, + parameter USE_MEMORY_BLOCKS = 1, + + // -------------------------------------------------- + // Internal Parameters + // -------------------------------------------------- + parameter DATA_WIDTH = SYMBOLS_PER_BEAT * BITS_PER_SYMBOL, + parameter EMPTY_WIDTH = log2ceil(SYMBOLS_PER_BEAT) +) +( + // -------------------------------------------------- + // Ports + // -------------------------------------------------- + input clk, + input reset, + + input [DATA_WIDTH-1: 0] in_data, + input in_valid, + input in_startofpacket, + input in_endofpacket, + input [((EMPTY_WIDTH>0) ? (EMPTY_WIDTH-1):0) : 0] in_empty, + input [((ERROR_WIDTH>0) ? (ERROR_WIDTH-1):0) : 0] in_error, + input [((CHANNEL_WIDTH>0) ? (CHANNEL_WIDTH-1):0): 0] in_channel, + output in_ready, + + output [DATA_WIDTH-1 : 0] out_data, + output reg out_valid, + output out_startofpacket, + output out_endofpacket, + output [((EMPTY_WIDTH>0) ? (EMPTY_WIDTH-1):0) : 0] out_empty, + output [((ERROR_WIDTH>0) ? (ERROR_WIDTH-1):0) : 0] out_error, + output [((CHANNEL_WIDTH>0) ? (CHANNEL_WIDTH-1):0): 0] out_channel, + input out_ready, + + input [(USE_STORE_FORWARD ? 2 : 1) : 0] csr_address, + input csr_write, + input csr_read, + input [31 : 0] csr_writedata, + output reg [31 : 0] csr_readdata, + + output wire almost_full_data, + output wire almost_empty_data +); + + // -------------------------------------------------- + // Local Parameters + // -------------------------------------------------- + localparam ADDR_WIDTH = log2ceil(FIFO_DEPTH); + localparam DEPTH = FIFO_DEPTH; + localparam PKT_SIGNALS_WIDTH = 2 + EMPTY_WIDTH; + localparam PAYLOAD_WIDTH = (USE_PACKETS == 1) ? + 2 + EMPTY_WIDTH + DATA_WIDTH + ERROR_WIDTH + CHANNEL_WIDTH: + DATA_WIDTH + ERROR_WIDTH + CHANNEL_WIDTH; + + // -------------------------------------------------- + // Internal Signals + // -------------------------------------------------- + genvar i; + + reg [PAYLOAD_WIDTH-1 : 0] mem [DEPTH-1 : 0]; + reg [ADDR_WIDTH-1 : 0] wr_ptr; + reg [ADDR_WIDTH-1 : 0] rd_ptr; + reg [DEPTH-1 : 0] mem_used; + + wire [ADDR_WIDTH-1 : 0] next_wr_ptr; + wire [ADDR_WIDTH-1 : 0] next_rd_ptr; + wire [ADDR_WIDTH-1 : 0] incremented_wr_ptr; + wire [ADDR_WIDTH-1 : 0] incremented_rd_ptr; + + wire [ADDR_WIDTH-1 : 0] mem_rd_ptr; + + wire read; + wire write; + + reg empty; + reg next_empty; + reg full; + reg next_full; + + wire [PKT_SIGNALS_WIDTH-1 : 0] in_packet_signals; + wire [PKT_SIGNALS_WIDTH-1 : 0] out_packet_signals; + wire [PAYLOAD_WIDTH-1 : 0] in_payload; + reg [PAYLOAD_WIDTH-1 : 0] internal_out_payload; + reg [PAYLOAD_WIDTH-1 : 0] out_payload; + + reg internal_out_valid; + wire internal_out_ready; + + reg [ADDR_WIDTH : 0] fifo_fill_level; + reg [ADDR_WIDTH : 0] fill_level; + + reg [ADDR_WIDTH-1 : 0] sop_ptr = 0; + wire [ADDR_WIDTH-1 : 0] curr_sop_ptr; + reg [23:0] almost_full_threshold; + reg [23:0] almost_empty_threshold; + reg [23:0] cut_through_threshold; + reg [15:0] pkt_cnt; + reg drop_on_error_en; + reg error_in_pkt; + reg pkt_has_started; + reg sop_has_left_fifo; + reg fifo_too_small_r; + reg pkt_cnt_eq_zero; + reg pkt_cnt_eq_one; + + wire wait_for_threshold; + reg pkt_mode; + wire wait_for_pkt; + wire ok_to_forward; + wire in_pkt_eop_arrive; + wire out_pkt_leave; + wire in_pkt_start; + wire in_pkt_error; + wire drop_on_error; + wire fifo_too_small; + wire out_pkt_sop_leave; + wire [31:0] max_fifo_size; + reg fifo_fill_level_lt_cut_through_threshold; + + // -------------------------------------------------- + // Define Payload + // + // Icky part where we decide which signals form the + // payload to the FIFO with generate blocks. + // -------------------------------------------------- + generate + if (EMPTY_WIDTH > 0) begin : gen_blk1 + assign in_packet_signals = {in_startofpacket, in_endofpacket, in_empty}; + assign {out_startofpacket, out_endofpacket, out_empty} = out_packet_signals; + end + else begin : gen_blk1_else + assign out_empty = in_error; + assign in_packet_signals = {in_startofpacket, in_endofpacket}; + assign {out_startofpacket, out_endofpacket} = out_packet_signals; + end + endgenerate + + generate + if (USE_PACKETS) begin : gen_blk2 + if (ERROR_WIDTH > 0) begin : gen_blk3 + if (CHANNEL_WIDTH > 0) begin : gen_blk4 + assign in_payload = {in_packet_signals, in_data, in_error, in_channel}; + assign {out_packet_signals, out_data, out_error, out_channel} = out_payload; + end + else begin : gen_blk4_else + assign out_channel = in_channel; + assign in_payload = {in_packet_signals, in_data, in_error}; + assign {out_packet_signals, out_data, out_error} = out_payload; + end + end + else begin : gen_blk3_else + assign out_error = in_error; + if (CHANNEL_WIDTH > 0) begin : gen_blk5 + assign in_payload = {in_packet_signals, in_data, in_channel}; + assign {out_packet_signals, out_data, out_channel} = out_payload; + end + else begin : gen_blk5_else + assign out_channel = in_channel; + assign in_payload = {in_packet_signals, in_data}; + assign {out_packet_signals, out_data} = out_payload; + end + end + end + else begin : gen_blk2_else + assign out_packet_signals = 0; + if (ERROR_WIDTH > 0) begin : gen_blk6 + if (CHANNEL_WIDTH > 0) begin : gen_blk7 + assign in_payload = {in_data, in_error, in_channel}; + assign {out_data, out_error, out_channel} = out_payload; + end + else begin : gen_blk7_else + assign out_channel = in_channel; + assign in_payload = {in_data, in_error}; + assign {out_data, out_error} = out_payload; + end + end + else begin : gen_blk6_else + assign out_error = in_error; + if (CHANNEL_WIDTH > 0) begin : gen_blk8 + assign in_payload = {in_data, in_channel}; + assign {out_data, out_channel} = out_payload; + end + else begin : gen_blk8_else + assign out_channel = in_channel; + assign in_payload = in_data; + assign out_data = out_payload; + end + end + end + endgenerate + + // -------------------------------------------------- + // Memory-based FIFO storage + // + // To allow a ready latency of 0, the read index is + // obtained from the next read pointer and memory + // outputs are unregistered. + // + // If the empty latency is 1, we infer bypass logic + // around the memory so writes propagate to the + // outputs on the next cycle. + // + // Do not change the way this is coded: Quartus needs + // a perfect match to the template, and any attempt to + // refactor the two always blocks into one will break + // memory inference. + // -------------------------------------------------- + generate if (USE_MEMORY_BLOCKS == 1) begin : gen_blk9 + + if (EMPTY_LATENCY == 1) begin : gen_blk10 + + always @(posedge clk) begin + if (in_valid && in_ready) + mem[wr_ptr] = in_payload; + + internal_out_payload = mem[mem_rd_ptr]; + end + + end else begin : gen_blk10_else + + always @(posedge clk) begin + if (in_valid && in_ready) + mem[wr_ptr] <= in_payload; + + internal_out_payload <= mem[mem_rd_ptr]; + end + + end + + assign mem_rd_ptr = next_rd_ptr; + + end else begin : gen_blk9_else + + // -------------------------------------------------- + // Register-based FIFO storage + // + // Uses a shift register as the storage element. Each + // shift register slot has a bit which indicates if + // the slot is occupied (credit to Sam H for the idea). + // The occupancy bits are contiguous and start from the + // lsb, so 0000, 0001, 0011, 0111, 1111 for a 4-deep + // FIFO. + // + // Each slot is enabled during a read or when it + // is unoccupied. New data is always written to every + // going-to-be-empty slot (we keep track of which ones + // are actually useful with the occupancy bits). On a + // read we shift occupied slots. + // + // The exception is the last slot, which always gets + // new data when it is unoccupied. + // -------------------------------------------------- + for (i = 0; i < DEPTH-1; i = i + 1) begin : shift_reg + always @(posedge clk or posedge reset) begin + if (reset) begin + mem[i] <= 0; + end + else if (read || !mem_used[i]) begin + if (!mem_used[i+1]) + mem[i] <= in_payload; + else + mem[i] <= mem[i+1]; + end + end + end + + always @(posedge clk, posedge reset) begin + if (reset) begin + mem[DEPTH-1] <= 0; + end + else begin + if (DEPTH == 1) begin + if (write) + mem[DEPTH-1] <= in_payload; + end + else if (!mem_used[DEPTH-1]) + mem[DEPTH-1] <= in_payload; + end + end + + end + endgenerate + + assign read = internal_out_ready && internal_out_valid && ok_to_forward; + assign write = in_ready && in_valid; + + // -------------------------------------------------- + // Pointer Management + // -------------------------------------------------- + generate if (USE_MEMORY_BLOCKS == 1) begin : gen_blk11 + + assign incremented_wr_ptr = wr_ptr + 1'b1; + assign incremented_rd_ptr = rd_ptr + 1'b1; + assign next_wr_ptr = drop_on_error ? curr_sop_ptr : write ? incremented_wr_ptr : wr_ptr; + assign next_rd_ptr = (read) ? incremented_rd_ptr : rd_ptr; + + always @(posedge clk or posedge reset) begin + if (reset) begin + wr_ptr <= 0; + rd_ptr <= 0; + end + else begin + wr_ptr <= next_wr_ptr; + rd_ptr <= next_rd_ptr; + end + end + + end else begin : gen_blk11_else + + // -------------------------------------------------- + // Shift Register Occupancy Bits + // + // Consider a 4-deep FIFO with 2 entries: 0011 + // On a read and write, do not modify the bits. + // On a write, left-shift the bits to get 0111. + // On a read, right-shift the bits to get 0001. + // + // Also, on a write we set bit0 (the head), while + // clearing the tail on a read. + // -------------------------------------------------- + always @(posedge clk or posedge reset) begin + if (reset) begin + mem_used[0] <= 0; + end + else begin + if (write ^ read) begin + if (write) + mem_used[0] <= 1; + else if (read) begin + if (DEPTH > 1) + mem_used[0] <= mem_used[1]; + else + mem_used[0] <= 0; + end + end + end + end + + if (DEPTH > 1) begin : gen_blk12 + always @(posedge clk or posedge reset) begin + if (reset) begin + mem_used[DEPTH-1] <= 0; + end + else begin + if (write ^ read) begin + mem_used[DEPTH-1] <= 0; + if (write) + mem_used[DEPTH-1] <= mem_used[DEPTH-2]; + end + end + end + end + + for (i = 1; i < DEPTH-1; i = i + 1) begin : storage_logic + always @(posedge clk, posedge reset) begin + if (reset) begin + mem_used[i] <= 0; + end + else begin + if (write ^ read) begin + if (write) + mem_used[i] <= mem_used[i-1]; + else if (read) + mem_used[i] <= mem_used[i+1]; + end + end + end + end + + end + endgenerate + + + // -------------------------------------------------- + // Memory FIFO Status Management + // + // Generates the full and empty signals from the + // pointers. The FIFO is full when the next write + // pointer will be equal to the read pointer after + // a write. Reading from a FIFO clears full. + // + // The FIFO is empty when the next read pointer will + // be equal to the write pointer after a read. Writing + // to a FIFO clears empty. + // + // A simultaneous read and write must not change any of + // the empty or full flags unless there is a drop on error event. + // -------------------------------------------------- + generate if (USE_MEMORY_BLOCKS == 1) begin : gen_blk13 + + always @* begin + next_full = full; + next_empty = empty; + + if (read && !write) begin + next_full = 1'b0; + + if (incremented_rd_ptr == wr_ptr) + next_empty = 1'b1; + end + + if (write && !read) begin + if (!drop_on_error) + next_empty = 1'b0; + else if (curr_sop_ptr == rd_ptr) // drop on error and only 1 pkt in fifo + next_empty = 1'b1; + + if (incremented_wr_ptr == rd_ptr && !drop_on_error) + next_full = 1'b1; + end + + if (write && read && drop_on_error) begin + if (curr_sop_ptr == next_rd_ptr) + next_empty = 1'b1; + end + end + + always @(posedge clk or posedge reset) begin + if (reset) begin + empty <= 1; + full <= 0; + end + else begin + empty <= next_empty; + full <= next_full; + end + end + + end else begin : gen_blk13_else + // -------------------------------------------------- + // Register FIFO Status Management + // + // Full when the tail occupancy bit is 1. Empty when + // the head occupancy bit is 0. + // -------------------------------------------------- + always @* begin + full = mem_used[DEPTH-1]; + empty = !mem_used[0]; + + // ------------------------------------------ + // For a single slot FIFO, reading clears the + // full status immediately. + // ------------------------------------------ + if (DEPTH == 1) + full = mem_used[0] && !read; + + internal_out_payload = mem[0]; + + // ------------------------------------------ + // Writes clear empty immediately for lookahead modes. + // Note that we use in_valid instead of write to avoid + // combinational loops (in lookahead mode, qualifying + // with in_ready is meaningless). + // + // In a 1-deep FIFO, a possible combinational loop runs + // from write -> out_valid -> out_ready -> write + // ------------------------------------------ + if (EMPTY_LATENCY == 0) begin + empty = !mem_used[0] && !in_valid; + + if (!mem_used[0] && in_valid) + internal_out_payload = in_payload; + end + end + + end + endgenerate + + // -------------------------------------------------- + // Avalon-ST Signals + // + // The in_ready signal is straightforward. + // + // To match memory latency when empty latency > 1, + // out_valid assertions must be delayed by one clock + // cycle. + // + // Note: out_valid deassertions must not be delayed or + // the FIFO will underflow. + // -------------------------------------------------- + assign in_ready = !full; + assign internal_out_ready = out_ready || !out_valid; + + generate if (EMPTY_LATENCY > 1) begin : gen_blk14 + always @(posedge clk or posedge reset) begin + if (reset) + internal_out_valid <= 0; + else begin + internal_out_valid <= !empty & ok_to_forward & ~drop_on_error; + + if (read) begin + if (incremented_rd_ptr == wr_ptr) + internal_out_valid <= 1'b0; + end + end + end + end else begin : gen_blk14_else + always @* begin + internal_out_valid = !empty & ok_to_forward; + end + end + endgenerate + + // -------------------------------------------------- + // Single Output Pipeline Stage + // + // This output pipeline stage is enabled if the FIFO's + // empty latency is set to 3 (default). It is disabled + // for all other allowed latencies. + // + // Reason: The memory outputs are unregistered, so we have to + // register the output or fmax will drop if combinatorial + // logic is present on the output datapath. + // + // Q: The Avalon-ST spec says that I have to register my outputs + // But isn't the memory counted as a register? + // A: The path from the address lookup to the memory output is + // slow. Registering the memory outputs is a good idea. + // + // The registers get packed into the memory by the fitter + // which means minimal resources are consumed (the result + // is a altsyncram with registered outputs, available on + // all modern Altera devices). + // + // This output stage acts as an extra slot in the FIFO, + // and complicates the fill level. + // -------------------------------------------------- + generate if (EMPTY_LATENCY == 3) begin : gen_blk15 + always @(posedge clk or posedge reset) begin + if (reset) begin + out_valid <= 0; + out_payload <= 0; + end + else begin + if (internal_out_ready) begin + out_valid <= internal_out_valid & ok_to_forward; + out_payload <= internal_out_payload; + end + end + end + end + else begin : gen_blk15_else + always @* begin + out_valid = internal_out_valid; + out_payload = internal_out_payload; + end + end + endgenerate + + // -------------------------------------------------- + // Fill Level + // + // The fill level is calculated from the next write + // and read pointers to avoid unnecessary latency + // and logic. + // + // However, if the store-and-forward mode of the FIFO + // is enabled, the fill level is an up-down counter + // for fmax optimization reasons. + // + // If the output pipeline is enabled, the fill level + // must account for it, or we'll always be off by one. + // This may, or may not be important depending on the + // application. + // + // For now, we'll always calculate the exact fill level + // at the cost of an extra adder when the output stage + // is enabled. + // -------------------------------------------------- + generate if (USE_FILL_LEVEL) begin : gen_blk16 + wire [31:0] depth32; + assign depth32 = DEPTH; + + if (USE_STORE_FORWARD) begin + + reg [ADDR_WIDTH : 0] curr_packet_len_less_one; + + // -------------------------------------------------- + // We only drop on endofpacket. As long as we don't add to the fill + // level on the dropped endofpacket cycle, we can simply subtract + // (packet length - 1) from the fill level for dropped packets. + // -------------------------------------------------- + always @(posedge clk or posedge reset) begin + if (reset) begin + curr_packet_len_less_one <= 0; + end else begin + if (write) begin + curr_packet_len_less_one <= curr_packet_len_less_one + 1'b1; + if (in_endofpacket) + curr_packet_len_less_one <= 0; + end + end + end + + always @(posedge clk or posedge reset) begin + if (reset) begin + fifo_fill_level <= 0; + end else if (drop_on_error) begin + fifo_fill_level <= fifo_fill_level - curr_packet_len_less_one; + if (read) + fifo_fill_level <= fifo_fill_level - curr_packet_len_less_one - 1'b1; + end else if (write && !read) begin + fifo_fill_level <= fifo_fill_level + 1'b1; + end else if (read && !write) begin + fifo_fill_level <= fifo_fill_level - 1'b1; + end + end + + end else begin + + always @(posedge clk or posedge reset) begin + if (reset) + fifo_fill_level <= 0; + else if (next_full & !drop_on_error) + fifo_fill_level <= depth32[ADDR_WIDTH:0]; + else begin + fifo_fill_level[ADDR_WIDTH] <= 1'b0; + fifo_fill_level[ADDR_WIDTH-1 : 0] <= next_wr_ptr - next_rd_ptr; + end + end + + end + + always @* begin + fill_level = fifo_fill_level; + + if (EMPTY_LATENCY == 3) + fill_level = fifo_fill_level + {{ADDR_WIDTH{1'b0}}, out_valid}; + end + end + else begin : gen_blk16_else + always @* begin + fill_level = 0; + end + end + endgenerate + + generate if (USE_ALMOST_FULL_IF) begin : gen_blk17 + assign almost_full_data = (fill_level >= almost_full_threshold); + end + else + assign almost_full_data = 0; + endgenerate + + generate if (USE_ALMOST_EMPTY_IF) begin : gen_blk18 + assign almost_empty_data = (fill_level <= almost_empty_threshold); + end + else + assign almost_empty_data = 0; + endgenerate + + // -------------------------------------------------- + // Avalon-MM Status & Control Connection Point + // + // Register map: + // + // | Addr | RW | 31 - 0 | + // | 0 | R | Fill level | + // + // The registering of this connection point means + // that there is a cycle of latency between + // reads/writes and the updating of the fill level. + // -------------------------------------------------- + generate if (USE_STORE_FORWARD) begin : gen_blk19 + assign max_fifo_size = FIFO_DEPTH - 1; + always @(posedge clk or posedge reset) begin + if (reset) begin + almost_full_threshold <= max_fifo_size[23 : 0]; + almost_empty_threshold <= 0; + cut_through_threshold <= 0; + drop_on_error_en <= 0; + csr_readdata <= 0; + pkt_mode <= 1'b1; + end + else begin + if (csr_read) begin + csr_readdata <= 32'b0; + if (csr_address == 5) + csr_readdata <= {31'b0, drop_on_error_en}; + else if (csr_address == 4) + csr_readdata <= {8'b0, cut_through_threshold}; + else if (csr_address == 3) + csr_readdata <= {8'b0, almost_empty_threshold}; + else if (csr_address == 2) + csr_readdata <= {8'b0, almost_full_threshold}; + else if (csr_address == 0) + csr_readdata <= {{(31 - ADDR_WIDTH){1'b0}}, fill_level}; + end + else if (csr_write) begin + if(csr_address == 3'b101) + drop_on_error_en <= csr_writedata[0]; + else if(csr_address == 3'b100) begin + cut_through_threshold <= csr_writedata[23:0]; + pkt_mode <= (csr_writedata[23:0] == 0); + end + else if(csr_address == 3'b011) + almost_empty_threshold <= csr_writedata[23:0]; + else if(csr_address == 3'b010) + almost_full_threshold <= csr_writedata[23:0]; + end + end + end + end + else if (USE_ALMOST_FULL_IF || USE_ALMOST_EMPTY_IF) begin : gen_blk19_else1 + assign max_fifo_size = FIFO_DEPTH - 1; + always @(posedge clk or posedge reset) begin + if (reset) begin + almost_full_threshold <= max_fifo_size[23 : 0]; + almost_empty_threshold <= 0; + csr_readdata <= 0; + end + else begin + if (csr_read) begin + csr_readdata <= 32'b0; + if (csr_address == 3) + csr_readdata <= {8'b0, almost_empty_threshold}; + else if (csr_address == 2) + csr_readdata <= {8'b0, almost_full_threshold}; + else if (csr_address == 0) + csr_readdata <= {{(31 - ADDR_WIDTH){1'b0}}, fill_level}; + end + else if (csr_write) begin + if(csr_address == 3'b011) + almost_empty_threshold <= csr_writedata[23:0]; + else if(csr_address == 3'b010) + almost_full_threshold <= csr_writedata[23:0]; + end + end + end + end + else begin : gen_blk19_else2 + always @(posedge clk or posedge reset) begin + if (reset) begin + csr_readdata <= 0; + end + else if (csr_read) begin + csr_readdata <= 0; + + if (csr_address == 0) + csr_readdata <= {{(31 - ADDR_WIDTH){1'b0}}, fill_level}; + end + end + end + endgenerate + + // -------------------------------------------------- + // Store and forward logic + // -------------------------------------------------- + // if the fifo gets full before the entire packet or the + // cut-threshold condition is met then start sending out + // data in order to avoid dead-lock situation + + generate if (USE_STORE_FORWARD) begin : gen_blk20 + assign wait_for_threshold = (fifo_fill_level_lt_cut_through_threshold) & wait_for_pkt ; + assign wait_for_pkt = pkt_cnt_eq_zero | (pkt_cnt_eq_one & out_pkt_leave); + assign ok_to_forward = (pkt_mode ? (~wait_for_pkt | ~pkt_has_started) : + ~wait_for_threshold) | fifo_too_small_r; + assign in_pkt_eop_arrive = in_valid & in_ready & in_endofpacket; + assign in_pkt_start = in_valid & in_ready & in_startofpacket; + assign in_pkt_error = in_valid & in_ready & |in_error; + assign out_pkt_sop_leave = out_valid & out_ready & out_startofpacket; + assign out_pkt_leave = out_valid & out_ready & out_endofpacket; + assign fifo_too_small = (pkt_mode ? wait_for_pkt : wait_for_threshold) & full & out_ready; + + // count packets coming and going into the fifo + always @(posedge clk or posedge reset) begin + if (reset) begin + pkt_cnt <= 0; + pkt_has_started <= 0; + sop_has_left_fifo <= 0; + fifo_too_small_r <= 0; + pkt_cnt_eq_zero <= 1'b1; + pkt_cnt_eq_one <= 1'b0; + fifo_fill_level_lt_cut_through_threshold <= 1'b1; + end + else begin + fifo_fill_level_lt_cut_through_threshold <= fifo_fill_level < cut_through_threshold; + fifo_too_small_r <= fifo_too_small; + + if( in_pkt_eop_arrive ) + sop_has_left_fifo <= 1'b0; + else if (out_pkt_sop_leave & pkt_cnt_eq_zero ) + sop_has_left_fifo <= 1'b1; + + if (in_pkt_eop_arrive & ~out_pkt_leave & ~drop_on_error ) begin + pkt_cnt <= pkt_cnt + 1'b1; + pkt_cnt_eq_zero <= 0; + if (pkt_cnt == 0) + pkt_cnt_eq_one <= 1'b1; + else + pkt_cnt_eq_one <= 1'b0; + end + else if((~in_pkt_eop_arrive | drop_on_error) & out_pkt_leave) begin + pkt_cnt <= pkt_cnt - 1'b1; + if (pkt_cnt == 1) + pkt_cnt_eq_zero <= 1'b1; + else + pkt_cnt_eq_zero <= 1'b0; + if (pkt_cnt == 2) + pkt_cnt_eq_one <= 1'b1; + else + pkt_cnt_eq_one <= 1'b0; + end + + if (in_pkt_start) + pkt_has_started <= 1'b1; + else if (in_pkt_eop_arrive) + pkt_has_started <= 1'b0; + end + end + + // drop on error logic + always @(posedge clk or posedge reset) begin + if (reset) begin + sop_ptr <= 0; + error_in_pkt <= 0; + end + else begin + // save the location of the SOP + if ( in_pkt_start ) + sop_ptr <= wr_ptr; + + // remember if error in pkt + // log error only if packet has already started + if (in_pkt_eop_arrive) + error_in_pkt <= 1'b0; + else if ( in_pkt_error & (pkt_has_started | in_pkt_start)) + error_in_pkt <= 1'b1; + end + end + + assign drop_on_error = drop_on_error_en & (error_in_pkt | in_pkt_error) & in_pkt_eop_arrive & + ~sop_has_left_fifo & ~(out_pkt_sop_leave & pkt_cnt_eq_zero); + + assign curr_sop_ptr = (write && in_startofpacket && in_endofpacket) ? wr_ptr : sop_ptr; + + end + else begin : gen_blk20_else + assign ok_to_forward = 1'b1; + assign drop_on_error = 1'b0; + if (ADDR_WIDTH <= 1) + assign curr_sop_ptr = 1'b0; + else + assign curr_sop_ptr = {ADDR_WIDTH - 1 { 1'b0 }}; + end + endgenerate + + + // -------------------------------------------------- + // Calculates the log2ceil of the input value + // -------------------------------------------------- + function integer log2ceil; + input integer val; + reg[31:0] i; + + begin + i = 1; + log2ceil = 0; + + while (i < val) begin + log2ceil = log2ceil + 1; + i = i[30:0] << 1; + end + end + endfunction + +endmodule diff --git a/ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_controller_hpfir.vhd b/ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_controller_hpfir.vhd new file mode 100644 index 0000000..ce5b599 --- /dev/null +++ b/ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_controller_hpfir.vhd @@ -0,0 +1,88 @@ +-- (C) 2001-2019 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, Intel FPGA IP 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. + + +------------------------------------------------------------------------- +------------------------------------------------------------------------- +-- +-- $Revision: #1 $ +-- $Date: 2009/07/29 $ +-- Author : Boon Hong Oh +-- +-- Project : Avalon Streaming Wrapper for HP FIR +-- +-- Description : +-- +-- This file is the Interface controller for the Avalon Streaming Wrapper. +-- The control signals between sink, core, and source modules are communicated +-- via the controller. The stall output is used as the core enable signal in +-- the wrapper. +-- +-- ALTERA Confidential and Proprietary +-- Copyright 2006 (c) Altera Corporation +-- All rights reserved +-- +------------------------------------------------------------------------- +------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; + + +entity auk_dspip_avalon_streaming_controller_hpfir is + port( + clk : in std_logic; + --clk_en : in std_logic := '1'; + reset_n : in std_logic; + --ready : in std_logic; + sink_packet_error : in std_logic_vector (1 downto 0); + --sink_stall : in std_logic; + source_stall : in std_logic; + valid : in std_logic; + reset_design : out std_logic; + sink_ready_ctrl : out std_logic; + source_packet_error : out std_logic_vector (1 downto 0) := (others => '0'); + source_valid_ctrl : out std_logic; + stall : out std_logic + ); + +-- Declarations + +end auk_dspip_avalon_streaming_controller_hpfir; + +-- hds interface_end + +architecture struct of auk_dspip_avalon_streaming_controller_hpfir is + +-- signal stall_int : std_logic; +-- signal stall_reg : std_logic; + +-- attribute maxfan : integer; +-- attribute maxfan of stall_reg : signal is 500; + +begin + + reset_design <= not reset_n; + + --should not stop sending data to source module when the sink module is stalled + --should only stop sending when the source module is stalled + + --Disable the FIR core when backpressure + stall <= source_stall; + source_valid_ctrl <= valid; + + -- Sink FIFO and FIR core are disabled at the same time + sink_ready_ctrl <= not(source_stall); + + source_packet_error <= sink_packet_error; + +end struct; diff --git a/ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_sink_hpfir.vhd b/ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_sink_hpfir.vhd new file mode 100644 index 0000000..082bf84 --- /dev/null +++ b/ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_sink_hpfir.vhd @@ -0,0 +1,545 @@ +-- (C) 2001-2019 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, Intel FPGA IP 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. + + +------------------------------------------------------------------------- +------------------------------------------------------------------------- +-- +-- Revision Control Information +-- +-- $Revision: #1 $ +-- $Date: 2009/07/29 $ +-- Author : Boon Hong Oh +-- +-- Project : Atlantic II Sink Interface with ready_latency=0 +-- +-- Description : +-- +-- This interface is capable of handling single or multi channel streams as +-- well as blocks of data. The at_sink_sop and at_sink_eop must be fed as +-- described in the Atlantic II specification. The at_sink_error input is a 2- +-- bit signal that complies with the PFC error format (by Kent Orthner). The +-- error checking is extensively done, however the resulting information is +-- still mapped on the available 3 error states as shown below. +-- 00: no error +-- 01: missing sop +-- 10: missing eop +-- 11: unexpected eop +-- other types of errors also marked as 11. +-- +-- ALTERA Confidential and Proprietary +-- Copyright 2006 (c) Altera Corporation +-- All rights reserved +-- +------------------------------------------------------------------------- +------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +--use ieee.std_logic_arith.all; +use ieee.numeric_std.all; + +use work.auk_dspip_lib_pkg_hpfir.all; +use work.auk_dspip_math_pkg_hpfir.all; + +library altera_mf; +use altera_mf.altera_mf_components.all; + +entity auk_dspip_avalon_streaming_sink_hpfir is + + generic( + WIDTH_g : integer := 24; -- DATA_PORT_COUNT * DATA_WIDTH + DATA_WIDTH : integer := 8; + DATA_PORT_COUNT : integer := 3; + PACKET_SIZE_g : natural := 2 + --FIFO_DEPTH_g : natural := 8 --if PFC mode is selected, this generic + --is used for passing the poly_factor. + --MIN_DATA_COUNT_g : natural := 2; + --PFC_MODE_g : boolean := false; + --SOP_EOP_CALC_g : boolean := false; -- calculate sop and eop rather than + -- reading value from fifo + --FAMILY_g : string := "Stratix II"; + --MEM_TYPE_g : string := "Auto" + ); + port( + clk : in std_logic; + reset_n : in std_logic; + ----------------- DESIGN SIDE SIGNALS + data : out std_logic_vector(WIDTH_g-1 downto 0); + data_valid : out std_logic_vector(0 downto 0); + + sink_ready_ctrl : in std_logic; --the controller will tell + --the interface whether + --new input can be accepted. + --sink_stall : out std_logic; --needs to stall the design + --if no new data is coming + packet_error : out std_logic_vector (1 downto 0); --this is for SOP and EOP check only. + --when any of these doesn't behave as + --expected, the error is flagged. + --send_sop : out std_logic; -- transmit SOP signal to the design. + -- It only transmits the legal SOP. + --send_eop : out std_logic; -- transmit EOP signal to the design. + -- It only transmits the legal EOP. + ----------------- ATLANTIC SIDE SIGNALS + at_sink_ready : out std_logic; --it will be '1' whenever the + --sink_ready_ctrl signal is high. + at_sink_valid : in std_logic; + at_sink_data : in std_logic_vector(WIDTH_g-1 downto 0); + at_sink_sop : in std_logic := '0'; + at_sink_eop : in std_logic := '0'; + at_sink_error : in std_logic_vector(1 downto 0) := "00" --it indicates + --that there is an error in the packet. + + ); + +end auk_dspip_avalon_streaming_sink_hpfir; + +-- hds interface_end +architecture rtl of auk_dspip_avalon_streaming_sink_hpfir is + + type STATE_TYPE_t is (start, stall, run1, st_err, end1); -- stall,run_once,wait1, + type OUT_STATE_TYPE_t is (normal, empty_and_not_ready, empty_and_ready); + constant LOG2PACKET_SIZE_c : natural := log2_ceil_one(PACKET_SIZE_g); + + signal sink_state : STATE_TYPE_t; + signal sink_next_state : STATE_TYPE_t; + signal reset_count : std_logic; + signal count_enable : std_logic; + signal count : unsigned(LOG2PACKET_SIZE_c -1 downto 0); + signal count_finished : boolean; + signal at_sink_error_int : std_logic; + signal packet_error_int : std_logic_vector (1 downto 0); + signal packet_error_s : std_logic_vector(1 downto 0); + + signal at_sink_ready_s : std_logic; + --signal reset : std_logic; + signal max_reached : boolean; -- flag to show counter has reached max value + +-- component altera_avalon_sc_fifo is +-- generic( +-- SYMBOLS_PER_BEAT : integer := 1; +-- BITS_PER_SYMBOL : integer := 8; +-- FIFO_DEPTH : integer := 16; +-- CHANNEL_WIDTH : integer := 0; +-- ERROR_WIDTH : integer := 0; +-- USE_PACKETS : integer := 0 +-- ); +-- port ( +-- -- inputs: +-- signal clk : IN STD_LOGIC; +-- signal in_data : IN STD_LOGIC_VECTOR (DATA_WIDTH*DATA_PORT_COUNT-1 DOWNTO 0); +-- signal in_valid : IN STD_LOGIC; +-- signal in_startofpacket : IN STD_LOGIC; +-- signal in_endofpacket : IN STD_LOGIC; +-- signal out_ready : IN STD_LOGIC; +-- signal reset : IN STD_LOGIC; +-- +-- signal in_empty : IN STD_LOGIC_VECTOR (log2_ceil_one(DATA_PORT_COUNT)-1 DOWNTO 0); +-- signal in_error : IN STD_LOGIC_VECTOR (0 DOWNTO 0); +-- signal in_channel : IN STD_LOGIC_VECTOR (0 DOWNTO 0); +-- +-- signal csr_address : IN STD_LOGIC_VECTOR (1 DOWNTO 0); +-- signal csr_write : IN STD_LOGIC; +-- signal csr_read : IN STD_LOGIC; +-- signal csr_writedata : IN STD_LOGIC_VECTOR (31 DOWNTO 0); +-- +-- -- outputs: +-- signal in_ready : OUT STD_LOGIC; +-- signal out_data : OUT STD_LOGIC_VECTOR (DATA_WIDTH*DATA_PORT_COUNT-1 DOWNTO 0); +-- signal out_valid : OUT STD_LOGIC; +-- +-- signal out_empty : OUT STD_LOGIC_VECTOR (log2_ceil_one(DATA_PORT_COUNT)-1 DOWNTO 0); +-- signal out_error : OUT STD_LOGIC_VECTOR (0 DOWNTO 0); +-- signal out_channel : OUT STD_LOGIC_VECTOR (0 DOWNTO 0) +-- ); +-- end component altera_avalon_sc_fifo; +begin + + valid_generate_single : if PACKET_SIZE_g = 1 generate + signal packet_error0 : std_logic; + begin + at_sink_error_int <= at_sink_error(0) when at_sink_valid = '1' else + '0'; + + packet_error_int <= '0' & packet_error0; + + packet_error0 <= '0' when at_sink_error_int = '0' and sink_next_state /= st_err else + '1'; + + sink_comb_update_1 : process (sink_state, at_sink_valid, at_sink_error_int, at_sink_ready_s) + begin -- process sink_comb_update_1 + case sink_state is + when start => + --fifo_wrreq <= '0'; + if at_sink_error_int = '1' then + sink_next_state <= st_err; + else + if at_sink_ready_s = '0' and at_sink_valid = '0' then + sink_next_state <= start; + elsif at_sink_ready_s = '0' and at_sink_valid = '1' then + sink_next_state <= start; + elsif at_sink_ready_s = '1' and at_sink_valid = '0' then + sink_next_state <= stall; + elsif at_sink_ready_s = '1' and at_sink_valid = '1' then + sink_next_state <= run1; + else + sink_next_state <= st_err; + end if; + end if; + when stall => + --fifo_wrreq <= '0'; + if at_sink_error_int = '1' then + sink_next_state <= st_err; + else + if at_sink_ready_s = '0' and at_sink_valid = '0' then + sink_next_state <= start; + elsif at_sink_ready_s = '0' and at_sink_valid = '1' then + sink_next_state <= start; + elsif at_sink_ready_s = '1' and at_sink_valid = '0' then + sink_next_state <= stall; + elsif at_sink_ready_s = '1' and at_sink_valid = '1' then + sink_next_state <= run1; + else + sink_next_state <= st_err; + end if; + end if; + + when run1 => + --fifo_wrreq <= '1'; + if at_sink_error_int = '1' then + sink_next_state <= st_err; + else + if at_sink_ready_s = '0' and at_sink_valid = '0' then + sink_next_state <= start; + elsif at_sink_ready_s = '0' and at_sink_valid = '1' then + sink_next_state <= start; + elsif at_sink_ready_s = '1' and at_sink_valid = '0' then + sink_next_state <= stall; + elsif at_sink_ready_s = '1' and at_sink_valid = '1' then + sink_next_state <= run1; + else + sink_next_state <= st_err; + end if; + end if; + + when st_err => + --fifo_wrreq <= '0'; + if at_sink_error_int = '1' then + sink_next_state <= st_err; + else + if at_sink_ready_s = '0' and at_sink_valid = '0' then + sink_next_state <= start; + elsif at_sink_ready_s = '0' and at_sink_valid = '1' then + sink_next_state <= start; + elsif at_sink_ready_s = '1' and at_sink_valid = '0' then + sink_next_state <= stall; + elsif at_sink_ready_s = '1' and at_sink_valid = '1' then + sink_next_state <= run1; + else + sink_next_state <= st_err; + end if; + end if; + + when others => + sink_next_state <= st_err; + --fifo_wrreq <= '0'; + end case; + end process sink_comb_update_1; + end generate valid_generate_single; + + + valid_generate_mult : if PACKET_SIZE_g > 1 generate + + at_sink_error_int <= at_sink_error(1) or at_sink_error(0) when at_sink_valid = '1' else + '0'; + + count_enable <= '1' when (sink_next_state = run1 or sink_next_state = end1) else -- + --or sink_next_state = run_once) else + '0'; + reset_count <= '1' when sink_next_state = st_err else + '0'; + + sink_comb_update_2 : process (sink_state, at_sink_ready_s, at_sink_valid, + at_sink_error, at_sink_error_int, at_sink_sop, + at_sink_eop, count, count_finished) + begin -- process sink_comb_update_2 + case sink_state is + when start => + --fifo_wrreq <= '0'; + + if at_sink_error_int = '1' then + sink_next_state <= st_err; + packet_error_int <= at_sink_error; + else + if at_sink_ready_s = '1' and at_sink_valid = '1' and at_sink_sop = '1' then + sink_next_state <= run1; + packet_error_int <= "00"; + elsif (at_sink_ready_s = '1' and at_sink_valid = '1' and at_sink_sop = '0') then + sink_next_state <= st_err; + packet_error_int <= "01"; + else + sink_next_state <= start; + packet_error_int <= "00"; + end if; + end if; + + when run1 => + --fifo_wrreq <= '1'; + + if at_sink_error_int = '1' then + sink_next_state <= st_err; + packet_error_int <= at_sink_error; + elsif at_sink_sop = '1' and at_sink_valid = '1' then + sink_next_state <= st_err; + packet_error_int <= "01"; + elsif (count_finished = false and at_sink_eop = '1' and at_sink_valid = '1') then + sink_next_state <= st_err; + packet_error_int <= "11"; + else + if at_sink_eop = '0' and count_finished = false and at_sink_valid = '1' and at_sink_ready_s = '1' then + sink_next_state <= run1; + packet_error_int <= "00"; + elsif at_sink_eop = '1' and count_finished = true and at_sink_valid = '1' and at_sink_ready_s = '1' then + sink_next_state <= end1; + packet_error_int <= "00"; + elsif (count_finished = true and at_sink_valid = '0' and at_sink_ready_s = '1') or + (at_sink_valid = '0' and at_sink_ready_s = '1') then + sink_next_state <= stall; + packet_error_int <= "00"; + elsif (count_finished = true and at_sink_ready_s = '0') or (at_sink_eop = '0' and at_sink_ready_s = '0') then + sink_next_state <= stall; --wait1; + packet_error_int <= "00"; + elsif (count_finished = true and at_sink_eop = '0' and at_sink_valid = '1' and at_sink_ready_s = '1') then + sink_next_state <= st_err; + packet_error_int <= "10"; + else + sink_next_state <= st_err; + packet_error_int <= "11"; + end if; + end if; + when stall => + --fifo_wrreq <= '0'; + + if at_sink_error_int = '1' then + sink_next_state <= st_err; + packet_error_int <= at_sink_error; + elsif at_sink_sop = '1' and at_sink_valid = '1' then + sink_next_state <= st_err; + packet_error_int <= "01"; + elsif (count_finished = false and at_sink_eop = '1' and at_sink_valid = '1') then + sink_next_state <= st_err; + packet_error_int <= "11"; + else + if at_sink_eop = '0' and count_finished = false and at_sink_valid = '1' and at_sink_ready_s = '1' then --and at_sink_ready_int = '1' then + sink_next_state <= run1; + packet_error_int <= "00"; + elsif at_sink_eop = '1' and count_finished = true and at_sink_valid = '1' and at_sink_ready_s = '1' then + sink_next_state <= end1; + packet_error_int <= "00"; + elsif (count_finished = true and at_sink_valid = '0') or -- and at_sink_ready_s = '1') or + (at_sink_valid = '0' and at_sink_ready_s = '1') then + sink_next_state <= stall; + packet_error_int <= "00"; + elsif (count_finished = true and at_sink_ready_s = '0') or (at_sink_eop = '0' and at_sink_ready_s = '0') then + sink_next_state <= stall; --wait1; + packet_error_int <= "00"; + elsif (count_finished = true and at_sink_eop = '0' and at_sink_valid = '1' and at_sink_ready_s = '1') then + sink_next_state <= st_err; + packet_error_int <= "10"; + else + sink_next_state <= st_err; + packet_error_int <= "11"; + end if; + end if; + + when end1 => + --fifo_wrreq <= '1'; + + if at_sink_error_int = '1' then + sink_next_state <= st_err; + packet_error_int <= at_sink_error; + else + if at_sink_ready_s = '1' and at_sink_valid = '1' and at_sink_sop = '1' then + sink_next_state <= run1; + packet_error_int <= "00"; + elsif (at_sink_valid = '1' and at_sink_sop = '0') then + sink_next_state <= st_err; + packet_error_int <= "01"; + else + sink_next_state <= start; + packet_error_int <= "00"; + end if; + end if; + when st_err => + --fifo_wrreq <= '0'; + if at_sink_error_int = '1' then + sink_next_state <= st_err; + packet_error_int <= at_sink_error; + else + if at_sink_ready_s = '1' and at_sink_valid = '1' and at_sink_sop = '1' then + sink_next_state <= run1; + packet_error_int <= "00"; + elsif (at_sink_ready_s = '1' and at_sink_valid = '1' and at_sink_sop = '0') then + sink_next_state <= st_err; + packet_error_int <= "01"; + else + sink_next_state <= start; + packet_error_int <= "00"; + end if; + end if; + when others => null; + end case; + end process sink_comb_update_2; + + + counter : process (clk, reset_n) + begin -- process counter + if reset_n = '0' then + count <= (others => '0'); + max_reached <= false; + elsif clk'event and clk = '1' then -- rising clock edge + if reset_count = '1' then + count <= (others => '0'); + else + if count_enable = '1' then + if count = PACKET_SIZE_g-2 then + max_reached <= true; + else + max_reached <= false; + end if; + + if max_reached = false then + count <= count + 1; + else + count <= (others => '0'); + end if; + end if; + end if; + end if; + end process counter; + + count_finished <= max_reached; + + end generate valid_generate_mult; + + sink_input_update : process (clk, reset_n) + begin -- process + if reset_n = '0' then + sink_state <= start; + elsif clk'event and clk = '1' then + sink_state <= sink_next_state; + end if; + end process sink_input_update; + +-- sink_output_update : process (clk, reset_n) +-- begin -- process +-- if reset_n = '0' then +-- sink_out_state <= normal; +-- elsif clk'event and clk = '1' then +-- sink_out_state <= sink_out_next_state; +-- end if; +-- end process sink_output_update; + + error_register : process (clk, reset_n) + begin -- process + if reset_n = '0' then + packet_error_s <= "00"; + elsif clk'event and clk = '1' then + packet_error_s <= packet_error_int; + end if; + end process; + + packet_error <= packet_error_s; + + ----------------------------------------------------------------------------- + -- This was included because the vho simulations of fifo produce 'X' in + -- reset whcih means that for the FFT, alll outputs go to X when sop = X + ----------------------------------------------------------------------------- + --gen_calc_sop: if SOP_EOP_CALC_g = true generate +-- +-- -- generate sop and eop separate +-- out_cnt_p : process (clk, reset) +-- begin -- process out_cnt_p +-- if reset = '1' then +-- fifo_rdreq_d <= '0'; +-- out_cnt <= 0; +-- elsif rising_edge(clk) then +-- fifo_rdreq_d <= fifo_rdreq; +-- if fifo_rdreq = '1' then +-- if out_cnt < PACKET_SIZE_g - 1 then +-- out_cnt <= out_cnt + 1; +-- else +-- out_cnt <= 0; +-- end if; +-- end if; +-- end if; +-- end process out_cnt_p; +-- +-- send_sop_eop_p : process (clk, reset) +-- begin -- process send_sop_eop_p +-- if reset = '1' then +-- send_sop_s <= '0'; +-- send_eop_s <= '0'; +-- elsif rising_edge(clk) then +-- if fifo_rdreq = '1' and sink_ready_ctrl = '1' then +-- send_sop_s <= '0'; +-- send_eop_s <= '0'; +-- if out_cnt = 0 then +-- send_sop_s <= '1'; +-- end if; +-- if out_cnt = PACKET_SIZE_g - 1 then +-- send_eop_s <= '1'; +-- end if; +-- end if; +-- end if; +-- end process send_sop_eop_p; +-- +-- end generate gen_calc_sop; + + + + --reset <= not reset_n; + at_sink_ready <= at_sink_ready_s; + at_sink_ready_s <= sink_ready_ctrl; + data <= at_sink_data; + data_valid(0) <= at_sink_valid; + +-- sink_scfifo : altera_avalon_sc_fifo +-- generic map ( +-- SYMBOLS_PER_BEAT => DATA_PORT_COUNT, +-- BITS_PER_SYMBOL => DATA_WIDTH, +-- FIFO_DEPTH => FIFO_DEPTH_g, +-- CHANNEL_WIDTH => 0, +-- ERROR_WIDTH => 0, +-- USE_PACKETS => 0) +-- port map ( +-- clk => clk, +-- reset => reset, +-- in_ready => at_sink_ready_s, +-- in_data => at_sink_data, +-- in_valid => at_sink_valid, +-- in_startofpacket => '0', +-- in_endofpacket => '0', +-- out_ready => sink_ready_ctrl, +-- out_data => data, +-- out_valid => data_valid(0), +-- in_empty => (others => '0'), +-- in_error => (others => '0'), +-- in_channel => (others => '0'), +-- csr_address => (others => '0'), +-- csr_write => '0', +-- csr_read => '0', +-- csr_writedata => (others => '0'), +-- out_empty => open, +-- out_error => open, +-- out_channel => open); + +end rtl; diff --git a/ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_source_hpfir.vhd b/ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_source_hpfir.vhd new file mode 100644 index 0000000..ce8fee4 --- /dev/null +++ b/ld3/dds_vhdl/fir/auk_dspip_avalon_streaming_source_hpfir.vhd @@ -0,0 +1,467 @@ +-- (C) 2001-2019 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, Intel FPGA IP 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. + + +------------------------------------------------------------------------- +------------------------------------------------------------------------- +-- +-- Revision Control Information +-- +-- $Revision: #1 $ +-- $Date: 2009/07/29 $ +-- Author : Boon Hong Oh +-- +-- Project : Avalon_streaming II Source Interface with ready_latency=0 +-- +-- Description : +-- +-- This interface is capable of handling single or multi channel streams as +-- well as blocks of data. The at_source_sop and at_source_eop are generated as +-- described in the Avalon_streaming II specification. The at_source_error output is a 2- +-- bit signal that complies with the PFC error format (by Kent Orthner). +-- +-- 00: no error +-- 01: missing sop +-- 10: missing eop +-- 11: unexpected eop +-- other types of errors also marked as 11. Any error signal is accompanied +-- by at_sink_eop flagged high. +-- +-- When packet_size is greater than one, this interface expects the main design +-- to supply the count of data starting from 1 to the packet_size. When it +-- receives the valid flag together with the data_count=1, it starts pumping +-- out data by flagging the at_source_sop and at_source_valid both high. +-- +-- When the data_count=packet_size, the at_source_eop is flagged high together +-- with at_source_valid. THERE IS NO ERROR CHECKING FOR THE data_count signal. +-- +-- If the receiver is not ready to accept any data, the interface flags the source_ +-- stall signal high to tell the design to stall. It is the designers +-- responsibility to use this signal properly. In some design, the stall signal +-- needs to stall all of the design so that no new data can be accepted (as in +-- FIR), in other cases (i.e. a FIFO built on a dual port RAM),the input can +-- still accept new data although it cannot send any output. +-- +-- ALTERA Confidential and Proprietary +-- Copyright 2006 (c) Altera Corporation +-- All rights reserved +-- +------------------------------------------------------------------------- +------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +--use ieee.std_logic_arith.all; +use ieee.numeric_std.all; + +library altera_mf; +use altera_mf.altera_mf_components.all; + +use work.auk_dspip_math_pkg_hpfir.all; + +entity auk_dspip_avalon_streaming_source_hpfir is + generic( + WIDTH_g : integer := 8; -- DATA_PORT_COUNT * DATA_WIDTH + DATA_WIDTH : integer := 8; + DATA_PORT_COUNT : integer := 1; + PACKET_SIZE_g : natural := 2; + FIFO_DEPTH_g : natural := 0; + HAVE_COUNTER_g : boolean := false; + COUNTER_LIMIT_g : natural := 4; + --MULTI_CHANNEL_g : boolean := true; + USE_PACKETS : integer := 1; + --FAMILY_g : string := "Stratix II"; + --MEM_TYPE_g : string := "Auto"; + ENABLE_BACKPRESSURE_g : boolean := true + ); + port( + clk : in std_logic; + reset_n : in std_logic; + ----------------- DESIGN SIDE SIGNALS + data_in : in std_logic_vector (WIDTH_g-1 downto 0); + data_count : in std_logic_vector (log2_ceil_one(PACKET_SIZE_g)-1 downto 0) := (others => '0'); + source_valid_ctrl : in std_logic; + source_stall : out std_logic; + packet_error : in std_logic_vector (1 downto 0); + ----------------- AVALON_STREAMING SIDE SIGNALS + at_source_ready : in std_logic; + at_source_valid : out std_logic; + at_source_data : out std_logic_vector (WIDTH_g-1 downto 0); + at_source_channel : out std_logic_vector (log2_ceil_one(PACKET_SIZE_g)-1 downto 0); + at_source_error : out std_logic_vector (1 downto 0); + at_source_sop : out std_logic; + at_source_eop : out std_logic + ); + +-- Declarations + +end auk_dspip_avalon_streaming_source_hpfir; + +-- hds interface_end +architecture rtl of auk_dspip_avalon_streaming_source_hpfir is + + --constant FIFO_HINT_c : string := "RAM_BLOCK_TYPE="& MEM_TYPE_g; + constant FIFO_DEPTH_c : natural := FIFO_DEPTH_g; + constant LOG2PACKET_SIZE_c : natural := log2_ceil_one(PACKET_SIZE_g); + constant MIN_DATA_COUNT_g : natural := 2; + type STATE_TYPE_t is (start, sop, run1, st_err, end1); --wait1, stall, + signal source_state : STATE_TYPE_t; + signal source_next_state : STATE_TYPE_t; + signal packet_error0 : std_logic; + signal at_source_error_int : std_logic_vector(1 downto 0); + signal at_source_sop_int : std_logic := '0'; + signal at_source_eop_int : std_logic := '0'; + signal count_finished : boolean := false; + signal count_started : boolean := false; + signal at_source_valid_s : std_logic; + + signal data_valid : std_logic; + signal data_out : std_logic_vector(WIDTH_g-1 downto 0); + signal fifo_count : std_logic_vector(DATA_PORT_COUNT*log2_ceil(FIFO_DEPTH_g)-1 downto 0); + signal fifo_empty : std_logic_vector(DATA_PORT_COUNT-1 downto 0); -- multichan, multiinout + signal fifo_alm_empty : std_logic_vector(DATA_PORT_COUNT-1 downto 0); + signal fifo_alm_full : std_logic_vector(DATA_PORT_COUNT-1 downto 0); + signal fifo_full : std_logic_vector(DATA_PORT_COUNT-1 downto 0); + signal clear_fifo : std_logic; + signal fifo_rdreq : std_logic; + signal fifo_rdreq_d : std_logic; + signal fifo_wrreq : std_logic; + signal fifo_empty_d : std_logic; + signal reset_design_int : std_logic; + signal channel_out : std_logic_vector(log2_ceil_one(PACKET_SIZE_g)-1 downto 0) := (others => '0'); + + signal fifo_sop_in : std_logic := '0'; + signal fifo_eop_in : std_logic := '0'; + signal fifo_error_in : std_logic_vector(1 downto 0); + signal at_source_sop_s : std_logic := '0'; + signal at_source_eop_s : std_logic := '0'; + signal at_source_error_s : std_logic_vector(1 downto 0); + signal in_ready : std_logic; + + component altera_avalon_sc_fifo is + generic( + SYMBOLS_PER_BEAT : integer := 1; + BITS_PER_SYMBOL : integer := 8; + FIFO_DEPTH : integer := 16; + CHANNEL_WIDTH : integer := 2; + ERROR_WIDTH : integer := 2; + --EMPTY_LATENCY : integer := 0; + USE_PACKETS : integer := 0 + ); + port ( + -- inputs: + signal clk : IN STD_LOGIC; + signal in_channel : IN STD_LOGIC_VECTOR (log2_ceil_one(PACKET_SIZE_g)-1 DOWNTO 0); + signal in_data : IN STD_LOGIC_VECTOR (DATA_WIDTH*DATA_PORT_COUNT-1 DOWNTO 0); + signal in_error : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + signal in_endofpacket : IN STD_LOGIC; + signal in_startofpacket : IN STD_LOGIC; + signal in_valid : IN STD_LOGIC; + signal out_ready : IN STD_LOGIC; + signal reset : IN STD_LOGIC; + + signal in_empty : IN STD_LOGIC_VECTOR (log2_ceil_one(DATA_PORT_COUNT)-1 DOWNTO 0); + + signal csr_address : IN STD_LOGIC_VECTOR (1 DOWNTO 0); + signal csr_write : IN STD_LOGIC; + signal csr_read : IN STD_LOGIC; + signal csr_writedata : IN STD_LOGIC_VECTOR (31 DOWNTO 0); + + -- outputs: + signal in_ready : OUT STD_LOGIC; + signal out_channel : OUT STD_LOGIC_VECTOR (log2_ceil_one(PACKET_SIZE_g)-1 DOWNTO 0); + signal out_data : OUT STD_LOGIC_VECTOR (DATA_WIDTH*DATA_PORT_COUNT-1 DOWNTO 0); + signal out_error : OUT STD_LOGIC_VECTOR (1 DOWNTO 0); + signal out_endofpacket : OUT STD_LOGIC; + signal out_startofpacket : OUT STD_LOGIC; + signal out_valid : OUT STD_LOGIC; + signal out_empty : OUT STD_LOGIC_VECTOR (log2_ceil_one(DATA_PORT_COUNT)-1 DOWNTO 0) + ); + end component altera_avalon_sc_fifo; + +begin + single_channel : if USE_PACKETS = 0 generate + at_source_sop_int <= '0'; + at_source_eop_int <= '0'; + packet_error0 <= packet_error(0); + at_source_error_int(1) <= '0'; + at_source_error_int(0) <= packet_error0; + end generate single_channel; + + packet_multi : if USE_PACKETS = 1 generate + packet_error0 <= packet_error(1) or packet_error(0); + + counter_no : if HAVE_COUNTER_g = false generate + signal data_counter : unsigned(LOG2PACKET_SIZE_c-1 downto 0); + begin + count_finished <= true when data_counter = to_unsigned(PACKET_SIZE_g-1, LOG2PACKET_SIZE_c) else + false; + data_counter <= unsigned(data_count); + + count_started <= true when data_counter = 0 else + false; + end generate counter_no; + + counter_yes : if HAVE_COUNTER_g = true generate + signal data_counter : unsigned(log2_ceil(COUNTER_LIMIT_g)-1 downto 0); + begin + count_finished <= true when data_counter = to_unsigned(COUNTER_LIMIT_g-1, log2_ceil(COUNTER_LIMIT_g)) else + false; + count_started <= true when data_counter = 0 else + false; + + packet_counter : process (clk, reset_n) + begin -- process packet_counter + if reset_n = '0' then + data_counter <= (others => '0'); + elsif rising_edge(clk) then + if source_state = start and source_next_state = sop then + data_counter <= --(others => '0'); -- + data_counter +1; + elsif data_valid = '1' and at_source_ready = '1' and (data_counter < COUNTER_LIMIT_g-1) then + data_counter <= data_counter +1; + elsif count_finished = true then + data_counter <= (others => '0'); + end if; + end if; + end process packet_counter; + end generate counter_yes; + + source_comb_update : process (--at_source_ready, + count_finished, count_started, + packet_error, packet_error0, source_state, + --at_source_valid_s + in_ready, + source_valid_ctrl) + + begin -- process source_comb_update + + case source_state is + when start => + if packet_error0 = '1' then + source_next_state <= st_err; + at_source_error_int <= packet_error; + at_source_sop_int <= '0'; + at_source_eop_int <= '1'; + else + at_source_eop_int <= '0'; + at_source_error_int <= "00"; + if source_valid_ctrl = '1' and count_started = true then --and at_source_ready='1' then + source_next_state <= sop; + at_source_sop_int <= '1'; + else + source_next_state <= start; + at_source_sop_int <= '0'; + end if; + end if; + + when sop => + if packet_error0 = '1' then + source_next_state <= st_err; + at_source_error_int <= packet_error; + at_source_sop_int <= '0'; + at_source_eop_int <= '1'; + else + at_source_error_int <= "00"; + at_source_eop_int <= '0'; + --if source_valid_ctrl = '1' and at_source_ready = '1' and count_finished = false then + if source_valid_ctrl = '1' and in_ready = '1' and count_finished = false then + if PACKET_SIZE_g > 2 then + source_next_state <= run1; + else + source_next_state <= end1; + end if; + at_source_sop_int <= '0'; + --elsif (at_source_ready = '1' and source_valid_ctrl = '1' and count_finished = true) or + elsif (in_ready = '1' and source_valid_ctrl = '1' and count_finished = true) or + (source_valid_ctrl = '0' and count_finished = true) then --valid_ctrl_int = '1' and + source_next_state <= end1; + at_source_error_int <= "00"; + at_source_eop_int <= '1'; + at_source_sop_int <= '0'; + else + source_next_state <= sop; + at_source_sop_int <= '1'; + end if; + end if; + + when run1 => + at_source_sop_int <= '0'; + + if packet_error0 = '1' then + source_next_state <= st_err; + at_source_error_int <= packet_error; + at_source_eop_int <= '1'; + else + --if (at_source_ready = '1' and source_valid_ctrl = '1' and count_finished = true) or + if (in_ready = '1' and source_valid_ctrl = '1' and count_finished = true) or + (source_valid_ctrl = '0' and count_finished = true) then --valid_ctrl_int = '1' and + source_next_state <= end1; + at_source_error_int <= "00"; + at_source_eop_int <= '1'; + else + source_next_state <= run1; + at_source_error_int <= "00"; + at_source_eop_int <= '0'; + end if; + end if; + + when end1 => + + if packet_error0 = '1' then + source_next_state <= st_err; + at_source_error_int <= packet_error; + at_source_sop_int <= '0'; + at_source_eop_int <= '1'; + else + at_source_error_int <= "00"; + --if source_valid_ctrl = '1' and count_started = true and at_source_ready = '1' then + if source_valid_ctrl = '1' and count_started = true and in_ready = '1' then + source_next_state <= sop; + at_source_sop_int <= '1'; + at_source_eop_int <= '0'; + --elsif source_valid_ctrl = '1' and at_source_ready = '1' then + elsif source_valid_ctrl = '1' and in_ready = '1' then + source_next_state <= start; + at_source_sop_int <= '0'; + at_source_eop_int <= '0'; + else + source_next_state <= end1; + at_source_sop_int <= '0'; + at_source_eop_int <= '1'; + end if; + end if; + + when st_err => + at_source_sop_int <= '0'; + at_source_eop_int <= '0'; + if packet_error0 = '1' then + source_next_state <= st_err; + at_source_error_int <= packet_error; + else + source_next_state <= start; + at_source_error_int <= "00"; + end if; + when others => + source_next_state <= st_err; + at_source_sop_int <= '0'; + at_source_eop_int <= '1'; + at_source_error_int <= "11"; + + end case; + end process source_comb_update; + + source_state_update : process (clk, reset_n) + begin -- process + if reset_n = '0' then + source_state <= start; + elsif clk'event and clk = '1' then + source_state <= source_next_state; + end if; + end process source_state_update; + end generate packet_multi; + + at_source_sop <= at_source_sop_s; + at_source_eop <= at_source_eop_s; + at_source_error <= at_source_error_s; + + channel_info_exists : if USE_PACKETS = 1 generate + at_source_channel <= channel_out; + end generate channel_info_exists; + + no_channel_info : if USE_PACKETS = 0 generate + at_source_channel <= (others => '0'); + end generate no_channel_info; + + at_source_data <= data_out; + at_source_valid <= data_valid; + + + backpressure_support: if ENABLE_BACKPRESSURE_g = true generate + reset_design_int <= not reset_n; + + --source_stall <= not(in_ready); + source_stall <= not(at_source_ready); + + fifo_sop_in <= '0' when USE_PACKETS = 0 else + at_source_sop_int; + + fifo_eop_in <= '0' when USE_PACKETS = 0 else + at_source_eop_int; + + fifo_error_in <= "00" when USE_PACKETS = 0 else + at_source_error_int; + + scfifo : altera_avalon_sc_fifo + generic map ( + SYMBOLS_PER_BEAT => DATA_PORT_COUNT, + BITS_PER_SYMBOL => DATA_WIDTH, + FIFO_DEPTH => FIFO_DEPTH_c, + CHANNEL_WIDTH => log2_ceil_one(PACKET_SIZE_g), + ERROR_WIDTH => 2, + --EMPTY_LATENCY => 1, + USE_PACKETS => USE_PACKETS) + port map ( + clk => clk, + reset => reset_design_int, + in_ready => in_ready, + --in_data => fifo_datain(((0*DATA_WIDTH)+DATA_WIDTH-1) downto (0*DATA_WIDTH)), + in_data => data_in, + in_valid => source_valid_ctrl, + in_error => fifo_error_in, + in_channel => data_count, + in_startofpacket => fifo_sop_in, + in_endofpacket => fifo_eop_in, + + in_empty => (others => '0'), + csr_address => (others => '0'), + csr_write => '0', + csr_read => '0', + csr_writedata => (others => '0'), + out_ready => at_source_ready, + --out_data => fifo_dataout(((0*DATA_WIDTH)+DATA_WIDTH-1) downto (0*DATA_WIDTH)), + out_data => data_out, + out_valid => data_valid, + out_error => at_source_error_s, + out_channel => channel_out, + out_startofpacket => at_source_sop_s, + out_endofpacket => at_source_eop_s, + out_empty => open); + +end generate backpressure_support; + + +backpressure_no_support: if ENABLE_BACKPRESSURE_g = false generate + in_ready <= '1'; + source_stall <= '0'; + + output_registers : process (clk, reset_n) + begin + if reset_n = '0' then + channel_out <= (others => '0'); + data_out <= (others => '0'); + data_valid <= '0'; + at_source_error_s <= "00"; + at_source_sop_s <= '0'; + at_source_eop_s <= '0'; + elsif rising_edge(clk) then + channel_out <= data_count; + data_out <= data_in; + data_valid <= source_valid_ctrl; + at_source_error_s <= at_source_error_int; + at_source_sop_s <= at_source_sop_int; + at_source_eop_s <= at_source_eop_int; + end if; + end process output_registers; +end generate backpressure_no_support; + +end rtl; + diff --git a/ld3/dds_vhdl/fir/auk_dspip_lib_pkg_hpfir.vhd b/ld3/dds_vhdl/fir/auk_dspip_lib_pkg_hpfir.vhd new file mode 100644 index 0000000..7b72436 --- /dev/null +++ b/ld3/dds_vhdl/fir/auk_dspip_lib_pkg_hpfir.vhd @@ -0,0 +1,583 @@ +-- (C) 2001-2019 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, Intel FPGA IP 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. + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +-- Alex, 02-10-07, this package declaration results in error at built time on a new machine +-- +use work.auk_dspip_math_pkg_hpfir.all; + +package auk_dspip_lib_pkg_hpfir is +--Component names: +--auk_dspip_atlantic_sink +--auk_dspip_atlantic_source +--auk_dspip_interface_controller +--auk_dspip_avalon_streaming_controller_hpfir +--auk_dspip_avalon_streaming_controller_pe_fir_91 +--auk_dspip_avalon_streaming_sink_hpfir +--auk_dspip_avalon_streaming_source_hpfir +--auk_dspip_delay_fir_91 +--auk_dspip_fastadd_fir_91 +--auk_dspip_fastaddsub_fir_91 +--auk_dspip_pipelined_adder_fir_91 +--auk_dspip_fast_accumulator_fir_91 +--auk_dspip_fifo_pfc_fir_91 +--auk_dspip_fpcompiler_alufp +--auk_dspip_fpcompiler_aslf +--auk_dspip_fpcompiler_asrf +--auk_dspip_fpcompiler_castftox +--auk_dspip_fpcompiler_castxtof +--auk_dspip_fpcompiler_clzf +--auk_dspip_fpcompiler_mulfp +--auk_dspip_pfc_fir_91 +--auk_dspip_roundsat_fir_91 +component auk_dspip_atlantic_sink is + + generic( + WIDTH : integer := 16; + PACKET_SIZE : natural := 4; + log2packet_size : integer := 2 + ); + port( + clk : in std_logic; + reset_n : in std_logic; + ----------------- DESIGN SIDE SIGNALS + data_available : out std_logic; --goes high when new data is available + data : out std_logic_vector(WIDTH-1 downto 0); + sink_ready_ctrl : in std_logic; --the controller will tell + --the interface whether + --new input can be accepted. + sink_stall : out std_logic; --needs to stall the design + --if no new data is coming + packet_error : out std_logic_vector (1 downto 0); --this is for SOP and EOP check only. + --when any of these doesn't behave as + --expected, the error is flagged. + send_sop : out std_logic; -- transmit SOP signal to the design. + -- It only transmits the legal SOP. + send_eop : out std_logic; -- transmit EOP signal to the design. + -- It only transmits the legal EOP. + ----------------- ATLANTIC SIDE SIGNALS + at_sink_ready : out std_logic; --it will be '1' whenever the + --sink_ready_ctrl signal is high. + at_sink_valid : in std_logic; + at_sink_data : in std_logic_vector(WIDTH-1 downto 0); + at_sink_sop : in std_logic := '0'; + at_sink_eop : in std_logic := '0'; + at_sink_error : in std_logic_vector(1 downto 0) --it indicates to the data source + --that the SOP and EOP signals + --are not received as expected. + + ); + +end component auk_dspip_atlantic_sink; + +component auk_dspip_atlantic_source is + generic( + WIDTH : integer := 16; + packet_size : natural := 4; + LOG2packet_size : integer := 2; + multi_channel : BOOLEAN := TRUE + ); + port( + clk : in std_logic; + reset_n : in std_logic; + ----------------- DESIGN SIDE SIGNALS + data : in std_logic_vector (WIDTH-1 downto 0); + data_count : in std_logic_vector (LOG2packet_size-1 downto 0) := (others => '0'); + source_valid_ctrl : in std_logic; --the controller will tell + --the interface whether + --new input can be accepted. + source_stall : out std_logic; --needs to stall the design + --if no new data is coming + packet_error : in std_logic_vector (1 downto 0); + ----------------- ATLANTIC SIDE SIGNALS + at_source_ready : in std_logic; + at_source_valid : out std_logic; + at_source_data : out std_logic_vector (WIDTH-1 downto 0); + at_source_channel : out std_logic_vector (log2packet_size-1 downto 0); + at_source_error : out std_logic_vector (1 downto 0); + at_source_sop : out std_logic; + at_source_eop : out std_logic + ); + +-- Declarations + +end component auk_dspip_atlantic_source; + + +component auk_dspip_interface_controller IS + PORT( + clk : in std_logic; + reset : IN std_logic; + ready : in std_logic; + sink_packet_error : IN std_logic_vector (1 DOWNTO 0); + sink_stall : IN std_logic; + source_stall : IN std_logic; + valid : IN std_logic; + reset_design : OUT std_logic; + reset_n : OUT std_logic; + sink_ready_ctrl : OUT std_logic; + source_packet_error : OUT std_logic_vector (1 DOWNTO 0); + source_valid_ctrl : OUT std_logic; + stall : OUT std_logic + ); + +-- Declarations + +end component auk_dspip_interface_controller ; + + +component auk_dspip_avalon_streaming_controller_hpfir is + port( + clk : in std_logic; + --clk_en : in std_logic := '1'; + reset_n : in std_logic; + --ready : in std_logic; + sink_packet_error : in std_logic_vector (1 downto 0); + --sink_stall : in std_logic; + source_stall : in std_logic; + valid : in std_logic; + reset_design : out std_logic; + sink_ready_ctrl : out std_logic; + source_packet_error : out std_logic_vector (1 downto 0); + source_valid_ctrl : out std_logic; + stall : out std_logic + ); + +-- Declarations + +end component auk_dspip_avalon_streaming_controller_hpfir; + +component auk_dspip_avalon_streaming_controller_pe_fir_91 is + generic ( + FIFO_WIDTH_g : natural := 8; + ENABLE_PIPELINE_DEPTH_g : natural := 0; -- this value should match the depth of the enable pipeline in the core + FAMILY_g : string := "Stratix II"; + MEM_TYPE_g : string := "Auto" + ); + port( + clk : in std_logic; + clk_en : in std_logic := '1'; + reset_n : in std_logic; + ready : in std_logic; + sink_packet_error : in std_logic_vector (1 downto 0); + sink_stall : in std_logic; + source_stall : in std_logic; + valid : in std_logic; + reset_design : out std_logic; + sink_ready_ctrl : out std_logic; + source_packet_error : out std_logic_vector (1 downto 0); + source_valid_ctrl : out std_logic; + stall : out std_logic; + data_in : in std_logic_vector(FIFO_WIDTH_g-1 downto 0); + data_out : out std_logic_vector(FIFO_WIDTH_g-1 downto 0); + design_stall : out std_logic + ); + +-- Declarations + +end component auk_dspip_avalon_streaming_controller_pe_fir_91; + +component auk_dspip_avalon_streaming_sink_hpfir is + + generic( + WIDTH_g : integer := 16; + DATA_WIDTH : integer := 8; + DATA_PORT_COUNT : integer := 3; + PACKET_SIZE_g : natural := 4 + --FIFO_DEPTH_g : natural := 5 --if PFC mode is selected, this generic + --is used for passing the poly_factor. + --MIN_DATA_COUNT_g : natural := 2; + --PFC_MODE_g : boolean := false; + --SOP_EOP_CALC_g : boolean := false; -- calculate sop and eop rather than + -- reading value from fifo + --FAMILY_g : string := "Stratix II"; + --MEM_TYPE_g : string := "Auto" + ); + port( + clk : in std_logic; + reset_n : in std_logic; + ----------------- DESIGN SIDE SIGNALS + data : out std_logic_vector(WIDTH_g-1 downto 0); + data_valid : out std_logic_vector(0 downto 0); + sink_ready_ctrl : in std_logic; --the controller will tell + --the interface whether + --new input can be accepted. + --sink_stall : out std_logic; --needs to stall the design + --if no new data is coming + packet_error : out std_logic_vector (1 downto 0); --this is for SOP and EOP check only. + --when any of these doesn't behave as + --expected, the error is flagged. + --send_sop : out std_logic; -- transmit SOP signal to the design. + -- It only transmits the legal SOP. + --send_eop : out std_logic; -- transmit EOP signal to the design. + -- It only transmits the legal EOP. + ----------------- ATLANTIC SIDE SIGNALS + at_sink_ready : out std_logic; --it will be '1' whenever the + --sink_ready_ctrl signal is high. + at_sink_valid : in std_logic; + at_sink_data : in std_logic_vector(WIDTH_g-1 downto 0); + at_sink_sop : in std_logic := '0'; + at_sink_eop : in std_logic := '0'; + at_sink_error : in std_logic_vector(1 downto 0) := "00" --it indicates + --that there is an error in the packet. + + ); + +end component auk_dspip_avalon_streaming_sink_hpfir; + +component auk_dspip_avalon_streaming_source_hpfir is + generic( + WIDTH_g : integer := 8; + DATA_WIDTH : integer := 8; + DATA_PORT_COUNT : integer := 1; + PACKET_SIZE_g : natural := 2; + FIFO_DEPTH_g : natural := 0; + HAVE_COUNTER_g : boolean := false; + COUNTER_LIMIT_g : natural := 4; + --MULTI_CHANNEL_g : boolean := true; + USE_PACKETS : integer := 1; + --FAMILY_g : string := "Stratix II"; + --MEM_TYPE_g : string := "Auto"; + ENABLE_BACKPRESSURE_g : boolean := true + ); + port( + clk : in std_logic; + reset_n : in std_logic; + ----------------- DESIGN SIDE SIGNALS + data_in : in std_logic_vector (WIDTH_g-1 downto 0); + data_count : in std_logic_vector (log2_ceil_one(PACKET_SIZE_g)-1 downto 0) := (others => '0'); + source_valid_ctrl : in std_logic; + source_stall : out std_logic; + packet_error : in std_logic_vector (1 downto 0); + ----------------- AVALON_STREAMING SIDE SIGNALS + at_source_ready : in std_logic; + at_source_valid : out std_logic; + at_source_data : out std_logic_vector (WIDTH_g-1 downto 0); + at_source_channel : out std_logic_vector (log2_ceil_one(PACKET_SIZE_g)-1 downto 0); + at_source_error : out std_logic_vector (1 downto 0); + at_source_sop : out std_logic; + at_source_eop : out std_logic + ); + +-- Declarations + +end component auk_dspip_avalon_streaming_source_hpfir; + +component auk_dspip_roundsat_hpfir is + generic ( + IN_WIDTH_g : natural := 8; -- i/p data width + REM_LSB_BIT_g : natural := 2; -- no. of lsb to be removed + REM_LSB_TYPE_g : string := "trunc"; -- trunc/round + REM_MSB_BIT_g : natural := 2; -- no. of msb to be removed + REM_MSB_TYPE_g : string := "trunc" -- trunc/sat + ); + port ( + clk : in std_logic; + reset_n : in std_logic; + enable : in std_logic; + datain : in std_logic_vector(IN_WIDTH_g-1 downto 0); + valid : out std_logic; + dataout : out std_logic_vector(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-1 downto 0) + ); +end component auk_dspip_roundsat_hpfir; + +component auk_dspip_delay_fir_91 is + generic ( + WIDTH_g : natural := 8; -- data width + DELAY_g : natural := 8; + -- number of clock cycles the input + -- will be delayed by + MEMORY_TYPE_g : string := "AUTO"; + -- possible values are "m4k", "m512", + -- "register", "mram", "auto", + -- "lutram", "M9K", "M144K". + -- Any other string will be interpreted + -- as "auto" + REGISTER_FIRST_g : natural := 1; + -- if "1", the first delay is guaranteed + -- to be in registers + REGISTER_LAST_g : natural := 1); -- if "1", the last delay is guaranteed + -- to be in registers + port ( + clk : in std_logic; + reset : in std_logic; + enable : in std_logic; -- global clock enable + datain : in std_logic_vector(WIDTH_g-1 downto 0); + dataout : out std_logic_vector(WIDTH_g-1 downto 0) + ); +end component auk_dspip_delay_fir_91; + + +component auk_dspip_fastadd_fir_91 is + generic ( + INWIDTH_g : natural := 18; + LABWIDTH_g : natural := 16); + -- width of lab in selected device ( 10 or 16 in Cyclone, + -- Cylone II, Stratix and Stratix II. Don't know + -- Stratix III yet. + port ( + datain1 : in std_logic_vector(INWIDTH_g-1 downto 0); + datain2 : in std_logic_vector(INWIDTH_g-1 downto 0); + clk : in std_logic; + enable : in std_logic; + reset : in std_logic; + dataout : out std_logic_vector(INWIDTH_g downto 0)); +end component auk_dspip_fastadd_fir_91; + + +component auk_dspip_fastaddsub_fir_91 is + generic ( + INWIDTH_g : natural := 18; + LABWIDTH_g : natural := 16); + -- width of lab in selected device ( 10 or 16 in Cyclone, + -- Cylone II, Stratix and Stratix II. Don't know + -- Stratix III yet. + port ( + datain1 : in std_logic_vector(INWIDTH_g-1 downto 0); + datain2 : in std_logic_vector(INWIDTH_g-1 downto 0); + add_nsub : in std_logic; + clk : in std_logic; + enable : in std_logic; + reset : in std_logic; + dataout : out std_logic_vector(INWIDTH_g downto 0)); +end component auk_dspip_fastaddsub_fir_91; + + +component auk_dspip_pipelined_adder_fir_91 is + generic ( + INWIDTH_g : natural := 42; + -- width of lab in selected device ( 10 or 16 in Cyclone, + -- Cylone II, Stratix and Stratix II. + -- Alex : should I use 19 bits for Stratix III? + -- The rational being 10 ALM (2 bits x ALM + the carry chain inside the same LAB for efficiency. + LABWIDTH_g : natural := 38); + port ( + datain1 : in std_logic_vector(INWIDTH_g-1 downto 0); + datain2 : in std_logic_vector(INWIDTH_g-1 downto 0); + clk : in std_logic; + enable : in std_logic; + reset : in std_logic; + dataout : out std_logic_vector(INWIDTH_g downto 0)); +end component auk_dspip_pipelined_adder_fir_91; + + +component auk_dspip_fast_accumulator_fir_91 is + generic ( + DATA_WIDTH_g : natural := 42; + -- width of lab in selected device ( 10 or 16 in Cyclone, + -- Cylone II, Stratix and Stratix II. + -- for Stratix III is 20 so labwidth should be set to 18. + -- The rational being 10 ALM (2 bits x ALM + the carry chain inside the same LAB for efficiency. + LABWIDTH_g : natural := 38; + NUM_OF_CHANNELS_g : natural := 1; + ACCUM_OUT_WIDTH_g : natural := 48; + ACCUM_MEM_TYPE_g : string := "auto"); + port ( + reset : in std_logic; + clk : in std_logic; + enb : in std_logic; + add_to_zero : in std_logic; + datai : in std_logic_vector(DATA_WIDTH_g-1 downto 0); + datao : out std_logic_vector(ACCUM_OUT_WIDTH_g-1 downto 0)); +end component auk_dspip_fast_accumulator_fir_91; + + +component auk_dspip_fifo_pfc_fir_91 is + generic ( + NUM_CHANNELS_g : integer := 5; + POLY_FACTOR_g : integer := 3; + DATA_WIDTH_g : integer := 16; + ALMOST_FULL_VALUE_g : integer := 2; + RAM_TYPE_g : string := "AUTO"; + CALCULATE_USED_WORDS_ONCE : boolean := true + ); + port ( + + datai : in std_logic_vector(DATA_WIDTH_g-1 downto 0); + datao : out std_logic_vector(DATA_WIDTH_g-1 downto 0); + channel_out : out std_logic_vector(log2_ceil(NUM_CHANNELS_g)-1 downto 0); + used_w : out std_logic_vector(log2_ceil(POLY_FACTOR_g * NUM_CHANNELS_g)+1 downto 0); + + wrreq : in std_logic; + rdreq : in std_logic; + almost_full : out std_logic; + empty : out std_logic; + sclr : in std_logic; + clk : in std_logic; + reset : in std_logic; + enable : in std_logic + ); +end component auk_dspip_fifo_pfc_fir_91; +component auk_dspip_fpcompiler_alufp is + port ( + sysclk : in std_logic; + reset : in std_logic; + enable : in std_logic; + addsub : in std_logic; + aa : in std_logic_vector (42 downto 1); + aasat, aazip : in std_logic; + bb : in std_logic_vector (42 downto 1); + bbsat, bbzip : in std_logic; + cc : out std_logic_vector (42 downto 1); + ccsat, cczip : out std_logic + ); +end component auk_dspip_fpcompiler_alufp; +component auk_dspip_fpcompiler_aslf is + port ( + inbus : in std_logic_vector (32 downto 1); + shift : in std_logic_vector (5 downto 1); + + outbus : out std_logic_vector (32 downto 1) + ); +end component auk_dspip_fpcompiler_aslf; +component auk_dspip_fpcompiler_asrf is + port ( + inbus : in std_logic_vector (32 downto 1); + shift : in std_logic_vector (5 downto 1); + + outbus : out std_logic_vector (32 downto 1) + ); +end component auk_dspip_fpcompiler_asrf; + +component auk_dspip_fpcompiler_castftox is + port ( + aa : in std_logic_vector (32 downto 1); + cc : out std_logic_vector (42 downto 1); + ccsat, cczip : out std_logic + ); +end component auk_dspip_fpcompiler_castftox; + +component auk_dspip_fpcompiler_castxtof is + port ( + sysclk : in std_logic; + reset : in std_logic; + enable : in std_logic; + aa : in std_logic_vector (42 downto 1); + aasat, aazip : in std_logic; + cc : out std_logic_vector (32 downto 1) + ); +end component auk_dspip_fpcompiler_castxtof; + +component auk_dspip_fpcompiler_clzf is + port ( + frac : in std_logic_vector (32 downto 1); + count : out std_logic_vector (5 downto 1) + ); +end component auk_dspip_fpcompiler_clzf; +component auk_dspip_fpcompiler_mulfp is + port ( + sysclk : in std_logic; + reset : in std_logic; + enable : in std_logic; + aa : in std_logic_vector (42 downto 1); + aasat, aazip : in std_logic; + bb : in std_logic_vector (42 downto 1); + bbsat, bbzip : in std_logic; + cc : out std_logic_vector (42 downto 1); + ccsat, cczip : out std_logic + ); +end component auk_dspip_fpcompiler_mulfp; + +component auk_dspip_pfc_fir_91 is + generic ( + NUM_CHANNELS_g : integer := 5; + POLY_FACTOR_g : integer := 3; + DATA_WIDTH_g : integer := 16; + RAM_TYPE_g : string := "AUTO" + ); + port ( + + datai : in std_logic_vector(DATA_WIDTH_g-1 downto 0); + datao : out std_logic_vector(DATA_WIDTH_g-1 downto 0); + channel_out : out std_logic_vector(log2_ceil(NUM_CHANNELS_g)-1 downto 0); + + in_valid : in std_logic; + out_valid : out std_logic; + clk : in std_logic; + reset : in std_logic; + enable : in std_logic + ); +end component auk_dspip_pfc_fir_91; + + +component auk_dspip_roundsat_fir_91 is + generic ( + IN_WIDTH_g : natural := 8; -- data width + OUT_WIDTH_g : natural := 8; -- data width + ROUNDING_TYPE_g : string := "TRUNCATE_LOW" + ); + + port ( + clk : in std_logic; + reset : in std_logic; + enable : in std_logic; -- global clock enable + datain : in std_logic_vector(IN_WIDTH_g-1 downto 0); + dataout : out std_logic_vector(OUT_WIDTH_g-1 downto 0)); +end component auk_dspip_roundsat_fir_91; + +component auk_dspip_avalon_streaming_block_source_fir_91 is + generic ( + MAX_BLK_g : natural; + DATAWIDTH_g : natural); + port ( + clk : in std_logic; + reset : in std_logic; + in_blk : in std_logic_vector(log2_ceil(MAX_BLK_g) downto 0); + in_valid : in std_logic; + source_stall : out std_logic; + in_data : in std_logic_vector(DATAWIDTH_g - 1 downto 0); + source_valid : out std_logic; + source_ready : in std_logic; + source_sop : out std_logic; + source_eop : out std_logic; + source_data : out std_logic_vector(DATAWIDTH_g - 1 downto 0)); +end component auk_dspip_avalon_streaming_block_source_fir_91; + +component auk_dspip_avalon_streaming_block_sink_fir_91 is + generic ( + MAX_BLK_g : natural; + STALL_g : natural; + DATAWIDTH_g : natural; + -- this generic is specific for the FFT. + NUM_STAGES_g : natural); + port ( + clk : in std_logic; + reset : in std_logic; + in_blk : in std_logic_vector(log2_ceil(MAX_BLK_g) downto 0); + in_sop : in std_logic; + in_eop : in std_logic; + in_inverse : in std_logic; + sink_valid : in std_logic; + sink_ready : out std_logic; + source_stall : in std_logic; + in_data : in std_logic_vector(DATAWIDTH_g - 1 downto 0); + processing : in std_logic; + in_error : in std_logic_vector(1 downto 0); + out_error : out std_logic_vector(1 downto 0); + out_valid : out std_logic; + out_sop : out std_logic; + out_eop : out std_logic; + out_data : out std_logic_vector(DATAWIDTH_g - 1 downto 0); + curr_blk : out std_logic_vector(log2_ceil(MAX_BLK_g) downto 0); + -- these are specific to the FFT, no effort has been made to optimize! + curr_pwr_2 : out std_logic; + curr_inverse : out std_logic; + curr_input_sel : out std_logic_vector(NUM_STAGES_g - 1 downto 0)); +end component auk_dspip_avalon_streaming_block_sink_fir_91; + + + +end package auk_dspip_lib_pkg_hpfir; diff --git a/ld3/dds_vhdl/fir/auk_dspip_math_pkg_hpfir.vhd b/ld3/dds_vhdl/fir/auk_dspip_math_pkg_hpfir.vhd new file mode 100644 index 0000000..90a0e97 --- /dev/null +++ b/ld3/dds_vhdl/fir/auk_dspip_math_pkg_hpfir.vhd @@ -0,0 +1,370 @@ +-- (C) 2001-2019 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, Intel FPGA IP 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. + + +-- (C) 2001-2009 Altera Corporation. All rights reserved. +-- Your use of Altera Corporation's design tools, logic functions and other +-- software and tools, and its AMPP partner logic functions, and any output +-- files 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 Altera Program License Subscription +-- Agreement, Altera 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 Altera and sold by +-- Altera or its authorized distributors. Please refer to the applicable +-- agreement for further details. + + +------------------------------------------------------------------------- +------------------------------------------------------------------------- +-- +-- Revision Control Information +-- +-- $Revision: #1 $ +-- $Date: 2009/07/29 $ +-- Check in by : $Author: max $ +-- Author : DSP_IP +-- +-- Project : +-- +-- Description : +-- +-- Common functions for DSP_IP cores. +-- +-- +-- ALTERA Confidential and Proprietary +-- Copyright 2006 (c) Altera Corporation +-- All rights reserved +-- +------------------------------------------------------------------------- +------------------------------------------------------------------------- + +LIBRARY ieee; +USE ieee.std_logic_1164.all; +use ieee.numeric_std.all; +PACKAGE auk_dspip_math_pkg_hpfir IS + + + ----------------------------------------------------------------------------- + -- NOTE that these log functions are not intended to synthesize directly + -- into hardware, rather they are used to generate constants for + -- synthesized hardware. + ----------------------------------------------------------------------------- + --------------------------------------------------------------------------- + -- LOG2_CEIL Function. + -- Effectively performs log2() followed by ceil() + -- e.g. CEIL_LOG2(255) returns 8 + -- CEIL_LOG2(256) returns 8 + -- CEIL_LOG2(257) returns 9 + --------------------------------------------------------------------------- + function log2_ceil(arg : in integer) return integer; + function log2_ceil_one(arg : in integer) return integer; -- log2_ceil(1)=0 + --------------------------------------------------------------------------- + -- LOG2_FLOOR Function. + -- Effectively performs log2() followed by floor() + -- e.g. CEIL_LOG2(255) returns 7 + -- CEIL_LOG2(256) returns 8 + -- CEIL_LOG2(257) returns 8 + --------------------------------------------------------------------------- + function log2_floor(arg : in integer) return integer; + + ----------------------------------------------------------------------------- + -- SIGN functions + ----------------------------------------------------------------------------- + -- returns the sign bit of a vector + function sign (arg : in signed) return std_logic; + + -- sign extends ARG to size SIZE. + function sign_extend (arg : signed; size : positive) return signed; + + -- sign extend one bit + function xt1 (arg : signed) return signed; + + --------------------------------------------------------------------------- + -- Arithmetic FUNCTIONs. + --------------------------------------------------------------------------- + -- Check integer for odd-ness + function is_odd(arg : integer) return boolean; + + ----------------------------------------------------------------------------- + -- Logical functions + ----------------------------------------------------------------------------- + -- Result of and'ing all of the bits of the vector. + function and_reduce(arg : std_logic_vector) return std_logic; + function and_reduce(arg : unsigned) return std_logic; + + -- Result of or'ing all of the bits of the vector. + function or_reduce(arg : std_logic_vector) return std_logic; + function or_reduce(arg : unsigned) return std_logic; + + -- returns index+1 of the highest asserted bit. + function highest_one(arg : unsigned) return natural; + + -- returns index+1 of the lowest asserted bit. + function lowest_one(arg : unsigned) return natural; + + -- returns the count of number of ones. + function count_ones(arg : unsigned) return natural; + + -- Bit reverse + function bit_reverse(arg : unsigned) return unsigned; + + -- Invert the argument bitwise + function invert(arg : unsigned) return unsigned; + + --Halve towards up + function halve_ceil(arg:natural) return natural; + + function div_ceil(a:natural;b:natural) return natural; + +END PACKAGE auk_dspip_math_pkg_hpfir; + +package body auk_dspip_math_pkg_hpfir is + --------------------------------------------------------------------------- + -- LOG2_CEIL Function. + --------------------------------------------------------------------------- + function log2_ceil(arg : in integer) return integer is + variable res : integer; + begin + res := 0; + for i in 0 to 30 loop + if (arg > (2**i)) then + res := i+1; + end if; + end loop; -- i + return res; + end log2_ceil; + --------------------------------------------------------------------------- + -- LOG2_CEIL_ONE Function. + --------------------------------------------------------------------------- + function log2_ceil_one(arg : in integer) return integer is + variable res : integer; + begin + res := 0; + for i in 0 to 30 loop + if (arg > (2**i)) then + res := i+1; + end if; + end loop; -- i + if res = 0 then + res := 1; + end if; + return res; + end log2_ceil_one; + + --------------------------------------------------------------------------- + -- LOG2_FLOOR Function. + ----------------------------------------------------------------------------- + function log2_floor(arg : in integer) return integer is + variable res : integer; + begin + res := 0; + for i in 0 to 30 loop + if (arg >= (2**i)) then + res := i; + end if; + end loop; -- i + return res; + end log2_floor; + + ----------------------------------------------------------------------------- + -- SIGN Function + ----------------------------------------------------------------------------- + function sign (arg : in signed) return std_logic is + variable res : std_logic; + begin + res := arg(arg'left); + return(res); + end sign; + + ----------------------------------------------------------------------------- + -- SIGN_EXTEND Function + ----------------------------------------------------------------------------- + function sign_extend (arg : signed; size : positive) return signed is + variable res : signed(size-1 downto 0); + begin + if arg'length > size then + assert arg'length < size report "WARNING, can't sign extend" severity warning; + end if; + for i in arg'length to size-1 loop + res(i) := arg(arg'left); + end loop; -- i + res(arg'length-1 downto 0) := arg; + return(res); + end sign_extend; + + ----------------------------------------------------------------------------- + -- XT1 Function + ----------------------------------------------------------------------------- + function xt1 (arg : signed) return signed is + variable res : signed(arg'length downto 0); + begin + res := arg(arg'left) & arg; + return(res); + end xt1; + + ----------------------------------------------------------------------------- + -- IS_ODD Function + ----------------------------------------------------------------------------- + function is_odd(arg : integer) return boolean is + begin + return ((arg mod 2) = 1); + end is_odd; + + + ----------------------------------------------------------------------------- + -- AND_REDUCE Function + ----------------------------------------------------------------------------- + function and_reduce(arg : std_logic_vector) return std_logic is + variable res : std_logic; + begin + res := '1'; + for i in arg'range loop + res := res and arg(i); + end loop; + return res; + end; + + function and_reduce(arg : unsigned) return std_logic is + variable res : std_logic; + begin + res := '1'; + for i in arg'range loop + res := res and arg(i); + end loop; + return res; + end; + + + ----------------------------------------------------------------------------- + -- OR_REDUCE Function + ----------------------------------------------------------------------------- + function or_reduce(arg : unsigned) return std_logic is + variable res : std_logic; + begin + res := '0'; + for i in arg'range loop + res := res or arg(i); + end loop; + return res; + end; + + function or_reduce(arg : std_logic_vector) return std_logic is + variable res : std_logic; + begin + res := '0'; + for i in arg'range loop + res := res or arg(i); + end loop; + return res; + end; + + --------------------------------------------------------------------------- + -- HIGHEST_ONE Function. + --------------------------------------------------------------------------- + -- Returns index+1 of the highest asserted bit, or 0 if no bit set. + -- Vector is evaluated from left to right, not high to low! + function highest_one(arg : unsigned) return natural is + begin + for i in arg'range loop + if arg(i) = '1' then + return i+1; + end if; + end loop; + return 0; + end; + + ----------------------------------------------------------------------------- + -- LOWEST_ONE Function + ----------------------------------------------------------------------------- + -- Returns index+1 of the lowest asserted bit, or 0 if no bit set. + -- Vector is evaluated from left to right, not high to low! + function lowest_one(arg : unsigned) return natural is + begin + for i in 0 to arg'length-1 loop + if (arg(i) = '1') then + return(i+1); + end if; + end loop; + return(0); + end; + + ----------------------------------------------------------------------------- + -- COUNT_ONES + --------------------------------------------------------------------------- + -- Returns the count of the number of ones. + function count_ones(arg : unsigned) return natural is + variable count : integer; + begin + count := 0; + for i in 0 to arg'length-1 loop + if (arg(i) = '1') then + count := count + 1; + end if; + end loop; + return count; + end; + + ----------------------------------------------------------------------------- + -- BIT_REVERSE function + ----------------------------------------------------------------------------- + function bit_reverse(arg : unsigned) return unsigned is + variable res : unsigned(arg'range); + begin + for i in arg'range loop + res(i) := arg(arg'high - i); + end loop; + return(res); + end; + + ----------------------------------------------------------------------------- + -- INVERT Function + ----------------------------------------------------------------------------- + function invert(arg : unsigned) + return unsigned -- (word'high downto 0) + is + variable res : unsigned(arg'high downto 0); + begin + + for i in arg'range loop + res(i) := not arg(i); + end loop; + return (res); + end invert; + + ----------------------------------------------------------------------------- + -- HALVE_CEIL Function + ----------------------------------------------------------------------------- + function halve_ceil(arg : natural) return natural is + variable res : natural; + begin + if is_odd(arg) then + res := (arg+1)/2; + else + res := arg/2; + end if; + return (res); + end halve_ceil; + +------------------------------------------------------------------------------- +-- DIV_CEIL function +------------------------------------------------------------------------------- + function div_ceil(a : natural; b : natural) return natural is + variable res : natural := a/b; + begin + if res*b /= a then + res := res +1; + end if; + return res; + end div_ceil; + +end package body auk_dspip_math_pkg_hpfir; diff --git a/ld3/dds_vhdl/fir/auk_dspip_roundsat_hpfir.vhd b/ld3/dds_vhdl/fir/auk_dspip_roundsat_hpfir.vhd new file mode 100644 index 0000000..8957587 --- /dev/null +++ b/ld3/dds_vhdl/fir/auk_dspip_roundsat_hpfir.vhd @@ -0,0 +1,187 @@ +-- (C) 2001-2019 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, Intel FPGA IP 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. + + +------------------------------------------------------------------------- +------------------------------------------------------------------------- +-- +-- Revision Control Information +-- +-- $RCSfile: auk_dspip_roundsat_hpfir.vhd,v $ +-- +-- $Revision: #1 $ +-- $Date: 2010/08/19 $ +-- Check in by : $Author: max $ +-- +-- Description : +-- Implement output options for HP-FIR +-- +-- ALTERA Confidential and Proprietary +-- Copyright 2006 (c) Altera Corporation +-- All rights reserved +-- +------------------------------------------------------------------------- +------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + + +entity auk_dspip_roundsat_hpfir is + generic ( + IN_WIDTH_g : natural := 8; -- i/p data width + REM_LSB_BIT_g : natural := 2; -- no. of lsb to be removed + REM_LSB_TYPE_g : string := "trunc"; -- trunc/round + REM_MSB_BIT_g : natural := 2; -- no. of msb to be removed + REM_MSB_TYPE_g : string := "trunc" -- trunc/sat + ); + port ( + clk : in std_logic; + reset_n : in std_logic; + enable : in std_logic; + datain : in std_logic_vector(IN_WIDTH_g-1 downto 0); + valid : out std_logic; + dataout : out std_logic_vector(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-1 downto 0) + ); +end entity auk_dspip_roundsat_hpfir; + +architecture beh of auk_dspip_roundsat_hpfir is + + signal data_lsb : std_logic_vector(IN_WIDTH_g-REM_LSB_BIT_g-1 downto 0); + signal valid_lsb : std_logic; + + signal data_msb : std_logic_vector(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-1 downto 0); + + constant zero_vec : std_logic_vector := std_logic_vector(to_signed(0, REM_LSB_BIT_g)); + +begin -- architecture beh + + ----------------------------------------------------------------------------- + -- lsb : trunc/round-up (symmetric) + ----------------------------------------------------------------------------- + remove_lsb: if REM_LSB_BIT_g > 0 generate + begin + trunc_lsb: if REM_LSB_TYPE_g = "trunc" generate + begin + data_lsb <= datain(IN_WIDTH_g-1 downto REM_LSB_BIT_g); + valid_lsb <= enable; + end generate trunc_lsb; + rndup_lsb: if REM_LSB_TYPE_g = "round" generate + round_up_sym_p : process (clk, reset_n) + variable OR_accu : std_logic := '0'; + begin + if reset_n = '0' then + data_lsb <= (others => '0'); + valid_lsb <= '0'; + elsif rising_edge(clk) then + if enable = '1' then + OR_accu := '0'; + for i in 0 to REM_LSB_BIT_g-2 loop + OR_accu := OR_accu or datain(i); + end loop; + -- negative value + if (datain(IN_WIDTH_g-1) = '1') then + -- larger than -x.5 : rounded to -x + if (datain(REM_LSB_BIT_g-1)='1' and OR_accu='1') then + data_lsb <= std_logic_vector(signed(datain(IN_WIDTH_g-1 downto REM_LSB_BIT_g))+1); + -- less than or equal -x.5 : rounded to -x + 1 + else + data_lsb <= datain(IN_WIDTH_g-1 downto REM_LSB_BIT_g); + end if; + -- positive value + else + -- maximum positive value + if datain(IN_WIDTH_g-1 downto REM_LSB_BIT_g-1) = std_logic_vector(to_signed(2**(IN_WIDTH_g-REM_LSB_BIT_g)-1, IN_WIDTH_g-REM_LSB_BIT_g+1)) then + data_lsb <= std_logic_vector(to_signed( 2**(IN_WIDTH_g-REM_LSB_BIT_g-1)-1, IN_WIDTH_g-REM_LSB_BIT_g)); + -- larger than or equal x.5 : rounded to x + 1 + elsif datain(REM_LSB_BIT_g-1) = '1' then + data_lsb <= std_logic_vector(signed(datain(IN_WIDTH_g-1 downto REM_LSB_BIT_g))+1); + -- less than x.5 : rounded to x + else + data_lsb <= datain(IN_WIDTH_g-1 downto REM_LSB_BIT_g); + end if; + end if; + end if; + valid_lsb <= enable; + end if; + end process round_up_sym_p; + end generate rndup_lsb; + end generate remove_lsb; + + ----------------------------------------------------------------------------- + -- keep lsb + ----------------------------------------------------------------------------- + keep_lsb: if REM_LSB_BIT_g = 0 generate + begin + data_lsb <= datain; + valid_lsb <= enable; + end generate keep_lsb; + + ----------------------------------------------------------------------------- + -- msb : trunc/saturation + ----------------------------------------------------------------------------- + remove_msb: if REM_MSB_BIT_g > 0 generate + signal min_val, max_val : std_logic_vector(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-1 downto 0); + begin + trunc_msb: if REM_MSB_TYPE_g = "trunc" generate + begin + data_msb <= data_lsb(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-1 downto 0); + dataout <= data_msb; + valid <= valid_lsb; + end generate trunc_msb; + + sat_msb: if REM_MSB_TYPE_g = "sat" generate + max_val(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-1) <= '0'; + max_val(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-2 downto 0) <= (others => '1'); + min_val(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-1) <= '1'; + min_val(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-2 downto 0) <= (others => '0'); + data_msb <= std_logic_vector(max_val) when signed(data_lsb) > signed(max_val) else + std_logic_vector(min_val) when signed(data_lsb) < signed(min_val) else + data_lsb(IN_WIDTH_g-REM_LSB_BIT_g-REM_MSB_BIT_g-1 downto 0); + msb_p : process (clk, reset_n) + begin + if reset_n = '0' then + dataout <= (others => '0'); + valid <= '0'; + elsif rising_edge(clk) then + if valid_lsb = '1' then + dataout <= data_msb; + end if; + valid <= valid_lsb; + end if; + end process msb_p; + end generate sat_msb; + end generate remove_msb; + + ----------------------------------------------------------------------------- + -- keep msb + ----------------------------------------------------------------------------- + keep_msb: if REM_MSB_BIT_g = 0 generate + begin + data_msb <= data_lsb; + dataout <= data_msb; + valid <= valid_lsb; + end generate keep_msb; + + ----------------------------------------------------------------------------- + -- error checking: + -- Have we got a valid round mode? + -- Is the input greater than the output? + ----------------------------------------------------------------------------- + assert (REM_LSB_TYPE_g = "trunc" or + REM_LSB_TYPE_g = "round" or + REM_MSB_TYPE_g = "trunc" or + REM_MSB_TYPE_g = "sat" + ) report "Please check your round type and its spelling. Currently, we only support trunc, and round for LSB, trunc and sat for MSB" severity error; + + +end architecture beh; diff --git a/ld3/dds_vhdl/fir/dspba_library.vhd b/ld3/dds_vhdl/fir/dspba_library.vhd new file mode 100644 index 0000000..d34ad28 --- /dev/null +++ b/ld3/dds_vhdl/fir/dspba_library.vhd @@ -0,0 +1,377 @@ +-- Legal Notice: Copyright 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 any of the foregoing device programming or simulation files), and +-- any associated documentation or information are expressly subject to the +-- terms and conditions of the Intel FPGA Software License Agreement, +-- 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. + + +library IEEE; +use IEEE.std_logic_1164.all; +use work.dspba_library_package.all; + +entity dspba_delay is + generic ( + width : natural := 8; + depth : natural := 1; + reset_high : std_logic := '1'; + reset_kind : string := "ASYNC" + ); + port ( + clk : in std_logic; + aclr : in std_logic; + ena : in std_logic := '1'; + xin : in std_logic_vector(width-1 downto 0); + xout : out std_logic_vector(width-1 downto 0) + ); +end dspba_delay; + +architecture delay of dspba_delay is + type delay_array is array (depth downto 0) of std_logic_vector(width-1 downto 0); + signal delay_signals : delay_array; +begin + delay_signals(depth) <= xin; + + delay_block: if 0 < depth generate + begin + delay_loop: for i in depth-1 downto 0 generate + begin + async_reset: if reset_kind = "ASYNC" generate + process(clk, aclr) + begin + if aclr=reset_high then + delay_signals(i) <= (others => '0'); + elsif clk'event and clk='1' then + if ena='1' then + delay_signals(i) <= delay_signals(i + 1); + end if; + end if; + end process; + end generate; + + sync_reset: if reset_kind = "SYNC" generate + process(clk) + begin + if clk'event and clk='1' then + if aclr=reset_high then + delay_signals(i) <= (others => '0'); + elsif ena='1' then + delay_signals(i) <= delay_signals(i + 1); + end if; + end if; + end process; + end generate; + + no_reset: if reset_kind = "NONE" generate + process(clk) + begin + if clk'event and clk='1' then + if ena='1' then + delay_signals(i) <= delay_signals(i + 1); + end if; + end if; + end process; + end generate; + end generate; + end generate; + + xout <= delay_signals(0); +end delay; + +-------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.NUMERIC_STD.all; +use work.dspba_library_package.all; + +entity dspba_sync_reg is + generic ( + width1 : natural := 8; + init_value : std_logic_vector; + width2 : natural := 8; + depth : natural := 2; + pulse_multiplier : natural := 1; + counter_width : natural := 8; + reset1_high : std_logic := '1'; + reset2_high : std_logic := '1'; + reset_kind : string := "ASYNC" + ); + port ( + clk1 : in std_logic; + aclr1 : in std_logic; + ena : in std_logic_vector(0 downto 0); + xin : in std_logic_vector(width1-1 downto 0); + xout : out std_logic_vector(width1-1 downto 0); + clk2 : in std_logic; + aclr2 : in std_logic; + sxout : out std_logic_vector(width2-1 downto 0) + ); +end entity; + +architecture sync_reg of dspba_sync_reg is + type bit_array is array (depth-1 downto 0) of std_logic; + + signal iclk_enable : std_logic; + signal iclk_data : std_logic_vector(width1-1 downto 0); + signal oclk_data : std_logic_vector(width2-1 downto 0); + + -- For Synthesis this means: preserve this registers and do not merge any other flip-flops with synchronizer flip-flops + -- For TimeQuest this means: identify these flip-flops as synchronizer to enable automatic MTBF analysis + signal sync_regs : bit_array; + attribute altera_attribute : string; + attribute altera_attribute of sync_regs : signal is "-name ADV_NETLIST_OPT_ALLOWED NEVER_ALLOW; -name SYNCHRONIZER_IDENTIFICATION FORCED_IF_ASYNCHRONOUS; -name DONT_MERGE_REGISTER ON; -name PRESERVE_REGISTER ON"; + + signal oclk_enable : std_logic; + + constant init_value_internal : std_logic_vector(width1-1 downto 0) := init_value; + + signal counter : UNSIGNED(counter_width-1 downto 0); + signal ena_internal : std_logic; +begin + oclk_enable <= sync_regs(depth-1); + + no_multiplication: if pulse_multiplier=1 generate + ena_internal <= ena(0); + end generate; + + async_reset: if reset_kind="ASYNC" generate + + multiply_ena: if pulse_multiplier>1 generate + ena_internal <= '1' when counter>0 else ena(0); + process (clk1, aclr1) + begin + if aclr1=reset1_high then + counter <= (others => '0'); + elsif clk1'event and clk1='1' then + if counter>0 then + if counter=pulse_multiplier-1 then + counter <= (others => '0'); + else + counter <= counter + TO_UNSIGNED(1, counter_width); + end if; + else + if ena(0)='1' then + counter <= TO_UNSIGNED(1, counter_width); + end if; + end if; + end if; + end process; + end generate; + + process (clk1, aclr1) + begin + if aclr1=reset1_high then + iclk_enable <= '0'; + iclk_data <= init_value_internal; + elsif clk1'event and clk1='1' then + iclk_enable <= ena_internal; + if ena(0)='1' then + iclk_data <= xin; + end if; + end if; + end process; + + sync_reg_loop: for i in 0 to depth-1 generate + process (clk2, aclr2) + begin + if aclr2=reset2_high then + sync_regs(i) <= '0'; + elsif clk2'event and clk2='1' then + if i>0 then + sync_regs(i) <= sync_regs(i-1); + else + sync_regs(i) <= iclk_enable; + end if; + end if; + end process; + end generate; + + process (clk2, aclr2) + begin + if aclr2=reset2_high then + oclk_data <= init_value_internal(width2-1 downto 0); + elsif clk2'event and clk2='1' then + if oclk_enable='1' then + oclk_data <= iclk_data(width2-1 downto 0); + end if; + end if; + end process; + end generate; + + sync_reset: if reset_kind="SYNC" generate + + multiply_ena: if pulse_multiplier>1 generate + ena_internal <= '1' when counter>0 else ena(0); + process (clk1) + begin + if clk1'event and clk1='1' then + if aclr1=reset1_high then + counter <= (others => '0'); + else + if counter>0 then + if counter=pulse_multiplier-1 then + counter <= (others => '0'); + else + counter <= counter + TO_UNSIGNED(1, counter_width); + end if; + else + if ena(0)='1' then + counter <= TO_UNSIGNED(1, counter_width); + end if; + end if; + end if; + end if; + end process; + end generate; + + process (clk1) + begin + if clk1'event and clk1='1' then + if aclr1=reset1_high then + iclk_enable <= '0'; + iclk_data <= init_value_internal; + else + iclk_enable <= ena_internal; + if ena(0)='1' then + iclk_data <= xin; + end if; + end if; + end if; + end process; + + sync_reg_loop: for i in 0 to depth-1 generate + process (clk2) + begin + if clk2'event and clk2='1' then + if aclr2=reset2_high then + sync_regs(i) <= '0'; + else + if i>0 then + sync_regs(i) <= sync_regs(i-1); + else + sync_regs(i) <= iclk_enable; + end if; + end if; + end if; + end process; + end generate; + + process (clk2) + begin + if clk2'event and clk2='1' then + if aclr2=reset2_high then + oclk_data <= init_value_internal(width2-1 downto 0); + elsif oclk_enable='1' then + oclk_data <= iclk_data(width2-1 downto 0); + end if; + end if; + end process; + end generate; + + none_reset: if reset_kind="NONE" generate + + multiply_ena: if pulse_multiplier>1 generate + ena_internal <= '1' when counter>0 else ena(0); + process (clk1, aclr1) + begin + if clk1'event and clk1='1' then + if counter>0 then + if counter=pulse_multiplier-1 then + counter <= (others => '0'); + else + counter <= counter + TO_UNSIGNED(1, counter_width); + end if; + else + if ena(0)='1' then + counter <= TO_UNSIGNED(1, counter_width); + end if; + end if; + end if; + end process; + end generate; + + process (clk1) + begin + if clk1'event and clk1='1' then + iclk_enable <= ena_internal; + if ena(0)='1' then + iclk_data <= xin; + end if; + end if; + end process; + + sync_reg_loop: for i in 0 to depth-1 generate + process (clk2) + begin + if clk2'event and clk2='1' then + if i>0 then + sync_regs(i) <= sync_regs(i-1); + else + sync_regs(i) <= iclk_enable; + end if; + end if; + end process; + end generate; + + process (clk2) + begin + if clk2'event and clk2='1' then + if oclk_enable='1' then + oclk_data <= iclk_data(width2-1 downto 0); + end if; + end if; + end process; + end generate; + + xout <= iclk_data; + sxout <= oclk_data; + +end sync_reg; + +-------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +entity dspba_pipe is + generic( + num_bits : positive := 8; + num_stages : natural := 0; + init_value : std_logic := 'X' + ); + port( + clk: in std_logic; + d : in std_logic_vector(num_bits-1 downto 0); + q : out std_logic_vector(num_bits-1 downto 0) + ); +end entity dspba_pipe; + +architecture rtl of dspba_pipe is + attribute altera_attribute : string; + attribute altera_attribute of rtl : architecture is "-name AUTO_SHIFT_REGISTER_RECOGNITION off"; + + type stage_array_type is array(0 to num_stages) of std_logic_vector(num_bits-1 downto 0); + signal stage_array : stage_array_type := (others => (others => init_value)); +begin + stage_array(0) <= d; + + g_pipe : for i in 1 to num_stages generate + p_stage : process (clk) is + begin + if rising_edge(clk) then + stage_array(i) <= stage_array(i-1); + end if; + end process p_stage; + end generate g_pipe; + + q <= stage_array(num_stages); + +end rtl; + diff --git a/ld3/dds_vhdl/fir/dspba_library_package.vhd b/ld3/dds_vhdl/fir/dspba_library_package.vhd new file mode 100644 index 0000000..d609280 --- /dev/null +++ b/ld3/dds_vhdl/fir/dspba_library_package.vhd @@ -0,0 +1,72 @@ +-- Legal Notice: Copyright 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 any of the foregoing device programming or simulation files), and +-- any associated documentation or information are expressly subject to the +-- terms and conditions of the Intel FPGA Software License Agreement, +-- 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. + + +library IEEE; +use IEEE.std_logic_1164.all; + +package dspba_library_package is + + component dspba_delay is + generic ( + width : natural := 8; + depth : natural := 1; + reset_high : std_logic := '1'; + reset_kind : string := "ASYNC" + ); + port ( + clk : in std_logic; + aclr : in std_logic; + ena : in std_logic := '1'; + xin : in std_logic_vector(width-1 downto 0); + xout : out std_logic_vector(width-1 downto 0) + ); + end component; + + component dspba_sync_reg is + generic ( + width1 : natural := 8; + width2 : natural := 8; + depth : natural := 2; + init_value : std_logic_vector; + pulse_multiplier : natural := 1; + counter_width : natural := 8; + reset1_high : std_logic := '1'; + reset2_high : std_logic := '1'; + reset_kind : string := "ASYNC" + ); + port ( + clk1 : in std_logic; + aclr1 : in std_logic; + ena : in std_logic_vector(0 downto 0); + xin : in std_logic_vector(width1-1 downto 0); + xout : out std_logic_vector(width1-1 downto 0); + clk2 : in std_logic; + aclr2 : in std_logic; + sxout : out std_logic_vector(width2-1 downto 0) + ); + end component; + + component dspba_pipe is + generic( + num_bits : positive; + num_stages : natural; + init_value : std_logic := 'X' + ); + port( + clk: in std_logic; + d : in std_logic_vector(num_bits-1 downto 0); + q : out std_logic_vector(num_bits-1 downto 0) + ); + end component dspba_pipe; + +end dspba_library_package; diff --git a/ld3/dds_vhdl/fir/fir_0002.vhd b/ld3/dds_vhdl/fir/fir_0002.vhd new file mode 100644 index 0000000..6e9d868 --- /dev/null +++ b/ld3/dds_vhdl/fir/fir_0002.vhd @@ -0,0 +1,82 @@ +-- (C) 2001-2019 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, Intel FPGA IP 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. + + +library IEEE; +use IEEE.std_logic_1164.all; +use work.auk_dspip_lib_pkg_hpfir.all; +use work.auk_dspip_math_pkg_hpfir.all; + +entity fir_0002 is + port ( + clk : in STD_LOGIC; + reset_n : in STD_LOGIC; + ast_sink_data : in STD_LOGIC_VECTOR((0 + 1*16) * 1 + 0 - 1 downto 0); + ast_sink_valid : in STD_LOGIC; + ast_sink_error : in STD_LOGIC_VECTOR(1 downto 0); + ast_source_data : out STD_LOGIC_VECTOR(37 * 1*1 - 1 downto 0); + ast_source_valid : out STD_LOGIC; + ast_source_error : out STD_LOGIC_VECTOR(1 downto 0) + ); +end fir_0002; + + +architecture syn of fir_0002 is + component fir_0002_ast + port ( + clk : in STD_LOGIC; + reset_n : in STD_LOGIC; + ast_sink_data : in STD_LOGIC_VECTOR((0 + 1*16) * 1 + 0 - 1 downto 0); + ast_sink_valid : in STD_LOGIC; + ast_sink_ready : out STD_LOGIC; + ast_sink_sop : in STD_LOGIC; + ast_sink_eop : in STD_LOGIC; + ast_sink_error : in STD_LOGIC_VECTOR(1 downto 0); + ast_source_data : out STD_LOGIC_VECTOR(1*37 * 1 - 1 downto 0); + ast_source_ready : in STD_LOGIC; + ast_source_valid : out STD_LOGIC; + ast_source_sop : out STD_LOGIC; + ast_source_eop : out STD_LOGIC; + ast_source_channel : out STD_LOGIC_VECTOR(log2_ceil_one(1) - 1 downto 0); + ast_source_error : out STD_LOGIC_VECTOR(1 downto 0) + ); +end component; + + signal coeff_in_read_sig : std_logic; + +begin + + coeff_in_read_sig <= '1'; + + + + fir_0002_ast_inst : fir_0002_ast + port map ( + clk => clk, + reset_n => reset_n, + ast_sink_data => ast_sink_data, + ast_source_data => ast_source_data, + ast_sink_valid => ast_sink_valid, + ast_sink_ready => open, + ast_source_ready => '1', + ast_source_valid => ast_source_valid, + ast_sink_sop => '0', + ast_sink_eop => '0', + ast_sink_error => ast_sink_error, + ast_source_sop => open, + ast_source_eop => open, + ast_source_channel => open, + ast_source_error => ast_source_error + ); +end syn; + + diff --git a/ld3/dds_vhdl/fir/fir_0002_ast.vhd b/ld3/dds_vhdl/fir/fir_0002_ast.vhd new file mode 100644 index 0000000..5ea41c1 --- /dev/null +++ b/ld3/dds_vhdl/fir/fir_0002_ast.vhd @@ -0,0 +1,273 @@ + +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; + +use work.auk_dspip_lib_pkg_hpfir.all; +use work.auk_dspip_math_pkg_hpfir.all; + +entity fir_0002_ast is + generic ( + INWIDTH : integer := 16; + OUT_WIDTH_UNTRIMMED : integer := 37; + BANKINWIDTH : integer := 0; + REM_LSB_BIT_g : integer := 0; + REM_LSB_TYPE_g : string := "trunc"; + REM_MSB_BIT_g : integer := 0; + REM_MSB_TYPE_g : string := "trunc"; + PHYSCHANIN : integer := 1; + PHYSCHANOUT : integer := 1; + CHANSPERPHYIN : natural := 1; + CHANSPERPHYOUT : natural := 1; + OUTPUTFIFODEPTH : integer := 8; + USE_PACKETS : integer := 0; + MODE_WIDTH : integer := 0; + ENABLE_BACKPRESSURE : boolean := false; + LOG2_CHANSPERPHYOUT : natural := log2_ceil_one(1); + NUMCHANS : integer := 1; + DEVICE_FAMILY : string := "Cyclone V"; + COMPLEX_CONST : integer := 1 + ); + port( + clk : in std_logic; + reset_n : in std_logic; + ast_sink_ready : out std_logic; + ast_source_data : out std_logic_vector(COMPLEX_CONST*(OUT_WIDTH_UNTRIMMED - REM_LSB_BIT_g - REM_MSB_BIT_g) * PHYSCHANOUT - 1 downto 0); + ast_sink_data : in std_logic_vector( COMPLEX_CONST*(INWIDTH + BANKINWIDTH) * PHYSCHANIN + MODE_WIDTH - 1 downto 0); + ast_sink_valid : in std_logic; + ast_source_valid : out std_logic; + ast_source_ready : in std_logic; + ast_source_eop : out std_logic; + ast_source_sop : out std_logic; + ast_source_channel : out std_logic_vector (LOG2_CHANSPERPHYOUT - 1 downto 0); + ast_sink_eop : in std_logic; + ast_sink_sop : in std_logic; + ast_sink_error : in std_logic_vector (1 downto 0); + ast_source_error : out std_logic_vector (1 downto 0) + ); +attribute altera_attribute : string; +attribute altera_attribute of fir_0002_ast:entity is "-name MESSAGE_DISABLE 15400; -name MESSAGE_DISABLE 14130; -name MESSAGE_DISABLE 12020; -name MESSAGE_DISABLE 12030; -name MESSAGE_DISABLE 12010; -name MESSAGE_DISABLE 12110; -name MESSAGE_DISABLE 14320; -name MESSAGE_DISABLE 13410; -name MESSAGE_DISABLE 10036"; +end fir_0002_ast; + +-- Warnings Suppression On +-- altera message_off 10036 + +architecture struct of fir_0002_ast is + + constant OUTWIDTH : integer := OUT_WIDTH_UNTRIMMED - REM_LSB_BIT_g - REM_MSB_BIT_g; + + signal channel_out : std_logic_vector(LOG2_CHANSPERPHYOUT - 1 downto 0); + + signal core_channel_out : std_logic_vector(2 -1 downto 0); + signal at_source_channel : std_logic_vector(2 -1 downto 0); + signal sink_packet_error : std_logic_vector(1 downto 0); + signal data_in : std_logic_vector((COMPLEX_CONST*INWIDTH + BANKINWIDTH) * PHYSCHANIN + MODE_WIDTH - 1 downto 0); + signal data_valid : std_logic_vector(0 downto 0); + + signal data_out : std_logic_vector(COMPLEX_CONST*OUTWIDTH * PHYSCHANOUT -1 downto 0); + signal reset_fir : std_logic; + signal sink_ready_ctrl : std_logic; + signal source_packet_error : std_logic_vector(1 downto 0); + signal source_stall : std_logic; + signal source_valid_ctrl : std_logic; + signal stall : std_logic; + signal valid : std_logic; + signal core_valid : std_logic; + signal enable_in : std_logic_vector(0 downto 0); + + signal outp_out : std_logic_vector(COMPLEX_CONST*OUTWIDTH * PHYSCHANOUT - 1 downto 0); + signal outp_blk_valid : std_logic_vector(PHYSCHANOUT - 1 downto 0); + + signal core_out : std_logic_vector(OUT_WIDTH_UNTRIMMED * PHYSCHANOUT - 1 downto 0); + signal core_out_valid : std_logic_vector(0 downto 0); + signal core_out_channel : std_logic_vector(7 downto 0); + + signal core_out_channel_0 : std_logic_vector(7 downto 0); + + +begin + sink : auk_dspip_avalon_streaming_sink_hpfir + generic map ( + WIDTH_g => (COMPLEX_CONST*INWIDTH + BANKINWIDTH) * PHYSCHANIN + MODE_WIDTH, + DATA_WIDTH => (COMPLEX_CONST*INWIDTH + BANKINWIDTH) * PHYSCHANIN + MODE_WIDTH, + DATA_PORT_COUNT => 1, + PACKET_SIZE_g => CHANSPERPHYIN) + port map ( + clk => clk, + reset_n => reset_n, + data => data_in, + data_valid => data_valid, + sink_ready_ctrl => sink_ready_ctrl, + packet_error => sink_packet_error, + at_sink_ready => ast_sink_ready, + at_sink_valid => ast_sink_valid, + at_sink_data => ast_sink_data, + at_sink_sop => ast_sink_sop, + at_sink_eop => ast_sink_eop, + at_sink_error => ast_sink_error); + + source : auk_dspip_avalon_streaming_source_hpfir + generic map ( + WIDTH_g => COMPLEX_CONST*OUTWIDTH * PHYSCHANOUT, + DATA_WIDTH => COMPLEX_CONST*OUTWIDTH, + DATA_PORT_COUNT => PHYSCHANOUT, + FIFO_DEPTH_g => OUTPUTFIFODEPTH, + USE_PACKETS => USE_PACKETS, + HAVE_COUNTER_g => false, + PACKET_SIZE_g => CHANSPERPHYOUT, + COUNTER_LIMIT_g => CHANSPERPHYOUT, + ENABLE_BACKPRESSURE_g => ENABLE_BACKPRESSURE) + port map ( + clk => clk, + reset_n => reset_n, + data_in => data_out, + data_count => channel_out, + source_valid_ctrl => source_valid_ctrl, + source_stall => source_stall, + packet_error => source_packet_error, + at_source_ready => ast_source_ready, + at_source_valid => ast_source_valid, + at_source_data => ast_source_data, + at_source_channel => ast_source_channel, + at_source_sop => ast_source_sop, + at_source_eop => ast_source_eop, + at_source_error => ast_source_error); + + + intf_ctrl : auk_dspip_avalon_streaming_controller_hpfir + port map ( + clk => clk, + reset_n => reset_n, + sink_packet_error => sink_packet_error, + source_stall => source_stall, + valid => valid, + reset_design => reset_fir, + sink_ready_ctrl => sink_ready_ctrl, + source_packet_error => source_packet_error, + source_valid_ctrl => source_valid_ctrl, + stall => stall); + + + + multi_data_out: for m in PHYSCHANOUT-1 downto 0 generate + data_out(((m*OUTWIDTH)+OUTWIDTH-1) downto (m*OUTWIDTH)) <= outp_out(((m*OUTWIDTH)+OUTWIDTH-1) downto (m*OUTWIDTH)); + end generate multi_data_out; + + channel_pipe_lsb: if REM_LSB_TYPE_g = "round" and REM_LSB_BIT_g > 0 generate + begin + out_lsb_p : process (clk, reset_n) + begin + if reset_n = '0' then + core_out_channel_0 <= (others => '0'); + elsif rising_edge(clk) then + core_out_channel_0 <= core_out_channel; + end if; + end process out_lsb_p; + end generate channel_pipe_lsb; + + channel_wire_lsb: if REM_LSB_TYPE_g = "trunc" or REM_LSB_BIT_g = 0 generate + begin + core_out_channel_0 <= core_out_channel; + end generate channel_wire_lsb; + + channel_pipe_msb: if REM_MSB_TYPE_g = "sat" and REM_MSB_BIT_g > 0 generate + begin + out_p : process (clk, reset_n) + begin + if reset_n = '0' then + channel_out <= (others => '0'); + elsif rising_edge(clk) then + channel_out <= core_out_channel_0(LOG2_CHANSPERPHYOUT-1 downto 0); + end if; + end process out_p; + end generate channel_pipe_msb; + + channel_wire_msb: if REM_MSB_TYPE_g = "trunc" or REM_MSB_BIT_g = 0 generate + begin + channel_out <= core_out_channel_0(LOG2_CHANSPERPHYOUT-1 downto 0); + end generate channel_wire_msb; + + +real_passthrough : if COMPLEX_CONST = 1 generate + + component fir_0002_rtl_core is + port ( + xIn_v : in std_logic_vector(0 downto 0); + xIn_c : in std_logic_vector(7 downto 0); + xIn_0 : in std_logic_vector(16 - 1 downto 0); + xOut_v : out std_logic_vector(0 downto 0); + xOut_c : out std_logic_vector(7 downto 0); + xOut_0 : out std_logic_vector(37- 1 downto 0); + clk : in std_logic; + areset : in std_logic + ); +end component fir_0002_rtl_core; + + + --Complex data re-ordering + signal core_channel_out_core : std_logic_vector(2 -1 downto 0); + signal data_in_core : std_logic_vector((COMPLEX_CONST*INWIDTH + BANKINWIDTH) * PHYSCHANIN + MODE_WIDTH - 1 downto 0); + signal data_valid_core : std_logic_vector(0 downto 0); + signal core_out_core : std_logic_vector(OUT_WIDTH_UNTRIMMED * PHYSCHANOUT - 1 downto 0); + signal core_out_valid_core : std_logic_vector(0 downto 0); + signal core_out_channel_core : std_logic_vector(7 downto 0); + + + + begin + hpfircore_core: fir_0002_rtl_core + port map ( + xIn_v => data_valid_core, + xIn_c => "00000000", + xIn_0 => data_in_core((0 + 16) * 0 + 16 - 1 downto (0 + 16) * 0), + xOut_v => core_out_valid_core, + xOut_c => core_out_channel_core, + xOut_0 => core_out_core(37* 0 + 37- 1 downto 37* 0), + clk => clk, + areset => reset_fir + ); + + + + + core_channel_out <= core_channel_out_core; + data_in_core <= data_in; + data_valid_core <= data_valid; + core_out <= core_out_core; + core_out_valid(0) <= core_out_valid_core(0); + core_out_channel <= core_out_channel_core; + + + + gen_outp_blk : for i in PHYSCHANOUT-1 downto 0 generate + begin + outp_blk : auk_dspip_roundsat_hpfir + generic map ( + IN_WIDTH_g => OUT_WIDTH_UNTRIMMED , + REM_LSB_BIT_g => REM_LSB_BIT_g , + REM_LSB_TYPE_g => REM_LSB_TYPE_g , + REM_MSB_BIT_g => REM_MSB_BIT_g , + REM_MSB_TYPE_g => REM_MSB_TYPE_g + ) + port map ( + clk => clk, + reset_n => reset_n, + enable => core_out_valid(0), + datain => core_out(((i*OUT_WIDTH_UNTRIMMED)+OUT_WIDTH_UNTRIMMED-1) downto (i*OUT_WIDTH_UNTRIMMED)), + valid => outp_blk_valid(i), + dataout => outp_out(((i*OUTWIDTH)+OUTWIDTH-1) downto (i*OUTWIDTH)) + ); + end generate gen_outp_blk; + end generate real_passthrough; + + + + valid <= outp_blk_valid(0); + + enable_in(0) <= not stall; + +end struct; + + + + diff --git a/ld3/dds_vhdl/fir/fir_0002_rtl_core.vhd b/ld3/dds_vhdl/fir/fir_0002_rtl_core.vhd new file mode 100644 index 0000000..ef1793c --- /dev/null +++ b/ld3/dds_vhdl/fir/fir_0002_rtl_core.vhd @@ -0,0 +1,1033 @@ +-- ------------------------------------------------------------------------- +-- High Level Design Compiler for Intel(R) FPGAs Version 19.1 (Release Build #670) +-- Quartus Prime development tool and MATLAB/Simulink Interface +-- +-- Legal Notice: Copyright 2019 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 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 FPGA Software License +-- Agreement, 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. +-- --------------------------------------------------------------------------- + +-- VHDL created from fir_0002_rtl_core +-- VHDL created on Tue Jun 09 18:16:08 2020 + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.NUMERIC_STD.all; +use IEEE.MATH_REAL.all; +use std.TextIO.all; +use work.dspba_library_package.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; +LIBRARY altera_lnsim; +USE altera_lnsim.altera_lnsim_components.altera_syncram; +LIBRARY lpm; +USE lpm.lpm_components.all; + +entity fir_0002_rtl_core is + port ( + xIn_v : in std_logic_vector(0 downto 0); -- sfix1 + xIn_c : in std_logic_vector(7 downto 0); -- sfix8 + xIn_0 : in std_logic_vector(15 downto 0); -- sfix16 + xOut_v : out std_logic_vector(0 downto 0); -- ufix1 + xOut_c : out std_logic_vector(7 downto 0); -- ufix8 + xOut_0 : out std_logic_vector(36 downto 0); -- sfix37 + clk : in std_logic; + areset : in std_logic + ); +end fir_0002_rtl_core; + +architecture normal of fir_0002_rtl_core is + + attribute altera_attribute : string; + attribute altera_attribute of normal : architecture is "-name AUTO_SHIFT_REGISTER_RECOGNITION OFF; -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION ON; -name MESSAGE_DISABLE 10036; -name MESSAGE_DISABLE 10037; -name MESSAGE_DISABLE 14130; -name MESSAGE_DISABLE 14320; -name MESSAGE_DISABLE 15400; -name MESSAGE_DISABLE 14130; -name MESSAGE_DISABLE 10036; -name MESSAGE_DISABLE 12020; -name MESSAGE_DISABLE 12030; -name MESSAGE_DISABLE 12010; -name MESSAGE_DISABLE 12110; -name MESSAGE_DISABLE 14320; -name MESSAGE_DISABLE 13410; -name MESSAGE_DISABLE 113007"; + + signal GND_q : STD_LOGIC_VECTOR (0 downto 0); + signal VCC_q : STD_LOGIC_VECTOR (0 downto 0); + signal d_u0_m0_wo0_compute_q_11_q : STD_LOGIC_VECTOR (0 downto 0); + signal d_u0_m0_wo0_compute_q_12_q : STD_LOGIC_VECTOR (0 downto 0); + signal u0_m0_wo0_cma0_reset : std_logic; + type u0_m0_wo0_cma0_a0type is array(NATURAL range <>) of SIGNED(15 downto 0); + signal u0_m0_wo0_cma0_a0 : u0_m0_wo0_cma0_a0type(0 to 31); + attribute preserve : boolean; + attribute preserve of u0_m0_wo0_cma0_a0 : signal is true; + type u0_m0_wo0_cma0_c0type is array(NATURAL range <>) of UNSIGNED(2 downto 0); + signal u0_m0_wo0_cma0_c0 : u0_m0_wo0_cma0_c0type(0 to 31); + attribute preserve of u0_m0_wo0_cma0_c0 : signal is true; + type u0_m0_wo0_cma0_rtype is array(NATURAL range <>) of SIGNED(14 downto 0); + signal u0_m0_wo0_cma0_r : u0_m0_wo0_cma0_rtype(0 to 31); + type u0_m0_wo0_cma0_ptype is array(NATURAL range <>) of SIGNED(30 downto 0); + signal u0_m0_wo0_cma0_p : u0_m0_wo0_cma0_ptype(0 to 31); + type u0_m0_wo0_cma0_utype is array(NATURAL range <>) of SIGNED(35 downto 0); + signal u0_m0_wo0_cma0_u : u0_m0_wo0_cma0_utype(0 to 31); + signal u0_m0_wo0_cma0_w : u0_m0_wo0_cma0_utype(0 to 31); + signal u0_m0_wo0_cma0_x : u0_m0_wo0_cma0_utype(0 to 31); + signal u0_m0_wo0_cma0_y : u0_m0_wo0_cma0_utype(0 to 31); + signal u0_m0_wo0_cma0_k0 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-1299,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k1 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-1264,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k2 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-1050,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k3 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-427,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k4 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(712,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k5 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(2350,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k6 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(4113,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k7 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(5360,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k8 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(5377,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k9 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(3686,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k10 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(267,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k11 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-4309,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k12 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-8868,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k13 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-12055,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k14 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-12679,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k15 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-10168,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k16 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-4790,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k17 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(2297,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k18 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(9348,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k19 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(14495,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k20 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(16382,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k21 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(14495,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k22 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(9348,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k23 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(2297,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k24 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-4790,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k25 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-10168,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k26 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-12679,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k27 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-12055,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k28 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-8868,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k29 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(-4309,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k30 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(267,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_k31 : u0_m0_wo0_cma0_rtype(0 to 7) := ( + 0 => TO_SIGNED(3686,15), + others => (others => '0')); + signal u0_m0_wo0_cma0_s : u0_m0_wo0_cma0_utype(0 to 31); + signal u0_m0_wo0_cma0_qq : STD_LOGIC_VECTOR (35 downto 0); + signal u0_m0_wo0_cma0_q : STD_LOGIC_VECTOR (35 downto 0); + signal u0_m0_wo0_cma0_ena0 : std_logic; + signal u0_m0_wo0_cma0_ena1 : std_logic; + signal u0_m0_wo0_cma1_reset : std_logic; + signal u0_m0_wo0_cma1_a0 : u0_m0_wo0_cma0_a0type(0 to 9); + attribute preserve of u0_m0_wo0_cma1_a0 : signal is true; + signal u0_m0_wo0_cma1_c0 : u0_m0_wo0_cma0_c0type(0 to 9); + attribute preserve of u0_m0_wo0_cma1_c0 : signal is true; + type u0_m0_wo0_cma1_rtype is array(NATURAL range <>) of SIGNED(13 downto 0); + signal u0_m0_wo0_cma1_r : u0_m0_wo0_cma1_rtype(0 to 9); + type u0_m0_wo0_cma1_ptype is array(NATURAL range <>) of SIGNED(29 downto 0); + signal u0_m0_wo0_cma1_p : u0_m0_wo0_cma1_ptype(0 to 9); + type u0_m0_wo0_cma1_utype is array(NATURAL range <>) of SIGNED(33 downto 0); + signal u0_m0_wo0_cma1_u : u0_m0_wo0_cma1_utype(0 to 9); + signal u0_m0_wo0_cma1_w : u0_m0_wo0_cma1_utype(0 to 9); + signal u0_m0_wo0_cma1_x : u0_m0_wo0_cma1_utype(0 to 9); + signal u0_m0_wo0_cma1_y : u0_m0_wo0_cma1_utype(0 to 9); + signal u0_m0_wo0_cma1_k0 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + 0 => TO_SIGNED(5377,14), + others => (others => '0')); + signal u0_m0_wo0_cma1_k1 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + 0 => TO_SIGNED(5360,14), + others => (others => '0')); + signal u0_m0_wo0_cma1_k2 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + 0 => TO_SIGNED(4113,14), + others => (others => '0')); + signal u0_m0_wo0_cma1_k3 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + 0 => TO_SIGNED(2350,14), + others => (others => '0')); + signal u0_m0_wo0_cma1_k4 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + 0 => TO_SIGNED(712,14), + others => (others => '0')); + signal u0_m0_wo0_cma1_k5 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + 0 => TO_SIGNED(-427,14), + others => (others => '0')); + signal u0_m0_wo0_cma1_k6 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + 0 => TO_SIGNED(-1050,14), + others => (others => '0')); + signal u0_m0_wo0_cma1_k7 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + 0 => TO_SIGNED(-1264,14), + others => (others => '0')); + signal u0_m0_wo0_cma1_k8 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + 0 => TO_SIGNED(-1299,14), + others => (others => '0')); + signal u0_m0_wo0_cma1_k9 : u0_m0_wo0_cma1_rtype(0 to 7) := ( + others => (others => '0')); + signal u0_m0_wo0_cma1_s : u0_m0_wo0_cma1_utype(0 to 9); + signal u0_m0_wo0_cma1_qq : STD_LOGIC_VECTOR (33 downto 0); + signal u0_m0_wo0_cma1_q : STD_LOGIC_VECTOR (33 downto 0); + signal u0_m0_wo0_cma1_ena0 : std_logic; + signal u0_m0_wo0_cma1_ena1 : std_logic; + signal u0_m0_wo0_mtree_add0_0_a : STD_LOGIC_VECTOR (36 downto 0); + signal u0_m0_wo0_mtree_add0_0_b : STD_LOGIC_VECTOR (36 downto 0); + signal u0_m0_wo0_mtree_add0_0_o : STD_LOGIC_VECTOR (36 downto 0); + signal u0_m0_wo0_mtree_add0_0_q : STD_LOGIC_VECTOR (36 downto 0); + signal u0_m0_wo0_oseq_gated_reg_q : STD_LOGIC_VECTOR (0 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_mem_reset0 : std_logic; + signal u0_m0_wo0_wi0_r0_delayr32_mem_ia : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_mem_aa : STD_LOGIC_VECTOR (4 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_mem_ab : STD_LOGIC_VECTOR (4 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_mem_iq : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_mem_q : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_rdcnt_q : STD_LOGIC_VECTOR (4 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_rdcnt_i : UNSIGNED (4 downto 0); + attribute preserve of u0_m0_wo0_wi0_r0_delayr32_rdcnt_i : signal is true; + signal u0_m0_wo0_wi0_r0_delayr32_rdcnt_eq : std_logic; + attribute preserve of u0_m0_wo0_wi0_r0_delayr32_rdcnt_eq : signal is true; + signal u0_m0_wo0_wi0_r0_delayr32_wraddr_q : STD_LOGIC_VECTOR (4 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_mem_last_q : STD_LOGIC_VECTOR (5 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_cmpReg_q : STD_LOGIC_VECTOR (0 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_sticky_ena_q : STD_LOGIC_VECTOR (0 downto 0); + attribute dont_merge : boolean; + attribute dont_merge of u0_m0_wo0_wi0_r0_delayr32_sticky_ena_q : signal is true; + signal u0_m0_wo0_wi0_r0_delayr32_rdmux_s : STD_LOGIC_VECTOR (0 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_rdmux_q : STD_LOGIC_VECTOR (4 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_cmp_b : STD_LOGIC_VECTOR (5 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_cmp_q : STD_LOGIC_VECTOR (0 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_notEnable_q : STD_LOGIC_VECTOR (0 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_nor_q : STD_LOGIC_VECTOR (0 downto 0); + signal u0_m0_wo0_wi0_r0_delayr32_enaAnd_q : STD_LOGIC_VECTOR (0 downto 0); + signal u0_m0_wo0_wi0_r0_delayr33_q : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr34_q : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr35_q : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr36_q : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr37_q : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr38_q : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr39_q : STD_LOGIC_VECTOR (15 downto 0); + signal u0_m0_wo0_wi0_r0_delayr40_q : STD_LOGIC_VECTOR (15 downto 0); + signal out0_m0_wo0_lineup_select_delay_0_q : STD_LOGIC_VECTOR (0 downto 0); + signal out0_m0_wo0_assign_id3_q : STD_LOGIC_VECTOR (0 downto 0); + +begin + + + -- VCC(CONSTANT,1)@0 + VCC_q <= "1"; + + -- u0_m0_wo0_wi0_r0_delayr40(DELAY,59)@10 + u0_m0_wo0_wi0_r0_delayr40_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr39_q); + + -- u0_m0_wo0_wi0_r0_delayr39(DELAY,58)@10 + u0_m0_wo0_wi0_r0_delayr39_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr38_q); + + -- u0_m0_wo0_wi0_r0_delayr38(DELAY,57)@10 + u0_m0_wo0_wi0_r0_delayr38_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr37_q); + + -- u0_m0_wo0_wi0_r0_delayr37(DELAY,56)@10 + u0_m0_wo0_wi0_r0_delayr37_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr36_q); + + -- u0_m0_wo0_wi0_r0_delayr36(DELAY,55)@10 + u0_m0_wo0_wi0_r0_delayr36_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr35_q); + + -- u0_m0_wo0_wi0_r0_delayr35(DELAY,54)@10 + u0_m0_wo0_wi0_r0_delayr35_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr34_q); + + -- u0_m0_wo0_wi0_r0_delayr34(DELAY,53)@10 + u0_m0_wo0_wi0_r0_delayr34_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr33_q); + + -- u0_m0_wo0_wi0_r0_delayr33(DELAY,52)@10 + u0_m0_wo0_wi0_r0_delayr33_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr32_mem_q); + + -- u0_m0_wo0_wi0_r0_delayr32_notEnable(LOGICAL,122)@10 + u0_m0_wo0_wi0_r0_delayr32_notEnable_q <= STD_LOGIC_VECTOR(not (xIn_v)); + + -- u0_m0_wo0_wi0_r0_delayr32_nor(LOGICAL,123)@10 + u0_m0_wo0_wi0_r0_delayr32_nor_q <= not (u0_m0_wo0_wi0_r0_delayr32_notEnable_q or u0_m0_wo0_wi0_r0_delayr32_sticky_ena_q); + + -- u0_m0_wo0_wi0_r0_delayr32_mem_last(CONSTANT,119) + u0_m0_wo0_wi0_r0_delayr32_mem_last_q <= "011101"; + + -- u0_m0_wo0_wi0_r0_delayr32_cmp(LOGICAL,120)@10 + u0_m0_wo0_wi0_r0_delayr32_cmp_b <= STD_LOGIC_VECTOR("0" & u0_m0_wo0_wi0_r0_delayr32_rdmux_q); + u0_m0_wo0_wi0_r0_delayr32_cmp_q <= "1" WHEN u0_m0_wo0_wi0_r0_delayr32_mem_last_q = u0_m0_wo0_wi0_r0_delayr32_cmp_b ELSE "0"; + + -- u0_m0_wo0_wi0_r0_delayr32_cmpReg(REG,121)@10 + 1 + u0_m0_wo0_wi0_r0_delayr32_cmpReg_clkproc: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_wi0_r0_delayr32_cmpReg_q <= "0"; + ELSIF (clk'EVENT AND clk = '1') THEN + IF (xIn_v = "1") THEN + u0_m0_wo0_wi0_r0_delayr32_cmpReg_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr32_cmp_q); + END IF; + END IF; + END PROCESS; + + -- u0_m0_wo0_wi0_r0_delayr32_sticky_ena(REG,124)@10 + 1 + u0_m0_wo0_wi0_r0_delayr32_sticky_ena_clkproc: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_wi0_r0_delayr32_sticky_ena_q <= "0"; + ELSIF (clk'EVENT AND clk = '1') THEN + IF (u0_m0_wo0_wi0_r0_delayr32_nor_q = "1") THEN + u0_m0_wo0_wi0_r0_delayr32_sticky_ena_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr32_cmpReg_q); + END IF; + END IF; + END PROCESS; + + -- u0_m0_wo0_wi0_r0_delayr32_enaAnd(LOGICAL,125)@10 + u0_m0_wo0_wi0_r0_delayr32_enaAnd_q <= u0_m0_wo0_wi0_r0_delayr32_sticky_ena_q and xIn_v; + + -- u0_m0_wo0_wi0_r0_delayr32_rdcnt(COUNTER,116)@10 + 1 + -- low=0, high=30, step=1, init=0 + u0_m0_wo0_wi0_r0_delayr32_rdcnt_clkproc: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_wi0_r0_delayr32_rdcnt_i <= TO_UNSIGNED(0, 5); + u0_m0_wo0_wi0_r0_delayr32_rdcnt_eq <= '0'; + ELSIF (clk'EVENT AND clk = '1') THEN + IF (xIn_v = "1") THEN + IF (u0_m0_wo0_wi0_r0_delayr32_rdcnt_i = TO_UNSIGNED(29, 5)) THEN + u0_m0_wo0_wi0_r0_delayr32_rdcnt_eq <= '1'; + ELSE + u0_m0_wo0_wi0_r0_delayr32_rdcnt_eq <= '0'; + END IF; + IF (u0_m0_wo0_wi0_r0_delayr32_rdcnt_eq = '1') THEN + u0_m0_wo0_wi0_r0_delayr32_rdcnt_i <= u0_m0_wo0_wi0_r0_delayr32_rdcnt_i + 2; + ELSE + u0_m0_wo0_wi0_r0_delayr32_rdcnt_i <= u0_m0_wo0_wi0_r0_delayr32_rdcnt_i + 1; + END IF; + END IF; + END IF; + END PROCESS; + u0_m0_wo0_wi0_r0_delayr32_rdcnt_q <= STD_LOGIC_VECTOR(STD_LOGIC_VECTOR(RESIZE(u0_m0_wo0_wi0_r0_delayr32_rdcnt_i, 5))); + + -- u0_m0_wo0_wi0_r0_delayr32_rdmux(MUX,117)@10 + u0_m0_wo0_wi0_r0_delayr32_rdmux_s <= xIn_v; + u0_m0_wo0_wi0_r0_delayr32_rdmux_combproc: PROCESS (u0_m0_wo0_wi0_r0_delayr32_rdmux_s, u0_m0_wo0_wi0_r0_delayr32_wraddr_q, u0_m0_wo0_wi0_r0_delayr32_rdcnt_q) + BEGIN + CASE (u0_m0_wo0_wi0_r0_delayr32_rdmux_s) IS + WHEN "0" => u0_m0_wo0_wi0_r0_delayr32_rdmux_q <= u0_m0_wo0_wi0_r0_delayr32_wraddr_q; + WHEN "1" => u0_m0_wo0_wi0_r0_delayr32_rdmux_q <= u0_m0_wo0_wi0_r0_delayr32_rdcnt_q; + WHEN OTHERS => u0_m0_wo0_wi0_r0_delayr32_rdmux_q <= (others => '0'); + END CASE; + END PROCESS; + + -- u0_m0_wo0_wi0_r0_delayr32_wraddr(REG,118)@10 + 1 + u0_m0_wo0_wi0_r0_delayr32_wraddr_clkproc: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_wi0_r0_delayr32_wraddr_q <= "11110"; + ELSIF (clk'EVENT AND clk = '1') THEN + u0_m0_wo0_wi0_r0_delayr32_wraddr_q <= STD_LOGIC_VECTOR(u0_m0_wo0_wi0_r0_delayr32_rdmux_q); + END IF; + END PROCESS; + + -- u0_m0_wo0_wi0_r0_delayr32_mem(DUALMEM,115)@10 + 2 + u0_m0_wo0_wi0_r0_delayr32_mem_ia <= STD_LOGIC_VECTOR(xIn_0); + u0_m0_wo0_wi0_r0_delayr32_mem_aa <= u0_m0_wo0_wi0_r0_delayr32_wraddr_q; + u0_m0_wo0_wi0_r0_delayr32_mem_ab <= u0_m0_wo0_wi0_r0_delayr32_rdmux_q; + u0_m0_wo0_wi0_r0_delayr32_mem_reset0 <= areset; + u0_m0_wo0_wi0_r0_delayr32_mem_dmem : altera_syncram + GENERIC MAP ( + ram_block_type => "MLAB", + operation_mode => "DUAL_PORT", + width_a => 16, + widthad_a => 5, + numwords_a => 31, + width_b => 16, + widthad_b => 5, + numwords_b => 31, + lpm_type => "altera_syncram", + width_byteena_a => 1, + address_reg_b => "CLOCK0", + indata_reg_b => "CLOCK0", + rdcontrol_reg_b => "CLOCK0", + byteena_reg_b => "CLOCK0", + outdata_reg_b => "CLOCK1", + outdata_aclr_b => "CLEAR1", + clock_enable_input_a => "NORMAL", + clock_enable_input_b => "NORMAL", + clock_enable_output_b => "NORMAL", + read_during_write_mode_mixed_ports => "DONT_CARE", + power_up_uninitialized => "TRUE", + intended_device_family => "Cyclone V" + ) + PORT MAP ( + clocken1 => u0_m0_wo0_wi0_r0_delayr32_enaAnd_q(0), + clocken0 => VCC_q(0), + clock0 => clk, + aclr1 => u0_m0_wo0_wi0_r0_delayr32_mem_reset0, + clock1 => clk, + address_a => u0_m0_wo0_wi0_r0_delayr32_mem_aa, + data_a => u0_m0_wo0_wi0_r0_delayr32_mem_ia, + wren_a => xIn_v(0), + address_b => u0_m0_wo0_wi0_r0_delayr32_mem_ab, + q_b => u0_m0_wo0_wi0_r0_delayr32_mem_iq + ); + u0_m0_wo0_wi0_r0_delayr32_mem_q <= u0_m0_wo0_wi0_r0_delayr32_mem_iq(15 downto 0); + + -- d_u0_m0_wo0_compute_q_11(DELAY,113)@10 + 1 + d_u0_m0_wo0_compute_q_11 : dspba_delay + GENERIC MAP ( width => 1, depth => 1, reset_kind => "ASYNC" ) + PORT MAP ( xin => xIn_v, xout => d_u0_m0_wo0_compute_q_11_q, clk => clk, aclr => areset ); + + -- u0_m0_wo0_cma1(CHAINMULTADD,105)@10 + 2 + u0_m0_wo0_cma1_reset <= areset; + u0_m0_wo0_cma1_ena0 <= xIn_v(0); + u0_m0_wo0_cma1_ena1 <= d_u0_m0_wo0_compute_q_11_q(0); + -- altera synthesis_off + u0_m0_wo0_cma1_k0 <= ( + 0 => TO_SIGNED(5377,14), + others => (others => '0')); + u0_m0_wo0_cma1_k1 <= ( + 0 => TO_SIGNED(5360,14), + others => (others => '0')); + u0_m0_wo0_cma1_k2 <= ( + 0 => TO_SIGNED(4113,14), + others => (others => '0')); + u0_m0_wo0_cma1_k3 <= ( + 0 => TO_SIGNED(2350,14), + others => (others => '0')); + u0_m0_wo0_cma1_k4 <= ( + 0 => TO_SIGNED(712,14), + others => (others => '0')); + u0_m0_wo0_cma1_k5 <= ( + 0 => TO_SIGNED(-427,14), + others => (others => '0')); + u0_m0_wo0_cma1_k6 <= ( + 0 => TO_SIGNED(-1050,14), + others => (others => '0')); + u0_m0_wo0_cma1_k7 <= ( + 0 => TO_SIGNED(-1264,14), + others => (others => '0')); + u0_m0_wo0_cma1_k8 <= ( + 0 => TO_SIGNED(-1299,14), + others => (others => '0')); + u0_m0_wo0_cma1_k9 <= ( + others => (others => '0')); + -- altera synthesis_on + u0_m0_wo0_cma1_r(0) <= u0_m0_wo0_cma1_k0(TO_INTEGER(u0_m0_wo0_cma1_c0(0))); + u0_m0_wo0_cma1_r(1) <= u0_m0_wo0_cma1_k1(TO_INTEGER(u0_m0_wo0_cma1_c0(1))); + u0_m0_wo0_cma1_r(2) <= u0_m0_wo0_cma1_k2(TO_INTEGER(u0_m0_wo0_cma1_c0(2))); + u0_m0_wo0_cma1_r(3) <= u0_m0_wo0_cma1_k3(TO_INTEGER(u0_m0_wo0_cma1_c0(3))); + u0_m0_wo0_cma1_r(4) <= u0_m0_wo0_cma1_k4(TO_INTEGER(u0_m0_wo0_cma1_c0(4))); + u0_m0_wo0_cma1_r(5) <= u0_m0_wo0_cma1_k5(TO_INTEGER(u0_m0_wo0_cma1_c0(5))); + u0_m0_wo0_cma1_r(6) <= u0_m0_wo0_cma1_k6(TO_INTEGER(u0_m0_wo0_cma1_c0(6))); + u0_m0_wo0_cma1_r(7) <= u0_m0_wo0_cma1_k7(TO_INTEGER(u0_m0_wo0_cma1_c0(7))); + u0_m0_wo0_cma1_r(8) <= u0_m0_wo0_cma1_k8(TO_INTEGER(u0_m0_wo0_cma1_c0(8))); + u0_m0_wo0_cma1_r(9) <= u0_m0_wo0_cma1_k9(TO_INTEGER(u0_m0_wo0_cma1_c0(9))); + u0_m0_wo0_cma1_p(0) <= u0_m0_wo0_cma1_a0(0) * u0_m0_wo0_cma1_r(0); + u0_m0_wo0_cma1_p(1) <= u0_m0_wo0_cma1_a0(1) * u0_m0_wo0_cma1_r(1); + u0_m0_wo0_cma1_p(2) <= u0_m0_wo0_cma1_a0(2) * u0_m0_wo0_cma1_r(2); + u0_m0_wo0_cma1_p(3) <= u0_m0_wo0_cma1_a0(3) * u0_m0_wo0_cma1_r(3); + u0_m0_wo0_cma1_p(4) <= u0_m0_wo0_cma1_a0(4) * u0_m0_wo0_cma1_r(4); + u0_m0_wo0_cma1_p(5) <= u0_m0_wo0_cma1_a0(5) * u0_m0_wo0_cma1_r(5); + u0_m0_wo0_cma1_p(6) <= u0_m0_wo0_cma1_a0(6) * u0_m0_wo0_cma1_r(6); + u0_m0_wo0_cma1_p(7) <= u0_m0_wo0_cma1_a0(7) * u0_m0_wo0_cma1_r(7); + u0_m0_wo0_cma1_p(8) <= u0_m0_wo0_cma1_a0(8) * u0_m0_wo0_cma1_r(8); + u0_m0_wo0_cma1_p(9) <= u0_m0_wo0_cma1_a0(9) * u0_m0_wo0_cma1_r(9); + u0_m0_wo0_cma1_u(0) <= RESIZE(u0_m0_wo0_cma1_p(0),34); + u0_m0_wo0_cma1_u(1) <= RESIZE(u0_m0_wo0_cma1_p(1),34); + u0_m0_wo0_cma1_u(2) <= RESIZE(u0_m0_wo0_cma1_p(2),34); + u0_m0_wo0_cma1_u(3) <= RESIZE(u0_m0_wo0_cma1_p(3),34); + u0_m0_wo0_cma1_u(4) <= RESIZE(u0_m0_wo0_cma1_p(4),34); + u0_m0_wo0_cma1_u(5) <= RESIZE(u0_m0_wo0_cma1_p(5),34); + u0_m0_wo0_cma1_u(6) <= RESIZE(u0_m0_wo0_cma1_p(6),34); + u0_m0_wo0_cma1_u(7) <= RESIZE(u0_m0_wo0_cma1_p(7),34); + u0_m0_wo0_cma1_u(8) <= RESIZE(u0_m0_wo0_cma1_p(8),34); + u0_m0_wo0_cma1_u(9) <= RESIZE(u0_m0_wo0_cma1_p(9),34); + u0_m0_wo0_cma1_w(0) <= u0_m0_wo0_cma1_u(0); + u0_m0_wo0_cma1_w(1) <= u0_m0_wo0_cma1_u(1); + u0_m0_wo0_cma1_w(2) <= u0_m0_wo0_cma1_u(2); + u0_m0_wo0_cma1_w(3) <= u0_m0_wo0_cma1_u(3); + u0_m0_wo0_cma1_w(4) <= u0_m0_wo0_cma1_u(4); + u0_m0_wo0_cma1_w(5) <= u0_m0_wo0_cma1_u(5); + u0_m0_wo0_cma1_w(6) <= u0_m0_wo0_cma1_u(6); + u0_m0_wo0_cma1_w(7) <= u0_m0_wo0_cma1_u(7); + u0_m0_wo0_cma1_w(8) <= u0_m0_wo0_cma1_u(8); + u0_m0_wo0_cma1_w(9) <= u0_m0_wo0_cma1_u(9); + u0_m0_wo0_cma1_x(0) <= u0_m0_wo0_cma1_w(0); + u0_m0_wo0_cma1_x(1) <= u0_m0_wo0_cma1_w(1); + u0_m0_wo0_cma1_x(2) <= u0_m0_wo0_cma1_w(2); + u0_m0_wo0_cma1_x(3) <= u0_m0_wo0_cma1_w(3); + u0_m0_wo0_cma1_x(4) <= u0_m0_wo0_cma1_w(4); + u0_m0_wo0_cma1_x(5) <= u0_m0_wo0_cma1_w(5); + u0_m0_wo0_cma1_x(6) <= u0_m0_wo0_cma1_w(6); + u0_m0_wo0_cma1_x(7) <= u0_m0_wo0_cma1_w(7); + u0_m0_wo0_cma1_x(8) <= u0_m0_wo0_cma1_w(8); + u0_m0_wo0_cma1_x(9) <= u0_m0_wo0_cma1_w(9); + u0_m0_wo0_cma1_y(0) <= u0_m0_wo0_cma1_s(1) + u0_m0_wo0_cma1_x(0); + u0_m0_wo0_cma1_y(1) <= u0_m0_wo0_cma1_s(2) + u0_m0_wo0_cma1_x(1); + u0_m0_wo0_cma1_y(2) <= u0_m0_wo0_cma1_s(3) + u0_m0_wo0_cma1_x(2); + u0_m0_wo0_cma1_y(3) <= u0_m0_wo0_cma1_s(4) + u0_m0_wo0_cma1_x(3); + u0_m0_wo0_cma1_y(4) <= u0_m0_wo0_cma1_s(5) + u0_m0_wo0_cma1_x(4); + u0_m0_wo0_cma1_y(5) <= u0_m0_wo0_cma1_s(6) + u0_m0_wo0_cma1_x(5); + u0_m0_wo0_cma1_y(6) <= u0_m0_wo0_cma1_s(7) + u0_m0_wo0_cma1_x(6); + u0_m0_wo0_cma1_y(7) <= u0_m0_wo0_cma1_s(8) + u0_m0_wo0_cma1_x(7); + u0_m0_wo0_cma1_y(8) <= u0_m0_wo0_cma1_s(9) + u0_m0_wo0_cma1_x(8); + u0_m0_wo0_cma1_y(9) <= u0_m0_wo0_cma1_x(9); + u0_m0_wo0_cma1_chainmultadd_input: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_cma1_a0 <= (others => (others => '0')); + u0_m0_wo0_cma1_c0 <= (others => (others => '0')); + ELSIF (clk'EVENT AND clk = '1') THEN + IF (u0_m0_wo0_cma1_ena0 = '1') THEN + u0_m0_wo0_cma1_a0(0) <= RESIZE(SIGNED(u0_m0_wo0_wi0_r0_delayr32_mem_q),16); + u0_m0_wo0_cma1_a0(1) <= RESIZE(SIGNED(u0_m0_wo0_wi0_r0_delayr33_q),16); + u0_m0_wo0_cma1_a0(2) <= RESIZE(SIGNED(u0_m0_wo0_wi0_r0_delayr34_q),16); + u0_m0_wo0_cma1_a0(3) <= RESIZE(SIGNED(u0_m0_wo0_wi0_r0_delayr35_q),16); + u0_m0_wo0_cma1_a0(4) <= RESIZE(SIGNED(u0_m0_wo0_wi0_r0_delayr36_q),16); + u0_m0_wo0_cma1_a0(5) <= RESIZE(SIGNED(u0_m0_wo0_wi0_r0_delayr37_q),16); + u0_m0_wo0_cma1_a0(6) <= RESIZE(SIGNED(u0_m0_wo0_wi0_r0_delayr38_q),16); + u0_m0_wo0_cma1_a0(7) <= RESIZE(SIGNED(u0_m0_wo0_wi0_r0_delayr39_q),16); + u0_m0_wo0_cma1_a0(8) <= RESIZE(SIGNED(u0_m0_wo0_wi0_r0_delayr40_q),16); + u0_m0_wo0_cma1_a0(9) <= (others => '0'); + u0_m0_wo0_cma1_c0(0) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma1_c0(1) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma1_c0(2) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma1_c0(3) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma1_c0(4) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma1_c0(5) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma1_c0(6) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma1_c0(7) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma1_c0(8) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma1_c0(9) <= (others => '0'); + END IF; + END IF; + END PROCESS; + u0_m0_wo0_cma1_chainmultadd_output: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_cma1_s <= (others => (others => '0')); + ELSIF (clk'EVENT AND clk = '1') THEN + IF (u0_m0_wo0_cma1_ena1 = '1') THEN + u0_m0_wo0_cma1_s(0) <= u0_m0_wo0_cma1_y(0); + u0_m0_wo0_cma1_s(1) <= u0_m0_wo0_cma1_y(1); + u0_m0_wo0_cma1_s(2) <= u0_m0_wo0_cma1_y(2); + u0_m0_wo0_cma1_s(3) <= u0_m0_wo0_cma1_y(3); + u0_m0_wo0_cma1_s(4) <= u0_m0_wo0_cma1_y(4); + u0_m0_wo0_cma1_s(5) <= u0_m0_wo0_cma1_y(5); + u0_m0_wo0_cma1_s(6) <= u0_m0_wo0_cma1_y(6); + u0_m0_wo0_cma1_s(7) <= u0_m0_wo0_cma1_y(7); + u0_m0_wo0_cma1_s(8) <= u0_m0_wo0_cma1_y(8); + u0_m0_wo0_cma1_s(9) <= u0_m0_wo0_cma1_y(9); + END IF; + END IF; + END PROCESS; + u0_m0_wo0_cma1_delay : dspba_delay + GENERIC MAP ( width => 34, depth => 0, reset_kind => "ASYNC" ) + PORT MAP ( xin => STD_LOGIC_VECTOR(u0_m0_wo0_cma1_s(0)(33 downto 0)), xout => u0_m0_wo0_cma1_qq, clk => clk, aclr => areset ); + u0_m0_wo0_cma1_q <= STD_LOGIC_VECTOR(u0_m0_wo0_cma1_qq(33 downto 0)); + + -- u0_m0_wo0_cma0(CHAINMULTADD,104)@10 + 2 + u0_m0_wo0_cma0_reset <= areset; + u0_m0_wo0_cma0_ena0 <= xIn_v(0); + u0_m0_wo0_cma0_ena1 <= d_u0_m0_wo0_compute_q_11_q(0); + -- altera synthesis_off + u0_m0_wo0_cma0_k0 <= ( + 0 => TO_SIGNED(-1299,15), + others => (others => '0')); + u0_m0_wo0_cma0_k1 <= ( + 0 => TO_SIGNED(-1264,15), + others => (others => '0')); + u0_m0_wo0_cma0_k2 <= ( + 0 => TO_SIGNED(-1050,15), + others => (others => '0')); + u0_m0_wo0_cma0_k3 <= ( + 0 => TO_SIGNED(-427,15), + others => (others => '0')); + u0_m0_wo0_cma0_k4 <= ( + 0 => TO_SIGNED(712,15), + others => (others => '0')); + u0_m0_wo0_cma0_k5 <= ( + 0 => TO_SIGNED(2350,15), + others => (others => '0')); + u0_m0_wo0_cma0_k6 <= ( + 0 => TO_SIGNED(4113,15), + others => (others => '0')); + u0_m0_wo0_cma0_k7 <= ( + 0 => TO_SIGNED(5360,15), + others => (others => '0')); + u0_m0_wo0_cma0_k8 <= ( + 0 => TO_SIGNED(5377,15), + others => (others => '0')); + u0_m0_wo0_cma0_k9 <= ( + 0 => TO_SIGNED(3686,15), + others => (others => '0')); + u0_m0_wo0_cma0_k10 <= ( + 0 => TO_SIGNED(267,15), + others => (others => '0')); + u0_m0_wo0_cma0_k11 <= ( + 0 => TO_SIGNED(-4309,15), + others => (others => '0')); + u0_m0_wo0_cma0_k12 <= ( + 0 => TO_SIGNED(-8868,15), + others => (others => '0')); + u0_m0_wo0_cma0_k13 <= ( + 0 => TO_SIGNED(-12055,15), + others => (others => '0')); + u0_m0_wo0_cma0_k14 <= ( + 0 => TO_SIGNED(-12679,15), + others => (others => '0')); + u0_m0_wo0_cma0_k15 <= ( + 0 => TO_SIGNED(-10168,15), + others => (others => '0')); + u0_m0_wo0_cma0_k16 <= ( + 0 => TO_SIGNED(-4790,15), + others => (others => '0')); + u0_m0_wo0_cma0_k17 <= ( + 0 => TO_SIGNED(2297,15), + others => (others => '0')); + u0_m0_wo0_cma0_k18 <= ( + 0 => TO_SIGNED(9348,15), + others => (others => '0')); + u0_m0_wo0_cma0_k19 <= ( + 0 => TO_SIGNED(14495,15), + others => (others => '0')); + u0_m0_wo0_cma0_k20 <= ( + 0 => TO_SIGNED(16382,15), + others => (others => '0')); + u0_m0_wo0_cma0_k21 <= ( + 0 => TO_SIGNED(14495,15), + others => (others => '0')); + u0_m0_wo0_cma0_k22 <= ( + 0 => TO_SIGNED(9348,15), + others => (others => '0')); + u0_m0_wo0_cma0_k23 <= ( + 0 => TO_SIGNED(2297,15), + others => (others => '0')); + u0_m0_wo0_cma0_k24 <= ( + 0 => TO_SIGNED(-4790,15), + others => (others => '0')); + u0_m0_wo0_cma0_k25 <= ( + 0 => TO_SIGNED(-10168,15), + others => (others => '0')); + u0_m0_wo0_cma0_k26 <= ( + 0 => TO_SIGNED(-12679,15), + others => (others => '0')); + u0_m0_wo0_cma0_k27 <= ( + 0 => TO_SIGNED(-12055,15), + others => (others => '0')); + u0_m0_wo0_cma0_k28 <= ( + 0 => TO_SIGNED(-8868,15), + others => (others => '0')); + u0_m0_wo0_cma0_k29 <= ( + 0 => TO_SIGNED(-4309,15), + others => (others => '0')); + u0_m0_wo0_cma0_k30 <= ( + 0 => TO_SIGNED(267,15), + others => (others => '0')); + u0_m0_wo0_cma0_k31 <= ( + 0 => TO_SIGNED(3686,15), + others => (others => '0')); + -- altera synthesis_on + u0_m0_wo0_cma0_r(0) <= u0_m0_wo0_cma0_k0(TO_INTEGER(u0_m0_wo0_cma0_c0(0))); + u0_m0_wo0_cma0_r(1) <= u0_m0_wo0_cma0_k1(TO_INTEGER(u0_m0_wo0_cma0_c0(1))); + u0_m0_wo0_cma0_r(2) <= u0_m0_wo0_cma0_k2(TO_INTEGER(u0_m0_wo0_cma0_c0(2))); + u0_m0_wo0_cma0_r(3) <= u0_m0_wo0_cma0_k3(TO_INTEGER(u0_m0_wo0_cma0_c0(3))); + u0_m0_wo0_cma0_r(4) <= u0_m0_wo0_cma0_k4(TO_INTEGER(u0_m0_wo0_cma0_c0(4))); + u0_m0_wo0_cma0_r(5) <= u0_m0_wo0_cma0_k5(TO_INTEGER(u0_m0_wo0_cma0_c0(5))); + u0_m0_wo0_cma0_r(6) <= u0_m0_wo0_cma0_k6(TO_INTEGER(u0_m0_wo0_cma0_c0(6))); + u0_m0_wo0_cma0_r(7) <= u0_m0_wo0_cma0_k7(TO_INTEGER(u0_m0_wo0_cma0_c0(7))); + u0_m0_wo0_cma0_r(8) <= u0_m0_wo0_cma0_k8(TO_INTEGER(u0_m0_wo0_cma0_c0(8))); + u0_m0_wo0_cma0_r(9) <= u0_m0_wo0_cma0_k9(TO_INTEGER(u0_m0_wo0_cma0_c0(9))); + u0_m0_wo0_cma0_r(10) <= u0_m0_wo0_cma0_k10(TO_INTEGER(u0_m0_wo0_cma0_c0(10))); + u0_m0_wo0_cma0_r(11) <= u0_m0_wo0_cma0_k11(TO_INTEGER(u0_m0_wo0_cma0_c0(11))); + u0_m0_wo0_cma0_r(12) <= u0_m0_wo0_cma0_k12(TO_INTEGER(u0_m0_wo0_cma0_c0(12))); + u0_m0_wo0_cma0_r(13) <= u0_m0_wo0_cma0_k13(TO_INTEGER(u0_m0_wo0_cma0_c0(13))); + u0_m0_wo0_cma0_r(14) <= u0_m0_wo0_cma0_k14(TO_INTEGER(u0_m0_wo0_cma0_c0(14))); + u0_m0_wo0_cma0_r(15) <= u0_m0_wo0_cma0_k15(TO_INTEGER(u0_m0_wo0_cma0_c0(15))); + u0_m0_wo0_cma0_r(16) <= u0_m0_wo0_cma0_k16(TO_INTEGER(u0_m0_wo0_cma0_c0(16))); + u0_m0_wo0_cma0_r(17) <= u0_m0_wo0_cma0_k17(TO_INTEGER(u0_m0_wo0_cma0_c0(17))); + u0_m0_wo0_cma0_r(18) <= u0_m0_wo0_cma0_k18(TO_INTEGER(u0_m0_wo0_cma0_c0(18))); + u0_m0_wo0_cma0_r(19) <= u0_m0_wo0_cma0_k19(TO_INTEGER(u0_m0_wo0_cma0_c0(19))); + u0_m0_wo0_cma0_r(20) <= u0_m0_wo0_cma0_k20(TO_INTEGER(u0_m0_wo0_cma0_c0(20))); + u0_m0_wo0_cma0_r(21) <= u0_m0_wo0_cma0_k21(TO_INTEGER(u0_m0_wo0_cma0_c0(21))); + u0_m0_wo0_cma0_r(22) <= u0_m0_wo0_cma0_k22(TO_INTEGER(u0_m0_wo0_cma0_c0(22))); + u0_m0_wo0_cma0_r(23) <= u0_m0_wo0_cma0_k23(TO_INTEGER(u0_m0_wo0_cma0_c0(23))); + u0_m0_wo0_cma0_r(24) <= u0_m0_wo0_cma0_k24(TO_INTEGER(u0_m0_wo0_cma0_c0(24))); + u0_m0_wo0_cma0_r(25) <= u0_m0_wo0_cma0_k25(TO_INTEGER(u0_m0_wo0_cma0_c0(25))); + u0_m0_wo0_cma0_r(26) <= u0_m0_wo0_cma0_k26(TO_INTEGER(u0_m0_wo0_cma0_c0(26))); + u0_m0_wo0_cma0_r(27) <= u0_m0_wo0_cma0_k27(TO_INTEGER(u0_m0_wo0_cma0_c0(27))); + u0_m0_wo0_cma0_r(28) <= u0_m0_wo0_cma0_k28(TO_INTEGER(u0_m0_wo0_cma0_c0(28))); + u0_m0_wo0_cma0_r(29) <= u0_m0_wo0_cma0_k29(TO_INTEGER(u0_m0_wo0_cma0_c0(29))); + u0_m0_wo0_cma0_r(30) <= u0_m0_wo0_cma0_k30(TO_INTEGER(u0_m0_wo0_cma0_c0(30))); + u0_m0_wo0_cma0_r(31) <= u0_m0_wo0_cma0_k31(TO_INTEGER(u0_m0_wo0_cma0_c0(31))); + u0_m0_wo0_cma0_p(0) <= u0_m0_wo0_cma0_a0(0) * u0_m0_wo0_cma0_r(0); + u0_m0_wo0_cma0_p(1) <= u0_m0_wo0_cma0_a0(1) * u0_m0_wo0_cma0_r(1); + u0_m0_wo0_cma0_p(2) <= u0_m0_wo0_cma0_a0(2) * u0_m0_wo0_cma0_r(2); + u0_m0_wo0_cma0_p(3) <= u0_m0_wo0_cma0_a0(3) * u0_m0_wo0_cma0_r(3); + u0_m0_wo0_cma0_p(4) <= u0_m0_wo0_cma0_a0(4) * u0_m0_wo0_cma0_r(4); + u0_m0_wo0_cma0_p(5) <= u0_m0_wo0_cma0_a0(5) * u0_m0_wo0_cma0_r(5); + u0_m0_wo0_cma0_p(6) <= u0_m0_wo0_cma0_a0(6) * u0_m0_wo0_cma0_r(6); + u0_m0_wo0_cma0_p(7) <= u0_m0_wo0_cma0_a0(7) * u0_m0_wo0_cma0_r(7); + u0_m0_wo0_cma0_p(8) <= u0_m0_wo0_cma0_a0(8) * u0_m0_wo0_cma0_r(8); + u0_m0_wo0_cma0_p(9) <= u0_m0_wo0_cma0_a0(9) * u0_m0_wo0_cma0_r(9); + u0_m0_wo0_cma0_p(10) <= u0_m0_wo0_cma0_a0(10) * u0_m0_wo0_cma0_r(10); + u0_m0_wo0_cma0_p(11) <= u0_m0_wo0_cma0_a0(11) * u0_m0_wo0_cma0_r(11); + u0_m0_wo0_cma0_p(12) <= u0_m0_wo0_cma0_a0(12) * u0_m0_wo0_cma0_r(12); + u0_m0_wo0_cma0_p(13) <= u0_m0_wo0_cma0_a0(13) * u0_m0_wo0_cma0_r(13); + u0_m0_wo0_cma0_p(14) <= u0_m0_wo0_cma0_a0(14) * u0_m0_wo0_cma0_r(14); + u0_m0_wo0_cma0_p(15) <= u0_m0_wo0_cma0_a0(15) * u0_m0_wo0_cma0_r(15); + u0_m0_wo0_cma0_p(16) <= u0_m0_wo0_cma0_a0(16) * u0_m0_wo0_cma0_r(16); + u0_m0_wo0_cma0_p(17) <= u0_m0_wo0_cma0_a0(17) * u0_m0_wo0_cma0_r(17); + u0_m0_wo0_cma0_p(18) <= u0_m0_wo0_cma0_a0(18) * u0_m0_wo0_cma0_r(18); + u0_m0_wo0_cma0_p(19) <= u0_m0_wo0_cma0_a0(19) * u0_m0_wo0_cma0_r(19); + u0_m0_wo0_cma0_p(20) <= u0_m0_wo0_cma0_a0(20) * u0_m0_wo0_cma0_r(20); + u0_m0_wo0_cma0_p(21) <= u0_m0_wo0_cma0_a0(21) * u0_m0_wo0_cma0_r(21); + u0_m0_wo0_cma0_p(22) <= u0_m0_wo0_cma0_a0(22) * u0_m0_wo0_cma0_r(22); + u0_m0_wo0_cma0_p(23) <= u0_m0_wo0_cma0_a0(23) * u0_m0_wo0_cma0_r(23); + u0_m0_wo0_cma0_p(24) <= u0_m0_wo0_cma0_a0(24) * u0_m0_wo0_cma0_r(24); + u0_m0_wo0_cma0_p(25) <= u0_m0_wo0_cma0_a0(25) * u0_m0_wo0_cma0_r(25); + u0_m0_wo0_cma0_p(26) <= u0_m0_wo0_cma0_a0(26) * u0_m0_wo0_cma0_r(26); + u0_m0_wo0_cma0_p(27) <= u0_m0_wo0_cma0_a0(27) * u0_m0_wo0_cma0_r(27); + u0_m0_wo0_cma0_p(28) <= u0_m0_wo0_cma0_a0(28) * u0_m0_wo0_cma0_r(28); + u0_m0_wo0_cma0_p(29) <= u0_m0_wo0_cma0_a0(29) * u0_m0_wo0_cma0_r(29); + u0_m0_wo0_cma0_p(30) <= u0_m0_wo0_cma0_a0(30) * u0_m0_wo0_cma0_r(30); + u0_m0_wo0_cma0_p(31) <= u0_m0_wo0_cma0_a0(31) * u0_m0_wo0_cma0_r(31); + u0_m0_wo0_cma0_u(0) <= RESIZE(u0_m0_wo0_cma0_p(0),36); + u0_m0_wo0_cma0_u(1) <= RESIZE(u0_m0_wo0_cma0_p(1),36); + u0_m0_wo0_cma0_u(2) <= RESIZE(u0_m0_wo0_cma0_p(2),36); + u0_m0_wo0_cma0_u(3) <= RESIZE(u0_m0_wo0_cma0_p(3),36); + u0_m0_wo0_cma0_u(4) <= RESIZE(u0_m0_wo0_cma0_p(4),36); + u0_m0_wo0_cma0_u(5) <= RESIZE(u0_m0_wo0_cma0_p(5),36); + u0_m0_wo0_cma0_u(6) <= RESIZE(u0_m0_wo0_cma0_p(6),36); + u0_m0_wo0_cma0_u(7) <= RESIZE(u0_m0_wo0_cma0_p(7),36); + u0_m0_wo0_cma0_u(8) <= RESIZE(u0_m0_wo0_cma0_p(8),36); + u0_m0_wo0_cma0_u(9) <= RESIZE(u0_m0_wo0_cma0_p(9),36); + u0_m0_wo0_cma0_u(10) <= RESIZE(u0_m0_wo0_cma0_p(10),36); + u0_m0_wo0_cma0_u(11) <= RESIZE(u0_m0_wo0_cma0_p(11),36); + u0_m0_wo0_cma0_u(12) <= RESIZE(u0_m0_wo0_cma0_p(12),36); + u0_m0_wo0_cma0_u(13) <= RESIZE(u0_m0_wo0_cma0_p(13),36); + u0_m0_wo0_cma0_u(14) <= RESIZE(u0_m0_wo0_cma0_p(14),36); + u0_m0_wo0_cma0_u(15) <= RESIZE(u0_m0_wo0_cma0_p(15),36); + u0_m0_wo0_cma0_u(16) <= RESIZE(u0_m0_wo0_cma0_p(16),36); + u0_m0_wo0_cma0_u(17) <= RESIZE(u0_m0_wo0_cma0_p(17),36); + u0_m0_wo0_cma0_u(18) <= RESIZE(u0_m0_wo0_cma0_p(18),36); + u0_m0_wo0_cma0_u(19) <= RESIZE(u0_m0_wo0_cma0_p(19),36); + u0_m0_wo0_cma0_u(20) <= RESIZE(u0_m0_wo0_cma0_p(20),36); + u0_m0_wo0_cma0_u(21) <= RESIZE(u0_m0_wo0_cma0_p(21),36); + u0_m0_wo0_cma0_u(22) <= RESIZE(u0_m0_wo0_cma0_p(22),36); + u0_m0_wo0_cma0_u(23) <= RESIZE(u0_m0_wo0_cma0_p(23),36); + u0_m0_wo0_cma0_u(24) <= RESIZE(u0_m0_wo0_cma0_p(24),36); + u0_m0_wo0_cma0_u(25) <= RESIZE(u0_m0_wo0_cma0_p(25),36); + u0_m0_wo0_cma0_u(26) <= RESIZE(u0_m0_wo0_cma0_p(26),36); + u0_m0_wo0_cma0_u(27) <= RESIZE(u0_m0_wo0_cma0_p(27),36); + u0_m0_wo0_cma0_u(28) <= RESIZE(u0_m0_wo0_cma0_p(28),36); + u0_m0_wo0_cma0_u(29) <= RESIZE(u0_m0_wo0_cma0_p(29),36); + u0_m0_wo0_cma0_u(30) <= RESIZE(u0_m0_wo0_cma0_p(30),36); + u0_m0_wo0_cma0_u(31) <= RESIZE(u0_m0_wo0_cma0_p(31),36); + u0_m0_wo0_cma0_w(0) <= u0_m0_wo0_cma0_u(0); + u0_m0_wo0_cma0_w(1) <= u0_m0_wo0_cma0_u(1); + u0_m0_wo0_cma0_w(2) <= u0_m0_wo0_cma0_u(2); + u0_m0_wo0_cma0_w(3) <= u0_m0_wo0_cma0_u(3); + u0_m0_wo0_cma0_w(4) <= u0_m0_wo0_cma0_u(4); + u0_m0_wo0_cma0_w(5) <= u0_m0_wo0_cma0_u(5); + u0_m0_wo0_cma0_w(6) <= u0_m0_wo0_cma0_u(6); + u0_m0_wo0_cma0_w(7) <= u0_m0_wo0_cma0_u(7); + u0_m0_wo0_cma0_w(8) <= u0_m0_wo0_cma0_u(8); + u0_m0_wo0_cma0_w(9) <= u0_m0_wo0_cma0_u(9); + u0_m0_wo0_cma0_w(10) <= u0_m0_wo0_cma0_u(10); + u0_m0_wo0_cma0_w(11) <= u0_m0_wo0_cma0_u(11); + u0_m0_wo0_cma0_w(12) <= u0_m0_wo0_cma0_u(12); + u0_m0_wo0_cma0_w(13) <= u0_m0_wo0_cma0_u(13); + u0_m0_wo0_cma0_w(14) <= u0_m0_wo0_cma0_u(14); + u0_m0_wo0_cma0_w(15) <= u0_m0_wo0_cma0_u(15); + u0_m0_wo0_cma0_w(16) <= u0_m0_wo0_cma0_u(16); + u0_m0_wo0_cma0_w(17) <= u0_m0_wo0_cma0_u(17); + u0_m0_wo0_cma0_w(18) <= u0_m0_wo0_cma0_u(18); + u0_m0_wo0_cma0_w(19) <= u0_m0_wo0_cma0_u(19); + u0_m0_wo0_cma0_w(20) <= u0_m0_wo0_cma0_u(20); + u0_m0_wo0_cma0_w(21) <= u0_m0_wo0_cma0_u(21); + u0_m0_wo0_cma0_w(22) <= u0_m0_wo0_cma0_u(22); + u0_m0_wo0_cma0_w(23) <= u0_m0_wo0_cma0_u(23); + u0_m0_wo0_cma0_w(24) <= u0_m0_wo0_cma0_u(24); + u0_m0_wo0_cma0_w(25) <= u0_m0_wo0_cma0_u(25); + u0_m0_wo0_cma0_w(26) <= u0_m0_wo0_cma0_u(26); + u0_m0_wo0_cma0_w(27) <= u0_m0_wo0_cma0_u(27); + u0_m0_wo0_cma0_w(28) <= u0_m0_wo0_cma0_u(28); + u0_m0_wo0_cma0_w(29) <= u0_m0_wo0_cma0_u(29); + u0_m0_wo0_cma0_w(30) <= u0_m0_wo0_cma0_u(30); + u0_m0_wo0_cma0_w(31) <= u0_m0_wo0_cma0_u(31); + u0_m0_wo0_cma0_x(0) <= u0_m0_wo0_cma0_w(0); + u0_m0_wo0_cma0_x(1) <= u0_m0_wo0_cma0_w(1); + u0_m0_wo0_cma0_x(2) <= u0_m0_wo0_cma0_w(2); + u0_m0_wo0_cma0_x(3) <= u0_m0_wo0_cma0_w(3); + u0_m0_wo0_cma0_x(4) <= u0_m0_wo0_cma0_w(4); + u0_m0_wo0_cma0_x(5) <= u0_m0_wo0_cma0_w(5); + u0_m0_wo0_cma0_x(6) <= u0_m0_wo0_cma0_w(6); + u0_m0_wo0_cma0_x(7) <= u0_m0_wo0_cma0_w(7); + u0_m0_wo0_cma0_x(8) <= u0_m0_wo0_cma0_w(8); + u0_m0_wo0_cma0_x(9) <= u0_m0_wo0_cma0_w(9); + u0_m0_wo0_cma0_x(10) <= u0_m0_wo0_cma0_w(10); + u0_m0_wo0_cma0_x(11) <= u0_m0_wo0_cma0_w(11); + u0_m0_wo0_cma0_x(12) <= u0_m0_wo0_cma0_w(12); + u0_m0_wo0_cma0_x(13) <= u0_m0_wo0_cma0_w(13); + u0_m0_wo0_cma0_x(14) <= u0_m0_wo0_cma0_w(14); + u0_m0_wo0_cma0_x(15) <= u0_m0_wo0_cma0_w(15); + u0_m0_wo0_cma0_x(16) <= u0_m0_wo0_cma0_w(16); + u0_m0_wo0_cma0_x(17) <= u0_m0_wo0_cma0_w(17); + u0_m0_wo0_cma0_x(18) <= u0_m0_wo0_cma0_w(18); + u0_m0_wo0_cma0_x(19) <= u0_m0_wo0_cma0_w(19); + u0_m0_wo0_cma0_x(20) <= u0_m0_wo0_cma0_w(20); + u0_m0_wo0_cma0_x(21) <= u0_m0_wo0_cma0_w(21); + u0_m0_wo0_cma0_x(22) <= u0_m0_wo0_cma0_w(22); + u0_m0_wo0_cma0_x(23) <= u0_m0_wo0_cma0_w(23); + u0_m0_wo0_cma0_x(24) <= u0_m0_wo0_cma0_w(24); + u0_m0_wo0_cma0_x(25) <= u0_m0_wo0_cma0_w(25); + u0_m0_wo0_cma0_x(26) <= u0_m0_wo0_cma0_w(26); + u0_m0_wo0_cma0_x(27) <= u0_m0_wo0_cma0_w(27); + u0_m0_wo0_cma0_x(28) <= u0_m0_wo0_cma0_w(28); + u0_m0_wo0_cma0_x(29) <= u0_m0_wo0_cma0_w(29); + u0_m0_wo0_cma0_x(30) <= u0_m0_wo0_cma0_w(30); + u0_m0_wo0_cma0_x(31) <= u0_m0_wo0_cma0_w(31); + u0_m0_wo0_cma0_y(0) <= u0_m0_wo0_cma0_s(1) + u0_m0_wo0_cma0_x(0); + u0_m0_wo0_cma0_y(1) <= u0_m0_wo0_cma0_s(2) + u0_m0_wo0_cma0_x(1); + u0_m0_wo0_cma0_y(2) <= u0_m0_wo0_cma0_s(3) + u0_m0_wo0_cma0_x(2); + u0_m0_wo0_cma0_y(3) <= u0_m0_wo0_cma0_s(4) + u0_m0_wo0_cma0_x(3); + u0_m0_wo0_cma0_y(4) <= u0_m0_wo0_cma0_s(5) + u0_m0_wo0_cma0_x(4); + u0_m0_wo0_cma0_y(5) <= u0_m0_wo0_cma0_s(6) + u0_m0_wo0_cma0_x(5); + u0_m0_wo0_cma0_y(6) <= u0_m0_wo0_cma0_s(7) + u0_m0_wo0_cma0_x(6); + u0_m0_wo0_cma0_y(7) <= u0_m0_wo0_cma0_s(8) + u0_m0_wo0_cma0_x(7); + u0_m0_wo0_cma0_y(8) <= u0_m0_wo0_cma0_s(9) + u0_m0_wo0_cma0_x(8); + u0_m0_wo0_cma0_y(9) <= u0_m0_wo0_cma0_s(10) + u0_m0_wo0_cma0_x(9); + u0_m0_wo0_cma0_y(10) <= u0_m0_wo0_cma0_s(11) + u0_m0_wo0_cma0_x(10); + u0_m0_wo0_cma0_y(11) <= u0_m0_wo0_cma0_s(12) + u0_m0_wo0_cma0_x(11); + u0_m0_wo0_cma0_y(12) <= u0_m0_wo0_cma0_s(13) + u0_m0_wo0_cma0_x(12); + u0_m0_wo0_cma0_y(13) <= u0_m0_wo0_cma0_s(14) + u0_m0_wo0_cma0_x(13); + u0_m0_wo0_cma0_y(14) <= u0_m0_wo0_cma0_s(15) + u0_m0_wo0_cma0_x(14); + u0_m0_wo0_cma0_y(15) <= u0_m0_wo0_cma0_s(16) + u0_m0_wo0_cma0_x(15); + u0_m0_wo0_cma0_y(16) <= u0_m0_wo0_cma0_s(17) + u0_m0_wo0_cma0_x(16); + u0_m0_wo0_cma0_y(17) <= u0_m0_wo0_cma0_s(18) + u0_m0_wo0_cma0_x(17); + u0_m0_wo0_cma0_y(18) <= u0_m0_wo0_cma0_s(19) + u0_m0_wo0_cma0_x(18); + u0_m0_wo0_cma0_y(19) <= u0_m0_wo0_cma0_s(20) + u0_m0_wo0_cma0_x(19); + u0_m0_wo0_cma0_y(20) <= u0_m0_wo0_cma0_s(21) + u0_m0_wo0_cma0_x(20); + u0_m0_wo0_cma0_y(21) <= u0_m0_wo0_cma0_s(22) + u0_m0_wo0_cma0_x(21); + u0_m0_wo0_cma0_y(22) <= u0_m0_wo0_cma0_s(23) + u0_m0_wo0_cma0_x(22); + u0_m0_wo0_cma0_y(23) <= u0_m0_wo0_cma0_s(24) + u0_m0_wo0_cma0_x(23); + u0_m0_wo0_cma0_y(24) <= u0_m0_wo0_cma0_s(25) + u0_m0_wo0_cma0_x(24); + u0_m0_wo0_cma0_y(25) <= u0_m0_wo0_cma0_s(26) + u0_m0_wo0_cma0_x(25); + u0_m0_wo0_cma0_y(26) <= u0_m0_wo0_cma0_s(27) + u0_m0_wo0_cma0_x(26); + u0_m0_wo0_cma0_y(27) <= u0_m0_wo0_cma0_s(28) + u0_m0_wo0_cma0_x(27); + u0_m0_wo0_cma0_y(28) <= u0_m0_wo0_cma0_s(29) + u0_m0_wo0_cma0_x(28); + u0_m0_wo0_cma0_y(29) <= u0_m0_wo0_cma0_s(30) + u0_m0_wo0_cma0_x(29); + u0_m0_wo0_cma0_y(30) <= u0_m0_wo0_cma0_s(31) + u0_m0_wo0_cma0_x(30); + u0_m0_wo0_cma0_y(31) <= u0_m0_wo0_cma0_x(31); + u0_m0_wo0_cma0_chainmultadd_input: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_cma0_a0 <= (others => (others => '0')); + u0_m0_wo0_cma0_c0 <= (others => (others => '0')); + ELSIF (clk'EVENT AND clk = '1') THEN + IF (u0_m0_wo0_cma0_ena0 = '1') THEN + u0_m0_wo0_cma0_a0(0) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(1) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(2) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(3) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(4) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(5) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(6) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(7) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(8) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(9) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(10) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(11) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(12) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(13) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(14) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(15) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(16) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(17) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(18) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(19) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(20) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(21) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(22) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(23) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(24) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(25) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(26) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(27) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(28) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(29) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(30) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_a0(31) <= RESIZE(SIGNED(xIn_0),16); + u0_m0_wo0_cma0_c0(0) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(1) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(2) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(3) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(4) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(5) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(6) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(7) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(8) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(9) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(10) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(11) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(12) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(13) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(14) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(15) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(16) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(17) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(18) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(19) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(20) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(21) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(22) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(23) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(24) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(25) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(26) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(27) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(28) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(29) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(30) <= RESIZE(UNSIGNED(GND_q),3); + u0_m0_wo0_cma0_c0(31) <= RESIZE(UNSIGNED(GND_q),3); + END IF; + END IF; + END PROCESS; + u0_m0_wo0_cma0_chainmultadd_output: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_cma0_s <= (others => (others => '0')); + ELSIF (clk'EVENT AND clk = '1') THEN + IF (u0_m0_wo0_cma0_ena1 = '1') THEN + u0_m0_wo0_cma0_s(0) <= u0_m0_wo0_cma0_y(0); + u0_m0_wo0_cma0_s(1) <= u0_m0_wo0_cma0_y(1); + u0_m0_wo0_cma0_s(2) <= u0_m0_wo0_cma0_y(2); + u0_m0_wo0_cma0_s(3) <= u0_m0_wo0_cma0_y(3); + u0_m0_wo0_cma0_s(4) <= u0_m0_wo0_cma0_y(4); + u0_m0_wo0_cma0_s(5) <= u0_m0_wo0_cma0_y(5); + u0_m0_wo0_cma0_s(6) <= u0_m0_wo0_cma0_y(6); + u0_m0_wo0_cma0_s(7) <= u0_m0_wo0_cma0_y(7); + u0_m0_wo0_cma0_s(8) <= u0_m0_wo0_cma0_y(8); + u0_m0_wo0_cma0_s(9) <= u0_m0_wo0_cma0_y(9); + u0_m0_wo0_cma0_s(10) <= u0_m0_wo0_cma0_y(10); + u0_m0_wo0_cma0_s(11) <= u0_m0_wo0_cma0_y(11); + u0_m0_wo0_cma0_s(12) <= u0_m0_wo0_cma0_y(12); + u0_m0_wo0_cma0_s(13) <= u0_m0_wo0_cma0_y(13); + u0_m0_wo0_cma0_s(14) <= u0_m0_wo0_cma0_y(14); + u0_m0_wo0_cma0_s(15) <= u0_m0_wo0_cma0_y(15); + u0_m0_wo0_cma0_s(16) <= u0_m0_wo0_cma0_y(16); + u0_m0_wo0_cma0_s(17) <= u0_m0_wo0_cma0_y(17); + u0_m0_wo0_cma0_s(18) <= u0_m0_wo0_cma0_y(18); + u0_m0_wo0_cma0_s(19) <= u0_m0_wo0_cma0_y(19); + u0_m0_wo0_cma0_s(20) <= u0_m0_wo0_cma0_y(20); + u0_m0_wo0_cma0_s(21) <= u0_m0_wo0_cma0_y(21); + u0_m0_wo0_cma0_s(22) <= u0_m0_wo0_cma0_y(22); + u0_m0_wo0_cma0_s(23) <= u0_m0_wo0_cma0_y(23); + u0_m0_wo0_cma0_s(24) <= u0_m0_wo0_cma0_y(24); + u0_m0_wo0_cma0_s(25) <= u0_m0_wo0_cma0_y(25); + u0_m0_wo0_cma0_s(26) <= u0_m0_wo0_cma0_y(26); + u0_m0_wo0_cma0_s(27) <= u0_m0_wo0_cma0_y(27); + u0_m0_wo0_cma0_s(28) <= u0_m0_wo0_cma0_y(28); + u0_m0_wo0_cma0_s(29) <= u0_m0_wo0_cma0_y(29); + u0_m0_wo0_cma0_s(30) <= u0_m0_wo0_cma0_y(30); + u0_m0_wo0_cma0_s(31) <= u0_m0_wo0_cma0_y(31); + END IF; + END IF; + END PROCESS; + u0_m0_wo0_cma0_delay : dspba_delay + GENERIC MAP ( width => 36, depth => 0, reset_kind => "ASYNC" ) + PORT MAP ( xin => STD_LOGIC_VECTOR(u0_m0_wo0_cma0_s(0)(35 downto 0)), xout => u0_m0_wo0_cma0_qq, clk => clk, aclr => areset ); + u0_m0_wo0_cma0_q <= STD_LOGIC_VECTOR(u0_m0_wo0_cma0_qq(35 downto 0)); + + -- u0_m0_wo0_mtree_add0_0(ADD,106)@12 + 1 + u0_m0_wo0_mtree_add0_0_a <= STD_LOGIC_VECTOR(STD_LOGIC_VECTOR((36 downto 36 => u0_m0_wo0_cma0_q(35)) & u0_m0_wo0_cma0_q)); + u0_m0_wo0_mtree_add0_0_b <= STD_LOGIC_VECTOR(STD_LOGIC_VECTOR((36 downto 34 => u0_m0_wo0_cma1_q(33)) & u0_m0_wo0_cma1_q)); + u0_m0_wo0_mtree_add0_0_clkproc: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_mtree_add0_0_o <= (others => '0'); + ELSIF (clk'EVENT AND clk = '1') THEN + u0_m0_wo0_mtree_add0_0_o <= STD_LOGIC_VECTOR(SIGNED(u0_m0_wo0_mtree_add0_0_a) + SIGNED(u0_m0_wo0_mtree_add0_0_b)); + END IF; + END PROCESS; + u0_m0_wo0_mtree_add0_0_q <= u0_m0_wo0_mtree_add0_0_o(36 downto 0); + + -- GND(CONSTANT,0)@0 + GND_q <= "0"; + + -- d_u0_m0_wo0_compute_q_12(DELAY,114)@11 + 1 + d_u0_m0_wo0_compute_q_12 : dspba_delay + GENERIC MAP ( width => 1, depth => 1, reset_kind => "ASYNC" ) + PORT MAP ( xin => d_u0_m0_wo0_compute_q_11_q, xout => d_u0_m0_wo0_compute_q_12_q, clk => clk, aclr => areset ); + + -- u0_m0_wo0_oseq_gated_reg(REG,107)@12 + 1 + u0_m0_wo0_oseq_gated_reg_clkproc: PROCESS (clk, areset) + BEGIN + IF (areset = '1') THEN + u0_m0_wo0_oseq_gated_reg_q <= "0"; + ELSIF (clk'EVENT AND clk = '1') THEN + u0_m0_wo0_oseq_gated_reg_q <= STD_LOGIC_VECTOR(d_u0_m0_wo0_compute_q_12_q); + END IF; + END PROCESS; + + -- out0_m0_wo0_lineup_select_delay_0(DELAY,109)@13 + out0_m0_wo0_lineup_select_delay_0_q <= STD_LOGIC_VECTOR(u0_m0_wo0_oseq_gated_reg_q); + + -- out0_m0_wo0_assign_id3(DELAY,111)@13 + out0_m0_wo0_assign_id3_q <= STD_LOGIC_VECTOR(out0_m0_wo0_lineup_select_delay_0_q); + + -- xOut(PORTOUT,112)@13 + 1 + xOut_v <= out0_m0_wo0_assign_id3_q; + xOut_c <= STD_LOGIC_VECTOR("0000000" & GND_q); + xOut_0 <= u0_m0_wo0_mtree_add0_0_q; + +END normal; diff --git a/ld3/dds_vhdl/fir_import_coef.txt b/ld3/dds_vhdl/fir_import_coef.txt new file mode 100644 index 0000000..cb3696d --- /dev/null +++ b/ld3/dds_vhdl/fir_import_coef.txt @@ -0,0 +1,3 @@ +# banks: 1 +# coeffs: 41 +-0.0073 , -0.0071 , -0.0059 , -0.0024 , 0.0040 , 0.0132 , 0.0231 , 0.0301 , 0.0302 , 0.0207 , 0.0015 , -0.0242 , -0.0498 , -0.0677 , -0.0712 , -0.0571 , -0.0269 , 0.0129 , 0.0525 , 0.0814 , 0.0920 , 0.0814 , 0.0525 , 0.0129 , -0.0269 , -0.0571 , -0.0712 , -0.0677 , -0.0498 , -0.0242 , 0.0015 , 0.0207 , 0.0302 , 0.0301 , 0.0231 , 0.0132 , 0.0040 , -0.0024 , -0.0059 , -0.0071 , -0.0073 \ No newline at end of file diff --git a/ld3/dds_vhdl/fir_sim.f b/ld3/dds_vhdl/fir_sim.f new file mode 100644 index 0000000..7210ba1 --- /dev/null +++ b/ld3/dds_vhdl/fir_sim.f @@ -0,0 +1,20 @@ +fir_sim/dspba_library_package.vhd +fir_sim/dspba_library.vhd +fir_sim/auk_dspip_math_pkg_hpfir.vhd +fir_sim/auk_dspip_lib_pkg_hpfir.vhd +fir_sim/auk_dspip_avalon_streaming_controller_hpfir.vhd +fir_sim/auk_dspip_avalon_streaming_sink_hpfir.vhd +fir_sim/auk_dspip_avalon_streaming_source_hpfir.vhd +fir_sim/auk_dspip_roundsat_hpfir.vhd +fir_sim/altera_avalon_sc_fifo.v +fir_sim/fir_rtl_core.vhd +fir_sim/fir_ast.vhd +fir_sim/fir.vhd +fir_sim/fir_nativelink.tcl +fir_sim/fir_msim.tcl +fir_sim/fir_tb.vhd +fir_sim/fir_mlab.m +fir_sim/fir_model.m +fir_sim/fir_coef_int.txt +fir_sim/fir_input.txt +fir_sim/fir_param.txt diff --git a/ld3/dds_vhdl/fir_sim/aldec/rivierapro_setup.tcl b/ld3/dds_vhdl/fir_sim/aldec/rivierapro_setup.tcl new file mode 100644 index 0000000..04dced2 --- /dev/null +++ b/ld3/dds_vhdl/fir_sim/aldec/rivierapro_setup.tcl @@ -0,0 +1,319 @@ + +# (C) 2001-2020 Altera Corporation. All rights reserved. +# Your use of Altera Corporation's design tools, logic functions and +# other software and tools, and its AMPP partner logic functions, and +# any output files 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 Altera +# Program License Subscription Agreement, Altera 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 Altera and sold by Altera +# or its authorized distributors. Please refer to the applicable +# agreement for further details. + +# ACDS 19.1 670 win32 2020.06.09.18:16:15 +# ---------------------------------------- +# Auto-generated simulation script rivierapro_setup.tcl +# ---------------------------------------- +# This script provides commands to simulate the following IP detected in +# your Quartus project: +# fir +# +# Altera recommends that you source this Quartus-generated IP simulation +# script from your own customized top-level script, and avoid editing this +# generated script. +# +# To write a top-level script that compiles Altera simulation libraries and +# the Quartus-generated IP in your project, along with your design and +# testbench files, copy the text from the TOP-LEVEL TEMPLATE section below +# into a new file, e.g. named "aldec.do", and modify the text as directed. +# +# ---------------------------------------- +# # TOP-LEVEL TEMPLATE - BEGIN +# # +# # QSYS_SIMDIR is used in the Quartus-generated IP simulation script to +# # construct paths to the files required to simulate the IP in your Quartus +# # project. By default, the IP script assumes that you are launching the +# # simulator from the IP script location. If launching from another +# # location, set QSYS_SIMDIR to the output directory you specified when you +# # generated the IP script, relative to the directory from which you launch +# # the simulator. +# # +# set QSYS_SIMDIR + + + + + + + + + + + +
+
+
+

HDL Code Generation Check Report for 'ld3_fixed_point2/IIF' +open model 'ld3_fixed_point2/IIF'
+Generated on 2020-06-09 21:58:09

+

HDL check for 'ld3_fixed_point2' complete with 1 errors, 2 warnings, and 1 messages.


+

The following table describes blocks for which errors, warnings or messages were reported.


+ + + + + + + + + + + + + + + + + +
Simulink Blocks and resources Level Description
+ld3_fixed_point2 +ErrorDelay balancing unsuccessful because Signal rate of value 0 found. +Offending Block:ld3_fixed_point2/IIF/.
+ld3_fixed_point2/IIF/a(2) +WarningUnable to insert required number of pipeline registers because the block, ld3_fixed_point2/IIF/a(2), is in a feedback path. Number of registers required: 2; number of registers inserted: 0.
+ld3_fixed_point2/IIF/a(3) +WarningUnable to insert required number of pipeline registers because the block, ld3_fixed_point2/IIF/a(3), is in a feedback path. Number of registers required: 2; number of registers inserted: 0.
+C:\Users\Imants\Desktop\sin_gen\iif_hdl\ld3_fixed_point2\highlightFeedbackLoop.m +MessageOne or more feedback loops in the model are inhibiting optimizations. To highlight these loops in your model, click the following MATLAB script: C:\Users\Imants\Desktop\sin_gen\iif_hdl\ld3_fixed_point2\highlightFeedbackLoop.m
+

+
+ +
+ + + + + diff --git a/ld3/iif_hdl/ld3_fixed_point2/clearhighlighting.m b/ld3/iif_hdl/ld3_fixed_point2/clearhighlighting.m new file mode 100644 index 0000000..2d326b9 --- /dev/null +++ b/ld3/iif_hdl/ld3_fixed_point2/clearhighlighting.m @@ -0,0 +1,2 @@ +SLStudio.Utils.RemoveHighlighting(get_param('ld3_fixed_point2', 'handle')); +SLStudio.Utils.RemoveHighlighting(get_param('gm_ld3_fixed_point2', 'handle')); diff --git a/ld3/iif_hdl/ld3_fixed_point2/gm_ld3_fixed_point2.slx b/ld3/iif_hdl/ld3_fixed_point2/gm_ld3_fixed_point2.slx new file mode 100644 index 0000000000000000000000000000000000000000..785e3a561c1f8ded614c6e6455b332dcb3c2dc5b GIT binary patch literal 31372 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%0Ae%p|Tyx$ZilVRRpi#=gU6X|XB-0rvI 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 LnjokD^Vk0X*iO+! literal 0 HcmV?d00001 diff --git a/ld3/ld3_fixed_point2.slx b/ld3/ld3_fixed_point2.slx new file mode 100644 index 0000000000000000000000000000000000000000..68c146fe8bc9abdb7ff9e4096a16a1af2abb26fe GIT binary patch literal 25313 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

cV#f0JgIcbr7&U${}Z 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 He`@~+h!bZb delta 5534 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 x"0000", + 1 => x"00c9", + 2 => x"0192", + 3 => x"025b", + 4 => x"0324", + 5 => x"03ed", + 6 => x"04b5", + 7 => x"057e", + 8 => x"0646", + 9 => x"070e", + 10 => x"07d6", + 11 => x"089d", + 12 => x"0964", + 13 => x"0a2b", + 14 => x"0af1", + 15 => x"0bb7", + 16 => x"0c7c", + 17 => x"0d41", + 18 => x"0e06", + 19 => x"0eca", + 20 => x"0f8d", + 21 => x"1050", + 22 => x"1112", + 23 => x"11d3", + 24 => x"1294", + 25 => x"1354", + 26 => x"1413", + 27 => x"14d2", + 28 => x"1590", + 29 => x"164d", + 30 => x"1709", + 31 => x"17c4", + 32 => x"187e", + 33 => x"1937", + 34 => x"19f0", + 35 => x"1aa7", + 36 => x"1b5d", + 37 => x"1c12", + 38 => x"1cc7", + 39 => x"1d7a", + 40 => x"1e2b", + 41 => x"1edc", + 42 => x"1f8c", + 43 => x"203a", + 44 => x"20e7", + 45 => x"2193", + 46 => x"223e", + 47 => x"22e7", + 48 => x"238f", + 49 => x"2435", + 50 => x"24da", + 51 => x"257e", + 52 => x"2620", + 53 => x"26c1", + 54 => x"2760", + 55 => x"27fe", + 56 => x"289a", + 57 => x"2935", + 58 => x"29ce", + 59 => x"2a65", + 60 => x"2afb", + 61 => x"2b8f", + 62 => x"2c22", + 63 => x"2cb2", + 64 => x"2d41", + 65 => x"2dcf", + 66 => x"2e5a", + 67 => x"2ee4", + 68 => x"2f6c", + 69 => x"2ff2", + 70 => x"3076", + 71 => x"30f9", + 72 => x"3179", + 73 => x"31f8", + 74 => x"3274", + 75 => x"32ef", + 76 => x"3368", + 77 => x"33df", + 78 => x"3453", + 79 => x"34c6", + 80 => x"3537", + 81 => x"35a6", + 82 => x"3612", + 83 => x"367d", + 84 => x"36e5", + 85 => x"374b", + 86 => x"37b0", + 87 => x"3812", + 88 => x"3872", + 89 => x"38cf", + 90 => x"392b", + 91 => x"3984", + 92 => x"39db", + 93 => x"3a30", + 94 => x"3a83", + 95 => x"3ad3", + 96 => x"3b21", + 97 => x"3b6d", + 98 => x"3bb6", + 99 => x"3bfd", + 100 => x"3c42", + 101 => x"3c85", + 102 => x"3cc5", + 103 => x"3d03", + 104 => x"3d3f", + 105 => x"3d78", + 106 => x"3daf", + 107 => x"3de3", + 108 => x"3e15", + 109 => x"3e45", + 110 => x"3e72", + 111 => x"3e9d", + 112 => x"3ec5", + 113 => x"3eeb", + 114 => x"3f0f", + 115 => x"3f30", + 116 => x"3f4f", + 117 => x"3f6b", + 118 => x"3f85", + 119 => x"3f9c", + 120 => x"3fb1", + 121 => x"3fc4", + 122 => x"3fd4", + 123 => x"3fe1", + 124 => x"3fec", + 125 => x"3ff5", + 126 => x"3ffb", + 127 => x"3fff", + 128 => x"4000", + 129 => x"3fff", + 130 => x"3ffb", + 131 => x"3ff5", + 132 => x"3fec", + 133 => x"3fe1", + 134 => x"3fd4", + 135 => x"3fc4", + 136 => x"3fb1", + 137 => x"3f9c", + 138 => x"3f85", + 139 => x"3f6b", + 140 => x"3f4f", + 141 => x"3f30", + 142 => x"3f0f", + 143 => x"3eeb", + 144 => x"3ec5", + 145 => x"3e9d", + 146 => x"3e72", + 147 => x"3e45", + 148 => x"3e15", + 149 => x"3de3", + 150 => x"3daf", + 151 => x"3d78", + 152 => x"3d3f", + 153 => x"3d03", + 154 => x"3cc5", + 155 => x"3c85", + 156 => x"3c42", + 157 => x"3bfd", + 158 => x"3bb6", + 159 => x"3b6d", + 160 => x"3b21", + 161 => x"3ad3", + 162 => x"3a83", + 163 => x"3a30", + 164 => x"39db", + 165 => x"3984", + 166 => x"392b", + 167 => x"38cf", + 168 => x"3872", + 169 => x"3812", + 170 => x"37b0", + 171 => x"374b", + 172 => x"36e5", + 173 => x"367d", + 174 => x"3612", + 175 => x"35a6", + 176 => x"3537", + 177 => x"34c6", + 178 => x"3453", + 179 => x"33df", + 180 => x"3368", + 181 => x"32ef", + 182 => x"3274", + 183 => x"31f8", + 184 => x"3179", + 185 => x"30f9", + 186 => x"3076", + 187 => x"2ff2", + 188 => x"2f6c", + 189 => x"2ee4", + 190 => x"2e5a", + 191 => x"2dcf", + 192 => x"2d41", + 193 => x"2cb2", + 194 => x"2c22", + 195 => x"2b8f", + 196 => x"2afb", + 197 => x"2a65", + 198 => x"29ce", + 199 => x"2935", + 200 => x"289a", + 201 => x"27fe", + 202 => x"2760", + 203 => x"26c1", + 204 => x"2620", + 205 => x"257e", + 206 => x"24da", + 207 => x"2435", + 208 => x"238f", + 209 => x"22e7", + 210 => x"223e", + 211 => x"2193", + 212 => x"20e7", + 213 => x"203a", + 214 => x"1f8c", + 215 => x"1edc", + 216 => x"1e2b", + 217 => x"1d7a", + 218 => x"1cc7", + 219 => x"1c12", + 220 => x"1b5d", + 221 => x"1aa7", + 222 => x"19f0", + 223 => x"1937", + 224 => x"187e", + 225 => x"17c4", + 226 => x"1709", + 227 => x"164d", + 228 => x"1590", + 229 => x"14d2", + 230 => x"1413", + 231 => x"1354", + 232 => x"1294", + 233 => x"11d3", + 234 => x"1112", + 235 => x"1050", + 236 => x"0f8d", + 237 => x"0eca", + 238 => x"0e06", + 239 => x"0d41", + 240 => x"0c7c", + 241 => x"0bb7", + 242 => x"0af1", + 243 => x"0a2b", + 244 => x"0964", + 245 => x"089d", + 246 => x"07d6", + 247 => x"070e", + 248 => x"0646", + 249 => x"057e", + 250 => x"04b5", + 251 => x"03ed", + 252 => x"0324", + 253 => x"025b", + 254 => x"0192", + 255 => x"00c9", + 256 => x"0000", + 257 => x"ff37", + 258 => x"fe6e", + 259 => x"fda5", + 260 => x"fcdc", + 261 => x"fc13", + 262 => x"fb4b", + 263 => x"fa82", + 264 => x"f9ba", + 265 => x"f8f2", + 266 => x"f82b", + 267 => x"f763", + 268 => x"f69c", + 269 => x"f5d5", + 270 => x"f50f", + 271 => x"f449", + 272 => x"f384", + 273 => x"f2bf", + 274 => x"f1fa", + 275 => x"f136", + 276 => x"f073", + 277 => x"efb0", + 278 => x"eeee", + 279 => x"ee2d", + 280 => x"ed6c", + 281 => x"ecac", + 282 => x"ebed", + 283 => x"eb2e", + 284 => x"ea71", + 285 => x"e9b4", + 286 => x"e8f8", + 287 => x"e83c", + 288 => x"e782", + 289 => x"e6c9", + 290 => x"e611", + 291 => x"e559", + 292 => x"e4a3", + 293 => x"e3ee", + 294 => x"e33a", + 295 => x"e287", + 296 => x"e1d5", + 297 => x"e124", + 298 => x"e074", + 299 => x"dfc6", + 300 => x"df19", + 301 => x"de6d", + 302 => x"ddc3", + 303 => x"dd1a", + 304 => x"dc72", + 305 => x"dbcb", + 306 => x"db26", + 307 => x"da82", + 308 => x"d9e0", + 309 => x"d93f", + 310 => x"d8a0", + 311 => x"d802", + 312 => x"d766", + 313 => x"d6cc", + 314 => x"d633", + 315 => x"d59b", + 316 => x"d505", + 317 => x"d471", + 318 => x"d3df", + 319 => x"d34e", + 320 => x"d2bf", + 321 => x"d232", + 322 => x"d1a6", + 323 => x"d11c", + 324 => x"d094", + 325 => x"d00e", + 326 => x"cf8a", + 327 => x"cf08", + 328 => x"ce87", + 329 => x"ce09", + 330 => x"cd8c", + 331 => x"cd11", + 332 => x"cc98", + 333 => x"cc22", + 334 => x"cbad", + 335 => x"cb3a", + 336 => x"cac9", + 337 => x"ca5b", + 338 => x"c9ee", + 339 => x"c984", + 340 => x"c91b", + 341 => x"c8b5", + 342 => x"c851", + 343 => x"c7ef", + 344 => x"c78f", + 345 => x"c731", + 346 => x"c6d6", + 347 => x"c67c", + 348 => x"c625", + 349 => x"c5d0", + 350 => x"c57e", + 351 => x"c52d", + 352 => x"c4df", + 353 => x"c493", + 354 => x"c44a", + 355 => x"c403", + 356 => x"c3be", + 357 => x"c37b", + 358 => x"c33b", + 359 => x"c2fd", + 360 => x"c2c2", + 361 => x"c288", + 362 => x"c252", + 363 => x"c21d", + 364 => x"c1eb", + 365 => x"c1bb", + 366 => x"c18e", + 367 => x"c163", + 368 => x"c13b", + 369 => x"c115", + 370 => x"c0f1", + 371 => x"c0d0", + 372 => x"c0b1", + 373 => x"c095", + 374 => x"c07b", + 375 => x"c064", + 376 => x"c04f", + 377 => x"c03d", + 378 => x"c02d", + 379 => x"c01f", + 380 => x"c014", + 381 => x"c00b", + 382 => x"c005", + 383 => x"c001", + 384 => x"c000", + 385 => x"c001", + 386 => x"c005", + 387 => x"c00b", + 388 => x"c014", + 389 => x"c01f", + 390 => x"c02d", + 391 => x"c03d", + 392 => x"c04f", + 393 => x"c064", + 394 => x"c07b", + 395 => x"c095", + 396 => x"c0b1", + 397 => x"c0d0", + 398 => x"c0f1", + 399 => x"c115", + 400 => x"c13b", + 401 => x"c163", + 402 => x"c18e", + 403 => x"c1bb", + 404 => x"c1eb", + 405 => x"c21d", + 406 => x"c252", + 407 => x"c288", + 408 => x"c2c2", + 409 => x"c2fd", + 410 => x"c33b", + 411 => x"c37b", + 412 => x"c3be", + 413 => x"c403", + 414 => x"c44a", + 415 => x"c493", + 416 => x"c4df", + 417 => x"c52d", + 418 => x"c57e", + 419 => x"c5d0", + 420 => x"c625", + 421 => x"c67c", + 422 => x"c6d6", + 423 => x"c731", + 424 => x"c78f", + 425 => x"c7ef", + 426 => x"c851", + 427 => x"c8b5", + 428 => x"c91b", + 429 => x"c984", + 430 => x"c9ee", + 431 => x"ca5b", + 432 => x"cac9", + 433 => x"cb3a", + 434 => x"cbad", + 435 => x"cc22", + 436 => x"cc98", + 437 => x"cd11", + 438 => x"cd8c", + 439 => x"ce09", + 440 => x"ce87", + 441 => x"cf08", + 442 => x"cf8a", + 443 => x"d00e", + 444 => x"d094", + 445 => x"d11c", + 446 => x"d1a6", + 447 => x"d232", + 448 => x"d2bf", + 449 => x"d34e", + 450 => x"d3df", + 451 => x"d471", + 452 => x"d505", + 453 => x"d59b", + 454 => x"d633", + 455 => x"d6cc", + 456 => x"d766", + 457 => x"d802", + 458 => x"d8a0", + 459 => x"d93f", + 460 => x"d9e0", + 461 => x"da82", + 462 => x"db26", + 463 => x"dbcb", + 464 => x"dc72", + 465 => x"dd1a", + 466 => x"ddc3", + 467 => x"de6d", + 468 => x"df19", + 469 => x"dfc6", + 470 => x"e074", + 471 => x"e124", + 472 => x"e1d5", + 473 => x"e287", + 474 => x"e33a", + 475 => x"e3ee", + 476 => x"e4a3", + 477 => x"e559", + 478 => x"e611", + 479 => x"e6c9", + 480 => x"e782", + 481 => x"e83c", + 482 => x"e8f8", + 483 => x"e9b4", + 484 => x"ea71", + 485 => x"eb2e", + 486 => x"ebed", + 487 => x"ecac", + 488 => x"ed6c", + 489 => x"ee2d", + 490 => x"eeee", + 491 => x"efb0", + 492 => x"f073", + 493 => x"f136", + 494 => x"f1fa", + 495 => x"f2bf", + 496 => x"f384", + 497 => x"f449", + 498 => x"f50f", + 499 => x"f5d5", + 500 => x"f69c", + 501 => x"f763", + 502 => x"f82b", + 503 => x"f8f2", + 504 => x"f9ba", + 505 => x"fa82", + 506 => x"fb4b", + 507 => x"fc13", + 508 => x"fcdc", + 509 => x"fda5", + 510 => x"fe6e", + 511 => x"ff37", +); diff --git a/ld3/ls3_fixed_point.slx b/ld3/ls3_fixed_point.slx deleted file mode 100644 index e63dde622e0dbb262e6cd369c70c3f034638a3c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23930 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%0AYRta3VGw(J|V*H*&5vL#H5Ves} z$|kzg{f0qp>Dj|10#n86#O&DELn-~)ER7ydJ-h&4-Xn^pI#UQD++lOL94cFF=jAJ3B1U0DY12Mu+$-cZ^osT%tH!-g{E+boO9Ur+xUfLZ1I1+~k;l)kKn`o}(x~H=a?49w+uJTq$aRV6 za;aH>G&ebxTST1#Dj86n?_T%d z`+jo$>82O0t!>E2k<$kEKJQYiuB%a8^^{TvMLu|IJCt@%eX-z+Deok7NPLtP?|PC1 z27eDW)Y3V1bJc4^>y>LgA^mO+=%2J=3-M>|BYluHt9XOMT2$#4{IT77&Bie^91R#Z&&MM?c4 zST5VuZQa{J(3t8w>fSvp{Bouq*P)x%fnW~_K#gC?h2ZY)?%eosXeo_^vMS#;1IEIT z#IkzZ=e5PIPqP)fy_h&N)hCBa z;t!3UfSsKN`Ga?cj|VYB@KIQ^76LLhQ9yI98I{1RI@)sj@uJdw!m-vO4g#28y0F>I)&oyEx`SFSOspqCW|FnCjuhMK;n| zW2=WN)0zjF{XsSqbSkDDVnCoQ-C}I)8~{*3?SqLi356`=x8e6#h^a#t=8|OV&vC`x z5qNmWKCeQx=6+^JucoYgFC+DN*yN*ZG;Kpooi}d_f;*^P%WDcs8pjy|R8QF1E9y>Y zZ7 zP!Kk1Q{J3>@7a;|i11gRV&Yv&!vaR>6QjlOSxKlB@1s!Xo&sSyY%ZOvFH*E;#K)Dd z_#O3gxV5(N-UIq5^73C;8rs(dyQW~#k6-a z1Udy@R7|id$xm89{ZcB?+c5^d8R9u#N7`MwZG2iJ66Wz}%DB4_+jn4<1+*1puTZ($ zM^fz=l>!bbDj{b#qf0S0fzhC-(+WX+hpOH&z{h6=ZZ5(#KUZI$j#}jjUpQ}i|NX{4 zuk9eN@vgu$cg1G;??V5V(EWR*trC0f`=4M(nts@Uu+bF96O^^|);L@v4QSA$>ODNUZ&(m5aWzrXhL*8|>% zcdu)Cm!SJM5%Vrz&DGY<(%ezuPA_z~Hn+6;O)E@Dk+^$de3^5hh)Ia&JD8-`PM=+u zt;Mv_b3IG%=V{YZLm7FH*h2MCopwU`MDZY6&1>IA3lyv!V|MREL-roeF9lSJ6m3C1 zDcAPJCi14@bu-Ow*t0O)$^`sM5;=e*d!n1D-$X(OXoJ40`q7fW8nKXEW7c$LU%p*5 zlOV(xUH|i7r!VRmHbDIwW~M$F#%GYS@t6p%>N561O8#W9ko1BZZ&DR*KEW=X9#T!& zYyghWT%p@gIcH$6WVIAo0YNU5Vy|^%v9WZX^1aE**`)4<7YwSAR0@4aVP};!ubcA2_gy6(eaD)?XRT&&) x"%s",\n', i-1, hex_sin(i,1:word_lenght/4) ); end - fprintf(fid, '\tdefault : sin[data_width - 1 : 0] <= %d''b%s;\n ',word_lenght, hex_sin(1,1:word_lenght) ); - fprintf(fid, 'endcase\n'); - fprintf(fid, 'end\n'); - fprintf(fid, ' \n'); - fprintf(fid, 'always@* begin\n'); - fprintf(fid, 'case (phase[phase_width - 1 : 0])\n'); - -for i=1:length(hex_cos) - temp = hex_cos(i,1:word_lenght); - fprintf(fid, '\t%d''d%d : cos[data_width - 1 : 0] <= %d''b%s;\n',table_size, i-1 , word_lenght, hex_cos(i,1:word_lenght) ); -end - fprintf(fid, '\tdefault : cos[data_width - 1 : 0] <= %d''b%s;\n ',word_lenght, hex_cos(1,1:word_lenght) ); - fprintf(fid, 'endcase\n'); - fprintf(fid, 'end\n'); - fprintf(fid, 'endmodule'); + fprintf(fid, ');\n'); + disp('Text files write done');disp(' '); fclose(fid); \ No newline at end of file