【FPGA每周一练】FPGA的HDL建模第二周
今天迎来了我们的FPGA每周一练第二周
首先回答上周一位坛友@sunedi561的提:全加器有什么典型应用?
简单来说全加器除了可以用作二进制数的加法运算外,还可以应用在其它方向。例如:二进制的减法、乘法运算、BCD码的加法、减法、码组变换、数码比较,以及其它组合电路的设计等方面。
话入正题:
感谢大家的热情参与,感谢大家的积极回复。对于上周问题
1.用Verilog实现设计一个全加
2.四选一的多路选择器。
我看见对选择器是设计基本一样,使用的是CASE语句,用CASE语句可以实现无优先级的选择。当然在新版Verilog综合器中使用IF时只要条件变量各不相同,且相斥,也是可以综合出无优先级的。那我还是在写一遍:
- module MUX( C,D,E,F,S,out);
- input C,D,E,F ; //input
- input [1:0] S ; //select control
- output reg out ; //result
- //___________________cut_______________________//
- always@(C or D or E or F or S)
- begin
- case (S)
- 2'b00 : Mux_out = C ;
- 2'b01 : Mux_out = D ;
- 2'b10 : Mux_out = E ;
- default : Mux_out = F ;
- endcase
- end
- endmodule
复制代码但是在全加器上问题还是挺多的,不过不是严重问题。首先问题是我在写问题的时候写错一个字,我想写的是设计“一位全加器”但是写成了“一个全加器”。好在大家都理解了题目意思。
很多人会把写Verilog代码想象成写C类程序。事实上这种想法是不对的,因为Verilog是硬件描述语言。何为硬件描述语言?就是描述电路的,描述功能,实现功能。只要功能实现了,代码就要像看女生的超短裙一样,越短越好。
但是你写的代码不单纯是给计算机读的,如果如果单纯的给计算机读,那好啦,写0101010101....计算机岂不是很开心。代码最主要就是给人读的,给人读的就要注意什么?可读性!!(这个是个很重要的问题,这个课程结束后,可能会讲RTL编码规范,到时候细讲。)那我们此次的代码要怎样写呢?我也给个参考:- module fulladd(cout, sum, ain, bin, cin);
- input ain, bin, cin; //input
- output sum, cout;
-
- wire sum; //summation
- wire cout; //carry output
- //________________________cut__________________________//
- assign sum = ain ^ bin ^ cin;
- assign cout = (ain & bin) | (bin & cin) | (ain & cin);
- endmodule
复制代码本周问题来了:
1、设计一个10进制计数器;
2、设计3-8译码器。
欢迎各位朋友们积极跟帖回答交流,希望能和大家在学习FPGA的道路上携手共进,共同进步,如果有任何问题也可回帖探讨!
【FPGA每周一练】FPGA的HDL建模第一周
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- USE IEEE.STD_LOGIC_UNSIGNED.ALL;
- ENTITY counter10 IS
- PORT ( clk,RST : IN STD_LOGIC;
- DOUT : OUT STD_LOGIC_VECTOR (3 DOWNTO 0);
- COUT : OUT STD_LOGIC);
- END;
- ARCHITECTURE DACC OF counter10 IS
- SIGNAL Q1 : STD_LOGIC_VECTOR (3 DOWNTO 0);
- BEGIN
- PROCESS(clk,RST)
- BEGIN
- IF RST = '0' THEN Q1<=(OTHERS => '0'); COUT<= '0';
- ELSIF rising_edge(clk) THEN
- Q1<=Q1+1;
- COUT<= '0';
- IF Q1 >= "1001" THEN Q1<=(OTHERS => '0'); COUT<= '1';
- END IF;
- END IF;
- END PROCESS;
- DOUT<=Q1 ;
- END;
复制代码恩恩,是我的失误了,打得太快了,“1010”改为“1001”。谢谢提醒
看大家那么起兴趣,我也贴一个计数器应用
- //****************************************
- // counter module
- //****************************************
- module uut1(
- input rst_i,
- input clock,
- input count_en,
- output [3:0] counter,
- output carry
- );
- parameter TIME = 10;
- reg [3:0] base_cnt;
- wire cnt_end;
- always @(posedge clock)
- if(rst_i==1)
- base_cnt <= 4'd0;
- else if(cnt_end==1)
- base_cnt <= 4'd0;
- else if(count_en==1)
- base_cnt <= base_cnt + 4'd1;
- assign cnt_end = (base_cnt==TIME-1)?1'b1 : 1'b0;
- // output
- assign carry = cnt_end;
- assign counter = base_cnt;
- endmodule
- //****************************************
- // application
- //****************************************
- wire [3:0] counter_1,counter_2;
- wire count_en_1,count_en_2;
- wire carry_1,carry_2;
- assign count_en_1 = 1; // synchronous system clock
- assign count_en_2 = carry_1; //carry in
- uut1 u1(
- . rst_i(rst_i),
- . clock(clock),
- . count_en(count_en_1),
- . counter(counter_1),
- . carry(carry_1)
- );
- uut1 u2(
- . rst_i(rst_i),
- . clock(clock),
- . count_en(count_en_2),
- . counter(counter_2),
- . carry(carry_2)
- );
- ...
复制代码21行和23行有错~!
一周热门 更多>