用modelsim仿真Verilog程序只出现蓝色和红色的直线,没有高低电平的那种波形?

谁能给我一个很简单的用modelsim仿真Verilog程序的完整例子,最好是2路选择器的这个简单例子。因为之前学习的C语言,在vc中只需要一个.C文件就可以得到结果,现... 谁能给我一个很简单的用modelsim仿真Verilog程序的完整例子,最好是2路选择器的这个简单例子。因为之前学习的C语言,在vc中只需要一个.C文件就可以得到结果,现在这个仿真软件刚接触,我写了一个2路选择器的.V代码,可是得到的波形只有直线,别人说是没有激励信号什么的,是不是需要testbench代码?还是需要顶层top代码?望高人指点,给我一个.V代码,一个testbench代码和一个top代码,这个问题搞了几天了,我不懂这个软件的仿真步骤,也请说说 展开
 我来答
跳拉丁舞的小猫64
推荐于2018-05-17 · TA获得超过233个赞
知道答主
回答量:46
采纳率:0%
帮助的人:58.3万
展开全部
verilog和C的性质完全不一样啊,Verilog是描述电路结构语言,C 是控制处理器的指令
比如你说的这个2路选择器吧,随便写个你试试:
/********************************************************************************/
module mux2_top(rst,dina,dinb,con,dout);
input rst;
input dina,dinb; //两路串行数据输入
input con;//选通信号
output dout;//输出

wire dout_temp
assign dout_temp =(con)?dina:dinb; //con高电平输出dina,否则输出dinb数据
assign dout = (rst)?1'b1:dout_temp;//rst为高时选择器处于复位状态时钟为高电平
endmodule
/**********以上为2路选择器模块代码,下面是该模块测试testbench代码************************/
module mux2_top_testbench;
reg rst;
reg dina;
reg dinb;
reg con;
reg tb_clk;
reg [4:0]step;//用来在testbench中产生变化的数据dina,dinb和cont等激励信号的
wire dout;
initial begin
rst = 0
dina= 0;
dinb= 0;
con = 0;
tb_clk = 0
step = 0;
#50
rst = 1;
#50
rst = 0;
end
always #5 tb_clk= ~tb_clk;
always@(posedge tb_clk)begin
step <= step+1'b1;end
always@(posedge tb_clk or posedge rst)begin
if(rst)begin
dina<= 1'b0;dina<=1'b0;end
else if ((step[2]== 1'b1)&&(step[0]==1'b0))begin
dina<= ~dina;dinb<=dinb;end
else if ((step[3]== 1'b1)&&(step[1]==1'b0))begin
dina<= dina;dinb<= dinb;end
else begin
dina<= dina;dinb<=dinb;end
end
//该always产生随意的两路串行数据流
always@(posedge tb_clk or posedge rst )begin
if(rst)
con <= 1'b0;
else if(step[3])
con <= 1'b1;
else
con ,<=con
end
//以上产生随意的控制选通信号
//以下调用待测的两路选择器模块的代码
mux2_top DUT(
.rst(rst),
.dina(dina),
.dinb(dinb),
.con(con),
.dout(dout) )

endmodule

//现写的没有仿过,但应该问题不大,那个二路选择器只是一种极其简陋的模块,你可以按照需
//要改,测试模块相应变动输入的信号的位宽啦,时钟啦什么。
capark
2011-11-29
知道答主
回答量:21
采纳率:0%
帮助的人:16.4万
展开全部
这个。。。。。
书上很多例子。。。 网上现在也很多。。 可以自己找找看。。。。
至于你说的那个蓝线和红线吗。。。
蓝线是代表高阻抗 (high impedance)
红线是代表你的编程有问题。。。 输出错误值。。。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
nisonhou
2011-11-29 · TA获得超过382个赞
知道小有建树答主
回答量:212
采纳率:0%
帮助的人:192万
展开全部
看来你连时序仿真和功能仿真都没弄明白,我的这篇博文中有个很详细的例程,自己去看吧
http://hi.baidu.com/nisonhou/blog/item/8860b30922b6abc762d98612.html
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
小小1俗人
2018-10-10
知道答主
回答量:2
采纳率:0%
帮助的人:1639
展开全部

用modelsim仿真Verilog出现红杠杠,这个问题也是折磨了我好几天!

所遇到的问题:仿真时出现红线。在逻辑可行,还能在开发板上运行,可就是在仿真时,来了一堆红杠杠,被他们折腾的都无力抓狂了。

解决办法:针对reg定义的寄存器,给了他们一个复位信号以后,就变得听话老实了。

附上两段小代码,一个是LED的blink,一个是他的激励,都是调试通过的,供君参考。

//=========================================
// Module name: led_test.v
// 描述: 每隔 1 秒依次点亮开发板上的 LED0~LED4
//==========================================
//================================
//问题:可实现功能,但无法仿真
//现象1:仅仅只是在计数器清零的同时,加了一个扫描的标志位,然后就不能仿真了
//现象2:直接用计数器了的数值,可以仿真
//==============================
//解析:
//      在写计数器的时候,没有复位信号作为初始化,可实现功能,但无法仿真
//心得:
//      1.在写计数器时,养成书写复位信号的习惯。
//      2.模块里用到几个计数器,就在复位信号下写多少个。
//==============================
//                              writer:西施先生
//                              time:10/10/2018
//===============================
`timescale 1ns / 1ps
module led_test (
       input        clk;
    input         rst_n;
    output [3:0] led;
    
    
    
    //寄存器定义    
    reg [31:0] timer;
    reg [3:0] led;
    reg [3:0] scan;
        
        
//============================================
// 计数器计数:循环计数 0~4 秒
//============================================
always @(posedge clk or negedge rst_n) //检测时钟的上升沿和复位的下降沿begin
    if (!rst_n) //复位信号低有效    
    begin
        scan <= 0;
        timer <= 0; //计数器清零   
    end
    
    else if (timer == 32'd4) //开发板使用的晶振为 50MHz,1秒计数(50M-1=49_999_999)    
    begin
        timer <= 0; //计数器计到 1 秒,计数器清零        
            scan <= scan + 1'b1;
        if(scan == 4'd4)
            scan <= 0;
        end
    else
        timer <= timer + 1'b1; //计数器加

        
//================================
//问题:可实现功能,但无法仿真
//现象1:仅仅只是在计数器清零的同时,加了一个扫描的标志位,然后就不能仿真了
//现象2:直接用计数器了的数值,可以仿真
//==============================
//解析:
//      在写计数器的时候,没有复位信号作为初始化,可实现功能,但无法仿真
//心得:
//      1.在写计数器时,养成书写复位信号的习惯。
//      2.模块里用到几个计数器,就在复位信号下写多少个。
//==============================
//===============================

always@ (posedge clk)
begin   
    case (scan)
        4'd0: led <= 4'b0110;
        4'd1: led <= 4'b1001;
        4'd2: led <= 4'b1100;
        4'd3: led <= 4'b0011;
        4'd4: led <= 4'b1111;
    endcase 
end





//===========病态模块===================

//========着重观察 复位信号===============
/*
//===============情况1========================
// 两个计数器都在复位信号下,两个计数器,都可以正常仿真
//============================================
always @(posedge clk or negedge rst_n) //检测时钟的上升沿和复位的下降沿
begin
    if (!rst_n) //复位信号低有效
    begin
        scan <= 0;
        timer <= 0; //计数器清零   
    end
    
    else if (timer == 32'd4) //开发板使用的晶振为 50MHz,4 秒计数(50M*4-1=199_999_999)
    begin
        timer <= 0; //计数器计到 4 秒,计数器清零
        scan <= scan + 1'b1;
        if(scan == 4'd4)
            scan <= 0;
        end
    else
        timer <= timer + 1'b1; //计数器加 1
end





//================情况2============================
// 一个计数器(timer)在复位信号下,另一个(scan)没有复位
//功能现象: 都不影响基本功能,可在板卡上运行
//仿真现象: timer可以正常仿真,但是scan就是一条红杠杠,害我折腾了好几天!!!气死老夫了!!!
//============================================
always @(posedge clk or negedge rst_n) //检测时钟的上升沿和复位的下降沿
begin
    if (!rst_n) //复位信号低有效
    begin
        scan <= 0;
        timer <= 0; //计数器清零   
    end
    
    else if (timer == 32'd4) //开发板使用的晶振为 50MHz,4 秒计数(50M*4-1=199_999_999)
    begin
        timer <= 0; //计数器计到 4 秒,计数器清零
        scan <= scan + 1'b1;
        if(scan == 4'd4)
            scan <= 0;
        end
    else
        timer <= timer + 1'b1; //计数器加 1
end



//================情况3============================
// 两个计数器都没有使用复位
//功能现象: 都不影响基本功能,可在板卡上运行
//仿真现象: timer和scan都不能仿真
//============================================
always @(posedge clk) //检测时钟的上升沿和复位的下降沿
begin
 if (timer == 32'd4) //开发板使用的晶振为 50MHz,4 秒计数(50M*4-1=199_999_999)
    begin
        timer <= 0; //计数器计到 4 秒,计数器清零
        scan <= scan + 1'b1;
        if(scan == 4'd4)
            scan <= 0;
        end
    else
        timer <= timer + 1'b1; //计数器加 1
end



*/
endmodule
//激励模块

module led_blink_VTF;

// Inputs
reg clk;
reg rst_n;

// Outputs
wire [3:0] led;

// Instantiate the Unit Under Test (UUT)
led_test uut (
.clk(clk), 
.rst_n(rst_n), 
.led(led)
);

initial begin
// Initialize Inputs
clk = 0;
rst_n = 0;

// Wait 100 ns for global reset to finish
#100;
rst_n = 1;
        
// Add stimulus here
#4000;
$stop;

end
      
always #10 clk = ~clk;




endmodule
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式