第 10章设计优化和设计方法
EDA技术 实用教程康芯科技
10.1 面积优化
10.1.1 资源共享 乘法器0
×
乘法器1
× 选择器
0
1
Result
Sel
A0
B
A1
B
图 10-1 先乘后选择的设计方法 RTL结构康芯科技【 例 10-1】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
ENTITYmultmux IS
PORT (A0,A1,B,IN std_logic_vector(3 downto 0);
sel,IN std_logic;
Result,OUT std_logic_vector(7 downto 0));
END multmux;
ARCHITECTURE rtl OF multmux IS
BEGIN
process(A0,A1,B,sel)
begin
if(sel = '0') then Result <= A0 * B;
else Result <= A1 * B;
图 10-1 先乘后选择的设计方法 RTL结构
end if;
end process;
END rtl;
康芯科技
10.1 面积优化
10.1.1 资源共享图 10-2 先选择后乘设计方法 RTL结构选择器
0
1
乘法器
×
A0
Sel
A1
Result
康芯科技
10.1 面积优化
10.1.1 资源共享
【 例 10-2】
ARCHITECTURE rtl OF muxmult IS
signal temp,std_logic_vector(3 downto 0);
BEGIN
process(A0,A1,B,sel)
begin
if(sel = '0') then temp <= A0; else temp <= A1;
end if;
result <= temp * B;
end process;
END rtl;
康芯科技
10.1 面积优化
10.1.1 资源共享图 10-3 资源共享反例选择器
0
1
A
B
S
R
选择器
0
1
A
B
S
R
选择器
0
1
A
B
S
R
康芯科技
10.1.2 逻辑优化
【 例 10-3】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY mult1 IS
PORT(clk,in std_logic;
ma,In std_logic_vector(11 downto 0);
mc,out std_logic_vector(23 downto 0));
END mult1;
ARCHITECTURE rtl OF mult1 IS
signal ta,tb,std_logic_vector(11 downto 0);
BEGIN
process(clk) begin
if(clk'event and clk = '1') then
ta <= ma; tb <= "100110111001"; mc <= ta * tb;
end if;
end process;
END rtl;
康芯科技
10.1.2 逻辑优化
【 例 10-4】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY mult2 IS
PORT(clk,in std_logic;
ma,In std_logic_vector(11 downto 0);
mc,out std_logic_vector(23 downto 0));
END mult2;
ARCHITECTURE rtl OF mult2 IS
signal ta,std_logic_vector(11 downto 0);
constant tb,std_logic_vector(11 downto 0),= "100110111001";
BEGIN
process(clk) begin
if(clk'event and clk = '1') then ta<=ma; mc<=ta * tb;
end if;
end process;
END rtl;
康芯科技
10.1.3 串行化
【 例 10-5】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY pmultadd IS
PORT(clk,in std_logic;
a0,a1,a2,a3,in std_logic_vector(7 downto 0);
b0,b1,b2,b3,in std_logic_vector(7 downto 0);
yout,out std_logic_vector(15 downto 0));
END pmultadd;
ARCHITECTURE p_arch OF pmultadd IS
BEGIN
process(clk) begin
if(clk'event and clk = '1') then
yout <= ((a0*b0)+(a1*b1))+((a2*b2)+(a3*b3)); end if;
end process;
END p_arch;
康芯科技
10.1.3 串行化 [15,0]
Q[ 15,0]
[1:1 6 ]
D [ 15,0]+
[15,0]
[15,0]
[1:1 6 ]
[15,0]
[15,0]
*
[7:0 ]
[15,0]
[7:0 ]
*
[7:0 ]
[15,0]
[7:0 ]
*
[7:0 ]
[15,0]
[7:0 ]
*
[7:0 ]
[15,0]
[7:0 ]
y out [ 15,0]
[15,0]
b3[ 7,0]
[7:0 ]
b2[ 7,0]
[7:0 ]
b1[ 7,0]
[7:0 ]
b0[ 7,0]
[7:0 ]
a3[ 7,0]
[7:0 ]
a2[ 7,0]
[7:0 ]
a1[ 7,0]
[7:0 ]
a0[ 7,0]
[7:0 ]
c lk
图 10-4 并行并行乘法 RTL结构康芯科技【 例 10-6】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY smultadd IS
PORT(clk,start,in std_logic;
a0,a1,a2,a3,In std_logic_vector(7 downto 0);
b0,b1,b2,b3,In std_logic_vector(7 downto 0);
yout,out std_logic_vector(15 downto 0));
END smultadd;
ARCHITECTURE s_arch OF smultadd IS
signal cnt,std_logic_vector(2 downto 0);
signal tmpa,tmpb,std_logic_vector(7 downto 0);
signal tmp,ytmp,std_logic_vector(15 downto 0);
BEGIN
tmpa <= a0 when cnt = 0 else
a1 when cnt = 1 else
a2 when cnt = 2 else
a3 when cnt = 3 else
a0; 接下页康芯科技
tmpb <= b0 when cnt = 0 else
b1 when cnt = 1 else
b2 when cnt = 2 else
b3 when cnt = 3 else
b0;
tmp <= tmpa * tmpb;
process(clk) begin
if(clk'event and clk = '1') then
if(start = '1') then cnt <= "000"; ytmp <= (others=>'0');
elsif (cnt<4) then cnt <= cnt + 1; ytmp <= ytmp + tmp;
elsif (cnt = 4) then yout <= ytmp;
end if;
end if;
end process;
END s_arch;
康芯科技
10.1.3 串行化图 10-5 串行化结构
[ 1 5,0 ]
Q [ 1 5,0 ]
[ 1,1 6 ]
D [ 1 5,0 ]
R
E
+
[ 1 5,0 ]
[ 1,1 6 ]
[ 1 5,0 ]
*
[ 7,0 ]
[ 1 5,0 ]
[ 7,0 ]
[ 2,0 ]
Q [ 2,0 ]
[ 2,0 ]
D [ 2,0 ]
e
d
e
d
e
d
e
d
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
e
d
e
d
e
d
e
d
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
0
1
[ 0,2 ]
[ 2,0 ]
000
[ 1 5,0 ]
Q [ 1 5,0 ]
[ 1 5,0 ]
D [ 1 5,0 ]
E
+
[ 2,0 ]
[ 0,2 ]
[ 2 ]
[ 0 ]
[ 1 ]
[ 0 ]
[ 1 ]
[ 2 ]
[ 1 ]
[ 0 ]
[ 0 ]
[ 1 ]
[ 0 ]
[ 1 ]
y o u t [ 1 5,0 ]
[ 1 5,0 ]
b 3 [ 7,0 ]
[ 7,0 ]
b 2 [ 7,0 ]
[ 7,0 ]
b 1 [ 7,0 ]
[ 7,0 ]
b 0 [ 7,0 ]
[ 7,0 ]
a 3 [ 7,0 ]
[ 7,0 ]
a 2 [ 7,0 ]
[ 7,0 ]
a 1 [ 7,0 ]
[ 7,0 ]
a 0 [ 7,0 ]
[ 7,0 ]
s t a r t
c lk
康芯科技
10.2 速度优化
10.2.1 流水线设计图 10-6 未使用流水线延时较大的组合逻辑块
Ta
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
康芯科技
10.2 速度优化
10.2.1 流水线设计图 10-7 使用流水线延时较小的组合逻辑块
T1
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
Q
Q
SET
CLR
D
触发器延时较小的组合逻辑块
T2
Ta = T1 + T2
康芯科技
10.2 速度优化
10.2.1 流水线设计信号1 信号2
信号1 信号2
信号1 信号1
未使用流水线流水线第1 级流水线第2 级图 10-8 流水线工作图示康芯科技
【 例 10-7】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY adder4 IS
PORT(clk,in std_logic;
a0,a1,a2,a3,in std_logic_vector(7 downto 0);
yout,out std_logic_vector(9 downto 0));
END adder4;
ARCHITECTURE normal_arch OF adder4 IS
signal t0,t1,t2,t3,std_logic_vector(7 downto 0);
signal addtmp0,addtmp1,std_logic_vector(8 downto 0);
BEGIN
process(clk) begin
if(clk'event and clk='1') then
t0 <= a0; t1 <= a1; t2 <= a2; t3 <= a3;
end if;
end process;
addtmp0 <= '0'&t0 + t1;
addtmp1 <= '0'&t2 + t3;
process(clk) begin
if(clk'event and clk = '1') then yout <= '0'&addtmp0 + addtmp1;
end if;
end process;
END normal_arch;
康芯科技【 例 10-8】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY pipeadd IS
PORT(clk,in std_logic;
a0,a1,a2,a3,in std_logic_vector(7 downto 0);
yout,out std_logic_vector(9 downto 0));
END pipeadd;
ARCHITECTURE pipelining_arch OF pipeadd IS
signal t0,t1,t2,t3,std_logic_vector(7 downto 0);
signal addtmp0,addtmp1,std_logic_vector(8 downto 0);
BEGIN
process(clk) begin
if(clk'event and clk='1') then
t0 <= a0; t1 <= a1; t2 <= a2; t3 <= a3;
end if;
end process;
process(clk) begin
if(clk'event and clk = '1') then
addtmp0 <= '0'&t0 + t1;
addtmp1 <= '0'&t2 + t3;
yout <= '0'&addtmp0 + addtmp1;
end if;
end process;
END pipelining_arch;
康芯科技
10.2 速度优化
10.2.2 寄存器配平图 10-9 不合理的结构延时较大
(组合逻辑1)
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
Q
Q
SET
CLR
D
触发器延时较小
(组合逻辑2)
T1 T2
T1 >T2
T1
T1 > T 2
T2
Q
Q Q
Q Q
Q
康芯科技
10.2 速度优化
10.2.2 寄存器配平图 10-10 寄存器配平的结构延时块
(组合逻辑1)
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
Q
Q
SET
CLR
D
触发器延时块
(组合逻辑2)
t1 t2t1≈t2
t1 t1 ≈ t2 t2
Q Q Q
Q Q
康芯科技
10.2 速度优化
10.2.3 关键路径法图 10-11 关键路径示意延时块
Td2
延时最长
Td1
延时块
Td3
输入 输出关键路径延时最长
T d1
延时块
T d 2
延时块
T d 3
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.1 全局逻辑综合选项图 10-12 全局逻辑综合设置康芯科技图 10-13 全局逻辑综合设置康芯科技
10.3 使用 MAX+plusII优化设计
10.3.1 全局逻辑综合选项
1,普通类型 (Normal)
2,快速类型 (Fast)
3,所见即所得类型 (WYSIWYG)
(1) MAX5000系列 。
(2) MAX3000/MAX7000/MAX9000系列 。
(3) CLASSIC系列 。
(4) FLEX/ACEX系列 。
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.2 时间需求选项
(1) 建立时间 Tsu
(2) 输出时间 Tco
(3) 时钟最大频率 Fmax
(4) 保持时间 Thold
(5) 恢复时间 Tov
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.2 时间需求选项
Tsu Tco
Fmax
图 10-14 部分寄存器时序参数康芯科技
10.3 使用 MAX+plusII优化设计
10.3.2 时间需求选项图 10-15 部分寄存器参数时序图
Tsu T hold
Tco
Fmax
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.2 时间需求选项图 10-16 时间需求设定康芯科技图 10-17 建立保持时间分析器康芯科技
10.3.3 打包 (Clique)
图 10-18 打包 Clique设计示例康芯科技
10.3.3 打包 (Clique)
图 10-19 图 10-18设计适配后的 Floorplan
康芯科技
10.3.3 打包 (Clique)
图 10-20 使用 Clique
康芯科技
10.3.3 打包 (Clique)
图 10-21 Clique对话框康芯科技
10.3.3 打包 (Clique)
图 10-22 Clique后的 Floorplan
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.4 局部逻辑综合选项图 10-23 使用局部逻辑选项康芯科技
10.3.4 局部逻辑综合选项图 10-24 逻辑选项对话框康芯科技
10.3.4 局部逻辑综合选项图 10-25 分立逻辑选项康芯科技
10.3.4 局部逻辑综合选项图 10-26 清除工程选项设置康芯科技
10.3 使用 MAX+plusII优化设计
10.3.5 Probe的使用图 10-27 未加 Probe的设计康芯科技
10.3 使用 MAX+plusII优化设计
10.3.5 Probe的使用图 10-28 右键菜单康芯科技
10.3 使用 MAX+plusII优化设计
10.3.5 Probe的使用图 10-29 加入探针后康芯科技
10.3 使用 MAX+plusII优化设计
10.3.5 Probe的使用图 10-30 probe的仿真波形康芯科技
10.4 其他设置
10.4.1 Slow Slew Rate设置图 10-31 Slow Slew Rate选择康芯科技10.4.2 FPGA配置器件设置与编程图 10-32 EPC2的编程文件产生设置康芯科技10.4.2 FPGA配置器件设置与编程图 10-33 对 EPC2下载康芯科技
10.4.2 FPGA配置器件设置与编程图 10-34 SuperPro L+编程器的器件选择
10.4 其他设置康芯科技
10.4.2 FPGA配置器件设置与编程图 10-35 在 SuperPro /Z编程器中选择编程文件康芯科技
10.4.3 编程文件转换图 10-36 编程文件转换康芯科技
10.4.4 手工分配逻辑宏单元 LCs
图 10-37 适配器设置康芯科技
10.4.4 手工分配逻辑宏单元 LCs
图 10-38 手工分配 LCs
康芯科技习 题
10-1 利用资源共享的面积优化方法对下面程序进行优化 (仅要求在面积上优化 )。 习题程序如下,【 例 10-9】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
ENTITY addmux IS
PORT (A,B,C,D,IN std_logic_vector(7 downto 0);
sel,IN std_logic;
Result,OUT std_logic_vector(7 downto 0));
END addmux;
ARCHITECTURE rtl OF addmux IS
BEGIN
process(A,B,C,D,sel)
begin
if(sel = '0') then Result <= A + B;
else Result <= C + D;
end if;
end process;
END rtl;
康芯科技习 题
10-2 试通过优化逻辑的方式对图 10-39中所示的结构进行改进,给出
VHDL代码和结构图 。
10-3 已知 4阶直接型 FIR滤波器节的数学表达式如下:
y(n)=x(n)h(0)+x(n-1)+x(n-2)h(2)+x(n-3)h(3)
x(n)与 x(n-m),m=0,1,2,3是延迟关系,m表示延迟的 clk数 。 x(n-m)与
h(m)的位宽均为 8位,y(n)为 10位,其中 h(m)在模块例化后为常数 。 该模块的输入为 x(n),clk,输出为 y(n),试实现该逻辑 。
10-4 对习题 10-3中的 FIR滤波器节在速度上进行优化 (在 h(m)固定的情况下 ),试采用流水线技术 。
10-5 利用 FLEX的 LUT结构,构建资源占用较小的常数乘法器,改进习题
10-3,习题 10-4的设计,减少模块的资源使用 。
康芯科技习 题
10-6 若对速度要求不高,但目标芯片的容量较小,试把习题 10-3中的 FIR滤波器用串行化的方式实现 。
10-7 设计一个连续乘法器,输入为 a0,a1,a2,a3,位宽各为 8位,输出
rout为 32位,完成 rout=a0*a1*a2*a3。 试实现之 。
10-8 对 10-7进行优化,判断以下实现方法,那种方法更好?
l rout=((a0*a1)*a2)*a3
l rout=(a0*a1)*(a2*a3)
10-9 为提高速度,对习题 10-8中的前一种方法加上流水线技术进行实现 。
10-10 试对以上的习题解答用修改 MAX+plusII逻辑选项方式,提高速度,减小面积 。
康芯科技习 题图 10-39 习题 10-2图康芯科技实 验 与 设 计
10-1 采用流水线技术设计高速数字相关器
(1) 实验目的,设计一个在数字通信系统中常见的数字相关器,并利用流水线技术提高其工作速度,对其进行仿真和硬件测试 。
(2) 实验原理,数字相关器用于检测等长度的两个数字序列间相等的位数,
实现序列间的相关运算 。
一位相关器,即异或门,异或的结果可以表示两个 1位数据的相关程度 。 异或为 0表示数据位相同;异或为 1表示数据位不同 。 多位数字相关器可以由多个一位相关器构成,如 N位的数字相关器由 N个异或门和 N个 1位相关结果统计电路构成 。
(3) 实验内容 1,根据上述原理设计一个并行 4位数字相关器 (例 10-10是示例程序 )。
提示:利用 CASE语句完成 4个 1位相关结果的统计 。
康芯科技实 验 与 设 计
【 例 10-10】
stemp <= a XOR b;
PROCESS(stemp) BEGIN
CASE stemp IS
WHEN "0000" => c <= "100";
--4
WHEN "0001"|"0010"|"0100"|"1000" => c <= "011";
--3
WHEN "0011"|"0101"|"1001"|"0110"|"1010"|"1100" => c <= "010"; --2
WHEN "0111"|"1011"|"1101"|"1110" => c <= "001"; --1
WHEN "1111" => c <= "000"; -- 0;
WHEN OTHERS => c <= "000";
END CASE;
END PROCESS;
康芯科技实 验 与 设 计
(4) 实验内容 2,利用实验内容 1中的 4位数字相关器设计并行 16位数字相关器 。 使用 MAX+plusII估计最大延时,并计算可能运行的最高频率 。
(5) 实验内容 3,在步骤 4的基础上,利用设计完成的 4位数字相关器设计并行 16位数字相关器,其结构框图见图 10-40,并利用 MAX+plusII计算运行速度 。
(6) 实验内容 4,上面的 16位数字相关器是用 3级组合逻辑实现的,在实际使用时,对其有高速的要求,试使用流水线技术改善其运行速度 。 在输入,
输出及每一级组合逻辑的结果处加入流水线寄存器,提高速度,可参照本章内容进行设计 。
(7) 实验思考题,考虑采用流水线后的运行速度与时钟 clock的关系,测定输出与输入的总延迟 。 若输入序列是串行化的,数字相关器的结构如何设计?
如何利用流水线技术提高其运行速度?
(8) 实验报告,根据以上的实验内容写出实验报告,包括设计原理,程序设计,程序分析,仿真分析,硬件测试和详细实验过程 。
康芯科技实 验 与 设 计图 10-40 16位相关器结构康芯科技实 验 与 设 计
10-2 线性反馈移位寄存器 (LFSR)设计
(1) 实验目的,学习用 VHDL设计 LFSR,掌握利用 FPGA的特殊结构中高效实现 LFSR的方法 。
(2) 实验原理,LFSR即 Linear Feedback Shift Register 线性反馈移位寄存器,
是一种十分有用的时序逻辑结构,广泛用于伪随机序列发生,可编程分频器,CRC校验码生成,PN码等等 。 图 10-41是典型的 LFSR结构 。 由图中可以看出 LFSR由移位寄存器加上 xor构成,不同的 xor决定了不同的生成多项式 。 图 10-41中的生成多项式为 X3+X2+X0。
(3) 实验内容:依据图 10-41设计一个 LFSR,其生成多项式为 X4+X3+X0。 试在 EP1K30TC144器件上加以实现,并利用本章中提及的 MAX+plusII优化选项,使之达到最高运行速度,并在 GW48 EDA开发系统上,对其产生的码序列进行观察 。
(4) 实验思考题,另有一种 LFSR的结构,见图 10-42,试分析与图 10-41中
LFSR结构的异同点 。
康芯科技实 验 与 设 计图 10-41 LFSR举例康芯科技实 验 与 设 计图 10-42 另一种 LFSR结构康芯科技实 验 与 设 计
(5) 实验思考题 2,用 LFSR设计可编程分频器,对实验 8-2中的音阶发生电路的可编程计数器 (实现可编程分频功能 )用 LFSR替代 。
(6) 实验思考题 3,对图 10-42结构的 LFSR电路进行改进,设计成串行 CRC校验码发生器 (提示:反馈线上加入 xor,xor的一个输入端接待编码串行有效信息输入 )。
(7) 实验报告,作出本项实验设计的完整电路图,详细说明其工作原理,完成测试实验内容,对实验中的码序列进行记录,写出电路可达到的最高运行速度及修改的 MAX+plusII选项 。
康芯科技实 验 与 设 计
10-3 直接数字式频率合成器 (DDS)设计实验
(1) 实验目的:学习利用 EDA技术和 FPGA实现直接数字频率综合器的设计 。
(2) 实验原理:直接数字频率综合技术,即 DDS技术,是一种新型的频率合成技术和信号产生方法 。 其电路系统具有较高的频率分辨率,可以实现快速的频率切换,并且在改变时能够保持相位的连续,很容易实现频率,相位和幅度的数控调制 。
康芯科技实 验 与 设 计 同 步寄 存 器频 率 字 输 入寄 存 器同 步寄 存 器相 位 字 输 入正 弦 R O M
查 找 表
D / A
正 弦 信 号 输 出
c l k
系 统 时 钟相 位 累 加 器相 位 调 制 器
N
N
N
M M
数 据 线 位 宽图 10-43 DDS基本结构康芯科技实 验 与 设 计图 10-44 相位累加器位宽和采样点关系康芯科技
【 例 10-11】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DDS_VHDL IS -- 顶层设计
PORT ( CLK,IN STD_LOGIC;
FWORD,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
PWORD,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
FOUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END;
ARCHITECTURE one OF DDS_VHDL IS
COMPONENT REG32B
PORT ( LOAD,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );
END COMPONENT;
COMPONENT REG10B
PORT ( LOAD,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END COMPONENT;
COMPONENT ADDER32B
PORT ( A,IN STD_LOGIC_VECTOR(31 DOWNTO 0);
B,IN STD_LOGIC_VECTOR(31 DOWNTO 0);
S,OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );
接下页康芯科技END COMPONENT;
COMPONENT ADDER10B
PORT ( A,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
B,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
S,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END COMPONENT;
COMPONENT SIN_ROM
PORT ( address,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
inclock,IN STD_LOGIC ;
q,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END COMPONENT;
SIGNAL F32B,STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL D32B,STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL DIN32B,STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL P10B,STD_LOGIC_VECTOR( 9 DOWNTO 0);
SIGNAL LIN10B,STD_LOGIC_VECTOR( 9 DOWNTO 0);
SIGNAL SIN10B,STD_LOGIC_VECTOR( 9 DOWNTO 0);
BEGIN
F32B(27 DOWNTO 20)<=FWORD ; F32B(31 DOWNTO 28)<="0000";
P10B( 1 DOWNTO 0)<="00" ;
F32B(19 DOWNTO 0)<="00000000000000000000" ; P10B( 9 DOWNTO 2)<=PWORD ;
u1,ADDER32B PORT MAP( A=>F32B,B=>D32B,S=>DIN32B );
u2,REG32B PORT MAP( DOUT=>D32B,DIN=> DIN32B,LOAD=>CLK );
u3,SIN_ROM PORT MAP( address=>SIN10B,q=>FOUT,inclock=>CLK );
u4,ADDER10B PORT MAP( A=>P10B,B=>D32B(31 DOWNTO 22),S=>LIN10B );
u5,REG10B PORT MAP( DOUT=>SIN10B,DIN=>LIN10B,LOAD=>CLK );
END;
康芯科技实 验 与 设 计
【 例 10-13】
LIBRARY IEEE; --32位寄存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG32B IS
PORT ( Load,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(31DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(31 DOWNTO0) );
END REG32B;
ARCHITECTURE behav OF REG32B IS
BEGIN
PROCESS(Load,DIN)
BEGIN
IF Load'EVENT AND Load = '1' THEN DOUT <= DIN; END IF;
END PROCESS;
END behav;
康芯科技实 验 与 设 计
【 例 10-14】 rom_data.mif 10位正弦波数据文件
WIDTH=10;
DEPTH=1024;
ADDRESS_RADIX=DEC;
DATA_RADIX=DEC;
CONTENT BEGIN
0,512; 1,515; 2,518; 3,521; 4,524; 5
,527; 6,530; 7,533;
8,537; 9,540; 10,543; 11,546; 12,549;
13,552; 14,555;
.,,,,,
1018,493; 1019,496; 1020,499; 1021,502;
1022,505; 1023,508;
END;
康芯科技实 验 与 设 计
【 例 10-15】
LIBRARY IEEE; --10位加法器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER10BIS
PORT ( A,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
B,IN STD_LOGIC_VECTOR(9 DOWNTO0);
S,OUT STD_LOGIC_VECTOR(9 DOWNTO0) );
END ADDER10B;
ARCHITECTURE behav OF ADDER10B IS
BEGIN
S <= A + B;
END behav;
康芯科技实 验 与 设 计
【 例 10-16】
LIBRARY IEEE; --10位寄存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG10B IS
PORT ( Load,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END REG10B;
ARCHITECTURE behav OF REG10B IS
BEGIN
PROCESS(Load,DIN)
BEGIN
IF Load'EVENT AND Load = '1' THEN DOUT <= DIN; END IF;
END PROCESS;
END behav;
康芯科技【 例 10-17】
LIBRARY ieee; --数据 ROM
USE ieee.std_logic_1164.all;
ENTITYsin_romIS
PORT (address,IN STD_LOGIC_VECTOR (9 DOWNTO0);
inclock,IN STD_LOGIC ;
q,OUT STD_LOGIC_VECTOR (9 DOWNTO 0));
END sin_rom;
ARCHITECTURE SYN OFsin_rom IS
SIGNALsub_wire0,STD_LOGIC_VECTOR (9 DOWNTO0);
COMPONENTlpm_rom --调用 LPM ROM模块
GENERIC (lpm_width,NATURAL;
lpm_widthad,NATURAL;
lpm_address_control,STRING;
lpm_outdata,STRING;
lpm_file,STRING );
PORT ( address,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
inclock,IN STD_LOGIC ;
q,OUT STD_LOGIC_VECTOR (9 DOWNTO 0)
);
END COMPONENT;
BEGIN
q <= sub_wire0(9 DOWNTO0);
lpm_rom_component,lpm_rom GENERIC MAP (LPM_WIDTH=> 10,
LPM_WIDTHAD => 10,LPM_ADDRESS_CONTROL =>
"REGISTERED",
LPM_OUTDATA=> "UNREGISTERED",
LPM_FILE => "./data/LUT10X10.mif" ) –ROM数据文件及其路径
PORT MAP ( address => address,inclock=>inclock,q=>sub_wire0 );
END SYN;
康芯科技实 验 与 设 计图 10-45(a) DDS.vhd综合后的 RTL电路前半块康芯科技实 验 与 设 计图 10-45(b) DDS.vhd综合后的 RTL电路后半块图 10-46 DDS.vhd仿真波形康芯科技实 验 与 设 计
(3) 实验内容 1,详细述叙 DDS的工作原理,依据例 10-11至例 10-17,完成仿真,并由仿真结果进一步说明 DDS的原理 。 完成编译和下载 。 选择模式 1,键 4,键 3输入 8位频率字 FWORD; 键 2,键 1输入 8位相位字
PWORD; 利用 GW48系统 ADDA板上的 10位 D/A 5651输出波形,用示波器观察输出波形 。
(4) 实验内容 2,例 10-11中将 32位频率字和 10位相位字作了截断,都是 8
位 。 如果不作截断,修改例 10-11,并设法在 GW48实验系统上完成实验
( 提示,在例 10-11中增加 2个锁存器 ) 。
(5) 实验内容 3,将上例改成频率可数控的正交信号发生器,即使电路输出两路信号,且相互正交,一路为正弦 (sin)信号,一路为余弦 (cos)信号 ( 此电路可用于正交方式的信号调制解调 ) 。
(6) 实验内容 4,用 DDS实现任意波形发生器 。
(7) 实验内容 5,利用上例设计一个 FSK信号发生器,并硬件实现之 。
(8) 思考题,如果不作截断,此例的频率精度和相位精度分别是多少?
康芯科技实 验 与 设 计
10-4 数控移相正弦信号发生器设计实验
(1) 实验目的,学习利用 DDS设计数控移相正弦信号发生器 。 数控移相正弦信号发生器要求能输出两路正弦信号,由两路 10位 D/A实现波形输出
。 信号频率能通过输入的 8位频率控制字同步控制;其中一路作为参考信号,另一路是可移相的信号,可通过输入的 8位相位控制字控制 。
(2) 实验原理,图 10-46即为数控移相正弦信号发生器的示例电路 。 与图
10-45相比,其结构只是多了一个正弦信号数据 ROM,SIN_ROM,该
ROM的地址线在 10位加法器 ADDER10B之前就引出了,故其输出不会由于 PWORD的改变而发生相移,所以其输出 POUT可作为参考信号 。
康芯科技图 10-46 基于 DDS的数字移相信号发生器电路模型图康芯科技
【 例 10-18】
LIBRARY IEEE;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DDS_VHDL IS -- 顶层设计
PORT ( CLK,IN STD_LOGIC;
FWORD,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
PWORD,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
FOUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0);
POUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
.,,,,,
u1,ADDER32B PORT MAP( A=>F32B,B=>D32B,S=>DIN32B );
u2,REG32B PORT MAP( DOUT=>D32B,DIN=> DIN32B,LOAD=>CLK );
u3,SIN_ROM PORT MAP( address=>SIN10B,q=>FOUT,inclock=>CLK );
u4,ADDER10B PORT MAP( A=>P10B,B=>D32B(31 DOWNTO 22),S=>LIN10B );
u5,REG10B PORT MAP( DOUT=>SIN10B,DIN=>LIN10B,LOAD=>CLK );
u6,SIN_ROM PORT MAP( address=>D32B(31 DOWNTO 22),q=>POUT,
inclock=>CLK );
康芯科技图 10-47仿真波形康芯科技实 验 与 设 计
10-4 数控移相正弦信号发生器设计实验
(3) 实验内容 1,详细述叙图 10-26的工作原理,完成仿真,编译下载和硬件实现 。 选择模式 1,键 4,键 3输入 8位频率字 FWORD; 键 2,键 1
输入 8位相位字 PWORD; 利用 GW48系统 ADDA板上的两路 10位 D/A 5651
输出波形,用示波器观察输出波形,移位情况和对应的李萨如图形 。 通过实验系统上的 clock0,CLK首先选择 12MHz。
(4) 实验内容 2,在此例中增加一个乘法器,构成幅度数控制单元 。
EDA技术 实用教程康芯科技
10.1 面积优化
10.1.1 资源共享 乘法器0
×
乘法器1
× 选择器
0
1
Result
Sel
A0
B
A1
B
图 10-1 先乘后选择的设计方法 RTL结构康芯科技【 例 10-1】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
ENTITYmultmux IS
PORT (A0,A1,B,IN std_logic_vector(3 downto 0);
sel,IN std_logic;
Result,OUT std_logic_vector(7 downto 0));
END multmux;
ARCHITECTURE rtl OF multmux IS
BEGIN
process(A0,A1,B,sel)
begin
if(sel = '0') then Result <= A0 * B;
else Result <= A1 * B;
图 10-1 先乘后选择的设计方法 RTL结构
end if;
end process;
END rtl;
康芯科技
10.1 面积优化
10.1.1 资源共享图 10-2 先选择后乘设计方法 RTL结构选择器
0
1
乘法器
×
A0
Sel
A1
Result
康芯科技
10.1 面积优化
10.1.1 资源共享
【 例 10-2】
ARCHITECTURE rtl OF muxmult IS
signal temp,std_logic_vector(3 downto 0);
BEGIN
process(A0,A1,B,sel)
begin
if(sel = '0') then temp <= A0; else temp <= A1;
end if;
result <= temp * B;
end process;
END rtl;
康芯科技
10.1 面积优化
10.1.1 资源共享图 10-3 资源共享反例选择器
0
1
A
B
S
R
选择器
0
1
A
B
S
R
选择器
0
1
A
B
S
R
康芯科技
10.1.2 逻辑优化
【 例 10-3】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY mult1 IS
PORT(clk,in std_logic;
ma,In std_logic_vector(11 downto 0);
mc,out std_logic_vector(23 downto 0));
END mult1;
ARCHITECTURE rtl OF mult1 IS
signal ta,tb,std_logic_vector(11 downto 0);
BEGIN
process(clk) begin
if(clk'event and clk = '1') then
ta <= ma; tb <= "100110111001"; mc <= ta * tb;
end if;
end process;
END rtl;
康芯科技
10.1.2 逻辑优化
【 例 10-4】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY mult2 IS
PORT(clk,in std_logic;
ma,In std_logic_vector(11 downto 0);
mc,out std_logic_vector(23 downto 0));
END mult2;
ARCHITECTURE rtl OF mult2 IS
signal ta,std_logic_vector(11 downto 0);
constant tb,std_logic_vector(11 downto 0),= "100110111001";
BEGIN
process(clk) begin
if(clk'event and clk = '1') then ta<=ma; mc<=ta * tb;
end if;
end process;
END rtl;
康芯科技
10.1.3 串行化
【 例 10-5】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY pmultadd IS
PORT(clk,in std_logic;
a0,a1,a2,a3,in std_logic_vector(7 downto 0);
b0,b1,b2,b3,in std_logic_vector(7 downto 0);
yout,out std_logic_vector(15 downto 0));
END pmultadd;
ARCHITECTURE p_arch OF pmultadd IS
BEGIN
process(clk) begin
if(clk'event and clk = '1') then
yout <= ((a0*b0)+(a1*b1))+((a2*b2)+(a3*b3)); end if;
end process;
END p_arch;
康芯科技
10.1.3 串行化 [15,0]
Q[ 15,0]
[1:1 6 ]
D [ 15,0]+
[15,0]
[15,0]
[1:1 6 ]
[15,0]
[15,0]
*
[7:0 ]
[15,0]
[7:0 ]
*
[7:0 ]
[15,0]
[7:0 ]
*
[7:0 ]
[15,0]
[7:0 ]
*
[7:0 ]
[15,0]
[7:0 ]
y out [ 15,0]
[15,0]
b3[ 7,0]
[7:0 ]
b2[ 7,0]
[7:0 ]
b1[ 7,0]
[7:0 ]
b0[ 7,0]
[7:0 ]
a3[ 7,0]
[7:0 ]
a2[ 7,0]
[7:0 ]
a1[ 7,0]
[7:0 ]
a0[ 7,0]
[7:0 ]
c lk
图 10-4 并行并行乘法 RTL结构康芯科技【 例 10-6】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY smultadd IS
PORT(clk,start,in std_logic;
a0,a1,a2,a3,In std_logic_vector(7 downto 0);
b0,b1,b2,b3,In std_logic_vector(7 downto 0);
yout,out std_logic_vector(15 downto 0));
END smultadd;
ARCHITECTURE s_arch OF smultadd IS
signal cnt,std_logic_vector(2 downto 0);
signal tmpa,tmpb,std_logic_vector(7 downto 0);
signal tmp,ytmp,std_logic_vector(15 downto 0);
BEGIN
tmpa <= a0 when cnt = 0 else
a1 when cnt = 1 else
a2 when cnt = 2 else
a3 when cnt = 3 else
a0; 接下页康芯科技
tmpb <= b0 when cnt = 0 else
b1 when cnt = 1 else
b2 when cnt = 2 else
b3 when cnt = 3 else
b0;
tmp <= tmpa * tmpb;
process(clk) begin
if(clk'event and clk = '1') then
if(start = '1') then cnt <= "000"; ytmp <= (others=>'0');
elsif (cnt<4) then cnt <= cnt + 1; ytmp <= ytmp + tmp;
elsif (cnt = 4) then yout <= ytmp;
end if;
end if;
end process;
END s_arch;
康芯科技
10.1.3 串行化图 10-5 串行化结构
[ 1 5,0 ]
Q [ 1 5,0 ]
[ 1,1 6 ]
D [ 1 5,0 ]
R
E
+
[ 1 5,0 ]
[ 1,1 6 ]
[ 1 5,0 ]
*
[ 7,0 ]
[ 1 5,0 ]
[ 7,0 ]
[ 2,0 ]
Q [ 2,0 ]
[ 2,0 ]
D [ 2,0 ]
e
d
e
d
e
d
e
d
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
e
d
e
d
e
d
e
d
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
[ 7,0 ]
0
1
[ 0,2 ]
[ 2,0 ]
000
[ 1 5,0 ]
Q [ 1 5,0 ]
[ 1 5,0 ]
D [ 1 5,0 ]
E
+
[ 2,0 ]
[ 0,2 ]
[ 2 ]
[ 0 ]
[ 1 ]
[ 0 ]
[ 1 ]
[ 2 ]
[ 1 ]
[ 0 ]
[ 0 ]
[ 1 ]
[ 0 ]
[ 1 ]
y o u t [ 1 5,0 ]
[ 1 5,0 ]
b 3 [ 7,0 ]
[ 7,0 ]
b 2 [ 7,0 ]
[ 7,0 ]
b 1 [ 7,0 ]
[ 7,0 ]
b 0 [ 7,0 ]
[ 7,0 ]
a 3 [ 7,0 ]
[ 7,0 ]
a 2 [ 7,0 ]
[ 7,0 ]
a 1 [ 7,0 ]
[ 7,0 ]
a 0 [ 7,0 ]
[ 7,0 ]
s t a r t
c lk
康芯科技
10.2 速度优化
10.2.1 流水线设计图 10-6 未使用流水线延时较大的组合逻辑块
Ta
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
康芯科技
10.2 速度优化
10.2.1 流水线设计图 10-7 使用流水线延时较小的组合逻辑块
T1
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
Q
Q
SET
CLR
D
触发器延时较小的组合逻辑块
T2
Ta = T1 + T2
康芯科技
10.2 速度优化
10.2.1 流水线设计信号1 信号2
信号1 信号2
信号1 信号1
未使用流水线流水线第1 级流水线第2 级图 10-8 流水线工作图示康芯科技
【 例 10-7】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY adder4 IS
PORT(clk,in std_logic;
a0,a1,a2,a3,in std_logic_vector(7 downto 0);
yout,out std_logic_vector(9 downto 0));
END adder4;
ARCHITECTURE normal_arch OF adder4 IS
signal t0,t1,t2,t3,std_logic_vector(7 downto 0);
signal addtmp0,addtmp1,std_logic_vector(8 downto 0);
BEGIN
process(clk) begin
if(clk'event and clk='1') then
t0 <= a0; t1 <= a1; t2 <= a2; t3 <= a3;
end if;
end process;
addtmp0 <= '0'&t0 + t1;
addtmp1 <= '0'&t2 + t3;
process(clk) begin
if(clk'event and clk = '1') then yout <= '0'&addtmp0 + addtmp1;
end if;
end process;
END normal_arch;
康芯科技【 例 10-8】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
ENTITY pipeadd IS
PORT(clk,in std_logic;
a0,a1,a2,a3,in std_logic_vector(7 downto 0);
yout,out std_logic_vector(9 downto 0));
END pipeadd;
ARCHITECTURE pipelining_arch OF pipeadd IS
signal t0,t1,t2,t3,std_logic_vector(7 downto 0);
signal addtmp0,addtmp1,std_logic_vector(8 downto 0);
BEGIN
process(clk) begin
if(clk'event and clk='1') then
t0 <= a0; t1 <= a1; t2 <= a2; t3 <= a3;
end if;
end process;
process(clk) begin
if(clk'event and clk = '1') then
addtmp0 <= '0'&t0 + t1;
addtmp1 <= '0'&t2 + t3;
yout <= '0'&addtmp0 + addtmp1;
end if;
end process;
END pipelining_arch;
康芯科技
10.2 速度优化
10.2.2 寄存器配平图 10-9 不合理的结构延时较大
(组合逻辑1)
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
Q
Q
SET
CLR
D
触发器延时较小
(组合逻辑2)
T1 T2
T1 >T2
T1
T1 > T 2
T2
Q
Q Q
Q Q
Q
康芯科技
10.2 速度优化
10.2.2 寄存器配平图 10-10 寄存器配平的结构延时块
(组合逻辑1)
Q
Q
SET
CLR
D
触发器
Q
Q
SET
CLR
D
触发器
clk
Q
Q
SET
CLR
D
触发器延时块
(组合逻辑2)
t1 t2t1≈t2
t1 t1 ≈ t2 t2
Q Q Q
Q Q
康芯科技
10.2 速度优化
10.2.3 关键路径法图 10-11 关键路径示意延时块
Td2
延时最长
Td1
延时块
Td3
输入 输出关键路径延时最长
T d1
延时块
T d 2
延时块
T d 3
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.1 全局逻辑综合选项图 10-12 全局逻辑综合设置康芯科技图 10-13 全局逻辑综合设置康芯科技
10.3 使用 MAX+plusII优化设计
10.3.1 全局逻辑综合选项
1,普通类型 (Normal)
2,快速类型 (Fast)
3,所见即所得类型 (WYSIWYG)
(1) MAX5000系列 。
(2) MAX3000/MAX7000/MAX9000系列 。
(3) CLASSIC系列 。
(4) FLEX/ACEX系列 。
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.2 时间需求选项
(1) 建立时间 Tsu
(2) 输出时间 Tco
(3) 时钟最大频率 Fmax
(4) 保持时间 Thold
(5) 恢复时间 Tov
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.2 时间需求选项
Tsu Tco
Fmax
图 10-14 部分寄存器时序参数康芯科技
10.3 使用 MAX+plusII优化设计
10.3.2 时间需求选项图 10-15 部分寄存器参数时序图
Tsu T hold
Tco
Fmax
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.2 时间需求选项图 10-16 时间需求设定康芯科技图 10-17 建立保持时间分析器康芯科技
10.3.3 打包 (Clique)
图 10-18 打包 Clique设计示例康芯科技
10.3.3 打包 (Clique)
图 10-19 图 10-18设计适配后的 Floorplan
康芯科技
10.3.3 打包 (Clique)
图 10-20 使用 Clique
康芯科技
10.3.3 打包 (Clique)
图 10-21 Clique对话框康芯科技
10.3.3 打包 (Clique)
图 10-22 Clique后的 Floorplan
康芯科技
10.3 使用 MAX+plusII优化设计
10.3.4 局部逻辑综合选项图 10-23 使用局部逻辑选项康芯科技
10.3.4 局部逻辑综合选项图 10-24 逻辑选项对话框康芯科技
10.3.4 局部逻辑综合选项图 10-25 分立逻辑选项康芯科技
10.3.4 局部逻辑综合选项图 10-26 清除工程选项设置康芯科技
10.3 使用 MAX+plusII优化设计
10.3.5 Probe的使用图 10-27 未加 Probe的设计康芯科技
10.3 使用 MAX+plusII优化设计
10.3.5 Probe的使用图 10-28 右键菜单康芯科技
10.3 使用 MAX+plusII优化设计
10.3.5 Probe的使用图 10-29 加入探针后康芯科技
10.3 使用 MAX+plusII优化设计
10.3.5 Probe的使用图 10-30 probe的仿真波形康芯科技
10.4 其他设置
10.4.1 Slow Slew Rate设置图 10-31 Slow Slew Rate选择康芯科技10.4.2 FPGA配置器件设置与编程图 10-32 EPC2的编程文件产生设置康芯科技10.4.2 FPGA配置器件设置与编程图 10-33 对 EPC2下载康芯科技
10.4.2 FPGA配置器件设置与编程图 10-34 SuperPro L+编程器的器件选择
10.4 其他设置康芯科技
10.4.2 FPGA配置器件设置与编程图 10-35 在 SuperPro /Z编程器中选择编程文件康芯科技
10.4.3 编程文件转换图 10-36 编程文件转换康芯科技
10.4.4 手工分配逻辑宏单元 LCs
图 10-37 适配器设置康芯科技
10.4.4 手工分配逻辑宏单元 LCs
图 10-38 手工分配 LCs
康芯科技习 题
10-1 利用资源共享的面积优化方法对下面程序进行优化 (仅要求在面积上优化 )。 习题程序如下,【 例 10-9】
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
USE ieee.std_logic_arith.all;
ENTITY addmux IS
PORT (A,B,C,D,IN std_logic_vector(7 downto 0);
sel,IN std_logic;
Result,OUT std_logic_vector(7 downto 0));
END addmux;
ARCHITECTURE rtl OF addmux IS
BEGIN
process(A,B,C,D,sel)
begin
if(sel = '0') then Result <= A + B;
else Result <= C + D;
end if;
end process;
END rtl;
康芯科技习 题
10-2 试通过优化逻辑的方式对图 10-39中所示的结构进行改进,给出
VHDL代码和结构图 。
10-3 已知 4阶直接型 FIR滤波器节的数学表达式如下:
y(n)=x(n)h(0)+x(n-1)+x(n-2)h(2)+x(n-3)h(3)
x(n)与 x(n-m),m=0,1,2,3是延迟关系,m表示延迟的 clk数 。 x(n-m)与
h(m)的位宽均为 8位,y(n)为 10位,其中 h(m)在模块例化后为常数 。 该模块的输入为 x(n),clk,输出为 y(n),试实现该逻辑 。
10-4 对习题 10-3中的 FIR滤波器节在速度上进行优化 (在 h(m)固定的情况下 ),试采用流水线技术 。
10-5 利用 FLEX的 LUT结构,构建资源占用较小的常数乘法器,改进习题
10-3,习题 10-4的设计,减少模块的资源使用 。
康芯科技习 题
10-6 若对速度要求不高,但目标芯片的容量较小,试把习题 10-3中的 FIR滤波器用串行化的方式实现 。
10-7 设计一个连续乘法器,输入为 a0,a1,a2,a3,位宽各为 8位,输出
rout为 32位,完成 rout=a0*a1*a2*a3。 试实现之 。
10-8 对 10-7进行优化,判断以下实现方法,那种方法更好?
l rout=((a0*a1)*a2)*a3
l rout=(a0*a1)*(a2*a3)
10-9 为提高速度,对习题 10-8中的前一种方法加上流水线技术进行实现 。
10-10 试对以上的习题解答用修改 MAX+plusII逻辑选项方式,提高速度,减小面积 。
康芯科技习 题图 10-39 习题 10-2图康芯科技实 验 与 设 计
10-1 采用流水线技术设计高速数字相关器
(1) 实验目的,设计一个在数字通信系统中常见的数字相关器,并利用流水线技术提高其工作速度,对其进行仿真和硬件测试 。
(2) 实验原理,数字相关器用于检测等长度的两个数字序列间相等的位数,
实现序列间的相关运算 。
一位相关器,即异或门,异或的结果可以表示两个 1位数据的相关程度 。 异或为 0表示数据位相同;异或为 1表示数据位不同 。 多位数字相关器可以由多个一位相关器构成,如 N位的数字相关器由 N个异或门和 N个 1位相关结果统计电路构成 。
(3) 实验内容 1,根据上述原理设计一个并行 4位数字相关器 (例 10-10是示例程序 )。
提示:利用 CASE语句完成 4个 1位相关结果的统计 。
康芯科技实 验 与 设 计
【 例 10-10】
stemp <= a XOR b;
PROCESS(stemp) BEGIN
CASE stemp IS
WHEN "0000" => c <= "100";
--4
WHEN "0001"|"0010"|"0100"|"1000" => c <= "011";
--3
WHEN "0011"|"0101"|"1001"|"0110"|"1010"|"1100" => c <= "010"; --2
WHEN "0111"|"1011"|"1101"|"1110" => c <= "001"; --1
WHEN "1111" => c <= "000"; -- 0;
WHEN OTHERS => c <= "000";
END CASE;
END PROCESS;
康芯科技实 验 与 设 计
(4) 实验内容 2,利用实验内容 1中的 4位数字相关器设计并行 16位数字相关器 。 使用 MAX+plusII估计最大延时,并计算可能运行的最高频率 。
(5) 实验内容 3,在步骤 4的基础上,利用设计完成的 4位数字相关器设计并行 16位数字相关器,其结构框图见图 10-40,并利用 MAX+plusII计算运行速度 。
(6) 实验内容 4,上面的 16位数字相关器是用 3级组合逻辑实现的,在实际使用时,对其有高速的要求,试使用流水线技术改善其运行速度 。 在输入,
输出及每一级组合逻辑的结果处加入流水线寄存器,提高速度,可参照本章内容进行设计 。
(7) 实验思考题,考虑采用流水线后的运行速度与时钟 clock的关系,测定输出与输入的总延迟 。 若输入序列是串行化的,数字相关器的结构如何设计?
如何利用流水线技术提高其运行速度?
(8) 实验报告,根据以上的实验内容写出实验报告,包括设计原理,程序设计,程序分析,仿真分析,硬件测试和详细实验过程 。
康芯科技实 验 与 设 计图 10-40 16位相关器结构康芯科技实 验 与 设 计
10-2 线性反馈移位寄存器 (LFSR)设计
(1) 实验目的,学习用 VHDL设计 LFSR,掌握利用 FPGA的特殊结构中高效实现 LFSR的方法 。
(2) 实验原理,LFSR即 Linear Feedback Shift Register 线性反馈移位寄存器,
是一种十分有用的时序逻辑结构,广泛用于伪随机序列发生,可编程分频器,CRC校验码生成,PN码等等 。 图 10-41是典型的 LFSR结构 。 由图中可以看出 LFSR由移位寄存器加上 xor构成,不同的 xor决定了不同的生成多项式 。 图 10-41中的生成多项式为 X3+X2+X0。
(3) 实验内容:依据图 10-41设计一个 LFSR,其生成多项式为 X4+X3+X0。 试在 EP1K30TC144器件上加以实现,并利用本章中提及的 MAX+plusII优化选项,使之达到最高运行速度,并在 GW48 EDA开发系统上,对其产生的码序列进行观察 。
(4) 实验思考题,另有一种 LFSR的结构,见图 10-42,试分析与图 10-41中
LFSR结构的异同点 。
康芯科技实 验 与 设 计图 10-41 LFSR举例康芯科技实 验 与 设 计图 10-42 另一种 LFSR结构康芯科技实 验 与 设 计
(5) 实验思考题 2,用 LFSR设计可编程分频器,对实验 8-2中的音阶发生电路的可编程计数器 (实现可编程分频功能 )用 LFSR替代 。
(6) 实验思考题 3,对图 10-42结构的 LFSR电路进行改进,设计成串行 CRC校验码发生器 (提示:反馈线上加入 xor,xor的一个输入端接待编码串行有效信息输入 )。
(7) 实验报告,作出本项实验设计的完整电路图,详细说明其工作原理,完成测试实验内容,对实验中的码序列进行记录,写出电路可达到的最高运行速度及修改的 MAX+plusII选项 。
康芯科技实 验 与 设 计
10-3 直接数字式频率合成器 (DDS)设计实验
(1) 实验目的:学习利用 EDA技术和 FPGA实现直接数字频率综合器的设计 。
(2) 实验原理:直接数字频率综合技术,即 DDS技术,是一种新型的频率合成技术和信号产生方法 。 其电路系统具有较高的频率分辨率,可以实现快速的频率切换,并且在改变时能够保持相位的连续,很容易实现频率,相位和幅度的数控调制 。
康芯科技实 验 与 设 计 同 步寄 存 器频 率 字 输 入寄 存 器同 步寄 存 器相 位 字 输 入正 弦 R O M
查 找 表
D / A
正 弦 信 号 输 出
c l k
系 统 时 钟相 位 累 加 器相 位 调 制 器
N
N
N
M M
数 据 线 位 宽图 10-43 DDS基本结构康芯科技实 验 与 设 计图 10-44 相位累加器位宽和采样点关系康芯科技
【 例 10-11】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DDS_VHDL IS -- 顶层设计
PORT ( CLK,IN STD_LOGIC;
FWORD,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
PWORD,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
FOUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END;
ARCHITECTURE one OF DDS_VHDL IS
COMPONENT REG32B
PORT ( LOAD,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );
END COMPONENT;
COMPONENT REG10B
PORT ( LOAD,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END COMPONENT;
COMPONENT ADDER32B
PORT ( A,IN STD_LOGIC_VECTOR(31 DOWNTO 0);
B,IN STD_LOGIC_VECTOR(31 DOWNTO 0);
S,OUT STD_LOGIC_VECTOR(31 DOWNTO 0) );
接下页康芯科技END COMPONENT;
COMPONENT ADDER10B
PORT ( A,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
B,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
S,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END COMPONENT;
COMPONENT SIN_ROM
PORT ( address,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
inclock,IN STD_LOGIC ;
q,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END COMPONENT;
SIGNAL F32B,STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL D32B,STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL DIN32B,STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL P10B,STD_LOGIC_VECTOR( 9 DOWNTO 0);
SIGNAL LIN10B,STD_LOGIC_VECTOR( 9 DOWNTO 0);
SIGNAL SIN10B,STD_LOGIC_VECTOR( 9 DOWNTO 0);
BEGIN
F32B(27 DOWNTO 20)<=FWORD ; F32B(31 DOWNTO 28)<="0000";
P10B( 1 DOWNTO 0)<="00" ;
F32B(19 DOWNTO 0)<="00000000000000000000" ; P10B( 9 DOWNTO 2)<=PWORD ;
u1,ADDER32B PORT MAP( A=>F32B,B=>D32B,S=>DIN32B );
u2,REG32B PORT MAP( DOUT=>D32B,DIN=> DIN32B,LOAD=>CLK );
u3,SIN_ROM PORT MAP( address=>SIN10B,q=>FOUT,inclock=>CLK );
u4,ADDER10B PORT MAP( A=>P10B,B=>D32B(31 DOWNTO 22),S=>LIN10B );
u5,REG10B PORT MAP( DOUT=>SIN10B,DIN=>LIN10B,LOAD=>CLK );
END;
康芯科技实 验 与 设 计
【 例 10-13】
LIBRARY IEEE; --32位寄存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG32B IS
PORT ( Load,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(31DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(31 DOWNTO0) );
END REG32B;
ARCHITECTURE behav OF REG32B IS
BEGIN
PROCESS(Load,DIN)
BEGIN
IF Load'EVENT AND Load = '1' THEN DOUT <= DIN; END IF;
END PROCESS;
END behav;
康芯科技实 验 与 设 计
【 例 10-14】 rom_data.mif 10位正弦波数据文件
WIDTH=10;
DEPTH=1024;
ADDRESS_RADIX=DEC;
DATA_RADIX=DEC;
CONTENT BEGIN
0,512; 1,515; 2,518; 3,521; 4,524; 5
,527; 6,530; 7,533;
8,537; 9,540; 10,543; 11,546; 12,549;
13,552; 14,555;
.,,,,,
1018,493; 1019,496; 1020,499; 1021,502;
1022,505; 1023,508;
END;
康芯科技实 验 与 设 计
【 例 10-15】
LIBRARY IEEE; --10位加法器
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER10BIS
PORT ( A,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
B,IN STD_LOGIC_VECTOR(9 DOWNTO0);
S,OUT STD_LOGIC_VECTOR(9 DOWNTO0) );
END ADDER10B;
ARCHITECTURE behav OF ADDER10B IS
BEGIN
S <= A + B;
END behav;
康芯科技实 验 与 设 计
【 例 10-16】
LIBRARY IEEE; --10位寄存器
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG10B IS
PORT ( Load,IN STD_LOGIC;
DIN,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
DOUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
END REG10B;
ARCHITECTURE behav OF REG10B IS
BEGIN
PROCESS(Load,DIN)
BEGIN
IF Load'EVENT AND Load = '1' THEN DOUT <= DIN; END IF;
END PROCESS;
END behav;
康芯科技【 例 10-17】
LIBRARY ieee; --数据 ROM
USE ieee.std_logic_1164.all;
ENTITYsin_romIS
PORT (address,IN STD_LOGIC_VECTOR (9 DOWNTO0);
inclock,IN STD_LOGIC ;
q,OUT STD_LOGIC_VECTOR (9 DOWNTO 0));
END sin_rom;
ARCHITECTURE SYN OFsin_rom IS
SIGNALsub_wire0,STD_LOGIC_VECTOR (9 DOWNTO0);
COMPONENTlpm_rom --调用 LPM ROM模块
GENERIC (lpm_width,NATURAL;
lpm_widthad,NATURAL;
lpm_address_control,STRING;
lpm_outdata,STRING;
lpm_file,STRING );
PORT ( address,IN STD_LOGIC_VECTOR(9 DOWNTO 0);
inclock,IN STD_LOGIC ;
q,OUT STD_LOGIC_VECTOR (9 DOWNTO 0)
);
END COMPONENT;
BEGIN
q <= sub_wire0(9 DOWNTO0);
lpm_rom_component,lpm_rom GENERIC MAP (LPM_WIDTH=> 10,
LPM_WIDTHAD => 10,LPM_ADDRESS_CONTROL =>
"REGISTERED",
LPM_OUTDATA=> "UNREGISTERED",
LPM_FILE => "./data/LUT10X10.mif" ) –ROM数据文件及其路径
PORT MAP ( address => address,inclock=>inclock,q=>sub_wire0 );
END SYN;
康芯科技实 验 与 设 计图 10-45(a) DDS.vhd综合后的 RTL电路前半块康芯科技实 验 与 设 计图 10-45(b) DDS.vhd综合后的 RTL电路后半块图 10-46 DDS.vhd仿真波形康芯科技实 验 与 设 计
(3) 实验内容 1,详细述叙 DDS的工作原理,依据例 10-11至例 10-17,完成仿真,并由仿真结果进一步说明 DDS的原理 。 完成编译和下载 。 选择模式 1,键 4,键 3输入 8位频率字 FWORD; 键 2,键 1输入 8位相位字
PWORD; 利用 GW48系统 ADDA板上的 10位 D/A 5651输出波形,用示波器观察输出波形 。
(4) 实验内容 2,例 10-11中将 32位频率字和 10位相位字作了截断,都是 8
位 。 如果不作截断,修改例 10-11,并设法在 GW48实验系统上完成实验
( 提示,在例 10-11中增加 2个锁存器 ) 。
(5) 实验内容 3,将上例改成频率可数控的正交信号发生器,即使电路输出两路信号,且相互正交,一路为正弦 (sin)信号,一路为余弦 (cos)信号 ( 此电路可用于正交方式的信号调制解调 ) 。
(6) 实验内容 4,用 DDS实现任意波形发生器 。
(7) 实验内容 5,利用上例设计一个 FSK信号发生器,并硬件实现之 。
(8) 思考题,如果不作截断,此例的频率精度和相位精度分别是多少?
康芯科技实 验 与 设 计
10-4 数控移相正弦信号发生器设计实验
(1) 实验目的,学习利用 DDS设计数控移相正弦信号发生器 。 数控移相正弦信号发生器要求能输出两路正弦信号,由两路 10位 D/A实现波形输出
。 信号频率能通过输入的 8位频率控制字同步控制;其中一路作为参考信号,另一路是可移相的信号,可通过输入的 8位相位控制字控制 。
(2) 实验原理,图 10-46即为数控移相正弦信号发生器的示例电路 。 与图
10-45相比,其结构只是多了一个正弦信号数据 ROM,SIN_ROM,该
ROM的地址线在 10位加法器 ADDER10B之前就引出了,故其输出不会由于 PWORD的改变而发生相移,所以其输出 POUT可作为参考信号 。
康芯科技图 10-46 基于 DDS的数字移相信号发生器电路模型图康芯科技
【 例 10-18】
LIBRARY IEEE;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY DDS_VHDL IS -- 顶层设计
PORT ( CLK,IN STD_LOGIC;
FWORD,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
PWORD,IN STD_LOGIC_VECTOR(7 DOWNTO 0);
FOUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0);
POUT,OUT STD_LOGIC_VECTOR(9 DOWNTO 0) );
.,,,,,
u1,ADDER32B PORT MAP( A=>F32B,B=>D32B,S=>DIN32B );
u2,REG32B PORT MAP( DOUT=>D32B,DIN=> DIN32B,LOAD=>CLK );
u3,SIN_ROM PORT MAP( address=>SIN10B,q=>FOUT,inclock=>CLK );
u4,ADDER10B PORT MAP( A=>P10B,B=>D32B(31 DOWNTO 22),S=>LIN10B );
u5,REG10B PORT MAP( DOUT=>SIN10B,DIN=>LIN10B,LOAD=>CLK );
u6,SIN_ROM PORT MAP( address=>D32B(31 DOWNTO 22),q=>POUT,
inclock=>CLK );
康芯科技图 10-47仿真波形康芯科技实 验 与 设 计
10-4 数控移相正弦信号发生器设计实验
(3) 实验内容 1,详细述叙图 10-26的工作原理,完成仿真,编译下载和硬件实现 。 选择模式 1,键 4,键 3输入 8位频率字 FWORD; 键 2,键 1
输入 8位相位字 PWORD; 利用 GW48系统 ADDA板上的两路 10位 D/A 5651
输出波形,用示波器观察输出波形,移位情况和对应的李萨如图形 。 通过实验系统上的 clock0,CLK首先选择 12MHz。
(4) 实验内容 2,在此例中增加一个乘法器,构成幅度数控制单元 。