?? anjian.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 + -