|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
菜鸟学VHD,请高手指点,下面的程序能精简吗 |
作者:9992000 栏目:EDA技术 |
这是一个双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 于 2006/11/19 11:02:00 发布:
换换 用case语句代替if语句看看 |
3楼: | >>参与讨论 |
作者: xianlin886 于 2006/11/20 17:52:00 发布:
同意楼上的,那样既简捷又清晰 |
4楼: | >>参与讨论 |
作者: cnjiantian 于 2006/11/23 15:23:00 发布:
re. * - 本贴最后修改时间:2006-11-24 16:31:37 修改者:cnjiantian |
5楼: | >>参与讨论 |
作者: 刘时丰 于 2006/11/24 22:18:00 发布:
RE 同道中! 可以先判断门控或先检测时钟,不要在每一个CLK下和GATE进行一个AND 运算 |
6楼: | >>参与讨论 |
作者: 刘时丰 于 2006/11/24 23:36:00 发布:
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 于 2006/11/29 13:38:00 发布:
还是没有精简呀 我原先的程序编译通过,也是用41个MACRO SELL, |
8楼: | >>参与讨论 |
作者: 9992000 于 2006/11/29 14:18:00 发布:
你的程序可读性比我的强多了,认真学习 |
9楼: | >>参与讨论 |
作者: carl.lee 于 2006/11/29 22:49:00 发布:
顶一个6楼的同志 从代码的可读性可讲,对一个信号的处理一般采用一个独立的进程,而且不容易出错。另一方面,使用CASE语句比IF-ELSE语句执行效率要高。 |
10楼: | >>参与讨论 |
作者: huqianqian 于 2006/12/2 19:36:00 发布:
8 楼 我水平不足请多多关照啊 6楼 的 第二个进程试试用if 语句呢? |
11楼: | >>参与讨论 |
作者: epeda 于 2006/12/2 21:05:00 发布:
精简程序应从程序要实现的功能着手 将if语句换为case语句,致使提高了程序的可读性,精简其实根本谈不上,如果将其功能分解,然后例化,可以达到精简。 |
12楼: | >>参与讨论 |
作者: 9992000 于 2006/12/7 19:24:00 发布:
顶楼上的大哥 11楼: 精简程序应从程序要实现的功能着手 将if语句换为case语句,致使提高了程序的可读性,精简其实根本谈不上,如果将其功能分解,然后例化,可以达到精简。 能否就我现在这个程序如何将其功能分解,例化,谢谢 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |