用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
//现写的没有仿过,但应该问题不大,那个二路选择器只是一种极其简陋的模块,你可以按照需
//要改,测试模块相应变动输入的信号的位宽啦,时钟啦什么。
比如你说的这个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)
红线是代表你的编程有问题。。。输出错误值。。。
书上很多例子。。。 网上现在也很多。。 可以自己找找看。。。。
至于你说的那个蓝线和红线吗。。。
蓝线是代表高阻抗 (high impedance)
红线是代表你的编程有问题。。。输出错误值。。。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息