2013-11-01 1 views
2

LSFR을 구현하는 아래의 작은 Verilog 프로젝트가 있습니다. 현재 자일링스 ISE 14.6에서는 코드가 올바르게 컴파일되지 않는다. 그것과 함께 오류가 발생했습니다 :부품 선택 Verilog에서 잘못된 lvalue 발생

오류 : HDLCompilers : 108 - "top.v"줄 70 스칼라 와이어 어레이 'q'의 부품 선택이 올바르지 않습니다. 오류 : HDLCompilers : 107 - "top.v"줄 70 불법적 인 권리 nonblocking assignment의 손 사이드 오류 : HDLCompilers : 108 - "top.v"라인 74 스칼라 와이어 어레이 'q'의 부품 선택이 올바르지 않습니다. 오류 : HDLCompilers : 107 - "top.v"라인 74 불법적 인 오른쪽의 내 코드에서이 시점에서 가리키는 블로킹 할당

는 :

always @ (display) begin 
    if(display == 1'b0) begin 
     LSB <= q[3:0]; 
     switch <= LSB; 
    end 
    else begin 
     MSB <= q[7:4]; 
     switch <= MSB; 
    end 
end 

나는에 오류를 보았다 Xilinx 사용자 가이드는이 문제를 해결하기 위해 2 비트보다 큰 비트 폭을 지정했지만 이미 8 비트이므로 어떤 문제가 있는지 확실하지 않습니다. 도움이된다면

은 여기 내 전체 상위 모듈의 :

`timescale 1ns/1ps 

module top (c, start, clk_in, display, segments); 
input [7:0] c; 
input start, clk_in; 
output [3:0] display; 
output [6:0] segments; 

reg [6:0] segments; 
reg [3:0] display; 
reg [3:0] LSB; 
reg [3:0] MSB; 

wire q[7:0]; 
wire q_[7:0]; 
wire clk, dff0_w, dff1_w, dff2_w, dff3_w, dff4_w, dff5_w, dff6_w; 
reg [3:0] switch; 


initial begin 
    display <= 4'b0111; 
end 

clock_divider #(15) divider(.cin(clk_in), .cout(clk)); 

//switch changes back and forth between the MSB and LSB of the 8 bit number when muxing 
decoder bits(clk, switch, segments); 

//D adders 
dff dff0(.D(dff0_w),.Q(q[0]),.clk(clk),.start(start)); 
dff dff1(q[0],q[1],clk,start); 
dff dff2(q[1],q[2],clk,start); 
dff dff3(q[2],q[3],clk,start); 
dff dff4(q[3],q[4],clk,start); 
dff dff5(q[4],q[5],clk,start); 
dff dff6(q[5],q[6],clk,start); 
dff dff7(q[6],q[7],clk,start); 

//xor gates 
xor (dff6_w, q[7], q_[6]); 
xor (dff5_w, dff6_w, q_[5]); 
xor (dff4_w, dff5_w, q_[4]); 
xor (dff3_w, dff4_w, q_[3]); 
xor (dff2_w, dff3_w, q_[2]); 
xor (dff1_w, dff2_w, q_[1]); 
xor (dff0_w, dff1_w, q_[0]);  


//buffer the C values 
assign q_[0] = c[0] ? 1'b0 : q[0]; 
assign q_[1] = c[1] ? 1'b0 : q[1]; 
assign q_[2] = c[2] ? 1'b0 : q[2]; 
assign q_[3] = c[3] ? 1'b0 : q[3]; 
assign q_[4] = c[4] ? 1'b0 : q[4]; 
assign q_[5] = c[5] ? 1'b0 : q[5]; 
assign q_[6] = c[6] ? 1'b0 : q[6]; 
assign q_[7] = 1 ? 1'b0 : q[7]; //Cn is always 1 

//mux the display 
always @ (posedge clk) begin 
    if(display == 4'b0111) 
     display <= 4'b1011; 
    else 
     display <= 4'b0111; 
end 

//display the appropriate value when the anode is asserted 
always @ (display) begin 
    if(display == 1'b0) begin 
     LSB <= q[3:0]; 
     switch <= LSB; 
    end 
    else begin 
     MSB <= q[7:4]; 
     switch <= MSB; 
    end 
end 

endmodule 
+1

RTL 시뮬레이션과 게이트 레벨 (합성 후) 결과가 일치하지 않을 수 있으므로'always @ (display) '를'always @ *'로 바꾸는 것이 불완전한 민감도 목록이기 때문에 생각해야합니다. – Morgan

답변

2

을 변경해보십시오 :

wire q[7:0]; 
wire q_[7:0]; 

에 : 최대 나를 위해 컴파일 에러를 클리어

wire [7:0] q; 
wire [7:0] q_; 

.

+0

나는 같은 것을 타이핑하고 있었고 당신은 나를 30 초 동안 이겼다. – jkshah

+0

음, 나는 어리 석다. –

+0

하지 마십시오. 우리 모두 가끔 두 번째 눈 쌍이 필요합니다. – toolic