那一年我在学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 [1:0] 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写,若有拼写错误不予理会,呵呵
用户1790792 2015-4-18 10:40
用户1492114 2013-3-28 21:21
用户1635818 2013-1-14 10:26