gaochy1126 发表于 2022-2-27 18:04

Verilog指令_assign用法

一、引入语法的概念 1、只有寄存器类型的信号才可以在always和initial 语句中进行赋值,类型定义通过reg语句实现。
  2、always 语句是一直重复执行,由敏感表(always 语句括号内的变量)中的变量触发。
  3、always 语句从0 时刻开始。
  4、在begin 和end 之间的语句是顺序执行,属于串行语句。
二、总结下几种assign用法:1.作为信号量输出,通过寄存器连续赋值output oLED;
//internal signal
reg sr_LED; //用独热码表示LED亮灯位置。
assignoLED = ~ sr_LED; //向LED灯接口输出信号。2.作为信号量输出,通过寄存器拼接数据位实现。
output oSI_DATA;
//internal signalreg [ 3: 0] s_HEX;reg [ 7: 0] s_SEGBINARY; // s_SEGBINARY should be the DOTreg [ 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 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;
inputiSI_DATA;
output       oSI;
output       oCP;
reg [ 3: 0] sr_cnt;
reg sr_si_data;
reg sr_cp;
reg sr_en;
assign oSI = sr_si_data;
assign oCP = sr_en & iCLK50M;



三、对比输出寄存器变量和信号量

下面是功能相同但写法不同的两段代码:第一段Amodule assign_test_a (
                     clk,
                     lhold,
                     lholda
);input clk;
input lhold;
output lholda;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;reg lholda_r;
always @(posedge clk)
if (lhold)
   lholda_r<=lhold;
else
   lholda_r<=0; assignlholda=lholda_r;
endmodule

页: [1]
查看完整版本: Verilog指令_assign用法