我试图编写地址生成单元的代码。代码如下:
module access3x3(clk, addr, dout);
input clk;
output [16:0] addr;
output [7:0] dout;
reg [16:0] addr;
reg clk1;
wire [3:0] count;
wire [16:0] addr_reg [2:0];
wire val;
wire [7:0] val1;
assign val=0;
assign val1=0;
assign addr_reg[0]=0;
initial
begin
addr=0;
clk1=1;
end
inputhex image(.clka(clk), .wea(val), .addra(addr), .dina(val1),
.douta(dout));
counter1 count64516(.clk(clk1), .dout(addr_reg[0]));
counter9 count9(.clk(clk), .dout(count));
adder256 row2(.din(addr_reg[0]), .dout(addr_reg[1]), .clk(clk));
adder256 row3(.din(addr_reg[1]), .dout(addr_reg[2]), .clk(clk));
always@(negedge clk)
begin
case(count)
0: addr=(addr_reg[0]+1'b0);
1: addr=(addr_reg[0]+2'd1);
2: addr=(addr_reg[0]+2'd2);
3: addr=(addr_reg[1]+1'b0);
4: addr=(addr_reg[1]+2'd1);
5: addr=(addr_reg[1]+2'd2);
6: addr=(addr_reg[2]+1'b0);
7: addr=(addr_reg[2]+2'd1);
8: addr=(addr_reg[2]+2'd2);
endcase
if(count==4'd4)
clk1=0;
else if(count==4'd8)
clk1=1;
end
endmodule
这是更新的顶级代码。 Counter1代码如下:
module counter1(clk, dout);
input clk;
output [16:0] dout;
reg [16:0] dout;
always@(posedge clk)
begin
if(dout<17'd64516)
dout=(dout+17'd1);
else
dout=17'b0;
end
endmodule
问题是当counter1的dout输出从00000000000000000变为00000000000000001时,addr_reg [0]的值从00000000000000000变为0000000000000000X。可能是什么问题?
答案 0 :(得分:0)
如果输出某些信号,则应将其声明为wire
。
wire [7:0] dout;
wire [3:0] count;
第二件事是dout_reg[count]=dout
如何将output
分配给内部信号?我想这里也可能是一个错误。检查逻辑。
如果你显示inputhex
模块的代码,将会更清楚(输入,输出和逻辑在哪里)。