case语句verilog(verilog中用case语句时一定要用always块吗)

本文目录
- verilog中用case语句时一定要用always块吗
- 在verilog中为什么能用case语句尽量不用if语句
- verilog的case语句问题
- Verilog中,case语句是并发的么即只会执行其中一条么 这样的话,是不是以下两个程序是等价的
- 在verilog中case语句中没有default可以吗
- Verilog中的case (select[1:2])是什么意思
- verilog语法,有关case语句
verilog中用case语句时一定要用always块吗
是的.但是always块可以综合成组合电路,利用case语句可以综合成组合的mux多路选择器,也可以综合成时序电路,同步的mux.不是说你在代码里定义一个reg型变量,综合器就会综合处一个寄存器来,case必须在always块里,always里面的被赋值变量必须是reg型,这是语法的规定,只能遵守。
写代码的时候不要加入触发器(不要边沿触发),最终综合出来的仍然是一个组合电路。case也注意要加上default,不然会综合一个存储器出来。case(DIN)
8’b1111_1110: KEY = 4’b0001;
8’b1111_1101: KEY = 4’b0010;
8’b1111_1011: KEY = 4’b0011;
8’b1111_0111: KEY = 4’b0100;
8’b1110_1111: KEY = 4’b0101;
8’b1101_1111: KEY = 4’b0110;
8’b1011_1111: KEY = 4’b0111;
8’b0111_1111: KEY = 4’b1000;
8’b1111_1111: KEY = 4’b0000;
default: KEY = 4’b0000;
endcase
else
KEY = 4’b0000; 还有,同步复位和异步复位一个就行了,去掉negedge rst或者if(!rst)
我随便写了下,你看看吧,每12个时钟周期反转一次clk2就行了
`timescale 1ns/1ps
module div (
input wire clk,
input wire rst_n,
output reg clk2
);
reg [3:0] state;
always @ (posedge clk )
if(!rst_n)
begin
state 《= 4’d0;
clk2 《= 1’b0;
end
else
case(state)
4’d0,4’d1,4’d2,4’d3,
4’d4,4’d5,4’d6,4’d7,
4’d8,4’d9,4’d10:
state 《= state + 1’b1;
4’d11:
begin
state 《= 0;
clk2 《= ~clk2;
end
endcase
endmodule
在verilog中为什么能用case语句尽量不用if语句
首先从软件角度考虑
if加若干个else if可以组成一个与case类似的功能
但需要注意的是if-else if是有优先级的,也就是第一个if不成立的话,才判断第二个else if
那么问题就来了,如果这个if组合里有10个else if条件,那么逻辑就需要做一个在一个时钟周期内能判断10个条件的硬件电路来,这样是不明智也是不合理的,比较容易造成时序不满足
虽然说if有这样的缺点,但它的优点是每个else if都可以判断不同的条件,比较灵活
一般来说,如果判断的条件只是一个向量的不同值,那么case是最合适的
如果判断的条件是许多不同的向量或者变量,那么if还是比较合适的
当然也可以选择case和if的组合,这样灵活性和时序都比较好
verilog的case语句问题
always @(EN or DIN)
if(EN)
case(DIN)
8’b1111_1110: KEY = 4’b0001;
8’b1111_1101: KEY = 4’b0010;
8’b1111_1011: KEY = 4’b0011;
8’b1111_0111: KEY = 4’b0100;
8’b1110_1111: KEY = 4’b0101;
8’b1101_1111: KEY = 4’b0110;
8’b1011_1111: KEY = 4’b0111;
8’b0111_1111: KEY = 4’b1000;
8’b1111_1111: KEY = 4’b0000;
default: KEY = 4’b0000;
endcase
else
KEY = 4’b0000;
Verilog中,case语句是并发的么即只会执行其中一条么 这样的话,是不是以下两个程序是等价的
case语句是并发的,但是编译过程还是从上到下的。
你的体温是阻塞和非阻塞的区别,它们在不同的always模块里面是不一样的,非阻塞赋值要等上升沿结束之后,在波形图上可以看到,并不能够立刻采到的,而阻塞赋值是可以的。
在verilog中case语句中没有default可以吗
组合逻辑的case最好要有default,因为如果你的case不全,就会产生锁存器。及时你的case都包含全了,但是还是建议加上default,因为万一你哪天该代码,把某个case给去掉了,就会产生隐含的latch。所以,最好加上default。
对组合逻辑来讲,case的default和if...else是需要特别注意要有default和else的。
对时序逻辑来讲,如果默认情况是什么都不做的话,default和else是可以不要的。要跟不要没有什么区别。
always @(a or b or c)的这种块是组合逻辑。
always @(posedge clk )的这种块是时序逻辑。
assign语句是组合逻辑。
Verilog中的case (select[1:2])是什么意思
比如select
=
8’b1111_0101;
那么select[1:2]
为
10。
如果【待定值】等于case中的select[1:2](10),那么这条case语句就被执行。
verilog语法,有关case语句
在这里不能以C语言的语法来理解这段逻辑,应该考虑case语句在verilog里面综合完之后生成的什么电路。
case语句是分支比较语句,也就是说,本质上就是case后面括号中的值与下面每个分支开头的值作比较,相同则执行。
看你在楼上的代码,因该是licSeq的哪一位等于1,就执行哪一个对应分支语句。

更多文章:
majority of(the majority of 和 a majority of的区别以及用法例句)
2026年10月11日 07:40
another time(another time和other time的区别)
2026年10月11日 05:00







