verlog测试代码——时钟信号和复位信号产生代码

verlog测试代码——时钟信号和复位信号产生代码

module ();

reg clk,rst_l;//此处定义clk变量(时钟信号),和rst_l变量(复位信号),必须是reg类型,因为测试代码调用模块时:模块中的input类型必须用reg类型传入,(在设计代码调用就不是严格规定为reg类型)
initial//initial表示:其里面写的代码只执行一次
	begin
	clk=1'b1;//表示在0时刻对clk变量赋值为1
	rst_l=1'b0;//对复位信号赋值为0,因为复位信号都是低电平有效,赋值为0,表       示在0时刻开始复位,本处用到的"#x(x是数字)”表示后面代码延迟多少个x个时刻执行,想具体聊解可以查阅书籍
	
	#3rst_l=1'b1;//3时刻复位信号为1,表示在3时刻结束复位,可以按照正常时钟信号运行程序了
end

always#5//always表示每过时刻都执行一次,这里添加了#5,表示每过5个时刻执行一次,本处功能是:每过5个时刻对时钟信号翻转,产生周期为10个时刻的时钟信号
	clk=~clk;


endmodule

另外版本

module ();
//和上面的区别在于:我对时钟信号和复位信号名字定义,不一样,这里用到sys_clk_in,sys_rst_n是和约束文件的时钟信号名称一样,
reg sys_clk_in,sys_rst_n;
initial
begin
sys_clk_in=1'b1;
sys_rst_n=1'b0;

#3sys_rst_n=1'b1;
end

always#5
sys_clk_in=~sys_clk_in;


endmodule
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个万年历的FPGA课程设计的Verilog代码和仿真: ``` module calendar( input clk, // 时钟信号 input reset, // 复位信号 output reg [3:0] year, // 年份 output reg [3:0] month, // 月份 output reg [4:0] day, // 日 output reg [2:0] week // 星期 ); // 闰年判断 wire leap_year = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); // 每月天数 reg [6:0] days_in_month; always @(*) begin case (month) 4, 6, 9, 11: days_in_month = 30; 2: days_in_month = leap_year ? 29 : 28; default: days_in_month = 31; endcase end // 日历计算 reg [5:0] day_count; reg [2:0] day_of_week; always @(posedge clk or posedge reset) begin if (reset) begin year <= 0; month <= 1; day <= 1; week <= 0; day_count <= 0; day_of_week <= 0; end else begin if (day_count == 0) begin day_count <= 1; day_of_week <= (day_of_week == 6) ? 0 : day_of_week + 1; if (day == days_in_month) begin day <= 1; if (month == 12) begin month <= 1; year <= year + 1; end else begin month <= month + 1; end end else begin day <= day + 1; end end else begin day_count <= day_count + 1; end week <= (day_count + day_of_week) % 7; end end endmodule ``` 在上面的代码中,我们使用了一个状态机来计算每一天的日期和星期。在每个时钟上升沿,我们检查当前是否需要更新日历,以及更新哪些日期和星期。我们还使用一个闰年标志来计算每个月的天数。最后,我们将日历输出到四个输出端口。 以下是一个简单的仿真测试,它显示了日历的输出。在仿真中,我们提供了一个时钟信号一个复位信号,以便在仿真开始时将日历复位为1月1日。 ``` module calendar_tb; reg clk; reg reset; wire [3:0] year; wire [3:0] month; wire [4:0] day; wire [2:0] week; calendar dut( .clk(clk), .reset(reset), .year(year), .month(month), .day(day), .week(week) ); initial begin clk = 0; reset = 1; #10 reset = 0; end always #5 clk = ~clk; initial begin $monitor("%d/%d/%d %d", year, month, day, week); #100 $finish; end endmodule ``` 在上面的仿真测试中,我们使用了一个monitor语句来跟踪日历的输出,并在仿真完成时结束仿真。我们还提供了一个时钟复位信号以启动仿真。 希望这个代码和仿真对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值