【发布时间】:2014-04-25 14:03:09
【问题描述】:
我对 VHDL 和硬件设计非常陌生,想知道是否有人可以告诉我我对遇到的以下问题的理解是否正确。
我一直在为 Nexys4 板开发一个简单的 BCD-to-7 段显示驱动程序——这是我的 VHDL 代码(去掉了标题)。
entity BCDTo7SegDriver is
Port ( CLK : in STD_LOGIC;
VAL : in STD_LOGIC_VECTOR (31 downto 0);
ANODE : out STD_LOGIC_VECTOR (7 downto 0);
SEGMENT : out STD_LOGIC_VECTOR (6 downto 0));
function BCD_TO_DEC7(bcd : std_logic_vector(3 downto 0))
return std_logic_vector is
begin
case bcd is
when "0000" => return "1000000";
when "0001" => return "1111001";
when "0010" => return "0100100";
when "0011" => return "0110000";
when others => return "1111111";
end case;
end BCD_TO_DEC7;
end BCDTo7SegDriver;
architecture Behavioral of BCDTo7SegDriver is
signal cur_val : std_logic_vector(31 downto 0);
signal cur_anode : unsigned(7 downto 0) := "11111101";
signal cur_seg : std_logic_vector(6 downto 0) := "0000001";
begin
process (CLK, VAL, cur_anode, cur_seg)
begin
if rising_edge(CLK) then
cur_val <= VAL;
cur_anode <= cur_anode rol 1;
ANODE <= std_logic_vector(cur_anode);
SEGMENT <= cur_seg;
end if;
-- Decode segments
case cur_anode is
when "11111110" => cur_seg <= BCD_TO_DEC7(cur_val(3 downto 0));
when "11111101" => cur_seg <= BCD_TO_DEC7(cur_val(7 downto 4));
when "11111011" => cur_seg <= BCD_TO_DEC7(cur_val(11 downto 8));
when "11110111" => cur_seg <= BCD_TO_DEC7(cur_val(15 downto 12));
when "11101111" => cur_seg <= BCD_TO_DEC7(cur_val(19 downto 16));
when "11011111" => cur_seg <= BCD_TO_DEC7(cur_val(23 downto 20));
when "10111111" => cur_seg <= BCD_TO_DEC7(cur_val(27 downto 24));
when "01111111" => cur_seg <= BCD_TO_DEC7(cur_val(31 downto 28));
when others => cur_seg <= "0011111";
end case;
end process;
end Behavioral;
现在,起初我尝试从约束文件中定义的板时钟天真地驱动这个电路:
## Clock signal
##Bank = 35, Pin name = IO_L12P_T1_MRCC_35, Sch name = CLK100MHZ
set_property PACKAGE_PIN E3 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports clk]
create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports clk]
这让我在七段显示器上看起来几乎是垃圾输出 - 看起来每个解码的数字都被叠加到每个数字位置。基本上,如果正在解码的值的第 3 位到第 0 位是“0001”,则显示器连续显示 8 个 1,而不是 00000001(但不完全是 - 其他段被点亮但看起来更暗)。
将时钟放慢到更合理的值就可以了,电路按照我的预期工作。
当我查看详细说明给我的信息时(我使用的是 Vivado 2014.1),它给了我一个电路,其中 VAL 连接到 8 个并行 RTL_ROM(每个 RTL_ROM 解码 4 位输入)。这些 ROM 的输出被馈送到 RTL_MUX,cur_anode 的值被用作选择器。 RTL_MUX 的输出馈送到 cur_val 寄存器;然后将 cur_val 和 cur_anode 寄存器链接到输出。
那么,考虑到这一点,电路的哪个部分无法处理时钟速率?根据我的阅读,我觉得这与我可能需要添加的时间限制有关;我的想法是否正确?
【问题讨论】: