⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 anjian.txt

📁 按键输入模块(key): --可编程延时发生器(数字同步机)的前端输入模块:0-9十个数字键按键输入模块原型 --前端模块:消抖 --对i0-i9十个输入端的两点要求: --(1)输入端要保证
💻 TXT
字号:
关于延时发生器,先从简单的入手,指定按键输入12位十进制,高位不足按‘0’补齐,但仿真综合波形出不来,各位高手帮忙看看(不会吧,要发贴超过50,才能上传,算了,只要你们不嫌烦,咱五大模块VHDL源程序连附于下):
1、按键输入模块(key):
--可编程延时发生器(数字同步机)的前端输入模块:0-9十个数字键按键输入模块原型
--前端模块:消抖
--对i0-i9十个输入端的两点要求:
--(1)输入端要保证一段时间的稳定高电平
--(2)不能同时按下两个或多于两个的键
--后级模块:1、编码;2、可变模计数器
--编码模块:8线-4线(0-8 BCD码)
--可变模计数器模块:以编码模块输出的32位BCD码为模值
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY key IS
PORT(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,ch1,ch2,ch3,ch4:IN STD_LOGIC;
    f:OUT STD_LOGIC;
    h,g,j,q,s,u,w,z,v,r,m,t:OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END key;
ARCHITECTURE rtl OF key IS
SIGNAL x:STD_LOGIC;
SIGNAL b,y:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL a,d:STD_LOGIC_VECTOR(9 DOWNTO 0);
BEGIN
y<=ch4&ch3&ch2&ch1;
PROCESS(x,d,b,y,i0,i1,i2,i3,i4,i5,i6,i7,i8,i9)
BEGIN
--鉴于总共有四通道延时输出,所以进行按键选择
CASE y IS
WHEN "0001"|"0010"|"0100"|"1000"=>
x<=i0 OR i1 OR i2 OR i3 OR i4 OR i5 OR i6 OR i7 OR i8 OR i9;
a<=i9&i8&i7&i6&i5&i4&i3&i2&i1&i0; 
WHEN OTHERS=>x<='0';
            a<="0000000000";
END CASE;                                
IF (x'EVENT AND x='1') THEN
b<=b+'1';
CASE b IS
WHEN "0000"=>h<=a;
WHEN "0001"=>g<=a;
WHEN "0010"=>j<=a;
WHEN "0011"=>q<=a;
WHEN "0100"=>s<=a;
WHEN "0101"=>u<=a;
WHEN "0110"=>w<=a;
WHEN "0111"=>z<=a;
WHEN "1000"=>v<=a;
WHEN "1001"=>r<=a;
WHEN "1010"=>m<=a;
WHEN "1011"=>t<=a;
WHEN OTHERS=>h<="0000000000";
            g<="0000000000";
j<="0000000000";
q<="0000000000";
s<="0000000000";
u<="0000000000";
w<="0000000000";
z<="0000000000";
v<="0000000000";
r<="0000000000";
m<="0000000000";
t<="0000000000";
END CASE;
IF (b="1011") THEN
f<='1';
ELSE
f<='0';
END IF;
END IF;
END PROCESS;
END rtl;






--------------------------------------------------------------------------------

-- 作者: hwzcjxhl
-- 发布时间: 2005/08/10 06:49pm

2、编码模块(encoder):
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY encoder IS
PORT(f:IN STD_LOGIC;
h,g,j,q,s,u,w,z,v,r,m,t:IN STD_LOGIC_VECTOR(9 DOWNTO 0);
a,b,c,d,e,i,k,l,n,p,x,y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END encoder;
ARCHITECTURE rtl OF encoder IS
BEGIN
PROCESS(f,h,g,j,q,s,u,w,z,v,r,m,t)
BEGIN 
IF (f'EVENT AND f='1') THEN
CASE h IS
WHEN "0000000001"=>a<="0000";
WHEN "0000000010"=>a<="0001";
WHEN "0000000100"=>a<="0010";
WHEN "0000001000"=>a<="0011";
WHEN "0000010000"=>a<="0100";
WHEN "0000100000"=>a<="0101";
WHEN "0001000000"=>a<="0110";
WHEN "0010000000"=>a<="0111";
WHEN "0100000000"=>a<="1000";
WHEN "1000000000"=>a<="1001";
WHEN OTHERS=>a<="1111";
END CASE;
CASE g IS
WHEN "0000000001"=>b<="0000";
WHEN "0000000010"=>b<="0001";
WHEN "0000000100"=>b<="0010";
WHEN "0000001000"=>b<="0011";
WHEN "0000010000"=>b<="0100";
WHEN "0000100000"=>b<="0101";
WHEN "0001000000"=>b<="0110";
WHEN "0010000000"=>b<="0111";
WHEN "0100000000"=>b<="1000";
WHEN "1000000000"=>b<="1001";
WHEN OTHERS=>b<="1111";
END CASE;
CASE j IS
WHEN "0000000001"=>c<="0000";
WHEN "0000000010"=>c<="0001";
WHEN "0000000100"=>c<="0010";
WHEN "0000001000"=>c<="0011";
WHEN "0000010000"=>c<="0100";
WHEN "0000100000"=>c<="0101";
WHEN "0001000000"=>c<="0110";
WHEN "0010000000"=>c<="0111";
WHEN "0100000000"=>c<="1000";
WHEN "1000000000"=>c<="1001";
WHEN OTHERS=>c<="1111";
END CASE;
CASE q IS
WHEN "0000000001"=>d<="0000";
WHEN "0000000010"=>d<="0001";
WHEN "0000000100"=>d<="0010";
WHEN "0000001000"=>d<="0011";
WHEN "0000010000"=>d<="0100";
WHEN "0000100000"=>d<="0101";
WHEN "0001000000"=>d<="0110";
WHEN "0010000000"=>d<="0111";
WHEN "0100000000"=>d<="1000";
WHEN "1000000000"=>d<="1001";
WHEN OTHERS=>d<="1111";
END CASE;
CASE s IS
WHEN "0000000001"=>e<="0000";
WHEN "0000000010"=>e<="0001";
WHEN "0000000100"=>e<="0010";
WHEN "0000001000"=>e<="0011";
WHEN "0000010000"=>e<="0100";
WHEN "0000100000"=>e<="0101";
WHEN "0001000000"=>e<="0110";
WHEN "0010000000"=>e<="0111";
WHEN "0100000000"=>e<="1000";
WHEN "1000000000"=>e<="1001";
WHEN OTHERS=>e<="1111";
END CASE;
CASE u IS
WHEN "0000000001"=>i<="0000";
WHEN "0000000010"=>i<="0001";
WHEN "0000000100"=>i<="0010";
WHEN "0000001000"=>i<="0011";
WHEN "0000010000"=>i<="0100";
WHEN "0000100000"=>i<="0101";
WHEN "0001000000"=>i<="0110";
WHEN "0010000000"=>i<="0111";
WHEN "0100000000"=>i<="1000";
WHEN "1000000000"=>i<="1001";
WHEN OTHERS=>i<="1111";
END CASE;
CASE w IS
WHEN "0000000001"=>k<="0000";
WHEN "0000000010"=>k<="0001";
WHEN "0000000100"=>k<="0010";
WHEN "0000001000"=>k<="0011";
WHEN "0000010000"=>k<="0100";
WHEN "0000100000"=>k<="0101";
WHEN "0001000000"=>k<="0110";
WHEN "0010000000"=>k<="0111";
WHEN "0100000000"=>k<="1000";
WHEN "1000000000"=>k<="1001";
WHEN OTHERS=>k<="1111";
END CASE;
CASE z IS
WHEN "0000000001"=>l<="0000";
WHEN "0000000010"=>l<="0001";
WHEN "0000000100"=>l<="0010";
WHEN "0000001000"=>l<="0011";
WHEN "0000010000"=>l<="0100";
WHEN "0000100000"=>l<="0101";
WHEN "0001000000"=>l<="0110";
WHEN "0010000000"=>l<="0111";
WHEN "0100000000"=>l<="1000";
WHEN "1000000000"=>l<="1001";
WHEN OTHERS=>l<="1111";
END CASE;
CASE v IS
WHEN "0000000001"=>n<="0000";
WHEN "0000000010"=>n<="0001";
WHEN "0000000100"=>n<="0010";
WHEN "0000001000"=>n<="0011";
WHEN "0000010000"=>n<="0100";
WHEN "0000100000"=>n<="0101";
WHEN "0001000000"=>n<="0110";
WHEN "0010000000"=>n<="0111";
WHEN "0100000000"=>n<="1000";
WHEN "1000000000"=>n<="1001";
WHEN OTHERS=>n<="1111";
END CASE;
CASE r IS
WHEN "0000000001"=>p<="0000";
WHEN "0000000010"=>p<="0001";
WHEN "0000000100"=>p<="0010";
WHEN "0000001000"=>p<="0011";
WHEN "0000010000"=>p<="0100";
WHEN "0000100000"=>p<="0101";
WHEN "0001000000"=>p<="0110";
WHEN "0010000000"=>p<="0111";
WHEN "0100000000"=>p<="1000";
WHEN "1000000000"=>p<="1001";
WHEN OTHERS=>p<="1111";
END CASE;
CASE m IS
WHEN "0000000001"=>x<="0000";
WHEN "0000000010"=>x<="0001";
WHEN "0000000100"=>x<="0010";
WHEN "0000001000"=>x<="0011";
WHEN "0000010000"=>x<="0100";
WHEN "0000100000"=>x<="0101";
WHEN "0001000000"=>x<="0110";
WHEN "0010000000"=>x<="0111";
WHEN "0100000000"=>x<="1000";
WHEN "1000000000"=>x<="1001";
WHEN OTHERS=>x<="1111";
END CASE;
CASE t IS
WHEN "0000000001"=>y<="0000";
WHEN "0000000010"=>y<="0001";
WHEN "0000000100"=>y<="0010";
WHEN "0000001000"=>y<="0011";
WHEN "0000010000"=>y<="0100";
WHEN "0000100000"=>y<="0101";
WHEN "0001000000"=>y<="0110";
WHEN "0010000000"=>y<="0111";
WHEN "0100000000"=>y<="1000";
WHEN "1000000000"=>y<="1001";
WHEN OTHERS=>y<="1111";
END CASE;
END IF;
END PROCESS;
END rtl; 





--------------------------------------------------------------------------------

-- 作者: hwzcjxhl
-- 发布时间: 2005/08/10 06:50pm

3、可变模计数模块(counter_k):
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY counter_k IS
PORT(clk:IN STD_LOGIC;
a,b,c,d,e,i,k,l:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
    o:OUT STD_LOGIC);
END counter_k;
ARCHITECTURE rtl OF counter_k IS
SIGNAL y,m,n: INTEGER RANGE 0 TO 99999999;
BEGIN
PROCESS(clk,y,m,a,b,c,d,e,i,k,l)
BEGIN
y<=CONV_INTEGER(a)*10000000+CONV_INTEGER(b)*1000000+CONV_INTEGER(c)*100000+CONV_INTEGER(d)*10000
  +CONV_INTEGER(e)*1000+CONV_INTEGER(i)*100+CONV_INTEGER(k)*10+CONV_INTEGER(l);
m<=y-1;
IF (clk'EVENT AND clk='1') THEN
n<=n+1;
o<='0';
IF n=m THEN
o<='1';
END IF;
END IF;
END PROCESS;
END rtl; 







--------------------------------------------------------------------------------

-- 作者: hwzcjxhl
-- 发布时间: 2005/08/10 06:51pm

4、BCD转二进制模块:(bcd_bin):
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
ENTITY bcd_bin IS
PORT(n,p,x,y:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
ab:OUT STD_LOGIC_VECTOR(13 DOWNTO 0));
END bcd_bin;
ARCHITECTURE rtl OF bcd_bin IS
SIGNAL b:INTEGER RANGE 0 TO 9999;
BEGIN
b<=CONV_INTEGER(n)*1000+CONV_INTEGER(p)*100+CONV_INTEGER(x)*10+CONV_INTEGER(y);
ab<=CONV_STD_LOGIC_VECTOR(b,14);--输出连至14位D/A转换器输入端;
END rtl; 





--------------------------------------------------------------------------------

-- 作者: hwzcjxhl
-- 发布时间: 2005/08/10 06:54pm

5、七段LED译码显示模块(disp):
--显示输出s序列=a&b&c&d&e&f&g
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY disp IS
PORT(a,b,c,d,e,i,k,l,n,p,x,y:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
s11,s10,s09,s08,s07,s06,s05,s04,s03,s02,s01,s00:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END disp;
ARCHITECTURE rtl OF disp IS
BEGIN
PROCESS(a,b,c,d,e,i,k,l,n,p,x,y)
BEGIN
CASE a IS
WHEN "0000"=>s11<="1111110";
WHEN "0001"=>s11<="0110000";
WHEN "0010"=>s11<="1101101";           
WHEN "0011"=>s11<="1111001";
WHEN "0100"=>s11<="0110011";
WHEN "0101"=>s11<="1011011";
WHEN "0110"=>s11<="1011111";
WHEN "0111"=>s11<="1110000";
WHEN "1000"=>s11<="1111111";
WHEN "1001"=>s11<="1110111";
WHEN OTHERS=>s11<="1100011";
END CASE;
CASE b IS
WHEN "0000"=>s10<="1111110";
WHEN "0001"=>s10<="0110000";
WHEN "0010"=>s10<="1101101";
WHEN "0011"=>s10<="1111001";        
WHEN "0100"=>s10<="0110011";
WHEN "0101"=>s10<="1011011";
WHEN "0110"=>s10<="1011111";
WHEN "0111"=>s10<="1110000";
WHEN "1000"=>s10<="1111111";
WHEN "1001"=>s10<="1110111";
WHEN OTHERS=>s10<="1100011";
END CASE;
CASE c IS
WHEN "0000"=>s09<="1111110";
WHEN "0001"=>s09<="0110000"; 
WHEN "0010"=>s09<="1101101";
WHEN "0011"=>s09<="1111001";
WHEN "0100"=>s09<="0110011";
WHEN "0101"=>s09<="1011011";
WHEN "0110"=>s09<="1011111";
WHEN "0111"=>s09<="1110000";
WHEN "1000"=>s09<="1111111";
WHEN "1001"=>s09<="1110111";
WHEN OTHERS=>s09<="1100011";
END CASE;
CASE d IS
WHEN "0000"=>s08<="1111110";
WHEN "0001"=>s08<="0110000";
WHEN "0010"=>s08<="1101101";
WHEN "0011"=>s08<="1111001";
WHEN "0100"=>s08<="0110011";
WHEN "0101"=>s08<="1011011";
WHEN "0110"=>s08<="1011111";
WHEN "0111"=>s08<="1110000";
WHEN "1000"=>s08<="1111111";
WHEN "1001"=>s08<="1110111";
WHEN OTHERS=>s08<="1100011";
END CASE;
CASE e IS
WHEN "0000"=>s07<="1111110";
WHEN "0001"=>s07<="0110000";
WHEN "0010"=>s07<="1101101";
WHEN "0011"=>s07<="1111001";
WHEN "0100"=>s07<="0110011";
WHEN "0101"=>s07<="1011011";
WHEN "0110"=>s07<="1011111";
WHEN "0111"=>s07<="1110000";
WHEN "1000"=>s07<="1111111";
WHEN "1001"=>s07<="1110111";
WHEN OTHERS=>s07<="1100011";
END CASE;
CASE i IS
WHEN "0000"=>s06<="1111110";
WHEN "0001"=>s06<="0110000";
WHEN "0010"=>s06<="1101101";           
WHEN "0011"=>s06<="1111001";
WHEN "0100"=>s06<="0110011";
WHEN "0101"=>s06<="1011011";
WHEN "0110"=>s06<="1011111";
WHEN "0111"=>s06<="1110000";
WHEN "1000"=>s06<="1111111";
WHEN "1001"=>s06<="1110111";
WHEN OTHERS=>s06<="1100011";
END CASE;
CASE k IS
WHEN "0000"=>s05<="1111110";
WHEN "0001"=>s05<="0110000";
WHEN "0010"=>s05<="1101101";
WHEN "0011"=>s05<="1111001";        
WHEN "0100"=>s05<="0110011";
WHEN "0101"=>s05<="1011011";
WHEN "0110"=>s05<="1011111";
WHEN "0111"=>s05<="1110000";
WHEN "1000"=>s05<="1111111";
WHEN "1001"=>s05<="1110111";
WHEN OTHERS=>s05<="1100011";
END CASE;
CASE l IS
WHEN "0000"=>s04<="1111110";
WHEN "0001"=>s04<="0110000"; 
WHEN "0010"=>s04<="1101101";
WHEN "0011"=>s04<="1111001";
WHEN "0100"=>s04<="0110011";
WHEN "0101"=>s04<="1011011";
WHEN "0110"=>s04<="1011111";
WHEN "0111"=>s04<="1110000";
WHEN "1000"=>s04<="1111111";
WHEN "1001"=>s04<="1110111";
WHEN OTHERS=>s04<="1100011";
END CASE;
CASE n IS
WHEN "0000"=>s03<="1111110";
WHEN "0001"=>s03<="0110000";
WHEN "0010"=>s03<="1101101";
WHEN "0011"=>s03<="1111001";
WHEN "0100"=>s03<="0110011";
WHEN "0101"=>s03<="1011011";
WHEN "0110"=>s03<="1011111";
WHEN "0111"=>s03<="1110000";
WHEN "1000"=>s03<="1111111";
WHEN "1001"=>s03<="1110111";
WHEN OTHERS=>s03<="1100011";
END CASE;
CASE p IS
WHEN "0000"=>s02<="1111110";
WHEN "0001"=>s02<="0110000";
WHEN "0010"=>s02<="1101101";
WHEN "0011"=>s02<="1111001";
WHEN "0100"=>s02<="0110011";
WHEN "0101"=>s02<="1011011";
WHEN "0110"=>s02<="1011111";
WHEN "0111"=>s02<="1110000";
WHEN "1000"=>s02<="1111111";
WHEN "1001"=>s02<="1110111";
WHEN OTHERS=>s02<="1100011";
END CASE;
CASE x IS
WHEN "0000"=>s01<="1111110";
WHEN "0001"=>s01<="0110000"; 
WHEN "0010"=>s01<="1101101";
WHEN "0011"=>s01<="1111001";
WHEN "0100"=>s01<="0110011";
WHEN "0101"=>s01<="1011011";
WHEN "0110"=>s01<="1011111";
WHEN "0111"=>s01<="1110000";
WHEN "1000"=>s01<="1111111";
WHEN "1001"=>s01<="1110111";
WHEN OTHERS=>s01<="1100011";
END CASE;
CASE y IS
WHEN "0000"=>s00<="1111110";
WHEN "0001"=>s00<="0110000";
WHEN "0010"=>s00<="1101101";
WHEN "0011"=>s00<="1111001";
WHEN "0100"=>s00<="0110011";
WHEN "0101"=>s00<="1011011";
WHEN "0110"=>s00<="1011111";
WHEN "0111"=>s00<="1110000";
WHEN "1000"=>s00<="1111111";
WHEN "1001"=>s00<="1110111";
WHEN OTHERS=>s00<="1100011";
END CASE;
END PROCESS;
END rtl;









--------------------------------------------------------------------------------

-- 作者: hwzcjxhl
-- 发布时间: 2005/08/10 06:55pm

6、系统综合模块(delay):
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY delay IS
PORT(clk,i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,ch1,ch2,ch3,ch4:IN STD_LOGIC;
    o:OUT STD_LOGIC;
s11,s10,s09,s08,s07,s06,s05,s04,s03,s02,s01,s00:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);
ab:OUT STD_LOGIC_VECTOR(13 DOWNTO 0));
END delay;
ARCHITECTURE rtl OF delay IS
COMPONENT key IS
PORT(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,ch1,ch2,ch3,ch4:IN STD_LOGIC;
f:OUT STD_LOGIC;
    h,g,j,q,s,u,w,z,v,r,m,t:OUT STD_LOGIC_VECTOR(9 DOWNTO 0));
END COMPONENT;
COMPONENT encoder IS
PORT(f:IN STD_LOGIC;
    h,g,j,q,s,u,w,z,v,r,m,t:IN STD_LOGIC_VECTOR(9 DOWNTO 0);
a,b,c,d,e,i,k,l,n,p,x,y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0));
END COMPONENT;
COMPONENT counter_k IS
PORT(clk:IN STD_LOGIC;
     a,b,c,d,e,i,k,l:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
 o:OUT STD_LOGIC);
END COMPONENT;
COMPONENT bcd_bin IS
PORT(n,p,x,y:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
ab:OUT STD_LOGIC_VECTOR(13 DOWNTO 0));
END COMPONENT;
COMPONENT disp IS
PORT(a,b,c,d,e,i,k,l,n,p,x,y:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
s11,s10,s09,s08,s07,s06,s05,s04,s03,s02,s01,s00:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END COMPONENT;
SIGNAL f:STD_LOGIC;
SIGNAL h,g,j,q,s,u,w,z,v,r,m,t:STD_LOGIC_VECTOR(9 DOWNTO 0);
SIGNAL a,b,c,d,e,i,k,l,n,p,x,y:STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
u1:key
PORT MAP(i0,i1,i2,i3,i4,i5,i6,i7,i8,i9,ch1,ch2,ch3,ch4,
f,h,g,j,q,s,u,w,z,v,r,m,t);
u2: encoder
PORT MAP(f,h,g,j,q,s,u,w,z,v,r,m,t,a,b,c,d,e,i,k,l,n,p,x,y);
u3: counter_k
PORT MAP(clk,a,b,c,d,e,i,k,l,o);
u4: bcd_bin
PORT MAP(n,p,x,y,ab);
u5: disp
PORT MAP(a,b,c,d,e,i,k,l,n,p,x,y,s11,s10,s09,s08,s07,s06,s05,s04,s03,s02,s01,s00);
END rtl;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -