如果分配给一个变量,Verilog就不能输出方波,但可以输出另一个变量

时间:2016-12-08 10:07:23

标签: verilog fpga

所以我试图在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

如果我将输出变量分配给count变量中的位,那么FPGA板输出引脚会产生干净的方波。但是如果我将输出变量分配给dataout变量中的位,我就不会这样做。我不知道造成这种情况的原因......我不是在寻找直接的答案,但我现在已经挣扎了一段时间。所以,如果有人能给我一个暗示或推动我朝这个方向发展,我真的很感激。 (我一直在尝试调试这个)。谢谢!

1 个答案:

答案 0 :(得分:0)

这是因为由于您的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