我是VHDL的初学者,这里有一些关于我的代码的问题。
process(clock_50)
begin
if(clock_50'event and clock_50='1')
if(prescaler<500000) then --prescaler to slow down and initialized by 0
prescaler<=prescaler+1;
else
prescaler<=0;
end if;
if(prescaler=0) then
case key(0) is --key representing button
when '0' =>
if(result<1023) then --result is a signal counter for 10 bit led value
--and initialized by 0
result<=result+1;
else
result<=0;
end if;
when '1' =>
if(result>0) then
result<=result-1;
else
result<=1023;
end if;
end case;
end if;
end if;
end process;
关于这些代码;
Q1:Prescaler初始化为0,第4行,'if'条件,但表现得像一个循环,我是对的吗?我的意思是它的数量是500000.这是真的吗?如果这是真的,为什么?感谢'过程'或并行编码?
Q2:实际上,当释放键时,leds从9倒数到0.但是在代码中,我们声明case键(0)是'0'结果正在计数的时候。我错过了什么? 提前谢谢并原谅我的缺点。
答案 0 :(得分:2)
Q1:第4行的if条件在clock_50信号的每个上升沿运行(由于前三行代码)。在预分频器初始化为零的情况下,第4-9行的if语句将每个时钟的预分频值增加1,直到它等于500000,此时它将重置为零。这将时钟信号的50 MHz周期(假设基于信号名称)转换为50,000,000 / 500,000或100 Hz。检查开关的更合理的时间范围,特别是如果你没有进行任何其他的去抖动。
Q2:当预分频器= 0(每500000个时钟中有一个)时,结果的值将递增1或递减1,包含在0和1023(即:10位二进制值),具体取决于是否key(0)值为'0'(增量)或'1'(减量)。
没有足够的信息来回答你的问题“但是在代码中,我们声明案例密钥(0)是'0'结果正在计数的时候。我缺少什么?”问题,但是很常见的事情是像交换机那样用一个上拉电阻“倒置”并且开关短路接地(因此一个打开的开关读为'1'而一个闭合的开关读为'0'),但没有看到其余的逻辑,我无法告诉你除了key(0)的值之外应该发生什么。查看其余逻辑(和原理图!)以查看键(0)信号的来源,以及当您按下按钮时该值是“0”还是“1”。