verilog--电平信号触发16进制计数器

jakzon_245 2012-11-06 02:24:15
怎么写由电平信号触发的十六进制计数器?即输入电平每改变一次,计数器增1。

。。。下面是小弟我写的,由两位电平输入信号触发的4位BCD计数器,但全编译后总生成组合循环,搞了两天。。。


module SimHex(Hhigh,Hlow,buffer,bufH,bufL);
input Hhigh,Hlow;
output reg[3:0] bufH,bufL;
output reg[7:0] buffer;
reg[3:0] D;

parameter f=4'b0000;
parameter t=4'b0001;
parameter HF=4'b1111;

always @(bufH or buffer) begin//high-bit counter in hexdecimal
case(bufH)
4'b0000:bufH<=4'b0001;
4'b0001:bufH<=4'b0010;
4'b0010:bufH<=4'b0011;
4'b0011:bufH<=4'b0100;
4'b0100:bufH<=4'b0101;
4'b0101:bufH<=4'b0110;
4'b0110:bufH<=4'b0111;
4'b0111:bufH<=4'b1000;
4'b1000:bufH<=4'b1001;
4'b1001:bufH<=4'b1010;
4'b1010:bufH<=4'b1011;
4'b1011:bufH<=4'b1100;
4'b1100:bufH<=4'b1101;
4'b1101:bufH<=4'b1110;
4'b1110:bufH<=4'b1111;
4'b1111:bufH<=4'b0000;
default:bufH<=4'b0000;
endcase
end

always @(buffer) begin//low-bit counter in hexdecimal
case(bufL)
4'b0000:bufL<=4'b0001;
4'b0001:bufL<=4'b0010;
4'b0010:bufL<=4'b0011;
4'b0011:bufL<=4'b0100;
4'b0100:bufL<=4'b0101;
4'b0101:bufL<=4'b0110;
4'b0110:bufL<=4'b0111;
4'b0111:bufL<=4'b1000;
4'b1000:bufL<=4'b1001;
4'b1001:bufL<=4'b1010;
4'b1010:bufL<=4'b1011;
4'b1011:bufL<=4'b1100;
4'b1100:bufL<=4'b1101;
4'b1101:bufL<=4'b1110;
4'b1110:bufL<=4'b1111;
4'b1111:bufL<=4'b0000;
default:bufL<=4'b0000;
endcase
end

always @(Hhigh or Hlow) begin
buffer<={bufH,bufL};
bufH<=buffer>>4;
bufL<=buffer;
end

endmodule

若有高手知正解,烦请给出,先表谢意。
...全文
698 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbing7 2012-11-06
  • 打赏
  • 举报
回复
看来你得弄一个内部的定时器,定时去扫IO,监控电平变化 产生变化条件,再更新BCD计数器
falloutmx 2012-11-06
  • 打赏
  • 举报
回复
你这个就是组合逻辑,为啥不用时序逻辑做?还有,不要在不同always块里对同一个寄存器赋值
net_friends 2012-11-06
  • 打赏
  • 举报
回复
没有时钟你这个能做出来?
jakzon_245 2012-11-06
  • 打赏
  • 举报
回复
谢谢咯。
但有别的信号 而且这种接法貌似没有经过DFF:

这种觉得经过了DFF的接法却又形成了组合环路。。。:
jakzon_245 2012-11-06
  • 打赏
  • 举报
回复
先附上结构图:



再附上刚改的代码,编译没报组合环路,


module SimHex(Hout,Hctrl,Lctrl,Lout,buffer);
input Hctrl,Lctrl;
output reg[3:0] Hout,Lout;
output reg[7:0] buffer;
reg[3:0] Hin,Lin;
reg[3:0] bufH,bufL;

/*parameter f=4'b0000;
parameter t=4'b0001;
parameter HF=4'b1111;*/

always @(Hin or bufH) begin//high-bit counter in hexdecimal
case(Hin)
4'b0000:bufH<=4'b0001;
4'b0001:bufH<=4'b0010;
4'b0010:bufH<=4'b0011;
4'b0011:bufH<=4'b0100;
4'b0100:bufH<=4'b0101;
4'b0101:bufH<=4'b0110;
4'b0110:bufH<=4'b0111;
4'b0111:bufH<=4'b1000;
4'b1000:bufH<=4'b1001;
4'b1001:bufH<=4'b1010;
4'b1010:bufH<=4'b1011;
4'b1011:bufH<=4'b1100;
4'b1100:bufH<=4'b1101;
4'b1101:bufH<=4'b1110;
4'b1110:bufH<=4'b1111;
4'b1111:bufH<=4'b0000;
default:bufH<=4'b0000;
endcase
end

always @(Lin or bufL) begin//low-bit counter in hexdecimal
case(Lin)
4'b0000:bufL<=4'b0001;
4'b0001:bufL<=4'b0010;
4'b0010:bufL<=4'b0011;
4'b0011:bufL<=4'b0100;
4'b0100:bufL<=4'b0101;
4'b0101:bufL<=4'b0110;
4'b0110:bufL<=4'b0111;
4'b0111:bufL<=4'b1000;
4'b1000:bufL<=4'b1001;
4'b1001:bufL<=4'b1010;
4'b1010:bufL<=4'b1011;
4'b1011:bufL<=4'b1100;
4'b1100:bufL<=4'b1101;
4'b1101:bufL<=4'b1110;
4'b1110:bufL<=4'b1111;
4'b1111:bufL<=4'b0000;
default:bufL<=4'b0000;
endcase
end

always @(Hctrl or Lctrl) begin
Hin<=bufH;
Hout<=bufH;
//Hin<=Hout;

Lin<=bufL;
Lout<=bufL;
//Lin<=Lout;
buffer<={Hout,Lout};
end

endmodule


jakzon_245 2012-11-06
  • 打赏
  • 举报
回复
引用 2 楼 falloutmx 的回复:
你这个就是组合逻辑,为啥不用时序逻辑做?还有,不要在不同always块里对同一个寄存器赋值
先谢谢宝贵意见! 用电平信号的改变来是计数器自增是模拟有输入时使BCD计数器自增,该模块是我实验中的一个处理过程。。

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧