OpenEdv-开源电子网

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

[XILINX] 求助:一个简单的二分频verilog代码的问题

[复制链接]

55

主题

159

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-7-16
在线时间
64 小时
发表于 2022-1-10 11:11:44 | 显示全部楼层 |阅读模式
10金钱
版主和论坛大佬:
    本人重新接触verilog语言,将breath_led代码改动了一点点(增加一个二分频触发器),全部代码如下:
module breath_led(
    input   sys_clk   ,  //时钟信号50Mhz
    input   sys_rst_n ,  //复位信号
    output  led,          //LED
    output  led0        //增加一个引脚
);

//reg define
reg  [15:0]  period_cnt ;   //周期计数器频率:1khz 周期:1ms  计数值:1ms/20ns=50000
reg  [15:0]  duty_cycle ;   //占空比数值
reg          inc_dec_flag ; //0 递增  1 递减
reg  [15:0]  period_cnt0 ;   //周期计数器频率:1khz 周期:1ms  计数值:1ms/20ns=50000
reg  [15:0]  duty_cycle0 ;   //占空比数值
reg          inc_dec_flag0 ; //0 递增  1 递减
reg          pwm_clk;         //储备增加一个D触发器

//*****************************************************
//**                  main code
//*****************************************************

//根据占空比和计数值之间的大小关系来输出LED
assign   led = (period_cnt >= duty_cycle) ?  1'b1  :  1'b0;
assign   led0 = pwm_clk;

//下面代码是我增加的D触发器
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
       pwm_clk <= 1'b0;
    else
       pwm_clk <= ~pwm_clk;
end

//周期计数器
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n)
        period_cnt <= 16'd0;
    else if(period_cnt == 16'd50000)
        period_cnt <= 16'd0;
    else
        period_cnt <= period_cnt + 1'b1;
end

//在周期计数器的节拍下递增或递减占空比
always @(posedge sys_clk or negedge sys_rst_n) begin
    if(!sys_rst_n) begin
        duty_cycle   <= 16'd0;
        inc_dec_flag <= 1'b0;
    end
    else begin
        if(period_cnt == 16'd50000) begin    //计满1ms
            if(inc_dec_flag == 1'b0) begin   //占空比递增状态
                if(duty_cycle == 16'd50000)  //如果占空比已递增至最大
                    inc_dec_flag <= 1'b1;    //则占空比开始递减
                else                         //否则占空比以25为单位递增
                    duty_cycle <= duty_cycle + 16'd25;
            end
            else begin                       //占空比递减状态
                if(duty_cycle == 16'd0)      //如果占空比已递减至0
                    inc_dec_flag <= 1'b0;    //则占空比开始递增
                else                         //否则占空比以25为单位递减
                    duty_cycle <= duty_cycle - 16'd25;
            end
        end
    end
end

endmodule


但是无论是仿真还是实际测试,都没有出现我要的PWM_CLK信号。请问问题出在哪里?

           先在此表示感谢!


最佳答案

查看完整内容[请看2#楼]

有的,你的计数值太大,仿真时间不够,我把你计数值改成100,仿真100us,能看到波形的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

101

帖子

0

精华

高级会员

Rank: 4

积分
640
金钱
640
注册时间
2021-8-3
在线时间
151 小时
发表于 2022-1-10 11:11:45 | 显示全部楼层
有的,你的计数值太大,仿真时间不够,我把你计数值改成100,仿真100us,能看到波形的
pwm波形.png
回复

使用道具 举报

4

主题

870

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4102
金钱
4102
注册时间
2019-9-4
在线时间
866 小时
发表于 2022-1-10 11:20:32 | 显示全部楼层
帮顶   
回复

使用道具 举报

55

主题

159

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-7-16
在线时间
64 小时
 楼主| 发表于 2022-1-10 11:29:53 | 显示全部楼层
本帖最后由 清秋枫叶 于 2022-1-10 11:34 编辑

我改写的仿真文件;
`timescale 1ns / 1ps

module tb_breath_led();

//输入
reg           sys_clk;
reg           sys_rst_n;

//输出
wire    led;
reg     pwm_clk;

//信号初始化
initial begin
    sys_clk = 1'b0;
    sys_rst_n = 1'b0;
    pwm_clk  = 1'b0;
   
    #200
    sys_rst_n = 1'b1;
end

//生成时钟
always #10 sys_clk = ~sys_clk;

//例化待测设计
breath_led  u_breath_led(
    .sys_clk         (sys_clk),
    .sys_rst_n       (sys_rst_n),
    .led             (led),
    .led0            (led0)
    );

endmodule
下图是仿真结果



回复

使用道具 举报

55

主题

159

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-7-16
在线时间
64 小时
 楼主| 发表于 2022-1-10 11:35:52 | 显示全部楼层
F:1.png
回复

使用道具 举报

55

主题

159

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2016-7-16
在线时间
64 小时
 楼主| 发表于 2022-1-10 11:37:32 | 显示全部楼层
回复

使用道具 举报

2

主题

592

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1458
金钱
1458
注册时间
2019-7-28
在线时间
137 小时
发表于 2022-1-10 12:26:17 | 显示全部楼层
帮顶                  
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
12
金钱
12
注册时间
2022-1-11
在线时间
1 小时
发表于 2022-1-11 09:52:44 | 显示全部楼层
1,把计数值改到500
2,看led信号
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-10-3 22:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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