Verilog学习日记2

今天学的是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。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值