设计一个微处理器。它的工作原理如下
1.在写操作期间(中心,(wr,msel,mclk,男性) - >高), adr 上的任何内容都应放在 adbus 上(在内部多路复用)以查找存储器的地址位置。之后, din 上的所有数据都应该再次放入adbus中以便写入内存。
2.在读取操作(现在 wr 为低以指示读取操作)期间, addr 内容应再次置于 adbus 中。所有上述内容的移动都应该在 poskge clk 进行。但只有在阅读操作中,无论adbus中存在的数据是什么,都应该在 dout
其他详细信息
一个。 cen 当低时只访问读写操作
湾当高adbus携带写入数据时 mwr
℃。 男性记忆添加。锁存启用,当高运载时添加。资讯
d。 mrd 高时,adbus承载读取数据并在clk下降沿后由内存驱动
即 msel 芯片启用(应该很高)
F。 mclk 追踪内存。这是一个棘手的部分 - >读取数据在 mclk
的下降沿后可用于 adbusmwr , mrd ,男性中只有一个在时钟周期内可能为高电平,并且在锁存的add处发生读/写操作。在记忆中(不知道它究竟意味着什么!!!)
module mem_controller(addr,din,cen,wr,clk,dout,mclk,male,msel,mwr,mrd,adbus);
input [7:0] addr;
input [7:0] din;
input cen,wr,clk;
output reg [7:0] dout;
output mclk,male,msel,mwr,mrd;
inout [7:0] adbus;
wire [7:0] adbus;
initial
clk = 1'b1;
// assign addr = 8'b01010101;
// assign din = 8'b01111111;
// assign dout = 8'b10000000;
// assign adbus = 8'b10101111;
assign male = 1'b0;
assign wr = 1'b0;
assign msel = 1'b0;
assign mwr = 1'b0;
assign mwd = 1'b0;
assign cen = 1'b1;
always
#10 clk = ~clk;
initial
begin
#20 cen = 1'b0;
#10 wr = 1'b1;
#10 msel = 1'b1;
#10 mclk = 1'b1;
#10 male = 1'b1;
#20 male = 1'b0;
#20 mwr = 1'b1;
#20 mwr = 1'b0;
#20 wr = 1'b0;
#20 male = 1'b1;
#20 male = 1'b0;
#20 mrd = 1'b1;
#20 mrd = 1'b0;
#20 msel = 1'b1;
#0 mclk = 1'b0;
#20 cen = 1'b1;
#20 $finish;
end
always @(posedge clk)
begin
if ((!cen) && wr && msel && mclk && male)
adbus =addr;
else if ((!cen) && wr && msel && mclk && mwr)
adbus = din;
else if ((!cen) && (!wr) && msel && mclk && male)
adbus = addr;
end
always @(negedge clk)
begin
if((!cen) && (!wr) && msel && mclk && mrd)
dout = adbus;
end
endmodule
显示的错误是
对矢量线'adbus'的引用不是合法的注册或变量左值
和
阻止作业的非法左侧
我也无法将其作为reg(它会显示以下错误)
“非法重新声明'adbus'为reg”
请帮忙......
答案 0 :(得分:2)
initial blocks
需要转移到测试平台。 assign
语句连接输出,并直接更改初始块中的值。<=
)inout
是一个三态,需要指定为:
assign adbus = output_enable ? adbus_out : 8'bz;
clk
驱动程序(always #10 clk = ~clk;
)需要在测试平台上。