电子万年历Verilog代码远程云端平台Quartus

名称:电子万年历Verilog代码远程云端平台Quartus

软件:Quartus

语言:Verilog

代码功能:

任务及要求

1设计内容和要求(包括设计内容、主要指标与技术参数)

设计内容:基于FPGA的电子万年历的设计。

设计要求

(1)设计语言为 Verilog.

(2)设计基于FPGA的电子万年历的设计:要求可以显示年、月、日;同时可以整年、月

日:注意闰年。

(3)采用层次化的设计。

本代码已在远程云端平台验证,远程云端平台如下,其他远程云端平台可以修改管脚适配:

远程平台照片.png

1. 工程文件

2. 程序文件

3. 程序编译

4. RTL图

5. 管脚分配

6. 仿真文件(VWF)

7. 仿真图

部分代码展示:

//万年历
`timescale  1ns/100ps
module calendar
(
input  CLK,
input  RST,
input day_add,//天加
input day_sub,//天减
input month_add,//月加
input month_sub,//月减
input year_add,//年加
input year_sub,//年减
output reg [7:0]   year_h,//年高位
output reg [7:0]   year_l,//年低位
output reg [3:0]   month,//月
output reg [4:0]   day//天
);
reg month_add_cin=0;
reg month_sub_cin=0;
reg year_add_cin=0;
reg year_sub_cin=0;
reg [4:0]   day_max  =  5'd30;//定义月最大天数
always@(posedge CLK or posedge RST)
begin
  if (RST)
day_max <= 5'd30;
  else
if(!(year_l[1:0] == 0 & year_l !=0 | year_h[1:0] ==0 & year_l ==0)&(month == 2))
day_max <= 5'd28;//非闰年2月
else if((year_l[1:0] == 0 & year_l !=0 | year_h[1:0] ==0 & year_l ==0)&(month == 2))
day_max <= 5'd29;//闰年2月
else if((month == 4)|(month == 6)|(month == 9)|(month == 11))
day_max <= 5'd30;//小月
else if((month == 1)|(month == 3)|(month == 5)|(month == 7)|(month == 8)|(month == 10)|(month == 12))
day_max <= 5'd31;//大月
else
day_max <= 5'd30;
end
//调整天------------------------------------------------------------------------------
always@(posedge CLK or posedge RST)
    if (RST)
day <= 5'd1;
    else
if(day_add)//加
if(day>=day_max)
begin
day <= 5'd1;
month_add_cin<=1;//月进1
end
else
begin
day <=day + 5'd1;
   month_add_cin<=0;
end
else if(day_sub)//减
if(day==5'd1)
begin
day <= day_max;
   month_sub_cin<=1;//月减1
end
else 
begin
day <=day - 5'd1;
   month_sub_cin<=0;//
end
else if(day>=day_max)begin
day <=day_max;
month_add_cin<=0;
month_sub_cin<=0;//
end
else
   begin
day <=day;
month_add_cin<=0;
month_sub_cin<=0;//
end
//调整月------------------------------------------------------------------------------
always@(posedge CLK or posedge RST)
    if (RST)
month <= 4'd1;
    else
if(month_add | month_add_cin)//加
if(month>=4'd12)//12月
begin
month <= 4'd1;
   year_add_cin<=1;//年加1
end
else
begin
month <=month + 4'd1;
   year_add_cin<=0;//
end
else if(month_sub | month_sub_cin)//减
if(month==4'd1)
begin
month <= 4'd12;
   year_sub_cin<=1;//年减1
end
else
begin
month <=month - 4'd1;
year_sub_cin<=0;
end
else
begin
month <=month;
year_add_cin<=0;//
year_sub_cin<=0;
end
//调整年------------------------------------------------------------------------------
always@(posedge CLK or posedge RST)
    if (RST)
begin//复位到2019年
year_l <= 8'd19;//年低位
year_h <= 8'd20;//年高位
end
    else
if(year_add | year_add_cin)//年加
if(year_l==8'd99 && year_h==8'd99)//9999年
begin
year_l <= 8'd0;
year_h <= 8'd0;
end
else if(year_l==8'd99)//99年
begin
year_l <= 8'd0;
year_h <=year_h + 8'd1;
end
else//低位加1
begin
year_l <=year_l + 8'd1;
year_h <=year_h;
end
else if(year_sub | year_sub_cin)//年减
if(year_l==8'd00 && year_h==8'd00)//0000年
begin
year_l <= 8'd0;
year_h <= 8'd0;
end
else if(year_l==8'd00)//00年
begin
year_l <= 8'd99;
year_h <=year_h - 8'd1;
end
else//低位减1
begin
year_l <=year_l - 8'd1;
year_h <=year_h;
end
else
begin
year_l <=year_l;
year_h <=year_h;
end
endmodule
源代码

 扫描文章末尾的公众号二维码

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 假设以下Verilog代码是一个简单的4位加法器: ``` module adder(input [3:0] A, B, output reg [3:0] sum); always @ (A or B) sum <= A + B; endmodule ``` 下面是一个对应的testbench文件,使用了Quartus II的SystemVerilog语法: ``` module testbench; // Declare the signals logic [3:0] A; logic [3:0] B; logic [3:0] sum; // Instantiate the DUT adder dut(.A(A), .B(B), .sum(sum)); // Initialize the inputs initial begin A = 2'b00; B = 2'b00; end // Apply test vectors always #5 A = A + 1; always #7 B = B + 1; // Monitor the outputs always @(sum) $display("sum = %d", sum); endmodule ``` 该testbench文件中,首先声明了输入和输出信号,然后实例化了被测设备,并初始化了输入。接着,使用SystemVerilog语法分别在5个时间单位和7个时间单位后改变A和B的值,模拟输入的变化。最后,使用always块监视sum的变化,并打印其值。 ### 回答2: 在quartusii中编写testbench文件是为了对Verilog代码进行仿真和验证。下面是一个简单的testbench文件示例,用于对给定的Verilog代码进行仿真。 ```verilog // 定义testbench模块 module testbench; // 导入需要测试的模块 reg clk; wire out; // 这里假设需要测试的模块名称为"module_name" module_name dut(clk, out); // 定义时钟周期 parameter CLK_PERIOD = 10; // 定义测试时钟 always begin clk = 0; #((CLK_PERIOD)/2); clk = 1; #((CLK_PERIOD)/2); end // 定义刺激信号 initial begin // 在时钟的上升沿之前给予输入信号初值 // 这里假设输入信号为input1和input2 input1 = 1'b0; input2 = 1'b1; // 等待一个周期,使输入信号稳定 #CLK_PERIOD; // 输出测试结果 $display("Output: %b", out); // 终止仿真 $finish; end endmodule ``` 在以上testbench文件中,需要根据实际情况修改以下内容: 1. 将"module_name"替换为需要测试的模块的名称。 2. 根据需要修改输入信号的初始值和时钟周期。 这样,你可以将以上testbench代码输入到quartusii中进行仿真,并获取输出结果。 ### 回答3: 在Quartus II中编写testbench文件可以用于模拟和验证Verilog代码的功能。以下是一个示例: ```verilog module example ( input wire a, input wire b, output wire c ); assign c = a & b; endmodule ``` 对应的testbench文件可以如下所示: ```verilog module example_tb; // 定义仿真时间和模块实例 reg a, b; wire c; example dut ( .a(a), .b(b), .c(c) ); // 模块实例的行为 initial begin // 初始化输入 a = 0; b = 0; // 延迟一定时间以使信号稳定 #10; // 改变输入值并触发模块运行 a = 1; b = 1; #10; a = 0; b = 1; #10; $finish; end // 显示模块输出的值 always @(c) begin $display("c = %b", c); end endmodule ``` 在这个testbench文件中,我们首先实例化了需要测试的`example`模块,并定义输入和输出信号。然后,在`initial`块中,我们初始化输入信号,并在一定时间后改变输入值,触发模块的运行。通过`$display`语句,我们可以在仿真过程中显示模块输出的值。最后,使用`$finish`指令标记仿真的结束。 请注意,这只是一个简单的示例,具体的testbench文件可能需要更多的测试用例和更复杂的仿真过程,以验证模块的各种功能和边界情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值