EDA程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EDA课程设计
学院:电子信息科学与技术
班级:11级电信本(一)班
姓名:王后影
学号: 1 1 0 9 1 4 0 3 3
辅导教师:肖开选
基于LMP的流水线乘法累加器设计
一、设计目的
乘法累加器常在全硬件的数字信号处理的不同算法中用到。本节通过一个8位流水线乘法累加器的实例介绍以顶层原理图为工程,VHDL文本描述和宏功能块为原理图元件的输入和设计方法。
二、设计原理
本设计通过调用LPM加法器模块以及LPM乘法器模块构建一个乘法累加器,另外,本文还给出LPM库的乘法累加器模块ALTMULT_ADD,进过参数设置,能实现同上功能。
三、symbol图
产生的symbol见附录。
四、设计结果及分析
1、8位乘法累加器顶层设计图
图(一)顶层设计图
2、时序仿真波形图
图(二)工程仿真波形图
由上述波形可知:在clk的第四个上升沿后才得到第一个计算数据,之前都
是0,这就是流水线结构的计算结果。
第四个上升沿得到结果为,而第五个上升沿后得到结果为
,第六个上升沿后得到的结果为。
3、LPM库的乘法累加器模块图
图(三)ALTMULT_ADD模块图
五、附录
1、ADD16B产生的symbol
2、MULT8B产生的symbol
3、FF8B产生的symbol
VHDL有限状态机设计
一、设计目的
1、进一步熟悉和掌握Quartus软件的各模块功能的使用方法。
2、加深对VHDL语言的了解,熟悉VHDL语言的语法特点,深刻了解Quartus 软件仿真中出现的各种问题并能加以解决。
3、学习使用和查看状态转换图。
二、设计原理
本设计说明部分中使用type语句定义新的数据类型。状态变量(如现态和次态)应定义为信号,便于信息传递,并将状态变量的数据类型定义为含有既定状态元素的新定义的数据类型。其中新定义的数据类型名是FSM_ST,其元素类型分别为s0,s1,s2,s3,s4,使其恰好表述状态机的五个状态。在此设计模块说明部分,定义了五个文字参数符号,代表五个状态。对于此程序,如果异步清零信号reset有过一个复位脉冲,当前状态即可被异步设置为S0;与此同时,启动组合进程,“执行”条件分支语句。
三、设计程序
设计程序见附录。
四、设计结果及分析
1、生成symbol图
图(一)symbol图
2、时序波形图
通过分析波形,进一步了解状态机的工作特性。需要注意,reset信号是低电平有效的,而clk是上升沿有效的,所以reset有效脉冲后的第一个时钟脉冲是第二个clk脉冲,第三个脉冲的上升沿后,现态c_st即进入状态S1.同时输出8,即“1000”。
图(二)仿真时序波形图3、状态图
图(三)波形图
五、附录
设计程序:
library ieee;
use ieee.std_logic_1164.all;
entity fsm_exp is
port(clk,reset :in std_logic;
state_inputs:in std_logic_vector(0 to 1);
comb_outputs:out integer range 0 to 15 );
end fsm_exp;
architecture behav of fsm_exp is
type fsm_st is (s0,s1,s2,s3,s4);
signal c_st,next_state:fsm_st;
begin
reg:process (reset,clk)
begin
if reset='0' then c_st<=s0;
elsif clk='1' and clk'event then c_st <= next_state;
end if;
end process reg;
com:process (c_st,state_inputs)
begin
case c_st is
when s0 => comb_outputs <= 5;
if state_inputs="00" then next_state <= s0;
else next_state <= s1;
end if;
when s1 => comb_outputs <= 8;
if state_inputs="01" then next_state <= s1;
else next_state <= s2;
end if;
when s2 => comb_outputs <= 12;
if state_inputs="10" then next_state <= s0;
else next_state <= s3;
end if;
when s3 => comb_outputs <= 14;
if state_inputs="11" then next_state <= s3;
else next_state <= s4;
end if;
when s4 => comb_outputs <= 9; next_state <= s0;
when others => next_state <= s0;
end case;
end process com;
end behav;