中易网

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

答案:4  悬赏:40  
解决时间 2021-01-16 03:49
  • 提问者网友:暗中人
  • 2021-01-15 19:59
用modelsim仿真Verilog程序只出现蓝色和红色的直线,没有高低电平的那种波形?
最佳答案
  • 二级知识专家网友:掌灯师
  • 2021-01-15 21:31
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

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

//现写的没有仿过,但应该问题不大,那个二路选择器只是一种极其简陋的模块,你可以按照需
//要改,测试模块相应变动输入的信号的位宽啦,时钟啦什么。
全部回答
  • 1楼网友:独行浪子会拥风
  • 2021-01-16 01:14

用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'b
  • 2楼网友:拾荒鲤
  • 2021-01-16 00:16
我暂时保留我的看法!
  • 3楼网友:酒醒三更
  • 2021-01-15 22:46
这个。。。。。
书上很多例子。。。 网上现在也很多。。 可以自己找找看。。。。
至于你说的那个蓝线和红线吗。。。
蓝线是代表高阻抗 (high impedance)
红线是代表你的编程有问题。。。输出错误值。。。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息