这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » FPGA » FPGA项目源代码公布榜

共64条 2/7 1 2 3 4 5 6 ›| 跳转至
工程师
2007-11-10 22:24:44     打赏
11楼

FSK调制与解调VHDL程序

--文件名:PL_FSK
--功能:基于VHDL硬件描述语言,对基带信号进行FSK调制
--最后修改日期:2004.3.16
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_FSK is
port(clk :in std_logic; --系统时钟
start :in std_logic; --开始调制信号
x :in std_logic; --基带信号
y :out std_logic); --调制信号
end PL_FSK;
architecture behav of PL_FSK is
signal q1:integer range 0 to 11; --载波信号f1的分频计数器
signal q2:integer range 0 to 3; --载波信号f2的分频计数器
signal f1,f2:std_logic; --载波信号f1,f2
begin
process(clk) --此进程通过对系统时钟clk的分频,得到载波f1
begin
if clk'event and clk='1' then
if start='0' then q1<=0;
elsif q1<=5 then f1<='1';q1<=q1+1; --改变q1后面的数字可以改变,载波f1的占空比
elsif q1=11 then f1<='0';q1<=0; --改变q1后面的数字可以改变,载波f1的频率
else f1<='0';q1<=q1+1;
end if;
end if;
end process;
process(clk) --此进程通过对系统时钟clk的分频,得到载波f2
begin
if clk'event and clk='1' then
if start='0' then q2<=0;
elsif q2<=0 then f2<='1';q2<=q2+1; --改变q2后面的数字可以改变,载波f2的占空比
elsif q2=1 then f2<='0';q2<=0; --改变q2后面的数字可以改变,载波f2的频率
else f2<='0';q2<=q2+1;
end if;
end if;
end process;
process(clk,x) --此进程完成对基带信号的FSK调制
begin
if clk'event and clk='1' then
if x='0' then y<=f1; --当输入的基带信号x=‘0’时,输出的调制信号y为f1
else y<=f2; --当输入的基带信号x=‘1’时,输出的调制信号y为f2
end if;
end if;
end process;
end behav;

 


工程师
2007-11-10 22:25:24     打赏
12楼

CPSK调制VHDL程序

--文件名:PL_CPSK
--功能:基于VHDL硬件描述语言,对基带信号进行调制
--最后修改日期:2004.3.16
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_CPSK is
port(clk :in std_logic; --系统时钟
start :in std_logic; --开始调制信号
x :in std_logic; --基带信号
y :out std_logic); --已调制输出信号
end PL_CPSK;
architecture behav of PL_CPSK is
signal q:std_logic_vector(1 downto 0); --2位计数器
signal f1,f2:std_logic; --载波信号
begin
process(clk) --此进程主要是产生两重载波信号f1,f2
begin
if clk'event and clk='1' then
if start='0' then q<="00";
elsif q<="01" then f1<='1';f2<='0';q<=q+1;
elsif q="11" then f1<='0';f2<='1';q<="00";
else f1<='0';f2<='1';q<=q+1;
end if;
end if;
end process;
process(clk,x) --此进程完成对基带信号x的调制
begin
if clk'event and clk='1' then
if q(0)='1' then
if x='1' then y<=f1; --基带信号x为‘1’时,输出信号y为f1
else y<=f2; --基带信号x为‘0’时,输出信号y为f2
end if;
end if;
end if;
end process;
end behav;

 


工程师
2007-11-10 22:26:04     打赏
13楼

MASK调制VHDL程序

--文件名:PL_MASK
--功能:基于VHDL硬件描述语言,对基带信号进行MASK调制
--说明:这里MASK中的M为4
--最后修改日期:2004.2.13
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_MASK is
port(clk :in std_logic; --系统时钟
start :in std_logic; --开始调制信号
x :in std_logic; --基带信号
y :out std_logic_vector(7 downto 0)); --8位DAC数据
end PL_MASK;
architecture behav of PL_MASK is
signal q:integer range 0 to 7; --计数器
signal qq:integer range 0 to 3; --计数器
signal xx:std_logic_vector(3 downto 0); --并行数据寄存器
signal yy:std_logic_vector(7 downto 0); --8位DAC数据寄存器
begin
process(clk) --此进程完成基带信号的串并转换,完成4位并行数据到8位DAC数据的译码
begin
if clk'event and clk='1' then
if start='0' then q<=0;
elsif q=0 then q<=1;xx(3)<=x;
if xx(3)='1' then yy<=xx&"1111"; --if语句完成4位并行数据到8位DAC数据转换
elsif xx(2)='1' then yy<=xx&"1011";
elsif xx(1)='1' then yy<=xx&"0111";
elsif xx(0)='1' then yy<=xx&"0011";
else yy<=xx&"0000";
end if;
elsif q=2 then q<=3;xx(2)<=x;
elsif q=4 then q<=5;xx(1)<=x;
elsif q=6 then q<=7;xx(0)<=x;
else q<=q+1;
end if;
end if;
end process;
process(clk) --对8位DAC数据进行ASK调制
begin
if clk'event and clk='1' then
if start='0' then qq<=0;
elsif qq<2 then qq<=qq+1;y<="00000000";
elsif qq=2 then qq<=3;y<=yy;
else qq<=0;
end if;
end if;
end process;
end behav;

 


工程师
2007-11-10 22:26:45     打赏
14楼

MPSK调制与解调VHDL程序

--文件名:PL_MPSK
--功能:基于VHDL硬件描述语言,对基带信号进行MPSK调制(这里M=4)

--最后修改日期:2004.2.14
library ieee;
use ieee.std_logic_arith.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity PL_MPSK is
port(clk :in std_logic; --系统时钟
start :in std_logic; --开始调制信号
x :in std_logic; --基带信号
y :out std_logic); --调制信号
end PL_MPSK;
architecture behav of PL_MPSK is
signal q:integer range 0 to 7; --计数器
signal xx:std_logic_vector(1 downto 0); --中间寄存器
signal yy:std_logic_vector(1 downto 0); --2位并行码寄存器
signal f:std_logic_vector(3 downto 0); --载波f
begin
process(clk) --通过对clk分频,得到4种相位;并完成基带信号的串并转换
begin
if clk'event and clk='1' then
if start='0' then q<=0;
elsif q=0 then q<=1;f(3)<='1'; f(1)<='0'; xx(1)<=x;yy<=xx;
elsif q=2 then q<=3;f(2)<='0'; f(0)<='1';
elsif q=4 then q<=5;f(3)<='0'; f(1)<='1'; xx(0)<=x;
elsif q=6 then q<=7;f(2)<='1'; f(0)<='0';
else q<=q+1;
end if;
end if;
end process;
y<=f(0) when yy="11" else
f(1) when yy="10" else
f(2) when yy="01" else
f(3); --根据yy寄存器数据,输出对应的载波
end behav;

 


工程师
2007-11-10 22:28:21     打赏
15楼

基于VHDL硬件描述语言的基带码发生器程序设计

--文件名:HS_UJDM
--功能:基于VHDL硬件描述语言,产生常用基带码
--最后修改日期:2004.3.27
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity HS_UJDM is
Port (clk : in std_logic; --系统时钟
Start : in std_logic; --始能信号
dat : in std_logic_vector(15 downto 0); --二进制数据输入端
NRZ : out std_logic; --非归零信号输出端
DRZ : out std_logic; --单极性归零信号输出端
SRZ : out std_logic_vector(1 downto 0); --双极性归零信号输出端
AMI : out std_logic_vector(1 downto 0); --交替极性信号输出端
CFM : out std_logic; --差分信号输出端
CMI : out std_logic; --编码信号反转码信号输出端
FXM : out std_logic); --分相码(曼彻斯特码)信号输出端
end HS_UJDM;
architecture Behavioral of HS_UJDM is
begin
process(clk,start)
variable latch_dat : std_logic_vector(15 downto 0); --十六位二进制信号锁存器
variable latch_sig : std_logic; --高位信号锁存器
variable latch_cfm : std_logic; --差分码信号寄存器
variable latch_cnt : std_logic; --基带码同步信号
variable count_fri : integer range 0 to 8; --分频计数器(码宽定义)
variable count_mov : integer range 0 to 16; --移位计数器
begin
if start='0' then latch_cnt:='0'; --异步复位
latch_cfm:='0'; latch_sig:='0';
count_fri:=7;count_mov:=16; --异步置位
latch_dat:="0000000000000000";
elsif rising_edge(clk) then count_fri:=count_fri+1; --分频计数器+1
if count_fri=8 then count_fri:=0; --计数到8
if count_mov<16 then count_mov:=count_mov+1; --移位计数器+1
latch_sig:=latch_dat(15); --二进制码高位移入latch_sig中
latch_dat:=latch_dat(14 downto 0)&'0'; --二进制数据向高位移动一位,低位补零
else latch_dat:=dat;count_mov:=0; --载入下一轮将发送的数据
latch_cfm:='0';latch_sig:='0';latch_cnt:='0'; --寄存器复位
end if;
if latch_sig='1' then latch_cfm:=not(latch_cfm); --差分码信号寄存器中信号取反
end if;
end if;
if count_fri<4 then latch_cnt:='1'; --基带码同步信号的占空比调节
else latch_cnt:='0';
end if;
end if;
--码形转换部分
NRZ<=latch_sig; --非归零码信号
DRZ<=latch_sig and latch_cnt; --单极性归零码信号
SRZ(0)<=latch_cnt; --双极性归零码信号
SRZ(1)<=not(latch_sig); --SRZ(1)=‘1’表示负极性
AMI(0)<=latch_sig and latch_cnt; --极性交替码信号
AMI(1)<=not(latch_cfm); --AMI(1)=‘1’表示负极性
CFM<=latch_cfm; --差分码信号
FXM<=latch_cnt xnor latch_sig; --分相码信号
if latch_sig='1' then CMI<=latch_cfm; --编码信号反转码
else CMI<=not(latch_cnt);
end if;
end process;
end Behavioral;


工程师
2007-11-10 22:28:59     打赏
16楼

数字频率计VHDL程序

--文件名:plj.vhd。
--功能:频率计。具有4位显示,能自动根据7位十进制计数的结果,自动选择有效数据的
--高4位进行动态显示。小数点表示是千位,即KHz。
--最后修改日期:2004.4.9。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity plj is
port ( start:in std_logic; --复位信号
clk :in std_logic; --系统时钟
clk1:in std_logic; --被测信号
yy1:out std_logic_vector(7 downto 0); --八段码
w1 :out std_logic_vector(3 downto 0)); --数码管位选信号
end plj;
architecture behav of PLj is
signal b1,b2,b3,b4,b5,b6,b7:std_logic_vector(3 downto 0); --十进制计数器
signal bcd:std_logic_vector(3 downto 0); --BCD码寄存器
signal q :integer range 0 to 49999999; --秒分频系数
signal qq : integer range 0 to 499999; --动态扫描分频系数
signal en,bclk:std_logic; --使能信号,有效被测信号
signal sss : std_logic_vector(3 downto 0); --小数点
signal bcd0,bcd1,bcd2,bcd3 : std_logic_vector(3 downto 0);
--寄存7位十位计数器中有效的高4位数据
begin

second:process(clk) --此进程产生一个持续时间为一秒的的闸门信号
begin
if start='1' then q<=0;
elsif clk'event and clk='1' then
if q<49999999 then q<=q+1;
else q<=49999999;
end if;
end if;
if q<49999999 and start='0' then en<='1';
else en<='0';
end if;
end process;

and2:process(en,clk1) --此进程得到7位十进制计数器的计数脉冲
begin
bclk<=clk1 and en;
end process;


com:process(start,bclk) --此进程完成对被测信号计脉冲数
begin
if start='1' then --复位
b1<="0000";b2<="0000";b3<="0000";b4<="0000";b5<="0000";b6<="0000";b7<="0000";
elsif bclk'event and bclk='1' then
if b1="1001" then b1<="0000"; --此IF语句完成个位十进制计数
if b2="1001" then b2<="0000"; --此IF语句完成百位十进制计数
if b3="1001" then b3<="0000"; --此IF语句完成千位十进制计数
if b4="1001" then b4<="0000"; --此IF语句完成万位十进制计数
if b5="1001" THEN b5<="0000"; --此IF语句完成十万位十进制计数
if b6="1001" then b6<="0000"; --此IF语句完成百万位十进制计数
if b7="1001" then b7<="0000"; --此IF语句完成千万位十进制计数
else b7<=b7+1;
end if;
else b6<=b6+1;
end if;
else b5<=b5+1;
end if;
else b4<=b4+1;
end if;
else b3<=b3+1;
end if;
else b2<=b2+1;
end if;
else b1<=b1+1;
end if;
end if;
end process;

process(clk) --此进程把7位十进制计数器有效的高4位数据送如bcd0~3;并得到小数点信息
begin
if rising_edge(clk) then
if en='0' then
if b7>"0000" then bcd3<=b7; bcd2<=b6; bcd1<=b5; bcd0<=b4; sss<="1110";
elsif b6>"0000" then bcd3<=b6; bcd2<=b5; bcd1<=b4; bcd0<=b3; sss<="1101";
elsif b5>"0000" then bcd3<=b5; bcd2<=b4; bcd1<=b3; bcd0<=b2; sss<="1011";
else bcd3<=b4; bcd2<=b3; bcd1<=b2; bcd0<=b1; sss<="1111";
end if;
end if;
end if;
end process;

weixuan:process(clk) --此进程完成数据的动态显示
begin
if clk'event and clk='1' then
if qq< 99999 then qq<=qq+1;bcd<=bcd3; w1<="0111";
if sss="0111" then yy1(0)<='0';
else yy1(0)<='1';
end if;
elsif qq<199999 then qq<=qq+1;bcd<=bcd2; w1<="1011";
if sss="1011" then yy1(0)<='0';
else yy1(0)<='1';
end if;
elsif qq<299999 then qq<=qq+1;bcd<=bcd1; w1<="1101";
if sss="1101" then yy1(0)<='0';
else yy1(0)<='1';
end if;
elsif qq<399999 then qq<=qq+1;bcd<=bcd0; w1<="1110";
if sss="1110" then yy1(0)<='0';
else yy1(0)<='1';
end if;
else qq<=0;
end if;
end if;
end process;

m0: process (bcd) --译码
begin
case bcd is
when "0000"=>yy1(7 downto 1)<="0000001";
when "0001"=>yy1(7 downto 1)<="1001111";
when "0010"=>yy1(7 downto 1)<="0010010";
when "0011"=>yy1(7 downto 1)<="0000110";
when "0100"=>yy1(7 downto 1)<="1001100";
when "0101"=>yy1(7 downto 1)<="0100100";
when "0110"=>yy1(7 downto 1)<="1100000";
when "0111"=>yy1(7 downto 1)<="0001111";
when "1000"=>yy1(7 downto 1)<="0000000";
when "1001"=>yy1(7 downto 1)<="0001100";
when others=>yy1(7 downto 1)<="1111111";
end case;
end process;
end behav;


工程师
2007-11-10 22:29:33     打赏
17楼

采用等精度测频原理的频率计的程序

--文件名:PLJ.vhd。
--功能:4位显示的等精度频率计。
--最后修改日期:2004.4.14。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity PLJ is
port(clk:in std_logic; --基准时钟(10KHz)
tclk:in std_logic; --被测信号
start:in std_logic; --复位信号
alarm0,alarm1:out std_logic; --超量程,欠量程显示
dian:out std_logic_vector(3 downto 0); --小数点
data1:out integer range 0 to 9999); --频率数据
end PLJ;
architecture behav of PLJ is
signal q:integer range 0 to 9999; --预置闸门分频系数
signal q1:integer range 0 to 10000; --被测信号计数器
signal q2:integer range 0 to 20000; --基准信号计数器
signal en,en1:std_logic; --预置闸门,实际闸门
signal qq,qqq:integer range 0 to 200000000; --运算器
signal data0:integer range 0 to 9999; --频率数据中间信号

begin
process(clk) --此进程得到一个预置闸门信号
begin
if clk'event and clk='1' then
if start='1' then q<=0;en<='0';
elsif q=9999 then q<=9999;en<='0';
else q<=q+1;en<='1';
end if;
end if;
end process;

process(tclk) --此进程计被测信号脉冲数,和得到一个实际闸门信号
begin
if tclk'event and tclk='1' then
if start='1' then q1<=0;en1<='0';
elsif en='1' then q1<=q1+1;en1<='1';
else en1<='0';
end if;
end if;
end process;

process(clk) --此进程完成在实际闸门时间内,计基准脉冲数
begin
if clk'event and clk='1' then
if start='1' then q2<=0;
elsif en1='1' then
if q2=20000 then q2<=20000;
else q2<=q2+1;
end if;
end if;
end if;
end process;

process(clk) --此进程完成等精度频率计的运算
begin
if clk'event and clk='1' then
if start='1' then data0<=0;dian<="0000";alarm0<='0';alarm1<='0';qqq<=0;qq<=00;
elsif en1='0' then
if q1>=1000 then qq<=q1*10000; --根据q1的大小来判断小数点的位置
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;dian<="0000"; --完成数据运算
elsif data0>=10000 then alarm0<='1'; --超量程显示
else data1<=data0;
end if;
elsif q1>=100 then qq<=q1*100000;
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;
elsif data0>=10000 then data1<=1000;dian<="0000";
else data1<=data0;dian<="0010";
end if;
elsif q1>=10 then qq<=q1*1000000;
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;
elsif data0>=10000 then data1<=1000;dian<="0010";
else data1<=data0;dian<="0100";
end if;
elsif q1>=1 then qq<=q1*10000000;
if qqq<qq then qqq<=qqq+q2;data0<=data0+1;
elsif data0>=10000 then data1<=1000;dian<="0100";
else data1<=data0;dian<="1000";
end if;
end if;
elsif q2>19999 then alarm1<='1'; --欠量程显示
else alarm1<='0';
end if;
end if;
end process;
end behav;


工程师
2007-11-10 22:37:28     打赏
18楼
电梯控制器VHDL程序
--文件名:dianti.vhd。
--功能:6层楼的电梯控制系统。
--最后修改日期:2004.4.12。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity dianti is
port ( clk : in std_logic; --时钟信号(频率为2Hz)
full,deng,quick,clr : in std_logic; --超载、关门中断、提前关门清除报警信号
c_u1,c_u2,c_u3,c_u4,c_u5: in std_logic; --电梯外人的上升请求信号
c_d2,c_d3,c_d4,c_d5,c_d6 : in std_logic; --电梯外人的下降请求信号
d1,d2,d3,d4,d5,d6 : in std_logic; --电梯内人的请求信号
g1,g2,g3,g4,g5,g6 : in std_logic; --到达楼层信号
door : out std_logic_vector(1 downto 0); --电梯门控制信号
led : out std_logic_vector(6 downto 0); --电梯所在楼层显示
led_c_u:out std_logic_vector(5 downto 0); --电梯外人上升请求信号显示
led_c_d:out std_logic_vector(5 downto 0); --电梯外人下降请求信号显示
led_d : out std_logic_vector(5 downto 0); --电梯内请求信号显示
wahaha : out std_logic; --看门狗报警信号
ud,alarm : out std_logic; --电梯运动方向显示,超载警告信号
up,down : out std_logic ); --电机控制信号和电梯运动
end dianti;
architecture behav of dianti is
signal d11,d22,d33,d44,d55,d66:std_logic; --电梯内人请求信号寄存信号
signal c_u11,c_u22,c_u33,c_u44,c_u55:std_logic; --电梯外人上升请求信号寄存信号
signal c_d22,c_d33,c_d44,c_d55,c_d66:std_logic; --电梯外人下降请求信号寄存信号
signal q:integer range 0 to 1; --分频信号
signal q1:integer range 0 to 6; --关门延时计数器
signal q2:integer range 0 to 9; --看门狗计数器
signal dd,cc_u,cc_d,dd_cc:std_logic_vector(5 downto 0); --电梯内外请求信号寄存器
signal opendoor:std_logic; --开门使能信号
signal updown:std_logic; --电梯运动方向信号寄存器
signal en_up,en_dw:std_logic; --预备上升、预备下降预操作使能信号
begin
com:process(clk)
begin
if clk'event and clk='1' then
if clr='1' then q1<=0;q2<=0;wahaha<='0'; --清除故障报警
elsif full='1' then alarm<='1'; q1<=0; --超载报警
if q1>=3 then door<="10";
else door<="00";
end if;
elsif q=1 then q<=0;alarm<='0';
if q2=3 then wahaha<='1'; --故障报警
else
if opendoor='1' then door<="10";q1<=0;q2<=0;up<='0';down<='0'; --开门操作
elsif en_up='1' then --上升预操作
if deng='1' then door<="10";q1<=0;q2<=q2+1; --关门中断
elsif quick='1' then q1<=3; --提前关门
elsif q1=6 then door<="00";updown<='1';up<='1'; --关门完毕,电梯进入上升状态
elsif q1>=3 then door<="01";q1<=q1+1; --电梯进入关门状态
else q1<=q1+1;door<="00"; --电梯进入等待状态
end if;
elsif en_dw='1' then --下降预操作
if deng='1' then door<="10";q1<=0;q2<=q2+1;
elsif quick='1' then q1<=3;
elsif q1=6 then door<="00";updown<='0';down<='1';
elsif q1>=3 then door<="01";q1<=q1+1;
else q1<=q1+1;door<="00";
end if;
end if;
if g1='1' then led<="1001111"; --电梯到达1楼,数码管显示1
if d11='1' or c_u11='1' then d11<='0'; c_u11<='0';opendoor<='1';
--有当前层的请求,则电梯进入开门状态
elsif dd_cc>"000001" then en_up<='1'; opendoor<='0';
--有上升请求,则电梯进入预备上升状态
elsif dd_cc="000000" then opendoor<='0'; --无请求时,电梯停在1楼待机
end if;
elsif g2='1' then led<="0010010"; --电梯到达2楼,数码管显示2
if updown='1' then --电梯前一运动状态位上升
if d22='1' or c_u22='1' then d22<='0'; c_u22<='0'; opendoor<='1';
--有当前层的请求,则电梯进入开门状态
elsif dd_cc>"000011" then en_up<='1'; opendoor<='0';
--有上升请求,则电梯进入预备上升状态
elsif dd_cc<"000010" then en_dw<='1'; opendoor<='0';
--有下降请求,则电梯进入预备下降状态
end if;
--电梯前一运动状态为下降
elsif d22='1' or c_d22='1' then d22<='0'; c_d22<='0';opendoor<='1';
--有当前层的请求,则电梯进入开门状态
elsif dd_cc<"000010" then en_dw<='1'; opendoor<='0';
--有下降请求,则电梯进入预备下降状态
elsif dd_cc>"000011" then en_up<='1'; opendoor<='0';
--有上升请求,则电梯进入预备上升状态
end if;
elsif g3='1' then led<="0000110"; --电梯到达3楼,数码管显示3
if updown='1' then
if d33='1' or c_u33='1' then d33<='0'; c_u33<='0';opendoor<='1';
elsif dd_cc>"000111" then en_up<='1'; opendoor<='0';
elsif dd_cc<"000100" then en_dw<='1'; opendoor<='0';
end if;
elsif d33='1' or c_d33='1' then d33<='0'; c_d33<='0'; opendoor<='1';
elsif dd_cc<"000100" then en_dw<='1'; opendoor<='0';
elsif dd_cc>"000111" then en_up<='1'; opendoor<='0';
end if;
elsif g4='1' then led<="1001100"; --电梯到达4楼,数码管显示4
if updown='1' then
if d44='1' or c_u44='1' then d44<='0'; c_u44<='0'; opendoor<='1';
elsif dd_cc>"001111" then en_up<='1'; opendoor<='0';
elsif dd_cc<"001000" then en_dw<='1'; opendoor<='0';
end if;
elsif d44='1' or c_d44='1' then d44<='0'; c_d44<='0'; opendoor<='1';
elsif dd_cc<"001000" then en_dw<='1'; opendoor<='0';
elsif dd_cc>"001111" then en_up<='1'; opendoor<='0';
end if;
elsif g5='1' then led<="0100100"; --电梯到达5楼,数码管显示5
if updown='1' then
if d55='1' or c_u55='1' then d55<='0'; c_u55<='0';opendoor<='1';
elsif dd_cc>"011111" then en_up<='1'; opendoor<='0';
elsif dd_cc<"010000" then en_dw<='1'; opendoor<='0';
end if;
elsif d55='1' or c_d55='1' then d55<='0'; c_d55<='0';opendoor<='1';
elsif dd_cc<"010000" then en_dw<='1'; opendoor<='0';
elsif dd_cc>"011111" then en_up<='1'; opendoor<='0';
end if;
elsif g6='1' then led<="0100000"; --电梯到达6楼,数码管显示6
if d66='1' or c_d66='1' then d66<='0'; c_d66<='0';opendoor<='1';
elsif dd_cc<"100000" then en_dw<='1'; opendoor<='0';
end if;
else en_up<='0';en_dw<='0'; --电梯进入上升或下降状态
end if;
end if;
else q<=1;alarm<='0'; --清除超载报警
if d1='1' then d11<=d1; --对电梯内人请求信号进行检测和寄存
elsif d2='1' then d22<=d2;
elsif d3='1' then d33<=d3;
elsif d4='1' then d44<=d4;
elsif d5='1' then d55<=d5;
elsif d6='1' then d66<=d6;
end if;
if c_u1='1' then c_u11<=c_u1; --对电梯外人上升请求信号进行检测和寄存
elsif c_u2='1' then c_u22<=c_u2;
elsif c_u3='1' then c_u33<=c_u3;
elsif c_u4='1' then c_u44<=c_u4;
elsif c_u5='1' then c_u55<=c_u5;
end if;
if c_d2='1' then c_d22<=c_d2; --对电梯外人下降请求信号进行检测和寄存
elsif c_d3='1' then c_d33<=c_d3;
elsif c_d4='1' then c_d44<=c_d4;
elsif c_d5='1' then c_d55<=c_d5;
elsif c_d6='1' then c_d66<=c_d6;
end if;
dd<=d66&d55&d44&d33&d22&d11; --电梯内人请求信号并置
cc_u<='0'&c_u55&c_u44&c_u33&c_u22&c_u11; --电梯外人上升请求信号并置
cc_d<=c_d66&c_d55&c_d44&c_d33&c_d22&'0'; --电梯外人下降请求信号并置
dd_cc<=dd or cc_u or cc_d; --电梯内、外人请求信号进行综合
end if;
ud<=updown; --电梯运动状态显示
led_d<=dd; --电梯内人请求信号显示
led_c_u<=cc_u; --电梯外人上升请求信号显示
led_c_d<=cc_d; --电梯外人下降请求信号显示
end if;
end process;
end behav;

工程师
2007-11-10 22:42:09     打赏
19楼
电子时钟VHDL程序
1. 10进制计数器设计与仿真
(1)10进制计数器VHDL程序
--文件名:counter10.vhd。
--功能:10进制计数器,有进位C
--最后修改日期:2004.3.20
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter10 is
Port ( clk : in std_logic;
reset : in std_logic;
din : in std_logic_vector(3 downto 0);
dout : out std_logic_vector(3 downto 0);
c:out std_logic);
end counter10;
architecture Behavioral of counter10 is
signal count : std_logic_vector(3 downto 0);
begin
dout <= count;
process(clk,reset,din)
begin
if reset='0'then
count <= din ;
c<='0';
elsif rising_edge(clk) then
if count = "1001" then
count <= "0000";
c<='1';
else
count <= count+1;
c<='0';
end if;
end if;
end process;
end Behavioral;


(1)6进制计数器VHDL程序
--文件名:counter6.vhd。
--功能:6进制计数器,有进位C
--最后修改日期:2004.3.20
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter6 is
Port ( clk : in std_logic;
reset : in std_logic;
din : in std_logic_vector(2 downto 0);
dout : out std_logic_vector(2 downto 0);
c:out std_logic);
end counter6;
architecture Behavioral of counter6 is
signal count : std_logic_vector(2 downto 0);
begin
dout <= count;
process(clk,reset,din)
begin
if reset= '0' then
count <= din;
c<='0';
elsif rising_edge(clk) then
if count="101" then
count<="000";
c<='1';
else
count<=count+1;
c<='0';
end if;
end if;
end process;
end Behavioral;

(1)24进制计数器VHDL程序
--文件名:counter24.vhd。
--功能:24进制计数器。
--最后修改日期:2004.3.20
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity counter24 is
Port ( clk : in std_logic;
reset : in std_logic;
din : in std_logic_vector(5 downto 0);
dout : out std_logic_vector(5 downto 0));
end counter24;
architecture Behavioral of counter24 is
signal count : std_logic_vector(5 downto 0);
begin
dout <= count;
process(clk,reset,din)
begin
if reset= '0' then
count <= din;
elsif rising_edge(clk) then
if count(3 downto 0)="1001" then
count(3 downto 0)<="0000";
count(5 downto 4)<=count(5 downto 4) +1;
else
count(3 downto 0)<=count(3 downto 0)+1;
end if;
if count="100011" then
count<="000000";
end if;
end if;
end process;
end Behavioral;


4. 译码器设计
(1)译码器VHDL程序
--文件名:decoder.vhd。
--功能:将4bit二进制数译码,在LED上显示相应数字。
--最后修改日期:2004.3.20
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity decoder is
Port (din:in std_logic_vector(3 downto 0 ); --四位二进制码输入
dout:out std_logic_vector(6 downto 0) ); --输出LED七段码
end decoder;
architecture Behavioral of decoder is
begin
process(din)
begin
case din is
when "0000" => dout<="0000001";--0
when "0001" => dout<="1001111";--1
when "0010" => dout<="0010010";--2
when "0011" => dout<="0000110";--3
when "0100" => dout<="1001100"; --4
when "0101" => dout<="0100100";--5
when "0110" => dout<="0100000";--6
when "0111" => dout<="0001111";--7
when "1000" => dout<="0000000";--8
when "1001" => dout<="0000100";--9
when others => dout<="1111111";
end case;
end process;
end Behavioral;
5. 顶层设计与仿真
(1)顶层设计VHDL程序
--文件名:clock.vhd。
--功能:时钟的顶层设计。
--最后修改日期:2004.3.20
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity clock is
Port ( clk : in std_logic; --1Hz
reset : in std_logic; --复位信号
dins : in std_logic_vector(6 downto 0);--秒钟预置
dinm : in std_logic_vector(6 downto 0);--分钟预置
dinh : in std_logic_vector(5 downto 0);--时钟预置
secondl: out std_logic_vector(6 downto 0);--秒钟低位输出
secondh: out std_logic_vector(6 downto 0); --秒钟高位输出
minutel: out std_logic_vector(6 downto 0); --分钟低位输出
minuteh: out std_logic_vector(6 downto 0); --分钟高位输出
hourl: out std_logic_vector(6 downto 0); --小时低位输出
hourh: out std_logic_vector(6 downto 0)); --小时高位输出
end clock;
architecture Behavioral of clock is
component counter10 is
Port ( clk : in std_logic;
reset : in std_logic;
din : in std_logic_vector(3 downto 0);
dout : out std_logic_vector(3 downto 0);
c:out std_logic);
end component;

component counter6 is
Port ( clk : in std_logic;
reset : in std_logic;
din : in std_logic_vector(2 downto 0);
dout : out std_logic_vector(2 downto 0);
c:out std_logic);
end component;

component counter24 is
Port ( clk : in std_logic;
reset : in std_logic;
din : in std_logic_vector(5 downto 0);
dout : out std_logic_vector(5 downto 0));
end component;

component decoder is
Port (din:in std_logic_vector(3 downto 0 );
dout:out std_logic_vector(6 downto 0));
end component;

signal c1,c2,c3,c4:std_logic;
signal doutsl,doutml:std_logic_vector(3 downto 0);
signal doutsh,doutmh:std_logic_vector(2 downto 0);
signal douth:std_logic_vector(5 downto 0);
signal rdoutsh,rdoutmh:std_logic_vector(3 downto 0);
signal rdouth:std_logic_vector(7 downto 0);
begin
rdoutsh <= '0'&doutsh; --将秒钟高位数据变为4位,再进行译码
rdoutmh <= '0'&doutmh; --将分钟高位数据变为4位,再进行译码
rdouth <="00"&douth; --将时钟高位数据变为4位,再进行译码
u1: counter10 port map( clk=>clk,reset=>reset,
din=>dins(3 downto 0),
dout=>doutsl,
c=>c1);
u2: counter6 port map( clk=>c1,reset=>reset,
din=>dins(6 downto 4),
dout=>doutsh,
c=>c2);
u3: counter10 port map( clk=>c2,reset=>reset,
din=>dinm(3 downto 0),
dout=>doutml,
c=>c3);
u4: counter6 port map( clk=>c3,reset=>reset,
din=>dinm(6 downto 4),
dout=>doutmh,
c=>c4);
u5: counter24 port map( clk=>c4,reset=>reset,
din=>dinh,
dout=>douth);
u6: decoder port map( din => doutsl,dout => secondl); --秒的低位
u7: decoder port map( din => rdoutsh,dout => secondh); --秒的高位
u8: decoder port map( din => doutml,dout => minutel); --分的低位
u9: decoder port map( din => rdoutmh,dout => minuteh); --分的高位
u10: decoder port map( din => rdouth(3 downto 0),dout => hourh);--时的低位
u11: decoder port map( din => rdouth(7 downto 4),dout => hourl);--时的高位
end Behavioral;

工程师
2007-11-10 22:44:19     打赏
20楼
出租车计价器VHDL程序
--文件名:taxi.hd。
--功能:出租车计价器。
--最后修改日期:2004.4.9。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity taxi is
port ( clk_240 :in std_logic; --频率为240Hz的时钟
start :in std_logic; --计价使能信号
stop:in std_logic; --等待信号
fin:in std_logic; --公里脉冲信号
cha3,cha2,cha1,cha0:out std_logic_vector(3 downto 0); --费用数据
km1,km0:out std_logic_vector(3 downto 0); --公里数据
min1,min0: out std_logic_vector(3 downto 0)); --等待时间
end taxi;
architecture behav of taxi is
signal f_15,f_16,f_1:std_logic; --频率为15Hz,16Hz,1Hz的信号
signal q_15:integer range 0 to 15; --分频器
signal q_16:integer range 0 to 14; --分频器
signal q_1:integer range 0 to 239; --分频器
signal w:integer range 0 to 59; --秒计数器
signal c3,c2,c1,c0:std_logic_vector(3 downto 0); --制费用计数器
signal k1,k0:std_logic_vector(3 downto 0); --公里计数器
signal m1:std_logic_vector(2 downto 0); --分的十位计数器
signal m0:std_logic_vector(3 downto 0); --分的个位计数器
signal en1,en0,f:std_logic; --使能信号
begin

feipin:process(clk_240,start)
begin
if clk_240'event and clk_240='1' then
if start='0' then q_15<=0;q_16<=0;f_15<='0';f_16<='0';f_1<='0';f<='0';
else
if q_15=15 then q_15<=0;f_15<='1'; --此IF语句得到频率为15Hz的信号
else q_15<=q_15+1;f_15<='0';
end if;
if q_16=14 then q_16<=0;f_16<='1'; --此IF语句得到频率为16Hz的信号
else q_16<=q_16+1;f_16<='0';
end if;
if q_1=239 then q_1<=0;f_1<='1'; --此IF语句得到频率为1Hz的信号
else q_1<=q_1+1;f_1<='0';
end if;
if en1='1' then f<=f_15; --此IF语句得到计费脉冲f
elsif en0='1' then f<=f_16;
else f<='0';
end if;
end if;
end if;
end process;

process(f_1)
begin
if f_1'event and f_1='1' then
if start='0' then
w<=0;en1<='0';en0<='0';m1<="000";m0<="0000";k1<="0000";k0<="0000";
elsif stop='1' then
if w=59 then w<=0; --此IF语句完成等待计时
if m0="1001" then m0<="0000"; --此IF语句完成分计数
if m1<="101" then m1<="000";
else m1<=m1+1;
end if;
else m0<=m0+1;
end if;
if m1&m0>"0000001"then en1<='1'; --此IF语句得到en1使能信号
else en1<='0';
end if;
else w<=w+1;en1<='0';
end if;
elsif fin='1' then
if k0="1001" then k0<="0000"; --此IF语句完成公里脉冲计数
if k1="1001" then k1<="0000";
else k1<=k1+1;
end if;
else k0<=k0+1;
end if;
if k1&k0>"00000010" then en0<='1'; --此IF语句得到en0使能信号
else en0<='0';
end if;
else en1<='0';en0<='0';
end if;
cha3<=c3;cha2<=c2;cha1<=c1;cha0<=c0; --费用数据输出
km1<=k1;km0<=k0;min1<='0'&m1;min0<=m0; --公里数据、分钟数据输出
end if;
end process;

process(f,start)
begin
if start='0' then c3<="0000";c2<="0001";c1<="0000";c0<="0000";
elsif f'event and f='1' then
if c0="1001" then c0<="0000"; --此IF语句完成对费用的计数
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 behav;

共64条 2/7 1 2 3 4 5 6 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]