所以你将out <= out + 1 改为out <= out + 1'b1 就可以了。
另外注意:在时序电路里面要用<=
再回答你的第一个问题
只需要将load信号先进行上升沿检测,(即在上升沿装载)即可,这样即使load一直为高电平,也不会影响计数。至于你提到的当reset有效时漏掉计数是正确的,否则复位也就没有意义了。
module count(out,data,load,reset,clk)
output[7:0] out
input[7:0] data
input load,clk,reset
reg[7:0] out
//下面是进行load上升沿检测的代码,这样即使load一直为高电平,也不会影响计数
reg ld_r1,ld_r2
wire load_p
always @(posedge clk) begin
if (!reset) begin
ld_r1<=1'b0
ld_r2<=1'b0
end
else begin
ld_r1<=load
ld_r2<=ld_r1
end
end
assign load_p = ld_r1 &(~ld_r2)
//----------------------------------
always @(posedge clk) begin
if (!reset)
out <= 8'h0
else
if (load_p) //这里需要改成 load_p
out <= data
else
out <= out + 1'b1
end
endmodule
西门子S7-300中RLO边沿检测指令分别为:1、POS
地址上升沿检测
符号
参数
数据类型
存储区
描述
<地址1>
BOOL
I、Q、M、L、D
已扫描信号
<地址2>
BOOL
I、Q、M、L、D
M_BIT边沿存储位,存储<地址1>的前一个信号状态
Q
BOOL
I、Q、M、L、D
单触发输出
描述
POS
(地址上升沿检测)比较<地址1>的信号状态与前一次扫描的信号状态(存储在<地址2>中)。如果当前RLO状态为"1"且其前一状态为"0"(检测到上升沿),执行此指令后RLO位将是"1"。
2、NEG
地址下降沿检测
符号
参数
数据类型
存储区
描述
<地址1>
BOOL
I、Q、M、L、D
已扫描信号
<地址2>
BOOL
I、Q、M、L、D
M_BIT边沿存储位,存储<地址1>的前一个信号状态
Q
BOOL
I、Q、M、L、D
单触发输出
描述
NEG
(地址下降沿检测)比较<地址1>的信号状态与前一次扫描的信号状态(存储在<地址2>中)。如果当前RLO状态为"0"且其前一状态为"1"(检测到上升沿),执行此指令后RLO位将是"1"。
S7-300是德国西门子公司生产的可编程序控制器(PLC)系列产品之一。其模块化结构、易于实现分布式的配置以及性价比高、电磁兼容性强、抗震动冲击性能好,使其在广泛的工业控制领域中,成为一种既经济又切合实际的解决方案。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)