所有的倍频都必须基于硬件电路本身, 如对PN结上产生高次谐波进行剥离。脱离PLL的Verilog不能倍频
1细读特定芯片的数据手册[datasheet], 查看时钟相关资源
2运行EDA软件,选设好特定芯片; 调用软件自带的IP/MegaCore,生成PLL模块
结合datasheet,实际需要及PLL设置界面,适当设定输入/输出/倍率,达到分频、倍频目的
3在需要倍频的Verilog程序中, 采用Module例化方式, 调用上述生成的PLL模块
4 FPGA程序中,能用一个时钟源就用一个时钟源派生的时钟。能用PLL时钟绝不用计数器分频。
module clk_div(clk,out1,out2);
input clk;
output out1,out2;
reg out1,out2;
reg [31:0]cnt1,cnt2;
always @(posedge clk)begin//50MHz分频计数
if(cnt1<32'd24999999)
cnt1 <=cnt1 + 32'd1;
else
cnt1 <=32'd0;
end
always @(posedge clk)//分频后的半周期反转
if(cnt1 == 0)
out1<=~out1;
always @(posedge clk)begin//5MHz分频计数
if(cnt2<32'd4999999)
cnt2 <=cnt2 + 32'd1;
else
cnt2 <=32'd0;
end
always @(posedge clk)//20%占空比
if(cnt2 == 32'd999999)
out2<=0;
else if(cnt2 == 32'd4999999)
out2<=1;
endmodule
你的程序的主要的问题就是:
1你写的是时序逻辑,里面用到的reg类型的变量在正常使用之前是要初始化的,否则用modulesim仿真时会一直为红线"X"状态的。
2写常量数字时,一定要加上宽度,如果你只写一个“1”,那么这个1就默认为是32位的,很耗资源。
3除非你对`timescale在仿真时的冲突决策很了解,否则建议你只在Testbench中使用这个宏。
以下是我修改过的程序,我仿真过了,没问题:
module fenpinqi(
div12,
clk,
rst
);
input clk;
input rst;
output div12;
reg div12;
reg [2:0] cnt;
always @(posedge clk)
begin
if (rst == 1'b0)
begin
div12 <=1'b0;
cnt <='b0;
end
else
begin
if(cnt==3'b101)
begin
div12 <= ~div12;
cnt <= 'b0;
end
else
begin
cnt <= cnt + 1'b1;
end
end
end
endmodule
//
`timescale 1ns/1ns
module
fenpinqi_tb;
reg clk;
wire div12;
reg rst;
fenpinqi u3cs(
clk(clk),
div12(div12),
rst(rst));
initial
begin
clk=1'b0;
rst=1'b0;
#30 rst=1'b1; end
always
begin
#10 clk=1'b1; #10 clk=1'b0;
end
endmodule
以上就是关于用verilog hdl如何实现1/n分频 就是提高频率全部的内容,包括:用verilog hdl如何实现1/n分频 就是提高频率、用Verilog HDL编写简单的程序!数电实验!、Verilog分频器代码仿真错误等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)