Verilog中的assign

更新时间:2023-05-07 14:06:43 阅读: 评论:0

Verilog中的assign
(⼀)
assign ⽤于描述组合逻辑,⽤阻塞赋值,但assign语句是并⾏执⾏,(说明:阻塞赋值串⾏操作是局限于在behavior structual 描述内部,也就是指在initial and always block内部。)
所有的assign和always是并⾏执⾏的。
对assign之后不能加块,实现组合逻辑只能⽤逐句的使⽤assign 组合逻辑,如果不考虑门的延时的话当然可以理解为瞬时执⾏的,因此没有并⾏和顺序之分,并⾏和顺序是针对时序逻辑来说的。值得注意的是所有的时序块都是并⾏执⾏的。initial块只在信号进⼊模块后执⾏1次⽽always块是由敏感事件作为中断来触发执⾏的。
assign ⽤于连续赋值语句,if-el⽤于RTL级描述中,被赋值的变量都是reg类型。reg类型赋值分blocked和nonblocked,即=和<=,不需要再使⽤assign。
(⼆)
⼀、引⼊语法的概念
 1、只有寄存器类型的信号才可以在always和initial 语句中进⾏赋值,类型定义通过reg语句实现。
  2、always 语句是⼀直重复执⾏,由敏感表(always 语句括号内的变量)中的变量触发。
  3、always 语句从0 时刻开始。
  4、在begin 和end 之间的语句是顺序执⾏,属于串⾏语句。
⼆、总结下⼏种assign⽤法:
1.作为信号量输出,通过寄存器连续赋值
output [3:0]oLED;
//internal signal
reg [3:0]sr_LED; //⽤独热码表⽰LED亮灯位置。
assign  oLED[3:0] = ~ sr_LED[3:0]; //向LED灯接⼝输出信号。
2.作为信号量输出,通过寄存器拼接数据位实现。
output [15: 0] oSI_DATA;
//internal signal
reg [ 3: 0] s_HEX;
reg [ 7: 0] s_SEGBINARY; // s_SEGBINARY[2] should be the DOT
reg [ 3: 0] s_SEG_SEL;
assign oSI_DATA = {iLED_SEL,s_SEG_SEL,s_SEGBINARY};
3.作为信号量输出,通过判断条件,赋值给信号
output[ 1: 0] oSEG_STATE;
output        oCP_PLUSE;
wire s_CNTEQCYCLE;
parameter PARAM_7SEG_CYCLE = 32'd2500000;
reg [ 1: 0] sr_SEG_STATE;
reg [31: 0] sr_cnt;
reg        sr_cp_plu;
assign oSEG_STATE = sr_SEG_STATE;
assign oCP_PLUSE = sr_cp_plu;
assign s_CNTEQCYCLE = ( sr_cnt == PARAM_7SEG_CYCLE ) ? 1 : 0;
4.作为输出信号量,通过输⼊信号量赋值给输出,同样可以输⼊信号量和寄存器组合逻辑,赋值给输出信号量。input        iCLK50M;
input        iCP_PULSE;
input[15:0]  iSI_DATA;
output      oSI;
output      oCP;
reg [ 3: 0] sr_cnt;
reg [15: 0] sr_si_data;
reg sr_cp;
reg sr_en;
assign oSI = sr_si_data[15];
assign oCP = sr_en & iCLK50M;
三、对⽐输出寄存器变量和信号量
下⾯是功能相同但写法不同的两段代码:
第⼀段A
module assign_test_a (
clk,
lhold,
lholda
);
input clk;
input lhold;
output lholda;
reg lholda;
always @(podge clk)
if (lhold)
lholda<=lhold;
el
lholda<=0;
endmodule
第⼆段B
module assign_test_b (
clk,
lhold,
lholda
);
input lhold;
output lholda;
reg lholda_r;
always @(podge clk)
if (lhold)
lholda_r<=lhold;
el
lholda_r<=0;
assign  lholda=lholda_r;
endmodule
两端代码⽣成的电路时⼀样的,没有区别,只是在应⽤上有区别。
第⼀段A分析
第⼆段B的分析
Quartus RTL图
加⼊assign风格的综合结果Xillinx RTL图
1.从代码⾓度来看。 A是直接把内部reg信号做为输出,因此相对外部来说,外部信号引脚lholda没有选择的连接到reg输出信号。这⾥其实暗含了⽤根导线直接把reg的输出与lholda连接起来。因此B代码就是把这个暗含的明显化。因此他们的RTL没有多⼤区别。
2.从实⽤⾓度来说,这⾥的意义⽐较⼤。当内部有多个信号需要输出,可是输出引脚只有⼀个,那么这时就可以进⾏选择。如下:assign  lholda= (条件)? (lholda_ra): lholda_rb;  可以嵌套使⽤。
或者在这种情况下也⾮常有⽤。
Lholda 与内部的reg输出lholda_ra, lholda_rb,….,存在逻辑函数关系

本文发布于:2023-05-07 14:06:43,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/548742.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:输出   赋值   逻辑   信号量   寄存器   信号   组合   语句
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图