modelsim能做纯组合电路的仿真吗?

2020-02-17 19:43发布


如题,刚学FPGA的新人,把Verilog语法简单看了看,开始跑例程,尝试编写testbench时看到3_8译码器简单的例子
的时候想到这个问题。modelsim只能做时序仿真吗?有没有老版本的quartusii那样可以手动加电平波形,检测组合
电路逻辑的功能???

比如这个例程:
/*键盘key1-key9,在数码管上显示0-9*/
module encode(a,c,en);
input[9:1] a;
output[7:0] c;
output[7:0] en;

reg[7:0] c;
reg[3:0] c_tmp;//将0-9位选择的换成可理解的十进制
integer i;
assign en=0;//位选,这里直接选择第一位

//独码解成二进制码
always@(a)
   begin
           c_tmp=0;
                for(i=1;i<=9;i=i+1)
                begin
                   c_tmp=i;
                end
        end

//二进制码用数码管表示,选用的是共阳极,所以0为有效输出        
always@(c_tmp)
   begin
           case(c_tmp)
                4'b0000:
                        c=8'b0000_0011;
                4'b0001:
                        c=8'b1001_1111;
                4'b0010:
                        c=8'b0010_0101;
                4'b0011:
                        c=8'b0000_1101;
                4'b0100:
                        c=8'b1001_1001;
                4'b0101:
                        c=8'b0100_1001;
                4'b0110:
                        c=8'b0100_0001;
                4'b0111:
                        c=8'b0001_1111;
                4'b1000:
                        c=8'b0000_0001;
                4'b1001:
                        c=8'b0001_1001;
                default:
                   c=8'b0000_0000;
                endcase
        end
endmodule
        我能手动加a的波形或者怎么写testbench,使得C输出?我试过一种认为加一段CLK,让按键循环按下的程序。但可以纯组合,手动加a的波形仿真吗?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
angelcoffee
1楼-- · 2020-02-17 23:44
testbench中不加clk,直接在initial中给a延时赋值怎么样?
玄德
2楼-- · 2020-02-18 04:49

modelsim可以仿真组合逻辑、时序逻辑。

zener818
3楼-- · 2020-02-18 05:05
用task 给输入赋值观察波形
angelcoffee
4楼-- · 2020-02-18 06:16
zener818 发表于 2015-10-5 22:37
用task 给输入赋值观察波形

嗯,懂了。已经仿真成功了!

`timescale 1 ns/ 1 ns
module encode_vlg_tst();

reg [9:1] a;
// wires                                               
wire [7:0]  c;
wire [7:0]  en;
integer k;

encode i1 (
// port map - connection between master ports and signals/registers   
        .a(a),
        .c(c),
        .en(en)
);   
            
initial                                                
begin                                                  
a=9'b111111111;                                                                           
end

task init_a;
reg [9:1] b;

        begin
        b=9'b111111111;//赋值语句必须在begin_end中
        for(k=0;k<9;k=k+1)
                begin                  
                        #10 a<=(b&9'b000000001)<<(k);                 
                end

        end
endtask
                                                   
always init_a;
                                                                                                        
endmodule

一周热门 更多>