`timescale 1ns / 1ps
module temp(
inout[7:0]io_data,
input cpu_wr,
input cpu_rd,
input[3:0]port_io,
input[7:0]port_key,
input[7:0]port_sen1,
input[7:0]port_sen2,
output reg [7:0]port_out1,
output reg [7:0]port_out2,
output reg [7:0]port_led,
output reg [7:0]port_lcd,
);
always @(cpu_wr)
begin
if(cpu_wr==1'b0)
begin
if(port_io==4'b1011) port_lcd=io_data;
if(port_io==4'b0100) port_led=io_data;
end
if(cpu_wr==1'b1)
begin
if(port_io==4'b0101) port_out1=io_data;
if(port_io==4'b0110) port_out2=io_data;
end
end
endmodule
问题:
如上,cpu_wr触发, 在cpu_wr==1'b0时lcd和led动作,cpu_wr==1'b1时port_out动作。
但它们cpu_wr只要变化就工作。
如下时可以正常工作。
=========================
always @(negedge cpu_wr)
begin
if(port_io==4'b1011) port_lcd=io_data;
if(port_io==4'b0100) port_led=io_data;
end
always @(posedge cpu_wr)
begin
if(port_io==4'b0101) port_out1=io_data;
if(port_io==4'b0110) port_out2=io_data;
end
============================
但想写在一个语句中,求教各位大侠,如何解决?
你的第二种写法是可以的。
第一种写法是错误的,生成了latch
我不认为他们应该写在一个always里面。
引用: 引用 4 楼 benjaminweber 的回复:
一个信号不能在两个always中被赋值,这是不允许的
你的这种link_data的逻辑恐怕不能实现,没有其他的实现方式吗?
我认为你对协议的理解也许有误差。
是的,我也知道有问题,但不知如何解决?求救了!!!!
多谢二楼!!!!
改成如下:
module temp(
inout[7:0]io_data,
input cpu_wr,
input cpu_rd,
input[3:0]port_io,
input[7:0]port_key,
input[7:0]port_sen1,
input[7:0]port_sen2,
output reg [7:0]port_out1,
output reg [7:0]port_out2,
output reg [7:0]port_led,
output reg [7:0]port_lcd,
);
reg[7:0] data_reg;
reg[7:0] d_reg;
reg link_data;
assign io_data=link_data?data_reg:8'bzzzzzzzz;
always @(negedge cpu_wr)
begin
link_data=0;
if(port_io==4'b1000) port_lcd=io_data;
if(port_io==4'b0100) port_led=io_data;
if(port_io==4'b0101) port_out1=io_data;
if(port_io==4'b0110) port_out2=io_data;
end
always @(negedge cpu_rd)
begin
if(port_io==4'b0000) data_reg=port_key;
if(port_io==4'b0001) data_reg=port_sen1;
if(port_io==4'b0010) data_reg=port_sen2;
link_data=1;
end
endmodule
提示如下错误:
“Multi-source in Unit on signal ; this signal is connected to multiple drivers.”
不知如何改?
如果屏蔽link_data就编译不出错,但其结果是不对的。
感觉inout很难啊!
module cpldpt100(
// aux2ctl,
// aux1ctl,
// injctl,
// colctl,
// detctl,
pt100ctl,
dianjictl,
// dianjiA,
// dianjiB,
// dianjiC,
// dianjiD,
l430pt100,
// 430CTL0,
// 430CTL1,
// 430CTL2,
// 430dian0,
// 430dian1
l430dianctl
);
//input 430CTL0;
//input 430CTL1;
//input 430CTL2;
//input 430dian0;
//input 430dian1;
//output dianjiA;
//output dianjiB;
//output dianjiC;
//output dianjiD;
//output aux2ctl;
//output aux1ctl;
//output injctl;
//output colctl;
//output detctl;
output [4:0] pt100ctl;
output [3:0] dianjictl;
input [2:0] l430pt100;
input [1:0] l430dianctl;
wire[4:0] pt100ctl;
assign pt100ctl = (l430pt100 == 3'b000 ) ? 5'b11110 :
(l430pt100 == 3'b001 ) ? 5'b11101 :
(l430pt100 == 3'b010 ) ? 5'b11011 :
(l430pt100 == 3'b011 ) ? 5'b10111 :
(l430pt100 == 3'b100 ) ? 5'b01111 : 5'b11111;
wire[3:0] dianjictl;
assign dianjictl = (l430dianctl == 2'b00 ) ? 4'b0001 :
(l430dianctl == 2'b01 ) ? 4'b0010 :
(l430dianctl == 2'b10 ) ? 4'b0100 :
(l430dianctl == 2'b11 ) ? 4'b1000 : 4'b0000;
endmodule
那个 赛灵思的程序和 altera的程序不能通用的 我的是 veilog 写的