打印

在CPLD上定义了输入输出口为总线数据线问题

[复制链接]
1509|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenzhi658|  楼主 | 2013-2-22 11:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
entity ad_pwm is
    Port (
                        FPGA_CLK : in  STD_LOGIC;
           RESET : in  STD_LOGIC;
           CS_MFC : in  STD_LOGIC;
           RD : in  STD_LOGIC;
           WR : in  STD_LOGIC;
                          A1_5 : in  STD_LOGIC_VECTOR (5 downto 1);
           D0_15 : inout  STD_LOGIC_VECTOR (15 downto 0);
                        ------------
                                ads7862_for_clk: out std_logic;
                                  ADC_CONV: out std_logic ;
                                ADC_CS: out std_logic ;
                                ADC_RD: out std_logic ;
                                ADC_A0: out std_logic ;
                                ADC_DATA: in std_logic_vector(11 downto 0);
                        ------------
                                dir: out std_logic;
                                ah: out std_logic;
                                al: out std_logic;
                                bh: out std_logic;
                                bl: out std_logic;
                                ch: out std_logic;
                                cl: out std_logic
                          );
end ad_pwm;
-----INTERFACE-------
        A1_5_TEMP<=A1_5 & '0';
        PROCESS(FPGA_CLK,RESET,CS_MFC)
        BEGIN
                IF RESET='0' THEN
        --                D0_15_TEMP<=(OTHERS=>'0');
                        ADC_START<='1';
                ELSIF RISING_EDGE(FPGA_CLK) THEN
                        IF CS_MFC='0' THEN
                                IF RD='0' AND WR='1' THEN
                                        CASE A1_5_TEMP IS
                                                WHEN "001000" => D0_15(11 DOWNTO 0)<=ADC_CHA0_DATA;
                                                WHEN "001010" => D0_15(11 DOWNTO 0)<=ADC_CHA1_DATA;
                                                WHEN "001100" => D0_15(11 DOWNTO 0)<=ADC_CHB0_DATA;
                                                WHEN "001110" => D0_15(11 DOWNTO 0)<=ADC_CHB1_DATA;
                                                WHEN OTHERS => null;
                                        END CASE;
                                ELSIF RD='1' AND WR='0' THEN
                                        CASE A1_5_TEMP IS
                                                WHEN "100000" => DEAD_DATA<=D0_15(7 downto 0);
                                                WHEN "100010" => PW_CH0_DATA<=D0_15;
                                                WHEN "100100" => PW_CH1_DATA<=D0_15;
                                                WHEN "100110" => PW_CH2_DATA<=D0_15;
                                                WHEN "101000" => PT_DATA<=D0_15;
                                                WHEN OTHERS => null;
                                        END CASE;
                                END IF;
                        END IF;
                END IF;


观察RTL,发现D0_15(11 downtown 0)只为输出口,D0_15(15 DOWNTO 12)只为输入口。怎么不是定义的INOUT功能呢?困惑死了?在FPGA上也试过了

相关帖子

沙发
chenzhi658|  楼主 | 2013-2-22 12:14 | 只看该作者

使用特权

评论回复
板凳
chenzhi658|  楼主 | 2013-2-22 14:54 | 只看该作者
-----INTERFACE-------
        A1_5_TEMP<=A1_5 & '0';
        PROCESS(FPGA_CLK,RESET,CS_MFC,RD)
        BEGIN
                IF RESET='0' THEN
                        ADC_START<='1';
                        D0_15<= (others => 'Z');
                ELSIF RISING_EDGE(FPGA_CLK) THEN
                        IF CS_MFC='0' AND RD='0' THEN
                                        CASE A1_5_TEMP IS
                                                WHEN "001000" => D0_15<="ZZZZ" & ADC_CHA0_DATA;
                                                WHEN "001010" => D0_15<="ZZZZ" & ADC_CHA1_DATA;
                                                WHEN "001100" => D0_15<="ZZZZ" & ADC_CHB0_DATA;
                                                WHEN "001110" => D0_15<="ZZZZ" & ADC_CHB1_DATA;
                                                WHEN OTHERS => NULL;
                                        END CASE;
                        else
                                        D0_15<= (others => 'Z');
                        end if;
                else
                        D0_15<= (others => 'Z');
                end if;
        END PROCESS;
        PROCESS(FPGA_CLK,RESET,CS_MFC,WR)
        BEGIN
                IF RESET='0' THEN
                        DEAD_DATA<= (OTHERS => '1');
                        PW_CH0_DATA<=(OTHERS => '0');
                        PW_CH1_DATA<=(OTHERS => '0');
                        PW_CH2_DATA<=(OTHERS => '0');
                        PT_DATA<="0011101010100010";
                ELSIF RISING_EDGE(FPGA_CLK) THEN
                        IF CS_MFC='0' THEN       
                                IF WR'EVENT AND WR='0' THEN
                                        CASE A1_5_TEMP IS
                                                WHEN "100000" => DEAD_DATA<=D0_15(7 downto 0);
                                                WHEN "100010" => PW_CH0_DATA<=D0_15;
                                                WHEN "100100" => PW_CH1_DATA<=D0_15;
                                                WHEN "100110" => PW_CH2_DATA<=D0_15;
                                                WHEN "101000" => PT_DATA<=D0_15;
                                                WHEN OTHERS => null;
                                        END CASE;
                                END IF;
                        END IF;
                END IF;
        END PROCESS;

使用特权

评论回复
地板
chenzhi658|  楼主 | 2013-2-22 14:54 | 只看该作者
还是有问题,查看RTL,请大虾帮帮忙

使用特权

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

本版积分规则

29

主题

247

帖子

1

粉丝