電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>從零開始在FPGA上實現(xiàn)IIR濾波器

從零開始在FPGA上實現(xiàn)IIR濾波器

2022-10-18 | zip | 0.87 MB | 次下載 | 2積分

資料介紹

描述

濾波可能是任何嵌入式工程師必須設計的最常見的 DSP 算法,無論他們是為 STM32、TI DSP 還是為 FPGA 開發(fā)的算法。濾波非常重要,因為大多數(shù)應用程序都連接到現(xiàn)實世界,因此它們需要捕獲具有所有真實信號都具有的不良元素的真實信號,即噪聲、偏移……此外,我們需要獲取的信號,并非總是如此將是我們獲取的主要信號,例如,對于生物信號,我們將獲取與電網(wǎng)頻率相對應的 50 或 60 Hz 的高電平。在這種情況下,我們將需要一個過濾器。

作為本博客的讀者,您肯定知道,在數(shù)字系統(tǒng)上,我們有 2 種濾波器,F(xiàn)IR(有限脈沖響應)濾波器,它只使用現(xiàn)在輸入的值和過去的值,以及 IIR(無限脈沖Response),它使用現(xiàn)在和過去的輸入值,以及過去輸出的值。FIR 濾波器很容易為許多應用設計,但它們的響應對于低階濾波器是有限的。另一方面,使用 IIR 濾波器,我們可以實現(xiàn)更積極的響應,但它們的缺點是濾波器在某些情況下可能不穩(wěn)定。在本文中,我們將了解如何逐步實現(xiàn)二階濾波器,從濾波器設計到 Verilog 實現(xiàn)。

設計 IIR 濾波器的過程始終相同。首先我們要使用它的連續(xù)傳遞函數(shù)來設計濾波器,然后,一旦選擇了濾波器的固有頻率、階數(shù)和品質(zhì)因數(shù),我們將得到相應的 s

功能。為了將該濾波器數(shù)字化,下一步是應用一些變換來用 z 替換變量s ,這個過程稱為離散化。為了離散化連續(xù)傳遞函數(shù),我們可以使用多種方法,其中一種易于使用的方法是Tustin雙線性變換

雙線性變換基于將連續(xù)傳遞函數(shù)中的s變量替換為z的函數(shù)。在下一個示例中,我們可以看到應用雙線性變換對單極點低通濾波器進行離散化。接下來是我們必須在連續(xù)傳遞函數(shù)中執(zhí)行的替換。

pYYBAGNOJK6AZD8_AAAIN8BBviU913.png
?

對于單極點濾波器,這些將是執(zhí)行雙線性變換的步驟。低通單極濾波器的方程如下:

pYYBAGNOJLCAcHUJAAAF1yi5aqk551.png
?

應用轉換,我們有:

poYBAGNOJLKAaQBYAAAJj7dzG6U350.png
?

與分母運算以獲得共同的分母,

poYBAGNOJLSAA2o2AAAM_KCm7KU645.png
?

然后,我們需要將元素與其他元素中的z分開,最后我們將得到一個z函數(shù),該函數(shù)取決于濾波器的采樣頻率和固有頻率。

pYYBAGNOJLaAaTjzAAAOyz-DNFM019.png
?

MATLAB 中,我們可以使用以下命令進行此轉換hz = c2d(hs,ts,'Tustin')

接下來是 100 Hz 低通濾波器的整個 MATLAB 代碼。

%% single pole filter discretization

% continuos filter declaration
s = tf('s');

% define characteristics of the filter
fc = 100; 

% compute angular frequency
wc = 2*pi*fc;

% Write the transfer function of a low pass single pole filter
hs = 1/(1+s/wc);

% show its bode diagram
bode(hs)

% discretization using tustin method

% Sampling frequency
fs = 100e3;

ts = 1/fs;

hz = c2d(hs,ts,'Tustin')

赫茲的結果是

hz =
 
  0.003132 z + 0.003132
  ---------------------
       z - 0.9937
 
Sample time: 1e-05 seconds
Discrete-time transfer function.

為了驗證我們手動獲得的方程是否正確,我們必須使用我們之前獲得的值創(chuàng)建一個傳遞函數(shù)。

hz_man = tf([ts*wc, ts*wc],[ts*wc+2 ts*wc-2], ts)

這種情況下的結果是

hz_man =
 
  0.006283 z + 0.006283
  ---------------------
     2.006 z - 1.994
 
Sample time: 1e-05 seconds
Discrete-time transfer function.

我們可以看到,將分子和分母除以 2.006,方程與使用c2c命令得到的方程相同。

雙線性變換與其他任何離散化方法一樣,都是一種近似,因此我們將引入一些誤差。該誤差的大小與采樣頻率有關,因為在某些情況下,非常(非常)高的采樣頻率可能看起來是連續(xù)的。在實際系統(tǒng)中,采樣頻率取決于 ADC 和許多實際組件,我們可以使用高采樣頻率,但在其他情況下,我們會引入顯著誤差。

在雙線性變換的情況下,我們將引入的誤差之一是頻率扭曲。這種效應會產(chǎn)生濾波器固有頻率的偏移。這種影響在低通濾波器的情況下可以忽略不計,但在窄帶濾波器的情況下,該誤差可能使濾波器不起作用。

為了找到由雙線性變換引起的誤差,我們需要找到模擬頻率與離散頻率之間的關系。首先,我們將從雙線性變換方程開始。

pYYBAGNOJLqAHP2nAAAImy2Wa3A703.png
?

將z替換為其極坐標形式e^(jωd) ,我們有

poYBAGNOJL2AKVcJAAAJcmJdBl0316.png
?

現(xiàn)在,我們將使用半角分割指數(shù)。

pYYBAGNOJL-Af6LLAAAartoZb80897.png
?

將分子和分母替換為上述等式,我們有:

poYBAGNOJMGASncQAAAV_azSbVk144.png
?

現(xiàn)在,我們將使用半角分割指數(shù)。

pYYBAGNOJMOARzoFAAAayfAUons215.png
?

將分子和分母替換為上述等式,我們有:

poYBAGNOJMaAOMY-AAAWB_2hQuo137.png
?

然后,我們必須找到與類比的關系,所以我們要使兩個方程相等

pYYBAGNOJMiALg7-AAAJF4CCM-I249.png
?

我們可以驗證實部為 0,而虛部wwa直接為

poYBAGNOJMuAcz_CAAAHbeoi66Y414.png
?

請注意,當ts趨于零時,極限是ωa = ωd。

在 MATLAB 中,我們可以很容易地檢查這個偏差。在這種情況下,我們將聲明一個二階連續(xù)帶阻濾波器。然后使用 Tustin 方法對濾波器進行離散化。

close all
clear all
clc

% define filter
fc = 3000;
wn = 2*pi*fc;
q = 5;%1/sqrt(2); % butterworth

s = tf('s');

h = (s^2+wn^2)/(s^2+wn/q*s+wn^2)

%bode(h)

% discretize filter
fs = 100e6/2048 % prescale FPGA frequency by factor of 2048
ts = 1/fs;

hz = c2d(h,ts,'tustin');
pYYBAGNOJM2ATJKQAABo1kwE15E885.png
?

我們可以看到數(shù)字濾波器的頻率是如何移動的。然后我們將對自然頻率應用預變形,并使用這個新頻率重新離散化濾波器。

% calculate prewarping
wp = 2/ts*tan(wc*ts/2);
hw = (s^2+wp^2)/(s^2+wp/q*s+wp^2)
hwz = c2d(hw,ts,'tustin');
poYBAGNOJNCAEl6oAABSic9sdjs133.png
?

我們可以看到在這種情況下,兩個頻率是相同的,所以誤差是固定的。

為了在現(xiàn)實世界中驗證這種行為,我們將在 Verilog 中實現(xiàn)這個二階帶阻濾波器,然后我們將檢查扭曲錯誤,然后如何使用預扭曲來修復它。

在開始編碼之前,我們必須考慮我們想要創(chuàng)建的模塊是什么。在我的情況下,能夠參數(shù)化模塊是非常重要的,這樣,如果我改變輸入的寬度,或者輸出的寬度,那只代表一個參數(shù)的改變,而不需要修改模塊的代碼因為這意味著模塊的新測試。此外,我們必須考慮我們將使用什么數(shù)字格式。對于這種過濾器,很明顯我們需要有符號格式,以及管理十進制數(shù)的能力. 為了達到這個要求,我們必須在定點和浮點之間進行選擇,對我來說決定很明確,我想要一個可以單獨實例化的代碼,沒有外部浮點單元,所以格式將是定點的。如果我們加上參數(shù)的要求,和定點格式,我們需要參數(shù)來定義信號的寬度,還有小數(shù)部分的寬度,這與我們需要的精度有關。此外,將選擇精度以獲得與設計盡可能相似的實施濾波器的響應。現(xiàn)在,我們需要參數(shù)化多少寬度?我們可以定義一個寬度,用于輸入和輸出以及系數(shù),但是這樣,系數(shù)的寬度將根據(jù)數(shù)據(jù)生成器的寬度來選擇,對于某些過濾器,系數(shù)在穩(wěn)定極限上,這可能代表一個問題。因此,至少我們將定義 2 種不同的寬度,一種用于輸入和輸出,根據(jù)數(shù)據(jù)消耗和數(shù)據(jù)源,另一種根據(jù)我們需要的分辨率。另一個我們要考慮寬度的事情,是內(nèi)部運算的分辨率,因為在某些情況下,穩(wěn)定性問題與系數(shù)本身的寬度無關,而是運算分辨率,所以在這一點上,將是有趣的解耦將在 MATLAB 或 Python 上生成的系數(shù)的寬度,以及內(nèi)部濾波器操作的寬度。最后,過濾器參數(shù)將如下所示。一個用于輸入和輸出,根據(jù)數(shù)據(jù)消耗和數(shù)據(jù)源,另一個根據(jù)我們需要的分辨率。另一個我們要考慮寬度的事情,是內(nèi)部運算的分辨率,因為在某些情況下,穩(wěn)定性問題與系數(shù)本身的寬度無關,而是運算分辨率,所以在這一點上,將是有趣的解耦將在 MATLAB 或 Python 上生成的系數(shù)的寬度,以及內(nèi)部濾波器操作的寬度。最后,過濾器參數(shù)將如下所示。一個用于輸入和輸出,根據(jù)數(shù)據(jù)消耗和數(shù)據(jù)源,另一個根據(jù)我們需要的分辨率。另一個我們要考慮寬度的事情,是內(nèi)部運算的分辨率,因為在某些情況下,穩(wěn)定性問題與系數(shù)本身的寬度無關,而是運算分辨率,所以在這一點上,將是有趣的解耦將在 MATLAB 或 Python 上生成的系數(shù)的寬度,以及內(nèi)部濾波器操作的寬度。最后,過濾器參數(shù)將如下所示。穩(wěn)定性問題與系數(shù)本身的寬度無關,而與運算分辨率有關,因此在這一點上,將在 MATLAB 或 Python 上生成的系數(shù)的寬度與內(nèi)部濾波器操作的寬度解耦會很有趣. 最后,過濾器參數(shù)將如下所示。穩(wěn)定性問題與系數(shù)本身的寬度無關,而與運算分辨率有關,因此在這一點上,將在 MATLAB 或 Python 上生成的系數(shù)的寬度與內(nèi)部濾波器操作的寬度解耦會很有趣. 最后,過濾器參數(shù)將如下所示。

parameter inout_width = 16,
parameter inout_decimal_width = 15,
parameter coefficient_width = 16,
parameter coefficient_decimal_width = 15,
parameter internal_width = 16,
parameter internal_decimal_width = 15

接下來我們必須考慮接口。在模塊之間以連續(xù)方式傳輸數(shù)據(jù)的應用中,AXI4-Stream 將是最佳選擇。在輸入和輸出字段中,我們將定義主從 AXI4-Stream 接口來獲取和發(fā)送數(shù)據(jù)。盡管輸入和輸出寬度是參數(shù)化的,但如果我們想將模塊連接到現(xiàn)有的 AXI4-Stream IP,則此寬度受限于總線的寬度。

input aclk,
input resetn,

/* slave axis interface */
input [inout_width-1:0] s_axis_tdata,
input s_axis_tlast,
input s_axis_tvalid,
output s_axis_tready,

/* master axis interface */
output reg [inout_width-1:0] m_axis_tdata,
output reg m_axis_tlast,
output reg m_axis_tvalid,
input m_axis_tready,

關于系數(shù),插入它們最好是使用 AXI4-Lite 接口,但我想設計這個模塊而不需要使用 Zynq 或 Microblaze,所以插入系數(shù)的簡單方法是作為輸入。

/* coefficients */
input signed [pw_coefficient_width-1:0] b0,
input signed [pw_coefficient_width-1:0] b1,
input signed [pw_coefficient_width-1:0] b2,
input signed [pw_coefficient_width-1:0] a1,
input signed [pw_coefficient_width-1:0] a2

現(xiàn)在,在定義了所有輸入和輸出之后,我們必須考慮數(shù)據(jù)流。首先,由于我們定義了不同的格式,為了能夠在系數(shù)和數(shù)據(jù)之間進行運算,我們必須將所有信號的格式更改為內(nèi)部格式,內(nèi)部格式由內(nèi)部寬度和小數(shù)寬度定義。使用的整數(shù)寬度被定義為一個localparam,并且對應于寬度和小數(shù)寬度之間的差異。要更改格式,我們將在信號的低端填充零,直到完成小數(shù)部分。對于整數(shù)部分,由于使用的格式是有符號的,我們必須進行符號擴展,即填充 MSb 的值,直到整數(shù)部分完成。請注意,這是有效的,因為內(nèi)部寬度大于或等于輸入輸出和系數(shù)寬度。

/* resize signals to internal width */
assign input_int = { {(internal_integer_width-inout_integer_width){s_axis_tdata[inout_width-1]}},
                          s_axis_tdata,
                          {(internal_decimal_width-inout_decimal_width){1'b0}} };
assign b0_int = { {(internal_integer_width-coefficient_integer_width){b0[coefficient_width-1]}},
                          b0,
                          {(internal_decimal_width-coefficient_decimal_width){1'b0}} };
assign b1_int = { {(internal_integer_width-coefficient_integer_width){b1[coefficient_width-1]}},
                          b1,
                          {(internal_decimal_width-coefficient_decimal_width){1'b0}} };
assign b2_int = { {(internal_integer_width-coefficient_integer_width){b2[coefficient_width-1]}},
                          b2,
                          {(internal_decimal_width-coefficient_decimal_width){1'b0}} };
assign a1_int = { {(internal_integer_width-coefficient_integer_width){a1[coefficient_width-1]}},
                          a1,
                          {(internal_decimal_width-coefficient_decimal_width){1'b0}} };
assign a2_int = { {(internal_integer_width-coefficient_integer_width){a2[coefficient_width-1]}},
                          a2,
                          {(internal_decimal_width-coefficient_decimal_width){1'b0}} };

數(shù)字濾波器,無論是 FIR 還是 IIR,都需要存儲過去輸入的值,而 IIR 還需要存儲過去輸出的值,因此我們需要一個流水線結構來存儲過去的值。

/* pipeline registers */
always @(posedge aclk)
  if (!resetn) begin
    input_pipe1 <= 0;
    input_pipe2 <= 0;
    output_pipe1 <= 0;
    output_pipe2 <= 0;
  end
  else
    if (s_axis_tvalid) begin
      input_pipe1 <= input_int;
      input_pipe2 <= input_pipe1;
      output_pipe1 <= output_int;
      output_pipe2 <= output_pipe1;
    end

現(xiàn)在,接下來是執(zhí)行過濾器計算。一個二階濾波器需要執(zhí)行 5 次乘法,記住這并不意味著模塊使用 5 個 DSP slice。我開發(fā)的代碼執(zhí)行組合乘法。這允許 0 個時鐘周期延遲,但會限制濾波器的速度。如果您的時序約束沒有得到滿足,您可以注冊乘法器的輸入,然后進行重新定時,讓 Vivado 選擇更有效的放置寄存器的位置。

/* combinational multiplications */
assign input_b0 = input_int * b0_int;
assign input_b1 = input_pipe1 * b1_int;
assign input_b2 = input_pipe2 * b2_int;
assign output_a1 = output_pipe1 * a1_int;
assign output_a2 = output_pipe2 * a2_int;

乘法的結果將在輸入的情況下相加,在輸出的情況下相減,以獲得濾波器輸出。由于乘積的輸出大小是操作數(shù)的兩倍,因此加法必須是相同的寬度。要在乘法上使用輸出,我們必須執(zhí)行移位以刪除額外的小數(shù)位。關于額外的整數(shù)位置將在分配時被截斷。

assign output_2int = input_b0 + input_b1 + input_b2 - output_a1 - output_a2;
assign output_int = output_2int >>> (internal_decimal_width);

最后,輸出的值將被重新格式化為輸入輸出寬度。

assign m_axis_tdata = output_int >>> (internal_decimal_width-inout_decimal_width);

對于 AXI4-Stream 管理信號,由于濾波器作為橋接器,有 1 個周期延遲,因此管理信號會以 1 個周期延遲通過濾波器。

至此,我們已經(jīng)實現(xiàn)了 Verilog 模塊并準備好用作帶阻濾波器。接下來是使用該tfdata函數(shù)在 MATLAB 中獲取系數(shù)。關于過濾器的寬度,我們將使用 18 位分辨率用于小數(shù)部分,2 用于整數(shù)部分,以使過濾器達到 +-2。接下來是獲取定點系數(shù)的 MATLAB 代碼。

% filter implemetation

[num, den] = tfdata(hwz)

b0 = num{1}(1)
b1 = num{1}(2)
b2 = num{1}(3)
a1 = den{1}(2)
a2 = den{1}(3)

% quantize

fracBits = 18;

b0_qq = floor(b0*2^fracBits)
b1_qq = floor(b1*2^fracBits)
b2_qq = floor(b2*2^fracBits)

a1_qq = floor(a1*2^fracBits)
a2_qq = floor(a2*2^fracBits)

這將返回下一個結果。

b0_qq =

      252631


b1_qq =

     -468081


b2_qq =

      252631


a1_qq =

     -468081


a2_qq =

      243119

一旦我們有了五個系數(shù),我們必須將它們作為輸入引入 Verilog 模塊中的系數(shù)輸入。

axis_biquad_v1_0 #(
  .inout_width(15),
  .inout_decimal_width(13),
  .coefficient_width(20),
  .coefficient_decimal_width(18),
  .internal_width(20),
  .internal_decimal_width(18)
  ) axis_biquad_inst0 (
  .aclk(clk100mhz),
  .resetn(pll_locked),
  /* slave axis interface */
  .s_axis_tdata({axis_data_signal_ch1[13], axis_data_signal_ch1}),
  .s_axis_tlast(),
  .s_axis_tvalid(&filter_prescaler),
  .s_axis_tready(),
  /* master axis interface */
  .m_axis_tdata(axis_data_signal_filt),
  .m_axis_tlast(),
  .m_axis_tvalid(),
  .m_axis_tready(),
  /* coefficients */
  .b0(20'd252631),
  .b1(-20'd468081),
  .b2(20'd252631),
  .a1(-20'd468081),
  .a2(20'd243119)
  );

為了驗證這種效果是否發(fā)生,并使用預變形修復,我將使用帶有 ZMOD Scope 和 ZMOD AWG的Digilent 的 Eclypse Z7 。此外,為了生成信號并驗證濾波器的響應,我將使用全新的 Analog Discovery PRO 5250 ,它具有信號 125 Msps 信號發(fā)生器以及能夠獲取高達 1 Gsps 的兩通道示波器。

pYYBAGNOJNOAUt4YAAAv8cSmqag963.png
?

為了獲得自然離散頻率 ( ωd ),我將使用 ADP 5250 的一個非常有用的功能,它執(zhí)行頻率掃描,為每個頻率獲取濾波器的增益,因此結果將是濾波器的波特圖. 要配置此模式,我們需要打開工具網(wǎng)絡

pYYBAGNOJNaABgfkAAEak2u7KL4451.png
?

打開此工具后,我們需要配置點數(shù),以及最小和最大頻率。我們還需要配置發(fā)生器將產(chǎn)生的信號幅度。在這種情況下,我的濾波器的固有頻率是 3 kHz,所以如果幅度為 1V,頻率范圍為 500 Hz 到 10 kHz,我將使用配置。點數(shù)將配置頻率步長。就我而言,我已根據(jù)需要更改了點數(shù)。

首先,我將雙二階濾波器配置為帶阻巴特沃斯濾波器,固有頻率為 3 kHz。這次我沒有糾正頻率扭曲。然后,單擊 Single,ADC 5250 將執(zhí)行一個完整的交換。結果如下圖所示。

poYBAGNOJNiAXClTAACTSBc1BVs513.png
?

您可以看到濾波器的響應如何是預期的,但自然頻率為 2.9407 khz,比預期頻率低 59.3 Hz。對頻率應用預變形,濾波器的響應是下一個(注意圖像的縮放不同)。

poYBAGNOJNuAQgzAAACQQwNe6as263.png
?

通過頻率校正,誤差如果為0.0052 Hz,這是一個卑鄙的誤差。在接下來的測試中,我將濾波器的品質(zhì)因數(shù)增加到 5。這將對陷波的帶寬產(chǎn)生影響,從而獲得更窄帶的濾波器。

pYYBAGNOJN6AUXx7AACLHCb88-E667.png
?

雙線性變換因其簡單性而被廣泛用于設計 IIR 濾波器。我們只需要用 z 函數(shù)替換連續(xù)傳遞函數(shù)中的 s。其他方法如脈沖不變性需要部分分數(shù)展開代數(shù),所以過程有點復雜。此外,雙線性變換映射整個 s 平面,因此沒有混疊誤差。另一方面,它會在頻率上產(chǎn)生扭曲,但使用預扭曲,正如我們在這篇文章中看到的,我們可以修復該頻率偏差。


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1新概念模擬電路第四冊信號處理電路電子書免費下載
  2. 10.69 MB  |  33次下載  |  免費
  3. 2GBT1094.11-2022電力變壓器第11部分:干式變壓器
  4. 14.12 MB   |  3次下載  |  免費
  5. 3FT-7800R對講機維修手冊附原理圖
  6. 3.35 MB   |  2次下載  |  免費
  7. 4串口工具UartAssist5.0.exe
  8. 0.60 MB   |  2次下載  |  免費
  9. 5爬電距離和電氣間隙計算
  10. 0.75 MB   |  2次下載  |  1 積分
  11. 6UC3584DW次級側后置穩(wěn)壓器EVM板原理圖
  12. 38.97KB   |  2次下載  |  免費
  13. 7ZX-D37 BLE主從一體藍牙模塊技術手冊
  14. 1.22 MB   |  1次下載  |  免費
  15. 8使用15個時鐘周期的ADS7841和ADS7844
  16. 188.55KB   |  1次下載  |  免費

本月

  1. 1新概念模擬電路第四冊信號處理電路電子書免費下載
  2. 10.69 MB  |  33次下載  |  免費
  3. 2無刷電機控制方案設計合作
  4. 1.05 MB   |  22次下載  |  免費
  5. 3美的超薄電磁爐TM-S1-09B主板原理圖
  6. 0.08 MB   |  20次下載  |  免費
  7. 4純電動汽?的主要部件及?作原理
  8. 5.76 MB   |  12次下載  |  5 積分
  9. 5GP328和GP88S對講機的維修實列資料合集免費下載
  10. 0.03 MB   |  10次下載  |  10 積分
  11. 6舒爾SLX4無線話筒接收機原理圖:二次變頻超外差部分
  12. 0.27 MB   |  8次下載  |  免費
  13. 7i.MX Linux開發(fā)實戰(zhàn)指南—基于野火i.MX系列開發(fā)板
  14. 17.86 MB   |  7次下載  |  免費
  15. 8Type-C VL160數(shù)據(jù)手冊
  16. 0.92 MB   |  7次下載  |  3 積分

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935115次下載  |  10 積分
  3. 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
  4. 1.48MB  |  420061次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233084次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費下載
  8. 340992  |  191364次下載  |  10 積分
  9. 5十天學會AVR單片機與C語言視頻教程 下載
  10. 158M  |  183329次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81581次下載  |  10 積分
  13. 7Keil工具MDK-Arm免費下載
  14. 0.02 MB  |  73805次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65985次下載  |  10 積分