Verilog语法学习(1)

举报
nimo的小舔狗 发表于 2022/05/11 00:38:59 2022/05/11
【摘要】 过程语句(initial、always) 在一个模块(module)中 initial语句常用于仿真中的初始化,always可用于仿真和可综合电路 initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。 使用initial和always语句的次数是不受限...

过程语句(initialalways

在一个模块(module)中
initial语句常用于仿真中的初始化,always可用于仿真和可综合电路
initial过程块中的语句仅执行一次;always块内的语句则是不断重复执行的。
使用initial和always语句的次数是不受限制的。

  
  1. module mux4_1(out,in0,in1,in2,in3,sel);
  2. output out;
  3. input in0,in1,in2,in3;
  4. input[1:0] sel; reg out;
  5. always @(in0 or in1 or in2 or in3 or sel)
  6. case(sel)
  7. 2'b00: out=in0;
  8. 2'b01: out=in1;
  9. 2'b10: out=in2;
  10. 2'b11: out=in3;
  11. default: out=2'bx;
  12. endcase
  13. endmodule

  
  1. ·timescale 1ns/1ns
  2. module mux4_TB;
  3. reg tin0,tin1,tin2,tin3;
  4. reg[1:0] tsel;
  5. initial
  6. begin
  7. tin0=0; tin1=1;tin2=0;tin3=1;
  8. #5 tsel=0;
  9. #5 tsel=1;
  10. #5 tsel=2;
  11. #5 tsel=3;
  12. $stop;
  13. end
  14. mux4_1 m1(tout,tin0,tin1,tin2,tin3,tsel);
  15. endmodule

 always过程语句格式

always @(<敏感信号表达式event-expression>)
begin 过程赋值
if-else,case,casex,casez选择语句
while,repeat,for循环
task,function调用
end
“always”过程语句通常是带有触发条件的,触发条件写在敏感信号表达式中,只有当触发条件满足时, “begin-end”块语句才能被执行。

 

 事件表达式或敏感信号列表

always @(<敏感信号表达式event-expression>)
作用:当表达式中变量的值改变,就会引发块内语句的执行。
列出影响块内取值的所有信号。用“or”、“,”连接;
信号形式要统一(电平信号、边沿信号)。

 

例如: always@(a)        // 当信号 a 的值发生改变
always @(a b)       // 当信号 a 或信号 b 的值发生改变
always @* @ (* )    // 所有驱动信号
always @( posedge clock)    // clock 的上升沿到来时
always @( negedge clock)    // clock 的下降沿到来时
always @( posedge clk negedge reset)   
clk 的上升沿到来或 reset 信号的下降沿 到来

 posedge和negedge

对于 时序电路, 事件通常是由 时钟边沿触发 的;
同步置数(高电平)、同步清零(低电平)的模 256 的计数器

 同步/异步、高/低电平有效

时钟 clk 使能信号 reset load
always@ posedge clk //reset load 同步信号
always@ posedge clk posedge reset //reset 异步(高), load 同步
always@ posedge clk posedge reset negedge load

        reset异步(高)、load异步(低)

出现 敏感列表 中的使能信号,都是异步信号, 不出现 同步;
异步使能 信号, posedge 对应 高电平 有效, negedge 对应 低电平 有效。

  
  1. always @(posedge clk) //clk上升沿触发
  2. begin
  3. if(!reset) out=8'h00; //同步清0,低电平有效
  4. else if(load) out=data; //同步预置
  5. else out=out+1; //计数
  6. end

  
  1. always @(posedge clk,posedge load) //clk上升沿触发
  2. begin
  3. if(!reset) out=8'h00; //同步清0,低电平有效
  4. else if(load) out=data; //异步预置,高电平有效
  5. else out=out+1; //计数
  6. end

  
  1. always @(posedge clk,negedge reset) //clk上升沿触发
  2. begin
  3. if(!reset) out=8‘h00; //异步清0,低电平有效
  4. else if(load) out=data; //同步预置
  5. else out=out+1; //计数
  6. end

文章来源: blog.csdn.net,作者:渣渣ye,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/yyfloveqcw/article/details/123781135

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。