热度 18
2012-12-29 13:50
1192 次阅读|
2 个评论
那一年我在学NIOS,学习过程中,自己遇到了好多问题,NIOS II 9.0和WIN7 的兼容性问题,如何修改运行程序的权限(想知道的网上一搜,多的很),再到NIOS II 12.0 FREE 的ID 问题,真的整的自己都想放弃NIOS的学习,运行过程中电脑一直死机,等等,问题的问题的问题,呵呵… 言归正传,说说Verilog 的学习心得,以及奇数分频电路产生方法,以便和大家共享。其实奇数分频电路的产生方法很多,自己今天学了“错位异或”法,那就简述错位异或法。其原理简述:对于实现占空比50%的N倍奇数分频,首先进行上升沿触发的模N计数,奇数到某一定值是进行输出时钟翻转,然后经过(N - 1) / 2次翻转,得到一个占空比非50% 的奇数N分频时钟。再者,同时进行下降沿模N计数,到和上升沿触发输出时钟翻转选定值相同时,进行输出时钟翻转,同样经过(N - 1)/ 2,输出时钟再次翻转,产生占空比非50% 的奇数N分频时钟。最后两个非50% 的时钟相或,得到占空比为50% 的奇数N分频时钟。是不是说的有点懵了,那就看看具体代码的实现,以自己经历,看的同时手上画画时序图,自己就很明白了,申明一点,自己太懒了没做仿真,说以大家都看不到时序图,自己动手,丰衣足食吗??? module clk_div3(clk_in, rst_n,clk_out); input clk_in; input rst; output clk_out; /* ************************************************************ */ reg cnt, cnt1; reg clk_1to3p,clk_1to3n; /* ************************************************************ */ always @ (posedge clk_in or negedge rst) begin if(!rst) begin cnt = 2'd0; clk_1to3p = clk_1to3p; end else begin if(cnt == 2'b10) begin cnt = 2'd0; clk_1to3p = clk_1to3p; end else begin cnt = cnt + 1'b1; clk_1to3p = !clk_1to3p; end end end /* ************************************************************ */ /* ************************************************************ */ always @ (posedge clk_in or negedge rst) begin if(!rst) begin cnt = 2'd0; clk_1to3n = clk_1to3n; end else begin if(cnt == 2'b10) begin cnt = 2'd0; clk_1to3n = clk_1to3n; end else begin cnt = cnt + 1'b1; clk_1to3n = !clk_1to3n; end end end /* ************************************************************ */ assign clk_out = clk_1to3p | clk_1to3n; /* ************************************************************ */ endmodule 我是用SourceInsight写,若有拼写错误不予理会,呵呵