这是一篇入门文章,笔者也曾经迷茫过,也很困惑过,硬件编程是怎么样的,但是功夫不负有心人,希望我的文章获得读者的认同。谦虚使人进步,希望不足之处请提意见,对于有意思的东西大家可以探讨一下。
硬件编程verilog 建模
一个简单的模型
流水灯的实现
概念介绍:
软核(SoftCore):verilog VHDL模型 称为软核
固核(FirmCore):电路结构编码文件NetList 称为固核。
硬核(HardCore): 电路结构版图掩模 称为硬核。
整体效果
首先采用Top-down she设计模式 生成的门级网表(NetList)结构如下
!!!如何查看网表呢? 步骤:Quartus---> Tools--->Netlist
网表 文件如下图所示
接下来 就是子模块的建立
/******************系统硬件要求*******************************
系统时钟 晶振为50MHZ
复位 初始为0,按下为1
LED0
LED1
LED2
LED3
**************************************************/
//=====================================================//
module led0_module(clk,rst,LED_OUT); //!!!这里要记得加“;”
/*******说明一下*******
输入为时钟和复位
输出为led灯
****************/
input clk;
input rst;
output LED_OUT;
/*******************************************/
Parameter T100MS=23’d5_000_000;//2^23超过5M所以位宽为23位的十进制下的5*10^6
//======接下来制作计数器=======================================
Reg[22:0] Count0; //寄存器为Count0
always@(posedge clk or negedge rst)
if(!rst)
Count0<=23’d0;//寄存器清零
else if(Count0==T100MS)
Count0<=23’d0;//寄存器清零
else
Count0<=23’d0+1’b1;
//=======接下来制作输出led的寄存器=============
Reg rLED_OUT; //!!!1位寄存器不需要说明
always@(posedge clk or negedge rst)
if(!rst)
rLED_OUT <=1’b0;//1位二进制清零
else if(Count0>=23’d0&&Count0<=22’d1_250_000)
rLED_OUT <=1’b1;//寄存器清零
else
rLED_OUT <=1’b0;
//=============================================
assign LED_OUT= rLED_OUT;
endmodule //!!!注意这里必须添加 结尾不用”;”
/***************以上为模块1,其余三个模如法复制修改名称就可以************************************/
接下来制作顶层模块
/***************
制作顶层模块时注意最后文件也要保存为module后的名字一定要一致***********************************/
Module top_module(clk,rst, LED_OUT) //!!!该模块要保存为top_module.v文件
input clk;
input rst;
output[3:0] LED_OUT; //输出四盏灯
wire led0_out; //wire 表示物理量
module led0_module
(
.clk(clk),
. rst(rst),
.LED_OUT(led0_out)
);
wire led1_out; //wire 表示物理量
module led1_module
(
.clk(clk),
. rst(rst),
.LED_OUT(led1_out)
);
wire led2_out; //wire 表示物理量
module led2_module
(
.clk(clk),
. rst(rst),
.LED_OUT(led2_out)
);
wire led3_out; //wire 表示物理量
module led3_module
(
.clk(clk),
. rst(rst),
.LED_OUT(led3_out)
);
assign LED_OUT ={ led3_out , led2_out , led1_out , led0_out };// assign表示连续赋值
endmodule
最终实现一个流水灯,基本建模就完成了