ALTERA DE2 之 verilog HDL 学习笔记01 程序的并行
2015-08-30 20:16
661 查看
最近刚开始学习verilog HDL语言,正好手上有从学长那里借到的一块ALTERA DE2 的FPGA开发板。趁着假期先学习学习。
由于有一些C语言基础,所以在看verilog HDL 语法时看得很快。它与C语言最大的不同就是,HDL语言有很多的module,并且这些module之间是并行的关系。但是在有些模块的内部就是顺序执行的,比如begin和always等。
下面通过一个简单的led闪烁的module来验证。程序有1个top-module 和 4个不同延时的sub-module。4个子module是并行执行。
我得DE2 引脚分配图:
下载进去后就能看到4个不同延时的LED灯闪烁,再次强调是并行的关系~
由于有一些C语言基础,所以在看verilog HDL 语法时看得很快。它与C语言最大的不同就是,HDL语言有很多的module,并且这些module之间是并行的关系。但是在有些模块的内部就是顺序执行的,比如begin和always等。
下面通过一个简单的led闪烁的module来验证。程序有1个top-module 和 4个不同延时的sub-module。4个子module是并行执行。
led0_module.v
module led0_module ( clk, rst_n, led_out ); input clk; input rst_n; output led_out; parameter T10MS = 25'd20_000_000; reg [24:0] count; always @(posedge clk or negedge rst_n) if (!rst_n) count <= 25'd0; else if (count == T10MS) count <= 25'd0; else count <= count + 1'b1; reg rled_out; always @(posedge clk or negedge rst_n) if (!rst_n) rled_out <= 1'b0; else if (count >= 25'd0 && count < 25'd5_000_000) rled_out <= 1'b1; else rled_out <= 1'b0; assign led_out = rled_out; endmodule
led1_module.v
//1bit led output when rst_n is pushed led_out =0 module led1_module ( <span style="white-space:pre"> </span>clk,rst_n,led_out ); <span style="white-space:pre"> </span>input clk; <span style="white-space:pre"> </span>input rst_n; <span style="white-space:pre"> </span>output led_out; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>parameter T10MS=25'd20000000; <span style="white-space:pre"> </span>reg [24:0] count; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>always @(posedge clk or negedge rst_n) <span style="white-space:pre"> </span>if(!rst_n) <span style="white-space:pre"> </span>count<=25'd0; <span style="white-space:pre"> </span>else if(count == T10MS) <span style="white-space:pre"> </span>count<=25'd0; <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>count<=count+1'b1; <span style="white-space:pre"> </span>reg rled_out; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>always @(posedge clk or negedge rst_n) <span style="white-space:pre"> </span>if(!rst_n) <span style="white-space:pre"> </span>rled_out<=1'b0; <span style="white-space:pre"> </span>else if(count >= 25'b0 && count < 25'd10000000) <span style="white-space:pre"> </span>rled_out<=1'b1; <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>rled_out<=1'b0; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>assign led_out = rled_out; endmodule
led2_module.v
//1bit led output when rst_n is pushed led_out =0 module led2_module ( <span style="white-space:pre"> </span>clk,rst_n,led_out ); <span style="white-space:pre"> </span>input clk; <span style="white-space:pre"> </span>input rst_n; <span style="white-space:pre"> </span>output led_out; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>parameter T10MS=25'd20000000; <span style="white-space:pre"> </span>reg [24:0] count; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>always @(posedge clk or negedge rst_n) <span style="white-space:pre"> </span>if(!rst_n) <span style="white-space:pre"> </span>count<=25'd0; <span style="white-space:pre"> </span>else if(count == T10MS) <span style="white-space:pre"> </span>count<=25'd0; <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>count<=count+1'b1; <span style="white-space:pre"> </span>reg rled_out; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>always @(posedge clk or negedge rst_n) <span style="white-space:pre"> </span>if(!rst_n) <span style="white-space:pre"> </span>rled_out<=1'b0; <span style="white-space:pre"> </span>else if(count >= 25'b0 && count < 25'd15000000) <span style="white-space:pre"> </span>rled_out<=1'b1; <span style="white-space:pre"> </span>else <span style="white-space:pre"> </span>rled_out<=1'b0; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>assign led_out = rled_out; endmodule
led3_module.v
module led3_module ( clk, rst_n, led_out ); input clk; input rst_n; output led_out; parameter T10MS = 25'd20_000_000; reg [24:0] count; always @(posedge clk or negedge rst_n) if (!rst_n) count <= 25'd0; else if (count == T10MS) count <= 25'd0; else count <= count + 1'b1; reg rled_out; always @(posedge clk or negedge rst_n) if (!rst_n) rled_out <= 1'b0; else if (count >= 25'd15_000_000 && count < 25'd20_000_000) rled_out <= 1'b1; else rled_out <= 1'b0; assign led_out = rled_out; endmodule
主程序 forever_led.v
module forever_led ( <span style="white-space:pre"> </span>clock_50,key,ledg ); <span style="white-space:pre"> </span>input clock_50; <span style="white-space:pre"> </span>input [0:0] key; <span style="white-space:pre"> </span>output [3:0] ledg; <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>wire led0_out; <span style="white-space:pre"> </span>led0_mudule U0 <span style="white-space:pre"> </span>( <span style="white-space:pre"> </span>.clk(clock_50), <span style="white-space:pre"> </span>.rst_n(key), <span style="white-space:pre"> </span>.led_out(led0_out) <span style="white-space:pre"> </span>); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>wire led1_out; <span style="white-space:pre"> </span>led1_mudule U1 <span style="white-space:pre"> </span>( <span style="white-space:pre"> </span>.clk(clock_50), <span style="white-space:pre"> </span>.rst_n(key), <span style="white-space:pre"> </span>.led_out(led1_out) <span style="white-space:pre"> </span>); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>wire led2_out; <span style="white-space:pre"> </span>led2_mudule U2 <span style="white-space:pre"> </span>( <span style="white-space:pre"> </span>.clk(clock_50), <span style="white-space:pre"> </span>.rst_n(key), <span style="white-space:pre"> </span>.led_out(led2_out) <span style="white-space:pre"> </span>); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>wire led3_out; <span style="white-space:pre"> </span>led3_mudule U3 <span style="white-space:pre"> </span>( <span style="white-space:pre"> </span>.clk(clock_50), <span style="white-space:pre"> </span>.rst_n(key), <span style="white-space:pre"> </span>.led_out(led3_out) <span style="white-space:pre"> </span>);<span style="white-space:pre"> </span> <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>assign ledg[3:0]={led0_out,led1_out,led2_out,led3_out}; <span style="white-space:pre"> </span> endmodule
我得DE2 引脚分配图:
下载进去后就能看到4个不同延时的LED灯闪烁,再次强调是并行的关系~
相关文章推荐
- Windows 多进程通信API总结
- .NET六大剑客:栈、堆、值类型、引用类型、装箱和拆箱
- 字符串最后一个单词的长度(华为在线训练)
- CodeForces 483C Diverse Permutation
- android-屏幕适配(一)
- Alien Order
- Linux进程间通信---有名管道 代码实现
- RESTEasy常用注解
- CodeForces 478C Table Decorations
- C语言基础知识之(十四):指针和字符数组、字符串数组
- CodeForces #318 (div1) B.Bear and Blocks
- Ubuntu 10.04 速配指南
- CodeForces 454C Little Pony and Expected Maximum
- Servlet3.1规范和JSP2.3规范
- Dataguard 重启方法
- Unity3D有限状态机(FSM)学习笔记【2】IState
- configure: error: in `/root/httpd-2.2.11/srclib/apr': c
- 找数
- uImage,zimage,bzimage,vmlinux,vmlinuz
- poj 3278 Catch That Cow(经典bfs)