我想实现图那样的时序,就是在IN_CPLDCS信号低电平的时候,检测32个输入信号IN_INSIGNAL[31..0],如果输入信号出现过1就保存下来。在IN_CPLDCS信号高电平时,分组把32个信号读出数据8位端口。具体就是IN_CPLDCS信号高电平时,当IN_RD第一个高电平时输出IN_INSIGNAL[31..0]中的高8位;当IN_RD第二个高电平时输出IN_INSIGNAL[31..0]中的另外8位,如此类推。 IN_RD的4个高电平后就读完了。<br />我用VHDL语言使用状态机的方法,来做,但是综合后,竟然用了300多个宏单元!!<br />我想这样的功能应该不用这么多把?是不是我写得程序不好?请大家指教!<br />程序如下:<br />LIBRARY ieee;<br />USE ieee.std_logic_1164.ALL;<br />USE ieee.std_logic_unsigned.ALL;<br />USE ieee.std_logic_arith.ALL;<br /><br /><br />ENTITY dslammain IS<br /> PORT(<br /> IN_CPLDCS, IN_RD: IN STD_LOGIC;<br /> IN_SIGNAL: IN STD_LOGIC_VECTOR(31 downto 0);<br /> IN_GCLK: IN STD_LOGIC;<br /> OUT_DATA : OUT STD_LOGIC_VECTOR(7 downto 0);<br /> );<br /><br />END dslammain ;<br /><br /><br />ARCHITECTURE behav OF dslammain IS<br /><br /> TYPE STATE IS (WAITTING,TSTSIGNAL,DATAOUT);<br /> SIGNAL CURR_STATE: STATE;<br /> SIGNAL REG_DATA: STD_LOGIC_VECTOR(31 downto 0); <br /><br />BEGIN<br /><br /><br /> -- Process Statement<br /> testsignal:<br /> PROCESS (IN_GCLK)<br /> VARIABLE cnt4rd: integer range 5 downto 0;<br /><br /> VARIABLE rd_start: bit;<br /><br /><br /> BEGIN<br /><br /> IF RISING_EDGE(IN_GCLK) THEN<br /><br /> CASE CURR_STATE IS<br /> WHEN WAITTING=><br /> REG_DATA<="00000000000000000000000000000000";<br /> IF IN_CPLDCS='0' THEN <br /> CURR_STATE<=TSTSIGNAL;<br /> END IF;<br /> <br /> WHEN TSTSIGNAL=><br /> FOR i IN 31 DOWNTO 0 LOOP<br /> IF(IN_SIGNAL(i)='1') THEN<br /> REG_DATA(i)<='1';<br /> --REG_DATA(i):='1';<br /> END IF;<br /> END LOOP;<br /> IF IN_CPLDCS='1' THEN<br /> CURR_STATE<=DATAOUT;<br /> END IF;<br /><br /> WHEN DATAOUT=><br /> IF(IN_RD='1') THEN<br /> rd_start:='1';<br /><br /> ELSIF(IN_RD='0' AND rd_start='1') THEN<br /> cnt4rd:=cnt4rd+1;<br /> rd_start:='0';<br /> END IF;<br /><br /> IF(rd_start='1')THEN<br /> IF(cnt4rd=0)THEN<br /> OUT_DATA(7)<=REG_DATA(31);<br /> OUT_DATA(6)<=REG_DATA(30);<br /> OUT_DATA(5)<=REG_DATA(29);<br /> OUT_DATA(4)<=REG_DATA(28);<br /> OUT_DATA(3)<=REG_DATA(27);<br /> OUT_DATA(2)<=REG_DATA(26);<br /> OUT_DATA(1)<=REG_DATA(25);<br /> OUT_DATA(0)<=REG_DATA(24);<br /><br /> ELSIF(cnt4rd=1)THEN<br /> OUT_DATA(7)<=REG_DATA(23);<br /> OUT_DATA(6)<=REG_DATA(22);<br /> OUT_DATA(5)<=REG_DATA(21);<br /> OUT_DATA(4)<=REG_DATA(20);<br /> OUT_DATA(3)<=REG_DATA(19);<br /> OUT_DATA(2)<=REG_DATA(18);<br /> OUT_DATA(1)<=REG_DATA(17);<br /> OUT_DATA(0)<=REG_DATA(16);<br /><br /> ELSIF(cnt4rd=2)THEN<br /> OUT_DATA(7)<=REG_DATA(15);<br /> OUT_DATA(6)<=REG_DATA(14);<br /> OUT_DATA(5)<=REG_DATA(13);<br /> OUT_DATA(4)<=REG_DATA(12);<br /> OUT_DATA(3)<=REG_DATA(11);<br /> OUT_DATA(2)<=REG_DATA(10);<br /> OUT_DATA(1)<=REG_DATA(9);<br /> OUT_DATA(0)<=REG_DATA(8);<br /><br /> ELSIF(cnt4rd=3)THEN<br /> OUT_DATA(7)<=REG_DATA(7);<br /> OUT_DATA(6)<=REG_DATA(6);<br /> OUT_DATA(5)<=REG_DATA(5);<br /> OUT_DATA(4)<=REG_DATA(4);<br /> OUT_DATA(3)<=REG_DATA(3);<br /> OUT_DATA(2)<=REG_DATA(2);<br /> OUT_DATA(1)<=REG_DATA(1);<br /> OUT_DATA(0)<=REG_DATA(0);<br /> END IF;<br /><br /> END IF;<br /> <br /> <br /> IF (cnt4rd=4) THEN<br /> CURR_STATE<=WAITTING;<br /> END IF;<br /><br /><br /> WHEN OTHERS =><br /> NULL;<br /> END CASE;<br /> END IF;<br /> <br /> END PROCESS testsignal;<br />END behav; |
|