头疼腿疼腰椎疼的 2023-12-14 01:36 采纳率: 66.7%
浏览 30
已结题

verilog秒表计时器

img

img

img

img

img

img

img

img


有没有家人可以帮我看看这个要怎么改啊 或者还要怎么写 需要增删东西吗


module lab_ledseg(
    input wire clk,
    input wire rst,
    input wire stop,
    output wire [3:0] dataout1,  // 个位
    output wire [3:0] dataout2   // 十位
);

    reg [3:0] data1 = 0;  // 初始化个位
    reg [3:0] data2 = 0;  // 初始化十位
    reg internal_stop = 0; // 内部自动暂停变量

    always @(posedge clk or negedge rst) begin
        if (!rst) begin
            data1 <= 0;
            data2 <= 0;
            internal_stop <= 0; // 在复位时清除内部暂停标志
        end else if (!(stop || internal_stop)) begin
            if (data1 == 4'b1001) begin
                if (data2 == 4'b1001) begin
                    internal_stop <= 1; // 当计数达到99时,设置内部停止信号
                    // data1和data2保持不变,因此计数器显示99
                end else begin
                    data1 <= 0;
                    data2 <= data2 + 1;
                end
            end else begin
                data1 <= data1 + 1;
            end
        end
    end

    assign dataout1 = data1;
    assign dataout2 = data2;

endmodule


module jishiqi
(
   input rst,clk,stop,
    output wire [6:0] seg1,seg2,
    output wire [1:0] dot, sel
    );
wire [3:0] dataout1,dataout2;
wire clkout;
wire stop1=~stop;
jishiqi devide(
     .clkout(clkout),
      .clk(clk),
      .rst_n(rst));
lab_ledseg excounter(
      .clk(clkout),
      .rst(rst),
      .stop(stop1),
      .dataout1(dataout1),
      .dataout2(dataout2));
lab_ledsegg dc1(
   .in(dataout1),
    .seg(seg1)) ;
lab_ledsegg dc2(
    .in(dataout2),
     .seg(seg2));
    assign dot = 2'b01;
    assign sel = 2'b00;
endmodule

module seg7dc(
 input[3:0] in,
 output[6:0] seg);
 assign seg=(in==4'b0000)?7'b0111111:
    (in==4'b0001)?7'b0000110:
    (in==4'b0010)?7'b1011011:
    (in==4'b0011)?7'b1001111:
    (in==4'b0100)?7'b1100110:
    (in==4'b0101)?7'b1101101:
    (in==4'b0110)?7'b1111101:
    (in==4'b0111)?7'b0000111:
    (in==4'b1000)?7'b1111111:
    (in==4'b1001)?7'b1101111:
    (in==4'b1010)?7'b1110111:
    (in==4'b1011)?7'b1111100:
    (in==4'b1100)?7'b0111001:
    (in==4'b1101)?7'b1011110:
    (in==4'b1110)?7'b1111001:7'b1110001;
endmodule 

module excounter(
    input wire clk,rst,
    output wire[3:0] dataout
);
reg[3:0] data;
always@(negedge rst or posedge clk)begin
    if(!rst)begin
            data<=4'b0000;
    end
    else begin
            if(data==4'hf)
                data<=4'h0;
            else
                data<=data+4'h1;
    end
end

assign dataout=(~data);

endmodule


module devide #
(
    parameter WIDTH=24,
    parameter N=12000000
)
(
    input clk,
    input rst_n,
    output clkout
);
reg [WIDTH-1:0] cnt_p,cnt_n;
reg clk_p,clk_n;

always @(posedge clk or negedge rst_n)
    begin 
        if(!rst_n)
            cnt_p<=1'b0;
        else if(cnt_p==(N-1))
            cnt_p<=1'b0;
        else 
            cnt_p<=cnt_p+1'b1;
    end
always @(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            clk_p<=1'b0;
        else if(cnt_p<(N>>1))
            clk_p<=1'b0;
        else
            clk_p<=1'b1;
    end
always @(posedge clk or negedge rst_n)
    begin
        if(!rst_n)
            cnt_n<=1'b0;
        else if(cnt_n==(N-1))
            cnt_n<=1'b0;
        else
            cnt_n<=cnt_n+1'b1;
    end
always @(posedge clk or negedge rst_n)
    begin 
        if(!rst_n)
            clk_n<=1'b0;
        else if(cnt_n<(N>>1))
            clk_n<=1'b0;
        else
            clk_n<=1'b1;
    end

wire clk1=clk;
wire clk2=clk_p;
wire clk3=clk_p & clk_n;

assign clkout = (N==1)? clk1:(N[0]? clk3:clk2);
endmodule
  • 写回答

16条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-12-14 01:36
    关注
    获得0.45元问题酬金

    引自强大而免费的微信小程序:皆我知道

    根据实验要求,你已经完成了一个基本的秒表计时器的Verilog代码。在这个基础上,我们可以根据扩展要求进行一些功能的增加。

    1. 增加暂停按钮功能

    你已经定义了一个名为stop的输入信号,可以将其连接到一个按键。在按下该按键时,秒表计时器应该暂停计时。

    修改代码如下:

    module lab_ledseg(
        input wire clk,
        input wire rst,
        input wire stop,
        output wire [3:0] dataout1,  // 个位
        output wire [3:0] dataout2   // 十位
    );
    
        ...
    
        always @(posedge clk or negedge rst) begin
            if (!rst) begin
                ...
            else if (!(stop || internal_stop)) begin
                ...
    
            // 添加暂停功能
            else if (stop) begin
                internal_stop <= 1;
            end
    
        end
    
        ...
    endmodule
    

    2. 增加复位清零功能

    你已经定义了一个名为rst的输入信号,可以将其连接到一个按键。在按下该按键时,秒表计时器应该复位并清零。

    修改代码如下:

    module lab_ledseg(
        input wire clk,
        input wire rst,
        input wire stop,
        output wire [3:0] dataout1,  // 个位
        output wire [3:0] dataout2   // 十位
    );
    
        ...
    
        always @(posedge clk or negedge rst) begin
            if (!rst) begin
                // 在复位时清除所有变量
                internal_stop <= 0;
                data1 <= 0;
                data2 <= 0;
            end else if (!stop && !internal_stop) begin
                ...
            else if (stop) begin
                ...
            end
    
        end
    
        ...
    endmodule
    

    3. 增加显示9.9秒并自动暂停功能

    根据扩展要求,当计时到9.9秒时,秒表应该自动暂停并在数码管上显示9.9。

    修改代码如下:

    module lab_ledseg(
        input wire clk,
        input wire rst,
        input wire stop,
        output wire [3:0] dataout1,  // 个位
        output wire [3:0] dataout2   // 十位
    );
    
        ...
    
        always @(posedge clk or negedge rst) begin
            if (!rst) begin
                ...
            else if (!stop && !internal_stop) begin
                if (data1 == 4'b1001) begin
                    if (data2 == 4'b1001) begin
                        internal_stop <= 1;
                        // 当计数达到99时,设置内部停止信号,并将数码管显示为9.9
                        data1 <= 4'b1001;
                        data2 <= 4'b1001;
                    end else begin
                        ...
                    end
                end else begin
                    ...
                end
            end else if (stop) begin
                ...
            end
    
        end
    
        ...
    endmodule
    

    这些修改可以实现扩展要求中的功能,并使秒表计时器满足要求。请注意在测试时使用适当的时钟和复位信号来观察秒表计时器的功能。如果需要可以增加其他功能,可以根据需求进行修改和扩展。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月22日
  • 修改了问题 12月14日
  • 创建了问题 12月14日