利用Verilog HDL 将20Mhz分频得到1hz
代码如下,供参考
reg [24:0] cnt;
reg clk_1hz;
parameter C_25M = 25'd24_999_999;
always@(posedge clk_50M or negedge rst)
if (!rst)
cnt <= 25'b0;
else if (cnt >= C_25M ) //
cnt <= 25'b0;
else
cnt <= cnt + 1'b1;
always@(posedge clk_50M or negedge rst)
if (!rst)
clk_1hz <= 1'b0;
else if (cnt == C_25M )
clk_1hz <= !clk_1hz;
你好,使用以下程序即可,使用时只需改变N值,N的取值大小请看注释,此程序适合对任意时钟的整数分频(包括奇偶),此程序已通过验证。根据你的情况,想得到1HZ,N取50000000即可;想得到5HZ,N取10000000即可。
/******************************************************************************************
Author:Bob Liu
E-mail:shuangfeiyanworld@163.com
Device:EP2C8Q208C8
Tool:Quartus 8.1
Function: 实现时钟的任意整数分频
Version:2012-1-9 v1.0
********************************************************************************************/
modulediv_N(
inputCLK,// 基准时钟
outputCLK_div_N// N分频后得到的时钟
);
wire[31:0]N=20;// N为分频系数,N≥2即可,N的值为CLK除以CLK_div_N后取整(四舍五入)
/******************** 产生备用时钟1 ***************/
reg[31:0]cnt1;
regCLK_div_N_1;
always @ (posedge CLK)
begin
if(N%2==0)// 如果N为偶数
begin
if(N==2)// 如果N为2
CLK_div_N_1 <= ~CLK_div_N_1;
else
begin
if(cnt1==(N-2)/2)
begin
cnt1 <= 0;
CLK_div_N_1 <= ~CLK_div_N_1;
end
else
cnt1 <= cnt1+1;
end
end
else// 如果N为奇数
begin
if(cnt1==N-1)
cnt1 <= 0;
else
cnt1 <= cnt1+1;
if((cnt1==N-1) || (cnt1==(N-1)/2))
CLK_div_N_1 <= ~CLK_div_N_1;
else ;
end
end
/*********************** 产生备用时钟2 *********************/
wireCLK0=(N%2)? (~CLK):0;// 如果N为偶数,备用时钟2(CLK_div_N_2)恒为0,即不需要用到此备用时钟
reg[31:0]cnt2;
regCLK_div_N_2;
always @ (posedge CLK0)
begin
if(cnt2==N-1)
cnt2 <= 0;
else
cnt2 <= cnt2+1;
if((cnt2==N-1) || (cnt2==(N-1)/2))
CLK_div_N_2 <= ~CLK_div_N_2;
end
/******************** 产生最终分频时钟************************/
assignCLK_div_N = CLK_div_N_1 | CLK_div_N_2;
endmodule
-- Bob Liu原创
module div(clk,o_clk);
input clk;
output o_clk;
reg[31:0] count;
always@(posedge clk)
begin
if(count==20000000) count<=0;
else count<=count+1;
end
assign o_clk=(count<10000000)?0:1;
endmodule
樊莉亿希: 就是一个简单的计数分频,程序给你敲在下面了,计数count小于10000000时为低,大于10000000小于20000000时为高,计数等于20000000时清零重新开始,循环,这就把20M分成1Hz了,请采纳吧 module div(clk,o_clk); input clk; output o_clk; reg[31:0] count; always@(posedge clk)begin if(count==20000000) count<=0; else count<=count+1; endassign o_clk=(count<10000000)?0:1; endmodule
察布查尔锡伯自治县15176688168: 使用Verilog HDL实现50MHz分频为20MHz - ?
樊莉亿希: 以下代码可以实现40%占空比的分频,供参考.//clk_50m, clk_20m, rst //cnt; reg [2:0] cnt;always@(posedge clk_50m)if(!rst)cnt <= 3'b0;else if (cnt >= 4'h4)cnt <= 3'b0;elsecnt <= cnt + 1'b1;always@(posedge clk_50m)if(!rst)clk_20m <= ...
察布查尔锡伯自治县15176688168: Verilog HDL设计一个20进制可逆计数器,具有置数、清零、计数功能.求源程序,仿真电路图和波形图 - ?
樊莉亿希: 计数器,具有置数、清零、计数功能.求源程序,仿真电路图和波形图知道更多的确
察布查尔锡伯自治县15176688168: 使用Verilog HDL循环语句设计一个求补码的程序,输入数据是一个有符号的8位二进制数 - ?
樊莉亿希: input [7:0] a; output [7:0] b; int i; reg [7:0] c; always @(a) beginfor (i=0; i<8; i++) c[i] = !a[i]; end always @(c) beginb[7:0] = c[7:0] + 8'd1; end
察布查尔锡伯自治县15176688168: 用Verilog HDL语言设计流水灯实验程序 - ?
樊莉亿希: module run_led(clk,rst,led); //module port制 input clk;//system clock 百 input rst;//system reset output [7:0] led; // 8bits led reg [7:0] led;reg [25:0] count;always @ (posedge clk ) beginif(rst || count[25]==1) begincount<=26'b0;endelsecount<=...
察布查尔锡伯自治县15176688168: 使用verilog hdl循环语句,设计一个4位4输入最大值检测电路 - ?
樊莉亿希: 这个用循环语句还真不好做,功能要求分明是个比较器.不晓得为什么非要用循环来做. 最后,我的一个意见:和你问的另外一个问题一样,verilog HDL循环语句描述出来的功能模块,一定要非常小心,很容易造成不可综合,或者综合出来的...
察布查尔锡伯自治县15176688168: 利用verilog HDL设计一个带同步复位、高电平有效、并且对输入时钟下降沿触发的四分频模块? - ?
樊莉亿希: module d(rst1,rst0,clk,in,out); input rst1,rst0,clk,in; output out; reg out; always@(posedge clk or negedge rst1 or negedge rst0) begin if(~rst1) out<=1; //注意下降沿配copy套2113的条件写法5261 else if(~rst0) out<=0; //注意下降沿配套的条件写法 ...
察布查尔锡伯自治县15176688168: 用Verilog HDL语言进行简单计数器设计 - ?
樊莉亿希: 上楼给的是计数器啊.不是0~9计数啊.我给你改改. 1、计数器 module counter (count, clk, reset); output [4:0] count; input clk, reset; reg [4:0] count; always @ (posedge clk or posedge reset)if (reset)count <= 4'h0;elseif(count<9)count <= ...
察布查尔锡伯自治县15176688168: 组合逻辑电路设计(使用Verilog HDL设计):分别采用行为描述和结构描述设计一个一位全加器. - ?
樊莉亿希: 行为描述 moudle(a,b,ci,sum,c) input a,b,ci; output sum,c; assign {c,sum}=a+b+ci; endmodle 结构描述:moudle(a,b,ci,sum,c0) input a,b,ci; output sum,co; wire x,y,z; xor #10 u1(x,a,b); and #10 u2(y,ci,x); and #10 u3(z,a,b); or #10 u4(c0,y,z); xor #10 u5(sum,c0,x); endmodule 鸟春不错啊!!!这只是个人见解啊,不对不负责啊~~广东工业大学信息工程学院08电信(1)班不错啊~~
察布查尔锡伯自治县15176688168: verilog hdl如何将一个已经存在的16位数值转化为无符号数? - ?
樊莉亿希: 怎么转化,取绝对值还是直接转化?直接转化就在前面直接补零就无符号了,不转换也无所谓,反正机器的计算都是默认为无符号数.取绝对值就是取补码.比如 reg [15:0] data_s; reg [15:0] data_us; assign data_us=(data_s[15])?{1'b0,~(data_s[14:0]-1)}:data_s;