信号连接到verilog中的以下多个驱动程序

问题描述 投票:0回答:1
`timescale 1ns / 1ps

//////////////////////////////////////////////////////////////////////////////////

// Company: 

// Engineer: 

// 

// Create Date:    20:07:59 12/16/2017 

// Design Name: 

// Module Name:    keyscan 

// Project Name: 

// Target Devices: 

// Tool versions: 

// Description: 

//

// Dependencies: 

//

// Revision: 

// Revision 0.01 - File Created

// Additional Comments: 

//

//////////////////////////////////////////////////////////////////////////////////

module keyscan(key, clk, reset, keyout);

    input [9:0] key;

    input clk, reset;

    output reg [127:0] keyout;





    reg [3:0] keyp [31:0] ;

    reg [3:0] key_bcd;



    integer i, count;


///////ERROR help me ㅠ.ㅠ
    always @ (posedge reset) begin

        if(reset==1) begin

            for(i=0; i<32; i=i+1)begin

                keyp[i] <= 4'hF;

            end

                key_bcd <= 4'b1111;

                count <= 0;

        end

    end



    always @ (*) begin

        case(key)

            10'b0000000001 :

            begin 

                key_bcd = 4'b0000; //0

                count = count + 1;

            end

            10'b0000000010 : 

            begin 

                key_bcd = 4'b0001; // 1

                count = count + 1;

            end

            10'b0000000100 : 

            begin 

                key_bcd = 4'b0010; // 2

                count = count + 1;

            end

            10'b0000001000 : 

            begin 

                key_bcd = 4'b0011; // 3

                count = count + 1;

            end

            10'b0000010000 : 

            begin 

                key_bcd = 4'b0100; // 4

                count = count + 1;

            end

            10'b0000100000 : 

            begin 

                key_bcd = 4'b0101; // 5

                count = count + 1;

            end

            10'b0001000000 : 

            begin 

                key_bcd = 4'b0110; // 6

                count = count + 1;

            end

            10'b0010000000 : 

            begin 

                key_bcd = 4'b0111; // 7

                count = count + 1;

            end

            10'b0100000000 : 

            begin 

                key_bcd = 4'b1000; // 8

                count = count + 1;

            end

            10'b1000000000 : 

            begin 

                key_bcd = 4'b1001; // 9

                count = count + 1;

            end



            default : key_bcd = 4'b1111; // ??

        endcase



        if(count == 32)

            count = 0;

    end





    always@ (count) begin

        if(key_bcd != 4'b1111)

            keyp[count-1] <= key_bcd;

    end



    always@ (posedge clk)begin

        keyout = {keyp[31],124'hfffffffffffffffffffffffffffffff};

    end



endmodule

错误ㅠ。ㅠHDLC编译器:1401 - “C:\ Users \ com603 \ Desktop \ verilog \ aqx \ keyscanf.v”第44行:单位keyscanf中的信号键[31] [3]连接到以下多个驱动程序:

verilog
1个回答
0
投票

你有2个总是阻止哪个驱动器相同的寄存器keyp

always @ (posedge reset) begin
    if(reset==1) begin
        for(i=0; i<32; i=i+1)begin
            keyp[i] <= 4'hF; // <<<<<<<<<<<<<<<<<
        end
       ...

always@ (count) begin
    if(key_bcd != 4'b1111)
        keyp[count-1] <= key_bcd;  // <<<<<<<<<<<<<<<<<
end

在模拟中,它将产生不可预测的结果,因为最后一个驱动程序将获胜。但是没有办法说哪一个是最后一个。综合应该抱怨它。

您需要找到一种方法将两个语句组合在同一个always块中。

首先,您需要使用时钟同步代码。您甚至将clk作为输入,因此在块中使用@(posedge clk)

我想以下内容应该有效:

always @ (posedge clk or posedge reset) begin
    if(reset==1) begin
        for(i=0; i<32; i=i+1)begin
            keyp[i] <= 4'hF;
        end
            key_bcd <= 4'b1111;
    end
    else if(key_bcd != 4'b1111)
        keyp[count-1] <= key_bcd;
end
© www.soinside.com 2019 - 2024. All rights reserved.