〇、功能介绍
1.功能描述
8个Led灯以0.5s的的速率循环闪烁,调用三八译码器模块完成该设计。
三八译码器模块见https://blog.csdn.net/weixin_42454243/article/details/122039239 《小梅哥Xilinx FPGA学习笔记2——三八译码器》
一、代码编写
1.设计文件
设计文件共两个,一个pipeline_led.v文件;一个decoder_3_8.v文件
`timescale 1ns / 1ns
module pipeline_led(clk,reset_n,led
);
input clk;
input reset_n;
output [7:0] led;
reg [24:0] counter;
//计数器进程
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter <=0;
// else if(counter==25000000-1)
else if(counter==8'd24999) //缩小仿真时间,验证功能
counter <=0;
else
counter <=counter +1'b1;
reg [2:0] counter2;//用3种状态控制8个led灯
always@(posedge clk or negedge reset_n)
if(!reset_n)
counter2 <=0;
// else if(counter2 ==7)
// counter2 <=0;
else if(counter==8'd24999)
counter2 <=counter2 +1'b1; //当counter2 ==7 时,自动溢出变成0
//调用其他的子模块
decoder_3_8 decoder_3_8_inst0(
.a(counter2[2]),//是因为decoder_3_8子模块中的位拼接,a是最高位,c是最低位
.b(counter2[1]),
.c(counter2[0]),
.out(led)//使用调用模块的功能,对于在该设计文件输出则不需要定义reg型,是因为在子模块中已经对out进行了reg定义,out在此模块中是隐藏的wire。
);
endmodule
2.激励文件
`timescale 1ns / 1ns
module pipeline_led_tb( );
reg clk;
reg reset_n;
wire [7:0]led;
pipeline_led pipeline_led(
.clk(clk),
.reset_n(reset_n),
.led(led)
);
initial clk=1;
always #10 clk=~clk;//建立仿真时钟信号
initial begin
reset_n=0;
#201;
reset_n=1;
#4000000000;
$stop;
end
endmodule
3.仿真图
仿真图是以(counter==8’d24999时,counter <=0;)为基准的仿真,横坐标一个大刻度2ms,led灯0.5ms亮一次
(24999+1)*20ns=0.5ms //一个时钟周期为20ns
//计数器进程
// else if(counter==25000000-1) //500ms的正确语句
else if(counter==8'd24999) //缩小仿真时间,验证功能,与下一条语句是相同的意思
// else if(counter==24999) //缩小仿真时间,验证功能
//………………………………
//led进程
// else if(counter==25000000-1)begin //500ms的正确语句
else if(counter==8'd24999)begin //缩小仿真时间,验证功能,与下一条语句是相同的意思
// else if(counter==24999)begin //缩小仿真时间,验证功能
二、总结
1.调用子decoder_3_8的时候,对其端口进行例化
//调用其他的子模块
decoder_3_8 decoder_3_8_inst0(
.a(counter2[2]),//是因为decoder_3_8子模块中的位拼接,a是最高位
.b(counter2[1]),
.c(counter2[0]),//是因为decoder_3_8子模块中的位拼接,c是最低位
.out(led)//使用调用模块的功能,对于在该设计文件输出则不需要定义reg型,是因为在子模块中已经对out进行了reg定义,out在此模块中是隐藏的wire。
);
2.在pipeline_led.v中,输出不需要定义成reg型;是因为在decoder_3_8子模块中已经对out进行了reg定义,out在pipeline_led模块中是隐藏的wire。
//在pipeline_led中
output [7:0] led;
//在decoder_3_8中
output [7:0] out;
reg [7:0] out;
后记:失之东隅,收之桑榆。