CHA 发表于 2010-6-26 00:55:28

用一个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

ANG 发表于 2010-6-26 02:21:45

大家帮忙看一下啊,我自己顶一顶了

CHANG 发表于 2010-6-26 02:59:02

可以这么写:<br>
<br>
reg enable; // enable is a flag that indicates start counting or not<br>
<br>
always @ (posedge pps)<br>
if (!enable) <br>
&nbsp; &nbsp; &nbsp; &nbsp; begin<br>
&nbsp; &nbsp; &nbsp; &nbsp; enable &lt;= 1'b1; // if not-start-counting-state &amp; pps rising, pull enable flag high &amp; start counting<br>
&nbsp; &nbsp; &nbsp; &nbsp; <br>
&nbsp; &nbsp; &nbsp; &nbsp; q &lt;= n; // latch the refreshed data<br>
&nbsp; &nbsp; &nbsp; &nbsp; end<br>
else<br>
&nbsp; &nbsp; &nbsp; &nbsp; begin<br>
&nbsp; &nbsp; &nbsp; &nbsp; enable &lt;= 1'b0; // if on-going-counting-state &amp; pps rising, pull down enable flag<br>
&nbsp; &nbsp; &nbsp; &nbsp; <br>
&nbsp; &nbsp; &nbsp; &nbsp; q &lt;= 0; &nbsp; &nbsp; &nbsp; &nbsp; // clear data<br>
&nbsp; &nbsp; &nbsp; &nbsp; end<br>
<br>
<br>
always @ (posedge clk)<br>
if (!enable)<br>
&nbsp; &nbsp; &nbsp; &nbsp; n &lt;= 0; // clear count numbers<br>
else<br>
&nbsp; &nbsp; &nbsp; &nbsp; n &lt;= n + 1'b1;<br>
<br>
[ 本帖最后由 asuga 于 2006-12-1 17:03 编辑 ]

longtim 发表于 2010-6-26 04:56:17

第1个always里面 q&lt;=n 和q&lt;=0是不是写反了 <br>
不然 q 一直是0 啊

longt 发表于 2010-6-26 05:56:35

:) 没有反;。在n计数时对q清零; 计数停止时q锁入n

CHAN 发表于 2010-6-26 06:34:48

我把程序修改了一下,但还是和预期的效果不一样,不知道是哪里出了问题,高手再看一下吧<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>
&nbsp; &nbsp;always @(posedge clk or posedge pps)<br>
&nbsp; &nbsp; if(pps)<br>
&nbsp; &nbsp;&nbsp;&nbsp;begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;if(n==1)<br>
&nbsp; &nbsp;&nbsp; &nbsp; begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;q&lt;=data;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;data&lt;=0;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;clkout&lt;=~clkout;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;n&lt;=0;<br>
&nbsp; &nbsp;&nbsp; &nbsp; end<br>
&nbsp; &nbsp;&nbsp; &nbsp;else if(n==0)<br>
&nbsp; &nbsp;&nbsp; &nbsp; begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;n=n+1;<br>
&nbsp; &nbsp;&nbsp; &nbsp; end<br>
&nbsp; &nbsp; else&nbsp;&nbsp;<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;begin<br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;data&lt;=data+1; <br>
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;end<br>
&nbsp; &nbsp;&nbsp;&nbsp;end <br>
endmodule<br>
然后我的输出怎么没有循环,应该是第一个PPS记数,第二个关,第三个又记数,第四个关,可我的仿真却仿成如下结果

interi 发表于 2010-6-26 07:25:38

已解决,用if和else的嵌套加上posedge clk来实现,仿真图如下:

FFT 发表于 2010-6-26 08:30:45

看不懂啊!3楼的enable是什么? 怎么变化的?

Sunlife 发表于 2015-6-24 10:19:53


第1个always里面 q&lt;=n 和q&lt;=0是不是写反了 <br>
不然 q 一直是0 啊
页: [1]
查看完整版本: 用一个clk做开关,记另一个cp的个数该如何实现?