返回信息流☆─────────────────────────────────────☆
erabbit (兔子) 于 (Tue Dec 4 08:47:58 2007) 提到:
一个关于VHDL中数据类型的问题:
一个选择译码模块,时钟驱动一个模六计数器(POS),
NUM1~NUM6为六个四位输入矢量:STD_LOGIC_VECTOR(3 downto 0),取值范围是0~9,
根据POS的值从NUM1~NUM6中选择一个译码为DIGSGN,
主要代码如下:
----------------------------------------------------------
WITH POS SELECT--选择要译码的输入信号
DGT<=To_Integer(NUM1) WHEN 0,
To_Integer(NUM2) WHEN 1,
To_Integer(NUM3) WHEN 2,
To_Integer(NUM4) WHEN 3,
To_Integer(NUM5) WHEN 4,
To_Integer(NUM6) WHEN 5;
with DGT select--将Interger型译为七段数码管显示信号
DIGSGN<="11111100" when 0,
"01100000" when 1,
"11011010" when 2,
"11110010" when 3,
"01100110" when 4,
"10110110" when 5,
"10111110" when 6,
"11100000" when 7,
"11111110" when 8,
"11110110" when 9,
"00000000" when others;
----------------------------------------------------------
其中,DGT定义为Integer range 0 to 9型的信号,To_Integer()是自己写的类型转换函数,将STD_LOGIC_VECTOR(3 downto 0)转换为Integer,代码如下:
----------------------------------------------------------
FUNCTION To_Integer(x:STD_LOGIC_VECTOR(3 downto 0)) RETURN integer IS
BEGIN
case x is
when "0000" => return 0;
when "0001" => return 1;
when "0010" => return 2;
when "0011" => return 3;
when "0100" => return 4;
when "0101" => return 5;
when "0110" => return 6;
when "0111" => return 7;
when "1000" => return 8;
when "1001" => return 9;
when others => return 15;
end case;
END To_Integer;
----------------------------------------------------------
为了省去类型转换步骤,将DGT定义为同NUM1~NUM6一致的STD_LOGIC_VECTOR(3 downto 0),这样不再需要ToInteger函数,主要代码如下:
----------------------------------------------------------
WITH POS SELECT--选择要显示的数位
DGT<=NUM1 WHEN 0,
NUM2 WHEN 1,
NUM3 WHEN 2,
NUM4 WHEN 3,
NUM5 WHEN 4,
NUM6 WHEN 5;
with DGT select--七段显示信号
DIGSGN<="11111100" when "0000",
"01100000" when "0001",
"11011010" when "0010",
"11110010" when "0011",
"01100110" when "0100",
"10110110" when "0101",
"10111110" when "0110",
"11100000" when "0111",
"11111110" when "1000",
"11110110" when "1001",
"00000000" when others;
----------------------------------------------------------
本以为改进后会节省资源,但编译后发现,后一种方案需要52个宏单元,而前一种方案仅需要35个,为什么会这样呢?
(Quartus 4.1, 器件为MAX7000S EPM7128SLC84-15)
☆─────────────────────────────────────☆
chungliang (teddy) 于 (Tue Dec 4 13:10:28 2007) 提到:
这恐怕需要把程序综合一下,看看rtl或gate级信息。。。
一般来讲,硬件程序里面的函数不像软件开销一样,如果你在编程的同时考虑这是如何硬件实现的,就能估计开销大致是多少了
【 在 erabbit (兔子) 的大作中提到: 】
: 一个关于VHDL中数据类型的问题:
: 一个选择译码模块,时钟驱动一个模六计数器(POS),
: NUM1~NUM6为六个四位输入矢量:STD_LOGIC_VECTOR(3 downto 0),取值范围是0~9,
: ...................
☆─────────────────────────────────────☆
kidd (阿甘) 于 (Tue Dec 4 20:24:50 2007) 提到:
上面那段程序里面,toInteger综合出来其实就是一块电路block,因为你把它设置成function了,然后被重复利用,而后面那段程序里面,你得有并行的很多块电路,自然用的单元就多了。
这是一条镜像帖。来源:北邮人论坛 / circuit / #2819同步于 2007/12/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
[合集] 一个关于VHDL中数据类型的问题
pooh1949
2007/12/12镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。