【问题标题】:Verilog can't output square wave if assigned to one variable but can to another如果分配给一个变量,Verilog 无法输出方波,但可以分配给另一个变量
【发布时间】:2016-12-10 13:58:10
【问题描述】:

所以我试图在 FPGA 中输出变量的位。有两个不同的变量:count 和 dataout。代码如下:

module control_LED
( //input [7:0] input_value,

  input Clk,

  //input reset,

  //output reg [7:0] dataout

  output led,led2,led3,led4,led5,led6,led7,led8
);
parameter DWIDTH = 8, WORDS = 30;

reg [27:0] count;

reg [7:0] dataout;

reg [DWIDTH-1:0]sine[WORDS-1:0];

//reg [7:0] temp;

initial begin

    count = 0;

    dataout = 0;

   sine[0] = 77;

   sine[1] = 74;

   sine[2] = 67;

   sine[3] = 58;

   sine[4] = 45;

   sine[5] = 31;

   sine[6] = 16;

   sine[7] = 0;

   sine[8] = 7;

   sine[9] = 8'd74;

   sine[10] = 8'd67;

   sine[11] = 8'd58;

   sine[12] = 8'd45;

   sine[13] = 8'd31;

   sine[14] = 8'd16;

   sine[15] = 8'd0;

   sine[16] = -16;

   sine[17] = -31;

   sine[18] = -45;

   sine[19] = -58;

   sine[20] = -67;

   sine[21] = -74;

   sine[22] = -77;

   sine[23] = -77;

   sine[24] = -74;

   sine[25] = -67;

   sine[26] = -58;

   sine[27] = -45;

   sine[28] = -31;

   sine[29] = -16;

end

always@ (posedge Clk)

begin

    if (count > 14) begin

      count<=0;

      dataout<=0;

     end

    else begin

     count<=count+1;

     //dataout<=dataout+1;

     dataout <=sine[count];

         //dataout <=sine[count];

     /*led <= sine[count][7];
     led2 <= sine[count][6];
     led3 <= sine[count][5];
     led4 <= sine[count][4];
     led5 <= sine[count][3];
     led6 <= sine[count][2];
     led7 <= sine[count][1];
     led8 <= sine[count][0];*/

    end

end

//assign dataout = sine[count];
/*assign led = count[7];
assign led2 = count[6];
assign led3 = count[5];
assign led4 = count[4];
assign led5 = count[3];
assign led6 = count[2];
assign led7 = count[1];
assign led8 = count[0];*/


assign led = dataout[7];

assign led2 = dataout[6];

assign led3 = dataout[5];

assign led4 = dataout[4];

assign led5 = dataout[3];

assign led6 = dataout[2];

assign led7 = dataout[1];

assign led8 = dataout[0];


endmodule

如果我将输出变量分配给计数变量中的位,会发生什么情况,FPGA 板输出引脚会给出一个干净的方波。但是,如果我将输出变量分配给 dataout 变量中的位,我不会。我不知道是什么原因造成的。我不是在寻找直接的答案,但我已经为此苦苦挣扎了一段时间。因此,如果有人可以给我一个提示或将我推向这个方向,我将不胜感激。 (我一直在尝试调试这个)。谢谢!

【问题讨论】:

  • 是的,它支持初始块,是的,变量应该被签名。
  • 有一个警告说“信号 已使用但从未分配”。但它是在初始块中分配的......

标签: verilog fpga


【解决方案1】:

这是因为您的 dataout 位本身不是方波模式,因为您的 sine 数组值。

sine[0] = 77; // 01001101
sine[1] = 74; // 01001010
sine[2] = 67; // 01000011
sine[3] = 58; // 00111010
sine[4] = 45; // 00101101
sine[5] = 31; // 00011111
sine[6] = 16; // 00010000
sine[7] = 0;  // 00000000
sine[8] = 7;  // 00000111
sine[9] = 8'd74; // 01001010
sine[10] = 8'd67; // 01000011
sine[11] = 8'd58; // 00111010
sine[12] = 8'd45; // 00101101
sine[13] = 8'd31; // 00011111
sine[14] = 8'd16; // 00010000
sine[15] = 8'd0; // 0000000

假设你取dataout[1],那么每个时钟都会有以下值。

0-1-1-1-0-1-0-0-1-1-1-1-0-1-0-0

所以这本身在特定的时间间隔内不会重复。

另一个重要的事情是你的设计中没有任何reset。所以实际上你在initial 块中所做的任何事情都应该在reset 条件下完成。

您可以使用以下代码执行此操作。

always @ (posedge clk, negedge reset)
begin
  if (!reset)
  begin
    // Your reset condition
  end
  else
  begin
    // Your original code
  end
end

【讨论】:

  • 是的,它不是重复的。但我无法在示波器上检测到明显的低/高电平。相反,我可以为每个数据输出位检测到接近正弦波的东西。
  • 我无法理解您在示波器中看到了什么?我认为您应该首先在模拟中看到它以了解您的代码,然后将其转储到 FPGA 中。请参阅我的更新答案以了解另一件事
  • 嗯...这就像噪音。如果我增加比例,它会变成像正弦波和正弦波加在一起的东西。问题是,我的代码在模拟模式下完美运行。但当我将其转储到 FPGA 时不会
  • 如果可以的话请发示波器截图
  • 请点击链接
猜你喜欢
  • 1970-01-01
  • 2019-08-31
  • 1970-01-01
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多