登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

菜鸟学VHD,请高手指点,下面的程序能精简吗

作者:9992000 栏目:EDA技术
菜鸟学VHD,请高手指点,下面的程序能精简吗
这是一个双16位计数器(二个输入时钟,二个门控,),再用二根选择线分4次读出数据,程序编译了一下,发现很占用资源(我用的是EPM3604),高手们看看能精简吗?谢谢了
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;

ENTITY DubleCnt16 IS
PORT(
    clk1,CLK2,GATE1,GATE2,CLR,RD,CS : IN Std_logic;
    DS : in std_logic_vector(1 downto 0);
    McuDataBus: out std_logic_vector(7 downto 0)
    );
END DubleCnt16;

ARCHITECTURE using_std_logic OF DubleCnt16 IS

SIGNAL    COUNT1,COUNT2 : Std_logic_vector(15 DOWNTO 0);

BEGIN
       PROCESS(CLR,CLK1,GATE1,CLK2,GATE2)
       BEGIN
         IF CLR = '1' THEN
               COUNT1 <= (OTHERS => '0');
          ELSIF falling_edge(clk1) AND GATE1= '1' then
--            IF COUNT1 < "1111111111111111" then
                 COUNT1 <= COUNT1 +1;
--             end if;
        END IF;
         IF CLR = '1' THEN
               COUNT2 <= (OTHERS => '0');
        ELSIF falling_edge(clk2) AND GATE2= '1' then
--            IF COUNT2 < "1111111111111111" then
                 COUNT2 <= COUNT2 +1;
--             end if;
          END IF;
       END PROCESS;

    PROCESS (COUNT1,COUNT2,DS)
    begin
    IF RD = '0' AND CS = '0' THEN
          IF DS = "00" THEN
              McuDataBus <= COUNT1(7 DOWNTO 0);
          ELSIF DS = "01" THEN
            McuDataBus <= COUNT1(15 DOWNTO 8);
          ELSIF DS = "10" THEN
            McuDataBus <= COUNT2(7 DOWNTO 0);
          ELSIF DS = "11" THEN
               McuDataBus <= COUNT2(15 DOWNTO 8);
        END IF;
    ELSE
        McuDataBus <= (OTHERS => 'Z');
    END IF;    
    END PROCESS;

END using_std_logic;


2楼: >>参与讨论
hjyhjony
换换
用case语句代替if语句看看


3楼: >>参与讨论
xianlin886
同意楼上的,那样既简捷又清晰
 
4楼: >>参与讨论
cnjiantian
re.
 

* - 本贴最后修改时间:2006-11-24 16:31:37 修改者:cnjiantian

5楼: >>参与讨论
刘时丰
RE
同道中!

可以先判断门控或先检测时钟,不要在每一个CLK下和GATE进行一个AND 运算

6楼: >>参与讨论
刘时丰
RE
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;

ENTITY count IS
PORT(
     CLK1,CLK2  : IN  Std_logic;
     GATE1,GATE2: IN  Std_logic;
     CLR,RD,CS  : IN  Std_logic;
     DS         : IN  std_logic_vector(1 downto 0);
     DATABUS    : OUT std_logic_vector(7 downto 0)
     );
END count;

ARCHITECTURE art OF count IS

SIGNAL COUNT1,COUNT2 : Std_logic_vector(15 DOWNTO 0);

BEGIN

PROCESS(CLR,CLK1,GATE1,CLK2,GATE2)
   BEGIN
   IF falling_edge(clk1) THEN  
      IF CLR ='1' THEN
         COUNT1 <= "0000000000000000";
      ELSIF GATE1='1' THEN
            COUNT1 <= COUNT1+'1';
         IF COUNT1 = "1111111111111111" THEN
            COUNT1<="0000000000000000";
         END IF;
      END IF;
   END IF;
END PROCESS;

PROCESS(CLK2,CLR,GATE2)
BEGIN
   IF falling_edge(clk2) then
      IF CLR ='1' THEN
         COUNT2 <= "0000000000000000";
      ELSIF GATE2='1' then
            COUNT2<=COUNT2+'1';
         IF COUNT2="1111111111111111" then
            COUNT2<="0000000000000000";
         END IF;
      END IF;
   END IF;
END PROCESS;

PROCESS (COUNT1,COUNT2,rd,DS,cs)
BEGIN
   IF RD = '0' AND CS = '0' THEN
      CASE DS  is
      when "00" =>DATABUS <= COUNT1(7 DOWNTO 0);
      when "01" =>DATABUS <= COUNT1(15 DOWNTO 8);
      when "10"=>DATABUS <= COUNT2(7 DOWNTO 0);
      when "11"=> DATABUS <= COUNT2(15 DOWNTO 8);
      when others=>DATABUS <="ZZZZZZZZ";
      END CASE;
   ELSE
        DATABUS <="ZZZZZZZZ";
   END IF;
END PROCESS;

END art;


已经在QUARTUS 6.0中编译通过,采用MAX3000 EPM3064ATC44-10占用41个MACRO SELL,总共64个MACRO SELL

7楼: >>参与讨论
9992000
还是没有精简呀
我原先的程序编译通过,也是用41个MACRO SELL,

8楼: >>参与讨论
9992000
你的程序可读性比我的强多了,认真学习
 
9楼: >>参与讨论
carl.lee
顶一个6楼的同志
从代码的可读性可讲,对一个信号的处理一般采用一个独立的进程,而且不容易出错。另一方面,使用CASE语句比IF-ELSE语句执行效率要高。

10楼: >>参与讨论
huqianqian
8 楼
  我水平不足请多多关照啊             6楼 的 第二个进程试试用if 语句呢?

11楼: >>参与讨论
epeda
精简程序应从程序要实现的功能着手
  将if语句换为case语句,致使提高了程序的可读性,精简其实根本谈不上,如果将其功能分解,然后例化,可以达到精简。 

12楼: >>参与讨论
9992000
顶楼上的大哥
11楼: 精简程序应从程序要实现的功能着手

  将if语句换为case语句,致使提高了程序的可读性,精简其实根本谈不上,如果将其功能分解,然后例化,可以达到精简。

能否就我现在这个程序如何将其功能分解,例化,谢谢








参与讨论
昵称:
讨论内容:
 
 
相关帖子
夜深人静的时候,是看图片的时候
VHDL综合的问题,请大虾帮忙~
Altera的EP1K30QC208-1中的各部分代表什么呀
状态机——内存控制器设计
请问谁有基于FPGA的DDS的源程序呀
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号