网站开发制作阶段的说课稿水发规划设计有限公司
news/
2025/9/23 9:53:40/
文章来源:
网站开发制作阶段的说课稿,水发规划设计有限公司,织梦网站安装出现dir,wordpress 自定义表一、 软件平台与硬件平台 软件平台#xff1a; 1、操作系统#xff1a;Windows-8.1 2、开发套件#xff1a;ISE14.7 3、仿真工具#xff1a;ModelSim-10.4-SE 硬件平台#xff1a; 1、FPGA型号#xff1a;XC6SLX45-2CSG324 二、 原理介绍 我的开发板上有4个LED灯#xf…一、 软件平台与硬件平台 软件平台 1、操作系统Windows-8.1 2、开发套件ISE14.7 3、仿真工具ModelSim-10.4-SE 硬件平台 1、FPGA型号XC6SLX45-2CSG324 二、 原理介绍 我的开发板上有4个LED灯原理图如下 由原理图可知仅当FPGA的对应管脚输入低电平时LED才会亮流水灯的效果可以轮流让四个对应管脚输出低电平来产生。 三、 目标任务 编写四个LED流水的Verilog代码并用ModelSim进行仿真仿真通过以后下载到开发板进行测试要求开发板上每个LED亮的时间为1s。 四、 设计思路与Verilog代码编写 由于每个LED亮的时间为1s所以首先很自然想到产生一个1s的时钟用来驱动后续逻辑有了这个1s的时钟以后就可以在这个1s时钟的节拍下对LED的输出进行以移位操作来产生流水灯的效果。 1、1s时钟的分频逻辑 由于主时钟是50MHz周期为20ns所以可以利用50MHz主时钟驱动一个计数器当计数器的值每次到达24999999时消耗的时间为25000000*20ns0.5s这时把分频器的输出反转并把计数值清0这样分频器的输出就会每隔0.5s翻转一次产生了一个1s的时钟。 Verilog代码如下 //
// 功能产生1s的时钟
//
always (posedge I_clk or negedge I_rst_n)
beginif(!I_rst_n)beginR_cnt_ls 32d0 ; R_clk_ls_reg 1b1 ;end else if(R_cnt_ls 32d24_999_999)beginR_cnt_ls 32d0 ;R_clk_ls_reg ~R_clk_ls_reg ; endelseR_cnt_ls R_cnt_ls 1b1 ;
endassign W_clk_ls R_clk_ls_reg ; 2、移位逻辑 有了1s的时钟信号以后就在这个1s时钟信号的驱动下对输出的LED寄存器进行移位操作产生流水效果。 Verilog代码如下 //
// 功能对输出寄存器进行移位产生流水效果
//
always (posedge W_clk_ls or negedge I_rst_n)
beginif(!I_rst_n) R_led_out_reg 4b0001 ; else if(R_led_out_reg 4b1000)R_led_out_reg 4b0001 ;else R_led_out_reg R_led_out_reg 1 ;
endassign O_led_out ~R_led_out_reg ; 五、 ModelSim仿真 写好逻辑以后为了确定时序是正确的最好写一个测试文件对功能进行仿真为了加快仿真速度修改分频逻辑计数器的计数值为24然后编写测试文件测试文件中激励产生的Verilog代码如下 initial begin// Initialize InputsI_clk 0;I_rst_n 0;// Wait 100 ns for global reset to finish#100;I_rst_n 1;// Add stimulus hereendalways #10 I_clk ~I_clk ; 仿真的时序图如下图所示 可以看到时序完全正确接下来就是绑定管脚生成bit文件下载到开发板测试了。 六、 进一步思考——C语言流水灯与Verilog流水灯区别 看完网上《Verilog那些事》系列博文以后作者提出了一种“仿顺序操作”方法其实以前自己写代码的时候无形之中一直在用这种思想但是一直没有提炼出来看完作者的介绍以后才发现确实是有那个“仿顺序”的味道。详细的博文请参考博客园博主akuei2的系列博文。这里我在总结一遍给以后留个印象。 C语言实现流水灯的大致代码框架如下 while(1) { 1、让第1个LED亮其他的灭 2、延时1s 3、让第2个LED亮其他的灭 4、延时1s 5、让第3个LED亮其他的灭 6、延时1s 7、让第4个LED亮其他的灭 8、延时1s } 在while(1)里面代码是一行一行的执行最后一行执行完毕以后在回到第一行重新开始新一轮的执行。就这样产生了流水的效果。 看到这里有人应该突然明白了吧这不正好就是Verilog中的一个状态机么。对应的Verilog代码也可以写出来了 always (posedge I_clk) begin case(R_state) 第1个状态让第1个LED亮其他的灭下一状态是第2个状态 第2个状态延时1s下一状态是第3个状态 第3个状态让第2个LED亮其他的灭下一状态是第4个状态 第4个状态延时1s下一状态是第5个状态 第5个状态让第3个LED亮其他的灭下一状态是第6个状态 第6个状态延时1s下一状态是第7个状态 第7个状态让第4个LED亮其他的灭下一状态是第8个状态 第8个状态延时1s下一状态是第1个状态 default endcase end 具体的代码如下 //
// 功能“仿顺序操作”
//
always (posedge I_clk or negedge I_rst_n)
beginif(!I_rst_n)beginR_state 3b000 ; R_cnt_ls 32d0 ;endelsebegin case(R_state)C_S0:beginR_led_out_reg 4b0001 ;R_state C_S1 ; endC_S1:beginif(R_cnt_ls C_CNT_1S)beginR_cnt_ls 32d0 ;R_state C_S2 ;endelseR_cnt_ls R_cnt_ls 1b1 ; endC_S2:beginR_led_out_reg 4b0010 ;R_state C_S3 ; endC_S3:beginif(R_cnt_ls C_CNT_1S)beginR_cnt_ls 32d0 ;R_state C_S4 ;endelseR_cnt_ls R_cnt_ls 1b1 ; endC_S4:beginR_led_out_reg 4b0100 ;R_state C_S5 ; endC_S5:beginif(R_cnt_ls C_CNT_1S)beginR_cnt_ls 32d0 ;R_state C_S6 ;endelseR_cnt_ls R_cnt_ls 1b1 ; endC_S6:beginR_led_out_reg 4b1000 ;R_state C_S7 ; endC_S7:beginif(R_cnt_ls C_CNT_1S)beginR_cnt_ls 32d0 ;R_state C_S0 ;endelseR_cnt_ls R_cnt_ls 1b1 ; end default: R_state 3b000 ; endcase end
endassign O_led_out ~R_led_out_reg ; 时序图如下图 时序图仍然正确实现了流水灯的效果 七、 总结 1、所谓的“仿顺序操作”实际上就是一个状态机通过状态的跳变实现“顺序执行”的效果。这种思想在后面写接口时序的时候还是挺管用的今后可以多多琢磨琢磨。 2、 C语言的while(1)和Verilog语言的always (posedge I_clk)有类似的地方只要CPU的时钟存在它们就一直执行下去。书上都说C语言是一种串行语言Verilog是一种并行语言实际上这里也能有体会C语言里只能有1个while(1)语句进入while(1)以后CPU就出不来了而Verilog中可以有多个always (posedge I_clk)语句并且每个always (posedge I_clk)同时运行的这就是两种语言最大的区别吧。 八、 附录 1、分频1s产生流水灯的完整代码 module led_work_top
(input I_clk ,input I_rst_n ,output [3:0] O_led_out
);reg [31:0] R_cnt_ls ;
wire W_clk_ls ;
reg R_clk_ls_reg ;
reg [3:0] R_led_out_reg ;//
// 功能产生1s的时钟
//
always (posedge I_clk or negedge I_rst_n)
beginif(!I_rst_n)beginR_cnt_ls 32d0 ; R_clk_ls_reg 1b1 ;end else if(R_cnt_ls 32d24_999_999)beginR_cnt_ls 32d0 ;R_clk_ls_reg ~R_clk_ls_reg ; endelseR_cnt_ls R_cnt_ls 1b1 ;
endassign W_clk_ls R_clk_ls_reg ;//
// 功能对输出寄存器进行移位产生流水效果
//
always (posedge W_clk_ls or negedge I_rst_n)
beginif(!I_rst_n) R_led_out_reg 4b0001 ; else if(R_led_out_reg 4b1000)R_led_out_reg 4b0001 ;else R_led_out_reg R_led_out_reg 1 ;
endassign O_led_out ~R_led_out_reg ;endmodule 2、 “仿顺序操作”产生流水灯完整代码 module led_work_top
(input I_clk ,input I_rst_n ,output [3:0] O_led_out
); reg [31:0] R_cnt_ls ;
reg [3:0] R_led_out_reg ;
reg [2:0] R_state ;parameter C_CNT_1S 32d49_999_999 ; parameter C_S0 3b000 ,C_S1 3b001 ,C_S2 3b010 ,C_S3 3b011 ,C_S4 3b100 ,C_S5 3b101 ,C_S6 3b110 ,C_S7 3b111 ;//
// 功能仿顺序操作
//
always (posedge I_clk or negedge I_rst_n)
beginif(!I_rst_n)beginR_state 3b000 ; R_cnt_ls 32d0 ;endelsebegin case(R_state)C_S0:beginR_led_out_reg 4b0001 ;R_state C_S1 ; endC_S1:beginif(R_cnt_ls C_CNT_1S)beginR_cnt_ls 32d0 ;R_state C_S2 ;endelseR_cnt_ls R_cnt_ls 1b1 ; endC_S2:beginR_led_out_reg 4b0010 ;R_state C_S3 ; endC_S3:beginif(R_cnt_ls C_CNT_1S)beginR_cnt_ls 32d0 ;R_state C_S4 ;endelseR_cnt_ls R_cnt_ls 1b1 ; endC_S4:beginR_led_out_reg 4b0100 ;R_state C_S5 ; endC_S5:beginif(R_cnt_ls C_CNT_1S)beginR_cnt_ls 32d0 ;R_state C_S6 ;endelseR_cnt_ls R_cnt_ls 1b1 ; endC_S6:beginR_led_out_reg 4b1000 ;R_state C_S7 ; endC_S7:beginif(R_cnt_ls C_CNT_1S)beginR_cnt_ls 32d0 ;R_state C_S0 ;endelseR_cnt_ls R_cnt_ls 1b1 ; end default: R_state 3b000 ; endcase end
endassign O_led_out ~R_led_out_reg ;endmodule 3、测试记录文件完整代码 module tb_led_work_top;// Inputsreg I_clk;reg I_rst_n;// Outputswire [3:0] O_led_out;// Instantiate the Unit Under Test (UUT)led_work_top U_led_work_top (.I_clk(I_clk), .I_rst_n(I_rst_n), .O_led_out(O_led_out));initial begin// Initialize InputsI_clk 0;I_rst_n 0;// Wait 100 ns for global reset to finish#100;I_rst_n 1;// Add stimulus hereendalways #5 I_clk ~I_clk ;endmodule 欢迎关注我的公众号FPGA之禅 转载于:https://www.cnblogs.com/liujinggang/p/9463589.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/912117.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!