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

2024-11-28 05:29:57
推荐回答(5个)
回答(1):

是的.但是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 clk2 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 4'd11:
begin
state clk2 end
endcase
endmodule

回答(2):

是的.但是always块可以综合成组合电路,利用case语句可以综合成组合的mux多路选择器,也可以综合成时序电路,同步的mux.

回答(3):

case语句属于行为级建模,必须用在过程块中,即always或者initial中的begin...end或者fork...join语句中,但是由于initial语句块一般只用于测试,不可综合,因此只考虑always语句块中使用case语句

回答(4):

3234nbvf;ljl

回答(5):

是的。不然在assign语句中怎么用?