所以我试图在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变量中的位,我就不会这样做。我不知道造成这种情况的原因......我不是在寻找直接的答案,但我现在已经挣扎了一段时间。所以,如果有人能给我一个暗示或推动我朝这个方向发展,我真的很感激。 (我一直在尝试调试这个)。谢谢!
答案 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