2301_79740218 2023-09-26 14:53 采纳率: 0%
浏览 27
已结题

这个四人抢答器代码哪儿有问题?仿真程序怎么写?

img


这个四人抢答器代码有什么问题?仿真程序怎么写?程序编译是没有问题的,但是在板子上实现不了

  • 写回答

8条回答 默认 最新

  • 忧伤的玩不起 2023-09-26 15:09
    关注

    现在放上去是什么效果呢?

    评论
  • 专家-赤兔[在线] 2023-09-26 15:20
    关注

    引自免费微信小程序-皆我百晓生,希望对题主有所帮助,如有帮助,还望采纳。


    这段代码存在一些问题。以下是我发现的问题和对应的修复建议:

    1. 在always块的if语句条件后面缺少begin和end,需要在if语句的主体部分添加begin和end,以确定代码块的范围。

    2. 第24行的条件错误,应该是if(k3 && winner==4'b0000),而不是if(k2 && winner==4'b0000)

    3. 第32行的条件错误,应该是if(k4 && winner==4'b0000),而不是if(k2 && winner==4'b0000)

    4. 第36行的条件错误,应该是if (s_pulse && s_num != 9 && winner != 0),而不是if(s_num != 9 && winner != 0)

    修复后的代码如下所示:

    module QiangDaqi(clk, rst, start, stop, k1, k2, k3, k4, s_num, winner);
        input clk;  // 时钟
        input rst;  // 复位
        input start;  // 主持人开始键
        input stop;  // 主持人停止键
        input k1;
        input k2;
        input k3;
        input k4;  // 四个抢答者
        output [3:0] s_num;  // 时间显示
        output [3:0] winner;  // ??者显示
        reg [3:0] s_num;
        reg [3:0] winner;
        reg [24:0] con_t;
        reg [3:0] s_pulse;
        parameter frequency_clk = 24;  // 24MHZ
        
        always @(posedge clk or posedge rst) begin
            if (rst) begin  // 复位
                con_t <= 0;
                s_pulse <= 0;
                s_num <= 0;
                winner <= 0;
            end else begin
                if (start) begin  // 时钟分频
                    if (con_t == frequency_clk * 1000000 - 1) begin
                        con_t <= 0;
                    end else begin
                        con_t <= con_t + 1;
                    end
                    
                    if (con_t == 0) begin  // 产生秒脉冲
                        s_pulse <= 1;
                    end else begin
                        s_pulse <= 0;
                    end
                    
                    if (k1 && winner == 4'b0000) begin  // 选手抢答
                        winner <= 4'b0001;
                    end
                    if (k2 && winner == 4'b0000) begin
                        winner <= 4'b0010;
                    end
                    if (k3 && winner == 4'b0000) begin
                        winner <= 4'b0011;
                    end
                    if (k4 && winner == 4'b0000) begin
                        winner <= 4'b0100;
                    end
                    
                    if (s_pulse) begin  // 时间显示
                        if (s_num == 9) begin
                            s_num <= 9;
                        end else begin
                            if (s_num != 9 && winner != 0) begin
                                s_num <= s_num;
                            end else begin
                                s_num <= s_num + 1;
                            end
                        end
                    end
                end else begin
                    if (stop) begin  // 一切停止
                        con_t <= con_t;
                        s_pulse <= s_pulse;
                        s_num <= s_num;
                        winner <= winner;
                    end
                end
            end
        end
    endmodule
    

    至于仿真程序的编写,你可以使用一些Verilog仿真工具,如ModelSim或iverilog。根据你所使用的仿真工具不同,编写仿真程序的语法也会有所不同。

    通常,你需要创建一个顶层模块,然后在该顶层模块中实例化被测试的模块,并提供适当的时钟和输入信号。然后,你可以运行仿真程序并观察输出信号的变化,以验证模块的功能是否正确。

    下面是一个简化的仿真程序示例:

    module QiangDaqi_tb;
        reg clk;
        reg rst;
        reg start;
        reg stop;
        reg k1;
        reg k2;
        reg k3;
        reg k4;
        wire [3:0] s_num;
        wire [3:0] winner;
    
        QiangDaqi uut(.clk(clk), .rst(rst), .start(start), .stop(stop), .k1(k1), .k2(k2), .k3(k3), .k4(k4), 
                     .s_num(s_num), .winner(winner));
    
        initial begin
            // 初始化输入信号
            clk = 0;
            rst = 1;
            start = 0;
            stop = 0;
            k1 = 0;
            k2 = 0;
            k3 = 0;
            k4 = 0;
    
            // 等待时钟上升沿
            #5 rst = 0;
            #5 start = 1;
            #10 start = 0;
    
            // 模拟运行过程,改变输入信号的值
            #20 k1 = 1;  // 抢答者1抢答
            #10 k2 = 1;  // 抢答者2抢答
            #10 k3 = 1;  // 抢答者3抢答
            #10 k4 = 1;  // 抢答者4抢答
    
            #50 stop = 1;  // 主持人停止
            
            // 继续模拟运行更多的时钟周期
            
            $finish;  // 结束仿真
        end
    
        always begin
            #5 clk = ~clk;  // 时钟的周期
        end
    endmodule
    

    这只是一个简单的示例,你可以根据需要自行扩展和修改仿真程序。确保时钟和输入信号的时序正确,并观察输出信号的变化以验证你的模块功能是否正确。

    评论
  • 数据大魔王 2023-09-26 19:30
    关注

    以下是你提供的四人抢答器代码中的修正部分:

    module QiangDaqi(clk, rst, start, stop, k1, k2, k3, k4, s_num, winner);
    input clk;
    input rst;
    input start;
    input stop;
    input k1;
    input k2;
    input k3;
    input k4;
    output [3:0] s_num;
    output [3:0] winner;
    reg [3:0] s_num;
    reg [3:0] winner;
    reg [24:0] cont;
    reg [3:0] s_pulse;
    
    parameter frequency = 24; // 24MHZ
    
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            cont <= 0;
            s_pulse <= 0;
            s_num <= 0;
            winner <= 0;
        end else begin
            if (start) begin
                cont <= cont + 1;
                if (cont >= frequency*10000-1) begin
                    cont <= 0;
                end
                if (cont == 0) begin
                    s_pulse <= 1;
                end else begin
                    s_pulse <= 0;
                    if (k1 && winner == 0) begin
                        winner <= 1;
                    end
                    if (k2 && winner == 0) begin
                        winner <= 2;
                    end
                    if (k3 && winner == 0) begin
                        winner <= 3;
                    end
                    if (k4 && winner == 0) begin
                        winner <= 4;
                    end
                    if (s_pulse) begin
                        if (s_num == 9) begin
                            s_num <= 9;
                        end else begin
                            if (s_num != 9 && winner != 0) begin
                                s_num <= s_num;
                            end else begin
                                s_num <= s_num + 1;
                            end
                        end
                    end
                end
            end else if (stop) begin
                cont <= cont;
                s_pulse <= s_pulse;
                s_num <= s_num;
                winner <= winner;
            end
        end
    end
    endmodule
    

    对于仿真程序,可以使用testbench模块来为主模块提供输入信号并模拟时钟。以下是一个简单的仿真程序的示例:

    module QiangDaqi_tb;
    reg clk;
    reg rst;
    reg start;
    reg stop;
    reg k1;
    reg k2;
    reg k3;
    reg k4;
    wire [3:0] s_num;
    wire [3:0] winner;
    
    QiangDaqi DUT (
        .clk(clk),
        .rst(rst),
        .start(start),
        .stop(stop),
        .k1(k1),
        .k2(k2),
        .k3(k3),
        .k4(k4),
        .s_num(s_num),
        .winner(winner)
    );
    
    initial begin
        clk = 0;
        forever #(5) clk = ~clk; // 10ns的时钟周期,总之根据你的需要调整时钟周期
    end
    
    initial begin
        // 初始化输入信号
        rst = 1;
        start = 0;
        stop = 0;
        k1 = 0;
        k2 = 0;
        k3 = 0;
        k4 = 0;
        #10;
        rst = 0;
        #10;
        start = 1;
        #100;
        stop = 1;
        #100;
        start = 0;
        #100;
        stop = 0;
        #100;
        k1 = 1;
        #100;
        k1 = 0;
        #100;
        k2 = 1;
        #100;
        k2 = 0;
        #100;
        k3 = 1;
        #100;
        k3 = 0;
        #100;
        k4 = 1;
        #100;
        k4 = 0;
        #100;
        $finish;
    end
    
    // 添加测试代码,以检查输出信号的行为
    
    endmodule
    

    在上面的测试程序中,将输入信号的值初始化为所需的模拟行为,并在不同的时间步骤中更改输入信号的值。通过仿真程序,可以观察输出信号s_num和winner的行为。

    评论
  • 心梓知识 2023-09-27 03:03
    关注

    结合GPT给出回答如下请题主参考
    由于您并没有提供四人抢答器的代码,我无法确定代码中可能存在的问题。但通常在板子上实现不了的问题可能是一些低级错误,例如引脚连接错误、缺失电源或信号等。您可以检查您的硬件设计以确定问题所在。

    关于仿真程序,您可以使用Vivado的仿真功能

    评论
  • coder_small_bell 2023-09-27 09:31
    关注

    这个能不能用ide显示啊,这个看着好难受

    评论
  • Leodong. 2023-09-27 10:19
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    这个四人抢答器代码的问题可能出在以下几个方面:

    1. 时钟分频设置不正确:在仿真程序中,需要根据实际的时钟频率来设置时钟分频。请检查frequency变量的值是否正确设置。

    2. 状态机逻辑可能存在问题:在状态机的逻辑判断部分,可能存在一些条件判断错误或者逻辑不清晰的地方。请仔细检查状态转移的条件和顺序。

    3. 输出信号不稳定:在抢答器的实现中,输出信号的稳定性非常重要。请检查是否有稳定的输出信号控制逻辑。

    关于仿真程序的编写,你可以使用Verilog或VHDL等硬件描述语言来实现。以下是一个简单的Verilog仿真示例:

    module QiangDaqi(
        input wire clk,
        input wire rst,
        input wire start,
        input wire stop,
        input wire k1,
        input wire k2,
        input wire k3,
        input wire k4,
        output reg [3:0] s_num,
        output reg winner
    );
    
    // 时钟分频设置
    parameter frequency = 24; // 24MHz
    localparam TARGET_FREQUENCY = 50000000; // 目标时钟频率,根据实际情况调整
    
    reg [23:0] counter;
    reg [3:0] s_pulse;
    reg [3:0] winner_state;
    
    always @(posedge clk or posedge rst) begin
        if (rst) begin
            counter <= 0;
            s_pulse <= 0;
            winner_state <= 0;
        end else begin
            if (start) begin
                if (counter == TARGET_FREQUENCY - 1) begin
                    counter <= 0;
                end else begin
                    counter <= counter + 1;
                end
            end else begin
                if (k1 && winner_state == 4'b0000) begin
                    winner_state <= 4'b0001;
                end else if (k2 && winner_state == 4'b0000) begin
                    winner_state <= 4'b0010;
                end else if (k3 && winner_state == 4'b0000) begin
                    winner_state <= 4'b0011;
                end else if (k4 && winner_state == 4'b0000) begin
                    winner_state <= 4'b0100;
                end
            end
    
            if (s_pulse) begin
                if (s_num == 9) begin
                    s_num <= 9;
                end else begin
                    s_num <= s_num + 1;
                end
            end else begin
                if (winner_state != 4'b0000) begin
                    s_num <= s_num;
                end else begin
                    s_num <= s_num + 1;
                end
            end
        end
    end
    
    endmodule
    

    请注意,这个示例仅供参考,你可能需要根据实际需求和板子情况进行调整。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    评论
  • yy64ll826 2023-09-27 16:20
    关注
    评论
  • bug菌¹ Java领域优质创作者 2023-09-28 01:09
    关注

    该回答引用ChatGPT,希望对题主有所帮助,如有帮助,还望采纳。


    根据你提供的代码和图纸,结合猜测,可能存在以下问题:

    1. 输入端口没有定义。无法判断每个按键对应的输入信号的bit位置,以及输入信号的有效电平是高电平还是低电平。需要在代码中定义一下。

    2. 设计时钟的问题。没有设置任何时钟信号,无法保证程序的同步性和稳定性。需要加入时钟模块。

    3. 组合逻辑的问题。在程序的“always”块中,存在多路输入信号没有加入进去,可能造成结果的错误。需要加入组合逻辑模块,对输入信号进行判断并输出结果。

    关于仿真程序的写法,可以采用Verilog HDL的testbench方法。具体实现方式为:在一个文件中编写仿真程序,先定义好输入信号的波形和时序,然后将测试模块的端口和波形关联起来,最后得到仿真结果并进行调试。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月30日
  • 赞助了问题酬金15元 9月26日
  • 创建了问题 9月26日

悬赏问题

  • ¥30 哈夫曼编码译码器打印树形项目
  • ¥20 求完整顺利登陆QQ邮箱的python代码
  • ¥15 怎么下载MySQL,怎么卸干净原来的MySQL
  • ¥15 网络打印机Ip地址自动获取出现问题
  • ¥15 求局部放电案例库,用于预测局部放电类型
  • ¥100 QT Open62541
  • ¥15 stata合并季度数据和日度数据
  • ¥15 谁能提供rabbitmq,erlang,socat压缩包,记住版本要对应
  • ¥15 Vue3 中使用 `vue-router` 只能跳转到主页面?
  • ¥15 用QT,进行QGIS二次开发,如何在添加栅格图层时,将黑白的矢量图渲染成彩色