占空比50%的5分频 记事 2011 09 19
今天一师兄去华为面试FPGA设计工程师,面试官问了若干个问题,其中一个是让设计一个1比1的5分频器。然后师兄回到实验室跟我们讲了这件事,当时像许多人一样,第一反应是,做个5计数器,然后用时钟信号和计数器输出信号做一些组合输出即可。这道经典的数电题在考试考研的时候经常出现。某师弟说他们考数电时候就考了,貌似考研的时候也考过这道题,我没考过研,不太清楚,但是学数电的时候确实做过这道题,老师也是像上面那样讲的。然而,我还是有些疑惑,于是打算用Quartus试着编一下看看,程序比较简单,
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY sig is
PORT(
clk :IN STD_LOGIC;
rst :IN STD_LOGIC;
y1 :OUT STD_LOGIC;
y :OUT STD_LOGIC
);
END sig;
ARCHITECTURE fpga OF sig IS
SIGNAL sum : STD_LOGIC_VECTOR(2 DOWNTO 0);
BEGIN
PROCESS(rst, clk)
BEGIN
IF (rst = '1') THEN
sum <= "000";
ELSIF(clk'event and clk = '1') THEN
IF (sum ="100") THEN
sum <="000";
ELSE
sum <= sum + 1;
END IF;
END IF;
y <= (sum(2) and clk)or (sum(1));
END PROCESS;
END fpga ;
然我们看看输出的波形吧,看了你就会一目了然
对了,输出虽然是1比1的5分频,但是在波形的某个地方总是有毛刺!计数器的输出最高位sum(2)和时钟clk与过以后就会出现这个毛刺!或上sum(1)这个毛刺任然在那。很显然组合电路直接输出不可避免的会有毛刺存在,这种毛刺在系统中会引起引灾难性的后果,但是这个毛刺能去除吗?不能,最少我认为在只有clk的情况下不能,原因很显然,要想去除毛刺就得用寄存器打一下,但是寄存器一打的话前面组合电路的努力就白费了,占空比又会变成3:2。
到现在我还只想到了这里,也许有办法能正的去掉毛刺,那么请各位高手不吝赐教。
我想华为的面试题还是有一定深度的,不会随随便便出一个考试题给人去做,就像昨天某师兄去面试某软件职位结果被问到了c语言中sizeof(指针)是多少这个问题一样(应该和机器的字长和编译器都有关吧),都暗藏陷阱。师兄们一个个都找到了自己理想的工作,真想自己也和他们一样,早点走出去啊。