作业帮 > 综合 > 作业

verilog语句出现循环赋值怎么解决

来源:学生作业帮 编辑:百度作业网作业帮 分类:综合作业 时间:2024/06/25 19:48:24
verilog语句出现循环赋值怎么解决
assign C3=(S>4'b1001)?(C3+4'b0001):C3;
assign S=(S>4'b1001)?(S-4'b1001):S;
这两句该怎么改呢 请问大神们,不能用if case语句哦
verilog语句出现循环赋值怎么解决
这种赋值不能用assign的组合逻辑,得用always的时序逻辑,否则就会出现毫无意义的逻辑混乱.
要把HDL最终的程序想象成实际的门电路,想象成与或非触发器等芯片. 组合逻辑等于把与门的输出接到自己的输入, 电信号会反复里面转圈, 类似一个脉冲发生器了.
正确的写法如下, 你得先定义个时钟信号clk.
always@(posedge clk)
if (S>4'b1001) begin
C3
再问: 不用时序逻辑 用组合逻辑不能实现吗?我主要想实现两个四位二进制数相加,最后还要转换成十进制显示在七段显示译码器上,所以1010~1111这几个不用,只用0000~1001
再答: 明白你的意思了.你这段程序其实是在进位修正. 如果仅仅是你这样的求并显示这个需求, 是可以用组合电路实现的. 只需定义两个进位变量, 第一个是临时的, 第二个是修正后用于输出的. 不能你上面的那种自我循环调用,具体程序就不写了. 能用组合电路的最根本原因还是因为你输入里暗含了一个节拍性输入. 但我不建议你用组合逻辑. 那样带来竞争和冒险后不太好处理. 就是在你求和及在输出转换过程中, 会引入大量不稳定临时状态,而且每次综合后的效果也不一样. 虽然这种不稳态在LED上显示时几乎肉眼看不出来, 但这不是好的程序风格.