⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 question.txt

📁 以CPLD器件EPM7128SLC84-15为核心实现的简易数字频率计
💻 TXT
字号:
一个关于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)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -