OpenEdv-开源电子网

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

[XILINX] 领航者7020呼吸灯的拓展训练疑问

[复制链接]

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2023-8-19
在线时间
14 小时
发表于 2023-8-23 18:36:48 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 栗栗栗子 于 2023-8-23 18:39 编辑

视频中的思路是说可以编写一个顶层模块然后对呼吸灯模块例化两次,然后在例化两个模块的同时将参数也进行例化,通过给两个模块例化不同的参数来控制呼吸灯的频率。对此我尝试根据上述思路进行编写代码,但是我有以下三点疑问:

1. 我的实践步骤是重新编写了一个顶层模块,对呼吸灯模块例化的两次,但是在更改参数时发现只能写入之前在呼吸灯模块定义好的2s呼吸灯的参数,比如想定义4s的频率,如果只更改例化中的参数值是不行的,我发现是因为4us对应的数据位宽是不一样的,此时是不是需要重新编写4s对应的呼吸计时器模块呀?
下面是我更改后的代码:
顶层代码:
module top_double_breath_led(
    input              sys_clk,
    input              sys_rst_n,
    output   [1:0]  led
    );

parameter  CNT_2US_MAX = 7'd100;
parameter  CNT_2MS_MAX = 10'd1000;
parameter  CNT_2S_MAX  = 10'd1000;


double_breath_led #(
    .CNT_2US_MAX   (CNT_2US_MAX),
    .CNT_2MS_MAX   (CNT_2MS_MAX),
    .CNT_2S_MAX    (CNT_2S_MAX)
)
  u_double_breath_led0(
    .sys_clk       (sys_clk   ),
    .sys_rst_n     (sys_rst_n ),
    .led           (led[0]    )   
    );

double_breath_led #(
    .CNT_2US_MAX   (CNT_2US_MAX),   //在这里原本是想定义4s的频率,就是在上面parameter处加上4us,4ms,4s,但是发现直接定义parameter后传参是不行的
    .CNT_2MS_MAX   (CNT_2MS_MAX),
    .CNT_2S_MAX    (CNT_2S_MAX)
)
u_double_breath_led1(
    .sys_clk       (sys_clk   ),
    .sys_rst_n     (sys_rst_n ),
    .led           (led[1]    )
    );

endmodule



2. 如果可以通过直接例化两次参数实现改变呼吸灯的频率,那么tb文件对于参数该如何例化呢?可以直接像一个呼吸灯那样直接例化吗?
下面是我编写的tb文件代码(两个呼吸灯频率都是一样的,所以就直接例化了一次)
`timescale  1ns/1ns   //仿真的单位/仿真的精度

module tb_top_double_breath_led();

parameter   CLK_PERIOD = 20;

parameter  CNT_2US_MAX = 7'd1;
parameter  CNT_2MS_MAX = 10'd10;
parameter  CNT_2S_MAX  = 10'd10;

reg            sys_clk;      //周期20ns
reg            sys_rst_n;

wire    [1:0]   led;

initial begin
    sys_clk   <= 1'b0;
    sys_rst_n <= 1'b0;
    #200
    sys_rst_n <= 1'b1;
end

always #(CLK_PERIOD/2) sys_clk = ~sys_clk;   //每隔10ns取反一次,等到一个周期为20ns,频率为50MHz的一个时钟


top_double_breath_led #(
    .CNT_2US_MAX   (CNT_2US_MAX),     
    .CNT_2MS_MAX   (CNT_2MS_MAX),
    .CNT_2S_MAX    (CNT_2S_MAX )
)
u_top_double_breath_led(
    .sys_clk       (sys_clk),
    .sys_rst_n     (sys_rst_n),
    .led           (led      )
    );

endmodule


3. 在进行编译仿真的时候发现,在顶层模块和tb文件中对led的定义都是需要定义成wire类型,而在呼吸灯模块中则需要定义成reg类型,如果将顶层模块和tb文件中的led定义成reg类型则会报错,这是为啥呢?




















最佳答案

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

https://blog.csdn.net/qq_37858023/article/details/116505787 https://blog.csdn.net/kofiliu2018/article/details/128260502 是需要重新编写对应的呼吸计时器模块的(就是2个计时器模块的),
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2021-10-6
在线时间
5 小时
发表于 2023-8-23 18:36:49 | 显示全部楼层
回复

使用道具 举报

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2023-8-19
在线时间
14 小时
 楼主| 发表于 2023-8-25 15:18:44 | 显示全部楼层
18061345209 发表于 2023-8-24 19:15
https://blog.csdn.net/qq_37858023/article/details/116505787
https://blog.csdn.net/kofiliu2018/artic ...

okok,感谢解答,豁然开朗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-10-4 08:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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