verilog中assign语句

/**************************************
* Module: assign
* Date:2014-08-10  
* Author: hemmingway@163.com 
*
* Description: verilog中的assign语句的用法
***************************************/


/*
一、引入语法的概念
     1、只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实现。
  2、always 语句是一直重复执行,由敏感表(always 语句括号内的变量)中的变量触发。
  3、always 语句从0 时刻开始。
  4、在begin 和end 之间的语句是顺序执行,属于串行语句。
*/


// assign 语句的用法
module  test;


// 1.作为信号量输出,通过寄存器连续赋值
output [3:0] oLED;        // 默认是wire类型,需要持续输出才行


//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_pluse;  
assign oSEG_STATE = sr_SEG_STATE;
assign oCP_PLUSE = sr_cp_pluse;
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;


endmodule




//
//
//
// 下面是功能相同但写法不同的两段代码:
// 第一段A
module assign_test_a (
                       clk,
                       lhold,
                       lholda
);
input clk;
input lhold;
output lholda;      // 将输出定义为reg类型, 不用assign来持续输出了
reg lholda;


always @(posedge clk)
if (lhold)
 lholda<=lhold;
else
 lholda<=0;


endmodule








// 第二段B
module assign_test_b (
                       clk,
                       lhold,
                       lholda
);
input clk;
input lhold;
output lholda;        // 默认是wire类型的
reg lholda_r;         // 定义一个内部的reg变量,


always @(posedge clk)
  if (lhold)
     lholda_r<=lhold;
  else
     lholda_r<=0;


assign  lholda=lholda_r;       // 进行持续赋值输出


endmodule




// 分析
/*
 从实用角度来说,这里的意义比较大。当内部有多个信号需要输出,可是输出引脚只有一个,那么这时就可以进行选择。如下:
assign  lholda= (条件)? (lholda_ra): lholda_rb;  可以嵌套使用。
   或者在这种情况下也非常有用。
     Lholda 与 内部的reg输出lholda_ra, lholda_rb,…., 存在逻辑函数关系
*/









  • 9
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值