EDA中编程
1. eda是什么
eda就是电子设计自动化,英语:Electronic design automation,缩写:EDA,指利用计算机辅助设计(CAD)软件,来完成超大规模集成电路(VLSI)芯片的功能设计、综合、验证、物理设计(包括布局、布线、版图、设计规则检查等)等流程的设计方式。
EDA涵盖了电子设计、仿真、验证、制造全过程的所有技术,诸如:系统设计与仿真,电路设计与仿真,印制电路板(PCB)设计与校验,集成电路(IC)版图设计、验证和测试,数字逻辑电路设计,芯片上系统(SoC)设计,可编程逻辑器件(PLD)和可编程系统芯片(SOPC)设计,专用集成电路(ASIC)和专用标准产品(ASSP)设计技术等。
eda现况
在电子产业中,由于半导体产业的规模日益扩大,EDA 扮演越来越重要的角色。使用这项技术的厂商多是从事半导体器件制造的代工制造商,以及使用 EDA 模拟软件以评估生产情况的设计服务公司。EDA 工具也应用在现场可编程逻辑门阵列的程序设计上。
2019年,我国EDA市场规模约为5.8亿美元,仅占全球市场的5.6%。中国EDA厂商总营收不到4.2亿元,只占全球市场份额的0.6%。
2. eda编程9人表决器程序详解是什么
eda编程9人表决器程序详解://本程序用VERILOG HDL语言实现,描述9人表决器。
mole biaojueqi(vote,ledr,ledg,dis_out)
input [8:0] vote
reg [6:0] dis_out;
integer i,sum; //sum表示赞同的人数
for(i=0;i<=8;i=i+1)
if(vote[i]) sum<=sum+1;
end
always @(sum) //结果由dis_out显示在数码管上
case (sum)
0: dis_out[6:0]<=7'b1111110;
1: dis_out[6:0]<=7'b0110000;
2: dis_out[6:0]<=7'b1101101;
3: dis_out[6:0]<=7'b1111001;
4: dis_out[6:0]<=7'b0110011;
5: dis_out[6:0]<=7'b1011011;
6: dis_out[6:0]<=7'b1011111;
7: dis_out[6:0]<=7'b1110000;
8: dis_out[6:0]<=7'b1111111;
9: dis_out[6:0]<=7'b1111011;
endmole
内容简介
本书从实际应用的角度出发,全面系统地介绍了EDA技术和硬件描述语言VHDL,将VHDL的基础知识、编程技巧、实用方法与实际工程开发技术在EDA软件设计平台上很好地结合起来,使读者能够通过本书的学习迅速了解并掌握EDA技术的基本理论和工程开发实用技术。
3. EDA编程,数字频率合成器
DDS或DDFS是 Direct Digital Frequency Synthesis 的简称。DDS的工作原理是以数控振荡器的方式产生频率、相位可控制的正弦波。电路一般包括基准时钟、频率累加器、相位累加器、幅度/相位转换电路、D/A转换器和低通滤波器(LPF)。频率累加器对输入信号进行累加运算,产生频率控制数据K(frequency data或相位步进量)。相位累加器由N位全加器和N位累加寄存器级联而成,对代表频率的二进制码进行累加运算,是典型的反馈电路,产生累加结果。幅度/相位转换电路实质上是一个波形寄存器,以供查表使用。读出的数据送入D/A转换器和低通滤波器。
具体工作过程如下:
每来一个时钟脉冲fc,N位加法器将频率控制字K与累加寄存器输出的累加相位数据相加,把相加后的结果送至累加寄存器的数据输入端。其中相位累加器由N位加法器与N位累加寄存器级联构成,累加寄存器将加法器在上一个时钟脉冲作用后所产生的新相位数据反馈到加法器的输入端,以使加法器在下一个时钟脉冲的作用下继续与频率控制字K相加。这样,相位累加器在时钟作用下,不断对频率控制字K进行线性相位累加。由此可见,相位累加器在每一个时钟脉冲输入时,把频率控制字K累加一次,相位累加器输出的数据就是合成信号的相位,相位累加器的溢出频率就是DDS输出的信号频率。用相位累加器输出的数据作为波形存储器ROM的相位取样地址,可把存储在波形存储器内的波形抽样值(二进制编码)经查找表查出,完成相位到幅值转换。波形存储器的输出送到D/A转换器,D/A转换器将数字量形式的波形幅值转换成所要求合成频率的模拟量形式信号,由低通滤波器滤除杂散波和谐波以后,输出一个频率为fo的正弦波。输出频率fo与时钟频率fc之间的关系满足下式:Fo=K×Fc/2^N
其中fo为输出频率,fc为时钟脉冲,K为频率控制字。N为累加器的位数(字长)。
在软件MAX+PLUS Ⅱ中VHDL语言 仿真描述DDS输出的正弦波程序...
本设计中相位累加器的数据宽度N采用32位
LIBRARY IEEE; --DDS顶层设计
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 DDS_VHDL;
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,D32B,DIN32B: STD_LOGIC_VECTOR(31 DOWNTO 0);
SIGNAL P10B,LIN10B,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 one;
累加器的VHDL描述
累加器由N位加法器与N位累加寄存器级联构成,这里的N取32位。
LIBRARY IEEE; --32位加法器模块
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER32B IS
PORT (A,B: IN STD_LOGIC_VECTOR(31 DOWNTO 0);
S: OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
END ADDER32B;
ARCHITECTURE behav OF ADDER32B IS
BEGIN
S<=A+B;
END behav;
LIBRARY IEEE; --32位寄存器模块
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY REG32B IS
PORT (Load: IN STD_LOGIC;
DIN: IN STD_LOGIC_VECTOR(31 DOWNTO 0);
DOUT: OUT STD_LOGIC_VECTOR(31 DOWNTO 0));
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位,即输出的D/A的精度是10位。
LIBRARY IEEE; --10位加法器模块
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER10B IS
PORT (A,B: IN STD_LOGIC_VECTOR(9 DOWNTO 0);
S: OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END ADDER10B;
ARCHITECTURE behav OF ADDER10B IS
BEGIN
S<=A+B;
END behav;
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;
定制LPM_ROM初始化数据文件
rom_data.mif 10位正弦波数据文件,可用MATLAB/DSP Builder生成
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;
用于例化的波形数据ROM
用于例化的波形数据ROM文件
LIBRARY IEEE; --数据ROM
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY sin_rom IS
PORT (address: IN STD_LOGIC_VECTOR(9 DOWNTO 0);
inclock: IN STD_LOGIC;
q: OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END sin_rom;
ARCHITECTURE SYN OF sin_rom IS
SIGNAL sub_wire0: STD_LOGIC_VECTOR(9 DOWNTO 0);
COMPONENT lpm_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 DOWNTO 0);
lpm_rom_component: lpm_rom GENERIC MAP(
LPM_WIDTH=>10,
LPM_WIDTHAD=>10,
LPM_ADDRESS_CONTROL=>"REGISTERED",
LPM_OUTDATA=>"UNREGISTERED",
LPM_FILE=>"ROM_DATA.mif") --ROM数据文件及其路径
PORT MAP(address=>address,inclock=>inclock,q=>sub_wire0);
END SYN;
这个太多咯,DDS基本原理书上或网上多得很, 一般在EDA技术的书上讲有VHDL语言实现DDS的代码、、
4. eda编程9人表决器
“三人表决器”
“三人表决器”的逻辑功能是:表决结果与多数人意见相同。
设x0、x1、x2为三个人(输入逻辑变量),赞成为1,不赞成为0;
y0为表决结果(输出逻辑变量),多数赞成y0为1,否则,y0为0。其真值表如表1所示。
表1
“三人表决器”真值表
输入逻辑变量
输出逻辑变量
x0
x1
x2
y0
0
0
0
0
0
0
1
0
0
1
0
0
0
1
1
1
1
0
0
0
1
0
1
1
1
1
0
1
1
1
1
1
由真值表写出逻辑表达式并化简得:y0=x0*x1+x0*x2+x1*x2
(1)
要实现这个逻辑功能,如果用“集成逻辑门”,则可选用三个两输入“与门”和一个三输入“或门”来实现。但是,这里我们不是用“集成逻辑门”,而是用plc“程序”来实现。
程序语句如下:
0
ld
x0
1
and
x1
2
ld
x0
3
and
x2
4
orb
5
ld
x1
6
and
x2
7
orb
8
out
y0
9
end
将这个程序语句写入到plc中,再进行接线:用三个开关分别控制x0、x1、x2,用一盏指示灯来显示表决结果,并将com1连接到24v直流电源的正极。接线完毕就可以进行演示实验的操作了。如果赞成,则合上开关;如果不赞成,则断开开关。指示灯的亮灭,显示的是表决的结果。灯亮表示多数赞成,灯不亮,则表示多数不赞成。表决结果与多数人意见相同。
下面探讨一下由“逻辑表达式”来编写plc程序的规律。一般书上用a、b、c表示输入逻辑变量,用y表示输出逻辑变量。在这里为了编程的方便,我们有意把plc的输入继电器(x)的触点作为输入逻辑变量,把输出继电器的线圈作为输出逻辑变量。例如,在表达式(1)中,x0、x1、x2为三个输入逻辑变量,代表三个人,y0为输出逻辑变量,代表表决结果。同时在plc中,x0、x1、x2又是三个输入继电器,都是输入继电器的常开触点;
y0是一个输出继电器,是输出继电器的一个线圈。
式(1)是一个“与或式”,在第一项x0*x1中,“x0”在项首,用[ld]指令,即ld
x0,“*”是“与”逻辑,用[and]指令,即and
x1。第二项、第三项也是这个规律,三项相加,
“+”是“或”逻辑,用[orb]指令,[orb]指令是“块或”指令。因为每一个“与项”都是两个触点相串联的“串联电路块”,而“相加”就是作并联连接,即“串联电路块”作并联连接,所以要用“块或”指令。y0是输出,用线圈输出指令[out],即out
y0。程序结束用
[end]指令。认真总结由“逻辑表达式”来编写plc程序的规律,这对于快速编程很有好处。但是,一般的初学者,往往都是由“逻辑表达式”到“梯形图”,再到“程序语句”。为了帮助初学者,我们将这个程序的梯形图一并给出,如下图所示。
5. EDA编程的主要架构是什么,有几种编程方式,它们各有什么特点
在EDA技术中,自顶向下的设计方法的重要意义是什么? 答:在EDA技术应用中,自顶... 方式不同,可再分为门阵列法、标准单元法和可编程逻辑器件法。 1-9 FPGA/CPLD在... 电可擦除编程工艺的优点是编程后信息不会因掉电而丢失,
6. EDA实验中如何编程让8位数码管分别循环显示01234567要求:八个数码管依次点亮且先点亮的数码管不会熄灭
这么简单....数码管是共样的还是共阴的。7段还是8段的数码管?8个8bit寄存器,每个对应一个一位数字。用case语句直接搞定