第 7章 电子系统设计实践(二)
<EDA技术 与应用 > 课程讲义
下一章
合肥工业大学 彭良清
上一章
本章内容
1,正弦信号发生器
2,8位硬件乘法器设计
3,乐曲硬件演奏电路设计
正弦信号发生器
? 目的:学会使用 LPM模块,ROM模块。
? 原理:如何用 FPGA硬件实现?
Y=sin(x) x,0~2π
有 2个方法:
1,台劳级数展开,sin运算 变成 乘加运算,
硬件实现 乘加 运算 。
2,查表法。 硬件查表
查表法的 正弦信号发生器
必须先解决的 2个问题:
1,在 FPGA中如何 存储 正弦函数表?
? 使用 LPM_ROM宏模块
2,如何 得到 y=sinx 函数的关系表
? 用高级语言程序计算
? 用 excel表计算(最为简单)
正弦信号发生器:设计步骤
1,用 excel计算 y=sinx的数值 。
2,编辑 *.mif文件,保存步骤一计算的结果
3,定制用于存储 mif文件的 LPM_ROM模块
4,编写对 LPM_ROM模块进行查表的代码
5,编译、仿真测试
6,完毕
用 excel计算 y=sinx的数值
? X的取值范围,变化步长(分辨率)
X(0~63)
输入
A=x*2*3.1415926/64
折算的角度(弧度)
B=SIN(A)
正弦值
C=(1+B1)*127.5
折算 0~255量程数
00 0 0 127
01 0.098172688 0.841470985 234
02 0.196349538 0.909297427 243
03 0.294518063 0.141120008 145
·········
FE 6.086835663 -0.739180697 33
FF 6.184879313 0.1673557 148
计算过程参见:
正弦数据的 EXCEL表
mif文件 格式
1,DEPTH = 64; % Memory depth and width are required %
2,WIDTH = 8; % Enter a decimal number %
3,ADDRESS_RADIX = HEX;% Address and value radixes are optional %
4,DATA_RADIX = HEX; % Enter BIN,DEC,HEX,or OCT; unless %
5,% otherwise specified,radixes = HEX %
6,-- Specify values for addresses,which can be single address or range
7,CONTENT
8,BEGIN
9,[0..F],3FFF; % Range--Every address from 0 to F = 3FFF %
10,6, F; % Single address--Address 6 = F %
11,8, F E 5; % Range starting from specific address-- %
12,END ; % Addr[8] = F,Addr[9] = E,Addr[A] = 5 %
本例中的 mif文件 的内容
1,DEPTH = 64;
2,WIDTH = 8;
3,ADDRESS_RADIX = DEC; -- HEX
4,DATA_RADIX = DEC; --HEX
5,CONTENT
6,BEGIN
7,0,127;
8,1,234;
9,2,243;
10,3,145;
11,4,31;
12,5,5;
13,6,91;
14,7,211;
15,8,253;
16,………
17,61,4;
18,62,33;
19,63,148;
20,END ;
详细参见:
P196_EX7_12_SINDATA
Mif文件的 2种编辑方法
1,对话窗 下输入
? FILE->NEW->OTHER FILES-MEMORY INITIALIZATION FILE
2,任何 文本编辑器 直接输入,要注意格式
定制用于存储 mif文件 的 LPM_ROM模块
? 进入,Tools->MegaWizard Plug-In Manager
设置 LPM_ROM的数据位和地址宽度
指定 ROM要保存的 mif文件名称
最终自动生成的 LPM_ROM文件如下
1,ENTITY sindata IS
2,PORT ( address, IN STD_LOGIC_VECTOR (5 DOWNTO 0);
3,inclock, IN STD_LOGIC ;
4,q, OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
5,END sindata;
6,ARCHITECTURE SYN OF sindata IS
7,SIGNAL sub_wire0, STD_LOGIC_VECTOR (7 DOWNTO 0);
8,COMPONENT lpm_rom
9,GENERIC ( lpm_width, NATURAL;
10,lpm_widthad, NATURAL;
11,lpm_address_control, STRING;
12,lpm_outdata, STRING;
13,lpm_file, STRING );
14,PORT ( address, IN STD_LOGIC_VECTOR (5 DOWNTO 0);
15,inclock, IN STD_LOGIC ;
16,q, OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
17,END COMPONENT;
18,BEGIN
19,q <= sub_wire0(7 DOWNTO 0);
20,lpm_rom_component, lpm_rom
21,GENERIC MAP ( LPM_WIDTH => 8,
22,LPM_WIDTHAD => 6,
23,LPM_ADDRESS_CONTROL => "REGISTERED",
24,LPM_OUTDATA => "UNREGISTERED",
25,LPM_FILE => "./p196_ex7_12_sindata.mif" )
26,PORT MAP ( address => address,
27,inclock => inclock,
28,q => sub_wire0 );
29,END SYN;
编写对 LPM_ROM模块进行
查表的代码
1,ENTITY SINGT IS
2,PORT ( CLK, IN STD_LOGIC;
3,DOUT, OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
4,END SINGT;
5,ARCHITECTURE DACC OF SINGT IS
6,COMPONENT SINADATA
7,PORT ( address, IN STD_LOGIC_VECTOR (5 DOWNTO 0);
8,inclock, IN STD_LOGIC ;
9,q, OUT STD_LOGIC_VECTOR (7 DOWNTO 0) );
10,SIGNAL Q1, STD_LOGIC_VECTOR (5 DOWNTO 0);
11,BEGIN
12,PROCESS ( CLK )
13,BEGIN
14,IF CLK'EVENT AND CLK = '1' THEN
15,Q1 <= Q1+1;;
16,END IF;
17,END PROCESS;
18,U1,SINDATA PORT MAP ( adress => Q1,=> DOUT,inclock => CLK );
19,END ARCHITECTURE DACC;
8位硬件乘法器设计:目的
1,掌握用 FPGA实现数学运算的方法
2,了解快速乘法器设计的问题
3,训练大型 VHDL代码的分析和阅读的技巧
4,加深对 VHDL语法和电路设计方法的理解
8位硬件乘法器设计:方法
1,快速硬件的乘法器 是 FPGA应用的重要课题
2,高档 FPGA器件 具有 硬件 乘法器模块
3,FPGA中实现硬件乘法器的 方法 有 4种:
① 移位累加乘法器
② 查询表乘法器
③ Booth乘法器
④ 加法器树结构乘法器 参考:基于 FPGA的乘法器
实现结构分析与仿真
移位累加 乘法器
? 过程同一般心算过

? 根据被乘数为,1”
或,0”来决定乘数
的移位和累加运算
? 例子:
D7 D6 D5 D4 D3 D2 D1 D0
部分积
dec
乘数 0 1 0 1
被乘数 1 0 1 0
0 0 0 0 0
0 0 1 0 1
10 0 0 0 0
10 0 1 0 1
50
问题:速度如何?
3位查询表乘法器
000 001 010 011 100 101 110 111
000 0 0 0 0 0 0 0 0
001 0 1 2 3 4 5 6 7
010 0 2 4 6 8 10 12 14
011 0 3 6 9 12 15 18 21
100 0 4 8 12 16 20 24 28
101 0 5 10 15 20 25 30 35
110 0 6 12 18 24 30 36 42
111 0 7 14 21 28 35 42 49
问题:
1:速度如何?
2:存储容量?
乘数 积 被乘数
本例子的方法
? 采用 移位相加乘法器
? 移位相加乘法器 的设计要点
1,设置一个保存乘积的寄存器, 位数, 16(2*N)
2,移位 (i)的实现, 直接使用 高 2N-i位乘积和被乘
数相加
3,无需 2*N加法,实际只需要 N位加法,
? 我们来看看代码的实现?
移位累加乘法器,框图
移位累加乘法器,代码
1,8位右移寄存器
p246_ex8_24_experiment8_1_SREG8B
1,8位加法器
p246_ex8_25_experiment8_1_ADDER8B
2,1位乘法器
p246_ex8_26_experiment8_1_ANDARITH
3,16位锁存器
p247_ex8_27_experiment8_1_REG16B
4,运算控制模块
p247_ex8_28_experiment8_1_ARICTL
5,8位乘法器顶层模块
p248_ex8_29_experiment8_1_MULTI8X8
本试验思考
1,根据顶层模块,分析各模块的作用和相互关系,
画出模块间的连接电路图
2,该代码中,乘数和被乘数如何产生的,乘积如何
观察?,时钟 CLK信号连接在如何,写出信号连
接过程,引脚指配信息。可用图形和表格标识
3,编译配置下载,设置不同的乘数和被乘数,记录
乘积,并观察和是否正确?
4,如何测试该乘法器运算所需要的时间,从代码分
析中得到的结果是多少?如何测试最短的运算时
间?
乐曲硬件演奏电路设计:目的
1,学习数控分频器的应用
2,学习 FPGA中 ROM模块的使用
3,训练大型 VHDL代码的分析和阅读的技巧
4,加深对 VHDL语法和电路设计方法的理解
乐曲硬件演奏电路设计:原理
? 用 ROM存储乐谱数据
? 乐谱数据包括 2个内容:
1,音符的音调(也就信号的频率)
2,音符的发声时间长短
? 用 ROM存储乐谱数据格式
1,音符的音调系数(共 13个,表示 13个音调)
2,时间长短:音调的重复存储来表达。
音调数据
1,WIDTH = 4 ;
2,DEPTH = 256 ;
3,ADDRESS_RADIX = DEC ;
4,DATA_RADIX = DEC ;
5,CONTENT BEGIN
6,00,3;
7,01,3;
8,02,3;
9,03,3;
10,04,5;
11,05,5;
12,06,5;
13,07,6;
14,············
15,137,0;
16,138,0;
17,END
音调 3
重复 4拍
乐曲硬件演奏电路设计,框图
乐曲硬件演奏电路设计,VHDL代码
? 顶层控制模块
Songer(p252_ex8_30_experiment8_2_SONGER)
? 乐谱读取模块:
NoteTabs(p254_ex8_33_experiment8_2_NoteTabs)
? 乐谱和音频信号频率查表模块:
ToneTaba(p253_ex8_32_experiment8_2_ToneTaba)
? 音频输出模块,
Speakera(p252_ex8_31_experiment8_2_Speakera)
? 乐谱文件
p255_ex8_34_experiment8_2_musicdata
乐曲硬件演奏电路设计:实验内容
? 实验内容 1:
1,编译适配以上 3个示例文件,给出仿真波形,最后进行下载和硬件测试
实验。建议使用实验电路模式,3”(附图 1-5),用短路帽选择
,CLOCK9”的输入频率选择 12MHz,此信号作为系统输入信号
CLK12MHZ;键 8至键 1 作为 INDEX输入信号控制各音阶;选择数码管
1显示琴音简谱码,发光管 D1显示高 8度。
2,在原设计的基础上,增加一个 NOTETABS模块(如图 8-15所示),用
于产生节拍控制( INDEX数据存留时间)和音阶选择信号,即在
NOTETABS模块放置一个乐曲曲谱真值表,由一个计数器的计数值来
控制此真值表的输出,而由此计数器的计数时钟信号作为乐曲节拍控制
信号,从而可以设计出一个纯硬件的乐曲自动演奏电路。试完成此项设计,并在 EDA实验系统上的 FPGA目标器件中实现之。
? 思考题 1:
1,例 8-27中的进程 DelaySpkS对扬声器发声有什么影响?
2,在电路上应该满足哪些条件,才能用数字器件直接输出的方波驱动扬声器发声?
The end
The end.
以下内容

正文的引用,
可不阅读。
返回
STD_LOGIC的取值
1,TYPE std_ulogic IS ( 'U',-- Uninitialized
2,'X',-- Forcing Unknown
3,'0',-- Forcing 0
4,'1',-- Forcing 1
5,'Z',-- High Impedance
6,'W',-- Weak Unknown
7,'L',-- Weak 0
8,'H',-- Weak 1
9,'-' -- Don't care
10,);
返回
详细参见
STD1164.VHD
Mif格式文件
? Memory Initialization File (.mif)
1,An ASCII text file (with the extension,mif) that specifies
the initial content of a memory block (RAM or ROM),
2,An MIF is used as an input file for memory initialization in
the Compiler and Simulator,(You can also use a
Hexadecimal File (.hex) to provide memory initialization
data.) An MIF contains the initial values for each address
in the memory,A separate file is required for each
memory block,In an MIF,you are also required to specify
the memory depth and width values,In addition,you can
specify the radixes used to display and interpret
addresses and data values,Following is a sample MIF:返回
什么是宏模块?
QUARTUS II HELP 说
? library of parameterized modules (LPM)
A technology-independent library of logic functions that are
parameterized to achieve scalability and adaptability,
Altera has implemented parameterized modules (also
called "parameterized functions") from LPM version 2.2.0
that offer architecture-independent design entry for all
devices supported by the Quartus II software,The
Quartus II Compiler includes built-in compilation support for
LPM functions used in schematic,AHDL,VHDL,Verilog
HDL,and EDIF input files.
返回
基于 FPGA的乘法器
实现结构分析与仿真
1,伞景辉 常青
基于 FPGA的乘法器实现结构分析与仿真
微处理机 2004年第 6期
返回