verilog - 我正在使用带有 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
端模块
解决方案
您的代码没有正确的重置和电线上的多个驱动程序。
以下语句不是简单的初始化语句。
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
.
推荐阅读
- java - RXJava Observable onNext 在不同线程上发出
- javascript - 我如何在 CSS onClick 事件中使用 :after
- jquery - 使用 jQuery 更改 CSS 属性值
- html - 如何避免网站上的水平滚动
- r - ggplot2 : 将 stat_function 扩展到 geom_violin
- python - 如何打包所有项目文件并为 python 项目制作安装程序
- git - 执行 BuildTools.jar 时无法自动检测电子邮件地址(得到“错误@email@none”)
- mysql - 查询具有特定条件的 Select Header Join Detail
- javascript - 使用 Babel 7.10 编译成模块 js 文件,无需导入
- markdown - 如何为上下两个方向和单词的箭头写markdown?