用一个clk做开关,记另一个cp的个数该如何实现?
本帖最后由 fpgaw 于 2010-7-16 10:43 编辑一个脉冲信号(pps)上升沿来时,计数器开始记一个更高频率的脉冲(clk)个数,至下一个脉冲(pps)来时,关闭计数,记数值(data)送别的寄存器(q)备用,如此往复.应该如何实现啊?
我写了一个,写糊涂了,该怎么改啊?
可以用这种语句吗: if @(posedge clk)
我的代码如下:就是编译不过,大家帮我看看是什么地方出问题了?
module outpwm(clk,pps,clkout);
input clk;
input pps;
output clkout;
reg clkout;
reg data;
reg enable;
reg q;
reg n;
always @(posedge pps)
begin
if (n==1)
begin
q<=data;
data<=0;
n<=0;
clkout<=~clkout;
end
else
begin
n<=n+1;
end
always @(posedge clk)
begin
data<=data+1;
end
end
endmodule 大家帮忙看一下啊,我自己顶一顶了 可以这么写:<br>
<br>
reg enable; // enable is a flag that indicates start counting or not<br>
<br>
always @ (posedge pps)<br>
if (!enable) <br>
begin<br>
enable <= 1'b1; // if not-start-counting-state & pps rising, pull enable flag high & start counting<br>
<br>
q <= n; // latch the refreshed data<br>
end<br>
else<br>
begin<br>
enable <= 1'b0; // if on-going-counting-state & pps rising, pull down enable flag<br>
<br>
q <= 0; // clear data<br>
end<br>
<br>
<br>
always @ (posedge clk)<br>
if (!enable)<br>
n <= 0; // clear count numbers<br>
else<br>
n <= n + 1'b1;<br>
<br>
[ 本帖最后由 asuga 于 2006-12-1 17:03 编辑 ] 第1个always里面 q<=n 和q<=0是不是写反了 <br>
不然 q 一直是0 啊 :) 没有反;。在n计数时对q清零; 计数停止时q锁入n 我把程序修改了一下,但还是和预期的效果不一样,不知道是哪里出了问题,高手再看一下吧<br>
<br>
module outpwm(clk,clkout,pps);<br>
input clk;<br>
input pps;<br>
output clkout;<br>
reg clkout;<br>
reg data;<br>
reg q;<br>
reg n;<br>
<br>
always @(posedge clk or posedge pps)<br>
if(pps)<br>
begin<br>
if(n==1)<br>
begin<br>
q<=data;<br>
data<=0;<br>
clkout<=~clkout;<br>
n<=0;<br>
end<br>
else if(n==0)<br>
begin<br>
n=n+1;<br>
end<br>
else <br>
begin<br>
data<=data+1; <br>
end<br>
end <br>
endmodule<br>
然后我的输出怎么没有循环,应该是第一个PPS记数,第二个关,第三个又记数,第四个关,可我的仿真却仿成如下结果 已解决,用if和else的嵌套加上posedge clk来实现,仿真图如下: 看不懂啊!3楼的enable是什么? 怎么变化的?
第1个always里面 q<=n 和q<=0是不是写反了 <br>
不然 q 一直是0 啊
页:
[1]