首页 > 解决方案 > 我正在使用带有 N/S 灯和 E/W 灯的摩尔电路制作交通灯控制器,并且我的输出一直显示为所有 X

问题描述

这是参数 在此处输入图像描述

我已经运行了文件并检查了 gtk 波,但我无法弄清楚我的接线哪里出了问题。我正在使用带有一个输入的摩尔电路。我只需要有人帮我弄清楚我在哪里弄乱了接线。谢谢

模块流量(T、CLK、GN、YN、RN、GE、YE、RE);

// inputs
input CLK;
input T;

// outputs
output reg GN;
output reg YN;
output reg RN;
output reg GE;
output reg YE;
output reg RE;

// flip-flops 
reg gN = 1'b1;
reg yN = 1'b0;
reg rN = 1'b0;
reg gE = 1'b0;
reg yE = 1'b0;
reg rE = 1'b1;

// Wires
wire gNplus = 1'b1; 
wire yNplus = 1'b0; 
wire rNplus = 1'b0; 
wire gEplus = 1'b0;
wire yEplus = 1'b0;
wire rEplus = 1'b1;

// Next State and Output
assign CLK = 0;
always @(posedge CLK) 
begin
    gN <= gNplus;
    yN <= yNplus;
    rN <= rNplus;
    gE <= gEplus;
    yE <= yEplus;
    rE <= rEplus;

    GN <= gN;
    YN <= yN;
    RN <= rN;
    GE <= gE;
    YE <= yE;
    RE <= rE;

end 

// combinational logic
assign gNplus = ~T * ~yN;
assign yNplus = gN;
assign rNplus = (rN * T) | yN;
assign gEplus = ~T * ~yE;
assign yEplus = gE;
assign rEplus = (rE * T) | yE;

端模块

测试台 include "traffic.v" 时间刻度 10ns/1ns

模块交通测试;

reg T; 

wire GN;
wire YN;
wire RN; 
wire GE; 
wire YE;
wire RE;

traffic UUT(.T(T), .CLK(CLK), .GN(gNplus), .YN(yNplus), .RN(rNplus), .GE(gEplus), .YE(yEplus), .RE(rEplus));

reg CLK = 1'b1;
always  
begin
    CLK = ~CLK;
    #5;
end


initial begin
    T = 0;
    forever begin
        #20 T = ~T;
    end

end

initial begin
        $display("START OF TEST");
        $dumpfile("traffic.vcd");
        $dumpvars(0, traffic_test);
        
        $display("T | GN YN RN | GE YE RE");
    
        for (integer i = 0;i < 11;i =i + 1) 
        begin
            {T} = i;
            $display("%b |  %b  %b  %b |  %b  %b  %b", T, gNplus, yNplus, rNplus, gEplus, yEplus, rEplus);
        end
        $finish;
        $display("END OF TEST");
    end

端模块

标签: verilog

解决方案


您的代码没有正确的重置和电线上的多个驱动程序。

以下语句不是简单的初始化语句。

wire gNplus = 1'b1; 
wire yNplus = 1'b0; 
...

这些陈述与

wire gNplus;
assign gNplus = 1'b1; 
wire yNplus;
assign yNplus = 1'b0; 

现在你有了另一组语句:

assign gNplus = ~T * ~yN;
assign yNplus = gN;
...

您以不同的值驱动相同的电线两次。结果值为X.

以下不一定是寄存器的正确初始化。首先,它并不总是可合成的。其次,它是在模拟时间 0 之前完成的,初始模拟步骤的任何副作用都可能用错误的值重写它们。你应该想出一个翻牌的复位序列。

reg gN = 1'b1;
reg yN = 1'b0;
...

其他几个旁注。

  • 此语句在您的代码中做了什么:assign CLK = 0;?您将测试台中的时钟初始化为1. 不过,最好在初始块中进行。
  • 您在使用后在测试台中声明您的 CLK 信号。这样,verilog 可以使用默认类型,通常是wire.

推荐阅读