首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

谁能帮我修改下程序!谢谢.我都弄的郁闷死了.

谁能帮我修改下程序!谢谢.我都弄的郁闷死了.

我是用VHDL设计一个数字电压表,是0.1-5V的模拟电压转换为相应的数字量,然后通过进制转换在数码管上进行显示。我在BCD码转换的那一段出错了!我的邮箱是jgq888@163.com.程序如下: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY Ch9_2_3 is PORT( Din: IN STD_LOGIC_VECTOR(7 Downto 0); Dout: OUT STD_LOGIC_VECTOR(3 Downto 0); SELOUT: OUT STD_LOGIC_VECTOR(2 Downto 0); SEGOUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); CP: IN STD_LOGIC; RST :IN STD_LOGIC; nCS,nWR,nRD:OUT STD_LOGIC; nINTR :IN STD_LOGIC ); END Ch9_2_3; ARCHITECTURE a OF Ch9_2_3 IS TYPE STATE_TYPE IS (S0,S1,S2,S3); SIGNAL State :STATE_TYPE; SIGNAL EC,nIN :STD_LOGIC; SIGNAL D : STD_LOGIC_VECTOR(7 Downto 0); SIGNAL Value : STD_LOGIC_VECTOR(11 Downto 0); SIGNAL NUM :STD_LOGIC_VECTOR(3 Downto 0); SIGNAL SEG :STD_LOGIC_VECTOR(6 Downto 0); SIGNAL SEL: STD_LOGIC_VECTOR(2 Downto 0); SIGNAL ST: STD_LOGIC_VECTOR(1 Downto 0); BEGIN SystemConnection:Block Begin nIN<=nINTR; SEGOUT(6 DOWNTO 0)<=SEG; SEGOUT(7)<= '1' WHEN ST=2 Else '0' ; Dout<=NUM; End Block SystemConnection; StateChange:Block Begin PROCESS(CP,RST) BEGIN IF RST= '1' Then nCS<= '1'; nWR<= '1' ; nRD<= '1'; EC<= '0'; State<=S0; ElsIF CP'Event And CP= '1' Then CASE State IS WHEN S0 => nCS<= '0'; nWR<= '0' ; nRD<= '1'; Ec<= '0'; State<=S1; WHEN S1=> nCS<= '1' ; nWR<= '1' ; nRD<= '1' ; EC<= '0' ; If nIN= '0' Then State<=S2; END If; WHEN S2=> nCS<= '0'; nWR<= '1' ; nRD<= '0'; EC<= '1'; State<=S3; WHEN S3=> nCS<= '1'; nWR<= '1' ; nRD<= '1'; EC<= '0'; State<=S0; WHEN OTHERS=> State<=S0; END CASE; END IF; END PROCESS; END Block StateChange; ReadData:Block Begin PROCESS(CP) BEGIN IF CP'Event AND CP= '1' THEN IF EC= '1'THEN D<=Din; END IF; end if; END PROCESS; END Block ReadData; Conversion:Block SIGNAL V: STD_LOGIC_VECTOR(7 Downto 0); SIGNAL HB, LB: STD_LOGIC_VECTOR(11 Downto 0); SIGNAL C30, C74, C118: STD_LOGIC; BEGIN V<=D; HB<= "010010000000" When V(7 downto 4)="1111" Else --4.80 "010001001000" When V(7 downto 4)="1110" Else --4.48 "010000010110" When V(7 downto 4)="1101" Else --4.16 "001110000100" When V(7 downto 4)="1100" Else --3.84 "001101010010" When V(7 downto 4)="1011" Else --3.52 "001100100000" When V(7 downto 4)="1010" Else --3.20 "001010001000" When V(7 downto 4)="1001" Else --2.88 "001001010110" When V(7 downto 4)="1000" Else --2.56 "001000100100" When V(7 downto 4)="0111" Else --2.24 "000110010010" When V(7 downto 4)="0110" Else --1.92 "000101100000" When V(7 downto 4)="0101" Else --1.60 "000100101000" When V(7 downto 4)="0100" Else --1.28 "000010010110" When V(7 downto 4)="0011" Else --0.96 "000001100100" When V(7 downto 4)="0010" Else --0.64 "000000110010" When V(7 downto 4)="0001" Else --0.32 "000000000000" ; --0.00 ---(2)For A/D Conversion Data Low Byte LB<= "000000110000" When V(3 downto 0)="1111" Else --0.30 "000000101000" When V(3 downto 0)="1110" Else --0.28 "000000100110" When V(3 downto 0)="1101" Else --0.26 "000000100100" When V(3 downto 0)="1100" Else --0.24 "000000100010" When V(3 downto 0)="1011" Else --0.22 "000000100000" When V(3 downto 0)="1010" Else --0.20 "000000011000" When V(3 downto 0)="1001" Else --0.18 "000000010110" When V(3 downto 0)="1000" Else --0.16 "000000010100" When V(3 downto 0)="0111" Else --0.14 "000000010010" When V(3 downto 0)="0110" Else --0.12 "000000010000" When V(3 downto 0)="0101" Else --0.10 "000000001000" When V(3 downto 0)="0100" Else --0.08 "000000000110" When V(3 downto 0)="0011" Else --0.06 "000000000100" When V(3 downto 0)="0010" Else --0.04 "000000000010" When V(3 downto 0)="0001" Else --0.02 "000000000000" ; C30<= '1'WHEN HB(3 DOWNTO 0)+ LB(3 DOWNTO 0)> "1001" Else '0'; C74<= '1' WHEN HB(7 DOWNTO 4)+ LB(7 DOWNTO 4)> "1001"Else '0'; C118<= '1' WHEN HB(11 DOWNTO 8)+ LB(11 DOWNTO 8)> "1001" Else '0'; Value(3 DOWNTO 0)<=HB(3 DOWNTO 0)+ LB(3 DOWNTO 0)+ "0110" WHEN C30= '1' Else HB(3 DOWNTO 0)+LB(3 DOWNTO 0); Value(7 DOWNTO 4)<=HB(7 DOWNTO 4)+LB(7 DOWNTO 4)+ "0111" WHEN C74= '1'AND C30= '1' Else HB(7 DOWNTO 4)+ LB(7 DOWNTO 4)+ "0110" WHEN C74= '1' AND C30= '0' Else HB(7 DOWNTO 4)+ LB(7 DOWNTO 4)+ "0001" WHEN C74= '0' AND C30= '1' Else HB(7 DOWNTO 4)+ LB(7 DOWNTO 4); Value(11 DOWNTO 8)<=HB(11 DOWNTO 8)+ LB(11 DOWNTO 8)+ "0111" WHEN C118= '1' AND C74= '1' Else HB(11 DOWNTO 8)+ LB(11 DOWNTO 8)+ "0110" WHEN C118= '1' AND C74= '0' Else HB(11 DOWNTO 8)+ LB(11 DOWNTO 8)+ "0001" WHEN C118= '0' AND C74= '1' Else HB(11 DOWNTO 8)+ LB(11 DOWNTO 8); END Block Conversion; Free_Counter: Block SIGNAL Q :STD_LOGIC_VECTOR(15 DOWNTO 0); BEGIN PROCESS(CP) BEGIN IF CP'Event AND CP= '1' then Q<= Q+1; END IF; END PROCESS; ST<=Q(15 DOWNTO 14); SELOUT<="010" WHEN ST=0 ELSE "001" WHEN ST=1 ELSE "000" WHEN ST=2 ELSE "111"; SEL<= "110" WHEN ST=0 ELSE "101" WHEN ST=1 ELSE "011" WHEN ST=2 ELSE "111"; END Block Free_Counter; SELECT_BCD: Block BEGIN NUM<= Value(3 DOWNTO 0) WHEN ST=0 ELSE Value(7 DOWNTO 4) WHEN ST=1 ELSE Value(11 DOWNTO 8); END Block SELECT_BCD; SEVEN_SEGMENT: Block BEGIN SEG<= "0111111" WHEN NUM=0 ELSE "0000110" WHEN NUM=1 ELSE "1011011" WHEN NUM=2 ELSE "1001111" WHEN NUM=3 ELSE "1100110" WHEN NUM=4 ELSE "1101101" WHEN NUM=5 ELSE "1111101" WHEN NUM=6 ELSE "0000111" WHEN NUM=7 ELSE "1111111" WHEN NUM=8 ELSE "1101111" WHEN NUM=9 ELSE "1110111" WHEN NUM=10 ELSE "1111100" WHEN NUM=11 ELSE "0111001" WHEN NUM=12 ELSE "1011110" WHEN NUM=13 ELSE "1111001" WHEN NUM=14 ELSE "1110001" WHEN NUM=15 ELSE "0000000"; END Block SEVEN_SEGMENT; END a;
返回列表