我一直在研究这个问题,我已经有一段时间了,但我似乎无法让它运转起来。我对verilog很新,所以希望它不是一个明显的问题。基本上,当我通过模拟器运行我的模块时,我的输出始终都是x。
这是我的代码:
module state_machine(
input clk_i,
input reset_n,
input LB,
input RB,
output reg [3:0] outputs
);
reg [3:0] state;
reg [3:0] state_n;
parameter FW = 4'b0101;
parameter BWL = 4'b0000;
parameter BWR = 4'b0000;
parameter SL = 4'b0001;
parameter SR = 4'b0100;
always @ (posedge clk_i, negedge reset_n)
begin
if(!reset_n)
state <= FW;
else
state <= state_n;
end
always @ (*)
begin
case(state)
FW: begin
if(!RB)
state_n = BWR;
else if(!LB)
state_n = BWL;
end
BWL: state_n = SL;
BWR: state_n = SR;
SL: state_n = FW;
SR: state_n = FW;
default: state_n = FW;
endcase
end
always @ (*)
begin
outputs = state;
end
endmodule
clk_i输入是使用计数器方法制作的慢速时钟,在此处:
module clock_counter(
input clk_i,
input reset_n,
output reg clk_o
);
reg [19:0] count;
always @ (posedge clk_i, negedge reset_n)
begin
count <= count + 1;
if(!reset_n)
begin
clk_o <= 0;
count <= 0;
end
else if(count >= 1039999)
begin
clk_o <= ~clk_o;
count <= 0;
end
end
endmodule
它们都是由顶级模块实例化的,只能执行此操作。我没有收到任何错误,但是我确实收到了一些关于某些事情的警告,我不认为这些事情被归零。
任何人都可以看到有什么问题吗?
编辑:这是我的测试平台代码:
`timescale 1 ns / 1 ns
// Define Module for Test Fixture
module top_module_tf();
// Inputs
reg reset_n;
reg LB;
reg RB;
// Outputs
wire [3:0] outputs;
// Bidirs
// Instantiate the UUT
// Please check and add your parameters manually
top_module UUT (
.reset_n(reset_n),
.LB(LB),
.RB(RB),
.outputs(outputs)
);
// Initialize Inputs
// You can add your stimulus here
initial begin
reset_n = 1; LB = 1; RB = 0;
#500000000 reset_n = 1; LB = 1; RB = 1;
end
endmodule // top_module_tf
答案 0 :(得分:0)
您需要在时间0将测试平台reset_n
信号设置为0以重置逻辑。延迟后,您应将reset_n
设置为1。
所有reg
信号默认为X.
答案 1 :(得分:0)
使用重置是传统的方法,但你也可以给寄存器一个像这样的初始值
reg LB = 1'b0;
reg RB = 1'b0;
Modelsim支持这一点,而quartus将合成在启动时加载给定值的reigsters。您也可以在verilog 2001端口声明
中执行此操作module some_module(
input wire clk,
output reg[15:0] counter_val = 16'd12345,
output wire some_other_signal);
这就是你如何减少模拟所需的重置代码量。在你摆脱重置之前,你需要仔细考虑,例如如果您的寄存器被破坏,请确保您的逻辑最终会转到有效状态。