ভিএইচডিএল এফআইআর / আইআইআর ফিল্টারগুলির জন্য কোড উদাহরণ?


11

আমি আমার স্পার্টান -3 বোর্ডে ডিএসপি দিয়ে শুরু করার চেষ্টা করছি। আমি একটি পুরানো মাদারবোর্ড থেকে একটি চিপ দিয়ে একটি AC97 বোর্ড তৈরি করেছি এবং এখনও পর্যন্ত এটি এডিসি করতে পেরেছি, একটি সংখ্যার জন্য নমুনাগুলি <1 (ভলিউম হ্রাস) এবং তারপরে ড্যাক করতে হবে।

এখন আমি কিছু বেসিক ডিএসপি স্টাফগুলি করতে চাই যেমন একটি লো-পাস ফিল্টার, উচ্চ-পাস ইত্যাদি But তবে আমি সংখ্যার উপস্থাপনা সম্পর্কে সত্যই বিভ্রান্ত (পূর্ণসংখ্যা? নির্দিষ্ট পয়েন্ট? প্রশ্ন0.15? ওভারফ্লো বা স্যাচুরেশন?)।

আমাকে শুরু করতে আমি কেবল একটি আসল সাধারণ ফিল্টারের কয়েকটি উদাহরণ কোড চাই । কোনও উচ্চ দক্ষতা, দ্রুত, বা এর মতো কিছু নেই। ভিএইচডিএলে কেবল তাত্ত্বিক ফিল্টার প্রয়োগ করা হয়েছে।

আমি অনুসন্ধান করে চলেছি তবে আমি কেবল তাত্ত্বিক সূত্রগুলি খুঁজে পেয়েছি - আমি পেয়েছি, যা আমি বুঝতে পারি না তা হ'ল স্বাক্ষরিত 16-বিট, 48KHz অডিও নমুনাগুলি আমি এডিসি থেকে কীভাবে প্রসেস করব। আমি এই গ্রন্থাগারগুলি ব্যবহার করছি: http://www.vhdl.org/fphdl/ । আমি যদি আমার নমুনাগুলি 0.5, 0.25 ইত্যাদি দ্বারা গুণিত করি তবে আমি পার্থক্যটি শুনতে পাচ্ছি। তবে একটি বৃহত্তর ফিল্টার আমাকে কেবল আওয়াজ দেয়।

ধন্যবাদ।


2
আপনার কাছে স্টাফ শেখার জন্য যা কিছু আছে তা ব্যবহার করার জন্য আমি সবই করছি, আমি উল্লেখ করতে চাই যে এফপিজিএতে অডিও ফিল্টারগুলি করা খুব কার্যকর বা ব্যয়বহুল উপায় নয়। সুতরাং, আপনি যদি সত্যিকারের প্রকল্প করেন তবে আমি পরিবর্তে স্বল্প দামের ডিএসপি ব্যবহারের পরামর্শ দেব। ব্যতিক্রম: আপনি যখন একই সময়ে অযৌক্তিক অডিও চ্যানেলগুলি করছেন বা আপনি একটি অযৌক্তিক সংখ্যক ট্যাপ দিয়ে এফআইআর করছেন।

উত্তর:


8

দেখে মনে হচ্ছে আপনার প্রথমে ডিএসপি দিকগুলি বের করা দরকার, তারপরে এফপিজিএতে একটি বাস্তবায়ন করুন।

  • সি, মতলব, এক্সেল বা অন্য কোথাও ডিএসপি বাছাই করুন
  • চেষ্টা করুন এবং ভাবেন যে আপনি কী থেকে এফপিজিএ-জমিতে যা শিখেছেন তা কীভাবে স্থানান্তর করবেন
  • আবিষ্কার করুন আপনি বাস্তবায়ন সম্পর্কে কিছু ধারণা তৈরি করেছেন যা ভাল কাজ করে না (উদাহরণস্বরূপ ভাসমান পয়েন্টের ব্যবহার হিসাবে)
  • এই অ্যাকাউন্টটি নেওয়ার জন্য ফিরে যান এবং আপনার অফলাইন ডিএসপি স্টাফ আপডেট করুন।
  • পুনরুক্তি এন বার :)

ডেটা প্রকারের বিষয়ে, আপনি ঠিক পরিমাণে পূর্ণসংখ্যা ব্যবহার করতে পারেন।

আপনাকে এগিয়ে নিতে এখানে কিছু নমুনা কোড রয়েছে's মনে রাখবেন যে এটিতে প্রচুর বাস্তব-জগতে সমস্যা রয়েছে (উদাহরণস্বরূপ পুনরায় সেট করা, ওভারফ্লো পরিচালনা) - তবে আশা করি এটি শিক্ষণীয়:

library ieee;
use ieee.std_logic_1164.all;
entity simple_fir is
    generic (taps : integer_vector); 
    port (
        clk      : in  std_logic;
        sample   : in  integer;
        filtered : out integer := 0);
end entity simple_fir;
----------------------------------------------------------------------------------------------------------------------------------
architecture a1 of simple_fir is
begin  -- architecture a1
    process (clk) is
        variable delay_line : integer_vector(0 to taps'length-1) := (others => 0);
        variable sum : integer;
    begin  -- process
        if rising_edge(clk) then  -- rising clock edge
            delay_line := sample & delay_line(0 to taps'length-2);
            sum := 0;
            for i in 0 to taps'length-1 loop
                sum := sum + delay_line(i)*taps(taps'high-i);
            end loop;
            filtered <= sum;
        end if;
    end process;
end architecture a1;
----------------------------------------------------------------------------------------------------------------------------------
-- testbench
----------------------------------------------------------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
entity tb_simple_fir is
end entity tb_simple_fir;
architecture test of tb_simple_fir is
    -- component generics
    constant lp_taps : integer_vector := ( 1, 1, 1, 1, 1);
    constant hp_taps : integer_vector := (-1, 0, 1);

    constant samples : integer_vector := (0,0,0,0,1,1,1,1,1);

    signal sample   : integer;
    signal filtered : integer;
    signal Clk : std_logic := '1';
    signal finished : std_logic;
begin  -- architecture test
    DUT: entity work.simple_fir
        generic map (taps => lp_taps)  -- try other taps in here
        port map (
            clk      => clk,
            sample   => sample,
            filtered => filtered);

    -- waveform generation
    WaveGen_Proc: process
    begin
        finished <= '0';
        for i in samples'range loop
            sample <= samples(i);
            wait until rising_edge(clk);
        end loop;
        -- allow pipeline to empty - input will stay constant
        for i in 0 to 5 loop
            wait until rising_edge(clk);
        end loop;
        finished <= '1';
        report (time'image(now) & " Finished");
        wait;
    end process WaveGen_Proc;

    -- clock generation
    Clk <= not Clk after 10 ns when finished /= '1' else '0';
end architecture test;

আপনার উত্তরের জন্য ধন্যবাদ. এটি আমি কমবেশি করেছি তবে সংখ্যা উপস্থাপনা নিয়ে আমার কিছু সমস্যা রয়েছে। আমার এডিসি আমাকে -32 কে 32+ কে (স্বাক্ষরিত 16-বিট) এ মূল্য দেয়। আমারও ফিল্টার ধ্রুবকের সমস্যা আছে - আমি কীভাবে এটি উপস্থাপন করব? এবং নমুনা এবং ধ্রুবকের মধ্যে গুণনের ফলাফল? এটাই আমাকে সবচেয়ে বিভ্রান্ত করছে।
hjf

@ এইচজেএফ - এটি সব ঠিক পূর্ণসংখ্যা। যতক্ষণ না সবকিছু 32 বিটের মধ্যে থাকে আপনি ঠিক আছেন। যদি আপনার চেয়ে আরও প্রস্থের প্রয়োজন হয় তবে আপনি পছন্দমতো UNSIGNED বা স্বাক্ষরযুক্ত ভেক্টর ব্যবহার করতে পারেন। অথবা ভিএইচডিএল ২০০৮ থেকে নির্ধারিত পয়েন্টগুলি ব্যবহার করুন (এখানে দেখুন: vhdl.org/fphdl )
মার্টিন থম্পসন

5

আপনি যে সর্বনিম্ন লো পাস এফআইআর ফিল্টারটি চেষ্টা করতে পারেন তা হ'ল y (n) = x (n) + x (n-1)। আপনি এটি খুব সহজেই ভিএইচডিএলে প্রয়োগ করতে পারেন। নীচে আপনি যে হার্ডওয়্যারটি প্রয়োগ করতে চান তার একটি খুব সাধারণ ব্লক ডায়াগ্রাম রয়েছে।

একটি সাধারণ লো পাস ফিল্টারের জন্য ব্লক ডায়াগ্রাম

সূত্র অনুসারে, উপযুক্ত আউটপুট পেতে আপনার বর্তমান এবং পূর্ববর্তী অ্যাডিসির নমুনাগুলি প্রয়োজন। আপনার যা করা উচিত তা হ'ল ঘড়ির পড়ন্ত প্রান্তে আগত অ্যাডিসি নমুনাগুলি ল্যাচ করা এবং উপযুক্ত আউটপুট পেতে ক্রমবর্ধমান প্রান্তে উপযুক্ত গণনা করা। যেহেতু আপনি দুটি 16-বিট মান একসাথে যুক্ত করছেন তাই এটি 17-বিটের উত্তর দিয়ে শেষ হতে পারে। আপনার ইনপুটটি 17-বিট রেজিস্টারগুলিতে সঞ্চয় করতে হবে এবং 17-বিট অ্যাড্ডার ব্যবহার করা উচিত। আপনার আউটপুট তবে উত্তরের 16 টি বিট হবে। কোডটি দেখতে এর মতো কিছু হতে পারে তবে আমি গ্যারান্টি দিতে পারি না যে এটি সম্পূর্ণরূপে কাজ করবে যেহেতু আমি এটি পরীক্ষা করে নিই, একে সংশ্লেষিত করা যাক।

IEEE.numeric_std.all;
...
    signal x_prev, x_curr, y_n: signed(16 downto 0);
    signal filter_out: std_logic_vector(15 downto 0);
...
process (clk) is
begin
    if falling_edge(clk) then
        --Latch Data
        x_prev <= x_curr;
        x_curr <= signed('0' & ADC_output); --since ADC is 16 bits
    end if;
end process;

process (clk) is
begin
    if rising_edge(clk) then
        --Calculate y(n)
        y_n <= x_curr + x_prev;
    end if;
end process;

filter_out <= std_logic_vector(y_n(15 downto 0));  --only use the lower 16 bits of answer

আপনি দেখতে পাচ্ছেন, আপনি আরও জটিল সূত্রগুলিতে যোগ করার জন্য এই সাধারণ ধারণাটি ব্যবহার করতে পারেন, যেমন সহগ সহ রয়েছে ones আইআইআর ফিল্টারগুলির মতো আরও জটিল সূত্রগুলিতে অ্যালগোরিদম যুক্তি সঠিক হওয়ার জন্য ভেরিয়েবলের ব্যবহারের প্রয়োজন হতে পারে। পরিশেষে, সহগের হিসাবে প্রকৃত সংখ্যা রয়েছে এমন ফিল্টারগুলি ঘুরে দেখার একটি সহজ উপায় হল একটি স্কেল ফ্যাক্টর সন্ধান করা যাতে সমস্ত সংখ্যা যতটা সম্ভব পুরো সংখ্যার কাছাকাছি থাকে। আপনার চূড়ান্ত ফলাফলটি সঠিক ফলটি পেতে একই ফ্যাক্টরটি দিয়ে আবার স্কেল করতে হবে।

আমি আশা করি এটি আপনার কাজে লাগতে পারে এবং আপনাকে বল রোলিংয়ে সহায়তা করতে পারে।

* এটি সম্পাদনা করা হয়েছে যাতে ডেটা ল্যাচিং এবং আউটপুট ল্যাচিং পৃথক প্রক্রিয়াতে থাকে। এছাড়াও std_logic_vector এর পরিবর্তে স্বাক্ষরিত প্রকারগুলি ব্যবহার করা। আমি ধরে নিচ্ছি আপনার ADC ইনপুটটি একটি std_logic_vector সংকেত হতে চলেছে।


2
যে প্রক্রিয়াগুলি উভয় প্রান্তগুলি বন্ধ করে দেয় (যেমন আপনি বর্ণনা করেছেন) সংশ্লেষের খুব কমই সম্ভাবনা রয়েছে
মার্টিন থম্পসন

@ মার্টিন আমি ধরে নিচ্ছি যে আপনি আমার চেয়ে এফপিজিএ সম্পর্কে আরও অনেক কিছু জানেন তবে আমি ক্লাস অ্যাসাইনমেন্টের জন্য ক্রমবর্ধমান প্রান্তে পতিত প্রান্ত এবং ল্যাচ আউটপুটটির ইনকামিং ডেটা ল্যাচ করেছি তাই আমি ভেবেছিলাম এটি কাজ করবে। আপনি ব্যাখ্যা করতে পারেন কেন এই জাতীয় প্রক্রিয়াগুলি কাজ করে না?
dhsieh2

3
এটি একটি সিমুলেটারে ভাল কাজ করবে। সিনথেসিজাররা এটির উপরে চাপ দেবে যদিও (আমার অভিজ্ঞতার সাথে) যেহেতু ডিভাইসে থাকা ফ্লিপপ্লপগুলি কেবলমাত্র একটি প্রান্তে ঘড়ি দিতে পারে ।
মার্টিন থম্পসন

@ dhsieh2 ধন্যবাদ, আমি এই ধরণের উত্তর খুঁজছিলাম। আরেকটি প্রশ্ন, আমি যদি স্বাক্ষরযুক্ত নম্বরগুলি ব্যবহার করি তবে এটি কীভাবে করব (আমার এডিসি আমাকে -32 কে + 32 কেতে মান দেয়)।
hjf

4
@ মার্টিন আমি জিলিনেক্স এফপিজিএ-তে সমস্ত সময় উভয় ঘড়ির প্রান্তের বাইরে জিনিস রাখি, কোনও সমস্যা নেই। আপনি উভয় প্রান্ত থেকে একই এফএফ বন্ধ করতে পারবেন না। আপনি যখন টাইমিং বিশ্লেষকের আউটপুটটি দেখেন এটি আসলে এটি খুব স্পষ্ট করে দেয় যে আপনি বিপরীত প্রান্তগুলি করছেন এবং সেই অনুযায়ী সময়সীমার বাজেট সামঞ্জস্য করেন।

5

আর একটি সাধারণ কোড স্নিপেট (কেবল সাহস)। দ্রষ্টব্য আমি সরাসরি ভিএইচডিএল লিখিনি, আমি ভিএইচডিএল উত্পন্ন করতে মাইএইচডিএল ব্যবহার করেছি।

-- VHDL code snip
architecture MyHDL of sflt is

type t_array_taps is array(0 to 6-1) of signed (15 downto 0);
signal taps: t_array_taps;

begin

SFLT_RTL_FILTER: process (clk) is
    variable sum: integer;
begin
    if rising_edge(clk) then
        sum := to_integer(x * 5580);
        sum := to_integer(sum + (taps(0) * 5750));
        sum := to_integer(sum + (taps(1) * 6936));
        sum := to_integer(sum + (taps(2) * 6936));
        sum := to_integer(sum + (taps(3) * 5750));
        sum := to_integer(sum + (taps(4) * 5580));
        taps(0) <= x;
        for ii in 1 to 5-1 loop
            taps(ii) <= taps((ii - 1));
        end loop;
        y <= to_signed(sum, 16);
    end if;
end process SFLT_RTL_FILTER;

end architecture MyHDL;

সংশ্লেষিত সার্কিট

এটি প্রত্যক্ষ বাস্তবায়ন। এটির জন্য গুণকগুলির প্রয়োজন হবে। এই সার্কিটের সংশ্লেষণ, একটি আলটিরা ঘূর্ণিঝড় III এর জন্য লক্ষ্যযুক্ত, কোনও স্পষ্টত গুণক ব্যবহার করেনি তবে 350 টি যুক্তিযুক্ত উপাদান প্রয়োজন।

এটি একটি ছোট এফআইআর ফিল্টার এবং এর নিম্নলিখিত প্রতিক্রিয়া থাকবে (এত দুর্দান্ত নয়) তবে এটি উদাহরণ হিসাবে কার্যকর হওয়া উচিত।

ফিল্টার প্রতিক্রিয়া

এছাড়াও আমার কাছে এখানে এবং এখানে কয়েকটি উদাহরণ রয়েছে যা কার্যকর হতে পারে।

এছাড়াও, আপনার প্রশ্নটি জিজ্ঞাসা করে বলে মনে হচ্ছে: "উপযুক্ত স্থির-উপস্থার উপস্থাপনা কী?" ডিএসপি ফাংশনগুলি প্রায়শই প্রয়োগ করার সময়, নির্দিষ্ট পয়েন্ট প্রতিনিধিত্ব ব্যবহৃত হয়, কারণ এটি ফিল্টারগুলির বিশ্লেষণকে সহজ করে। যেমনটি উল্লেখ করা হয়েছে, স্থির-পয়েন্টটি কেবলমাত্র পূর্ণসংখ্যার আর্থিমেটিক। আসল বাস্তবায়ন কেবলমাত্র পূর্ণসংখ্যার সাথে কাজ করছে তবে আমাদের অনুমানিত উপস্থাপনাটি ভগ্নাংশ।
বাস্তবায়নের পূর্ণসংখ্যার (স্থির-পয়েন্ট) থেকে / ফ্রো ডিজাইনের ভাসমান-পয়েন্টে রূপান্তর করার সময় সমস্যাগুলি উত্থাপিত হয়।

আমি জানি না ভিএইচডিএল ফিক্সড পয়েন্ট এবং ভাসমান-পয়েন্ট ধরণের কীভাবে সমর্থিত। তারা সিমুলেশনটিতে দুর্দান্ত কাজ করবে তবে আমি জানি না যে তারা বেশিরভাগ সংশ্লেষের সরঞ্জামগুলি দিয়ে সংশ্লেষ করবে। আমি এর জন্য একটি পৃথক প্রশ্ন তৈরি করেছি ।


3

OpenCores ডিএসপি উদাহরণ, IIR এবং দেবদারূ, BiQuad সহ একটি নম্বর আছে। ফাইলগুলি ডাউনলোড করতে আপনাকে নিবন্ধন করতে হবে।

সম্পাদনা
আমি মৃত লিঙ্কগুলিতে কর্টুকের মন্তব্য বুঝতে পারি এবং সত্যই, যদি ওপেনকোরসের লিঙ্কটি মারা যায় তবে উত্তরটি অকেজো হয়ে যাবে। আমি যথেষ্ট আত্মবিশ্বাসী যে এটি ঘটবে না; আমার লিঙ্কটি একটি জেনেরিক এবং এটি কেবল তখনই মারা যাবে যদি সম্পূর্ণ ওপেনকোর্স ডোমেনটি অদৃশ্য হয়ে যায়।
আমি এই উত্তরটির জন্য যে কয়েকটি উদাহরণ ব্যবহার করতে পারি তার সন্ধান করার চেষ্টা করেছি তবে সেগুলি এখানে উপস্থাপনের জন্য অনেক দীর্ঘ। সুতরাং আমি নিজেই সাইটের নিবন্ধনের জন্য আমার পরামর্শকে দৃ to় করব (আমাকে নিউইয়র্ক চলে যেতে হয়েছিল, কারণ আমার নিজের শহরটি গৃহীত হয়নি) এবং সেখানে উপস্থাপিত কোডটি একবার দেখুন।


সমস্ত জিনিস হিসাবে, লিঙ্কগুলি বিরতি। আমরা এর আগে আলোচনা করেছি যে নিজের লিঙ্ক কোনও উত্তর দেয় না। আপনি কি কিছু আছে তা নিয়ে আসতে পারেন এবং আরও শিখার জন্য একটি রেফারেন্স হিসাবে সেই লিঙ্কটি রয়েছে এমন একটি মিষ্টি উত্তর দিতে পারেন?
কর্টুক

@ কর্টুক - আমি গতকাল এটি করতে চেয়েছিলাম। আমি কিছু বিবরণ পাওয়ার জন্য গতকাল ওপেনকোর্সে রেজিস্ট্রেশন করেছি, তবে তাদের কাছে আমার কিছু আছে কিনা তা ভাবার জন্য তাদের কয়েক দিনের প্রয়োজন আছে
স্টিভেনভ

এটি শুনে খুশী হয়ে আমি সত্যিই ভাবছিলাম যে আপনার পথে কিছুটা কমে গেছে কিনা। এটি সম্পর্কে আরও শোনার জন্য অপেক্ষা করুন।
কর্টুক

1

আমি আইআইআর ফিল্টারগুলির রচনামূলক প্রয়োগের জন্য স্ক্রিপ্টগুলি প্রয়োগ করার চেষ্টা করেছি, যেখানে আপনি নির্ধারণ করতে পারবেন যে নকশাটি যত তাড়াতাড়ি দ্রুত হওয়া উচিত (যাতে প্রতিটি গুণকে উত্সর্গীকৃত গুণক দিয়ে সঞ্চালিত হয়) বা যতটা সম্ভব ছোট (যাতে প্রতিটি গুণক পুনরায় ব্যবহার করা হয়)।

উত্সগুলি "VHDL- তে আইআইআর ফিল্টারগুলির আচরণগত তবে সংশ্লেষযোগ্য বাস্তবায়ন" হিসাবে প্রকাশিত হয়েছে (আপনি এটি গুগল সংরক্ষণাগারটিতেও খুঁজে পেতে পারেন: https://groups.google.com/group/alt.source/msg/c8cf038b9b8ceeec ? dmode = উত্স )

Alt.sms এ পোস্টগুলি "শর" ফর্ম্যাটে রয়েছে, সুতরাং আপনার বার্তাটি পাঠ্য হিসাবে সংরক্ষণ করতে হবে এবং উত্সটি পাওয়ার জন্য এটি ("আনসার" ইউটিলিটি সহ) আনশার করতে হবে।


0

এ কেমন? https://github.com/MauererM/VIIRF

এটি একটি বিয়িকাড (এসওএস, দ্বিতীয়-ক্রম বিভাগ) ভিত্তিক আইআইআর ফিল্টার প্রয়োগ করে যা স্থির-পয়েন্ট বাস্তবায়নের যত্ন নেয়। এটি ফিল্টারটির নকশা এবং যাচাইয়ের জন্য পাইথন স্ক্রিপ্টগুলিও বৈশিষ্ট্যযুক্ত। এটি ভেন্ডর-নির্দিষ্ট এফপিজিএ কনস্ট্রাক্টস ব্যবহার করে না এবং আপনি উচ্চ-গতি এবং নিম্ন অঞ্চল ব্যবহারের মধ্যে বাণিজ্য বন্ধ চয়ন করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.