基于可编程逻辑在数字信号处理系统中的应用
发布时间:2009/2/23 0:00:00 访问次数:445
1 引言
随着半导体技术的发展,可编程逻辑器件在结构、工艺、集成度、功能、速度和灵活性等方面有了很大的改进和提高,从而为高效率、高质量、灵活地设计数字系统提供了可靠性。cpld或fpga技术的出现,为dsp系统的设计又提供了一种崭新的方法。利用cpld或fpga设计的dsp系统具有良好的灵活性和极强的实时性。同时,其价格又可以被大众接受。由于乘法器在数字信号处理系统中具有广泛的应用,所以本文以乘法器的处理系统中具有广泛的应用,所以本文以乘法器的设计为例,来说明采用可编程逻辑器件设计数字系统的方法。如果想使系统具有较快的工作速度,可以采用组合逻辑电路构成的乘法器,但是,这样的乘法器需占用大量的硬件资源,因而很难实现宽位乘法器功能。本文这种用于序逻辑电路构成的乘法器,既节省了芯片资源,又能满足工作速度及原理的要求,因而具有一定的实用价值。
2 系统构成
该乘法器通过逐项移位相加来实现乘法功能。它从被乘数的最低开始,若为1,则乘数左移后再与上一次的和相加;若为0,左移后与0相加,直到移到被乘数的最高位。图1是该乘法器的系统组成框图。该控制模块的star输入有两个功能:第一个功能是将16位移位寄存器清零和被乘数a[7…0]向8位移位寄存器加载;第二个功能为输入乘法使能信号。乘法时钟信号从clk输入,当被乘数加载于8位移位寄存器后,它由低位到高位逐位移出,当qb=1时,选通模块打开,8位乘数b[8…0]被送入加法器,并与上一次锁存在16位锁存器中的高8位相加,其和在下一个时钟上升沿被锁存到锁存器内;当qb=0时,选通模块输出为全0。如此循环8个时钟脉冲后,由控制模块控制的乘法运算过程自动中止。该乘法器的核心元件是8位加法器,其运算速度取决于时钟频率。
图1是该乘法器的系统组成框图
3 加法器的实现
加法器的设计需要考虑资源利用率和进位速度这两个相互矛盾的问题,通常取两个问题的折衷。多位加法器的构成有并行进位和串行进位两方式,前者运算速度快,但需占用较多的硬件资源,而且随着位数的增加,相同位数的并行加法器和串行加法器的硬件资源占用差距快速增大。实践证明,4位二进制并行加法器和串行加法器占用的资源几乎相同,因此,由4位二进制并行加法器级联来构成多位加法器是较好的折衷选择。以下为由两个4位二进制并行加法器级联构成8位二进制加法器的 vhdl程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity adder8b is
port (cin:in std_logic;
a :in std_logic_vector(7 downto 0);
b :in std_logic_vector(7 downto 0);
s :out std_logic_vector(7 downto 0);
out :out std_logic);
end adder8b;
architecture struc of adder8b is
component adder4b
port (cin4: in std_logic;
a4 : in std_logic_vector(3 downto 0);
b4 :in std_logic_vector(3 downto 0);
s4 : out st_d_logic_vector(3 down-to 0);
cout4 : out std_logic);
end component;
signal carry_out : std_logic;
begin
u1:adder4b
port map(cin4=>cin,a4=>a(3 downto 0),b4=>b(3 downto 0),s4=>s(3 downto 0),cout4=>carry_out);
u2 :adder4b
port map(cin4=>carry_out,a4=>a(7 downto 4),b4=>b(7 downto 4),s4=>s(7 downto 4),cout4=>cout);
end struc;
在上面的vhdl描述中,adder4b是一个4位二进制加法器,其vhdl描述是:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity adder4b is
port (cin4 :in std_logic;
a4 :in std_logic_vector(3 downto 0);
b4:in std_logic_vector(3 downto 0);
s4:out std_logic_vector(3 downto 0);
cout4:out std_logic;
eand adder4b;
architec_ture behav of adder4b is
signal sint :std_logic_vector(4 downto 0);
signal aa,bb:std_logic_vector(4 downto 0);
begin
aa<=‘0’&a4;
bb<=‘0’&b4;
sint<=aa+bb+cin4;
s4<=sint(3 downto 0);
cout
1 引言
随着半导体技术的发展,可编程逻辑器件在结构、工艺、集成度、功能、速度和灵活性等方面有了很大的改进和提高,从而为高效率、高质量、灵活地设计数字系统提供了可靠性。cpld或fpga技术的出现,为dsp系统的设计又提供了一种崭新的方法。利用cpld或fpga设计的dsp系统具有良好的灵活性和极强的实时性。同时,其价格又可以被大众接受。由于乘法器在数字信号处理系统中具有广泛的应用,所以本文以乘法器的处理系统中具有广泛的应用,所以本文以乘法器的设计为例,来说明采用可编程逻辑器件设计数字系统的方法。如果想使系统具有较快的工作速度,可以采用组合逻辑电路构成的乘法器,但是,这样的乘法器需占用大量的硬件资源,因而很难实现宽位乘法器功能。本文这种用于序逻辑电路构成的乘法器,既节省了芯片资源,又能满足工作速度及原理的要求,因而具有一定的实用价值。
2 系统构成
该乘法器通过逐项移位相加来实现乘法功能。它从被乘数的最低开始,若为1,则乘数左移后再与上一次的和相加;若为0,左移后与0相加,直到移到被乘数的最高位。图1是该乘法器的系统组成框图。该控制模块的star输入有两个功能:第一个功能是将16位移位寄存器清零和被乘数a[7…0]向8位移位寄存器加载;第二个功能为输入乘法使能信号。乘法时钟信号从clk输入,当被乘数加载于8位移位寄存器后,它由低位到高位逐位移出,当qb=1时,选通模块打开,8位乘数b[8…0]被送入加法器,并与上一次锁存在16位锁存器中的高8位相加,其和在下一个时钟上升沿被锁存到锁存器内;当qb=0时,选通模块输出为全0。如此循环8个时钟脉冲后,由控制模块控制的乘法运算过程自动中止。该乘法器的核心元件是8位加法器,其运算速度取决于时钟频率。
图1是该乘法器的系统组成框图
3 加法器的实现
加法器的设计需要考虑资源利用率和进位速度这两个相互矛盾的问题,通常取两个问题的折衷。多位加法器的构成有并行进位和串行进位两方式,前者运算速度快,但需占用较多的硬件资源,而且随着位数的增加,相同位数的并行加法器和串行加法器的硬件资源占用差距快速增大。实践证明,4位二进制并行加法器和串行加法器占用的资源几乎相同,因此,由4位二进制并行加法器级联来构成多位加法器是较好的折衷选择。以下为由两个4位二进制并行加法器级联构成8位二进制加法器的 vhdl程序:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity adder8b is
port (cin:in std_logic;
a :in std_logic_vector(7 downto 0);
b :in std_logic_vector(7 downto 0);
s :out std_logic_vector(7 downto 0);
out :out std_logic);
end adder8b;
architecture struc of adder8b is
component adder4b
port (cin4: in std_logic;
a4 : in std_logic_vector(3 downto 0);
b4 :in std_logic_vector(3 downto 0);
s4 : out st_d_logic_vector(3 down-to 0);
cout4 : out std_logic);
end component;
signal carry_out : std_logic;
begin
u1:adder4b
port map(cin4=>cin,a4=>a(3 downto 0),b4=>b(3 downto 0),s4=>s(3 downto 0),cout4=>carry_out);
u2 :adder4b
port map(cin4=>carry_out,a4=>a(7 downto 4),b4=>b(7 downto 4),s4=>s(7 downto 4),cout4=>cout);
end struc;
在上面的vhdl描述中,adder4b是一个4位二进制加法器,其vhdl描述是:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity adder4b is
port (cin4 :in std_logic;
a4 :in std_logic_vector(3 downto 0);
b4:in std_logic_vector(3 downto 0);
s4:out std_logic_vector(3 downto 0);
cout4:out std_logic;
eand adder4b;
architec_ture behav of adder4b is
signal sint :std_logic_vector(4 downto 0);
signal aa,bb:std_logic_vector(4 downto 0);
begin
aa<=‘0’&a4;
bb<=‘0’&b4;
sint<=aa+bb+cin4;
s4<=sint(3 downto 0);
cout