集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 3479|回复: 8

用一个clk做开关,记另一个cp的个数该如何实现?

[复制链接]
CHA 发表于 2010-6-26 00:55:28 | 显示全部楼层 |阅读模式
本帖最后由 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[7:0] data;
reg enable;
reg[7:0] 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[7:0] data;<br>
reg[7:0] 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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 17:09 , Processed in 0.066557 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表