xyx_2000 2021-09-19 21:49 采纳率: 100%
浏览 197
已结题

Verilog多模块实例化时遇到的问题

代码的目的:定义两个module块来模拟AB芯片,并且分别编号为0、1。FPGA是主模块,通过计数器产生0~5的控制信号,然后对控制信号进行分选后判断当前需要访问的是哪个芯片,然后再实例化该模块,同时得到其输出值。

FPGA代码:

module FPGA(clk,reset,cont,out);  //主模块
input clk,reset;  //时钟信号和复位信号
output [2:0] cont;  //控制信号
output [7:0] out;  //用于存放从芯片接收来的数据
reg [2:0] cont;
wire[7:0] out;
integer flag;
always @(posedge clk or negedge reset)//产生控制信号(计数器电路)
begin
    if(!reset)
        cont=0;
    else if(cont==5) cont=0;
        else cont=cont+1;
end
begin
    A Amodule(.clk(clk),.cont(cont),.out(out));
    B Bmodule(.clk(clk),.cont(cont),.out(out));
end
endmodule

A、B模块的定义:

module A (clk,cont,out);
input clk;
input [2:0]cont;
output [7:0] out;
reg[7:0] out;
always@(posedge clk)
begin
    out=0;//初始化,防止出现不确定量
    if(cont==0)
        out=1;  //若控制信号为0,则使能A芯片并输出数值1
end
endmodule

module B (clk,cont,out);
input clk;
input [2:0]cont;
output [7:0] out;
reg[7:0] out;
always@(posedge clk)
    begin
    out=0;//初始化
    if(cont==1)
        out=2;      //若控制信号为1,则使能A芯片并输出数值2
    end
endmodule

问题描述:在时序仿真过程中输出的结果如下图

img

如果将PFGA代码中的A、B模块的实例化删减剩A,则时域仿真结果正常

img

怀疑是出现了竞争与冒险现象,但是我不知道应该怎么改动!所以想请教一下各位这个代码应该怎么改。
(PS:我试过用在FPGA模块中的always模块外,用控制信号+case模块来实现分时实例化模块,但是报错说“控制信号”非常数,可能是因为没有在always模块内部使用case,但是如果在always模块中用case来实例化,就又会报错,因为模块的实例化没有办法在always模块里进行……所以很苦恼)

  • 写回答

2条回答 默认 最新

  • 老皮芽子 2021-09-22 10:07
    关注

    cont 是变量,正常的 case 得写在 always 里
    否则就需要用常数去整 case

    
    module FPGA(clk,reset,cont,out);//主模块
    input clk,reset;  //时钟信号和复位信号
    output [2:0] cont;  //控制信号
    output [7:0] out;  //用于存放从芯片接收来的数据
    reg [2:0] cont;
    wire[7:0] out,out1,out2,out3,out4,out5,out6;
    reg[7:0] out_r;
    integer flag;
    always @(posedge clk or negedge reset)//产生控制信号(计数器电路)
    begin
        if(!reset)
            cont=0;
        else if(cont==5) cont=0;
            else cont=cont+1;
    end
        A Amodule(.clk(clk),.cont(cont),.out(out1));
        B Bmodule(.clk(clk),.cont(cont),.out(out2));
        C Cmodule(.clk(clk),.cont(cont),.out(out3));
        D Dmodule(.clk(clk),.cont(cont),.out(out4));
        E Emodule(.clk(clk),.cont(cont),.out(out5));
        F Fmodule(.clk(clk),.cont(cont),.out(out6));
        assign    out = out_r;
        
    always @(*)
    begin
        case(cont)
        0: out_r=out1;
        1: out_r=out2;
        2: out_r=out3;
        3: out_r=out4;
        4: out_r=out5;
        5: out_r=out6;
        default: out_r=0;
        endcase
    end
    
    endmodule
     
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月30日
  • 已采纳回答 9月22日
  • 创建了问题 9月19日

悬赏问题

  • ¥15 单片机 如何进行数据存储
  • ¥20 配置UGM库出现问题
  • ¥15 把Excel导入MATLAB显示错误怎么解决?
  • ¥15 Java中消息和缓存如何使用
  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站