1Hz ~~ 250MHz的感觉

本文探讨了在FPGA设计中遇到的时钟信号生成问题,包括使用Matlab_Keys和CLK_Generater生成不同频率时钟信号的过程及遇到的问题。详细讨论了如何通过组合逻辑选择不同的时钟频率,并分享了一些关于全局时钟网络配置的经验。

1Hz ~~ 250MHz的感觉

做频率计,高频的,250M 左右没问题,再次测试,可是实验室没有20M以上的信号源给我用,怎么办办呢??

在嚎啕大哭的时候,难言,只能用FPGA产生频率给CPLD 来接收,250M没问题吧。

CLK_Deaign = Matlab_Keys + CLK_Generater;

在这个过程中发现了好多问题

(1) Matlab_Keys

(2) CLK_Generater: 两个PLL 不能同时由一个CLK供给时钟。

(3) 低频不能控制高频,否则没响应,就连选择器都有问题,因此 最好用最高时钟来控制

(4) Case语句可以这样写

case(Mode)

4'd0,4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9,4'd10:

CLK_OUT = CLK_OUT_r;

。。。。。。。

(5) PLL输出时钟,我选择性的输出,只能用组合逻辑,时序逻辑不行,没响应

always@(posedge CLOCK_50 or negedge RST_n)

begin

case(Mode)

4'd11: CLK_OUT <= CLK_50MHz;

4'd12: CLK_OUT <= CLK_100MHz;

4'd13: CLK_OUT <= CLK_150MHz;

4'd14: CLK_OUT <= CLK_200MHz;

4'd15: CLK_OUT <= CLK_250MHz;

default:CLK_OUT <= CLK_OUT;

endcase

end

这样是严重不行的,虽然只是简单的选择器,但是输出的时钟最低的50M和敏感时钟一样,另外的都比他高,造成无法控制

(6) 《深入浅出婉转FPGA》上有一章节说 FPGA全局时钟的事情,他说:

“Cyclone 系列旗舰基本都是2个PLL,除了EP1C3,Cyclone系列旗舰的全局时钟网络分配情况:PLL1只能由CLK0,CLK1供给,PLL2只能由CLK2,CLK3供给,否则,出错;PLL c0,c1只能作为内部时钟,e0只能最为外部时钟,否则出错”

我现在用的是CII 怎么可以输出呢???而且我用的是CLK0.CLK4,没问题

clip_image002

(7) 有一位高人告诉我,每个CLK都能作为输入,而且都能输出的,我自己测试出来也是这样的,所以,暂时相信我自己。

/*生成CLK_OUT 1~250MHz*/

always@*

begin

case(Mode)

4'd0,4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9,4'd10:

CLK_OUT = CLK_OUT_r;

4'd11: CLK_OUT = CLK_50MHz;

4'd12: CLK_OUT = CLK_100MHz;

4'd13: CLK_OUT = CLK_150MHz;

4'd14: CLK_OUT = CLK_200MHz;

4'd15: CLK_OUT = CLK_250MHz;

endcase

end

(8) clip_image004这是 CII 的DS上面的,意思貌似也是只能是CLK0,CLK1,CLK2,CLK3作为时钟输入,看起来好像是这样的,但是……

clip_image006

我PLL1 给的是CLK0, PLL2 给的是CLK4,我需要的效果都出来的,没出现问题啊!

(9) 完了 暂时就这么点想法了,到时候,在加。。

(10) 怪不得,我用的刚好是CLK0,CLK4,RP不错

clip_image008

(11) clip_image010

好像pdf上是说,C0,C1内部时钟,c2外部时钟,但是我的工程用组合逻辑之后怎么都可以呢、??

http://blog.ednchina.com/wind330/198994/message.aspx

wind330's Blog也有类似的blog

(12)未完待续

(13)

转载于:https://www.cnblogs.com/crazybingo/archive/2010/07/29/1787521.html

是这么修改吗?module _m000_00to999_99 (ck,ep,nrste,P,Q); // 时钟 启停 复位 段选 位选 input ck,ep,nrste; output [7:0] P; output [2:0] Q; wire fx; // 200Hz时钟 wire fy; // 100Hz计时时钟 wire [2:0] fout; wire [3:0] q0,q1,q2,q3,q4,q5; // 修改1:使用200Hz分频器替代400Hz f_200hz f200 (ck, fx); // 修改2:使用新的2分频模块生成100Hz f_100hz_new f100 (fx, fy); _3bit_plus_mc scan_counter(fx, fout); // 扫描计数器(0-5) ms_00to99min59_99 timer ( .clk5(fy), .ep(ep), .nrst(nrste), .q0(q0), .q1(q1), .q2(q2), .q3(q3), .q4(q4), .q5(q5) ); _6digit_lgt display ( .q5(q5), .q4(q4), .q3(q3), .q2(q2), .q1(q1), .q0(q0), .sel(fout), .seg(P) ); assign Q=fout; endmodule //============================== // 修改3:新的100Hz生成模块 (2分频) module f_100hz_new (clk_in, clk_out); input clk_in; // 200Hz输入 output reg clk_out; // 100Hz输出 always @(posedge clk_in) clk_out <= ~clk_out; // 简单2分频 endmodule //============================== // 修改4:200Hz分频器 (替代原400Hz模块) module f_200hz (clk, f0); input clk; output reg f0; reg [17:0] scan; // 扩大计数器位宽 // 50MHz时钟分频到200Hz计算: // 50,000,000 / 200 = 250,000 周期 // 半周期计数 = 125,000 (0~124999) always @(posedge clk) begin if(scan == 124999) begin scan <= 0; f0 <= !f0; end else scan <= scan + 1; end endmodule //============================== // 其他模块保持不变(计时、显示、位选等) module ms_00to99min59_99 (clk5,ep,nrst,q0,q1,q2,q3,q4,q5); input clk5,ep,nrst; output reg [3:0] q0,q1,q2,q3,q4,q5; always @(posedge clk5 or negedge nrst) begin if (!nrst) {q5,q4,q3,q2,q1,q0} <= 0; else if (!ep) begin if (q0 < 9) q0 <= q0 + 1; else begin q0 <= 0; if (q1 < 9) q1 <= q1 + 1; else begin q1 <= 0; if (q2 < 9) q2 <= q2 + 1; else begin q2 <= 0; if (q3 < 5) q3 <= q3 + 1; else begin q3 <= 0; if (q4 < 9) q4 <= q4 + 1; else begin q4 <= 0; if (q5 < 9) q5 <= q5 + 1; else q5 <= 0; end end end end end end end endmodule module _6digit_lgt (q5,q4,q3,q2,q1,q0,sel,seg); input [3:0] q5,q4,q3,q2,q1,q0; input [2:0] sel; output reg [7:0] seg; wire [7:0] seg5, seg4, seg3, seg2, seg1, seg0; BCD7 digit5(q5, seg5); BCD7 digit4(q4, seg4); BCD7 digit3(q3, seg3); BCD7 digit2(q2, seg2); BCD7 digit1(q1, seg1); BCD7 digit0(q0, seg0); always @(*) begin case(sel) 3'd0: seg = seg5; 3'd1: seg = seg4; 3'd2: seg = seg3; 3'd3: seg = {1'b0, seg2[6:0]}; // 秒个位带小数点 3'd4: seg = seg1; 3'd5: seg = seg0; default: seg = 8'b11111111; endcase end endmodule module BCD7(sel, out); input [3:0] sel; output reg [7:0] out; always @(*) begin case(sel) 4'd0: out = 8'b11000000; 4'd1: out = 8'b11111001; 4'd2: out = 8'b10100100; 4'd3: out = 8'b10110000; 4'd4: out = 8'b10011001; 4'd5: out = 8'b10010010; 4'd6: out = 8'b10000010; 4'd7: out = 8'b11111000; 4'd8: out = 8'b10000000; 4'd9: out = 8'b10010000; default: out = 8'b11111111; endcase end endmodule module _3to6out (slc, bit6_output); input [2:0] slc; output reg [5:0] bit6_output; always @(*) begin case(slc) 3'd0: bit6_output = 6'b011111; 3'd1: bit6_output = 6'b101111; 3'd2: bit6_output = 6'b110111; 3'd3: bit6_output = 6'b111011; 3'd4: bit6_output = 6'b111101; 3'd5: bit6_output = 6'b111110; default: bit6_output = 6'b111111; endcase end endmodule module _3bit_plus_mc(clk1, out); input clk1; output reg [2:0] out; always @(posedge clk1) begin if (out == 5) out <= 0; else out <= out + 1; end endmodule
最新发布
06-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值