今天学的是FPGA的并行性
首先实例1,分别实现4位加法器
`timescale 1ns/1ps
module vlg_design_ex1(
input i_clk,
input i_rst_n,
output[3:0] o_cnt1,o_cnt2
);
reg[3:0] r_cnt1,r_cnt2;
always @(posedge i_clk)
if(!i_rst_n) r_cnt1 <= 'b0;
else r_cnt1 <= r_cnt1+1'b1;
always @(posedge i_clk)
if(!i_rst_n) r_cnt2 <= 'b0;
else r_cnt2 <= r_cnt2+1'b1;
assign o_cnt1 = r_cnt1;
assign o_cnt2 = r_cnt2;
endmodule
再写实例一花费我的时间最长,因为要正规自己的代码,所以在改变了CLK的名字后,我发现运行总是没有数据,于是我去了testbench中又做了修改,testbench中的修改比较简单,你只需要重新例化时钟和复位型号的名字即可;下面是我的testbench文件。
/
`timescale 1ns/1ps
module testbench_top();
//参数定义
`define CLK_PERIORD 10 //时钟周期设置为10ns(100MHz)
//接口申明
reg clk;
reg rst_n;
reg[3:0] i_cnt;
wire[3:0] o_cnt1,o_cnt2;
//对被测试的设计进行例化
/*
vlg_design_ex1 uut_vlg_design_ex1(
.i_clk(clk),
.i_rst_n(rst_n),
.o_cnt1(o_cnt1),
.o_cnt2(o_cnt2)
);
*/
vlg_design_ex3 uut_vlg_design_ex3(
.i_clk(clk),
.i_rst_n(rst_n),
.i_cnt(i_cnt),
.o_cnt1(o_cnt1),
.o_cnt2(o_cnt2)
);
//复位和时钟产生
//时钟和复位初始化、复位产生
initial begin
clk <= 0;
rst_n <= 0;
i_cnt <= 0;
#1000;
rst_n <= 1;
@(posedge clk);//每个上升沿变化
#2;
i_cnt <= 4'd1;
@(posedge clk);//每个上升沿变化
#2;
i_cnt <= 4'd2;
@(posedge clk);//每个上升沿变化
#2;
i_cnt <= 4'd3;
@(posedge clk);//每个上升沿变化
#2;
i_cnt <= 4'd4;
end
//时钟产生
always #(`CLK_PERIORD/2) clk = ~clk;
//测试激励产生
initial begin
@(posedge rst_n); //等待复位完成
@(posedge clk);
repeat(300000) begin
@(posedge clk);
end
$stop;
end
endmodule
结果:
实例2如下
`timescale 1ns/1ps
module vlg_design_ex2(
input i_clk,
input i_rst_n,
input[3:0] i_cnt,
output[3:0] o_cnt1,o_cnt2
);
reg[3:0] r_cnt1,r_cnt2;
always @(posedge i_clk)
if(!i_rst_n) begin
r_cnt1 <= 'b0;
r_cnt2 <= 'b0;
end
else begin
r_cnt1 <= i_cnt;
r_cnt2 <= i_cnt;
end
assign o_cnt1 = r_cnt1;
assign o_cnt2 = r_cnt2;
endmodule
这两个实例写完,得到的结论是不管是在always语句内还是在两个always语句外,都是保持并行的状态是同时运行的状态。下面是特权同学给的练习题,直接在实例2中改变一下代码即可。
练习:
`timescale 1ns/1ps
module vlg_design_ex3(
input i_clk,
input i_rst_n,
input[3:0] i_cnt,
output[3:0] o_cnt1,o_cnt2
);
reg[3:0] r_cnt1,r_cnt2;
always @(posedge i_clk)
if(!i_rst_n) begin
r_cnt1 <= 'b0;
r_cnt2 <= 'b0;
end
else begin
r_cnt1 <= i_cnt;
r_cnt2 <= r_cnt1;
end
assign o_cnt1 = r_cnt1;
assign o_cnt2 = r_cnt2;
endmodule
今天对于FPGA的学习没有昨天的头脑风暴,昨天的一道时钟选择器让我实现了接近两个多小时,keep moving。。。