EDA课程设计,用VHDL编程做出租车计费器

EDA课程设计,用VHDL编程做出租车计费器,第1张

课程设计内容与要求

1,用开关按键表示脉冲,每个脉冲代表100米,10个脉冲1公里,每公里14元,能同步显示里程和费用;

2,低于2公里5元计费,高于2公里总费用=起步费用+(里程-2公里)里程单价+

等候时间等后单价;

3,等候时间大于2分钟,按每分钟13元计费;

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,系统停止工作;价格开始归为起步价50元。

整个设计由分频模块,计量模块,计费模块,控制模块和显示模块五个部分组成。

其中计量模块是整个系统实现里程计数和时间计数的重要部分;控制模块是实现不同计费方式的选择部分,根据所设计的使能端选择是根据里程计费还是根据等待时间计费,同时设计通过分频模块产生不同频率的脉冲信号来实现系统的计费。计量模块采用1hz的驱动信号,计费模块采用14hz,13hz的驱动信号;计量模块每计数一次,计量模块就实现14次或者13次计数,即为实现计时的13元/min,计程时的14元/km的收费。组成框图如下所示:

1百进制模块:

实现百米脉冲的驱动信号,元件框图如图3所示:

图3 百进制模块框图

源程序如下:

library ieee;

use ieeestd_logic_1164all;

use ieeestd_logic_unsignedall;

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 IEEEstd_logic_1164all;

use IEEEstd_logic_arithall;

use IEEEstd_logic_unsignedall;

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 ieeestd_logic_1164all;

use ieeestd_logic_unsignedall;

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 ieeestd_logic_1164all;

use ieeestd_logic_unsignedall;

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 ieeestd_logic_1164all;

use ieeestd_logic_unsignedall;

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;

6dian模块

图8 dian模块框图

源程序如下:

library ieee;

use ieeestd_logic_1164all;

use ieeestd_logic_unsignedall;

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 IEEEstd_logic_1164all;

use IEEEstd_logic_arithall;

use IEEEstd_logic_unsignedall;

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 ieeestd_logic_1164all;

use ieeestd_logic_arithall;

use ieeestd_logic_unsignedall;

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 m1&m0>"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 k1&k0>"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 IEEEstd_logic_1164all;

use IEEEstd_logic_arithall;

use IEEEstd_logic_unsignedall;

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外以每公里14元计费,等待累积时间超过2min则按每分钟13元计费。c0,c1,c2,c3分别表示费用的显示。

模块元件为:

计费模块框图

计费模块仿真波形为:

源程序如下:

Library IEEE;

use IEEEstd_logic_1164all;

use IEEEstd_logic_arithall;

use IEEEstd_logic_unsignedall;

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~9999

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 ieeestd_logic_1164all;

use ieeestd_logic_unsignedall; --定义库包

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时每公里按14元计费并能显示里程和总共的费用。当行驶了6公里,等待了4分钟时,费用显示为158元。与计算公式总费用=起步费用+(里程-2公里)里程单价+等候时间等后单价;即158=5+(6-2)14+413。实验结果与理论结果完全一致,实验设计成功。

eda编程9人表决器程序详解://本程序用VERILOG HDL语言实现,描述9人表决器。

module 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;

endmodule

内容简介

本书从实际应用的角度出发,全面系统地介绍了EDA技术和硬件描述语言VHDL,将VHDL的基础知识、编程技巧、实用方法与实际工程开发技术在EDA软件设计平台上很好地结合起来,使读者能够通过本书的学习迅速了解并掌握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 IEEESTD_LOGIC_1164ALL;

USE IEEESTD_LOGIC_UNSIGNEDALL;

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 IEEESTD_LOGIC_1164ALL;

USE IEEESTD_LOGIC_UNSIGNEDALL;

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 IEEESTD_LOGIC_1164ALL;

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 IEEESTD_LOGIC_1164ALL;

USE IEEESTD_LOGIC_UNSIGNEDALL;

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 IEEESTD_LOGIC_1164ALL;

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_datamif 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 IEEESTD_LOGIC_1164ALL;

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_DATAmif") --ROM数据文件及其路径

PORT MAP(address=>address,inclock=>inclock,q=>sub_wire0);

END SYN;

这个太多咯,DDS基本原理书上或网上多得很, 一般在EDA技术的书上讲有VHDL语言实现DDS的代码、、

以上就是关于EDA课程设计,用VHDL编程做出租车计费器全部的内容,包括:EDA课程设计,用VHDL编程做出租车计费器、eda编程9人表决器程序详解是什么、EDA编程,数字频率合成器等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10214406.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存