OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6512|回复: 1

verilog代码求助 实现分频可调

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2016-7-21
在线时间
0 小时
发表于 2016-7-21 10:04:26 | 显示全部楼层 |阅读模式
1金钱
大二小白,暑期在做一个课设,其中有一个分频模块,想做成用两个轻触开关分别控制输出频率增加(sel1)和频率减小(sel0),5~50hz,k0和k1用于计数。无操作时默认为50hz。敏感表写了posedge clk_50m, negedge sel1 or sel0 三种边沿信号后报错:Error: Can't elaborate top-level user hierarchy,只写posedge clk_50m编译可以通过,但是不对啊。。clk_50m就是芯片自带的时钟信号,50兆。*后面要经过256个点/周期的采样,所以分频*256,这部分可以忽略
下面是代码:
module fenpin
(
input clk_50m,
input sel0,
input sel1,
output reg clk_out
);
integer f0=50,f1=5;
integer k0=1,k1=1;
reg[20:0]count;
always@(posedge clk_50m, negedge sel1 or sel0)
begin
if(~sel0)
        begin
        if(k0<=9)
                begin
                if(count<50000000/(f0-5*k0)/256)
                        count<=count+1;
                else count<=0;                                       
                if(count<50000000/(f0-5*k0)/256/2)        clk_out<=1;
                else clk_out<=0;
                k0<=k0+1;
                end
        else
                begin
                if(count<50000000/f0/256)
                        count<=count+1;
                else count<=0;                                       
                if(count<50000000/f0/256/2)        clk_out<=1;
                else clk_out<=0;
                k0<=1;
                end
        end
else if(~sel1)
        begin
        if(k1<=9)
                begin
                if(count<50000000/(f1+5*k1)/256)
                count<=count+1;
                else count<=0;                                       
                if(count<50000000/(f1+5*k1)/256/2)        clk_out<=1;
                else clk_out<=0;
                k1<=k1+1;
                end
        else
                begin
                if(count<50000000/f1/256)
                        count<=count+1;
                else count=0;                                       
                if(count<50000000/f1/256/2)        clk_out<=1;
                else clk_out<=0;
                k1<=1;
                end
        end
else
        begin
        if(count<50000000/f0/256)
        count<=count+1;
        else count<=0;                                       
        if(count<50000000/f0/256/2)        clk_out<=1;
        else clk_out<=0;
        end
end
endmodule


好着急啊,不知道怎么改。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6291

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11406
金钱
11406
注册时间
2014-4-1
在线时间
1282 小时
发表于 2016-7-21 16:26:19 | 显示全部楼层
本帖最后由 xuande 于 2016-7-21 16:43 编辑

1、有什么不对?    sel1、sel0确实要剔除,然后在下面进程中判断它们的值并相应处理;否则就是异步逻辑,容易产生竞争、冒险。

2、没有复位信号,count、k0、k1这些的初始值是不确定的,也许仿真正常,但实际电路肯定会出错。



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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