Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 7.32 KB | None | 0 0
  1.  
  2. library ieee;
  3. use ieee.std_logic_1164.all;
  4. use ieee.numeric_std.all;
  5. use work.bspline_pckg.all;
  6.  
  7. entity farrow is
  8.  
  9.     generic(
  10.             Wi : natural;
  11.             Wa : natural;
  12.             Wc : natural;
  13.             Wm : natural;
  14.             Wo : natural
  15.             );
  16.     port(
  17.         clk : in std_logic;
  18.         rst : in std_logic;
  19.         mu  : in signed(Wm-1 downto 0);
  20.         data_in  : in signed(Wi-1 downto 0);
  21.         data_out : out signed(Wo-1 downto 0)
  22.         );
  23.  
  24. end entity;
  25.  
  26. architecture rtl of farrow is
  27.    
  28.     constant zeros : signed(Wa-Wi-1 downto 0) := (others => '0');
  29.    
  30.     signal reg : t_reg_f(0 to 21);
  31.     signal data_in_se : signed(Wa-1 downto 0);
  32.     signal farrow_coeffs : t_coeffs_f  := ("000101010101010101","010101010101010101");
  33.    
  34. begin
  35.  
  36.     --------------------------------------
  37.     ----------- sign extension -----------
  38.     --------------------------------------
  39.     data_in_se <= resize(data_in, Wa);
  40.    
  41.     --------------------------------------
  42.     ----------- delay registers ----------
  43.     --------------------------------------
  44.     process(clk) is
  45.     begin
  46.         if rising_edge(clk) then
  47.             if rst = '1' then
  48.                 reg(0) <= (others => '0');
  49.             else
  50.                 reg(0) <= data_in_se;
  51.             end if;
  52.         end if;
  53.     end process;
  54.    
  55.     process(clk) is
  56.     begin
  57.         if rising_edge(clk) then
  58.             if rst = '1' then
  59.                 reg(1) <= (others => '0');
  60.             else
  61.                 reg(1) <= reg(0);
  62.             end if;
  63.         end if;
  64.     end process;
  65.    
  66.     process(clk) is
  67.     begin
  68.         if rising_edge(clk) then
  69.             if rst = '1' then
  70.                 reg(2) <= (others => '0');
  71.             else
  72.                 reg(2) <= reg(1);
  73.             end if;
  74.         end if;
  75.     end process;
  76.    
  77.     --------------------------------------
  78.     ------------ C3(z) filter ------------
  79.     --------------------------------------
  80.     pmr_1:
  81.     component preadd_mult_round
  82.         generic map(
  83.                     Wa => Wa,
  84.                     Wb => Wa,
  85.                     Wc => Wc,
  86.                     Wo => Wa,
  87.                     round_mode => round_mode
  88.                     )
  89.         port map(
  90.                 clk => clk,
  91.                 rst => rst,
  92.                 addsub => '0',
  93.                 a => data_in_se,
  94.                 b => reg(2),
  95.                 c => farrow_coeffs(0),
  96.                 p => reg(3)
  97.                 );
  98.                
  99.     ps_1:
  100.     component preadd_shift
  101.         generic map(
  102.                     S => 1,
  103.                     Wa => Wa
  104.                     )
  105.         port map(
  106.                 clk => clk,
  107.                 rst => rst,
  108.                 addsub => '0',
  109.                 a => reg(1),
  110.                 b => reg(0),
  111.                 p => reg(4)
  112.                 );
  113.                
  114.     vd_1:
  115.     component var_delay
  116.         generic map(
  117.                     D => 1,
  118.                     Wa => Wa
  119.                     )
  120.         port map(
  121.                 clk => clk,
  122.                 rst => rst,
  123.                 data_in  => reg(4),
  124.                 data_out => reg(5)
  125.                 );
  126.                
  127.     process(clk) is
  128.     begin
  129.         if rising_edge(clk) then
  130.             if rst = '1' then
  131.                 reg(6) <= (others => '0');
  132.             else
  133.                 reg(6) <= reg(3) + reg(5);      -- v3(n)
  134.             end if;
  135.         end if;
  136.     end process;
  137.    
  138.     --------------------------------------
  139.     ------------ C2(z) filter ------------
  140.     --------------------------------------
  141.     ps_2:
  142.     component preadd_shift
  143.         generic map(
  144.                     S => 1,
  145.                     Wa => Wa
  146.                     )
  147.         port map(
  148.                 clk => clk,
  149.                 rst => rst,
  150.                 addsub => '1',
  151.                 a => reg(0),
  152.                 b => reg(2),
  153.                 p => reg(7)
  154.                 );
  155.                
  156.     vd_2:
  157.     component var_delay
  158.         generic map(
  159.                     D => 2,
  160.                     Wa => Wa
  161.                     )
  162.         port map(
  163.                 clk => clk,
  164.                 rst => rst,
  165.                 data_in  => reg(1),
  166.                 data_out => reg(8)
  167.                 );
  168.                
  169.     process(clk) is
  170.     begin
  171.         if rising_edge(clk) then
  172.             if rst = '1' then
  173.                 reg(9) <= (others => '0');
  174.             else
  175.                 reg(9) <= reg(7) - reg(8);
  176.             end if;
  177.         end if;
  178.     end process;
  179.    
  180.     vd_3:
  181.     component var_delay
  182.         generic map(
  183.                     D => 1,
  184.                     Wa => Wa
  185.                     )
  186.         port map(
  187.                 clk => clk,
  188.                 rst => rst,
  189.                 data_in  => reg(9),
  190.                 data_out => reg(10)     -- v2(n)
  191.                 );
  192.                
  193.     --------------------------------------
  194.     ------------ C1(z) filter ------------
  195.     --------------------------------------
  196.     ps_3:
  197.     component preadd_shift
  198.         generic map(
  199.                     S => 1,
  200.                     Wa => Wa
  201.                     )
  202.         port map(
  203.                 clk => clk,
  204.                 rst => rst,
  205.                 addsub => '0',
  206.                 a => reg(0),
  207.                 b => reg(2),
  208.                 p => reg(11)
  209.                 );
  210.                
  211.     vd_4:
  212.     component var_delay
  213.         generic map(
  214.                     D => 2,
  215.                     Wa => Wa
  216.                     )
  217.         port map(
  218.                 clk => clk,
  219.                 rst => rst,
  220.                 data_in  => reg(11),
  221.                 data_out => reg(12)     -- v1(n)
  222.                 );
  223.                
  224.     --------------------------------------
  225.     ------------ C0(z) filter ------------
  226.     --------------------------------------
  227.     pmr_2:
  228.     component preadd_mult_round
  229.         generic map(
  230.                     Wa => Wa,
  231.                     Wb => Wa,
  232.                     Wc => Wc,
  233.                     Wo => Wa,
  234.                     round_mode => round_mode
  235.                     )
  236.         port map(
  237.                 clk => clk,
  238.                 rst => rst,
  239.                 addsub => '1',
  240.                 a => reg(0),
  241.                 b => reg(2),
  242.                 c => farrow_coeffs(0),
  243.                 p => reg(13)
  244.                 );
  245.                
  246.     mr_1:
  247.     component mult_round
  248.         generic map(
  249.                     Wa => Wa,
  250.                     Wb => Wa,
  251.                     Wo => Wa,
  252.                     round_mode => round_mode
  253.                    
  254.                     )
  255.         port map(
  256.                 clk => clk,
  257.                 rst => rst,
  258.                 a => reg(1),
  259.                 b => farrow_coeffs(1),
  260.                 p => reg(14)
  261.                 );
  262.                
  263.     vd_5:
  264.     component var_delay
  265.         generic map(
  266.                     D => 1,
  267.                     Wa => Wa
  268.                     )
  269.         port map(
  270.                 clk => clk,
  271.                 rst => rst,
  272.                 data_in  => reg(14),
  273.                 data_out => reg(15)
  274.                 );
  275.                
  276.     process(clk) is
  277.     begin
  278.         if rising_edge(clk) then
  279.             if rst = '1' then
  280.                 reg(16) <= (others => '0');
  281.             else
  282.                 reg(16) <= reg(13) + reg(15);   -- v0[n]
  283.             end if;
  284.         end if;
  285.     end process;
  286.    
  287.     --------------------------------------
  288.     ----------- Horner's rule ------------
  289.     --------------------------------------
  290.     vd_6:
  291.     component var_delay
  292.         generic map(
  293.                     D => 3,
  294.                     Wa => Wa
  295.                     )
  296.         port map(
  297.                 clk => clk,
  298.                 rst => rst,
  299.                 data_in  => reg(12),
  300.                 data_out => reg(17)
  301.                 );
  302.                
  303.     vd_7:
  304.     component var_delay
  305.         generic map(
  306.                     D => 6,
  307.                     Wa => Wa
  308.                     )
  309.         port map(
  310.                 clk => clk,
  311.                 rst => rst,
  312.                 data_in  => reg(16),
  313.                 data_out => reg(18)
  314.                 );
  315.    
  316.    
  317.     mrp_1:
  318.     component mult_round_postadd
  319.         generic map(
  320.                     Wa => Wa,
  321.                     Wb => Wm,
  322.                     Wo => Wa,
  323.                     round_mode => round_mode
  324.                     )
  325.         port map(
  326.                 clk => clk,
  327.                 rst => rst,
  328.                 addsub => '1',
  329.                 a => reg(6),
  330.                 b => mu,
  331.                 c => reg(10),
  332.                 p => reg(19)
  333.                 );
  334.                
  335.     mrp_2:
  336.     component mult_round_postadd
  337.         generic map(
  338.                     Wa => Wa,
  339.                     Wb => Wm,
  340.                     Wo => Wa,
  341.                     round_mode => round_mode
  342.                     )
  343.         port map(
  344.                 clk => clk,
  345.                 rst => rst,
  346.                 addsub => '1',
  347.                 a => reg(19),
  348.                 b => mu,
  349.                 c => reg(17),
  350.                 p => reg(20)
  351.                 );
  352.                
  353.     mrp_3:
  354.     component mult_round_postadd
  355.         generic map(
  356.                     Wa => Wa,
  357.                     Wb => Wm,
  358.                     Wo => Wa,
  359.                     round_mode => round_mode
  360.                     )
  361.         port map(
  362.                 clk => clk,
  363.                 rst => rst,
  364.                 addsub => '1',
  365.                 a => reg(20),
  366.                 b => mu,
  367.                 c => reg(18),
  368.                 p => reg(21)
  369.                 );
  370.    
  371.     data_out <= reg(21)(Wa-3 downto Wa-Wo-2);
  372.    
  373.     -- REGs 6, 10, 12, 16 are filter outputs
  374.    
  375.     -- probe(clk, rst, reg(6), "C:\Users\edavpav\Documents\Diplomski\VHDL\b_spline_rtl\probe_signals\farrow\v3.txt");
  376.     -- probe(clk, rst, reg(10), "C:\Users\edavpav\Documents\Diplomski\VHDL\b_spline_rtl\probe_signals\farrow\v2.txt");
  377.     -- probe(clk, rst, reg(12), "C:\Users\edavpav\Documents\Diplomski\VHDL\b_spline_rtl\probe_signals\farrow\v1.txt");
  378.     -- probe(clk, rst, reg(16), "C:\Users\edavpav\Documents\Diplomski\VHDL\b_spline_rtl\probe_signals\farrow\v0.txt");
  379.     -- probe(clk, rst, reg(19), "C:\Users\edavpav\Documents\Diplomski\VHDL\b_spline_rtl\probe_signals\farrow\h3.txt");
  380.     -- probe(clk, rst, reg(20), "C:\Users\edavpav\Documents\Diplomski\VHDL\b_spline_rtl\probe_signals\farrow\h2.txt");
  381.     -- probe(clk, rst, reg(21), "C:\Users\edavpav\Documents\Diplomski\VHDL\b_spline_rtl\probe_signals\farrow\h1.txt");
  382.    
  383. end rtl;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement