哈哈,转行开始做电路设计,其中所进行的training experiment里面有个题目是如何将Verilog代码转换为一个原理图,并画出图进行调试仿真。
原题:
always@(posedge clkm_cke or negedge reset_n_i)
begin
if(!reset_n_i)
cnt_counter<=6'b000001;
else begin
if(colcmd_or_zqc)
cnt_counter<=init_counter;
else if(cnt_counter!=6'b000001)
cnt_counter<=cnt_counter-1b'1;
end
end
思路一:
1. 通过Verilog结构,进行大概判断使用了哪些基础电路元件:
参考文章:根据verilog代码画电路图_傻童:CPU的博客-CSDN博客_verilog如何生成电路图
首先可以看出来这是一个D边沿触发器(收到时钟信号clkm_cke的上升沿脉冲,Q等于D,若收到复位信号reset_n_i的下降沿脉冲,Q=0,其他情况下Q值保持不变),第一层选择器(选择条件是复位信号reset_n_i为0还是1,选择结果为6'b000001或者维持原输出cnt_counter不变),第二层选择器(选择条件为colcmd_or_zqc为0还是1,选择结果为init_counter或者维持原输出cnt_counter不变),第三层选择器(选择条件为比较器的输出结果,选择结果为执行减法器或者维持原输出cnt_counter不变),比较器的输入分别为cnt_counter和6'b000001,到这里就分析完了。
2. 下面再分析如何实现执行的这个减法器。
在计算机中,如果设置了一定位数的寄存器,那么超出这个位数的高位会被溢出,这也就意味着,根据’‘a-b=a-b+mod=a+mod-b=a+b补码’‘,这个加法器可以使用加法器实现,补码可以通过按位取反实现。
3. 我又遇到了一个问题,那就是这个多位比较器如何实现:
当前准备借助加法器进行替代方案实现,即计算cnt_counter-6'b000001,并将计算结果按位与。
画好电路图之后,调试成功后出现一个问题,那就是,如果按照这个Verilog所描述的电路动作将cnt_counter-1b'1时,cnt_counter<0>出现了被干扰或者短路的情况,一直输出为0,但是将电路动作改为cnt_counter-4b'1000时,cnt_counter<5:0>的结果当然和原电路不一样了,但是可以正常输出。ps:因为这里我是用一个6位加法器实现这一动作,因此实际电路中,减去的是一个6位二进制数,即6b'000001或者6b'001000。不知道是否于此有关。暂时不解决这个问题,继续往后进行experiment。