学习笔记:关于 reset:
在vivado设计的程序里,有顶层文件和调用的模板当中都有reset时,要注意两者reset是否能“对应”上。不然可能导致一个当中reset=1时是复位,另一个reset=1时,却是正常运行的时候。出现矛盾,运行就可能会达不到理想结果。而且还没有报错。
(在做流水线加法器时,遇到的问题)
例如,输出一直为0,因为reset=0时,顶层文件时钟开始计时;但是被调用的模板中的reset=0时,输出会一直被设置成为0,即不会开始计算。
如下图片:
(流水线加法器中的部分代码,老师要求自己实现加法,不能用系统自带的“+”)
更正后的代码:
`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