1

我正在使用 verilog 中的环形计数器制作一个并行到串行的转换器。环形计数器工作正常,但并行到串行转换器工作不正常,我得到 x 未定义的结果。我正在提供代码,请帮助我找到问题。

最佳

module PtoSTOP;

  reg clk,rst;

  wire [3:0] myout;
  wire       out;

  Ring a(clk,rst,myout);

  parToser x(myout,clk,rst,out);

  initial begin 
    clk=1;
    rst=1;

    #1 rst=0; 
 end

 always
   #2 clk=~clk;

 endmodule

并串转换器

module parToser(myout,clk,rst,out);

input clk,rst;
input [3:0] myout;
output reg  out;

reg [2:0]i;

always @(posedge clk or posedge rst) begin
  if(rst) begin
    out <= 0;
    i   <= 0;
 end
 else begin
   out <= myout[i];
   i   <= i+1;
  end
end

endmodule 

铃声计数器

module Ring(clk,rst,myout);

input clk,rst;
output reg [3:0]myout;

always @(posedge clk or posedge rst) begin
  if(rst)
    myout<=1;
  else
    myout<=myout<<1;
end

 endmodule

在此处输入图像描述

4

1 回答 1

0

我认为您看到的主要问题是 parToser 的一部分。

你有reg [2:0]i;你递增和使用的地址input [3:0] myout;,但我可以保存 0 到 7 的值,其中一半在 [3:0] myout 的地址范围之外。您应该看到关于超出范围寻址的模拟错误。

此外,您还包含了一些具有复位条件的触发器,但未将复位添加到“parToser”和“Ring”中的敏感度列表中:

always @(posedge clk) 

应该:

always @(posedge clk or posedge rst)

如果没有这个触发器,你的 out,i 和 myout 变量将是 x,因为它们尚未设置为已知条件。

注意:parToseri = i+1;应该是i <= i+1;

于 2013-03-31T17:19:53.537 回答