文章目录:
- 1、求 EDA技术及其应用 潘松 第五版 pdf 电子书
- 2、eda技术实用教程——VHDL 《第四版 潘松、黄继业》 课后答案
- 3、EDA技术实用教程:Verilog HDL版 课后答案 你有吗 给我一份 QQ1056593825
- 4、VHDL数字时钟完整程序代码(要求要有元件例化,并且有按键消抖),谢谢啦啦啦啦
- 5、EDA课程设计,用VHDL编程做出租车计费器
- 6、推荐一本适合自学的EDA教材
求 EDA技术及其应用 潘松 第五版 pdf 电子书
没有我们找不到的电子书——专业提供亚马逊 京东 读秀等正规商城书籍。商城有的我们都有,商城没有的我们可以有!价格优惠!全部pdf格式,带来 优良阅读体验。需要书籍请加叩 斯⑤岭琦琦散柳尔岭,定期分享福利!!
eda技术实用教程——VHDL 《第四版 潘松、黄继业》 课后答案
ishare.iask.sina.com.cn/search.php?key=EDA%BC%BC%CA%F5%D3%EBVHDLformat=" target="_blank";format=
EDA技术实用教程:Verilog HDL版 课后答案 你有吗 给我一份 QQ1056593825
这个估计木有,潘松那家伙是根据一家公司的实验箱写的,说白了就是那本书是潘松写给那家公司的实验指导书,所以要那个东西,就得购买那家公司的实验箱,所以,老兄别找了,当年哥也是找不到,有什么问题就提上来吧,能帮你就帮你,不能的话还有很多人帮你呢
VHDL数字时钟完整程序代码(要求要有元件例化,并且有按键消抖),谢谢啦啦啦啦
图11
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity xuan21 is
Port ( alarm,a,b: in std_logic;
y:out std_logic);
end xuan21 ;
architecture one of xuan21 is
begin
process(alarm,a,b)
begin
if alarm='0' then y=a;else y=b;
end if;
end process;
end one;
仿真波形如下图12:
图12
(2)三位二选一:
模块图如图13。用以进行正常计时时间与闹铃时间显示的选择,alarm输入为按键。当alarm按键未曾按下时二选一选择器会选择输出显示正常的计时结果,否则当alarm按键按下时选择器将选择输出显示闹铃时间显示。
图13
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity x213 is
Port ( alarm : in std_logic;
y:out std_logic_vector(3 downto 0);
a,b: in std_logic_vector(3 downto 0));
end x213;
architecture one of x213 is
begin
process(alarm,a,b)
begin
if alarm='0' then y=a;else y=b;
end if;
end process;
end one;
仿真结果如下图14:
图14
8、整点报时及闹时:
模块图如图15。在59分51秒、53秒、55秒、57秒给扬声器赋以低音512Hz信号,在59分59秒给扬声器赋以高音1024Hz信号,音响持续1秒钟,在1024Hz音响结束时刻为整点。当系统时间与闹铃时间相同时给扬声器赋以高音1024Hz信号。闹时时间为一分钟。
图15
程序如下:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity voice is
Port ( hou1,huo0,min1,min0,sec1,sec0,hh,hl,mh,ml: std_logic_vector(3 downto 0);
in_1000,in_500:in std_logic;
q : out std_logic);
end voice;
architecture one of voice is
begin
process(min1,min0,sec1,sec0)
begin
if min1="0101" and min0="1001" and sec1="0101" then
if sec0="0001" or sec0="0011" or sec0="0101" or sec0="0111"
then q=in_500;
elsif sec1="0101" and sec0="1001" then q=in_1000;
else q='0';
end if;
else q='0';
end if;
if min1=mh and min0=ml and hou1=hh and huo0=hl then
q=in_1000;
end if;
end process;
end one;
仿真波形如下图16
图16
9、顶层原理图:
三、感想
通过这次设计,既复习了以前所学的知识,也进一步加深了对EDA的了解,让我对它有了更加浓厚的兴趣。特别是当每一个子模块编写调试成功时,心里特别的开心。但是在画顶层原理图时,遇到了不少问题,最大的问题就是根本没有把各个模块的VHD文件以及生成的器件都全部放在顶层文件的文件夹内,还有就是程序设计的时候考虑的不够全面,没有联系着各个模式以及实验板的情况来编写程序,以至于多考虑编写了译码电路而浪费了很多时间。在波形仿真时,也遇到了一点困难,想要的结果不能在波形上得到正确的显示
:在分频模块中,设定输入的时钟信号后,却只有二分频的结果,其余三个分频始终没反应。后来,在数十次的调试之后,才发现是因为规定的信号量范围太大且信号的初始值随机,从而不能得到所要的结果。还有的仿真图根本就不出波形,怎么调节都不管用,后来才知道原来是路径不正确,路径中不可以有汉字。真是细节决定成败啊!总的来说,这次设计的数字钟还是比较成功的,有点小小的成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,使自己对以后的路有了更加清楚的认识,同时,对未来有了更多的信心。
四、参考资料:
1、潘松,王国栋,VHDL实用教程〔M〕.成都:电子科技大学出版社,2000.(1)
2、崔建明主编,电工电子EDA仿真技术北京:高等教育出版社,2004
3、李衍编著,EDA技术入门与提高王行西安:西安电子科技大学出版社,2005
4、侯继红,李向东主编,EDA实用技术教程北京:中国电力出版社,2004
5、沈明山编著,EDA技术及可编程器件应用实训北京:科学出版社,2004
6、侯伯亨等,VHDL硬件描述语言与数字逻辑电路设计西安: 西安电子科技大学出版社,1997
7、辛春艳编著,VHDL硬件描述语言北京:国防工业出版社,2002 就这些
EDA课程设计,用VHDL编程做出租车计费器
课程设计内容与要求
1,用开关按键表示脉冲,每个脉冲代表100米,10个脉冲1公里,每公里1.4元,能同步显示里程和费用;
2,低于2公里5元计费,高于2公里总费用=起步费用+(里程-2公里)*里程单价+
等候时间*等后单价;
3,等候时间大于2分钟,按每分钟1.3元计费;
4,可以设定起步价和里程单价。
一、设计原理与技术方法:
包括:电路工作原理分析与原理图、元器件选择与参数计算、电路调试方法与结果说明;
软件设计说明书与流程图、软件源程序代码、软件调试方法与运行结果说明。
根据设计要求,系统的输入信号clk,计价开始信号start,等待信号stop,里程脉冲信号fin。系统的输出信号有:总费用数C0—c3,行驶距离k0—k1,等待时间m0—m1等。系统有两个脉冲输入信号clk_750k,fin,其中clk_750k将根据设计要求分频成14hz,15hz和1hz分别作为公里计费和超时计费的脉冲。两个控制输入开关start,stop;控制过程为:start作为计费开始的开关,当start为高电平时,系统开始根据输入的情况计费。当有乘客上车并开始行驶时,fin脉冲到来,进行行驶计费,此时的stop需要置为0;如需停车等待,就把stop变为高电平,
并去除fin输入脉冲,进行等待计费;当乘客下车且不等待时,直接将start置为0,系统停止工作;价格开始归为起步价5.0元。
整个设计由分频模块,计量模块,计费模块,控制模块和显示模块五个部分组成。
其中计量模块是整个系统实现里程计数和时间计数的重要部分;控制模块是实现不同计费方式的选择部分,根据所设计的使能端选择是根据里程计费还是根据等待时间计费,同时设计通过分频模块产生不同频率的脉冲信号来实现系统的计费。计量模块采用1hz的驱动信号,计费模块采用14hz,13hz的驱动信号;计量模块每计数一次,计量模块就实现14次或者13次计数,即为实现计时的1.3元/min,计程时的1.4元/km的收费。组成框图如下所示:
1.百进制模块:
实现百米脉冲的驱动信号,元件框图如图3所示:
图3 百进制模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity baijinzhi is
port(start,clk2: in std_logic; --秒脉冲
a: out std_logic_vector(3 downto 0));
end baijinzhi;
architecture rt1 of baijinzhi is
signal count_1:std_logic_vector(3 downto 0);
begin
a=count_1;
process(start,clk2)
begin
if(start='0')then
count_1="0000";
elsif(clk2'event and clk2='1')then
if(count_1="0111")then
count_1="0000";
else
count_1=count_1+'1';
end if;
end if;
end process;
end rt1
2.计费模块
; 实现里程和等候时间的计费并输出到显示,元件框图4如下:
图4 计费模块框图
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity jifei is
port(clk2:in std_logic; --计费驱动信号
start:in std_logic; --计费开始信号
c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));
end jifei;
architecture rt1 of jifei is
begin
process(clk2,start)
begin
if start='0'then c3="0000";c2="0000";c1="0101";c0="0000"; --起步价5元
elsif clk2'event and clk2='1'then
if c0="1001" then c0="0000";
if c1="1001" then c1="0000";
if c2="1001" then c2="0000";
if c3="1001" then c3="0000";
else c3=c3+1;
end if;
else c2=c2+1;
end if;
else c1=c1+1;
end if;
else c0=c0+1;
end if;
end if;
end process;
end rt1;
3.公里模块
实现历程的计数和输出计费脉冲,元件框图5如下:
图5 公里模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity gongli is
port(clk1,start: in std_logic; --百米脉冲
k1,k2,k3,k4: out std_logic_vector(3 downto 0); --里程显示
temp2 : out std_logic);
end gongli;
architecture rt1 of gongli is
signal count_1: std_logic_vector(3 downto 0);
signal count_2: std_logic_vector(3 downto 0);
signal count_3: std_logic_vector(3 downto 0);
signal count_4: std_logic_vector(3 downto 0);
begin
k1=count_1;
k2=count_2;
k3=count_3;
k4=count_4;
process(start,clk1)
begin
if(start='0')then
count_1="0000";
count_2="0000";
count_3="0000";
count_4="0000"; ---公里清零
elsif(clk1'event and clk1='1')then
if(count_1="1001")then --公里计数器
count_1="0000";count_2=count_2+1;temp2='1';
if(count_2="1001")then
count_2="0000";count_3=count_3+'1';
if(count_3="1001")then
count_3="0000";count_4=count_4+'1';
end if;
end if;
else
count_1=count_1+'1';temp2='0';
end if;
end if;
end process;
end rt1;
4.输出模块
实现所有数据的输出,元件框图6如下:
图6 输出模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity shuchu is
port(y: in std_logic_vector(3 downto 0);
e: out std_logic_vector(6 downto 0));
end shuchu;
architecture rt1of shuchu is
begin
process
begin
case y is
when"0000"=e="0111111";
when"0001"=e="0000110";
when"0010"=e="1011011";
when"0011"=e="1001111";
when"0100"=e="1100110";
when"0101"=e="1101101";
when"0110"=e="1111101";
when"0111"=e="0000111";
when"1000"=e="1111111";
when"1001"=e="1100111";
when others=e="0000000";
end case;
end process;
end rt1;
5.显示模块
实现所有数据的显示,元件框图7如下:
图7 显示模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity xianshi is
port(start: in std_logic;
a:in std_logic_vector(3 downto 0); --选择信号
c1,c2,c3,c4,out1,out2,out3,out4:in std_logic_vector(3 downto 0); --里程显示,时间显示输入
y:out std_logic_vector(3 downto 0)); --里程显示,时间显示输出
end xianshi;
architecture rt1 of xianshi is
begin
process
begin
if(start='0')then
y="0000";
else case a is
when "0000"= y=c1 ;
when "0001"= y=c2 ;
when "0010"= y=c3 ;
when "0011"= y=c4 ;
when "0100"= y=out1 ;
when "0101"= y=out2;
when "0110"= y=out3 ;
when "0111"= y=out4;
when others =y= "0000";
end case;
end if;
end process;
end rt1;
6.dian模块
图8 dian模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity dian is
port(a: in std_logic_vector(3 downto 0);
e: out std_logic);
end dian;
architecture rt1 of dian is
begin
process
begin
case a is
when "0001"=e='1';
when "0101"=e='1';
when others=e='0';
end case;
end process;
end rt1;
三、中各个模块设计分析
系统总体顶层框图如下:
系统总体顶层框图
程序最终功能实现波形仿真
1. 分频模块
由于实验箱上没有14hz和13hz的整数倍时钟信号,因此采用频率较大的750khz进行分频,以近似得到14hz,13hz和1hz的时钟频率。通过以上三种不同频率的脉冲信号实行出租车行驶,等待两种情况下的不同计费。模块元件如下:
分频模块框图
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity fenpin is
port(clk_750k:in std_logic; --系统时钟
clk_14:buffer std_logic; --14分频
clk_13:buffer std_logic; --13分频
clk_1 : buffer std_logic); --1分频
end fenpin ;
architecture rt1 of fenpin is
signal q_14:integer range 0 to 53570; --定义中间信号量
signal q_13:integer range 0 to 57691;
signal q_1:integer range 0 to 749999;
begin
process(clk_750k)
begin
If(clk_750k' event and clk_750k='1')then
If q_14=53570 then q_14=0;clk_14=not clk_14;
else q_14=q_14+1;
end if; --得14hz频率信号
If q_13=57691 then q_13=0;clk_13=not clk_13;
else q_13=q_13+1;
end if; --得13hz频率信号
If q_1=749999 then q_1=0;clk_1=not clk_1;
else q_1=q_1+1;
end if; --得1hz频率信号
end if;
end process;
end rt1;
2. 计量模块
计量模块主要完成计时和计程功能。
计时部分:计算乘客的等待累积时间,当等待时间大于2min时,本模块中en1使能信号变为1;当clk1每来一个上升沿,计时器就自增1,计时器的量程为59min,满量程后自动归零。
计程部分:计算乘客所行驶的公里数,当行驶里程大于2km时,本模块中en0使能信号变为1;当clk每来一个上升沿,计程器就自增1,计程器的量程为99km,满量程后自动归零。
元件框图为:
计量模块框图
计量模块仿真波形为:
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity jiliang is
port(start:in std_logic; --计费开始信号
fin:in std_logic; --里程脉冲信号
stop:in std_logic; --行驶中途等待信号
clk1:in std_logic; --驱动脉冲
en1,en0:buffer std_logic; --计费单价使能信号
k1,k0:buffer std_logic_vector(3 downto 0); --行驶公里计数
m1,m0:buffer std_logic_vector(3 downto 0)); --等待时间计数
end jiliang;
architecture rt2 of jiliang is
signal w:integer range 0 to 59; --计时范围0~59
begin
process(clk1)
begin
if(clk1'event and clk1='1')then
if start='0' then
w=0;en1='0';en0='0';m1="0000";
m0="0000";k1="0000";k0="0000";
elsif stop='1' then --计时开始信号
if w=59 then
w=0;
else w=w+1;
end if;
if m0="1001" then
m0="0000";
if m1="0101" then
m1="0000";
else m1=m1+1;
end if;
else m0=m0+1;
end if;
if stop='1' then en0='0';
if m1m0"00000001" then en1='1'; --若等待时间大于2min则en1置1
else en1='0';
end if;
end if;
elsif fin='1' then --里程计数开始
if k0="1001" then k0="0000";
if k1="1001" then k1="0000"; --计程范围0~99
else k1=k1+1;
end if;
else k0=k0+1;
end if;
if stop='0' then
en1='0';
if k1k0"00000001" then
en0='1'; --若行使里程大于2km,则en0置1
else en0='0';
end if;
end if;
end if;
end if;
end process;
end rt2;
3. 控制模块
本模块主要是通过计量模块产生的两个不同的输入使能信号en0,en1,对每个分频模块输出的14hz,13hz的脉冲进行选择输出的过程;本模块实现了双脉冲的二选一;最终目的为了计费模块中对行驶过程中不同的时段进行计价。
模块元件如下:
控制模块框图
控制模块仿真波形为:
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity kongzhi is
port(en0,en1:in std_logic; --使能选择信号
clk_in1:in std_logic; --14分频输入信号
clk_in2:in std_logic; --13分频输入信号
clk_out:out std_logic); --输出信号
end kongzhi;
architecture rt3 of kongzhi is
begin
process(en0,en1)
begin
if en0='1' then --实现二选一功能
clk_out=clk_in1;
elsif en1='1' then
clk_out=clk_in2;
end if;
end process;
end rt3;
4.计费模块
当计费信号start一直处于高电平即计费状态时,本模块根据控制模块选择出的信号从而对不同的单价时段进行计费。即行程在2km内,而且等待累计时间小于2min则为起步价5元;2km外以每公里1.4.元计费,等待累积时间超过2min则按每分钟1.3元计费。c0,c1,c2,c3分别表示费用的显示。
模块元件为:
计费模块框图
计费模块仿真波形为:
源程序如下:
Library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
entity jifei is
port(clk2:in std_logic; --计费驱动信号
start:in std_logic; --计费开始信号
c0,c1,c2,c3:buffer std_logic_vector(3 downto 0));
end jifei;
architecture rt4 of jifei is
begin
process(clk2,start)
begin
if start='0'then c3="0000";c2="0000";c1="0101";c0="0000"; --起步价5元
elsif clk2'event and clk2='1'then
if c0="1001" then c0="0000";
if c1="1001" then c1="0000";
if c2="1001" then c2="0000";
if c3="1001" then c3="0000"; --计价范围0~999.9
else c3=c3+1;
end if;
else c2=c2+1;
end if;
else c1=c1+1;
end if;
else c0=c0+1;
end if;
end if;
end process;
end rt4;
5.显示模块
显示模块完成计价,计时和计程数据显示。计费数据送入显示模块进行译码,最后送至以百元,十元,元,角为单位对应的数码管上显示。计时数据送入显示模块进行译码,最后送至以分为单位对应的数码管上显示。计程数据送入显示模块进行译码,最后送至以km为单位的数码管上显示。
模块元件为:
显示模块框图
源程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; --定义库包
entity xianshi is --定义实体
port(
clk_scan:in std_logic; --扫描时钟信号端口设置
c3,c2,c1,c0:in std_logic_vector(3 downto 0); --总费用输入端口
k0,k1:in std_logic_vector(3 downto 0); --里程输入端口
m0,m1:in std_logic_vector(3 downto 0); --等待时间输入端口
sel:out std_logic_vector(2 downto 0); --控制数码管位选信号的扫描信号输出端口
led:out std_logic_vector(6 downto 0); --数码管的控制端口
led_dp:out std_logic --数码管的小数点输出端口
);
end xianshi;
architecture rt5 of xianshi is
signal duan:std_logic_vector(6 downto 0); --数码显示管中间变量
signal shuju:std_logic_vector(3 downto 0); --选择输入端的中间变量
signal cnt:std_logic_vector(2 downto 0); --控制数码管的中间变量
signal xiaodian:std_logic; --小数点的中间变量
begin
process(clk_scan) --开始进程
begin
if clk_scan'event and clk_scan='1' then
cnt=cnt+1; --每有一个扫描信号上升沿实现加1扫描
end if;
end process; --结束进程
process(cnt) --开始进程(选择扫描显示数码管)
begin
case cnt is --扫描时给每个数码管赋值
when "000"=shuju=c0;
when "001"=shuju=c1;
when "010"=shuju=c2;
when "011"=shuju=c3;
when "100"=shuju=k0;
when "101"=shuju=k1;
when "110"=shuju=m0;
when "111"=shuju=m1;
when others= null;
end case;
if (cnt="001" or cnt="110")
then xiaodian='1'; --在里程和总费用的个位处显示小数点
else xiaodian='0';
end if;
end process; --结束进程
process(shuju) --开始进程(译码显示)
begin
case shuju is
when "0000"=duan="0111111"; --0
when "0001"=duan="0000110"; --1
when "0010"=duan="1011011"; --2
when "0011"=duan="1001111"; --3
when "0100"=duan="1100110"; --4
when "0101"=duan="1101101"; --5
when "0110"=duan="1111101"; --6
when "0111"=duan="0000111"; --7
when "1000"=duan="1111111"; --8
when "1001"=duan="1101111"; --9
when others=null;
end case;
end process;
sel=cnt;
led=duan;
led_dp=xiaodian;
end rt5;
二、课程设计工作记录:
包括:设计步骤与时间安排、调试步骤与时间安排、课题完成结果说明
2.课题完成结果说明:
此计费器能实现起步价是5元;实现实验要求的1公里计费一次单价,行驶公里大于2km时每公里按1.4元计费并能显示里程和总共的费用。当行驶了6公里,等待了4分钟时,费用显示为15.8元。与计算公式总费用=起步费用+(里程-2公里)*里程单价+等候时间*等后单价;即15.8=5+(6-2)*1.4+4*1.3。实验结果与理论结果完全一致,实验设计成功。
推荐一本适合自学的EDA教材
全名:VHDL实用教程
作 者: 潘松
装 桢:
精装
开 本:
787*1092 1/16
出版社:
电子科技大学出版社
出版日期: 2000-03-01
ISBN: 781065290
蔚蓝编号: 20704
-------------
图书简介: 本书比较系统地介绍了VHDL的基本语言现象和实用技术。全书以实用和可操作为基点,介绍了VHDL基于EDA技术的理论与实践方面的知识。包括VHDL语句语法基础知识(第1章~第8章)、VHDL综合和可综合的VHDL程序设计技术(第9章)、VHDL基本设计和实用设计(第10、11章)、多种常用的支持VHDL的EDA软件使用(第12章)、VHDL数字系统设计实践(第13章)和实用系统的VHDL综合应用(第14章)。全书列举了大量VHDL设计示例,其中大部分经第12章介绍的VHDL综合器编译通过;第13章的程序绝大部分都通过了附录介绍的EDA实验系统上的硬件测试,可直接使用。书中还附有大量程序设计和实验、实践方面的习题。 本书可作为高等院校的电子工程、通信、工业自动化、计算机应用技术、电子对抗、仪器仪表、数字信号处理、图像处理等学科领域和专业的高年级本科生或研究生的VHDL或EDA技术课程的教材及实验指导,也可作为相关专业技术人员的自学参考书。
nto 0); --控制数码管的中间变量signal xiaodian:std_logic; --小数点的中间变量begin process(clk_scan) --开始进程 begin if clk_scan'event and clk_scan='1' then c
if;elsif fin='1' then --里程计数开始if k0="1001" then k0="0000";if k1="1001" then k1="0000"; --
when "1001"=duan="1101111"; --9 when others=null; end case; end process; sel=cnt; led=duan; led_dp=xiaodian;end rt5;二、课程