vivado中,因模块之间的reset不“对应”,导致的运行结果与预期不同。

学习笔记:关于 reset:

在vivado设计的程序里,有顶层文件和调用的模板当中都有reset时,要注意两者reset是否能“对应”上。不然可能导致一个当中reset=1时是复位,另一个reset=1时,却是正常运行的时候。出现矛盾,运行就可能会达不到理想结果。而且还没有报错。

(在做流水线加法器时,遇到的问题)
例如,输出一直为0,因为reset=0时,顶层文件时钟开始计时;但是被调用的模板中的reset=0时,输出会一直被设置成为0,即不会开始计算。
如下图片:

scan_led_hex_disp
adder_pipeline_32bit_2level

(流水线加法器中的部分代码,老师要求自己实现加法,不能用系统自带的“+”)

更正后的代码:

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/11/17 17:11:12
// Design Name: 
// Module Name: scan_led_hex_disp
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module scan_led_hex_disp(
    input clk,
    input reset,
    input [3:0] hex0, //第一个数码管显示的数字
    input [3:0] hex1,
    //input [3:0] hex2,
    //input [3:0] hex3,
    //input [3:0] dp_in, //小数点控制
    output reg [3:0] an,   //片选,使能端
    output reg [7:0] sseg, //段选
    input c0,
    output C32,
    output Gm,    //进位产生标志(该输出为1时,不管c0真值情况,一定会进位)
    output Pm      //进位传递标志(该输出为1时,需要c0为1,才会进位)
    );
	
	wire [32:1] hex3;
	
	localparam N = 18; //使用低16位对50Mhz的时钟进行分频(50MHZ/2^16)
	reg [N-1:0] regN; //高两位作为控制信号,低16位为计数器,对时钟进行分频
	reg [3:0] hex_in; //段选控制信号
	reg dp;
	wire dp_operator,dp_result; 
	
	adder_substractor_32 adder_substractor_32(
	.in1({28'b0,hex0}),
	.in2({28'b0,hex1}),
	.add_sub(c0),
	.Gm(Gm),
	.Pm(Pm),
	.sum(hex3),
	.c32(C32),
	.clk(clk),
    .rst_n(reset)
	);
	
	assign dp_operator=c0,
	        dp_result=c0&&(~C32);         
	        //用七段数码管上的小数点代表该数是否为负数
	
	always@(posedge clk, posedge reset)
	begin
		if(reset)
			regN <= 0;
		else
			regN <= regN + 1;
	end
	
	always@ *
	begin
		case(regN[N-1:N-2])
		2'b00:begin
			an = 4'b0111; //选中第1个数码管
			hex_in = hex0; //数码管显示的数字由hex_in控制,显示hex0输入的数字;
			dp = 0; //控制该数码管的小数点的亮灭
		end
		2'b01:begin
			an = 4'b1011; //选中第二个数码管
			hex_in = hex1;//数码管显示的数字由hex_in控制,显示hex1输入的数字;
			dp = dp_operator;
		end
		2'b10:begin
			an = 4'b1110;//选中第三个数码管
			hex_in = hex3[4:1];//数码管显示的数字由hex_in控制,显示hex3输入的数字;
			dp = dp_result;
		end
		default:begin
			an = 4'b1110;//选中第四个数码管
			hex_in = hex3[4:1];//数码管显示的数字由hex_in控制,显示hex3输入的数字;
			dp = dp_result;
		end
		
		endcase
	
	end
	always@ *
	begin
		case(hex_in)
			4'h0: sseg[6:0] = 7'b0000001; //共阳极数码管
			4'h1: sseg[6:0] = 7'b1001111;
			4'h2: sseg[6:0] = 7'b0010010;
			4'h3: sseg[6:0] = 7'b0000110;
			4'h4: sseg[6:0] = 7'b1001100;
			4'h5: sseg[6:0] = 7'b0100100;
			4'h6: sseg[6:0] = 7'b0100000;
			4'h7: sseg[6:0] = 7'b0001111;
			4'h8: sseg[6:0] = 7'b0000000;
			4'h9: sseg[6:0] = 7'b0001100;
			4'ha: sseg[6:0] = 7'b0001000;
			4'hb: sseg[6:0] = 7'b1100000;
			4'hc: sseg[6:0] = 7'b1110010;	
			4'hd: sseg[6:0] = 7'b1000010;
			4'he: sseg[6:0] = 7'b0110000;
			4'hf: sseg[6:0] = 7'b0111000;
			default: sseg[6:0] = 7'b0111000;
		endcase
	    	sseg[7] = ~dp;
	end
endmodule


`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2022/11/12 22:04:34
// Design Name: 
// Module Name: adder_pipeline_32bit_2level
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module adder_pipeline_32bit_2level(A,B,clk,reset,FinalSum,ci,co,px1,gx1,px2,gx2);
input clk,reset;
input [31:0] A,B;
output [31:0] FinalSum;
input          ci;
output         co;
output wire px1,gx1,px2,gx2;
/**************************************/
wire carry_d1;
reg [15:0] Lsum_d1;
wire [15:0] Lsum_d1_nxt;
reg [15:0] Lsum_d2;
reg [15:0] Aup_d1,Bup_d2;
reg [15:0] Usum_d2;
wire [15:0] Usum_d2_nxt;
wire [31:0] FinalSum;
/**************************************/
  wire c16;
  assign c16 = gx1 ^ (px1 && ci),//c0 = 0
         co = gx2 ^ (px2 && c16);



  CLA_16 CLA1(              //assign Lsum_d1_nxt = A[15:0] + B[15:0];
      .A(A[15:0]),
		.B(B[15:0]),
		.c0(ci),
		.S(Lsum_d1_nxt),
		.px(px1),
		.gx(gx1)
	);



    CLA_16 CLA2(             //assign Usum_d2_nxt = carry_d1 + Aup_d1 + Bup_d2;
        .A(Aup_d1),
		  .B(Bup_d2),
		  .c0(carry_d1),
		  .S(Usum_d2_nxt),
		  .px(px2),
		  .gx(gx2)
	);

//assign Lsum_d1_nxt = A[15:0] + B[15:0];
assign carry_d1 = c16;
//assign Usum_d2_nxt = carry_d1 + Aup_d1 + Bup_d2;
assign FinalSum = {Usum_d2,Lsum_d2};
/**************************************/
always@(posedge clk or negedge reset)begin
 if(reset)begin
  Lsum_d1 <= 0;
  Lsum_d2 <= 0;
  Aup_d1 <= 0;
  Bup_d2 <= 0;
  Usum_d2 <= 0;
 end
 else begin
  Lsum_d1 <= Lsum_d1_nxt;
  Lsum_d2 <= Lsum_d1[15:0];
  Aup_d1 <= A[31:16];
  Bup_d2 <= B[31:16];
  Usum_d2 <= Usum_d2_nxt;
 end
end
endmodule

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在Vivado,可以通过以下步骤查看模块对应的连线图: 1. 打开Vivado软件,点击"工程管理器"选项卡。 2. 在"工程管理器"窗口,找到需要查看连线图的模块或设计文件。 3. 右键点击该模块或设计文件,选择"Open Block Design"。 4. 这将打开设计视图,显示模块的顶层设计。 5. 在设计视图窗口,可以看到模块的各个组件以及它们之间的连接。 6. 如果想查看具体的连线细节,可以双击打开某个组件,然后选择"管脚规划视图"。 7. 在管脚规划视图,可以查看该组件的所有输入输出管脚以及它们的连接关系。 8. 如果想进一步了解连线的物理布局,可以选择"布局视图"。 9. 在布局视图,可以看到设计各个组件的位置和它们之间的连线布局。 10. 通过上述步骤,可以在Vivado查看模块对应的连线图,以便进行设计分析和调试。 希望以上内容对您有帮助! ### 回答2: Vivado是一款高级综合(HLS)和逻辑综合工具,用于进行FPGA的设计和实现。如果要查看模块对应的连线图(也称为布局图或位图),可以按照以下步骤操作: 1. 打开Vivado设计工具,并打开你要查看的项目。 2. 在左侧的“Flow Navigator”面板,选择“Implementation”选项卡。 3. 在“Design Runs”面板,选择你要查看的设计运行,并点击右键选择“Open Implemented Design”。 4. 在“Open Implemented Design”对话框,选择“Schematic”选项,并点击“OK”按钮。 5. Vivado将打开一个新的窗口,显示模块对应的连线图。 在连线图,你可以看到模块及其内部的各个组件如何相互连接起来。你可以通过放大、缩小、拖动等操作来查看图的细节。此外,你还可以使用Vivado提供的其他功能来分析设计的性能和资源使用情况。 需要注意的是,连线图只是一个静态的展示,它主要用于设计验证和调试目的。要获取更详细的信息,比如查看特定信号路径上的时序信息,你可能需要使用更高级的功能或工具,例如时序分析器或信号提取器。 ### 回答3: Vivado是一款Xilinx公司的集成电路设计软件,可以用于FPGA设计和开发。如果要查看模块对应的连线图,可以按照以下步骤进行操作: 1. 打开Vivado软件,创建或打开一个项目。 2. 在工程视图,展开设计目录,找到你想要查看的模块模块通常以.vhd或者.v文件的形式存在。 3. 双击打开该模块文件,在设计视图显示模块的源代码。 4. 在左侧的任务导航窗格,选择"Sources"选项卡,展开你的模块文件。 5. 找到你想要查看连线图的模块,右键点击,并选择"Open Block Design"选项。这将打开该模块对应的块设计界面。 6. 在块设计界面,你可以看到该模块的各个输入输出端口,在图上用箭头表示连线的方向。这些箭头向外延伸到其他模块。 7. 你可以点击箭头和端口来查看它们之间的信号名称、宽度和连接关系。你还可以通过拖拽和放大缩小画布来查看较大的连线图。 通过以上步骤,你就可以在Vivado查看模块对应的连线图了。这个功能可以帮助你更好地理解和调试你的设计。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗娜mei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值