cpld问题,求教各位大侠(散分)

zmn12   2010-5-3 13:40 楼主
`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
============================
但想写在一个语句中,求教各位大侠,如何解决?

回复评论 (7)

你的第二种写法是可以的。
第一种写法是错误的,生成了latch
我不认为他们应该写在一个always里面。
点赞  2010-5-3 22:05
提示: 作者被禁止或删除 内容自动屏蔽
点赞  2010-5-4 04:10
引用: 引用 4 楼 benjaminweber 的回复:
一个信号不能在两个always中被赋值,这是不允许的
你的这种link_data的逻辑恐怕不能实现,没有其他的实现方式吗?
我认为你对协议的理解也许有误差。

是的,我也知道有问题,但不知如何解决?求救了!!!!
点赞  2010-5-4 08:58
学习~~
点赞  2010-5-4 21:53
多谢二楼!!!!

改成如下:
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很难啊!
点赞  2010-5-3 22:44
帮你顶
点赞  2010-5-4 01:06
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 写的
点赞  2010-5-4 18:05
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复