打印

用CPLD做了HC595的芯片,求优化尺寸

[复制链接]
2093|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
用Max3032做了个HC595的串转并来扩充单片机的IO口,只做了8位,用掉24个宏单元,请教如何写才能减少宏单元的使用,这芯片总共就32个宏单位,我还想做成2个HC595级联的方式,估计是不够用了。


源程序VHDL语言如下:

-- Library Clause(s) (optional)
-- Use Clause(s) (optional)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity MC_PLD is
port
(
  -- Input ports
-- <name> : in  <type>;
-- <name> : in  <type> := <default_value>;
  PL2303_DTR : in std_logic;
  PL2303_RTS : in std_logic;
  -- Inout ports
-- <name> : inout <type>;
  -- Output ports
-- <name> : out <type>;
-- <name> : out <type> := <default_value>
  MCU_RES : in std_logic;
  MCU_P014 : in std_logic;
  LED_O1  : out std_logic;
  LED_O2  : out std_logic;
  LED_O3  : out std_logic;
  LED_O4  : out std_logic;
  LED_O5  : out std_logic;
  LED_O6  : out std_logic;
  LED_O7  : out std_logic;
  LED_O8  : out std_logic
);
end MC_PLD;
architecture MC_CTRL_ARCH of MC_PLD is
-- Declarations (optional)
signal HC595_DO1,HC595_DO2,HC595_DO3,HC595_DO4,HC595_DO5 ,HC595_DO6,HC595_DO7,HC595_DO8 :std_logic;
signal HC595_Shift_D0,HC595_Shift_D1,HC595_Shift_D2,HC595_Shift_D3,HC595_Shift_D4,HC595_Shift_D5,HC595_Shift_D6,HC595_Shift_D7 :std_logic;
begin
-- LED_O1 <= PL2303_DTR;
-- LED_O2 <= PL2303_RTS;
-- LED_O1 <= MCU_RES;
-- LED_O2 <= MCU_P014;
-- LED_O3 <= PL2303_DTR;
-- LED_O4 <= PL2303_RTS;

-- LED_O3 <= '1';
-- LED_O4 <= '1';
-- LED_O5 <= '1';
-- LED_O6 <= '1';
-- LED_O7 <= '1';
-- LED_O8 <= '1';
-- LED_O5 <= NOT(MCU_RES);
-- LED_O6 <= not(MCU_P014);
--  LED_O7 <= not(PL2303_DTR);
-- LED_O8 <= not(PL2303_RTS);
process(PL2303_DTR)
  begin
  
  if(PL2303_DTR 'event and pl2303_DTR = '1')then
--  if(MCU_RES 'event and MCU_RES = '1')then
   HC595_Shift_D0 <= PL2303_RTS;
   HC595_Shift_D1 <= HC595_Shift_D0;
   HC595_Shift_D2 <= HC595_Shift_D1;
   HC595_Shift_D3 <= HC595_Shift_D2;
   HC595_Shift_D4 <= HC595_Shift_D3;
   HC595_Shift_D5 <= HC595_Shift_D4;
   HC595_Shift_D6 <= HC595_Shift_D5;
   HC595_Shift_D7 <= HC595_Shift_D6;
   
  end if;
  
end process;

process(MCU_RES)
  begin
  if(MCU_RES 'event and MCU_RES = '1')then
   HC595_DO1 <= HC595_Shift_D0;
   HC595_DO2 <= HC595_Shift_D1;
   HC595_DO3 <= HC595_Shift_D2;
   HC595_DO4 <= HC595_Shift_D3;
   HC595_DO5 <= HC595_Shift_D4;
   HC595_DO6 <= HC595_Shift_D5;
   HC595_DO7 <= HC595_Shift_D6;
   HC595_DO8 <= HC595_Shift_D7;
  
   LED_O1 <= HC595_DO1;
   LED_O2 <= HC595_DO2;
   LED_O3 <= HC595_DO3;
   LED_O4 <= HC595_DO4;
   LED_O5 <= HC595_DO5;
   LED_O6 <= HC595_DO6;
   LED_O7 <= HC595_DO7;
   LED_O8 <= HC595_DO8;
  
  end if;
end process;
-- Process Statement (optional)
-- Concurrent Procedure Call (optional)
-- Concurrent Signal Assignment (optional)
-- Conditional Signal Assignment (optional)
-- Selected Signal Assignment (optional)
-- Component Instantiation Statement (optional)
-- Generate Statement (optional)
end MC_CTRL_ARCH;

相关帖子

沙发
古道热肠|  楼主 | 2012-2-21 23:24 | 只看该作者
如果不做二级锁存,类似HC164的用法,能省不少宏单元,但不可靠。HC164用来驱动发光管问题不大,驱动其它器件就不是太理想了。

使用特权

评论回复
板凳
zhaoyu2005| | 2012-2-23 10:16 | 只看该作者
不级联,直接16位宽咋样?

使用特权

评论回复
地板
古道热肠|  楼主 | 2012-2-23 22:04 | 只看该作者
不用中间信号量,移位的信号值直接送端口,HC595用掉16个宏单元,外加一个HC164,总共实现这两个芯片,用掉了26个宏单元。
结构体部分的代码如下所示

architecture MC_CTRL_ARCH of MC_PLD is

        -- Declarations (optional)
signal HC164_DO1,HC164_DO2,HC164_DO3,HC164_DO4,HC164_DO5 ,HC164_DO6,HC164_DO7,HC164_DO8 :std_logic;
signal HC595_Shift_D0,HC595_Shift_D1,HC595_Shift_D2,HC595_Shift_D3,HC595_Shift_D4,HC595_Shift_D5,HC595_Shift_D6,HC595_Shift_D7 :std_logic;
begin

--        LED_O1 <= PL2303_DTR;
--        LED_O2 <= PL2303_RTS;
--        LED_O1 <= MCU_RES;
--        LED_O2 <= MCU_P014;
--        LED_O3 <= PL2303_DTR;
--        LED_O4 <= PL2303_RTS;       
       
--        LED_O3 <= '1';
--        LED_O4 <= '1';
--        LED_O5 <= '1';
--        LED_O6 <= '1';
--        LED_O7 <= '1';
--        LED_O8 <= '1';
--        LED_O5 <= NOT(MCU_RES);
--        LED_O6 <= not(MCU_P014);
--  LED_O7 <= not(PL2303_DTR);
--        LED_O8 <= not(PL2303_RTS);       

        MCU_RES <= PL2303_DTR;
        MCU_P014 <= PL2303_RTS;       
       
        process(MCU_SCK)
                begin
               
                if(MCU_SCK 'event and MCU_SCK = '1')then
--                if(MCU_RES 'event and MCU_RES = '1')then
                        HC595_Shift_D0 <= MCU_MISO;
                        HC595_Shift_D1 <= HC595_Shift_D0;
                        HC595_Shift_D2 <= HC595_Shift_D1;
                        HC595_Shift_D3 <= HC595_Shift_D2;
                        HC595_Shift_D4 <= HC595_Shift_D3;
                        HC595_Shift_D5 <= HC595_Shift_D4;
                        HC595_Shift_D6 <= HC595_Shift_D5;
                        HC595_Shift_D7 <= HC595_Shift_D6;
                       
                end if;
               
        end process;

        process(MCU_MOSI)
                begin
                        if(MCU_MOSI 'event and MCU_MOSI = '1') then
--                                HC164_DO1 <= MCU_MISO;
--                                HC164_DO2 <= HC164_DO1;
--                                HC164_DO3 <= HC164_DO2;
--                                HC164_DO4 <= HC164_DO3;
--                                HC164_DO5 <= HC164_DO4;
--                                HC164_DO6 <= HC164_DO5;
--                                HC164_DO7 <= HC164_DO6;
--                                HC164_DO8 <= HC164_DO7;
                               
--                                LED_O1 <= HC164_DO1;
--                                LED_O2 <= HC164_DO2;
--                                LED_O3 <= HC164_DO3;
--                                LED_O4 <= HC164_DO4;
--                                LED_O5 <= HC164_DO5;
--                                LED_O6 <= HC164_DO6;
--                                LED_O7 <= HC164_DO7;
--                                LED_O8 <= HC164_DO8;

                                LED_O1 <= MCU_MISO;
                                LED_O2 <= LED_O1;
                                LED_O3 <= LED_O2;
                                LED_O4 <= LED_O3;
                                LED_O5 <= LED_O4;
                                LED_O6 <= LED_O5;
                                LED_O7 <= LED_O6;
                                LED_O8 <= LED_O7;
                               
                        end if;
        end process;
        process(MCU_SEL)
                begin
                if(MCU_SEL 'event and MCU_SEL = '1')then

--                        LED_O1 <= HC595_Shift_D0;
--                        LED_O2 <= HC595_Shift_D1;
--                        LED_O3 <= HC595_Shift_D2;
--                        LED_O4 <= HC595_Shift_D3;
--                        LED_O5 <= HC595_Shift_D4;
--                        LED_O6 <= HC595_Shift_D5;
--                        LED_O7 <= HC595_Shift_D6;
--                        LED_O8 <= HC595_Shift_D7;
                        DC_PTB0 <= HC595_Shift_D0;
                        DC_PTB1 <= HC595_Shift_D1;
                        DC_PTB2 <= HC595_Shift_D2;
                        DC_PTB3 <= HC595_Shift_D3;
                        DC_PTB4 <= HC595_Shift_D4;
                        DC_PTB5 <= HC595_Shift_D5;
                        DC_PTB6 <= HC595_Shift_D6;
                        DC_PTB7 <= HC595_Shift_D7;
               
--                        LED_O1 <= HC595_DO1;
--                        LED_O2 <= HC595_DO2;
--                        LED_O3 <= HC595_DO3;
--                        LED_O4 <= HC595_DO4;
--                    LED_O5 <= HC595_DO5;
--                        LED_O6 <= HC595_DO6;
--                        LED_O7 <= HC595_DO7;
--                        LED_O8 <= HC595_DO8;
               
                end if;
        end process;
        -- Process Statement (optional)

        -- Concurrent Procedure Call (optional)

        -- Concurrent Signal Assignment (optional)

        -- Conditional Signal Assignment (optional)

        -- Selected Signal Assignment (optional)

        -- Component Instantiation Statement (optional)

        -- Generate Statement (optional)

end MC_CTRL_ARCH;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以VS1003B和山景SOC芯片为背景,倾心研制数字化语音录放产品. 排忧邮箱:xg_2004_sy@126.com 得意之作是做了个AVR高压编程器,用起来爽歪歪, 串口MP3录放音模块,全面进入数字录放音时代

284

主题

6411

帖子

16

粉丝