主时钟clk的分频信号 能在always中 作为被检测的时钟么? 下面是我遇到的问题
input clk;
input ret;
output fm,fm1,fm2;
reg clk1;
reg clk2;
reg h,fm;
reg [9:0] cnt;
reg [5:0] cnt1;
reg [2:0] cnt2;
reg [2:0] cnt3;
reg [5:0] div;
parameter a=6'd50,
b=6'd40,
c=6'd30,
d=6'd20,
e=6'd10,
f=6'd5;
always @(posedge clk or posedge ret)
if(!ret)
begin
clk1<=0;
cnt1<=0;
end
else
if(cnt1==6'b111111)
begin
clk1<=~clk1;
cnt1<=0;
end
else
cnt1<=cnt1+1;
always @(posedge clk or posedge ret)
if(!ret)
begin
clk2<=0;
cnt2<=0;
end
else
if(cnt2==3'b111)
begin
clk2<=~clk2;
cnt2<=0;
end
else
cnt2<=cnt2+1;
always @(posedge clk1 or posedge ret)
if(!ret)
begin
fm<=0;
cnt<=0;
end
else if(cnt==10)
begin
fm<=~fm;
cnt<=0;
end
else
cnt<=cnt+1;
/* always @( posedge clk2 or posedge ret)
begin
if(!ret)
begin
cnt3<=0;
end
else
if(cnt3==3'b101)
cnt3<=0;
else
cnt3<=cnt3+1;
case(cnt3)
0: div=a;
1: div=b;
2: div=c;
3: div=d;
4: div=e;
5: div=f;
default : div=0;
endcase
end */
assign fm1=clk1;
assign fm2=clk2;
// assign fm=h;
endmodule
整个程序中 为什么 红色的部分 我用clk产生的分频信号 clk1 去做被检测的时钟 fm 就没有输出;
而如果 我把 clk1 换成 clk 输出就是正常的 求教 !
综合成了不能预知的逻辑,把always @(posedge clk or posedge ret)换成always @(posedge clk or negedge ret)试试。
您太棒了 谢谢您 这样就可以了 但是 我不明白 为什么上升沿 会出现逻辑的错误 这就是这门学问的潜规则么?
你程序中用的是if( !ret )就代表的是下降沿。如果用if(ret)就是上升沿,我推荐你用同步复位,即always @( posedge clk)。
方法一:把红色代码部分的posedge ret改成negedge ret这么明显的问题....
你用posedge ret 触发,然后还用!ret 检测..
方法二:把红色always里面的的复位信号判断改成ret,即去掉"!"
我是新手 以前没有太注意 现在理解了 自学的 所以好多地方感觉会了 但是理解的不到位 在实践中 问题就暴露出来了 谢谢大家的帮助
谢谢啊 我自己做的音乐发生器 根本听不出来 是什么玩意 努力的修改中 自学累 写代码累 检查代码更累 ;我把代码 用modelsim 仿真 时间太久了 有好办法不 ,我把数换 小了 逻辑是对的 但是换大了 下到板子中 却乱七八糟的
你的代码可以综合通过? 肯定综合都过不了的
这个是我修改后的 fm接蜂鸣器 可以演奏音乐的
根据你写的代码,我看着是产生了不同频率的时钟,然后根据这些不同频率的时候综合产生了cnt3,再由cnt3生成输出的div。
音乐的8个音阶是由于频率不同而发音不同,如果你打算在modelsim仿真时,时间能变短,不妨你的基准clk可以适当选择小一些,可以适当的从比较大的时钟输入分频到比较小的范围内,这样你再产生clk1和clk2的时候计数器的值就不会太大了。另外,你仿真文件中的时间精度`timescale xxns/xns可以适当增大一些,这样也可以帮助你减小仿真时间。
当然,最重要的是,你修改了基准clk以后,div的赋值你要自己选择好。时间精度要选择能整除你div的。仅供参考
学习中……
