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日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来