初级会员
- 积分
- 65
- 金钱
- 65
- 注册时间
- 2023-8-19
- 在线时间
- 14 小时
|
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个计时器模块的),
|