我们在学习FPGA的实验中可以知道我们的时钟频率只有引脚10,很多实验现象在该时钟频率下完全看不到现象,本来应该有的流水灯似的显示却变成了全亮,那就是由于我们的时钟频率过高了,那我们就尝试着进行分频
我们学校的FPGA板的时钟是24MHz的,故我们很多时候就需要得到明显的实验现象,1Hz的时钟就是一个很不错的选择,那我们应该如何呢
我们先来了解一下二分频
直接上图吧,更好理解
二分频电路图
其波形图为
故我们知道二分频实际就是在两次时钟上升沿之后才会有一次的跳变,故我们可以用计数来实现,这个可以是只要时钟上升了两次计数满了,开始反转
那我们就回到我们的如何将24MHz的频率变为1Hz的,那就是24000000中只有一个周期,那就相当于12000000才变动一次,那我们呢只要计数到12000000就好了
下面介绍两种方法
- 直接count计数
我们主要看process里面那一部分
process(clk, rst)
variable count : integer range 0 to 12000000;
begin
if rst='0' then
count := 0;
clkdiv_tmp <= '0';
elsif (rising_edge(clk)) then
if (count = (12000000-1)) then
count := 0;
clkdiv_tmp <= not clkdiv_tmp;
else count := count+1;
end if;
end if;
end process;
刚开始我们定义了变量variable,也可定义信号signal,但要
注意一下,变量赋值符号为 :=,而信号赋值符号为<=
同时定义变量要放在process里面,而定义信号要放在architecture后面
而且时钟上升沿的表示也是可以rising_edge或着clk’event and clk=‘1’
继续分析代码,时钟上升沿的条件下再判断是否计满了12000000,如果计满则清零和反转我们的信号,否则count继续递增
- 利用process进程
我们也可以使用两个process进程,一个对于时钟产生新的频率,一个对于新的频率来实现我们的操作
我们主要说明如何利用第一个process
process(clk)
begin
if clk'event and clk='1' then
if count = (12000000-1) then
cp <= not cp;
count <= 0;
else count <= count+1;
end if;
end if;
end process;
实际是一样的思路,只是这样更清楚一些
然后对于下一个进程,就直接将cp当作时钟信号即可