在数字电路中,常常需要对较高频率的时钟进行分频操作,得到较低频率的时钟信号,即分频器。实现分频器的方法有很多,最常用的是使用计数器分频的方式,而分频也分为偶数分频(2N)、奇数分频(2N+1)、半整数分频(N-0.5)等等,对于最简单的偶数分频,只需要使用模值位N的计数器实现50%占空比的时钟信号,即每次计数满N时输出时钟信号翻转即可。
本次的实验任务是将一个1Mhz的信号分频成100khz、10khz、1khz、100hz。实验要求每相差十倍频率就有脉冲输出,推荐采用十进制计数器对信号进行分频,即判断输入信号上升沿或下降沿的个数,每计满5个即让输出信号电平翻转,以此实现10分频。
然后将10进制计数器做成COMPENENT,利用元件例化语句实现调用,在测试文件(TEST-BENCH,TB)中只需要给输入1Mhz方波信号。
分频电路的思路是内部创建一个计数器,当计数器满足特殊值时进行翻转。N分频分频系数N。内部计数器模值取N。
如果利用时钟的单边沿进行计数,那么当计数等于满足分频系数的一半和分频系数时,进行翻转。一个完整的内部计数器状态流程(外部时钟2N个边沿)中翻转两次(2个边沿)。
内部计数器为分频系数的一半(上下取整都可)或分频系数时,进行翻转。但是这样得到的信号占空比不是50%。
阿西吧,vhdl语言又复杂,资源又少,阿西吧
阿西吧,modelsim编译失败都没有详细报错信息的
port map()里使用","分割,而entity设置输入输出是用";"分割
de了一小时,divider_10.vhd一直过不去modelsim编译,最后用vivado语法检查器看一下,发现unsigned不能用于判断,必须先转换为std_logic_vector用于判断。其它的Linter都检查不出来,Vivado yyds!
vscode使用vivado的语法检查器配置成功!